kirograph 0.19.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/README.md +10 -8
- package/dist/architecture/layers/dart.d.ts +10 -0
- package/dist/architecture/layers/dart.d.ts.map +1 -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/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/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 +7 -0
- package/dist/bin/commands/attack-surface.js.map +2 -2
- package/dist/bin/commands/benchmark.d.ts +9 -0
- package/dist/bin/commands/benchmark.d.ts.map +1 -0
- package/dist/bin/commands/budget.d.ts +6 -0
- package/dist/bin/commands/budget.d.ts.map +1 -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/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/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/flows.d.ts +3 -0
- package/dist/bin/commands/flows.d.ts.map +1 -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 +20 -3
- 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 +3 -3
- 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/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/read.d.ts +6 -0
- package/dist/bin/commands/read.d.ts.map +1 -0
- package/dist/bin/commands/refactor.d.ts +3 -0
- package/dist/bin/commands/refactor.d.ts.map +1 -0
- package/dist/bin/commands/remediation.d.ts +3 -0
- package/dist/bin/commands/remediation.d.ts.map +1 -0
- package/dist/bin/commands/sbom.d.ts +3 -0
- package/dist/bin/commands/sbom.d.ts.map +1 -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-export.d.ts +2 -0
- package/dist/bin/commands/security-export.d.ts.map +1 -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-secrets.d.ts +3 -0
- package/dist/bin/commands/security-secrets.d.ts.map +1 -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 +15 -0
- package/dist/bin/commands/security.js.map +2 -2
- 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/status.d.ts.map +1 -1
- package/dist/bin/commands/status.js +27 -0
- 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/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/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/vuln-suppress.d.ts +3 -0
- package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
- package/dist/bin/commands/vulns.d.ts +3 -0
- package/dist/bin/commands/vulns.d.ts.map +1 -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/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 +6 -2
- 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 +2 -1
- 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 +74 -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/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 +38 -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 +15 -1
- 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 +81 -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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 -2
- 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.map +1 -1
- 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 +2 -2
- package/dist/bin/installer/targets/qoder.js.map +2 -2
- 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 +2 -2
- package/dist/bin/installer/targets/qwen.js.map +2 -2
- 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 +3 -3
- 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 +2 -2
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +3 -1
- 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/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 +55 -1
- 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 +42 -0
- 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 +19 -0
- package/dist/db/database.js.map +2 -2
- package/dist/db/patterns-schema.sql +23 -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/grammars.d.ts +6 -0
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/languages.d.ts.map +1 -1
- package/dist/extraction/notebook.d.ts +14 -0
- package/dist/extraction/notebook.d.ts.map +1 -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/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/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/flows.d.ts +55 -0
- package/dist/graph/flows.d.ts.map +1 -0
- package/dist/graph/refactor.d.ts +43 -0
- package/dist/graph/refactor.d.ts.map +1 -0
- package/dist/index.d.ts +36 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/mcp/cache.d.ts +69 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/read-modes.d.ts +31 -0
- package/dist/mcp/read-modes.d.ts.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -2
- 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 +4 -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 +397 -0
- package/dist/mcp/tools.js.map +2 -2
- 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 +38 -0
- 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/expo-modules.d.ts +10 -0
- package/dist/resolution/bridges/expo-modules.d.ts.map +1 -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/index.d.ts +40 -0
- package/dist/resolution/bridges/index.d.ts.map +1 -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-views.d.ts +13 -0
- package/dist/resolution/bridges/native-views.d.ts.map +1 -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/swift-objc.d.ts +14 -0
- package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
- package/dist/resolution/bridges/turbomodules.d.ts +10 -0
- package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
- package/dist/resolution/index.d.ts +28 -3
- package/dist/resolution/index.d.ts.map +1 -1
- 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 +43 -1
- package/dist/security/attack-surface.js.map +2 -2
- package/dist/security/context-warnings.d.ts +40 -0
- package/dist/security/context-warnings.d.ts.map +1 -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 +65 -7
- package/dist/security/data-flows.js.map +2 -2
- package/dist/security/dep-confusion.d.ts +23 -0
- package/dist/security/dep-confusion.d.ts.map +1 -0
- package/dist/security/errors.d.ts +16 -0
- package/dist/security/errors.d.ts.map +1 -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/sbom.d.ts +33 -0
- package/dist/security/export/sbom.d.ts.map +1 -0
- package/dist/security/export/serialization.d.ts +62 -0
- package/dist/security/export/serialization.d.ts.map +1 -0
- package/dist/security/export/vex.d.ts +58 -0
- package/dist/security/export/vex.d.ts.map +1 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/integrator.d.ts +63 -0
- package/dist/security/integrator.d.ts.map +1 -0
- package/dist/security/license.d.ts +33 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/manifest/adapter.d.ts +92 -0
- package/dist/security/manifest/adapter.d.ts.map +1 -0
- package/dist/security/manifest/parser.d.ts +73 -0
- package/dist/security/manifest/parser.d.ts.map +1 -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/composer.d.ts +11 -0
- package/dist/security/manifest/plugins/composer.d.ts.map +1 -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/gradle.d.ts +12 -0
- package/dist/security/manifest/plugins/gradle.d.ts.map +1 -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/maven.d.ts +11 -0
- package/dist/security/manifest/plugins/maven.d.ts.map +1 -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/nuget.d.ts +12 -0
- package/dist/security/manifest/plugins/nuget.d.ts.map +1 -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/pubspec.d.ts +11 -0
- package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -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/rubygems.d.ts +11 -0
- package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -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/owasp.d.ts +16 -0
- package/dist/security/owasp.d.ts.map +1 -0
- package/dist/security/pipeline.d.ts +37 -0
- package/dist/security/pipeline.d.ts.map +1 -0
- package/dist/security/reachability.d.ts +67 -0
- package/dist/security/reachability.d.ts.map +1 -0
- package/dist/security/remediation.d.ts +51 -0
- package/dist/security/remediation.d.ts.map +1 -0
- package/dist/security/secrets.d.ts +38 -0
- package/dist/security/secrets.d.ts.map +1 -0
- package/dist/security/staleness.d.ts +43 -0
- package/dist/security/staleness.d.ts.map +1 -0
- package/dist/security/supply-chain.d.ts +34 -0
- package/dist/security/supply-chain.d.ts.map +1 -0
- package/dist/security/suppressions.d.ts +18 -0
- package/dist/security/suppressions.d.ts.map +1 -0
- package/dist/security/types.d.ts +144 -0
- package/dist/security/types.d.ts.map +1 -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.map +2 -2
- 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/index.d.ts +6 -0
- package/dist/security/vuln/index.d.ts.map +1 -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/types.d.ts +29 -0
- package/dist/security/vuln/types.d.ts.map +1 -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 +1 -1
- 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 +5 -2
- package/dist/security/context-warnings.test.js +0 -300
- package/dist/security/context-warnings.test.js.map +0 -7
- package/dist/security/export/fix-suggestions.test.js +0 -74
- package/dist/security/export/fix-suggestions.test.js.map +0 -7
- package/dist/security/export/sbom.test.js +0 -288
- package/dist/security/export/sbom.test.js.map +0 -7
- package/dist/security/export/serialization.test.js +0 -310
- package/dist/security/export/serialization.test.js.map +0 -7
- package/dist/security/export/vex.test.js +0 -278
- package/dist/security/export/vex.test.js.map +0 -7
- package/dist/security/integrator-transitives.test.js +0 -359
- package/dist/security/integrator-transitives.test.js.map +0 -7
- package/dist/security/integrator.test.js +0 -237
- package/dist/security/integrator.test.js.map +0 -7
- package/dist/security/manifest/adapter.test.js +0 -272
- package/dist/security/manifest/adapter.test.js.map +0 -7
- package/dist/security/manifest/parser.test.js +0 -110
- package/dist/security/manifest/parser.test.js.map +0 -7
- package/dist/security/manifest/plugins/cargo.test.js +0 -304
- package/dist/security/manifest/plugins/cargo.test.js.map +0 -7
- package/dist/security/manifest/plugins/go.test.js +0 -341
- package/dist/security/manifest/plugins/go.test.js.map +0 -7
- package/dist/security/manifest/plugins/maven.test.js +0 -389
- package/dist/security/manifest/plugins/maven.test.js.map +0 -7
- package/dist/security/manifest/plugins/npm.test.js +0 -298
- package/dist/security/manifest/plugins/npm.test.js.map +0 -7
- package/dist/security/manifest/plugins/pip.test.js +0 -208
- package/dist/security/manifest/plugins/pip.test.js.map +0 -7
- package/dist/security/reachability.test.js +0 -394
- package/dist/security/reachability.test.js.map +0 -7
- package/dist/security/vuln/client.test.js +0 -288
- package/dist/security/vuln/client.test.js.map +0 -7
- package/dist/security/vuln/osv-adapter.test.js +0 -391
- package/dist/security/vuln/osv-adapter.test.js.map +0 -7
|
@@ -1,394 +0,0 @@
|
|
|
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 __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
-
for (let key of __getOwnPropNames(from))
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
-
}
|
|
14
|
-
return to;
|
|
15
|
-
};
|
|
16
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
-
mod
|
|
23
|
-
));
|
|
24
|
-
var import_vitest = require("vitest");
|
|
25
|
-
var fs = __toESM(require("fs"));
|
|
26
|
-
var path = __toESM(require("path"));
|
|
27
|
-
var os = __toESM(require("os"));
|
|
28
|
-
var import_reachability = require("./reachability");
|
|
29
|
-
var import_database = require("../db/database");
|
|
30
|
-
var import_config = require("../config");
|
|
31
|
-
(0, import_vitest.describe)("ReachabilityAnalyzer", () => {
|
|
32
|
-
let db;
|
|
33
|
-
let config;
|
|
34
|
-
let analyzer;
|
|
35
|
-
let tmpDir;
|
|
36
|
-
(0, import_vitest.beforeEach)(() => {
|
|
37
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "kirograph-reachability-test-"));
|
|
38
|
-
db = new import_database.GraphDatabase(tmpDir);
|
|
39
|
-
db.applySecuritySchema();
|
|
40
|
-
config = (0, import_config.createDefaultConfig)();
|
|
41
|
-
config.enableArchitecture = true;
|
|
42
|
-
config.enableSecurity = true;
|
|
43
|
-
analyzer = new import_reachability.ReachabilityAnalyzer(db, config);
|
|
44
|
-
});
|
|
45
|
-
(0, import_vitest.afterEach)(() => {
|
|
46
|
-
db.close();
|
|
47
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
48
|
-
});
|
|
49
|
-
function createNode(id, kind, opts) {
|
|
50
|
-
const node = {
|
|
51
|
-
id,
|
|
52
|
-
kind,
|
|
53
|
-
name: opts?.name ?? id,
|
|
54
|
-
qualifiedName: opts?.qualifiedName ?? id,
|
|
55
|
-
filePath: opts?.filePath ?? `src/${id}.ts`,
|
|
56
|
-
language: "typescript",
|
|
57
|
-
startLine: 0,
|
|
58
|
-
endLine: 0,
|
|
59
|
-
startColumn: 0,
|
|
60
|
-
endColumn: 0,
|
|
61
|
-
isExported: opts?.isExported ?? false,
|
|
62
|
-
updatedAt: Date.now()
|
|
63
|
-
};
|
|
64
|
-
db.upsertNode(node);
|
|
65
|
-
}
|
|
66
|
-
function createEdge(source, target, kind) {
|
|
67
|
-
db.insertEdge({ source, target, kind });
|
|
68
|
-
}
|
|
69
|
-
function createDependencyNode(name) {
|
|
70
|
-
const nodeId = `dep:npm:${name}`;
|
|
71
|
-
createNode(nodeId, "dependency", { name });
|
|
72
|
-
const rawDb = db.getRawDb();
|
|
73
|
-
rawDb.run(
|
|
74
|
-
`INSERT OR REPLACE INTO sec_dependencies
|
|
75
|
-
(node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)
|
|
76
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
77
|
-
[nodeId, "npm", name, "^1.0.0", "1.0.0", "production", '["package.json"]']
|
|
78
|
-
);
|
|
79
|
-
return nodeId;
|
|
80
|
-
}
|
|
81
|
-
function createVulnerabilityNode(cveId, depNodeId) {
|
|
82
|
-
const nodeId = `vuln:${cveId}`;
|
|
83
|
-
createNode(nodeId, "vulnerability", { name: cveId });
|
|
84
|
-
const rawDb = db.getRawDb();
|
|
85
|
-
rawDb.run(
|
|
86
|
-
`INSERT OR REPLACE INTO sec_vulnerabilities
|
|
87
|
-
(node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)
|
|
88
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
89
|
-
[nodeId, cveId, 7.5, "[]", "1.0.1", "Test vulnerability", "OSV"]
|
|
90
|
-
);
|
|
91
|
-
createEdge(depNodeId, nodeId, "has_vulnerability");
|
|
92
|
-
return nodeId;
|
|
93
|
-
}
|
|
94
|
-
function createEntryPoint(id, kind = "route") {
|
|
95
|
-
createNode(id, kind, { isExported: true });
|
|
96
|
-
}
|
|
97
|
-
function assignLayer(filePath, layerId) {
|
|
98
|
-
const rawDb = db.getRawDb();
|
|
99
|
-
rawDb.run(
|
|
100
|
-
`INSERT OR IGNORE INTO arch_layers (id, name, source, patterns, updated_at)
|
|
101
|
-
VALUES (?, ?, 'auto', '[]', ?)`,
|
|
102
|
-
[layerId, layerId, Date.now()]
|
|
103
|
-
);
|
|
104
|
-
rawDb.run(
|
|
105
|
-
`INSERT OR REPLACE INTO arch_file_layers (file_path, layer_id, confidence, matched_pattern)
|
|
106
|
-
VALUES (?, ?, 1.0, '**')`,
|
|
107
|
-
[filePath, layerId]
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
(0, import_vitest.describe)("analyze() - core reachability", () => {
|
|
111
|
-
(0, import_vitest.it)("should return affected when a path exists from entry point to dependency", async () => {
|
|
112
|
-
createEntryPoint("ep1");
|
|
113
|
-
createNode("mid1", "function");
|
|
114
|
-
const depId = createDependencyNode("vulnerable-pkg");
|
|
115
|
-
const vulnId = createVulnerabilityNode("CVE-2023-001", depId);
|
|
116
|
-
createEdge("ep1", "mid1", "calls");
|
|
117
|
-
createEdge("mid1", depId, "imports");
|
|
118
|
-
const result = await analyzer.analyze(vulnId);
|
|
119
|
-
(0, import_vitest.expect)(result.verdict).toBe("affected");
|
|
120
|
-
(0, import_vitest.expect)(result.paths.length).toBe(1);
|
|
121
|
-
(0, import_vitest.expect)(result.paths[0].entryPoint).toBe("ep1");
|
|
122
|
-
(0, import_vitest.expect)(result.paths[0].path).toEqual(["ep1", "mid1", depId]);
|
|
123
|
-
(0, import_vitest.expect)(result.reachingEntryPointCount).toBe(1);
|
|
124
|
-
});
|
|
125
|
-
(0, import_vitest.it)("should return not_affected when no path exists", async () => {
|
|
126
|
-
createEntryPoint("ep1");
|
|
127
|
-
createNode("mid1", "function");
|
|
128
|
-
const depId = createDependencyNode("isolated-pkg");
|
|
129
|
-
const vulnId = createVulnerabilityNode("CVE-2023-002", depId);
|
|
130
|
-
createEdge("ep1", "mid1", "calls");
|
|
131
|
-
const result = await analyzer.analyze(vulnId);
|
|
132
|
-
(0, import_vitest.expect)(result.verdict).toBe("not_affected");
|
|
133
|
-
(0, import_vitest.expect)(result.paths.length).toBe(0);
|
|
134
|
-
(0, import_vitest.expect)(result.reachingEntryPointCount).toBe(0);
|
|
135
|
-
});
|
|
136
|
-
(0, import_vitest.it)("should return under_investigation when unresolved imports are encountered", async () => {
|
|
137
|
-
createEntryPoint("ep1");
|
|
138
|
-
createNode("unresolved1", "import");
|
|
139
|
-
const depId = createDependencyNode("maybe-pkg");
|
|
140
|
-
const vulnId = createVulnerabilityNode("CVE-2023-003", depId);
|
|
141
|
-
createEdge("ep1", "unresolved1", "imports");
|
|
142
|
-
const result = await analyzer.analyze(vulnId);
|
|
143
|
-
(0, import_vitest.expect)(result.verdict).toBe("under_investigation");
|
|
144
|
-
(0, import_vitest.expect)(result.unresolvedSymbols).toContain("unresolved1");
|
|
145
|
-
(0, import_vitest.expect)(result.paths.length).toBe(0);
|
|
146
|
-
});
|
|
147
|
-
(0, import_vitest.it)("should handle cycles without infinite loops", async () => {
|
|
148
|
-
createEntryPoint("ep1");
|
|
149
|
-
createNode("nodeA", "function");
|
|
150
|
-
createNode("nodeB", "function");
|
|
151
|
-
const depId = createDependencyNode("unreachable-pkg");
|
|
152
|
-
const vulnId = createVulnerabilityNode("CVE-2023-004", depId);
|
|
153
|
-
createEdge("ep1", "nodeA", "calls");
|
|
154
|
-
createEdge("nodeA", "nodeB", "calls");
|
|
155
|
-
createEdge("nodeB", "nodeA", "calls");
|
|
156
|
-
const result = await analyzer.analyze(vulnId);
|
|
157
|
-
(0, import_vitest.expect)(result.verdict).toBe("not_affected");
|
|
158
|
-
(0, import_vitest.expect)(result.paths.length).toBe(0);
|
|
159
|
-
});
|
|
160
|
-
(0, import_vitest.it)("should visit each node at most once", async () => {
|
|
161
|
-
createEntryPoint("ep1");
|
|
162
|
-
createNode("nodeA", "function");
|
|
163
|
-
createNode("nodeB", "function");
|
|
164
|
-
const depId = createDependencyNode("shared-pkg");
|
|
165
|
-
const vulnId = createVulnerabilityNode("CVE-2023-005", depId);
|
|
166
|
-
createEdge("ep1", "nodeA", "calls");
|
|
167
|
-
createEdge("ep1", "nodeB", "calls");
|
|
168
|
-
createEdge("nodeA", depId, "imports");
|
|
169
|
-
createEdge("nodeB", "nodeA", "calls");
|
|
170
|
-
const result = await analyzer.analyze(vulnId);
|
|
171
|
-
(0, import_vitest.expect)(result.verdict).toBe("affected");
|
|
172
|
-
(0, import_vitest.expect)(result.paths[0].path).toEqual(["ep1", "nodeA", depId]);
|
|
173
|
-
});
|
|
174
|
-
(0, import_vitest.it)("should traverse calls, imports, and references edges", async () => {
|
|
175
|
-
createEntryPoint("ep1");
|
|
176
|
-
createNode("mid1", "function");
|
|
177
|
-
createNode("mid2", "class");
|
|
178
|
-
const depId = createDependencyNode("ref-pkg");
|
|
179
|
-
const vulnId = createVulnerabilityNode("CVE-2023-006", depId);
|
|
180
|
-
createEdge("ep1", "mid1", "calls");
|
|
181
|
-
createEdge("mid1", "mid2", "references");
|
|
182
|
-
createEdge("mid2", depId, "imports");
|
|
183
|
-
const result = await analyzer.analyze(vulnId);
|
|
184
|
-
(0, import_vitest.expect)(result.verdict).toBe("affected");
|
|
185
|
-
(0, import_vitest.expect)(result.paths[0].path).toEqual(["ep1", "mid1", "mid2", depId]);
|
|
186
|
-
});
|
|
187
|
-
(0, import_vitest.it)("should return under_investigation when no dependency is linked", async () => {
|
|
188
|
-
const vulnId = "vuln:CVE-2023-orphan";
|
|
189
|
-
createNode(vulnId, "vulnerability", { name: "CVE-2023-orphan" });
|
|
190
|
-
const rawDb = db.getRawDb();
|
|
191
|
-
rawDb.run(
|
|
192
|
-
`INSERT OR REPLACE INTO sec_vulnerabilities
|
|
193
|
-
(node_id, cve_id, severity_score, affected_ranges, summary, source_database)
|
|
194
|
-
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
195
|
-
[vulnId, "CVE-2023-orphan", 5, "[]", "Orphan vuln", "OSV"]
|
|
196
|
-
);
|
|
197
|
-
const result = await analyzer.analyze(vulnId);
|
|
198
|
-
(0, import_vitest.expect)(result.verdict).toBe("under_investigation");
|
|
199
|
-
});
|
|
200
|
-
(0, import_vitest.it)("should return not_affected when no entry points exist", async () => {
|
|
201
|
-
const depId = createDependencyNode("no-ep-pkg");
|
|
202
|
-
const vulnId = createVulnerabilityNode("CVE-2023-007", depId);
|
|
203
|
-
const result = await analyzer.analyze(vulnId);
|
|
204
|
-
(0, import_vitest.expect)(result.verdict).toBe("not_affected");
|
|
205
|
-
});
|
|
206
|
-
(0, import_vitest.it)("should limit unresolved symbols to 50", async () => {
|
|
207
|
-
createEntryPoint("ep1");
|
|
208
|
-
const depId = createDependencyNode("many-unresolved-pkg");
|
|
209
|
-
const vulnId = createVulnerabilityNode("CVE-2023-008", depId);
|
|
210
|
-
for (let i = 0; i < 60; i++) {
|
|
211
|
-
const importId = `unresolved-import-${i}`;
|
|
212
|
-
createNode(importId, "import");
|
|
213
|
-
createEdge("ep1", importId, "imports");
|
|
214
|
-
}
|
|
215
|
-
const result = await analyzer.analyze(vulnId);
|
|
216
|
-
(0, import_vitest.expect)(result.verdict).toBe("under_investigation");
|
|
217
|
-
(0, import_vitest.expect)(result.unresolvedSymbols.length).toBeLessThanOrEqual(50);
|
|
218
|
-
});
|
|
219
|
-
(0, import_vitest.it)("should store result in sec_reachability table", async () => {
|
|
220
|
-
createEntryPoint("ep1");
|
|
221
|
-
const depId = createDependencyNode("stored-pkg");
|
|
222
|
-
const vulnId = createVulnerabilityNode("CVE-2023-009", depId);
|
|
223
|
-
createEdge("ep1", depId, "imports");
|
|
224
|
-
await analyzer.analyze(vulnId);
|
|
225
|
-
const rawDb = db.getRawDb();
|
|
226
|
-
const row = rawDb.get(
|
|
227
|
-
`SELECT * FROM sec_reachability WHERE vulnerability_node_id = ?`,
|
|
228
|
-
[vulnId]
|
|
229
|
-
);
|
|
230
|
-
(0, import_vitest.expect)(row).not.toBeNull();
|
|
231
|
-
(0, import_vitest.expect)(row.verdict).toBe("affected");
|
|
232
|
-
(0, import_vitest.expect)(row.reaching_entry_point_count).toBe(1);
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
(0, import_vitest.describe)("analyze() - multi-entry-point paths", () => {
|
|
236
|
-
(0, import_vitest.it)("should record shortest path from each reaching entry point", async () => {
|
|
237
|
-
createEntryPoint("ep1");
|
|
238
|
-
createEntryPoint("ep2");
|
|
239
|
-
createNode("mid1", "function");
|
|
240
|
-
createNode("mid2", "function");
|
|
241
|
-
const depId = createDependencyNode("multi-ep-pkg");
|
|
242
|
-
const vulnId = createVulnerabilityNode("CVE-2023-010", depId);
|
|
243
|
-
createEdge("ep1", "mid1", "calls");
|
|
244
|
-
createEdge("mid1", depId, "imports");
|
|
245
|
-
createEdge("ep2", depId, "imports");
|
|
246
|
-
const result = await analyzer.analyze(vulnId);
|
|
247
|
-
(0, import_vitest.expect)(result.verdict).toBe("affected");
|
|
248
|
-
(0, import_vitest.expect)(result.reachingEntryPointCount).toBe(2);
|
|
249
|
-
(0, import_vitest.expect)(result.paths.length).toBe(2);
|
|
250
|
-
const ep1Path = result.paths.find((p) => p.entryPoint === "ep1");
|
|
251
|
-
const ep2Path = result.paths.find((p) => p.entryPoint === "ep2");
|
|
252
|
-
(0, import_vitest.expect)(ep1Path).toBeDefined();
|
|
253
|
-
(0, import_vitest.expect)(ep1Path.path).toEqual(["ep1", "mid1", depId]);
|
|
254
|
-
(0, import_vitest.expect)(ep2Path).toBeDefined();
|
|
255
|
-
(0, import_vitest.expect)(ep2Path.path).toEqual(["ep2", depId]);
|
|
256
|
-
});
|
|
257
|
-
(0, import_vitest.it)("should include total count of reaching entry points", async () => {
|
|
258
|
-
const depId = createDependencyNode("counted-pkg");
|
|
259
|
-
const vulnId = createVulnerabilityNode("CVE-2023-011", depId);
|
|
260
|
-
for (let i = 0; i < 5; i++) {
|
|
261
|
-
createEntryPoint(`ep${i}`);
|
|
262
|
-
if (i < 3) {
|
|
263
|
-
createEdge(`ep${i}`, depId, "imports");
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
const result = await analyzer.analyze(vulnId);
|
|
267
|
-
(0, import_vitest.expect)(result.verdict).toBe("affected");
|
|
268
|
-
(0, import_vitest.expect)(result.reachingEntryPointCount).toBe(3);
|
|
269
|
-
(0, import_vitest.expect)(result.paths.length).toBe(3);
|
|
270
|
-
});
|
|
271
|
-
(0, import_vitest.it)("should handle exported functions as entry points", async () => {
|
|
272
|
-
createEntryPoint("exported-fn", "function");
|
|
273
|
-
const depId = createDependencyNode("fn-ep-pkg");
|
|
274
|
-
const vulnId = createVulnerabilityNode("CVE-2023-012", depId);
|
|
275
|
-
createEdge("exported-fn", depId, "references");
|
|
276
|
-
const result = await analyzer.analyze(vulnId);
|
|
277
|
-
(0, import_vitest.expect)(result.verdict).toBe("affected");
|
|
278
|
-
(0, import_vitest.expect)(result.paths[0].entryPoint).toBe("exported-fn");
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
(0, import_vitest.describe)("getImpactSummary()", () => {
|
|
282
|
-
(0, import_vitest.it)("should return null for non-affected vulnerabilities", async () => {
|
|
283
|
-
createEntryPoint("ep1");
|
|
284
|
-
const depId = createDependencyNode("not-affected-pkg");
|
|
285
|
-
const vulnId = createVulnerabilityNode("CVE-2023-020", depId);
|
|
286
|
-
await analyzer.analyze(vulnId);
|
|
287
|
-
const summary = await analyzer.getImpactSummary(vulnId);
|
|
288
|
-
(0, import_vitest.expect)(summary).toBeNull();
|
|
289
|
-
});
|
|
290
|
-
(0, import_vitest.it)("should identify affected layers on reachable paths", async () => {
|
|
291
|
-
createEntryPoint("ep1");
|
|
292
|
-
createNode("mid1", "function", { filePath: "src/api/handler.ts" });
|
|
293
|
-
createNode("mid2", "function", { filePath: "src/service/logic.ts" });
|
|
294
|
-
const depId = createDependencyNode("layered-pkg");
|
|
295
|
-
const vulnId = createVulnerabilityNode("CVE-2023-021", depId);
|
|
296
|
-
createEdge("ep1", "mid1", "calls");
|
|
297
|
-
createEdge("mid1", "mid2", "calls");
|
|
298
|
-
createEdge("mid2", depId, "imports");
|
|
299
|
-
assignLayer("src/api/handler.ts", "api");
|
|
300
|
-
assignLayer("src/service/logic.ts", "service");
|
|
301
|
-
await analyzer.analyze(vulnId);
|
|
302
|
-
const summary = await analyzer.getImpactSummary(vulnId);
|
|
303
|
-
(0, import_vitest.expect)(summary).not.toBeNull();
|
|
304
|
-
(0, import_vitest.expect)(summary.affectedLayers).toContain("api");
|
|
305
|
-
(0, import_vitest.expect)(summary.affectedLayers).toContain("service");
|
|
306
|
-
});
|
|
307
|
-
(0, import_vitest.it)("should identify all affected entry points", async () => {
|
|
308
|
-
createEntryPoint("ep1");
|
|
309
|
-
createEntryPoint("ep2");
|
|
310
|
-
const depId = createDependencyNode("multi-ep-impact-pkg");
|
|
311
|
-
const vulnId = createVulnerabilityNode("CVE-2023-022", depId);
|
|
312
|
-
createEdge("ep1", depId, "imports");
|
|
313
|
-
createEdge("ep2", depId, "imports");
|
|
314
|
-
await analyzer.analyze(vulnId);
|
|
315
|
-
const summary = await analyzer.getImpactSummary(vulnId);
|
|
316
|
-
(0, import_vitest.expect)(summary).not.toBeNull();
|
|
317
|
-
(0, import_vitest.expect)(summary.affectedEntryPoints).toContain("ep1");
|
|
318
|
-
(0, import_vitest.expect)(summary.affectedEntryPoints).toContain("ep2");
|
|
319
|
-
});
|
|
320
|
-
(0, import_vitest.it)("should cap distinct path count at 100", async () => {
|
|
321
|
-
const depId = createDependencyNode("many-paths-pkg");
|
|
322
|
-
const vulnId = createVulnerabilityNode("CVE-2023-023", depId);
|
|
323
|
-
for (let i = 0; i < 110; i++) {
|
|
324
|
-
createEntryPoint(`ep${i}`);
|
|
325
|
-
createEdge(`ep${i}`, depId, "imports");
|
|
326
|
-
}
|
|
327
|
-
await analyzer.analyze(vulnId);
|
|
328
|
-
const summary = await analyzer.getImpactSummary(vulnId);
|
|
329
|
-
(0, import_vitest.expect)(summary).not.toBeNull();
|
|
330
|
-
(0, import_vitest.expect)(summary.distinctPathCount).toBeLessThanOrEqual(100);
|
|
331
|
-
});
|
|
332
|
-
(0, import_vitest.it)("should classify symbols with no assigned layer as unclassified", async () => {
|
|
333
|
-
createEntryPoint("ep1");
|
|
334
|
-
createNode("mid1", "function", { filePath: "src/unknown/file.ts" });
|
|
335
|
-
const depId = createDependencyNode("unclassified-pkg");
|
|
336
|
-
const vulnId = createVulnerabilityNode("CVE-2023-024", depId);
|
|
337
|
-
createEdge("ep1", "mid1", "calls");
|
|
338
|
-
createEdge("mid1", depId, "imports");
|
|
339
|
-
await analyzer.analyze(vulnId);
|
|
340
|
-
const summary = await analyzer.getImpactSummary(vulnId);
|
|
341
|
-
(0, import_vitest.expect)(summary).not.toBeNull();
|
|
342
|
-
(0, import_vitest.expect)(summary.affectedLayers).toContain("unclassified");
|
|
343
|
-
});
|
|
344
|
-
(0, import_vitest.it)("should omit layer classification when enableArchitecture is false", async () => {
|
|
345
|
-
config.enableArchitecture = false;
|
|
346
|
-
analyzer = new import_reachability.ReachabilityAnalyzer(db, config);
|
|
347
|
-
createEntryPoint("ep1");
|
|
348
|
-
createNode("mid1", "function", { filePath: "src/api/handler.ts" });
|
|
349
|
-
const depId = createDependencyNode("no-arch-pkg");
|
|
350
|
-
const vulnId = createVulnerabilityNode("CVE-2023-025", depId);
|
|
351
|
-
createEdge("ep1", "mid1", "calls");
|
|
352
|
-
createEdge("mid1", depId, "imports");
|
|
353
|
-
assignLayer("src/api/handler.ts", "api");
|
|
354
|
-
await analyzer.analyze(vulnId);
|
|
355
|
-
const summary = await analyzer.getImpactSummary(vulnId);
|
|
356
|
-
(0, import_vitest.expect)(summary).not.toBeNull();
|
|
357
|
-
(0, import_vitest.expect)(summary.affectedLayers).toEqual([]);
|
|
358
|
-
});
|
|
359
|
-
(0, import_vitest.it)("should store impact summary in sec_impact table", async () => {
|
|
360
|
-
createEntryPoint("ep1");
|
|
361
|
-
const depId = createDependencyNode("stored-impact-pkg");
|
|
362
|
-
const vulnId = createVulnerabilityNode("CVE-2023-026", depId);
|
|
363
|
-
createEdge("ep1", depId, "imports");
|
|
364
|
-
await analyzer.analyze(vulnId);
|
|
365
|
-
await analyzer.getImpactSummary(vulnId);
|
|
366
|
-
const rawDb = db.getRawDb();
|
|
367
|
-
const row = rawDb.get(
|
|
368
|
-
`SELECT * FROM sec_impact WHERE vulnerability_node_id = ?`,
|
|
369
|
-
[vulnId]
|
|
370
|
-
);
|
|
371
|
-
(0, import_vitest.expect)(row).not.toBeNull();
|
|
372
|
-
(0, import_vitest.expect)(row.distinct_path_count).toBeGreaterThan(0);
|
|
373
|
-
});
|
|
374
|
-
});
|
|
375
|
-
(0, import_vitest.describe)("analyzeAll()", () => {
|
|
376
|
-
(0, import_vitest.it)("should analyze all vulnerability nodes", async () => {
|
|
377
|
-
createEntryPoint("ep1");
|
|
378
|
-
const dep1 = createDependencyNode("pkg1");
|
|
379
|
-
const dep2 = createDependencyNode("pkg2");
|
|
380
|
-
const vuln1 = createVulnerabilityNode("CVE-2023-030", dep1);
|
|
381
|
-
const vuln2 = createVulnerabilityNode("CVE-2023-031", dep2);
|
|
382
|
-
createEdge("ep1", dep1, "imports");
|
|
383
|
-
const results = await analyzer.analyzeAll();
|
|
384
|
-
(0, import_vitest.expect)(results.size).toBe(2);
|
|
385
|
-
(0, import_vitest.expect)(results.get(vuln1).verdict).toBe("affected");
|
|
386
|
-
(0, import_vitest.expect)(results.get(vuln2).verdict).toBe("not_affected");
|
|
387
|
-
});
|
|
388
|
-
(0, import_vitest.it)("should return empty map when no vulnerabilities exist", async () => {
|
|
389
|
-
const results = await analyzer.analyzeAll();
|
|
390
|
-
(0, import_vitest.expect)(results.size).toBe(0);
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
//# sourceMappingURL=reachability.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/security/reachability.test.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Tests for ReachabilityAnalyzer\n *\n * Verifies BFS traversal, verdict assignment, multi-entry-point path recording,\n * and impact analysis with architecture context.\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4, 4.6, 5.1, 5.2, 5.3, 5.4, 5.5\n */\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { ReachabilityAnalyzer } from './reachability';\nimport { GraphDatabase } from '../db/database';\nimport { createDefaultConfig, type KiroGraphConfig } from '../config';\nimport type { Node, Edge } from '../types';\n\ndescribe('ReachabilityAnalyzer', () => {\n let db: GraphDatabase;\n let config: KiroGraphConfig;\n let analyzer: ReachabilityAnalyzer;\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kirograph-reachability-test-'));\n db = new GraphDatabase(tmpDir);\n db.applySecuritySchema();\n config = createDefaultConfig();\n config.enableArchitecture = true;\n config.enableSecurity = true;\n analyzer = new ReachabilityAnalyzer(db, config);\n });\n\n afterEach(() => {\n db.close();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n // \u2500\u2500 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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function createNode(id: string, kind: Node['kind'], opts?: Partial<Node>): void {\n const node: Node = {\n id,\n kind,\n name: opts?.name ?? id,\n qualifiedName: opts?.qualifiedName ?? id,\n filePath: opts?.filePath ?? `src/${id}.ts`,\n language: 'typescript',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n isExported: opts?.isExported ?? false,\n updatedAt: Date.now(),\n };\n db.upsertNode(node);\n }\n\n function createEdge(source: string, target: string, kind: Edge['kind']): void {\n db.insertEdge({ source, target, kind });\n }\n\n function createDependencyNode(name: string): string {\n const nodeId = `dep:npm:${name}`;\n createNode(nodeId, 'dependency', { name });\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT OR REPLACE INTO sec_dependencies\n (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [nodeId, 'npm', name, '^1.0.0', '1.0.0', 'production', '[\"package.json\"]'],\n );\n return nodeId;\n }\n\n function createVulnerabilityNode(cveId: string, depNodeId: string): string {\n const nodeId = `vuln:${cveId}`;\n createNode(nodeId, 'vulnerability', { name: cveId });\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [nodeId, cveId, 7.5, '[]', '1.0.1', 'Test vulnerability', 'OSV'],\n );\n // Create has_vulnerability edge: dependency \u2192 vulnerability\n createEdge(depNodeId, nodeId, 'has_vulnerability');\n return nodeId;\n }\n\n function createEntryPoint(id: string, kind: 'route' | 'function' = 'route'): void {\n createNode(id, kind, { isExported: true });\n }\n\n function assignLayer(filePath: string, layerId: string): void {\n const rawDb = db.getRawDb();\n // Ensure the layer exists in arch_layers (FK constraint)\n rawDb.run(\n `INSERT OR IGNORE INTO arch_layers (id, name, source, patterns, updated_at)\n VALUES (?, ?, 'auto', '[]', ?)`,\n [layerId, layerId, Date.now()],\n );\n rawDb.run(\n `INSERT OR REPLACE INTO arch_file_layers (file_path, layer_id, confidence, matched_pattern)\n VALUES (?, ?, 1.0, '**')`,\n [filePath, layerId],\n );\n }\n\n // \u2500\u2500 Tests: Core Reachability Traversal (Task 7.1) \u2500\u2500\u2500\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 describe('analyze() - core reachability', () => {\n it('should return affected when a path exists from entry point to dependency', async () => {\n // Graph: entryPoint \u2192 intermediate \u2192 dependency\n createEntryPoint('ep1');\n createNode('mid1', 'function');\n const depId = createDependencyNode('vulnerable-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-001', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.paths.length).toBe(1);\n expect(result.paths[0].entryPoint).toBe('ep1');\n expect(result.paths[0].path).toEqual(['ep1', 'mid1', depId]);\n expect(result.reachingEntryPointCount).toBe(1);\n });\n\n it('should return not_affected when no path exists', async () => {\n // Graph: entryPoint \u2192 mid1 (no connection to dep)\n createEntryPoint('ep1');\n createNode('mid1', 'function');\n const depId = createDependencyNode('isolated-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-002', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n // No edge from mid1 to depId\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('not_affected');\n expect(result.paths.length).toBe(0);\n expect(result.reachingEntryPointCount).toBe(0);\n });\n\n it('should return under_investigation when unresolved imports are encountered', async () => {\n // Graph: entryPoint \u2192 unresolvedImport (import node with no outgoing edges)\n createEntryPoint('ep1');\n createNode('unresolved1', 'import');\n const depId = createDependencyNode('maybe-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-003', depId);\n\n createEdge('ep1', 'unresolved1', 'imports');\n // unresolved1 has no outgoing edges \u2192 unresolved import\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('under_investigation');\n expect(result.unresolvedSymbols).toContain('unresolved1');\n expect(result.paths.length).toBe(0);\n });\n\n it('should handle cycles without infinite loops', async () => {\n // Graph: ep1 \u2192 A \u2192 B \u2192 A (cycle), no path to dep\n createEntryPoint('ep1');\n createNode('nodeA', 'function');\n createNode('nodeB', 'function');\n const depId = createDependencyNode('unreachable-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-004', depId);\n\n createEdge('ep1', 'nodeA', 'calls');\n createEdge('nodeA', 'nodeB', 'calls');\n createEdge('nodeB', 'nodeA', 'calls'); // cycle\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('not_affected');\n expect(result.paths.length).toBe(0);\n });\n\n it('should visit each node at most once', async () => {\n // Graph: ep1 \u2192 A \u2192 dep, ep1 \u2192 B \u2192 A \u2192 dep\n // A should only be visited once per BFS from ep1\n createEntryPoint('ep1');\n createNode('nodeA', 'function');\n createNode('nodeB', 'function');\n const depId = createDependencyNode('shared-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-005', depId);\n\n createEdge('ep1', 'nodeA', 'calls');\n createEdge('ep1', 'nodeB', 'calls');\n createEdge('nodeA', depId, 'imports');\n createEdge('nodeB', 'nodeA', 'calls');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n // Should find shortest path: ep1 \u2192 nodeA \u2192 dep\n expect(result.paths[0].path).toEqual(['ep1', 'nodeA', depId]);\n });\n\n it('should traverse calls, imports, and references edges', async () => {\n createEntryPoint('ep1');\n createNode('mid1', 'function');\n createNode('mid2', 'class');\n const depId = createDependencyNode('ref-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-006', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', 'mid2', 'references');\n createEdge('mid2', depId, 'imports');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.paths[0].path).toEqual(['ep1', 'mid1', 'mid2', depId]);\n });\n\n it('should return under_investigation when no dependency is linked', async () => {\n // Vulnerability with no has_vulnerability edge\n const vulnId = 'vuln:CVE-2023-orphan';\n createNode(vulnId, 'vulnerability', { name: 'CVE-2023-orphan' });\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, summary, source_database)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [vulnId, 'CVE-2023-orphan', 5.0, '[]', 'Orphan vuln', 'OSV'],\n );\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('under_investigation');\n });\n\n it('should return not_affected when no entry points exist', async () => {\n // No entry points in the graph\n const depId = createDependencyNode('no-ep-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-007', depId);\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('not_affected');\n });\n\n it('should limit unresolved symbols to 50', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('many-unresolved-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-008', depId);\n\n // Create 60 unresolved import nodes\n for (let i = 0; i < 60; i++) {\n const importId = `unresolved-import-${i}`;\n createNode(importId, 'import');\n createEdge('ep1', importId, 'imports');\n }\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('under_investigation');\n expect(result.unresolvedSymbols.length).toBeLessThanOrEqual(50);\n });\n\n it('should store result in sec_reachability table', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('stored-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-009', depId);\n createEdge('ep1', depId, 'imports');\n\n await analyzer.analyze(vulnId);\n\n const rawDb = db.getRawDb();\n const row = rawDb.get(\n `SELECT * FROM sec_reachability WHERE vulnerability_node_id = ?`,\n [vulnId],\n );\n expect(row).not.toBeNull();\n expect(row.verdict).toBe('affected');\n expect(row.reaching_entry_point_count).toBe(1);\n });\n });\n\n // \u2500\u2500 Tests: Multi-Entry-Point Path Recording (Task 7.2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe('analyze() - multi-entry-point paths', () => {\n it('should record shortest path from each reaching entry point', async () => {\n createEntryPoint('ep1');\n createEntryPoint('ep2');\n createNode('mid1', 'function');\n createNode('mid2', 'function');\n const depId = createDependencyNode('multi-ep-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-010', depId);\n\n // ep1 \u2192 mid1 \u2192 dep (length 3)\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n // ep2 \u2192 dep (length 2, shorter)\n createEdge('ep2', depId, 'imports');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.reachingEntryPointCount).toBe(2);\n expect(result.paths.length).toBe(2);\n\n const ep1Path = result.paths.find(p => p.entryPoint === 'ep1');\n const ep2Path = result.paths.find(p => p.entryPoint === 'ep2');\n\n expect(ep1Path).toBeDefined();\n expect(ep1Path!.path).toEqual(['ep1', 'mid1', depId]);\n\n expect(ep2Path).toBeDefined();\n expect(ep2Path!.path).toEqual(['ep2', depId]);\n });\n\n it('should include total count of reaching entry points', async () => {\n const depId = createDependencyNode('counted-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-011', depId);\n\n // Create 5 entry points, 3 of which reach the dep\n for (let i = 0; i < 5; i++) {\n createEntryPoint(`ep${i}`);\n if (i < 3) {\n createEdge(`ep${i}`, depId, 'imports');\n }\n }\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.reachingEntryPointCount).toBe(3);\n expect(result.paths.length).toBe(3);\n });\n\n it('should handle exported functions as entry points', async () => {\n createEntryPoint('exported-fn', 'function');\n const depId = createDependencyNode('fn-ep-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-012', depId);\n\n createEdge('exported-fn', depId, 'references');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.paths[0].entryPoint).toBe('exported-fn');\n });\n });\n\n // \u2500\u2500 Tests: Impact Analysis (Task 7.3) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 describe('getImpactSummary()', () => {\n it('should return null for non-affected vulnerabilities', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('not-affected-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-020', depId);\n // No path to dep \u2192 not_affected\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).toBeNull();\n });\n\n it('should identify affected layers on reachable paths', async () => {\n createEntryPoint('ep1');\n createNode('mid1', 'function', { filePath: 'src/api/handler.ts' });\n createNode('mid2', 'function', { filePath: 'src/service/logic.ts' });\n const depId = createDependencyNode('layered-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-021', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', 'mid2', 'calls');\n createEdge('mid2', depId, 'imports');\n\n // Assign layers\n assignLayer('src/api/handler.ts', 'api');\n assignLayer('src/service/logic.ts', 'service');\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.affectedLayers).toContain('api');\n expect(summary!.affectedLayers).toContain('service');\n });\n\n it('should identify all affected entry points', async () => {\n createEntryPoint('ep1');\n createEntryPoint('ep2');\n const depId = createDependencyNode('multi-ep-impact-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-022', depId);\n\n createEdge('ep1', depId, 'imports');\n createEdge('ep2', depId, 'imports');\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.affectedEntryPoints).toContain('ep1');\n expect(summary!.affectedEntryPoints).toContain('ep2');\n });\n\n it('should cap distinct path count at 100', async () => {\n const depId = createDependencyNode('many-paths-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-023', depId);\n\n // Create 110 entry points each with a direct path\n for (let i = 0; i < 110; i++) {\n createEntryPoint(`ep${i}`);\n createEdge(`ep${i}`, depId, 'imports');\n }\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.distinctPathCount).toBeLessThanOrEqual(100);\n });\n\n it('should classify symbols with no assigned layer as unclassified', async () => {\n createEntryPoint('ep1');\n createNode('mid1', 'function', { filePath: 'src/unknown/file.ts' });\n const depId = createDependencyNode('unclassified-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-024', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n // No layer assigned to src/unknown/file.ts\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.affectedLayers).toContain('unclassified');\n });\n\n it('should omit layer classification when enableArchitecture is false', async () => {\n config.enableArchitecture = false;\n analyzer = new ReachabilityAnalyzer(db, config);\n\n createEntryPoint('ep1');\n createNode('mid1', 'function', { filePath: 'src/api/handler.ts' });\n const depId = createDependencyNode('no-arch-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-025', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n assignLayer('src/api/handler.ts', 'api');\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n // When enableArchitecture is false, affectedLayers should be empty\n expect(summary!.affectedLayers).toEqual([]);\n });\n\n it('should store impact summary in sec_impact table', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('stored-impact-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-026', depId);\n createEdge('ep1', depId, 'imports');\n\n await analyzer.analyze(vulnId);\n await analyzer.getImpactSummary(vulnId);\n\n const rawDb = db.getRawDb();\n const row = rawDb.get(\n `SELECT * FROM sec_impact WHERE vulnerability_node_id = ?`,\n [vulnId],\n );\n expect(row).not.toBeNull();\n expect(row.distinct_path_count).toBeGreaterThan(0);\n });\n });\n\n // \u2500\u2500 Tests: analyzeAll() \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 describe('analyzeAll()', () => {\n it('should analyze all vulnerability nodes', async () => {\n createEntryPoint('ep1');\n const dep1 = createDependencyNode('pkg1');\n const dep2 = createDependencyNode('pkg2');\n const vuln1 = createVulnerabilityNode('CVE-2023-030', dep1);\n const vuln2 = createVulnerabilityNode('CVE-2023-031', dep2);\n\n createEdge('ep1', dep1, 'imports');\n // dep2 is not reachable\n\n const results = await analyzer.analyzeAll();\n\n expect(results.size).toBe(2);\n expect(results.get(vuln1)!.verdict).toBe('affected');\n expect(results.get(vuln2)!.verdict).toBe('not_affected');\n });\n\n it('should return empty map when no vulnerabilities exist', async () => {\n const results = await analyzer.analyzeAll();\n expect(results.size).toBe(0);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|