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/security/dep-confusion.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Dependency Confusion Checker\n *\n * Detects internal packages whose names exist in public registries\n * (a supply chain attack vector), and flags typosquatting candidates.\n */\n\nimport { logWarn } from '../errors';\nimport type { GraphDatabase } from '../db/database';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nexport interface DepConfusionFinding {\n packageName: string;\n ecosystem: string;\n internalSource: string; // e.g. \"private registry\" or \"local path\"\n publicExists: boolean;\n publicVersion: string | null;\n publicPublishedAt: string | null;\n riskLevel: 'critical' | 'high' | 'medium';\n explanation: string;\n}\n\n// \u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Well-known packages for typosquatting detection\nconst WELL_KNOWN_NPM: string[] = [\n 'lodash', 'express', 'react', 'axios', 'webpack', 'babel', 'moment',\n 'next', 'vue', 'angular',\n];\n\n// \u2500\u2500 Levenshtein distance (for typosquatting) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction levenshtein(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n const matrix: number[][] = [];\n for (let i = 0; i <= b.length; i++) matrix[i] = [i];\n for (let j = 0; j <= a.length; j++) matrix[0]![j] = j;\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n const cost = a[j - 1] === b[i - 1] ? 0 : 1;\n matrix[i]![j] = Math.min(\n matrix[i - 1]![j]! + 1, // deletion\n matrix[i]![j - 1]! + 1, // insertion\n matrix[i - 1]![j - 1]! + cost, // substitution\n );\n }\n }\n return matrix[b.length]![a.length]!;\n}\n\nfunction isTyposquatCandidate(name: string, wellKnown: string[]): string | null {\n // Strip scoped prefix for comparison\n const base = name.startsWith('@') ? name.split('/')[1] ?? name : name;\n for (const known of wellKnown) {\n const dist = levenshtein(base.toLowerCase(), known.toLowerCase());\n if (dist > 0 && dist <= 2) return known;\n }\n return null;\n}\n\n// \u2500\u2500 Registry HEAD check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 TIMEOUT_MS = 10_000;\n\ninterface PublicInfo {\n exists: boolean;\n version: string | null;\n publishedAt: string | null;\n}\n\nasync function checkNpmPublic(name: string): Promise<PublicInfo> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const encoded = encodeURIComponent(name);\n const resp = await fetch(`https://registry.npmjs.org/${encoded}/latest`, {\n method: 'GET',\n signal: controller.signal,\n headers: { 'Accept': 'application/json' },\n });\n if (!resp.ok) return { exists: false, version: null, publishedAt: null };\n const data = await resp.json() as Record<string, unknown>;\n const version = (data['version'] as string) ?? null;\n // Fetch time info\n const full = await fetch(`https://registry.npmjs.org/${encoded}`, {\n headers: { 'Accept': 'application/json' },\n });\n let publishedAt: string | null = null;\n if (full.ok) {\n const fullData = await full.json() as Record<string, unknown>;\n const time = (fullData['time'] as Record<string, string>) ?? {};\n publishedAt = time['created'] ?? null;\n }\n return { exists: true, version, publishedAt };\n } catch {\n return { exists: false, version: null, publishedAt: null };\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function checkPypiPublic(name: string): Promise<PublicInfo> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const resp = await fetch(`https://pypi.org/pypi/${encodeURIComponent(name)}/json`, {\n signal: controller.signal,\n headers: { 'Accept': 'application/json' },\n });\n if (!resp.ok) return { exists: false, version: null, publishedAt: null };\n const data = await resp.json() as Record<string, unknown>;\n const info = data['info'] as Record<string, unknown>;\n const version = (info['version'] as string) ?? null;\n return { exists: true, version, publishedAt: null };\n } catch {\n return { exists: false, version: null, publishedAt: null };\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function checkPublicRegistry(ecosystem: string, name: string): Promise<PublicInfo> {\n const eco = ecosystem.toLowerCase();\n switch (eco) {\n case 'npm': return checkNpmPublic(name);\n case 'pypi':\n case 'pip': return checkPypiPublic(name);\n default:\n // For other ecosystems, we do not have a reliable public lookup\n return { exists: false, version: null, publishedAt: null };\n }\n}\n\n// \u2500\u2500 Internal package detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface InternalIndicator {\n isInternal: boolean;\n source: string;\n}\n\nfunction detectInternal(\n packageName: string,\n sourceManifests: string[],\n declaredConstraint: string,\n): InternalIndicator {\n // Local file references\n if (declaredConstraint.startsWith('file:') || declaredConstraint.startsWith('./') || declaredConstraint.startsWith('../')) {\n return { isInternal: true, source: 'local path' };\n }\n if (declaredConstraint.startsWith('git+') || declaredConstraint.startsWith('git://')) {\n return { isInternal: true, source: 'git dependency' };\n }\n\n // Manifest path hints (e.g. a private registry URL)\n for (const manifest of sourceManifests) {\n if (manifest.includes('.kirograph/local') || manifest.includes('local/')) {\n return { isInternal: true, source: 'local registry' };\n }\n }\n\n // Scoped packages with company-like scope names (heuristic)\n // e.g. @mycompany/foo \u2014 not @types, @babel, @jest, etc.\n const wellKnownScopes = new Set([\n '@types', '@babel', '@jest', '@testing-library', '@angular', '@vue',\n '@react', '@emotion', '@mui', '@chakra-ui', '@tailwindcss', '@storybook',\n '@vitejs', '@rollup', '@esbuild', '@swc', '@aws-sdk', '@google-cloud',\n ]);\n\n if (packageName.startsWith('@')) {\n const scope = packageName.split('/')[0]!;\n if (!wellKnownScopes.has(scope)) {\n return { isInternal: true, source: `private scope ${scope}` };\n }\n }\n\n return { isInternal: false, source: 'public registry' };\n}\n\n// \u2500\u2500 DepConfusionChecker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nexport class DepConfusionChecker {\n constructor(private readonly db: GraphDatabase) {}\n\n async check(): Promise<DepConfusionFinding[]> {\n const rawDb = this.db.getRawDb();\n const rows: Array<{\n node_id: string;\n package_name: string;\n ecosystem: string;\n declared_constraint: string;\n source_manifests: string;\n scope: string;\n }> = rawDb.all(\n `SELECT node_id, package_name, ecosystem, declared_constraint, source_manifests, scope\n FROM sec_dependencies\n WHERE scope = 'production'`,\n );\n\n const findings: DepConfusionFinding[] = [];\n const seen = new Set<string>();\n\n for (const row of rows) {\n const key = `${row.ecosystem}:${row.package_name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n let manifests: string[] = [];\n try {\n manifests = JSON.parse(row.source_manifests) as string[];\n } catch {\n // ignore malformed JSON\n }\n\n // \u2500\u2500 1. Internal package confusion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 const { isInternal, source } = detectInternal(\n row.package_name,\n manifests,\n row.declared_constraint,\n );\n\n if (isInternal) {\n let publicInfo: PublicInfo = { exists: false, version: null, publishedAt: null };\n try {\n // For scoped packages, also check the unscoped name\n let nameToCheck = row.package_name;\n if (nameToCheck.startsWith('@')) {\n nameToCheck = nameToCheck.split('/')[1] ?? nameToCheck;\n }\n publicInfo = await checkPublicRegistry(row.ecosystem, nameToCheck);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logWarn(`[dep-confusion] Registry check failed for ${row.package_name}: ${msg}`);\n }\n\n if (publicInfo.exists) {\n findings.push({\n packageName: row.package_name,\n ecosystem: row.ecosystem,\n internalSource: source,\n publicExists: true,\n publicVersion: publicInfo.version,\n publicPublishedAt: publicInfo.publishedAt,\n riskLevel: 'critical',\n explanation:\n `Package \"${row.package_name}\" appears to be an internal dependency (${source}) ` +\n `but a public package with the same name exists in the ${row.ecosystem} registry ` +\n `(version ${publicInfo.version ?? 'unknown'}). This is a potential dependency confusion attack vector.`,\n });\n continue;\n }\n\n // Internal package without public counterpart \u2014 medium risk\n findings.push({\n packageName: row.package_name,\n ecosystem: row.ecosystem,\n internalSource: source,\n publicExists: false,\n publicVersion: null,\n publicPublishedAt: null,\n riskLevel: 'medium',\n explanation:\n `Package \"${row.package_name}\" appears to be an internal dependency (${source}). ` +\n `No public package found with the same name, but this should be monitored.`,\n });\n continue;\n }\n\n // \u2500\u2500 2. Typosquatting detection (npm only for now) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (row.ecosystem.toLowerCase() === 'npm') {\n const similar = isTyposquatCandidate(row.package_name, WELL_KNOWN_NPM);\n if (similar) {\n findings.push({\n packageName: row.package_name,\n ecosystem: row.ecosystem,\n internalSource: 'public registry',\n publicExists: true,\n publicVersion: null,\n publicPublishedAt: null,\n riskLevel: 'high',\n explanation:\n `Package \"${row.package_name}\" has a name very similar to the well-known package ` +\n `\"${similar}\" (Levenshtein distance \u2264 2). This may be a typosquatting attempt.`,\n });\n }\n }\n }\n\n return findings;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiroGraph-Sec Error Classes
|
|
3
|
+
*
|
|
4
|
+
* Security-specific error types extending the base KiroGraphError.
|
|
5
|
+
*/
|
|
6
|
+
import { KiroGraphError } from '../errors';
|
|
7
|
+
export declare class SecurityError extends KiroGraphError {
|
|
8
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
9
|
+
}
|
|
10
|
+
export declare class ManifestParseError extends KiroGraphError {
|
|
11
|
+
constructor(message: string, filePath: string, line?: number);
|
|
12
|
+
}
|
|
13
|
+
export declare class VulnDatabaseError extends KiroGraphError {
|
|
14
|
+
constructor(message: string, database: string, httpStatus?: number);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/security/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAI7D;AAED,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAInE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var errors_exports = {};
|
|
20
|
+
__export(errors_exports, {
|
|
21
|
+
ManifestParseError: () => ManifestParseError,
|
|
22
|
+
SecurityError: () => SecurityError,
|
|
23
|
+
VulnDatabaseError: () => VulnDatabaseError
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(errors_exports);
|
|
26
|
+
var import_errors = require("../errors");
|
|
27
|
+
class SecurityError extends import_errors.KiroGraphError {
|
|
28
|
+
constructor(message, context) {
|
|
29
|
+
super(message, "SECURITY_ERROR", context);
|
|
30
|
+
this.name = "SecurityError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
class ManifestParseError extends import_errors.KiroGraphError {
|
|
34
|
+
constructor(message, filePath, line) {
|
|
35
|
+
super(message, "MANIFEST_PARSE_ERROR", { filePath, line });
|
|
36
|
+
this.name = "ManifestParseError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
class VulnDatabaseError extends import_errors.KiroGraphError {
|
|
40
|
+
constructor(message, database, httpStatus) {
|
|
41
|
+
super(message, "VULN_DATABASE_ERROR", { database, httpStatus });
|
|
42
|
+
this.name = "VulnDatabaseError";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
46
|
+
0 && (module.exports = {
|
|
47
|
+
ManifestParseError,
|
|
48
|
+
SecurityError,
|
|
49
|
+
VulnDatabaseError
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/security/errors.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph-Sec Error Classes\n *\n * Security-specific error types extending the base KiroGraphError.\n */\n\nimport { KiroGraphError } from '../errors';\n\nexport class SecurityError extends KiroGraphError {\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, 'SECURITY_ERROR', context);\n this.name = 'SecurityError';\n }\n}\n\nexport class ManifestParseError extends KiroGraphError {\n constructor(message: string, filePath: string, line?: number) {\n super(message, 'MANIFEST_PARSE_ERROR', { filePath, line });\n this.name = 'ManifestParseError';\n }\n}\n\nexport class VulnDatabaseError extends KiroGraphError {\n constructor(message: string, database: string, httpStatus?: number) {\n super(message, 'VULN_DATABASE_ERROR', { database, httpStatus });\n this.name = 'VulnDatabaseError';\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,oBAA+B;AAExB,MAAM,sBAAsB,6BAAe;AAAA,EAChD,YAAY,SAAiB,SAAmC;AAC9D,UAAM,SAAS,kBAAkB,OAAO;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,2BAA2B,6BAAe;AAAA,EACrD,YAAY,SAAiB,UAAkB,MAAe;AAC5D,UAAM,SAAS,wBAAwB,EAAE,UAAU,KAAK,CAAC;AACzD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,0BAA0B,6BAAe;AAAA,EACpD,YAAY,SAAiB,UAAkB,YAAqB;AAClE,UAAM,SAAS,uBAAuB,EAAE,UAAU,WAAW,CAAC;AAC9D,SAAK,OAAO;AAAA,EACd;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix Suggestion Builder
|
|
3
|
+
*
|
|
4
|
+
* Generates ecosystem-appropriate upgrade commands for vulnerabilities
|
|
5
|
+
* that have a known fixed version. Reusable by CLI and MCP tools.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Build an ecosystem-appropriate fix suggestion command.
|
|
9
|
+
*
|
|
10
|
+
* @param ecosystem - The package ecosystem (npm, maven, go, pypi, cargo)
|
|
11
|
+
* @param packageName - The package name (for maven: groupId:artifactId)
|
|
12
|
+
* @param fixedVersion - The version that fixes the vulnerability
|
|
13
|
+
* @returns A formatted fix command string, or empty string if ecosystem is unknown
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildFixSuggestion(ecosystem: string, packageName: string, fixedVersion: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Format a fix suggestion line for display.
|
|
18
|
+
* Returns the formatted line with the 💡 prefix, or empty string if no fixed version.
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatFixSuggestion(ecosystem: string, packageName: string, fixedVersion: string | null | undefined): string;
|
|
21
|
+
//# sourceMappingURL=fix-suggestions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-suggestions.d.ts","sourceRoot":"","sources":["../../../src/security/export/fix-suggestions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAuBvG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAI3H"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var fix_suggestions_exports = {};
|
|
20
|
+
__export(fix_suggestions_exports, {
|
|
21
|
+
buildFixSuggestion: () => buildFixSuggestion,
|
|
22
|
+
formatFixSuggestion: () => formatFixSuggestion
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(fix_suggestions_exports);
|
|
25
|
+
function buildFixSuggestion(ecosystem, packageName, fixedVersion) {
|
|
26
|
+
switch (ecosystem.toLowerCase()) {
|
|
27
|
+
case "npm":
|
|
28
|
+
return `npm install ${packageName}@${fixedVersion}`;
|
|
29
|
+
case "maven": {
|
|
30
|
+
const parts = packageName.split(":");
|
|
31
|
+
if (parts.length === 2) {
|
|
32
|
+
return `Update ${parts[0]}:${parts[1]} to ${fixedVersion} in pom.xml`;
|
|
33
|
+
}
|
|
34
|
+
return `Update ${packageName} to ${fixedVersion} in pom.xml`;
|
|
35
|
+
}
|
|
36
|
+
case "go":
|
|
37
|
+
case "golang":
|
|
38
|
+
return `go get ${packageName}@v${fixedVersion}`;
|
|
39
|
+
case "pypi":
|
|
40
|
+
case "pip":
|
|
41
|
+
return `pip install ${packageName}==${fixedVersion}`;
|
|
42
|
+
case "cargo":
|
|
43
|
+
return `cargo update -p ${packageName} --precise ${fixedVersion}`;
|
|
44
|
+
default:
|
|
45
|
+
return `Upgrade ${packageName} to ${fixedVersion}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function formatFixSuggestion(ecosystem, packageName, fixedVersion) {
|
|
49
|
+
if (!fixedVersion) return "";
|
|
50
|
+
const command = buildFixSuggestion(ecosystem, packageName, fixedVersion);
|
|
51
|
+
return `\u{1F4A1} Fix: ${command}`;
|
|
52
|
+
}
|
|
53
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
54
|
+
0 && (module.exports = {
|
|
55
|
+
buildFixSuggestion,
|
|
56
|
+
formatFixSuggestion
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=fix-suggestions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/security/export/fix-suggestions.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Fix Suggestion Builder\n *\n * Generates ecosystem-appropriate upgrade commands for vulnerabilities\n * that have a known fixed version. Reusable by CLI and MCP tools.\n */\n\n/**\n * Build an ecosystem-appropriate fix suggestion command.\n *\n * @param ecosystem - The package ecosystem (npm, maven, go, pypi, cargo)\n * @param packageName - The package name (for maven: groupId:artifactId)\n * @param fixedVersion - The version that fixes the vulnerability\n * @returns A formatted fix command string, or empty string if ecosystem is unknown\n */\nexport function buildFixSuggestion(ecosystem: string, packageName: string, fixedVersion: string): string {\n switch (ecosystem.toLowerCase()) {\n case 'npm':\n return `npm install ${packageName}@${fixedVersion}`;\n case 'maven': {\n // Maven packageName is typically \"groupId:artifactId\"\n const parts = packageName.split(':');\n if (parts.length === 2) {\n return `Update ${parts[0]}:${parts[1]} to ${fixedVersion} in pom.xml`;\n }\n return `Update ${packageName} to ${fixedVersion} in pom.xml`;\n }\n case 'go':\n case 'golang':\n return `go get ${packageName}@v${fixedVersion}`;\n case 'pypi':\n case 'pip':\n return `pip install ${packageName}==${fixedVersion}`;\n case 'cargo':\n return `cargo update -p ${packageName} --precise ${fixedVersion}`;\n default:\n return `Upgrade ${packageName} to ${fixedVersion}`;\n }\n}\n\n/**\n * Format a fix suggestion line for display.\n * Returns the formatted line with the \uD83D\uDCA1 prefix, or empty string if no fixed version.\n */\nexport function formatFixSuggestion(ecosystem: string, packageName: string, fixedVersion: string | null | undefined): string {\n if (!fixedVersion) return '';\n const command = buildFixSuggestion(ecosystem, packageName, fixedVersion);\n return `\uD83D\uDCA1 Fix: ${command}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeO,SAAS,mBAAmB,WAAmB,aAAqB,cAA8B;AACvG,UAAQ,UAAU,YAAY,GAAG;AAAA,IAC/B,KAAK;AACH,aAAO,eAAe,WAAW,IAAI,YAAY;AAAA,IACnD,KAAK,SAAS;AAEZ,YAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO,UAAU,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,YAAY;AAAA,MAC1D;AACA,aAAO,UAAU,WAAW,OAAO,YAAY;AAAA,IACjD;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,WAAW,KAAK,YAAY;AAAA,IAC/C,KAAK;AAAA,IACL,KAAK;AACH,aAAO,eAAe,WAAW,KAAK,YAAY;AAAA,IACpD,KAAK;AACH,aAAO,mBAAmB,WAAW,cAAc,YAAY;AAAA,IACjE;AACE,aAAO,WAAW,WAAW,OAAO,YAAY;AAAA,EACpD;AACF;AAMO,SAAS,oBAAoB,WAAmB,aAAqB,cAAiD;AAC3H,MAAI,CAAC,aAAc,QAAO;AAC1B,QAAM,UAAU,mBAAmB,WAAW,aAAa,YAAY;AACvE,SAAO,kBAAW,OAAO;AAC3B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SBOMExporter — CycloneDX 1.5 SBOM Generation
|
|
3
|
+
*
|
|
4
|
+
* Generates a CycloneDX 1.5 JSON Software Bill of Materials from the
|
|
5
|
+
* Dependency_Graph stored in the KiroGraph database. Each Dependency_Node
|
|
6
|
+
* becomes a component of type "library" with purl, scope, and
|
|
7
|
+
* direct/transitive classification.
|
|
8
|
+
*
|
|
9
|
+
* Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7
|
|
10
|
+
*/
|
|
11
|
+
import type { GraphDatabase } from '../../db/database';
|
|
12
|
+
import type { CycloneDXSBOM } from '../types';
|
|
13
|
+
/**
|
|
14
|
+
* Generates CycloneDX 1.5 SBOM documents from the dependency graph.
|
|
15
|
+
*/
|
|
16
|
+
export declare class SBOMExporter {
|
|
17
|
+
private readonly db;
|
|
18
|
+
private readonly projectRoot;
|
|
19
|
+
constructor(db: GraphDatabase, projectRoot: string);
|
|
20
|
+
/**
|
|
21
|
+
* Generate a CycloneDX 1.5 SBOM object.
|
|
22
|
+
*/
|
|
23
|
+
export(): CycloneDXSBOM;
|
|
24
|
+
/**
|
|
25
|
+
* Export the SBOM as a pretty-printed JSON string.
|
|
26
|
+
*/
|
|
27
|
+
exportJSON(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Build CycloneDX metadata section.
|
|
30
|
+
*/
|
|
31
|
+
private buildMetadata;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sbom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbom.d.ts","sourceRoot":"","sources":["../../../src/security/export/sbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,aAAa,EAId,MAAM,UAAU,CAAC;AAiHlB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM;IAKlD;;OAEG;IACH,MAAM,IAAI,aAAa;IAsGvB;;OAEG;IACH,UAAU,IAAI,MAAM;IAKpB;;OAEG;IACH,OAAO,CAAC,aAAa;CA8BtB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
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 sbom_exports = {};
|
|
30
|
+
__export(sbom_exports, {
|
|
31
|
+
SBOMExporter: () => SBOMExporter
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(sbom_exports);
|
|
34
|
+
var fs = __toESM(require("fs"));
|
|
35
|
+
var path = __toESM(require("path"));
|
|
36
|
+
const ECOSYSTEM_PURL_MAP = {
|
|
37
|
+
npm: "npm",
|
|
38
|
+
maven: "maven",
|
|
39
|
+
go: "golang",
|
|
40
|
+
pypi: "pypi",
|
|
41
|
+
python: "pypi",
|
|
42
|
+
cargo: "cargo"
|
|
43
|
+
};
|
|
44
|
+
function buildPurl(ecosystem, name, version) {
|
|
45
|
+
const purlType = ECOSYSTEM_PURL_MAP[ecosystem] ?? ecosystem;
|
|
46
|
+
return `pkg:${purlType}/${name}@${version}`;
|
|
47
|
+
}
|
|
48
|
+
const TOOL_NAME = "kirograph-sec";
|
|
49
|
+
function getToolVersion() {
|
|
50
|
+
try {
|
|
51
|
+
let dir = __dirname;
|
|
52
|
+
for (let i = 0; i < 5; i++) {
|
|
53
|
+
const pkgPath = path.join(dir, "package.json");
|
|
54
|
+
if (fs.existsSync(pkgPath)) {
|
|
55
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
56
|
+
if (pkg.version) return pkg.version;
|
|
57
|
+
}
|
|
58
|
+
dir = path.dirname(dir);
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
return "0.1.0";
|
|
63
|
+
}
|
|
64
|
+
function getProjectName(projectRoot) {
|
|
65
|
+
try {
|
|
66
|
+
const pkgJsonPath = path.join(projectRoot, "package.json");
|
|
67
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
68
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
|
|
69
|
+
if (pkg.name) return pkg.name;
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const cargoPath = path.join(projectRoot, "Cargo.toml");
|
|
75
|
+
if (fs.existsSync(cargoPath)) {
|
|
76
|
+
const content = fs.readFileSync(cargoPath, "utf-8");
|
|
77
|
+
const match = content.match(/^\s*name\s*=\s*"([^"]+)"/m);
|
|
78
|
+
if (match) return match[1];
|
|
79
|
+
}
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const goModPath = path.join(projectRoot, "go.mod");
|
|
84
|
+
if (fs.existsSync(goModPath)) {
|
|
85
|
+
const content = fs.readFileSync(goModPath, "utf-8");
|
|
86
|
+
const match = content.match(/^module\s+(\S+)/m);
|
|
87
|
+
if (match) return match[1];
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const pomPath = path.join(projectRoot, "pom.xml");
|
|
93
|
+
if (fs.existsSync(pomPath)) {
|
|
94
|
+
const content = fs.readFileSync(pomPath, "utf-8");
|
|
95
|
+
const match = content.match(/<artifactId>([^<]+)<\/artifactId>/);
|
|
96
|
+
if (match) return match[1];
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
}
|
|
100
|
+
return path.basename(projectRoot);
|
|
101
|
+
}
|
|
102
|
+
class SBOMExporter {
|
|
103
|
+
constructor(db, projectRoot) {
|
|
104
|
+
this.db = db;
|
|
105
|
+
this.projectRoot = projectRoot;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate a CycloneDX 1.5 SBOM object.
|
|
109
|
+
*/
|
|
110
|
+
export() {
|
|
111
|
+
const rawDb = this.db.getRawDb();
|
|
112
|
+
const depRows = rawDb.all(
|
|
113
|
+
"SELECT node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests FROM sec_dependencies"
|
|
114
|
+
);
|
|
115
|
+
const directNodeIds = /* @__PURE__ */ new Set();
|
|
116
|
+
if (depRows.length > 0) {
|
|
117
|
+
const declaredInEdges = rawDb.all(
|
|
118
|
+
`SELECT source, target, kind FROM edges WHERE kind = 'declared_in'`
|
|
119
|
+
);
|
|
120
|
+
for (const edge of declaredInEdges) {
|
|
121
|
+
directNodeIds.add(edge.source);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const components = depRows.map((row) => {
|
|
125
|
+
const version = row.resolved_version ?? row.declared_constraint;
|
|
126
|
+
const purl = buildPurl(row.ecosystem, row.package_name, version);
|
|
127
|
+
const isDirect = directNodeIds.has(row.node_id);
|
|
128
|
+
const component = {
|
|
129
|
+
type: "library",
|
|
130
|
+
name: row.package_name,
|
|
131
|
+
version,
|
|
132
|
+
purl,
|
|
133
|
+
scope: isDirect ? "required" : "optional",
|
|
134
|
+
properties: [
|
|
135
|
+
{ name: "kirograph:classification", value: isDirect ? "direct" : "transitive" },
|
|
136
|
+
{ name: "kirograph:ecosystem", value: row.ecosystem }
|
|
137
|
+
]
|
|
138
|
+
};
|
|
139
|
+
return component;
|
|
140
|
+
});
|
|
141
|
+
const dependencies = [];
|
|
142
|
+
if (depRows.length > 0) {
|
|
143
|
+
const dependsOnEdges = rawDb.all(
|
|
144
|
+
`SELECT source, target, kind FROM edges WHERE kind = 'depends_on'`
|
|
145
|
+
);
|
|
146
|
+
const depNodeIds = new Set(depRows.map((r) => r.node_id));
|
|
147
|
+
const depsMap = /* @__PURE__ */ new Map();
|
|
148
|
+
for (const edge of dependsOnEdges) {
|
|
149
|
+
if (depNodeIds.has(edge.source) && depNodeIds.has(edge.target)) {
|
|
150
|
+
const existing = depsMap.get(edge.source);
|
|
151
|
+
if (existing) {
|
|
152
|
+
existing.push(edge.target);
|
|
153
|
+
} else {
|
|
154
|
+
depsMap.set(edge.source, [edge.target]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const row of depRows) {
|
|
159
|
+
const version = row.resolved_version ?? row.declared_constraint;
|
|
160
|
+
const ref = buildPurl(row.ecosystem, row.package_name, version);
|
|
161
|
+
const deps = depsMap.get(row.node_id);
|
|
162
|
+
const entry = { ref };
|
|
163
|
+
if (deps && deps.length > 0) {
|
|
164
|
+
entry.dependsOn = deps.map((targetId) => {
|
|
165
|
+
const targetRow = depRows.find((r) => r.node_id === targetId);
|
|
166
|
+
if (targetRow) {
|
|
167
|
+
const targetVersion = targetRow.resolved_version ?? targetRow.declared_constraint;
|
|
168
|
+
return buildPurl(targetRow.ecosystem, targetRow.package_name, targetVersion);
|
|
169
|
+
}
|
|
170
|
+
return targetId;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
dependencies.push(entry);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const metadata = this.buildMetadata();
|
|
177
|
+
const sbom = {
|
|
178
|
+
bomFormat: "CycloneDX",
|
|
179
|
+
specVersion: "1.5",
|
|
180
|
+
version: 1,
|
|
181
|
+
metadata,
|
|
182
|
+
components,
|
|
183
|
+
dependencies
|
|
184
|
+
};
|
|
185
|
+
return sbom;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Export the SBOM as a pretty-printed JSON string.
|
|
189
|
+
*/
|
|
190
|
+
exportJSON() {
|
|
191
|
+
const sbom = this.export();
|
|
192
|
+
return JSON.stringify(sbom, null, 2);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Build CycloneDX metadata section.
|
|
196
|
+
*/
|
|
197
|
+
buildMetadata() {
|
|
198
|
+
const toolVersion = getToolVersion();
|
|
199
|
+
const projectName = getProjectName(this.projectRoot);
|
|
200
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
201
|
+
const meta = {
|
|
202
|
+
toolName: TOOL_NAME,
|
|
203
|
+
toolVersion,
|
|
204
|
+
timestamp,
|
|
205
|
+
projectName
|
|
206
|
+
};
|
|
207
|
+
return {
|
|
208
|
+
timestamp: meta.timestamp,
|
|
209
|
+
tools: {
|
|
210
|
+
components: [
|
|
211
|
+
{
|
|
212
|
+
type: "application",
|
|
213
|
+
name: meta.toolName,
|
|
214
|
+
version: meta.toolVersion
|
|
215
|
+
}
|
|
216
|
+
]
|
|
217
|
+
},
|
|
218
|
+
component: {
|
|
219
|
+
type: "application",
|
|
220
|
+
name: meta.projectName,
|
|
221
|
+
version: ""
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
227
|
+
0 && (module.exports = {
|
|
228
|
+
SBOMExporter
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=sbom.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/security/export/sbom.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * SBOMExporter \u2014 CycloneDX 1.5 SBOM Generation\n *\n * Generates a CycloneDX 1.5 JSON Software Bill of Materials from the\n * Dependency_Graph stored in the KiroGraph database. Each Dependency_Node\n * becomes a component of type \"library\" with purl, scope, and\n * direct/transitive classification.\n *\n * Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7\n */\nimport type { GraphDatabase } from '../../db/database';\nimport type {\n CycloneDXSBOM,\n CycloneDXComponent,\n CycloneDXDependencyEntry,\n SBOMMetadata,\n} from '../types';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// \u2500\u2500 Ecosystem \u2192 purl type mapping \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 ECOSYSTEM_PURL_MAP: Record<string, string> = {\n npm: 'npm',\n maven: 'maven',\n go: 'golang',\n pypi: 'pypi',\n python: 'pypi',\n cargo: 'cargo',\n};\n\n/**\n * Build a Package URL (purl) for a dependency.\n * Format: pkg:<type>/<name>@<version>\n */\nfunction buildPurl(ecosystem: string, name: string, version: string): string {\n const purlType = ECOSYSTEM_PURL_MAP[ecosystem] ?? ecosystem;\n return `pkg:${purlType}/${name}@${version}`;\n}\n\n// \u2500\u2500 Metadata helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 TOOL_NAME = 'kirograph-sec';\n\n/**\n * Read the tool version from package.json, falling back to \"0.1.0\".\n */\nfunction getToolVersion(): string {\n try {\n // Walk up from this file to find the project root package.json\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.version) return pkg.version;\n }\n dir = path.dirname(dir);\n }\n } catch {\n // Ignore errors \u2014 fall back to default\n }\n return '0.1.0';\n}\n\n/**\n * Detect the project name from the root manifest file.\n * Checks package.json, Cargo.toml, go.mod, pom.xml in order.\n */\nfunction getProjectName(projectRoot: string): string {\n try {\n const pkgJsonPath = path.join(projectRoot, 'package.json');\n if (fs.existsSync(pkgJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name) return pkg.name;\n }\n } catch { /* ignore */ }\n\n try {\n const cargoPath = path.join(projectRoot, 'Cargo.toml');\n if (fs.existsSync(cargoPath)) {\n const content = fs.readFileSync(cargoPath, 'utf-8');\n const match = content.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n if (match) return match[1];\n }\n } catch { /* ignore */ }\n\n try {\n const goModPath = path.join(projectRoot, 'go.mod');\n if (fs.existsSync(goModPath)) {\n const content = fs.readFileSync(goModPath, 'utf-8');\n const match = content.match(/^module\\s+(\\S+)/m);\n if (match) return match[1];\n }\n } catch { /* ignore */ }\n\n try {\n const pomPath = path.join(projectRoot, 'pom.xml');\n if (fs.existsSync(pomPath)) {\n const content = fs.readFileSync(pomPath, 'utf-8');\n const match = content.match(/<artifactId>([^<]+)<\\/artifactId>/);\n if (match) return match[1];\n }\n } catch { /* ignore */ }\n\n // Fallback: use the directory name\n return path.basename(projectRoot);\n}\n\n// \u2500\u2500 Database row types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface SecDependencyRow {\n node_id: string;\n ecosystem: string;\n package_name: string;\n declared_constraint: string;\n resolved_version: string | null;\n scope: string;\n source_manifests: string;\n}\n\ninterface EdgeRow {\n source: string;\n target: string;\n kind: string;\n}\n\n// \u2500\u2500 SBOMExporter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Generates CycloneDX 1.5 SBOM documents from the dependency graph.\n */\nexport class SBOMExporter {\n private readonly db: GraphDatabase;\n private readonly projectRoot: string;\n\n constructor(db: GraphDatabase, projectRoot: string) {\n this.db = db;\n this.projectRoot = projectRoot;\n }\n\n /**\n * Generate a CycloneDX 1.5 SBOM object.\n */\n export(): CycloneDXSBOM {\n const rawDb = this.db.getRawDb();\n\n // Query all dependency nodes\n const depRows: SecDependencyRow[] = rawDb.all(\n 'SELECT node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests FROM sec_dependencies',\n );\n\n // Determine which dependencies are direct (have a declared_in edge)\n const directNodeIds = new Set<string>();\n if (depRows.length > 0) {\n const declaredInEdges: EdgeRow[] = rawDb.all(\n `SELECT source, target, kind FROM edges WHERE kind = 'declared_in'`,\n );\n for (const edge of declaredInEdges) {\n directNodeIds.add(edge.source);\n }\n }\n\n // Build components\n const components: CycloneDXComponent[] = depRows.map((row) => {\n const version = row.resolved_version ?? row.declared_constraint;\n const purl = buildPurl(row.ecosystem, row.package_name, version);\n const isDirect = directNodeIds.has(row.node_id);\n\n const component: CycloneDXComponent = {\n type: 'library',\n name: row.package_name,\n version,\n purl,\n scope: isDirect ? 'required' : 'optional',\n properties: [\n { name: 'kirograph:classification', value: isDirect ? 'direct' : 'transitive' },\n { name: 'kirograph:ecosystem', value: row.ecosystem },\n ],\n };\n\n return component;\n });\n\n // Build dependency relationships from depends_on edges\n const dependencies: CycloneDXDependencyEntry[] = [];\n\n if (depRows.length > 0) {\n const dependsOnEdges: EdgeRow[] = rawDb.all(\n `SELECT source, target, kind FROM edges WHERE kind = 'depends_on'`,\n );\n\n // Group depends_on edges by source\n const depNodeIds = new Set(depRows.map((r) => r.node_id));\n const depsMap = new Map<string, string[]>();\n\n for (const edge of dependsOnEdges) {\n // Only include edges where both source and target are dependency nodes\n if (depNodeIds.has(edge.source) && depNodeIds.has(edge.target)) {\n const existing = depsMap.get(edge.source);\n if (existing) {\n existing.push(edge.target);\n } else {\n depsMap.set(edge.source, [edge.target]);\n }\n }\n }\n\n // Create an entry for each dependency node\n for (const row of depRows) {\n const version = row.resolved_version ?? row.declared_constraint;\n const ref = buildPurl(row.ecosystem, row.package_name, version);\n const deps = depsMap.get(row.node_id);\n\n const entry: CycloneDXDependencyEntry = { ref };\n if (deps && deps.length > 0) {\n // Resolve target node_ids to purls\n entry.dependsOn = deps.map((targetId) => {\n const targetRow = depRows.find((r) => r.node_id === targetId);\n if (targetRow) {\n const targetVersion = targetRow.resolved_version ?? targetRow.declared_constraint;\n return buildPurl(targetRow.ecosystem, targetRow.package_name, targetVersion);\n }\n return targetId; // fallback to node_id if not found\n });\n }\n\n dependencies.push(entry);\n }\n }\n\n // Build metadata\n const metadata = this.buildMetadata();\n\n const sbom: CycloneDXSBOM = {\n bomFormat: 'CycloneDX',\n specVersion: '1.5',\n version: 1,\n metadata,\n components,\n dependencies,\n };\n\n return sbom;\n }\n\n /**\n * Export the SBOM as a pretty-printed JSON string.\n */\n exportJSON(): string {\n const sbom = this.export();\n return JSON.stringify(sbom, null, 2);\n }\n\n /**\n * Build CycloneDX metadata section.\n */\n private buildMetadata(): Record<string, unknown> {\n const toolVersion = getToolVersion();\n const projectName = getProjectName(this.projectRoot);\n const timestamp = new Date().toISOString();\n\n const meta: SBOMMetadata = {\n toolName: TOOL_NAME,\n toolVersion,\n timestamp,\n projectName,\n };\n\n return {\n timestamp: meta.timestamp,\n tools: {\n components: [\n {\n type: 'application',\n name: meta.toolName,\n version: meta.toolVersion,\n },\n ],\n },\n component: {\n type: 'application',\n name: meta.projectName,\n version: '',\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CycloneDX serialization utilities for Dependency_Nodes.
|
|
3
|
+
*
|
|
4
|
+
* Provides serialize/deserialize between DependencyRow (sec_dependencies table)
|
|
5
|
+
* and CycloneDX JSON component format, with partial failure resilience.
|
|
6
|
+
*
|
|
7
|
+
* Requirements: 8.2, 8.3, 8.4
|
|
8
|
+
*/
|
|
9
|
+
import type { CycloneDXComponent } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Represents a row from the sec_dependencies table.
|
|
12
|
+
*/
|
|
13
|
+
export interface DependencyRow {
|
|
14
|
+
node_id: string;
|
|
15
|
+
ecosystem: string;
|
|
16
|
+
package_name: string;
|
|
17
|
+
declared_constraint: string;
|
|
18
|
+
resolved_version: string | null;
|
|
19
|
+
scope: 'production' | 'development' | 'optional';
|
|
20
|
+
transitive_status: 'complete' | 'incomplete';
|
|
21
|
+
last_vuln_check: number | null;
|
|
22
|
+
vuln_data_stale: number;
|
|
23
|
+
vuln_data_stale_since: number | null;
|
|
24
|
+
source_manifests: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Error reported when a single node fails serialization/deserialization.
|
|
28
|
+
*/
|
|
29
|
+
export interface SerializationError {
|
|
30
|
+
name: string;
|
|
31
|
+
reason: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Converts a dependency database row to a CycloneDX component object.
|
|
35
|
+
* Stores the declared constraint in a `properties` array entry with
|
|
36
|
+
* name "kirograph:declaredConstraint".
|
|
37
|
+
*
|
|
38
|
+
* The purl format is: pkg:<ecosystem>/<name>@<version>
|
|
39
|
+
*/
|
|
40
|
+
export declare function serializeDependencyToComponent(dep: DependencyRow): CycloneDXComponent;
|
|
41
|
+
/**
|
|
42
|
+
* Converts a CycloneDX component back to a dependency row.
|
|
43
|
+
* Extracts the constraint from the properties array.
|
|
44
|
+
*/
|
|
45
|
+
export declare function deserializeComponentToDependency(component: CycloneDXComponent): DependencyRow;
|
|
46
|
+
/**
|
|
47
|
+
* Serializes all dependencies, collecting errors for any that fail
|
|
48
|
+
* without aborting the batch.
|
|
49
|
+
*/
|
|
50
|
+
export declare function serializeAll(deps: DependencyRow[]): {
|
|
51
|
+
components: CycloneDXComponent[];
|
|
52
|
+
errors: SerializationError[];
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Deserializes all components back to dependency rows,
|
|
56
|
+
* collecting errors for any that fail without aborting the batch.
|
|
57
|
+
*/
|
|
58
|
+
export declare function deserializeAll(components: CycloneDXComponent[]): {
|
|
59
|
+
deps: DependencyRow[];
|
|
60
|
+
errors: SerializationError[];
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=serialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../../src/security/export/serialization.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAInD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,YAAY,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,iBAAiB,EAAE,UAAU,GAAG,YAAY,CAAC;IAC7C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAsBD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,aAAa,GAAG,kBAAkB,CAgCrF;AAID;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,kBAAkB,GAAG,aAAa,CA+C7F;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG;IACnD,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAiBA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG;IAChE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAiBA"}
|