kirograph 0.17.0 → 0.20.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 +105 -1822
- package/dist/architecture/layers/dart.d.ts +10 -0
- package/dist/architecture/layers/dart.d.ts.map +1 -0
- package/dist/architecture/layers/dart.js +112 -0
- package/dist/architecture/layers/dart.js.map +7 -0
- package/dist/architecture/layers/elixir.d.ts +6 -0
- package/dist/architecture/layers/elixir.d.ts.map +1 -0
- package/dist/architecture/layers/index.d.ts.map +1 -1
- package/dist/architecture/layers/index.js +3 -1
- package/dist/architecture/layers/index.js.map +2 -2
- package/dist/architecture/layers/ocaml.d.ts +6 -0
- package/dist/architecture/layers/ocaml.d.ts.map +1 -0
- package/dist/architecture/layers/scala.d.ts +6 -0
- package/dist/architecture/layers/scala.d.ts.map +1 -0
- package/dist/architecture/layers/solidity.d.ts +6 -0
- package/dist/architecture/layers/solidity.d.ts.map +1 -0
- package/dist/architecture/layers/vue.d.ts +6 -0
- package/dist/architecture/layers/vue.d.ts.map +1 -0
- package/dist/architecture/manifest/elm.d.ts +3 -0
- package/dist/architecture/manifest/elm.d.ts.map +1 -0
- package/dist/architecture/manifest/index.d.ts.map +1 -1
- package/dist/architecture/manifest/ocaml.d.ts +3 -0
- package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
- package/dist/architecture/manifest/scala.d.ts +3 -0
- package/dist/architecture/manifest/scala.d.ts.map +1 -0
- package/dist/bin/banner.d.ts.map +1 -1
- package/dist/bin/banner.js +74 -6
- package/dist/bin/banner.js.map +2 -2
- package/dist/bin/commands/affected.d.ts.map +1 -1
- package/dist/bin/commands/attack-surface.d.ts +3 -0
- package/dist/bin/commands/attack-surface.d.ts.map +1 -0
- package/dist/bin/commands/attack-surface.js +164 -0
- package/dist/bin/commands/attack-surface.js.map +7 -0
- package/dist/bin/commands/benchmark.d.ts +9 -0
- package/dist/bin/commands/benchmark.d.ts.map +1 -0
- package/dist/bin/commands/benchmark.js +206 -0
- package/dist/bin/commands/benchmark.js.map +7 -0
- package/dist/bin/commands/budget.d.ts +6 -0
- package/dist/bin/commands/budget.d.ts.map +1 -0
- package/dist/bin/commands/budget.js +70 -0
- package/dist/bin/commands/budget.js.map +7 -0
- package/dist/bin/commands/caveman.d.ts +7 -0
- package/dist/bin/commands/caveman.d.ts.map +1 -0
- package/dist/bin/commands/communities.d.ts +3 -0
- package/dist/bin/commands/communities.d.ts.map +1 -0
- package/dist/bin/commands/communities.js +77 -0
- package/dist/bin/commands/communities.js.map +7 -0
- package/dist/bin/commands/compression.d.ts +7 -0
- package/dist/bin/commands/compression.d.ts.map +1 -0
- package/dist/bin/commands/context.d.ts.map +1 -1
- package/dist/bin/commands/data.d.ts +3 -0
- package/dist/bin/commands/data.d.ts.map +1 -0
- package/dist/bin/commands/dead-code.d.ts +3 -0
- package/dist/bin/commands/dead-code.d.ts.map +1 -0
- package/dist/bin/commands/dep-confusion.d.ts +3 -0
- package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
- package/dist/bin/commands/dep-confusion.js +119 -0
- package/dist/bin/commands/dep-confusion.js.map +7 -0
- package/dist/bin/commands/docs.d.ts +3 -0
- package/dist/bin/commands/docs.d.ts.map +1 -0
- package/dist/bin/commands/exec.d.ts +11 -0
- package/dist/bin/commands/exec.d.ts.map +1 -0
- package/dist/bin/commands/export.d.ts +3 -0
- package/dist/bin/commands/export.d.ts.map +1 -0
- package/dist/bin/commands/export.js +304 -10
- package/dist/bin/commands/export.js.map +2 -2
- package/dist/bin/commands/flows.d.ts +3 -0
- package/dist/bin/commands/flows.d.ts.map +1 -0
- package/dist/bin/commands/flows.js +97 -0
- package/dist/bin/commands/flows.js.map +7 -0
- package/dist/bin/commands/gain.d.ts +6 -0
- package/dist/bin/commands/gain.d.ts.map +1 -0
- package/dist/bin/commands/help.d.ts +7 -0
- package/dist/bin/commands/help.d.ts.map +1 -1
- package/dist/bin/commands/help.js +399 -101
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/hotspots.d.ts +3 -0
- package/dist/bin/commands/hotspots.d.ts.map +1 -0
- package/dist/bin/commands/hotspots.js +94 -1
- package/dist/bin/commands/hotspots.js.map +3 -3
- package/dist/bin/commands/install.d.ts.map +1 -1
- package/dist/bin/commands/install.js +90 -8
- package/dist/bin/commands/install.js.map +2 -2
- package/dist/bin/commands/licenses.d.ts +3 -0
- package/dist/bin/commands/licenses.d.ts.map +1 -0
- package/dist/bin/commands/licenses.js +201 -0
- package/dist/bin/commands/licenses.js.map +7 -0
- package/dist/bin/commands/memory.d.ts +16 -0
- package/dist/bin/commands/memory.d.ts.map +1 -0
- package/dist/bin/commands/memory.js +151 -4
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/path.d.ts +3 -0
- package/dist/bin/commands/path.d.ts.map +1 -0
- package/dist/bin/commands/pattern.d.ts +3 -0
- package/dist/bin/commands/pattern.d.ts.map +1 -0
- package/dist/bin/commands/pattern.js +592 -0
- package/dist/bin/commands/pattern.js.map +7 -0
- package/dist/bin/commands/query.d.ts.map +1 -1
- package/dist/bin/commands/reachability.d.ts +3 -0
- package/dist/bin/commands/reachability.d.ts.map +1 -0
- package/dist/bin/commands/reachability.js +160 -0
- package/dist/bin/commands/reachability.js.map +7 -0
- package/dist/bin/commands/read.d.ts +6 -0
- package/dist/bin/commands/read.d.ts.map +1 -0
- package/dist/bin/commands/read.js +100 -0
- package/dist/bin/commands/read.js.map +7 -0
- package/dist/bin/commands/refactor.d.ts +3 -0
- package/dist/bin/commands/refactor.d.ts.map +1 -0
- package/dist/bin/commands/refactor.js +116 -0
- package/dist/bin/commands/refactor.js.map +7 -0
- package/dist/bin/commands/remediation.d.ts +3 -0
- package/dist/bin/commands/remediation.d.ts.map +1 -0
- package/dist/bin/commands/remediation.js +133 -0
- package/dist/bin/commands/remediation.js.map +7 -0
- package/dist/bin/commands/sbom.d.ts +3 -0
- package/dist/bin/commands/sbom.d.ts.map +1 -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.d.ts +9 -0
- package/dist/bin/commands/security-ci-report.d.ts.map +1 -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.d.ts +2 -0
- package/dist/bin/commands/security-export.d.ts.map +1 -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.d.ts +3 -0
- package/dist/bin/commands/security-flows.d.ts.map +1 -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.d.ts +3 -0
- package/dist/bin/commands/security-secrets.d.ts.map +1 -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.d.ts +3 -0
- package/dist/bin/commands/security.d.ts.map +1 -0
- package/dist/bin/commands/security.js +208 -0
- package/dist/bin/commands/security.js.map +7 -0
- package/dist/bin/commands/snapshot.d.ts +3 -0
- package/dist/bin/commands/snapshot.d.ts.map +1 -0
- package/dist/bin/commands/staleness.d.ts +3 -0
- package/dist/bin/commands/staleness.d.ts.map +1 -0
- package/dist/bin/commands/staleness.js +144 -0
- package/dist/bin/commands/staleness.js.map +7 -0
- package/dist/bin/commands/status.d.ts.map +1 -1
- package/dist/bin/commands/status.js +129 -2
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/commands/supply-chain.d.ts +3 -0
- package/dist/bin/commands/supply-chain.d.ts.map +1 -0
- package/dist/bin/commands/supply-chain.js +138 -0
- package/dist/bin/commands/supply-chain.js.map +7 -0
- package/dist/bin/commands/surprising.d.ts +3 -0
- package/dist/bin/commands/surprising.d.ts.map +1 -0
- package/dist/bin/commands/sync.d.ts.map +1 -1
- package/dist/bin/commands/uninit.d.ts.map +1 -1
- package/dist/bin/commands/uninit.js +109 -60
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/utils.d.ts +5 -0
- package/dist/bin/commands/utils.d.ts.map +1 -1
- package/dist/bin/commands/vex.d.ts +3 -0
- package/dist/bin/commands/vex.d.ts.map +1 -0
- package/dist/bin/commands/vex.js +76 -0
- package/dist/bin/commands/vex.js.map +7 -0
- package/dist/bin/commands/vuln-suppress.d.ts +3 -0
- package/dist/bin/commands/vuln-suppress.d.ts.map +1 -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.d.ts +3 -0
- package/dist/bin/commands/vulns.d.ts.map +1 -0
- package/dist/bin/commands/vulns.js +382 -0
- package/dist/bin/commands/vulns.js.map +7 -0
- package/dist/bin/installer/archive.d.ts +47 -0
- package/dist/bin/installer/archive.d.ts.map +1 -0
- package/dist/bin/installer/auto-detect.d.ts +16 -0
- package/dist/bin/installer/auto-detect.d.ts.map +1 -0
- package/dist/bin/installer/auto-detect.js +125 -0
- package/dist/bin/installer/auto-detect.js.map +7 -0
- package/dist/bin/installer/caveman.d.ts +12 -0
- package/dist/bin/installer/caveman.d.ts.map +1 -0
- package/dist/bin/installer/cli-agent.d.ts +7 -2
- package/dist/bin/installer/cli-agent.d.ts.map +1 -1
- package/dist/bin/installer/cli-agent.js +32 -5
- package/dist/bin/installer/cli-agent.js.map +2 -2
- package/dist/bin/installer/common.d.ts +36 -0
- package/dist/bin/installer/common.d.ts.map +1 -0
- package/dist/bin/installer/common.js +48 -0
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.d.ts +1 -1
- package/dist/bin/installer/config-prompt.d.ts.map +1 -1
- package/dist/bin/installer/config-prompt.js +85 -2
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/dashboard.d.ts.map +1 -1
- package/dist/bin/installer/detect.d.ts +30 -0
- package/dist/bin/installer/detect.d.ts.map +1 -0
- package/dist/bin/installer/detect.js +309 -0
- package/dist/bin/installer/detect.js.map +7 -0
- package/dist/bin/installer/hooks.d.ts +4 -1
- package/dist/bin/installer/hooks.d.ts.map +1 -1
- package/dist/bin/installer/hooks.js +34 -0
- package/dist/bin/installer/hooks.js.map +2 -2
- package/dist/bin/installer/index.d.ts +5 -4
- package/dist/bin/installer/index.d.ts.map +1 -1
- package/dist/bin/installer/index.js +46 -8
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.d.ts +14 -0
- package/dist/bin/installer/instructions.d.ts.map +1 -0
- package/dist/bin/installer/instructions.js +209 -3
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.d.ts.map +1 -1
- package/dist/bin/installer/prompts.d.ts +17 -0
- package/dist/bin/installer/prompts.d.ts.map +1 -1
- package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
- package/dist/bin/installer/steering.d.ts +14 -2
- package/dist/bin/installer/steering.d.ts.map +1 -1
- package/dist/bin/installer/steering.js +488 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.d.ts +6 -0
- package/dist/bin/installer/targets/aider.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/amp.d.ts.map +1 -0
- 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.d.ts +13 -0
- package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/augment.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/claude.d.ts.map +1 -0
- 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.d.ts +13 -0
- package/dist/bin/installer/targets/cline.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/codex.d.ts.map +1 -0
- 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.d.ts +12 -0
- package/dist/bin/installer/targets/continue.d.ts.map +1 -0
- 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.d.ts +12 -0
- package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/copilot.d.ts.map +1 -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.d.ts +6 -0
- package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
- 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.d.ts +13 -0
- package/dist/bin/installer/targets/devin.d.ts.map +1 -0
- 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.d.ts +16 -0
- package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
- 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.d.ts +59 -0
- package/dist/bin/installer/targets/generic.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/goose.d.ts.map +1 -0
- 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.d.ts +11 -0
- package/dist/bin/installer/targets/index.d.ts.map +1 -0
- 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.d.ts +13 -0
- package/dist/bin/installer/targets/junie.d.ts.map +1 -0
- 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.d.ts +12 -0
- package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
- 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.d.ts +5 -0
- package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
- package/dist/bin/installer/targets/kiro.js +4 -4
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.d.ts +13 -0
- package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
- 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.d.ts +12 -0
- package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
- 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.d.ts +12 -0
- package/dist/bin/installer/targets/qwen.d.ts.map +1 -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.d.ts +6 -0
- package/dist/bin/installer/targets/replit.d.ts.map +1 -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.d.ts +13 -0
- package/dist/bin/installer/targets/roo.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
- 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.d.ts +6 -0
- package/dist/bin/installer/targets/trae.d.ts.map +1 -0
- 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.d.ts +12 -0
- package/dist/bin/installer/targets/warp.d.ts.map +1 -0
- 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.d.ts +13 -0
- package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
- 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.d.ts +16 -1
- package/dist/bin/progress.d.ts.map +1 -1
- package/dist/compression/filters/aws.d.ts +9 -0
- package/dist/compression/filters/aws.d.ts.map +1 -0
- package/dist/compression/filters/docker.d.ts +6 -0
- package/dist/compression/filters/docker.d.ts.map +1 -0
- package/dist/compression/filters/files.d.ts +6 -0
- package/dist/compression/filters/files.d.ts.map +1 -0
- package/dist/compression/filters/generic.d.ts +7 -0
- package/dist/compression/filters/generic.d.ts.map +1 -0
- package/dist/compression/filters/git.d.ts +6 -0
- package/dist/compression/filters/git.d.ts.map +1 -0
- package/dist/compression/filters/github.d.ts +6 -0
- package/dist/compression/filters/github.d.ts.map +1 -0
- package/dist/compression/filters/lint.d.ts +6 -0
- package/dist/compression/filters/lint.d.ts.map +1 -0
- package/dist/compression/filters/misc.d.ts +6 -0
- package/dist/compression/filters/misc.d.ts.map +1 -0
- package/dist/compression/filters/package.d.ts +6 -0
- package/dist/compression/filters/package.d.ts.map +1 -0
- package/dist/compression/filters/test.d.ts +6 -0
- package/dist/compression/filters/test.d.ts.map +1 -0
- package/dist/compression/index.d.ts +29 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/naive-cost.d.ts +26 -0
- package/dist/compression/naive-cost.d.ts.map +1 -0
- package/dist/compression/tracker.d.ts +155 -0
- package/dist/compression/tracker.d.ts.map +1 -0
- package/dist/compression/tracker.js +80 -0
- package/dist/compression/tracker.js.map +2 -2
- package/dist/compression/types.d.ts +49 -0
- package/dist/compression/types.d.ts.map +1 -0
- package/dist/config.d.ts +90 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +144 -3
- package/dist/config.js.map +2 -2
- package/dist/core/lock-manager.d.ts +2 -0
- package/dist/core/lock-manager.d.ts.map +1 -1
- package/dist/core/pipeline.d.ts +4 -1
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +78 -2
- package/dist/core/pipeline.js.map +2 -2
- package/dist/core/snapshot.d.ts +58 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/data/filters.d.ts +23 -0
- package/dist/data/filters.d.ts.map +1 -0
- package/dist/data/indexer.d.ts +25 -0
- package/dist/data/indexer.d.ts.map +1 -0
- package/dist/data/linker.d.ts +37 -0
- package/dist/data/linker.d.ts.map +1 -0
- package/dist/data/lint.d.ts +27 -0
- package/dist/data/lint.d.ts.map +1 -0
- package/dist/data/parsers/csv.d.ts +11 -0
- package/dist/data/parsers/csv.d.ts.map +1 -0
- package/dist/data/parsers/excel.d.ts +10 -0
- package/dist/data/parsers/excel.d.ts.map +1 -0
- package/dist/data/parsers/index.d.ts +28 -0
- package/dist/data/parsers/index.d.ts.map +1 -0
- package/dist/data/parsers/json-array.d.ts +9 -0
- package/dist/data/parsers/json-array.d.ts.map +1 -0
- package/dist/data/parsers/jsonl.d.ts +9 -0
- package/dist/data/parsers/jsonl.d.ts.map +1 -0
- package/dist/data/parsers/parquet.d.ts +10 -0
- package/dist/data/parsers/parquet.d.ts.map +1 -0
- package/dist/data/profiler.d.ts +29 -0
- package/dist/data/profiler.d.ts.map +1 -0
- package/dist/data/queries.d.ts +95 -0
- package/dist/data/queries.d.ts.map +1 -0
- package/dist/data/types.d.ts +103 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/db/database.d.ts +57 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +75 -5
- package/dist/db/database.js.map +2 -2
- package/dist/db/memory-schema.sql +5 -1
- package/dist/db/patterns-schema.sql +23 -0
- package/dist/db/schema.sql +3 -1
- package/dist/db/security-schema.sql +72 -0
- package/dist/docs/formats/asciidoc.d.ts +9 -0
- package/dist/docs/formats/asciidoc.d.ts.map +1 -0
- package/dist/docs/formats/html.d.ts +10 -0
- package/dist/docs/formats/html.d.ts.map +1 -0
- package/dist/docs/formats/index.d.ts +31 -0
- package/dist/docs/formats/index.d.ts.map +1 -0
- package/dist/docs/formats/markdown.d.ts +11 -0
- package/dist/docs/formats/markdown.d.ts.map +1 -0
- package/dist/docs/formats/openapi.d.ts +17 -0
- package/dist/docs/formats/openapi.d.ts.map +1 -0
- package/dist/docs/formats/org.d.ts +9 -0
- package/dist/docs/formats/org.d.ts.map +1 -0
- package/dist/docs/formats/plaintext.d.ts +11 -0
- package/dist/docs/formats/plaintext.d.ts.map +1 -0
- package/dist/docs/formats/rdoc.d.ts +10 -0
- package/dist/docs/formats/rdoc.d.ts.map +1 -0
- package/dist/docs/formats/rst.d.ts +11 -0
- package/dist/docs/formats/rst.d.ts.map +1 -0
- package/dist/docs/indexer.d.ts +49 -0
- package/dist/docs/indexer.d.ts.map +1 -0
- package/dist/docs/linker.d.ts +30 -0
- package/dist/docs/linker.d.ts.map +1 -0
- package/dist/docs/lint.d.ts +27 -0
- package/dist/docs/lint.d.ts.map +1 -0
- package/dist/docs/queries.d.ts +78 -0
- package/dist/docs/queries.d.ts.map +1 -0
- package/dist/docs/section-id.d.ts +48 -0
- package/dist/docs/section-id.d.ts.map +1 -0
- package/dist/docs/summarizer.d.ts +13 -0
- package/dist/docs/summarizer.d.ts.map +1 -0
- package/dist/docs/types.d.ts +71 -0
- package/dist/docs/types.d.ts.map +1 -0
- package/dist/docs/vectors.d.ts +54 -0
- package/dist/docs/vectors.d.ts.map +1 -0
- package/dist/extraction/extractor.d.ts +1 -1
- package/dist/extraction/extractor.d.ts.map +1 -1
- package/dist/extraction/extractor.js +81 -0
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.d.ts +6 -0
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +32 -8
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/languages.d.ts.map +1 -1
- package/dist/extraction/languages.js +43 -1
- package/dist/extraction/languages.js.map +2 -2
- package/dist/extraction/notebook.d.ts +14 -0
- package/dist/extraction/notebook.d.ts.map +1 -0
- 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/amplify.d.ts +9 -0
- package/dist/frameworks/amplify.d.ts.map +1 -0
- package/dist/frameworks/angular.d.ts +9 -0
- package/dist/frameworks/angular.d.ts.map +1 -0
- package/dist/frameworks/ansible.d.ts +8 -0
- package/dist/frameworks/ansible.d.ts.map +1 -0
- package/dist/frameworks/cloudformation.d.ts +9 -0
- package/dist/frameworks/cloudformation.d.ts.map +1 -0
- package/dist/frameworks/docker.d.ts +9 -0
- package/dist/frameworks/docker.d.ts.map +1 -0
- package/dist/frameworks/elixir.d.ts +6 -0
- package/dist/frameworks/elixir.d.ts.map +1 -0
- package/dist/frameworks/flutter.d.ts +12 -0
- package/dist/frameworks/flutter.d.ts.map +1 -0
- package/dist/frameworks/flutter.js +130 -0
- package/dist/frameworks/flutter.js.map +7 -0
- package/dist/frameworks/iac.d.ts +10 -0
- package/dist/frameworks/iac.d.ts.map +1 -0
- package/dist/frameworks/index.d.ts +14 -0
- package/dist/frameworks/index.d.ts.map +1 -1
- package/dist/frameworks/index.js +7 -1
- package/dist/frameworks/index.js.map +3 -3
- package/dist/frameworks/kubernetes.d.ts +9 -0
- package/dist/frameworks/kubernetes.d.ts.map +1 -0
- package/dist/frameworks/pulumi.d.ts +9 -0
- package/dist/frameworks/pulumi.d.ts.map +1 -0
- package/dist/frameworks/scala.d.ts +6 -0
- package/dist/frameworks/scala.d.ts.map +1 -0
- package/dist/frameworks/solidity.d.ts +6 -0
- package/dist/frameworks/solidity.d.ts.map +1 -0
- package/dist/frameworks/terraform.d.ts +14 -0
- package/dist/frameworks/terraform.d.ts.map +1 -0
- package/dist/frameworks/vue.d.ts +7 -0
- package/dist/frameworks/vue.d.ts.map +1 -0
- package/dist/graph/communities.d.ts +43 -0
- package/dist/graph/communities.d.ts.map +1 -0
- package/dist/graph/communities.js +317 -0
- package/dist/graph/communities.js.map +7 -0
- package/dist/graph/flows.d.ts +55 -0
- package/dist/graph/flows.d.ts.map +1 -0
- package/dist/graph/flows.js +138 -0
- package/dist/graph/flows.js.map +7 -0
- package/dist/graph/refactor.d.ts +43 -0
- package/dist/graph/refactor.d.ts.map +1 -0
- package/dist/graph/refactor.js +155 -0
- package/dist/graph/refactor.js.map +7 -0
- package/dist/index.d.ts +36 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/mcp/cache.d.ts +69 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/cache.js +172 -0
- package/dist/mcp/cache.js.map +7 -0
- package/dist/mcp/read-modes.d.ts +31 -0
- package/dist/mcp/read-modes.d.ts.map +1 -0
- package/dist/mcp/read-modes.js +295 -0
- package/dist/mcp/read-modes.js.map +7 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +17 -3
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.d.ts +2 -0
- package/dist/mcp/tool-names.d.ts.map +1 -0
- package/dist/mcp/tool-names.js +24 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1560 -4
- package/dist/mcp/tools.js.map +3 -3
- package/dist/memory/compress.d.ts +19 -0
- package/dist/memory/compress.d.ts.map +1 -0
- package/dist/memory/database.d.ts +92 -0
- package/dist/memory/database.d.ts.map +1 -0
- package/dist/memory/database.js +70 -2
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/index.d.ts +71 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +12 -2
- package/dist/memory/index.js.map +2 -2
- package/dist/memory/symbols.d.ts +21 -0
- package/dist/memory/symbols.d.ts.map +1 -0
- package/dist/memory/types.d.ts +78 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/vectors.d.ts +43 -0
- package/dist/memory/vectors.d.ts.map +1 -0
- package/dist/patterns/graph.d.ts +16 -0
- package/dist/patterns/graph.d.ts.map +1 -0
- package/dist/patterns/graph.js +45 -0
- package/dist/patterns/graph.js.map +7 -0
- package/dist/patterns/index.d.ts +4 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +39 -0
- package/dist/patterns/index.js.map +7 -0
- package/dist/patterns/indexer.d.ts +15 -0
- package/dist/patterns/indexer.d.ts.map +1 -0
- package/dist/patterns/indexer.js +97 -0
- package/dist/patterns/indexer.js.map +7 -0
- package/dist/patterns/library/command-injection-go.yaml +11 -0
- package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
- package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
- package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
- package/dist/patterns/library/path-traversal-go.yaml +11 -0
- package/dist/patterns/library/path-traversal-py.yaml +12 -0
- package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
- package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
- package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
- package/dist/patterns/library/sql-injection-java.yaml +13 -0
- package/dist/patterns/library/sql-injection-py.yaml +12 -0
- package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
- package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
- package/dist/patterns/library/weak-crypto-py.yaml +13 -0
- package/dist/patterns/loader.d.ts +18 -0
- package/dist/patterns/loader.d.ts.map +1 -0
- package/dist/patterns/loader.js +277 -0
- package/dist/patterns/loader.js.map +7 -0
- package/dist/patterns/runner.d.ts +42 -0
- package/dist/patterns/runner.d.ts.map +1 -0
- package/dist/patterns/runner.js +277 -0
- package/dist/patterns/runner.js.map +7 -0
- package/dist/patterns/types.d.ts +27 -0
- package/dist/patterns/types.d.ts.map +1 -0
- package/dist/patterns/types.js +34 -0
- package/dist/patterns/types.js.map +7 -0
- package/dist/resolution/bridges/android-rn.d.ts +13 -0
- package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
- 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.d.ts +10 -0
- package/dist/resolution/bridges/expo-modules.d.ts.map +1 -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.d.ts +14 -0
- package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -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.d.ts +40 -0
- package/dist/resolution/bridges/index.d.ts.map +1 -0
- package/dist/resolution/bridges/index.js +80 -0
- package/dist/resolution/bridges/index.js.map +7 -0
- package/dist/resolution/bridges/native-events.d.ts +10 -0
- package/dist/resolution/bridges/native-events.d.ts.map +1 -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.d.ts +13 -0
- package/dist/resolution/bridges/native-views.d.ts.map +1 -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.d.ts +9 -0
- package/dist/resolution/bridges/react-native.d.ts.map +1 -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.d.ts +14 -0
- package/dist/resolution/bridges/swift-objc.d.ts.map +1 -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.d.ts +10 -0
- package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
- package/dist/resolution/bridges/turbomodules.js +216 -0
- package/dist/resolution/bridges/turbomodules.js.map +7 -0
- package/dist/resolution/index.d.ts +28 -3
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +61 -2
- package/dist/resolution/index.js.map +2 -2
- package/dist/security/attack-surface.d.ts +46 -0
- package/dist/security/attack-surface.d.ts.map +1 -0
- package/dist/security/attack-surface.js +206 -0
- package/dist/security/attack-surface.js.map +7 -0
- package/dist/security/context-warnings.d.ts +40 -0
- package/dist/security/context-warnings.d.ts.map +1 -0
- package/dist/security/context-warnings.js +123 -0
- package/dist/security/context-warnings.js.map +7 -0
- package/dist/security/data-flows.d.ts +33 -0
- package/dist/security/data-flows.d.ts.map +1 -0
- package/dist/security/data-flows.js +286 -0
- package/dist/security/data-flows.js.map +7 -0
- package/dist/security/dep-confusion.d.ts +23 -0
- package/dist/security/dep-confusion.d.ts.map +1 -0
- package/dist/security/dep-confusion.js +255 -0
- package/dist/security/dep-confusion.js.map +7 -0
- package/dist/security/errors.d.ts +16 -0
- package/dist/security/errors.d.ts.map +1 -0
- package/dist/security/errors.js +51 -0
- package/dist/security/errors.js.map +7 -0
- package/dist/security/export/fix-suggestions.d.ts +21 -0
- package/dist/security/export/fix-suggestions.d.ts.map +1 -0
- package/dist/security/export/fix-suggestions.js +58 -0
- package/dist/security/export/fix-suggestions.js.map +7 -0
- package/dist/security/export/sbom.d.ts +33 -0
- package/dist/security/export/sbom.d.ts.map +1 -0
- package/dist/security/export/sbom.js +230 -0
- package/dist/security/export/sbom.js.map +7 -0
- package/dist/security/export/serialization.d.ts +62 -0
- package/dist/security/export/serialization.d.ts.map +1 -0
- package/dist/security/export/serialization.js +142 -0
- package/dist/security/export/serialization.js.map +7 -0
- package/dist/security/export/vex.d.ts +58 -0
- package/dist/security/export/vex.d.ts.map +1 -0
- package/dist/security/export/vex.js +220 -0
- package/dist/security/export/vex.js.map +7 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +67 -0
- package/dist/security/index.js.map +7 -0
- package/dist/security/integrator.d.ts +63 -0
- package/dist/security/integrator.d.ts.map +1 -0
- package/dist/security/integrator.js +491 -0
- package/dist/security/integrator.js.map +7 -0
- package/dist/security/license.d.ts +33 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +70 -0
- package/dist/security/license.js.map +7 -0
- package/dist/security/manifest/adapter.d.ts +92 -0
- package/dist/security/manifest/adapter.d.ts.map +1 -0
- package/dist/security/manifest/adapter.js +243 -0
- package/dist/security/manifest/adapter.js.map +7 -0
- package/dist/security/manifest/parser.d.ts +73 -0
- package/dist/security/manifest/parser.d.ts.map +1 -0
- package/dist/security/manifest/parser.js +376 -0
- package/dist/security/manifest/parser.js.map +7 -0
- package/dist/security/manifest/plugins/cargo.d.ts +11 -0
- package/dist/security/manifest/plugins/cargo.d.ts.map +1 -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/composer.d.ts +11 -0
- package/dist/security/manifest/plugins/composer.d.ts.map +1 -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.d.ts +12 -0
- package/dist/security/manifest/plugins/go.d.ts.map +1 -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/gradle.d.ts +12 -0
- package/dist/security/manifest/plugins/gradle.d.ts.map +1 -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.d.ts +11 -0
- package/dist/security/manifest/plugins/hex.d.ts.map +1 -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.d.ts +11 -0
- package/dist/security/manifest/plugins/maven.d.ts.map +1 -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/npm.d.ts +11 -0
- package/dist/security/manifest/plugins/npm.d.ts.map +1 -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/nuget.d.ts +12 -0
- package/dist/security/manifest/plugins/nuget.d.ts.map +1 -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.d.ts +11 -0
- package/dist/security/manifest/plugins/pip.d.ts.map +1 -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/pubspec.d.ts +11 -0
- package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -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.d.ts +3 -0
- package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -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.d.ts +11 -0
- package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -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.d.ts +11 -0
- package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
- package/dist/security/manifest/plugins/swift.js +200 -0
- package/dist/security/manifest/plugins/swift.js.map +7 -0
- package/dist/security/owasp.d.ts +16 -0
- package/dist/security/owasp.d.ts.map +1 -0
- package/dist/security/owasp.js +104 -0
- package/dist/security/owasp.js.map +7 -0
- package/dist/security/pipeline.d.ts +37 -0
- package/dist/security/pipeline.d.ts.map +1 -0
- package/dist/security/pipeline.js +125 -0
- package/dist/security/pipeline.js.map +7 -0
- package/dist/security/reachability.d.ts +67 -0
- package/dist/security/reachability.d.ts.map +1 -0
- package/dist/security/reachability.js +276 -0
- package/dist/security/reachability.js.map +7 -0
- package/dist/security/remediation.d.ts +51 -0
- package/dist/security/remediation.d.ts.map +1 -0
- package/dist/security/remediation.js +126 -0
- package/dist/security/remediation.js.map +7 -0
- package/dist/security/secrets.d.ts +38 -0
- package/dist/security/secrets.d.ts.map +1 -0
- package/dist/security/secrets.js +176 -0
- package/dist/security/secrets.js.map +7 -0
- package/dist/security/staleness.d.ts +43 -0
- package/dist/security/staleness.d.ts.map +1 -0
- package/dist/security/staleness.js +231 -0
- package/dist/security/staleness.js.map +7 -0
- package/dist/security/supply-chain.d.ts +34 -0
- package/dist/security/supply-chain.d.ts.map +1 -0
- package/dist/security/supply-chain.js +301 -0
- package/dist/security/supply-chain.js.map +7 -0
- package/dist/security/suppressions.d.ts +18 -0
- package/dist/security/suppressions.d.ts.map +1 -0
- package/dist/security/suppressions.js +106 -0
- package/dist/security/suppressions.js.map +7 -0
- package/dist/security/types.d.ts +144 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +17 -0
- package/dist/security/types.js.map +7 -0
- package/dist/security/vuln/client.d.ts +90 -0
- package/dist/security/vuln/client.d.ts.map +1 -0
- package/dist/security/vuln/client.js +355 -0
- package/dist/security/vuln/client.js.map +7 -0
- package/dist/security/vuln/epss-client.d.ts +26 -0
- package/dist/security/vuln/epss-client.d.ts.map +1 -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.d.ts +6 -0
- package/dist/security/vuln/index.d.ts.map +1 -0
- package/dist/security/vuln/index.js +29 -0
- package/dist/security/vuln/index.js.map +7 -0
- package/dist/security/vuln/osv-adapter.d.ts +58 -0
- package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
- package/dist/security/vuln/osv-adapter.js +321 -0
- package/dist/security/vuln/osv-adapter.js.map +7 -0
- package/dist/security/vuln/types.d.ts +29 -0
- package/dist/security/vuln/types.d.ts.map +1 -0
- package/dist/security/vuln/types.js +17 -0
- package/dist/security/vuln/types.js.map +7 -0
- package/dist/sync/index.d.ts +4 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/types.d.ts +10 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +2 -2
- package/dist/vectors/index.d.ts +11 -3
- package/dist/vectors/index.d.ts.map +1 -1
- package/dist/vectors/qdrant-index.d.ts +10 -3
- package/dist/vectors/qdrant-index.d.ts.map +1 -1
- package/dist/vectors/typesense-index.d.ts.map +1 -1
- package/dist/watchmen/index.js +83 -0
- package/dist/watchmen/index.js.map +7 -0
- package/dist/watchmen/synthesize.js +475 -0
- package/dist/watchmen/synthesize.js.map +7 -0
- package/package.json +6 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/pattern.ts"],
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, section } from '../ui';\n\n// \u2500\u2500 OWASP Categories \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nconst OWASP_CATEGORIES: Record<string, string> = {\n A01: 'Broken Access Control',\n A02: 'Cryptographic Failures',\n A03: 'Injection',\n A04: 'Insecure Design',\n A05: 'Security Misconfiguration',\n A06: 'Vulnerable Components',\n A07: 'Auth Failures',\n A08: 'Integrity Failures',\n A09: 'Logging Failures',\n A10: 'SSRF',\n};\n\nconst SEVERITY_LEVELS = ['critical', 'high', 'medium', 'low'] as const;\ntype SeverityLevel = (typeof SEVERITY_LEVELS)[number];\n\nconst SEVERITY_ORDER: Record<SeverityLevel, number> = {\n critical: 3, high: 2, medium: 1, low: 0,\n};\n\nfunction severityColor(severity: string): string {\n if (severity === 'critical') return '\\x1b[31m';\n if (severity === 'high') return '\\x1b[31m';\n if (severity === 'medium') return '\\x1b[33m';\n return dim;\n}\n\nfunction resolveLibraryPath(): string {\n // In development: src/patterns/library; in dist: dist/patterns/library\n const devPath = path.join(__dirname, '../../patterns/library');\n if (fs.existsSync(devPath)) return devPath;\n const distPath = path.join(__dirname, '../patterns/library');\n if (fs.existsSync(distPath)) return distPath;\n return devPath;\n}\n\nexport function register(program: Command): void {\n program\n .command('pattern [pattern] [projectPath]')\n .description('AST structural search: live pattern search or library rule runner')\n .option('--lang <language>', 'Filter to a specific language (js, ts, python, go, rust, java, ...)')\n .option('--severity <level>', 'Filter: critical, high, medium, low')\n .option('--format <fmt>', 'Output format: text|json (default: text)', 'text')\n .option('--list', 'Show all library rules (no @ast-grep/napi required)')\n .option('--library <id>', 'Run a specific library rule by ID')\n .option('--fix', 'Apply the rule\\'s fix template to matched files (requires --library <id>)')\n .option('--coverage', 'Show OWASP Top 10 coverage report')\n .option('--save-baseline [label]', 'Save current pattern_matches as a baseline for diffing')\n .option('--diff [label]', 'Diff current pattern_matches against a saved baseline')\n .action(async (\n patternArg: string | undefined,\n projectPathArg: string | undefined,\n opts: {\n lang?: string;\n severity?: string;\n format: string;\n list?: boolean;\n library?: string;\n fix?: boolean;\n coverage?: boolean;\n saveBaseline?: string | boolean;\n diff?: string | boolean;\n },\n ) => {\n const target = path.resolve(projectPathArg ?? process.cwd());\n\n // \u2500\u2500 --list mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.list) {\n const { PatternLibraryLoader } = await Promise.resolve().then(() => require('../../patterns/loader.js'));\n const loader = new PatternLibraryLoader();\n const config = await loadConfig(target).catch(() => null);\n const libraryPath = resolveLibraryPath();\n const customPath = config?.patternLibraryPath;\n const rules = loader.load(libraryPath, customPath);\n\n if (opts.format === 'json') {\n process.stdout.write(JSON.stringify(rules, null, 2) + '\\n');\n return;\n }\n\n if (rules.length === 0) {\n console.log(`\\n ${dim}No pattern rules found.${reset}\\n`);\n return;\n }\n\n console.log(`\\n ${section('Pattern Library')} (${rules.length} rules)\\n`);\n\n // Determine column widths\n const maxSev = Math.max(...rules.map(r => r.severity.length), 8);\n const maxOWASP = Math.max(...rules.map(r => r.owaspCategory.length), 5);\n const maxId = Math.max(...rules.map(r => r.id.length), 10);\n\n for (const rule of rules) {\n const sc = severityColor(rule.severity);\n const sev = rule.severity.padEnd(maxSev);\n const owasp = rule.owaspCategory.padEnd(maxOWASP);\n const id = rule.id.padEnd(maxId);\n console.log(` ${sc}${sev}${reset} ${dim}${owasp}${reset} ${violet}${bold}${id}${reset} ${dim}${rule.description}${reset}`);\n }\n\n console.log();\n return;\n }\n\n // \u2500\u2500 --coverage mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.coverage) {\n const { PatternLibraryLoader } = await Promise.resolve().then(() => require('../../patterns/loader.js'));\n const loader = new PatternLibraryLoader();\n const cfgCov = await loadConfig(target).catch(() => null);\n const libraryPath = resolveLibraryPath();\n const customPath = cfgCov?.patternLibraryPath;\n const rules = loader.load(libraryPath, customPath);\n\n // Count rules per OWASP category (normalise e.g. \"A03 - Injection\" \u2192 \"A03\")\n const ruleCounts: Record<string, number> = {};\n for (const cat of Object.keys(OWASP_CATEGORIES)) ruleCounts[cat] = 0;\n for (const rule of rules) {\n const cat = rule.owaspCategory.trim().split(/[\\s-]/)[0].toUpperCase();\n if (cat in ruleCounts) ruleCounts[cat]++;\n }\n\n // Try to get match/file data from DB if initialized and enablePatterns\n type OwaspRow = { owasp_category: string; matches: number; files: number };\n let dbData: Record<string, { matches: number; files: number }> | null = null;\n const KiroGraphCov = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (cfgCov?.enablePatterns && KiroGraphCov.isInitialized(target)) {\n try {\n const cg = await KiroGraphCov.open(target);\n const rawDb = cg.getDatabase().getRawDb();\n const tableExists = rawDb.get(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\",\n ) as { name: string } | undefined;\n if (tableExists) {\n const rows = rawDb.all(\n `SELECT owasp_category, COUNT(*) as matches, COUNT(DISTINCT file_path) as files\n FROM pattern_matches\n GROUP BY owasp_category`,\n ) as OwaspRow[];\n dbData = {};\n for (const row of rows) {\n const cat = row.owasp_category.trim().split(/[\\s-]/)[0].toUpperCase();\n if (cat) dbData[cat] = { matches: row.matches, files: row.files };\n }\n }\n cg.close();\n } catch {\n // non-fatal \u2014 show rule counts only\n }\n }\n\n if (opts.format === 'json') {\n const categories: Record<string, { rules: number; matches: number | null; files: number | null }> = {};\n for (const cat of Object.keys(OWASP_CATEGORIES)) {\n categories[cat] = {\n rules: ruleCounts[cat] ?? 0,\n matches: dbData ? (dbData[cat]?.matches ?? 0) : null,\n files: dbData ? (dbData[cat]?.files ?? 0) : null,\n };\n }\n const covered = Object.values(categories).filter(c => c.rules > 0).length;\n process.stdout.write(JSON.stringify({ categories, covered, total: 10 }, null, 2) + '\\n');\n return;\n }\n\n const BAR_WIDTH = 10;\n const sorted = Object.keys(OWASP_CATEGORIES).sort((a, b) => (ruleCounts[b] ?? 0) - (ruleCounts[a] ?? 0));\n const maxNameLen = Math.max(...Object.values(OWASP_CATEGORIES).map(n => n.length));\n\n const isInitialized = KiroGraphCov.isInitialized(target);\n const hasEnablePatterns = !!cfgCov?.enablePatterns;\n let coverageSubtitle: string;\n if (!isInitialized || !hasEnablePatterns) {\n coverageSubtitle = ` ${dim}(rules only \u2014 no match data)${reset}`;\n } else if (!dbData) {\n coverageSubtitle = ` ${dim}(no match data yet \u2014 run kirograph index)${reset}`;\n } else {\n coverageSubtitle = '';\n }\n\n console.log(`\\n ${section('OWASP Top 10 Coverage')}${coverageSubtitle}`);\n if (!isInitialized || !hasEnablePatterns) {\n console.log(` ${dim}Run kirograph index with enablePatterns: true to see actual findings.${reset}`);\n }\n console.log();\n\n for (const cat of sorted) {\n const name = OWASP_CATEGORIES[cat];\n const count = ruleCounts[cat] ?? 0;\n const filledBars = Math.min(count, BAR_WIDTH);\n const bar = count > 0\n ? `${violet}${'\u2588'.repeat(filledBars)}${dim}${'\u2591'.repeat(BAR_WIDTH - filledBars)}${reset}`\n : `${dim}${'\u2591'.repeat(BAR_WIDTH)}${reset}`;\n const catLabel = count > 0\n ? `${violet}${bold}${cat}${reset}`\n : `\\x1b[31m${cat}${reset}`;\n const nameStr = name.padEnd(maxNameLen);\n const ruleStr = count === 1 ? '1 rule ' : `${count} rules`;\n const ruleLabel = count > 0 ? `${violet}${bold}${ruleStr}${reset}` : `${dim}${ruleStr}${reset}`;\n\n if (count === 0) {\n console.log(` ${catLabel} ${dim}${nameStr}${reset} ${bar} ${dim}${ruleStr} \u00B7 \u2014 no coverage${reset}`);\n } else if (dbData) {\n const m = dbData[cat]?.matches ?? 0;\n const f = dbData[cat]?.files ?? 0;\n console.log(` ${catLabel} ${dim}${nameStr}${reset} ${bar} ${ruleLabel} \u00B7 ${violet}${m} match${m !== 1 ? 'es' : ''}${reset} ${dim}\u00B7 ${f} file${f !== 1 ? 's' : ''}${reset}`);\n } else {\n console.log(` ${catLabel} ${dim}${nameStr}${reset} ${bar} ${ruleLabel}`);\n }\n }\n\n const covered = Object.values(ruleCounts).filter(n => n > 0).length;\n console.log();\n console.log(` ${dim}Coverage: ${reset}${violet}${bold}${covered}/10${reset}${dim} OWASP categories have at least one rule.${reset}`);\n if (covered < 10) {\n console.log(` ${dim}Add custom rules via patternLibraryPath to improve coverage.${reset}`);\n }\n console.log();\n return;\n }\n\n // \u2500\u2500 --save-baseline mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.saveBaseline !== undefined) {\n const KiroGraphSB = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraphSB.isInitialized(target)) {\n console.error(`\\n \\x1b[31m\u2716 KiroGraph not initialized. Run: kirograph init${reset}\\n`);\n process.exit(1);\n }\n const configSB = await loadConfig(target).catch(() => null);\n if (!(configSB as any)?.enablePatterns) {\n console.error(`\\n \\x1b[33m\u26A0 kirograph pattern --save-baseline requires enablePatterns: true.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enablePatterns\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n const sbLabel = typeof opts.saveBaseline === 'string' && opts.saveBaseline\n ? opts.saveBaseline\n : 'default';\n\n const cg = await KiroGraphSB.open(target);\n const rawDb = cg.getDatabase().getRawDb();\n\n const tableExists = rawDb.get(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\",\n ) as { name: string } | undefined;\n\n if (!tableExists) {\n cg.close();\n console.error(`\\n \\x1b[31m\u2716 pattern_matches table not found. Run: kirograph index with enablePatterns: true${reset}\\n`);\n process.exit(1);\n }\n\n type SBCountRow = { pattern_id: string; cnt: number };\n const rows = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id',\n ) as SBCountRow[];\n\n const counts: Record<string, number> = {};\n let totalMatches = 0;\n for (const row of rows) {\n counts[row.pattern_id] = row.cnt;\n totalMatches += row.cnt;\n }\n cg.close();\n\n const kirographDir = path.join(target, '.kirograph');\n const baselineFile = path.join(kirographDir, `pattern-baseline-${sbLabel}.json`);\n const data = { savedAt: new Date().toISOString(), counts, totalMatches };\n fs.writeFileSync(baselineFile, JSON.stringify(data, null, 2), 'utf8');\n\n console.log(`\\n \\x1b[32m\u2713${reset} Baseline saved: ${violet}${bold}${sbLabel}${reset}`);\n console.log(` ${dim}${totalMatches} total matches across ${Object.keys(counts).length} patterns${reset}`);\n console.log(` ${dim}Saved to: ${baselineFile}${reset}\\n`);\n return;\n }\n\n // \u2500\u2500 --diff mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.diff !== undefined) {\n const KiroGraphDiff = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraphDiff.isInitialized(target)) {\n console.error(`\\n \\x1b[31m\u2716 KiroGraph not initialized. Run: kirograph init${reset}\\n`);\n process.exit(1);\n }\n const configDiff = await loadConfig(target).catch(() => null);\n if (!(configDiff as any)?.enablePatterns) {\n console.error(`\\n \\x1b[33m\u26A0 kirograph pattern --diff requires enablePatterns: true.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enablePatterns\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n const diffLabel = typeof opts.diff === 'string' && opts.diff\n ? opts.diff\n : 'default';\n\n const kirographDir = path.join(target, '.kirograph');\n const baselineFile = path.join(kirographDir, `pattern-baseline-${diffLabel}.json`);\n\n if (!fs.existsSync(baselineFile)) {\n const saveCmd = diffLabel !== 'default'\n ? `kirograph pattern --save-baseline ${diffLabel}`\n : 'kirograph pattern --save-baseline';\n console.log(`\\n ${dim}No baseline found. Run: ${reset}${violet}${bold}${saveCmd}${reset}\\n`);\n process.exit(0);\n }\n\n type BaselineData = { savedAt: string; counts: Record<string, number>; totalMatches: number };\n const baseline: BaselineData = JSON.parse(fs.readFileSync(baselineFile, 'utf8')) as BaselineData;\n\n const cg = await KiroGraphDiff.open(target);\n const rawDb = cg.getDatabase().getRawDb();\n\n const tableExists = rawDb.get(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\",\n ) as { name: string } | undefined;\n\n type DiffCountRow = { pattern_id: string; cnt: number };\n const currentRows = tableExists\n ? (rawDb.all('SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id') as DiffCountRow[])\n : [];\n cg.close();\n\n const current: Record<string, number> = {};\n for (const row of currentRows) current[row.pattern_id] = row.cnt;\n\n const allKeys = new Set([...Object.keys(baseline.counts), ...Object.keys(current)]);\n type DiffEntry = { id: string; baseCount: number; currCount: number; delta: number };\n const newFindings: DiffEntry[] = [];\n const resolved: DiffEntry[] = [];\n const unchanged: DiffEntry[] = [];\n\n for (const id of allKeys) {\n const base = baseline.counts[id] ?? 0;\n const curr = current[id] ?? 0;\n const delta = curr - base;\n if (delta > 0) newFindings.push({ id, baseCount: base, currCount: curr, delta });\n else if (delta < 0) resolved.push({ id, baseCount: base, currCount: curr, delta });\n else if (curr > 0) unchanged.push({ id, baseCount: base, currCount: curr, delta });\n }\n\n newFindings.sort((a, b) => b.delta - a.delta);\n resolved.sort((a, b) => a.delta - b.delta);\n\n const savedDate = baseline.savedAt.slice(0, 10);\n const netDelta = newFindings.reduce((s, e) => s + e.delta, 0) + resolved.reduce((s, e) => s + e.delta, 0);\n\n if (opts.format === 'json') {\n process.stdout.write(JSON.stringify({\n baseline: { label: diffLabel, savedAt: baseline.savedAt, totalMatches: baseline.totalMatches },\n new: newFindings.map(e => ({ id: e.id, delta: e.delta, current: e.currCount })),\n resolved: resolved.map(e => ({ id: e.id, delta: e.delta, current: e.currCount })),\n unchanged: unchanged.map(e => ({ id: e.id, count: e.currCount })),\n netDelta,\n }, null, 2) + '\\n');\n return;\n }\n\n const allEntries = [...newFindings, ...resolved, ...unchanged];\n const maxIdLen = allEntries.length > 0\n ? Math.max(...allEntries.map(e => e.id.length), 20)\n : 20;\n\n console.log(`\\n ${section('Pattern Diff')} ${dim}vs ${diffLabel} baseline (saved ${savedDate})${reset}\\n`);\n\n if (newFindings.length > 0) {\n console.log(` \\x1b[31m\u2716 NEW${reset} ${dim}(${newFindings.length} new finding${newFindings.length !== 1 ? 's' : ''})${reset}`);\n for (const e of newFindings) {\n const idPad = e.id.padEnd(maxIdLen);\n console.log(` ${violet}${bold}${idPad}${reset} \\x1b[31m+${e.delta} new match${e.delta !== 1 ? 'es' : ''}${reset}`);\n }\n console.log();\n }\n\n if (resolved.length > 0) {\n console.log(` \\x1b[32m\u2713 RESOLVED${reset} ${dim}(${resolved.length} resolved)${reset}`);\n for (const e of resolved) {\n const idPad = e.id.padEnd(maxIdLen);\n console.log(` ${dim}${idPad}${reset} \\x1b[32m${e.delta} match${Math.abs(e.delta) !== 1 ? 'es' : ''}${reset}`);\n }\n console.log();\n }\n\n if (unchanged.length > 0) {\n console.log(` ${dim}= UNCHANGED${reset}`);\n for (const e of unchanged) {\n const idPad = e.id.padEnd(maxIdLen);\n console.log(` ${dim}${idPad} ${e.currCount} match${e.currCount !== 1 ? 'es' : ''} (no change)${reset}`);\n }\n console.log();\n }\n\n if (allEntries.length === 0) {\n console.log(` ${dim}No pattern matches found in either baseline or current index.${reset}\\n`);\n return;\n }\n\n const netLabel = netDelta > 0\n ? `\\x1b[31m+${netDelta}${reset}`\n : netDelta < 0\n ? `\\x1b[32m${netDelta}${reset}`\n : `${dim}0${reset}`;\n console.log(` ${dim}Net:${reset} ${netLabel}${dim} findings since baseline${reset}\\n`);\n return;\n }\n\n // \u2500\u2500 --fix guard: only works with --library \u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.fix && !opts.library) {\n console.error(` ${'\\x1b[31m'}\u2716 --fix requires --library <id>. Inline patterns do not support automatic fixes.${reset}`);\n process.exit(1);\n }\n\n // \u2500\u2500 Guards for live search / --library (require enablePatterns + napi) \u2500\u2500\n const config = await loadConfig(target);\n\n if (!config.enablePatterns) {\n console.error(`\\n ${'\\x1b[31m'}\u2716 kirograph pattern requires enablePatterns: true in .kirograph/config.json${reset}`);\n console.error(` ${dim}Enable it:${reset} ${violet}${bold}\"enablePatterns\": true${reset}`);\n console.error(` ${dim}Then install:${reset} ${violet}${bold}npm install @ast-grep/napi${reset}`);\n console.error(` ${dim}Then re-index:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(2);\n }\n\n const { PatternRunner } = await Promise.resolve().then(() => require('../../patterns/runner.js'));\n const runner = new PatternRunner();\n\n if (!runner.isAvailable()) {\n console.error(`\\n ${'\\x1b[31m'}\u2716 kirograph pattern requires @ast-grep/napi${reset}`);\n console.error(` ${dim}Install it with:${reset} ${violet}${bold}npm install @ast-grep/napi${reset}\\n`);\n process.exit(2);\n }\n\n // \u2500\u2500 Auto-detect: positional arg that matches a library rule ID \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (!opts.library && patternArg) {\n const { PatternLibraryLoader: AutoLoader } = await Promise.resolve().then(() => require('../../patterns/loader.js'));\n const autoRules = new AutoLoader().load(resolveLibraryPath(), config.patternLibraryPath);\n if (autoRules.some(r => r.id === patternArg)) {\n console.log(` ${dim}Tip: '${patternArg}' is a library rule. Running as --library ${patternArg}${reset}`);\n opts.library = patternArg;\n patternArg = undefined;\n }\n }\n\n // \u2500\u2500 --library <id> mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.library) {\n if (!require('../../index').default.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n const rawDb = db.getRawDb();\n\n const { PatternLibraryLoader } = await Promise.resolve().then(() => require('../../patterns/loader.js'));\n const loader = new PatternLibraryLoader();\n const libraryPath = resolveLibraryPath();\n const customPath = config.patternLibraryPath;\n const rules = loader.load(libraryPath, customPath);\n\n const rule = rules.find(r => r.id === opts.library);\n if (!rule) {\n console.error(` \u2716 Rule \"${opts.library}\" not found. Run: kirograph pattern --list`);\n cg.close();\n process.exitCode = 1; return;\n }\n\n // Determine languages to filter by\n const langs = Array.isArray(rule.language) ? rule.language : [rule.language];\n\n // Query files for this language\n const placeholders = langs.map(() => '?').join(', ');\n const files: Array<{ path: string; language: string }> = rawDb.all(\n `SELECT path, language FROM files WHERE language IN (${placeholders}) LIMIT 5000`,\n langs,\n );\n\n const allMatches: Array<{ filePath: string; line: number; matchText: string; context: string }> = [];\n\n // \u2500\u2500 --fix mode: apply fixes in-place \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (opts.fix) {\n const { PatternRunner: FixPatternRunner } = await Promise.resolve().then(() => require('../../patterns/runner.js'));\n const fixRunner = new FixPatternRunner();\n if (!fixRunner.isAvailable()) {\n console.error(` \\x1b[31m\u2716 --fix requires @ast-grep/napi. Run: npm install @ast-grep/napi${reset}`);\n cg.close?.();\n process.exitCode = 2; return;\n }\n\n if (!rule.fix) {\n console.error(` ${'\\x1b[31m'}\u2716 Rule \"${rule.id}\" does not have a fix: template defined.${reset}`);\n cg.close();\n process.exitCode = 1; return;\n }\n\n let fixedFiles = 0;\n let totalChanges = 0;\n\n for (const file of files) {\n let content: string;\n const fullPath = path.isAbsolute(file.path) ? file.path : path.join(target, file.path);\n try {\n content = fs.readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n\n // Count matches before fix to report change count\n const matchesBefore = await fixRunner.runRule(rule, content, file.language);\n if (matchesBefore.length === 0) continue;\n\n const fixed = await fixRunner.applyFix(fullPath, content, file.language, rule);\n if (fixed !== null && fixed !== content) {\n fs.writeFileSync(fullPath, fixed, 'utf8');\n const relPath = path.relative(target, fullPath);\n console.log(` \\x1b[32m\u2713 Fixed\\x1b[0m ${relPath} (${matchesBefore.length} change${matchesBefore.length !== 1 ? 's' : ''})`);\n fixedFiles++;\n totalChanges += matchesBefore.length;\n }\n }\n\n cg.close();\n console.log(`\\n Fixed ${fixedFiles} file${fixedFiles !== 1 ? 's' : ''}, ${totalChanges} total change${totalChanges !== 1 ? 's' : ''}\\n`);\n process.exitCode = 0; return;\n }\n\n for (const file of files) {\n let content: string;\n try {\n const fullPath = path.isAbsolute(file.path) ? file.path : path.join(target, file.path);\n content = fs.readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n const matches = await runner.runRule(rule, content, file.language);\n for (const m of matches) {\n allMatches.push({ filePath: file.path, line: m.line, matchText: m.matchText, context: m.context });\n }\n }\n\n cg.close();\n\n // Apply severity filter (already filtered by rule severity \u2014 but allow user to filter further)\n const sev = opts.severity as SeverityLevel | undefined;\n if (sev && SEVERITY_LEVELS.includes(sev)) {\n if (SEVERITY_ORDER[rule.severity] < SEVERITY_ORDER[sev]) {\n // The rule's severity is below the requested filter \u2014 no results\n if (opts.format === 'json') {\n process.stdout.write(JSON.stringify([], null, 2) + '\\n');\n } else {\n console.log(`\\n ${dim}No matches (rule severity \"${rule.severity}\" is below filter \"${sev}\").${reset}\\n`);\n }\n process.exitCode = 0; return;\n }\n }\n\n if (opts.format === 'json') {\n process.stdout.write(JSON.stringify(allMatches.map(m => ({\n filePath: m.filePath,\n line: m.line,\n matchText: m.matchText,\n rule: { id: rule.id, severity: rule.severity, owaspCategory: rule.owaspCategory, description: rule.description, fixHint: rule.fixHint },\n })), null, 2) + '\\n');\n process.exitCode = allMatches.length > 0 ? 1 : 0; return;\n }\n\n if (allMatches.length === 0) {\n console.log(`\\n ${dim}No matches for library rule '${rule.id}'.${reset}\\n`);\n process.exitCode = 0; return;\n }\n\n const sc = severityColor(rule.severity);\n console.log(`\\n ${section(rule.description)}`);\n console.log(` ${dim}Rule:${reset} ${violet}${bold}${rule.id}${reset} ${sc}${rule.severity}${reset} ${dim}[${rule.owaspCategory}]${reset}`);\n console.log(` ${dim}Fix:${reset} ${rule.fixHint}`);\n console.log(`\\n ${allMatches.length} match${allMatches.length !== 1 ? 'es' : ''}\\n`);\n\n for (const m of allMatches) {\n const relPath = path.relative(target, path.isAbsolute(m.filePath) ? m.filePath : path.join(target, m.filePath));\n console.log(` ${violet}${bold}${relPath}:${m.line}${reset}`);\n console.log(` ${dim}${m.matchText}${reset}`);\n console.log(` ${'\u2500'.repeat(17)}`);\n }\n\n console.log();\n process.exitCode = 1; return;\n }\n\n // \u2500\u2500 Live search mode (positional pattern) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 if (!patternArg) {\n console.error(' \u2716 Provide a pattern to search, or use --list / --library <id>');\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 const rawDb = db.getRawDb();\n\n // Build query based on --lang filter\n let files: Array<{ path: string; language: string }>;\n if (opts.lang) {\n files = rawDb.all(\n 'SELECT path, language FROM files WHERE language = ? LIMIT 5000',\n [opts.lang],\n );\n } else {\n files = rawDb.all('SELECT path, language FROM files LIMIT 5000');\n }\n\n const allMatches: Array<{ filePath: string; line: number; matchText: string; context: string; language: string }> = [];\n\n for (const file of files) {\n let content: string;\n try {\n const fullPath = path.isAbsolute(file.path) ? file.path : path.join(target, file.path);\n content = fs.readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n const matches = await runner.runInline(patternArg, file.language, content);\n for (const m of matches) {\n allMatches.push({ filePath: file.path, line: m.line, matchText: m.matchText, context: m.context, language: file.language });\n }\n }\n\n cg.close();\n\n if (opts.format === 'json') {\n process.stdout.write(JSON.stringify(allMatches.map(m => ({\n filePath: m.filePath,\n line: m.line,\n matchText: m.matchText,\n language: m.language,\n })), null, 2) + '\\n');\n process.exitCode = allMatches.length > 0 ? 1 : 0; return;\n }\n\n const langLabel = opts.lang ? ` in ${opts.lang} files` : '';\n console.log(`\\n ${allMatches.length} match${allMatches.length !== 1 ? 'es' : ''} for ${violet}${bold}'${patternArg}'${reset}${langLabel}\\n`);\n\n if (allMatches.length === 0) {\n process.exitCode = 0; return;\n }\n\n for (const m of allMatches) {\n const relPath = path.relative(target, path.isAbsolute(m.filePath) ? m.filePath : path.join(target, m.filePath));\n console.log(` ${violet}${bold}${relPath}:${m.line}${reset}`);\n console.log(` ${dim}${m.matchText}${reset}`);\n console.log(` ${'\u2500'.repeat(17)}`);\n }\n\n console.log();\n process.exitCode = 1; return;\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config", "cg", "rawDb", "covered", "KiroGraph", "db", "files", "allMatches"]
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reachability.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/reachability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0H/C"}
|
|
@@ -0,0 +1,160 @@
|
|
|
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 reachability_exports = {};
|
|
30
|
+
__export(reachability_exports, {
|
|
31
|
+
register: () => register
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(reachability_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 register(program) {
|
|
40
|
+
program.command("reachability <target> [projectPath]").description("Check reachability for a dependency or CVE: verdict, call paths, impact summary").action(async (target, projectPath) => {
|
|
41
|
+
const projectRoot = path.resolve(projectPath ?? process.cwd());
|
|
42
|
+
const config = await (0, import_config.loadConfig)(projectRoot);
|
|
43
|
+
if (!config.enableSecurity) {
|
|
44
|
+
console.error(`
|
|
45
|
+
${yellow}\u26A0 Security analysis is disabled.${import_ui.reset}`);
|
|
46
|
+
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}`);
|
|
47
|
+
console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
|
|
48
|
+
`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
52
|
+
if (!KiroGraph.isInitialized(projectRoot)) {
|
|
53
|
+
console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const cg = await KiroGraph.open(projectRoot);
|
|
57
|
+
const db = cg.getDatabase();
|
|
58
|
+
db.applySecuritySchema();
|
|
59
|
+
const rawDb = db.getRawDb();
|
|
60
|
+
let vulnerabilityNodeId = null;
|
|
61
|
+
let targetLabel = target;
|
|
62
|
+
const vulnRow = rawDb.get(
|
|
63
|
+
`SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,
|
|
64
|
+
[target]
|
|
65
|
+
);
|
|
66
|
+
if (vulnRow) {
|
|
67
|
+
vulnerabilityNodeId = vulnRow.node_id;
|
|
68
|
+
} else {
|
|
69
|
+
const depRow = rawDb.get(
|
|
70
|
+
`SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,
|
|
71
|
+
[target]
|
|
72
|
+
);
|
|
73
|
+
if (depRow) {
|
|
74
|
+
targetLabel = depRow.package_name;
|
|
75
|
+
const vulnEdge = rawDb.get(
|
|
76
|
+
`SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,
|
|
77
|
+
[depRow.node_id]
|
|
78
|
+
);
|
|
79
|
+
if (vulnEdge) {
|
|
80
|
+
vulnerabilityNodeId = vulnEdge.target;
|
|
81
|
+
} else {
|
|
82
|
+
console.error(`
|
|
83
|
+
${import_ui.dim}No vulnerabilities found for dependency "${target}". The dependency exists but has no known CVEs.${import_ui.reset}
|
|
84
|
+
`);
|
|
85
|
+
cg.close();
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
console.error(`
|
|
90
|
+
\u2716 Target "${target}" not found. Provide a valid CVE ID or dependency package name.
|
|
91
|
+
`);
|
|
92
|
+
cg.close();
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require("../../security/reachability.js"));
|
|
97
|
+
const analyzer = new ReachabilityAnalyzer(db, config);
|
|
98
|
+
const result = await analyzer.analyze(vulnerabilityNodeId);
|
|
99
|
+
let verdictColor;
|
|
100
|
+
let verdictLabel;
|
|
101
|
+
if (result.verdict === "affected") {
|
|
102
|
+
verdictColor = red;
|
|
103
|
+
verdictLabel = "affected";
|
|
104
|
+
} else if (result.verdict === "not_affected") {
|
|
105
|
+
verdictColor = import_ui.green;
|
|
106
|
+
verdictLabel = "not affected";
|
|
107
|
+
} else {
|
|
108
|
+
verdictColor = yellow;
|
|
109
|
+
verdictLabel = "under investigation";
|
|
110
|
+
}
|
|
111
|
+
console.log(`
|
|
112
|
+
${import_ui.violet}${import_ui.bold}Reachability:${import_ui.reset} ${targetLabel}`);
|
|
113
|
+
console.log(` ${import_ui.dim}Verdict:${import_ui.reset} ${verdictColor}${import_ui.bold}${verdictLabel}${import_ui.reset}`);
|
|
114
|
+
console.log(` ${import_ui.dim}Reaching entry points:${import_ui.reset} ${import_ui.bold}${result.reachingEntryPointCount}${import_ui.reset}`);
|
|
115
|
+
if (result.paths.length > 0) {
|
|
116
|
+
console.log(`
|
|
117
|
+
${import_ui.violet}${import_ui.bold}Call Paths${import_ui.reset} ${import_ui.dim}(showing up to 5)${import_ui.reset}
|
|
118
|
+
`);
|
|
119
|
+
for (const p of result.paths.slice(0, 5)) {
|
|
120
|
+
console.log(` ${import_ui.dim}from${import_ui.reset} ${import_ui.violet}${p.entryPoint}${import_ui.reset}`);
|
|
121
|
+
console.log(` ${p.path.join(` ${import_ui.dim}\u2192${import_ui.reset} `)}`);
|
|
122
|
+
}
|
|
123
|
+
if (result.paths.length > 5) {
|
|
124
|
+
console.log(`
|
|
125
|
+
${import_ui.dim}\u2026and ${result.paths.length - 5} more paths${import_ui.reset}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (result.unresolvedSymbols.length > 0) {
|
|
129
|
+
console.log(`
|
|
130
|
+
${yellow}Unresolved Symbols${import_ui.reset} ${import_ui.dim}(${result.unresolvedSymbols.length} total, showing up to 10)${import_ui.reset}
|
|
131
|
+
`);
|
|
132
|
+
for (const sym of result.unresolvedSymbols.slice(0, 10)) {
|
|
133
|
+
console.log(` ${import_ui.dim}\xB7${import_ui.reset} ${sym}`);
|
|
134
|
+
}
|
|
135
|
+
if (result.unresolvedSymbols.length > 10) {
|
|
136
|
+
console.log(` ${import_ui.dim}\u2026and ${result.unresolvedSymbols.length - 10} more${import_ui.reset}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (result.verdict === "affected") {
|
|
140
|
+
const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);
|
|
141
|
+
if (impact) {
|
|
142
|
+
console.log(`
|
|
143
|
+
${import_ui.violet}${import_ui.bold}Impact Summary${import_ui.reset}
|
|
144
|
+
`);
|
|
145
|
+
if (impact.affectedLayers.length > 0) {
|
|
146
|
+
console.log(` ${import_ui.dim}Affected layers:${import_ui.reset} ${impact.affectedLayers.join(", ")}`);
|
|
147
|
+
}
|
|
148
|
+
console.log(` ${import_ui.dim}Affected entry points:${import_ui.reset} ${import_ui.bold}${impact.affectedEntryPoints.length}${import_ui.reset}`);
|
|
149
|
+
console.log(` ${import_ui.dim}Distinct paths:${import_ui.reset} ${import_ui.bold}${impact.distinctPathCount}${import_ui.reset}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
console.log();
|
|
153
|
+
cg.close();
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
157
|
+
0 && (module.exports = {
|
|
158
|
+
register
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=reachability.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/reachability.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\nexport function register(program: Command): void {\n program\n .command('reachability <target> [projectPath]')\n .description('Check reachability for a dependency or CVE: verdict, call paths, impact summary')\n .action(async (target: string, projectPath: string | undefined) => {\n const projectRoot = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(projectRoot);\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(projectRoot)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(projectRoot);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Resolve target to a vulnerability node ID (CVE ID or package name)\n let vulnerabilityNodeId: string | null = null;\n let targetLabel = target;\n\n const vulnRow: { node_id: string } | undefined = rawDb.get(\n `SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,\n [target],\n );\n\n if (vulnRow) {\n vulnerabilityNodeId = vulnRow.node_id;\n } else {\n const depRow: { node_id: string; package_name: string } | undefined = rawDb.get(\n `SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,\n [target],\n );\n\n if (depRow) {\n targetLabel = depRow.package_name;\n const vulnEdge: { target: string } | undefined = rawDb.get(\n `SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,\n [depRow.node_id],\n );\n\n if (vulnEdge) {\n vulnerabilityNodeId = vulnEdge.target;\n } else {\n console.error(`\\n ${dim}No vulnerabilities found for dependency \"${target}\". The dependency exists but has no known CVEs.${reset}\\n`);\n cg.close();\n process.exit(0);\n }\n } else {\n console.error(`\\n \u2716 Target \"${target}\" not found. Provide a valid CVE ID or dependency package name.\\n`);\n cg.close();\n process.exit(1);\n }\n }\n\n const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require('../../security/reachability.js'));\n const analyzer = new ReachabilityAnalyzer(db, config);\n const result = await analyzer.analyze(vulnerabilityNodeId);\n\n // Verdict line\n let verdictColor: string;\n let verdictLabel: string;\n if (result.verdict === 'affected') {\n verdictColor = red; verdictLabel = 'affected';\n } else if (result.verdict === 'not_affected') {\n verdictColor = green; verdictLabel = 'not affected';\n } else {\n verdictColor = yellow; verdictLabel = 'under investigation';\n }\n\n console.log(`\\n ${violet}${bold}Reachability:${reset} ${targetLabel}`);\n console.log(` ${dim}Verdict:${reset} ${verdictColor}${bold}${verdictLabel}${reset}`);\n console.log(` ${dim}Reaching entry points:${reset} ${bold}${result.reachingEntryPointCount}${reset}`);\n\n // Call paths\n if (result.paths.length > 0) {\n console.log(`\\n ${violet}${bold}Call Paths${reset} ${dim}(showing up to 5)${reset}\\n`);\n for (const p of result.paths.slice(0, 5)) {\n console.log(` ${dim}from${reset} ${violet}${p.entryPoint}${reset}`);\n console.log(` ${p.path.join(` ${dim}\u2192${reset} `)}`);\n }\n if (result.paths.length > 5) {\n console.log(`\\n ${dim}\u2026and ${result.paths.length - 5} more paths${reset}`);\n }\n }\n\n // Unresolved symbols\n if (result.unresolvedSymbols.length > 0) {\n console.log(`\\n ${yellow}Unresolved Symbols${reset} ${dim}(${result.unresolvedSymbols.length} total, showing up to 10)${reset}\\n`);\n for (const sym of result.unresolvedSymbols.slice(0, 10)) {\n console.log(` ${dim}\u00B7${reset} ${sym}`);\n }\n if (result.unresolvedSymbols.length > 10) {\n console.log(` ${dim}\u2026and ${result.unresolvedSymbols.length - 10} more${reset}`);\n }\n }\n\n // Impact summary (only when affected)\n if (result.verdict === 'affected') {\n const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);\n if (impact) {\n console.log(`\\n ${violet}${bold}Impact Summary${reset}\\n`);\n if (impact.affectedLayers.length > 0) {\n console.log(` ${dim}Affected layers:${reset} ${impact.affectedLayers.join(', ')}`);\n }\n console.log(` ${dim}Affected entry points:${reset} ${bold}${impact.affectedEntryPoints.length}${reset}`);\n console.log(` ${dim}Distinct paths:${reset} ${bold}${impact.distinctPathCount}${reset}`);\n }\n }\n\n console.log();\n cg.close();\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E/C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
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 read_exports = {};
|
|
30
|
+
__export(read_exports, {
|
|
31
|
+
register: () => register
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(read_exports);
|
|
34
|
+
var path = __toESM(require("path"));
|
|
35
|
+
var fs = __toESM(require("fs"));
|
|
36
|
+
function register(program) {
|
|
37
|
+
program.command("read <path>").description("Read a file with caching and multiple modes").option("--no-cache", "Force fresh read, bypass cache").option("--mode <mode>", "Read mode: full, map, signatures, diff, lines, imports, exports", "full").option("--start <n>", "Start line (for lines mode)", parseInt).option("--end <n>", "End line (for lines mode)", parseInt).option("--json", "Output as JSON").action(async (filePath, opts) => {
|
|
38
|
+
const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
|
|
39
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
40
|
+
console.error(` Error: File not found: ${resolvedPath}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const { getFileReadCache } = await Promise.resolve().then(() => require("../../mcp/cache.js"));
|
|
44
|
+
const { executeReadMode } = await Promise.resolve().then(() => require("../../mcp/read-modes.js"));
|
|
45
|
+
const cache = getFileReadCache();
|
|
46
|
+
const mode = opts.mode;
|
|
47
|
+
const noCache = !opts.cache;
|
|
48
|
+
if (mode !== "full") {
|
|
49
|
+
let cg = null;
|
|
50
|
+
try {
|
|
51
|
+
const { findNearestKiroGraphRoot } = await Promise.resolve().then(() => require("../../index.js"));
|
|
52
|
+
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
53
|
+
const root = findNearestKiroGraphRoot(process.cwd());
|
|
54
|
+
if (root) {
|
|
55
|
+
cg = await KiroGraph.open(root);
|
|
56
|
+
}
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
59
|
+
const result2 = executeReadMode({
|
|
60
|
+
mode,
|
|
61
|
+
filePath: resolvedPath,
|
|
62
|
+
start: opts.start,
|
|
63
|
+
end: opts.end,
|
|
64
|
+
cg
|
|
65
|
+
});
|
|
66
|
+
cache.read(resolvedPath, true);
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
console.log(JSON.stringify({ mode: result2.mode, tokenEstimate: result2.tokenEstimate, content: result2.content }, null, 2));
|
|
69
|
+
} else {
|
|
70
|
+
console.log(result2.content);
|
|
71
|
+
}
|
|
72
|
+
if (cg) {
|
|
73
|
+
try {
|
|
74
|
+
cg.close();
|
|
75
|
+
} catch {
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const result = cache.read(resolvedPath, noCache);
|
|
81
|
+
if (opts.json) {
|
|
82
|
+
console.log(JSON.stringify({ cached: result.cached, changed: result.changed, content: result.content }, null, 2));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (result.cached) {
|
|
86
|
+
console.log(result.content);
|
|
87
|
+
} else if (result.changed) {
|
|
88
|
+
console.log(`[file changed since last read]
|
|
89
|
+
`);
|
|
90
|
+
console.log(result.content);
|
|
91
|
+
} else {
|
|
92
|
+
console.log(result.content);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
97
|
+
0 && (module.exports = {
|
|
98
|
+
register
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/read.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * kirograph read \u2014 File read with caching and multiple modes\n */\n\nimport { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport function register(program: Command): void {\n program\n .command('read <path>')\n .description('Read a file with caching and multiple modes')\n .option('--no-cache', 'Force fresh read, bypass cache')\n .option('--mode <mode>', 'Read mode: full, map, signatures, diff, lines, imports, exports', 'full')\n .option('--start <n>', 'Start line (for lines mode)', parseInt)\n .option('--end <n>', 'End line (for lines mode)', parseInt)\n .option('--json', 'Output as JSON')\n .action(async (filePath: string, opts: { cache: boolean; mode: string; start?: number; end?: number; json?: boolean }) => {\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.error(` Error: File not found: ${resolvedPath}`);\n process.exit(1);\n }\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('../../mcp/cache.js'));\n const { executeReadMode } = await Promise.resolve().then(() => require('../../mcp/read-modes.js'));\n const cache = getFileReadCache();\n\n const mode = opts.mode as any;\n const noCache = !opts.cache;\n\n if (mode !== 'full') {\n // For non-full modes, try to get graph connection\n let cg = null;\n try {\n const { findNearestKiroGraphRoot } = await Promise.resolve().then(() => require('../../index.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const root = findNearestKiroGraphRoot(process.cwd());\n if (root) {\n cg = await KiroGraph.open(root);\n }\n } catch { /* no graph available */ }\n\n const result = executeReadMode({\n mode,\n filePath: resolvedPath,\n start: opts.start,\n end: opts.end,\n cg,\n });\n\n // Update cache for future diff mode\n cache.read(resolvedPath, true);\n\n if (opts.json) {\n console.log(JSON.stringify({ mode: result.mode, tokenEstimate: result.tokenEstimate, content: result.content }, null, 2));\n } else {\n console.log(result.content);\n }\n\n if (cg) {\n try { (cg as any).close(); } catch { /* ignore */ }\n }\n return;\n }\n\n // Full mode with caching\n const result = cache.read(resolvedPath, noCache);\n\n if (opts.json) {\n console.log(JSON.stringify({ cached: result.cached, changed: result.changed, content: result.content }, null, 2));\n return;\n }\n\n if (result.cached) {\n console.log(result.content);\n } else if (result.changed) {\n console.log(`[file changed since last read]\\n`);\n console.log(result.content);\n } else {\n console.log(result.content);\n }\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,WAAsB;AACtB,SAAoB;AAEb,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,aAAa,EACrB,YAAY,6CAA6C,EACzD,OAAO,cAAc,gCAAgC,EACrD,OAAO,iBAAiB,mEAAmE,MAAM,EACjG,OAAO,eAAe,+BAA+B,QAAQ,EAC7D,OAAO,aAAa,6BAA6B,QAAQ,EACzD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,UAAkB,SAAyF;AACxH,UAAM,eAAe,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,QAAQ;AAEhG,QAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,cAAQ,MAAM,4BAA4B,YAAY,EAAE;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC7F,UAAM,EAAE,gBAAgB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AACjG,UAAM,QAAQ,iBAAiB;AAE/B,UAAM,OAAO,KAAK;AAClB,UAAM,UAAU,CAAC,KAAK;AAEtB,QAAI,SAAS,QAAQ;AAEnB,UAAI,KAAK;AACT,UAAI;AACF,cAAM,EAAE,yBAAyB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC;AACjG,cAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,cAAM,OAAO,yBAAyB,QAAQ,IAAI,CAAC;AACnD,YAAI,MAAM;AACR,eAAK,MAAM,UAAU,KAAK,IAAI;AAAA,QAChC;AAAA,MACF,QAAQ;AAAA,MAA2B;AAEnC,YAAMA,UAAS,gBAAgB;AAAA,QAC7B;AAAA,QACA,UAAU;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,KAAK,KAAK;AAAA,QACV;AAAA,MACF,CAAC;AAGD,YAAM,KAAK,cAAc,IAAI;AAE7B,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAMA,QAAO,MAAM,eAAeA,QAAO,eAAe,SAASA,QAAO,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,MAC1H,OAAO;AACL,gBAAQ,IAAIA,QAAO,OAAO;AAAA,MAC5B;AAEA,UAAI,IAAI;AACN,YAAI;AAAE,UAAC,GAAW,MAAM;AAAA,QAAG,QAAQ;AAAA,QAAe;AAAA,MACpD;AACA;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,cAAc,OAAO;AAE/C,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,SAAS,SAAS,OAAO,QAAQ,GAAG,MAAM,CAAC,CAAC;AAChH;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ;AACjB,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B,WAAW,OAAO,SAAS;AACzB,cAAQ,IAAI;AAAA,CAAkC;AAC9C,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B,OAAO;AACL,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B;AAAA,EACF,CAAC;AACL;",
|
|
6
|
+
"names": ["result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refactor.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/refactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+F/C"}
|
|
@@ -0,0 +1,116 @@
|
|
|
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 refactor_exports = {};
|
|
30
|
+
__export(refactor_exports, {
|
|
31
|
+
register: () => register
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(refactor_exports);
|
|
34
|
+
var path = __toESM(require("path"));
|
|
35
|
+
var import_ui = require("../ui");
|
|
36
|
+
function register(program) {
|
|
37
|
+
const refactorCmd = program.command("refactor").description("Refactoring tools: rename preview and suggestions");
|
|
38
|
+
refactorCmd.command("rename <symbol> [projectPath]").description("Preview all locations that reference a symbol (rename preview)").option("--json", "Output as JSON").action(async (symbol, projectPath, opts) => {
|
|
39
|
+
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
40
|
+
const target = path.resolve(projectPath ?? process.cwd());
|
|
41
|
+
const cg = await KiroGraph.open(target);
|
|
42
|
+
const { renamePreview } = await Promise.resolve().then(() => require("../../graph/refactor.js"));
|
|
43
|
+
const db = cg.getDatabase();
|
|
44
|
+
const preview = renamePreview(db, symbol);
|
|
45
|
+
if (!preview) {
|
|
46
|
+
console.error(` Symbol "${symbol}" not found in index.`);
|
|
47
|
+
cg.close();
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
if (opts.json) {
|
|
51
|
+
console.log(JSON.stringify(preview, null, 2));
|
|
52
|
+
cg.close();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
console.log(`
|
|
56
|
+
${import_ui.bold}Rename Preview:${import_ui.reset} ${import_ui.violet}${preview.symbol}${import_ui.reset} (${preview.kind})`);
|
|
57
|
+
console.log(` ${import_ui.dim}Defined at: ${preview.filePath}:${preview.line}${import_ui.reset}`);
|
|
58
|
+
console.log(` ${import_ui.dim}Total references: ${preview.totalReferences}${import_ui.reset}
|
|
59
|
+
`);
|
|
60
|
+
if (preview.references.length === 0) {
|
|
61
|
+
console.log(` ${import_ui.green}\u2713${import_ui.reset} No references found \u2014 safe to rename without affecting other code.
|
|
62
|
+
`);
|
|
63
|
+
} else {
|
|
64
|
+
const byFile = /* @__PURE__ */ new Map();
|
|
65
|
+
for (const ref of preview.references) {
|
|
66
|
+
if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);
|
|
67
|
+
byFile.get(ref.filePath).push(ref);
|
|
68
|
+
}
|
|
69
|
+
for (const [file, refs] of byFile) {
|
|
70
|
+
console.log(` ${import_ui.bold}${file}${import_ui.reset} (${refs.length})`);
|
|
71
|
+
for (const ref of refs.slice(0, 10)) {
|
|
72
|
+
console.log(` ${import_ui.dim}line ${ref.line}:${import_ui.reset} ${ref.context} ${import_ui.dim}(${ref.edgeKind})${import_ui.reset}`);
|
|
73
|
+
}
|
|
74
|
+
if (refs.length > 10) console.log(` ${import_ui.dim}\u2026and ${refs.length - 10} more${import_ui.reset}`);
|
|
75
|
+
console.log();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
cg.close();
|
|
79
|
+
});
|
|
80
|
+
refactorCmd.command("suggest [projectPath]").description("Get community-driven refactoring suggestions").option("--limit <n>", "Max suggestions", "10").option("--json", "Output as JSON").action(async (projectPath, opts) => {
|
|
81
|
+
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
82
|
+
const target = path.resolve(projectPath ?? process.cwd());
|
|
83
|
+
const cg = await KiroGraph.open(target);
|
|
84
|
+
const { suggestRefactorings } = await Promise.resolve().then(() => require("../../graph/refactor.js"));
|
|
85
|
+
const db = cg.getDatabase();
|
|
86
|
+
const suggestions = suggestRefactorings(db, parseInt(opts.limit));
|
|
87
|
+
if (opts.json) {
|
|
88
|
+
console.log(JSON.stringify(suggestions, null, 2));
|
|
89
|
+
cg.close();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (suggestions.length === 0) {
|
|
93
|
+
console.log(`
|
|
94
|
+
${import_ui.green}\u2713${import_ui.reset} No refactoring suggestions \u2014 the codebase structure looks clean.
|
|
95
|
+
`);
|
|
96
|
+
cg.close();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log(`
|
|
100
|
+
${import_ui.bold}Refactoring Suggestions${import_ui.reset} (${suggestions.length})
|
|
101
|
+
`);
|
|
102
|
+
for (const s of suggestions) {
|
|
103
|
+
const icon = s.priority === "high" ? "\u{1F534}" : s.priority === "medium" ? "\u{1F7E1}" : "\u{1F7E2}";
|
|
104
|
+
console.log(` ${icon} ${import_ui.bold}${s.type}${import_ui.reset} [${s.priority}]`);
|
|
105
|
+
console.log(` ${s.description}`);
|
|
106
|
+
console.log(` ${import_ui.dim}${s.rationale}${import_ui.reset}`);
|
|
107
|
+
console.log();
|
|
108
|
+
}
|
|
109
|
+
cg.close();
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
113
|
+
0 && (module.exports = {
|
|
114
|
+
register
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=refactor.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bin/commands/refactor.ts"],
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { dim, reset, violet, bold, green } from '../ui';\n\nexport function register(program: Command): void {\n const refactorCmd = program\n .command('refactor')\n .description('Refactoring tools: rename preview and suggestions');\n\n refactorCmd\n .command('rename <symbol> [projectPath]')\n .description('Preview all locations that reference a symbol (rename preview)')\n .option('--json', 'Output as JSON')\n .action(async (symbol: string, projectPath: string | undefined, opts: { json?: boolean }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(projectPath ?? process.cwd());\n const cg = await KiroGraph.open(target);\n const { renamePreview } = await Promise.resolve().then(() => require('../../graph/refactor.js'));\n const db = cg.getDatabase();\n\n const preview = renamePreview(db, symbol);\n\n if (!preview) {\n console.error(` Symbol \"${symbol}\" not found in index.`);\n cg.close();\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(preview, null, 2));\n cg.close();\n return;\n }\n\n console.log(`\\n ${bold}Rename Preview:${reset} ${violet}${preview.symbol}${reset} (${preview.kind})`);\n console.log(` ${dim}Defined at: ${preview.filePath}:${preview.line}${reset}`);\n console.log(` ${dim}Total references: ${preview.totalReferences}${reset}\\n`);\n\n if (preview.references.length === 0) {\n console.log(` ${green}\u2713${reset} No references found \u2014 safe to rename without affecting other code.\\n`);\n } else {\n // Group by file\n const byFile = new Map<string, typeof preview.references>();\n for (const ref of preview.references) {\n if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);\n byFile.get(ref.filePath)!.push(ref);\n }\n\n for (const [file, refs] of byFile) {\n console.log(` ${bold}${file}${reset} (${refs.length})`);\n for (const ref of refs.slice(0, 10)) {\n console.log(` ${dim}line ${ref.line}:${reset} ${ref.context} ${dim}(${ref.edgeKind})${reset}`);\n }\n if (refs.length > 10) console.log(` ${dim}\u2026and ${refs.length - 10} more${reset}`);\n console.log();\n }\n }\n\n cg.close();\n });\n\n refactorCmd\n .command('suggest [projectPath]')\n .description('Get community-driven refactoring suggestions')\n .option('--limit <n>', 'Max suggestions', '10')\n .option('--json', 'Output as JSON')\n .action(async (projectPath: string | undefined, opts: { limit: string; json?: boolean }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(projectPath ?? process.cwd());\n const cg = await KiroGraph.open(target);\n const { suggestRefactorings } = await Promise.resolve().then(() => require('../../graph/refactor.js'));\n const db = cg.getDatabase();\n\n const suggestions = suggestRefactorings(db, parseInt(opts.limit));\n\n if (opts.json) {\n console.log(JSON.stringify(suggestions, null, 2));\n cg.close();\n return;\n }\n\n if (suggestions.length === 0) {\n console.log(`\\n ${green}\u2713${reset} No refactoring suggestions \u2014 the codebase structure looks clean.\\n`);\n cg.close();\n return;\n }\n\n console.log(`\\n ${bold}Refactoring Suggestions${reset} (${suggestions.length})\\n`);\n\n for (const s of suggestions) {\n const icon = s.priority === 'high' ? '\uD83D\uDD34' : s.priority === 'medium' ? '\uD83D\uDFE1' : '\uD83D\uDFE2';\n console.log(` ${icon} ${bold}${s.type}${reset} [${s.priority}]`);\n console.log(` ${s.description}`);\n console.log(` ${dim}${s.rationale}${reset}`);\n console.log();\n }\n\n cg.close();\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/remediation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2F/C"}
|