@oculum/scanner 1.0.10 → 1.0.12
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/dist/ai-context/index.d.ts +6 -0
- package/dist/ai-context/index.d.ts.map +1 -0
- package/dist/ai-context/index.js +13 -0
- package/dist/ai-context/index.js.map +1 -0
- package/dist/ai-context/manager.d.ts +67 -0
- package/dist/ai-context/manager.d.ts.map +1 -0
- package/dist/ai-context/manager.js +104 -0
- package/dist/ai-context/manager.js.map +1 -0
- package/dist/baseline/diff.d.ts +32 -0
- package/dist/baseline/diff.d.ts.map +1 -0
- package/dist/baseline/diff.js +119 -0
- package/dist/baseline/diff.js.map +1 -0
- package/dist/baseline/index.d.ts +9 -0
- package/dist/baseline/index.d.ts.map +1 -0
- package/dist/baseline/index.js +19 -0
- package/dist/baseline/index.js.map +1 -0
- package/dist/baseline/manager.d.ts +67 -0
- package/dist/baseline/manager.d.ts.map +1 -0
- package/dist/baseline/manager.js +180 -0
- package/dist/baseline/manager.js.map +1 -0
- package/dist/baseline/types.d.ts +91 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +12 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/category-filter.d.ts +125 -0
- package/dist/category-filter.d.ts.map +1 -0
- package/dist/category-filter.js +360 -0
- package/dist/category-filter.js.map +1 -0
- package/dist/filtering/context-adjustments.d.ts +23 -0
- package/dist/filtering/context-adjustments.d.ts.map +1 -0
- package/dist/filtering/context-adjustments.js +100 -0
- package/dist/filtering/context-adjustments.js.map +1 -0
- package/dist/filtering/index.d.ts +3 -0
- package/dist/filtering/index.d.ts.map +1 -0
- package/dist/filtering/index.js +8 -0
- package/dist/filtering/index.js.map +1 -0
- package/dist/filtering/pipeline.d.ts +48 -0
- package/dist/filtering/pipeline.d.ts.map +1 -0
- package/dist/filtering/pipeline.js +76 -0
- package/dist/filtering/pipeline.js.map +1 -0
- package/dist/formatters/ai-context.d.ts +23 -0
- package/dist/formatters/ai-context.d.ts.map +1 -0
- package/dist/formatters/ai-context.js +238 -0
- package/dist/formatters/ai-context.js.map +1 -0
- package/dist/formatters/cli-terminal.d.ts +38 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -1
- package/dist/formatters/cli-terminal.js +365 -42
- package/dist/formatters/cli-terminal.js.map +1 -1
- package/dist/formatters/github-comment.d.ts +2 -2
- package/dist/formatters/github-comment.d.ts.map +1 -1
- package/dist/formatters/github-comment.js +77 -13
- package/dist/formatters/github-comment.js.map +1 -1
- package/dist/formatters/ide/claude-code.d.ts +17 -0
- package/dist/formatters/ide/claude-code.d.ts.map +1 -0
- package/dist/formatters/ide/claude-code.js +94 -0
- package/dist/formatters/ide/claude-code.js.map +1 -0
- package/dist/formatters/ide/cursor.d.ts +13 -0
- package/dist/formatters/ide/cursor.d.ts.map +1 -0
- package/dist/formatters/ide/cursor.js +125 -0
- package/dist/formatters/ide/cursor.js.map +1 -0
- package/dist/formatters/ide/index.d.ts +62 -0
- package/dist/formatters/ide/index.d.ts.map +1 -0
- package/dist/formatters/ide/index.js +184 -0
- package/dist/formatters/ide/index.js.map +1 -0
- package/dist/formatters/ide/windsurf.d.ts +13 -0
- package/dist/formatters/ide/windsurf.d.ts.map +1 -0
- package/dist/formatters/ide/windsurf.js +117 -0
- package/dist/formatters/ide/windsurf.js.map +1 -0
- package/dist/formatters/index.d.ts +3 -1
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +20 -1
- package/dist/formatters/index.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +423 -56
- package/dist/index.js.map +1 -1
- package/dist/layer1/comments.d.ts +4 -1
- package/dist/layer1/comments.d.ts.map +1 -1
- package/dist/layer1/comments.js +1 -1
- package/dist/layer1/comments.js.map +1 -1
- package/dist/layer1/config-audit.d.ts +4 -1
- package/dist/layer1/config-audit.d.ts.map +1 -1
- package/dist/layer1/config-audit.js +65 -14
- package/dist/layer1/config-audit.js.map +1 -1
- package/dist/layer1/config-mcp-audit.d.ts +23 -0
- package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
- package/dist/layer1/config-mcp-audit.js +239 -0
- package/dist/layer1/config-mcp-audit.js.map +1 -0
- package/dist/layer1/entropy.d.ts +4 -1
- package/dist/layer1/entropy.d.ts.map +1 -1
- package/dist/layer1/entropy.js +212 -1
- package/dist/layer1/entropy.js.map +1 -1
- package/dist/layer1/file-flags.d.ts +4 -1
- package/dist/layer1/file-flags.d.ts.map +1 -1
- package/dist/layer1/file-flags.js +12 -5
- package/dist/layer1/file-flags.js.map +1 -1
- package/dist/layer1/index.d.ts +1 -0
- package/dist/layer1/index.d.ts.map +1 -1
- package/dist/layer1/index.js +22 -19
- package/dist/layer1/index.js.map +1 -1
- package/dist/layer1/patterns.d.ts +4 -1
- package/dist/layer1/patterns.d.ts.map +1 -1
- package/dist/layer1/patterns.js +34 -4
- package/dist/layer1/patterns.js.map +1 -1
- package/dist/layer1/urls.d.ts +4 -1
- package/dist/layer1/urls.d.ts.map +1 -1
- package/dist/layer1/urls.js +162 -14
- package/dist/layer1/urls.js.map +1 -1
- package/dist/layer1/weak-crypto.d.ts +4 -1
- package/dist/layer1/weak-crypto.d.ts.map +1 -1
- package/dist/layer1/weak-crypto.js +144 -7
- package/dist/layer1/weak-crypto.js.map +1 -1
- package/dist/layer2/ai-agent-tools.d.ts +4 -1
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
- package/dist/layer2/ai-agent-tools.js +964 -2
- package/dist/layer2/ai-agent-tools.js.map +1 -1
- package/dist/layer2/ai-endpoint-protection.d.ts +2 -0
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
- package/dist/layer2/ai-endpoint-protection.js +18 -4
- package/dist/layer2/ai-endpoint-protection.js.map +1 -1
- package/dist/layer2/ai-execution-sinks.d.ts +4 -1
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
- package/dist/layer2/ai-execution-sinks.js +688 -29
- package/dist/layer2/ai-execution-sinks.js.map +1 -1
- package/dist/layer2/ai-fingerprinting.d.ts +4 -1
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
- package/dist/layer2/ai-fingerprinting.js +28 -32
- package/dist/layer2/ai-fingerprinting.js.map +1 -1
- package/dist/layer2/ai-mcp-security.d.ts +20 -0
- package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
- package/dist/layer2/ai-mcp-security.js +877 -0
- package/dist/layer2/ai-mcp-security.js.map +1 -0
- package/dist/layer2/ai-package-hallucination.d.ts +22 -0
- package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
- package/dist/layer2/ai-package-hallucination.js +828 -0
- package/dist/layer2/ai-package-hallucination.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts +4 -1
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
- package/dist/layer2/ai-prompt-hygiene.js +817 -17
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
- package/dist/layer2/ai-rag-safety.d.ts +4 -1
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
- package/dist/layer2/ai-rag-safety.js +454 -3
- package/dist/layer2/ai-rag-safety.js.map +1 -1
- package/dist/layer2/ai-schema-validation.d.ts +4 -1
- package/dist/layer2/ai-schema-validation.d.ts.map +1 -1
- package/dist/layer2/ai-schema-validation.js +2 -2
- package/dist/layer2/ai-schema-validation.js.map +1 -1
- package/dist/layer2/auth-antipatterns.d.ts +2 -0
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
- package/dist/layer2/auth-antipatterns.js +209 -20
- package/dist/layer2/auth-antipatterns.js.map +1 -1
- package/dist/layer2/byok-patterns.d.ts +4 -1
- package/dist/layer2/byok-patterns.d.ts.map +1 -1
- package/dist/layer2/byok-patterns.js +5 -2
- package/dist/layer2/byok-patterns.js.map +1 -1
- package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
- package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/child-process.js +74 -0
- package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
- package/dist/layer2/dangerous-functions/dom-xss.d.ts +34 -0
- package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/dom-xss.js +230 -0
- package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
- package/dist/layer2/dangerous-functions/index.d.ts +16 -0
- package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/index.js +1152 -0
- package/dist/layer2/dangerous-functions/index.js.map +1 -0
- package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
- package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/json-parse.js +319 -0
- package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
- package/dist/layer2/dangerous-functions/math-random.d.ts +111 -0
- package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/math-random.js +684 -0
- package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
- package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
- package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/patterns.js +163 -0
- package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
- package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/request-validation.js +119 -0
- package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +24 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.js +70 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/helpers.js +147 -0
- package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
- package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/index.js +23 -0
- package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.js +102 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts +4 -1
- package/dist/layer2/data-exposure.d.ts.map +1 -1
- package/dist/layer2/data-exposure.js +14 -38
- package/dist/layer2/data-exposure.js.map +1 -1
- package/dist/layer2/framework-checks.d.ts +4 -1
- package/dist/layer2/framework-checks.d.ts.map +1 -1
- package/dist/layer2/framework-checks.js +5 -2
- package/dist/layer2/framework-checks.js.map +1 -1
- package/dist/layer2/index.d.ts +12 -1
- package/dist/layer2/index.d.ts.map +1 -1
- package/dist/layer2/index.js +110 -45
- package/dist/layer2/index.js.map +1 -1
- package/dist/layer2/logic-gates.d.ts +4 -1
- package/dist/layer2/logic-gates.d.ts.map +1 -1
- package/dist/layer2/logic-gates.js +58 -20
- package/dist/layer2/logic-gates.js.map +1 -1
- package/dist/layer2/model-supply-chain.d.ts +23 -0
- package/dist/layer2/model-supply-chain.d.ts.map +1 -0
- package/dist/layer2/model-supply-chain.js +444 -0
- package/dist/layer2/model-supply-chain.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts +4 -1
- package/dist/layer2/risky-imports.d.ts.map +1 -1
- package/dist/layer2/risky-imports.js +6 -2
- package/dist/layer2/risky-imports.js.map +1 -1
- package/dist/layer2/variables.d.ts +4 -1
- package/dist/layer2/variables.d.ts.map +1 -1
- package/dist/layer2/variables.js +6 -2
- package/dist/layer2/variables.js.map +1 -1
- package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
- package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
- package/dist/layer3/anthropic/auto-dismiss.js +199 -0
- package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
- package/dist/layer3/anthropic/clients.d.ts +44 -0
- package/dist/layer3/anthropic/clients.d.ts.map +1 -0
- package/dist/layer3/anthropic/clients.js +81 -0
- package/dist/layer3/anthropic/clients.js.map +1 -0
- package/dist/layer3/anthropic/index.d.ts +41 -0
- package/dist/layer3/anthropic/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/index.js +141 -0
- package/dist/layer3/anthropic/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/index.js +14 -0
- package/dist/layer3/anthropic/prompts/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.js +421 -0
- package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
- package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
- package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/anthropic.js +266 -0
- package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
- package/dist/layer3/anthropic/providers/index.d.ts +8 -0
- package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/index.js +15 -0
- package/dist/layer3/anthropic/providers/index.js.map +1 -0
- package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
- package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/openai.js +340 -0
- package/dist/layer3/anthropic/providers/openai.js.map +1 -0
- package/dist/layer3/anthropic/request-builder.d.ts +20 -0
- package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
- package/dist/layer3/anthropic/request-builder.js +134 -0
- package/dist/layer3/anthropic/request-builder.js.map +1 -0
- package/dist/layer3/anthropic/types.d.ts +88 -0
- package/dist/layer3/anthropic/types.d.ts.map +1 -0
- package/dist/layer3/anthropic/types.js +38 -0
- package/dist/layer3/anthropic/types.js.map +1 -0
- package/dist/layer3/anthropic/utils/index.d.ts +9 -0
- package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/index.js +24 -0
- package/dist/layer3/anthropic/utils/index.js.map +1 -0
- package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
- package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
- package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
- package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
- package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/response-parser.js +285 -0
- package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
- package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
- package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/retry.js +62 -0
- package/dist/layer3/anthropic/utils/retry.js.map +1 -0
- package/dist/layer3/index.d.ts +1 -0
- package/dist/layer3/index.d.ts.map +1 -1
- package/dist/layer3/index.js +16 -6
- package/dist/layer3/index.js.map +1 -1
- package/dist/layer3/osv-check.d.ts +75 -0
- package/dist/layer3/osv-check.d.ts.map +1 -0
- package/dist/layer3/osv-check.js +308 -0
- package/dist/layer3/osv-check.js.map +1 -0
- package/dist/modes/incremental.js +1 -1
- package/dist/rules/framework-fixes.d.ts +48 -0
- package/dist/rules/framework-fixes.d.ts.map +1 -0
- package/dist/rules/framework-fixes.js +439 -0
- package/dist/rules/framework-fixes.js.map +1 -0
- package/dist/rules/index.d.ts +8 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +18 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/metadata.d.ts +43 -0
- package/dist/rules/metadata.d.ts.map +1 -0
- package/dist/rules/metadata.js +734 -0
- package/dist/rules/metadata.js.map +1 -0
- package/dist/suppression/config-loader.d.ts +74 -0
- package/dist/suppression/config-loader.d.ts.map +1 -0
- package/dist/suppression/config-loader.js +424 -0
- package/dist/suppression/config-loader.js.map +1 -0
- package/dist/suppression/hash.d.ts +48 -0
- package/dist/suppression/hash.d.ts.map +1 -0
- package/dist/suppression/hash.js +88 -0
- package/dist/suppression/hash.js.map +1 -0
- package/dist/suppression/index.d.ts +11 -0
- package/dist/suppression/index.d.ts.map +1 -0
- package/dist/suppression/index.js +39 -0
- package/dist/suppression/index.js.map +1 -0
- package/dist/suppression/inline-parser.d.ts +39 -0
- package/dist/suppression/inline-parser.d.ts.map +1 -0
- package/dist/suppression/inline-parser.js +218 -0
- package/dist/suppression/inline-parser.js.map +1 -0
- package/dist/suppression/manager.d.ts +94 -0
- package/dist/suppression/manager.d.ts.map +1 -0
- package/dist/suppression/manager.js +292 -0
- package/dist/suppression/manager.js.map +1 -0
- package/dist/suppression/types.d.ts +151 -0
- package/dist/suppression/types.d.ts.map +1 -0
- package/dist/suppression/types.js +28 -0
- package/dist/suppression/types.js.map +1 -0
- package/dist/tiers.d.ts +3 -3
- package/dist/tiers.d.ts.map +1 -1
- package/dist/tiers.js +34 -7
- package/dist/tiers.js.map +1 -1
- package/dist/types.d.ts +140 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/code-analysis.d.ts +39 -0
- package/dist/utils/code-analysis.d.ts.map +1 -0
- package/dist/utils/code-analysis.js +159 -0
- package/dist/utils/code-analysis.js.map +1 -0
- package/dist/utils/comment-analyzer.d.ts +38 -0
- package/dist/utils/comment-analyzer.d.ts.map +1 -0
- package/dist/utils/comment-analyzer.js +218 -0
- package/dist/utils/comment-analyzer.js.map +1 -0
- package/dist/utils/context-helpers.d.ts +112 -1
- package/dist/utils/context-helpers.d.ts.map +1 -1
- package/dist/utils/context-helpers.js +364 -11
- package/dist/utils/context-helpers.js.map +1 -1
- package/dist/utils/environment-context.d.ts +76 -0
- package/dist/utils/environment-context.d.ts.map +1 -0
- package/dist/utils/environment-context.js +271 -0
- package/dist/utils/environment-context.js.map +1 -0
- package/dist/utils/intent-detector.d.ts +66 -0
- package/dist/utils/intent-detector.d.ts.map +1 -0
- package/dist/utils/intent-detector.js +282 -0
- package/dist/utils/intent-detector.js.map +1 -0
- package/dist/utils/parsed-file.d.ts +51 -0
- package/dist/utils/parsed-file.d.ts.map +1 -0
- package/dist/utils/parsed-file.js +95 -0
- package/dist/utils/parsed-file.js.map +1 -0
- package/dist/utils/route-hierarchy.d.ts +50 -0
- package/dist/utils/route-hierarchy.d.ts.map +1 -0
- package/dist/utils/route-hierarchy.js +226 -0
- package/dist/utils/route-hierarchy.js.map +1 -0
- package/dist/utils/schema-semantics.d.ts +45 -0
- package/dist/utils/schema-semantics.d.ts.map +1 -0
- package/dist/utils/schema-semantics.js +193 -0
- package/dist/utils/schema-semantics.js.map +1 -0
- package/package.json +4 -2
- package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
- package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
- package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +30 -0
- package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
- package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
- package/src/__tests__/benchmark/fixtures/layer2/phase5-excessive-agency.ts +580 -0
- package/src/__tests__/benchmark/fixtures/layer2/sprint6-ai-enhancements.ts +515 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +9 -9
- package/src/__tests__/category-filter.test.ts +478 -0
- package/src/__tests__/regression/known-false-positives.test.ts +490 -0
- package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +762 -0
- package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +0 -9
- package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
- package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
- package/src/__tests__/validation/run-validation.ts +7 -7
- package/src/ai-context/__tests__/manager.test.ts +193 -0
- package/src/ai-context/index.ts +15 -0
- package/src/ai-context/manager.ts +145 -0
- package/src/baseline/__tests__/diff.test.ts +261 -0
- package/src/baseline/__tests__/manager.test.ts +225 -0
- package/src/baseline/diff.ts +135 -0
- package/src/baseline/index.ts +29 -0
- package/src/baseline/manager.ts +230 -0
- package/src/baseline/types.ts +97 -0
- package/src/category-filter.ts +400 -0
- package/src/filtering/__tests__/pipeline.test.ts +134 -0
- package/src/filtering/context-adjustments.ts +111 -0
- package/src/filtering/index.ts +10 -0
- package/src/filtering/pipeline.ts +130 -0
- package/src/formatters/__tests__/ai-context.test.ts +254 -0
- package/src/formatters/ai-context.ts +302 -0
- package/src/formatters/cli-terminal.ts +444 -41
- package/src/formatters/github-comment.ts +82 -14
- package/src/formatters/ide/__tests__/ide.test.ts +319 -0
- package/src/formatters/ide/claude-code.ts +110 -0
- package/src/formatters/ide/cursor.ts +147 -0
- package/src/formatters/ide/index.ts +216 -0
- package/src/formatters/ide/windsurf.ts +135 -0
- package/src/formatters/index.ts +28 -0
- package/src/index.ts +506 -45
- package/src/layer1/comments.ts +3 -1
- package/src/layer1/config-audit.ts +74 -14
- package/src/layer1/config-mcp-audit.ts +278 -0
- package/src/layer1/entropy.ts +234 -1
- package/src/layer1/file-flags.ts +17 -6
- package/src/layer1/index.ts +29 -23
- package/src/layer1/patterns.ts +42 -4
- package/src/layer1/urls.ts +188 -14
- package/src/layer1/weak-crypto.ts +168 -16
- package/src/layer2/ai-agent-tools.ts +1043 -2
- package/src/layer2/ai-endpoint-protection.ts +19 -4
- package/src/layer2/ai-execution-sinks.ts +755 -29
- package/src/layer2/ai-fingerprinting.ts +33 -33
- package/src/layer2/ai-mcp-security.ts +933 -0
- package/src/layer2/ai-package-hallucination.ts +940 -0
- package/src/layer2/ai-prompt-hygiene.ts +898 -17
- package/src/layer2/ai-rag-safety.ts +467 -5
- package/src/layer2/ai-schema-validation.ts +4 -2
- package/src/layer2/auth-antipatterns.ts +235 -20
- package/src/layer2/byok-patterns.ts +9 -3
- package/src/layer2/dangerous-functions/child-process.ts +98 -0
- package/src/layer2/dangerous-functions/dom-xss.ts +292 -0
- package/src/layer2/dangerous-functions/index.ts +1533 -0
- package/src/layer2/dangerous-functions/json-parse.ts +385 -0
- package/src/layer2/dangerous-functions/math-random.ts +789 -0
- package/src/layer2/dangerous-functions/patterns.ts +176 -0
- package/src/layer2/dangerous-functions/request-validation.ts +145 -0
- package/src/layer2/dangerous-functions/utils/control-flow.ts +35 -0
- package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
- package/src/layer2/dangerous-functions/utils/index.ts +25 -0
- package/src/layer2/dangerous-functions/utils/schema-validation.ts +106 -0
- package/src/layer2/data-exposure.ts +18 -39
- package/src/layer2/framework-checks.ts +9 -2
- package/src/layer2/index.ts +124 -43
- package/src/layer2/logic-gates.ts +64 -22
- package/src/layer2/model-supply-chain.ts +531 -0
- package/src/layer2/risky-imports.ts +9 -2
- package/src/layer2/variables.ts +9 -2
- package/src/layer3/__tests__/osv-check.test.ts +384 -0
- package/src/layer3/anthropic/auto-dismiss.ts +223 -0
- package/src/layer3/anthropic/clients.ts +84 -0
- package/src/layer3/anthropic/index.ts +170 -0
- package/src/layer3/anthropic/prompts/index.ts +14 -0
- package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
- package/src/layer3/anthropic/prompts/validation.ts +419 -0
- package/src/layer3/anthropic/providers/anthropic.ts +310 -0
- package/src/layer3/anthropic/providers/index.ts +8 -0
- package/src/layer3/anthropic/providers/openai.ts +384 -0
- package/src/layer3/anthropic/request-builder.ts +150 -0
- package/src/layer3/anthropic/types.ts +148 -0
- package/src/layer3/anthropic/utils/index.ts +26 -0
- package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
- package/src/layer3/anthropic/utils/response-parser.ts +322 -0
- package/src/layer3/anthropic/utils/retry.ts +75 -0
- package/src/layer3/index.ts +18 -5
- package/src/layer3/osv-check.ts +420 -0
- package/src/modes/incremental.ts +1 -1
- package/src/rules/__tests__/framework-fixes.test.ts +689 -0
- package/src/rules/__tests__/metadata.test.ts +218 -0
- package/src/rules/framework-fixes.ts +470 -0
- package/src/rules/index.ts +21 -0
- package/src/rules/metadata.ts +831 -0
- package/src/suppression/__tests__/config-loader.test.ts +382 -0
- package/src/suppression/__tests__/hash.test.ts +166 -0
- package/src/suppression/__tests__/inline-parser.test.ts +212 -0
- package/src/suppression/__tests__/manager.test.ts +415 -0
- package/src/suppression/config-loader.ts +462 -0
- package/src/suppression/hash.ts +95 -0
- package/src/suppression/index.ts +51 -0
- package/src/suppression/inline-parser.ts +273 -0
- package/src/suppression/manager.ts +379 -0
- package/src/suppression/types.ts +174 -0
- package/src/tiers.ts +45 -9
- package/src/types.ts +212 -8
- package/src/utils/__tests__/code-analysis.test.ts +165 -0
- package/src/utils/__tests__/parsed-file.test.ts +124 -0
- package/src/utils/code-analysis.ts +179 -0
- package/src/utils/comment-analyzer.ts +249 -0
- package/src/utils/context-helpers.ts +421 -11
- package/src/utils/environment-context.ts +304 -0
- package/src/utils/intent-detector.ts +318 -0
- package/src/utils/parsed-file.ts +103 -0
- package/src/utils/route-hierarchy.ts +250 -0
- package/src/utils/schema-semantics.ts +233 -0
- package/dist/layer2/dangerous-functions.d.ts +0 -7
- package/dist/layer2/dangerous-functions.d.ts.map +0 -1
- package/dist/layer2/dangerous-functions.js +0 -1701
- package/dist/layer2/dangerous-functions.js.map +0 -1
- package/dist/layer3/anthropic.d.ts +0 -87
- package/dist/layer3/anthropic.d.ts.map +0 -1
- package/dist/layer3/anthropic.js +0 -1948
- package/dist/layer3/anthropic.js.map +0 -1
- package/dist/layer3/openai.d.ts +0 -25
- package/dist/layer3/openai.d.ts.map +0 -1
- package/dist/layer3/openai.js +0 -238
- package/dist/layer3/openai.js.map +0 -1
- package/src/layer2/dangerous-functions.ts +0 -1940
- package/src/layer3/anthropic.ts +0 -2257
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/baseline/manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2BAAmF;AACnF,+BAAoC;AACpC,iDAA4C;AAG5C,mCAAwD;AACxD,8CAAwD;AAkCxD;;GAEG;AACH,SAAS,YAAY,CAAC,WAAmB;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,4BAAY,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;YACnE,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,WAAmB;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,4BAAY,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE;YACxE,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,OAAO;QACL,IAAI,EAAE,IAAA,yBAAkB,EAAC,IAAI,CAAC;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAa,eAAe;IAI1B,YAAY,OAAwC;QAClD,qDAAqD;QACrD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACxC,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,WAAW,EAAE,0BAAkB,CAAC,CAAA;IAChE,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QACzB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAA;YAEpD,mBAAmB;YACnB,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,iCAAiC,QAAQ,CAAC,OAAO,uBAAuB;iBAChF,CAAA;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,0CAA0C;iBAClD,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;aAC3F,CAAA;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CACV,UAAsB,EACtB,OAAqE;QAErE,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,WAAW,EAAE,kBAAU,CAAC,CAAA;YACpD,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3C,CAAC;YAED,+BAA+B;YAC/B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAChE,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAEhE,+CAA+C;YAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAElE,sBAAsB;YACtB,MAAM,QAAQ,GAAiB;gBAC7B,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM;gBACN,MAAM;gBACN,SAAS,EAAE,OAAO,EAAE,SAAS;gBAC7B,QAAQ;gBACR,KAAK,EAAE;oBACL,KAAK,EAAE,QAAQ,CAAC,MAAM;oBACtB,QAAQ,EAAE,UAAU,CAAC,cAAc,CAAC,QAAQ;oBAC5C,IAAI,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI;oBACpC,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC,MAAM;oBACxC,GAAG,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG;oBAClC,IAAI,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI;iBACrC;aACF,CAAA;YAED,gBAAgB;YAChB,IAAA,kBAAa,EAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAEnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAA;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,IAAI,CAAC,YAAY;gBACvB,KAAK,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;aAC1F,CAAA;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,OAAO,GAAG,IAAA,eAAU,EAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,IAAA,eAAU,EAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;aAC3F,CAAA;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAA,eAAU,EAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACtC,CAAC;CACF;AAzID,0CAyIC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline Types
|
|
3
|
+
* Types for baseline/diff mode functionality
|
|
4
|
+
*/
|
|
5
|
+
import type { VulnerabilityCategory, VulnerabilitySeverity, SeverityCounts, ScanDepth } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* A finding stored in the baseline
|
|
8
|
+
* Contains enough information to identify and display the finding
|
|
9
|
+
*/
|
|
10
|
+
export interface BaselineFinding {
|
|
11
|
+
/** Finding hash (from computeFindingHash) */
|
|
12
|
+
hash: string;
|
|
13
|
+
/** File path relative to project root */
|
|
14
|
+
filePath: string;
|
|
15
|
+
/** Line number in the file */
|
|
16
|
+
lineNumber: number;
|
|
17
|
+
/** Vulnerability category */
|
|
18
|
+
category: VulnerabilityCategory;
|
|
19
|
+
/** Severity level */
|
|
20
|
+
severity: VulnerabilitySeverity;
|
|
21
|
+
/** Finding title */
|
|
22
|
+
title: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Baseline data stored in .oculum/baseline.json
|
|
26
|
+
*/
|
|
27
|
+
export interface BaselineData {
|
|
28
|
+
/** Schema version for forward compatibility */
|
|
29
|
+
version: 1;
|
|
30
|
+
/** ISO 8601 timestamp when baseline was created */
|
|
31
|
+
createdAt: string;
|
|
32
|
+
/** Git commit SHA when baseline was created (optional) */
|
|
33
|
+
commit?: string;
|
|
34
|
+
/** Git branch name when baseline was created (optional) */
|
|
35
|
+
branch?: string;
|
|
36
|
+
/** Scan depth used when creating baseline */
|
|
37
|
+
scanDepth?: ScanDepth;
|
|
38
|
+
/** List of findings in the baseline */
|
|
39
|
+
findings: BaselineFinding[];
|
|
40
|
+
/** Summary statistics */
|
|
41
|
+
stats: {
|
|
42
|
+
total: number;
|
|
43
|
+
critical: number;
|
|
44
|
+
high: number;
|
|
45
|
+
medium: number;
|
|
46
|
+
low: number;
|
|
47
|
+
info: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Result of comparing current findings against baseline
|
|
52
|
+
*/
|
|
53
|
+
export interface DiffResult {
|
|
54
|
+
/** Findings in current scan but NOT in baseline (new issues) */
|
|
55
|
+
new: import('../types').Vulnerability[];
|
|
56
|
+
/** Findings in baseline but NOT in current scan (fixed issues) */
|
|
57
|
+
fixed: BaselineFinding[];
|
|
58
|
+
/** Findings in both current scan AND baseline (existing issues) */
|
|
59
|
+
existing: import('../types').Vulnerability[];
|
|
60
|
+
/** Summary statistics */
|
|
61
|
+
stats: {
|
|
62
|
+
newCount: number;
|
|
63
|
+
fixedCount: number;
|
|
64
|
+
existingCount: number;
|
|
65
|
+
newBySeverity: SeverityCounts;
|
|
66
|
+
fixedBySeverity: SeverityCounts;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Baseline diff metadata attached to ScanResult
|
|
71
|
+
* Only present when --new flag is used
|
|
72
|
+
*/
|
|
73
|
+
export interface BaselineDiff {
|
|
74
|
+
/** When the baseline was created */
|
|
75
|
+
baselineCreatedAt: string;
|
|
76
|
+
/** Git commit of the baseline (if available) */
|
|
77
|
+
baselineCommit?: string;
|
|
78
|
+
/** Number of new findings (not in baseline) */
|
|
79
|
+
newCount: number;
|
|
80
|
+
/** Number of fixed findings (in baseline, not in current) */
|
|
81
|
+
fixedCount: number;
|
|
82
|
+
/** Number of existing findings (in both) */
|
|
83
|
+
existingCount: number;
|
|
84
|
+
/** Details of fixed findings for display */
|
|
85
|
+
fixedFindings: BaselineFinding[];
|
|
86
|
+
}
|
|
87
|
+
/** Default baseline file path relative to project root */
|
|
88
|
+
export declare const BASELINE_FILE_PATH = ".oculum/baseline.json";
|
|
89
|
+
/** Directory for oculum files */
|
|
90
|
+
export declare const OCULUM_DIR = ".oculum";
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/baseline/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEvG;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,qBAAqB,CAAA;IAC/B,qBAAqB;IACrB,QAAQ,EAAE,qBAAqB,CAAA;IAC/B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,CAAC,CAAA;IACV,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,uCAAuC;IACvC,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,yBAAyB;IACzB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,GAAG,EAAE,OAAO,UAAU,EAAE,aAAa,EAAE,CAAA;IACvC,kEAAkE;IAClE,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,UAAU,EAAE,aAAa,EAAE,CAAA;IAC5C,yBAAyB;IACzB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,MAAM,CAAA;QACrB,aAAa,EAAE,cAAc,CAAA;QAC7B,eAAe,EAAE,cAAc,CAAA;KAChC,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,iBAAiB,EAAE,MAAM,CAAA;IACzB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAA;IACrB,4CAA4C;IAC5C,aAAa,EAAE,eAAe,EAAE,CAAA;CACjC;AAED,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,0BAA0B,CAAA;AAEzD,iCAAiC;AACjC,eAAO,MAAM,UAAU,YAAY,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Baseline Types
|
|
4
|
+
* Types for baseline/diff mode functionality
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.OCULUM_DIR = exports.BASELINE_FILE_PATH = void 0;
|
|
8
|
+
/** Default baseline file path relative to project root */
|
|
9
|
+
exports.BASELINE_FILE_PATH = '.oculum/baseline.json';
|
|
10
|
+
/** Directory for oculum files */
|
|
11
|
+
exports.OCULUM_DIR = '.oculum';
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/baseline/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAyFH,0DAA0D;AAC7C,QAAA,kBAAkB,GAAG,uBAAuB,CAAA;AAEzD,iCAAiC;AACpB,QAAA,UAAU,GAAG,SAAS,CAAA"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category-Based Filtering
|
|
3
|
+
*
|
|
4
|
+
* Enables CI to fail only on specific vulnerability categories,
|
|
5
|
+
* allowing gradual rollout (e.g., "only block prompt injection")
|
|
6
|
+
* and fine-grained control over which findings are blocking.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Fail only on AI-related and secret categories
|
|
10
|
+
* --fail-on-categories ai-*,secrets-*
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Combined with severity
|
|
14
|
+
* --fail-on high --fail-on-categories ai-*
|
|
15
|
+
* // Only fail on high+ AI findings
|
|
16
|
+
*/
|
|
17
|
+
import type { VulnerabilityCategory, Vulnerability, VulnerabilitySeverity } from './types';
|
|
18
|
+
/**
|
|
19
|
+
* Category group definitions for wildcard expansion
|
|
20
|
+
*
|
|
21
|
+
* These groups allow users to specify broad categories like "ai-*"
|
|
22
|
+
* which expand to all AI-related vulnerability categories.
|
|
23
|
+
*/
|
|
24
|
+
export declare const CATEGORY_GROUPS: Record<string, VulnerabilityCategory[]>;
|
|
25
|
+
/**
|
|
26
|
+
* All known valid category names for validation
|
|
27
|
+
*/
|
|
28
|
+
export declare const ALL_CATEGORIES: VulnerabilityCategory[];
|
|
29
|
+
/**
|
|
30
|
+
* Normalize category name for comparison
|
|
31
|
+
* - Converts to lowercase
|
|
32
|
+
* - Converts hyphens to underscores
|
|
33
|
+
* - Trims whitespace
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* normalizeCategory('SQL-Injection') // 'sql_injection'
|
|
37
|
+
* normalizeCategory('high_entropy_string') // 'high_entropy_string'
|
|
38
|
+
*/
|
|
39
|
+
export declare function normalizeCategory(category: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Expand a wildcard pattern or single category to a list of categories
|
|
42
|
+
*
|
|
43
|
+
* @param pattern - Category name or wildcard (e.g., 'sql_injection', 'ai-*')
|
|
44
|
+
* @returns Array of matching categories
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* expandCategoryPattern('ai-*') // Returns all ai_* categories
|
|
48
|
+
* expandCategoryPattern('sql_injection') // Returns ['sql_injection']
|
|
49
|
+
* expandCategoryPattern('unknown-*') // Returns []
|
|
50
|
+
*/
|
|
51
|
+
export declare function expandCategoryPattern(pattern: string): VulnerabilityCategory[];
|
|
52
|
+
/**
|
|
53
|
+
* Check if a category matches any pattern in the filter list
|
|
54
|
+
*
|
|
55
|
+
* @param category - The vulnerability category to check
|
|
56
|
+
* @param patterns - Array of category patterns (names or wildcards)
|
|
57
|
+
* @returns true if the category matches any pattern
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* matchesAnyCategory('ai_prompt_injection', ['ai-*']) // true
|
|
61
|
+
* matchesAnyCategory('sql_injection', ['ai-*']) // false
|
|
62
|
+
* matchesAnyCategory('sql_injection', ['sql_injection', 'xss']) // true
|
|
63
|
+
*/
|
|
64
|
+
export declare function matchesAnyCategory(category: VulnerabilityCategory, patterns: string[]): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Check if vulnerabilities should cause failure based on category filter
|
|
67
|
+
*
|
|
68
|
+
* When both category patterns and severity threshold are provided,
|
|
69
|
+
* BOTH conditions must match for a finding to cause failure.
|
|
70
|
+
*
|
|
71
|
+
* @param vulnerabilities - List of vulnerabilities to check
|
|
72
|
+
* @param categoryPatterns - Category patterns to filter on
|
|
73
|
+
* @param severityThreshold - Optional severity threshold (both must match)
|
|
74
|
+
* @returns true if any vulnerability matches and should cause failure
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* // Only fail on AI findings
|
|
78
|
+
* shouldFailOnCategories(vulns, ['ai-*'])
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* // Only fail on HIGH+ AI findings
|
|
82
|
+
* shouldFailOnCategories(vulns, ['ai-*'], 'high')
|
|
83
|
+
*/
|
|
84
|
+
export declare function shouldFailOnCategories(vulnerabilities: Vulnerability[], categoryPatterns: string[], severityThreshold?: VulnerabilitySeverity): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Get the categories that matched the filter from vulnerabilities
|
|
87
|
+
* Useful for error messages showing which categories caused failure
|
|
88
|
+
*/
|
|
89
|
+
export declare function getMatchingCategories(vulnerabilities: Vulnerability[], categoryPatterns: string[], severityThreshold?: VulnerabilitySeverity): VulnerabilityCategory[];
|
|
90
|
+
/**
|
|
91
|
+
* Parse comma-separated category string into array
|
|
92
|
+
*
|
|
93
|
+
* @param input - Comma-separated category string
|
|
94
|
+
* @returns Array of trimmed category patterns
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* parseCategoryList('ai-*, secrets-*') // ['ai-*', 'secrets-*']
|
|
98
|
+
* parseCategoryList('sql_injection, xss') // ['sql_injection', 'xss']
|
|
99
|
+
*/
|
|
100
|
+
export declare function parseCategoryList(input: string): string[];
|
|
101
|
+
/**
|
|
102
|
+
* Validate category names, separating valid from invalid
|
|
103
|
+
*
|
|
104
|
+
* @param categories - Array of category patterns to validate
|
|
105
|
+
* @returns Object with valid and invalid category arrays
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* validateCategories(['ai-*', 'sql_injection', 'fake_category'])
|
|
109
|
+
* // { valid: ['ai-*', 'sql_injection'], invalid: ['fake_category'] }
|
|
110
|
+
*/
|
|
111
|
+
export declare function validateCategories(categories: string[]): {
|
|
112
|
+
valid: string[];
|
|
113
|
+
invalid: string[];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Get a human-readable list of available category groups
|
|
117
|
+
* Useful for help text and error messages
|
|
118
|
+
*/
|
|
119
|
+
export declare function getAvailableCategoryGroups(): string[];
|
|
120
|
+
/**
|
|
121
|
+
* Get the count of categories in each group
|
|
122
|
+
* Useful for documentation and help text
|
|
123
|
+
*/
|
|
124
|
+
export declare function getCategoryGroupCounts(): Record<string, number>;
|
|
125
|
+
//# sourceMappingURL=category-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-filter.d.ts","sourceRoot":"","sources":["../src/category-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAG1F;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,CA6CnE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,qBAAqB,EA4CjD,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAgC9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAiBT;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,aAAa,EAAE,EAChC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,iBAAiB,CAAC,EAAE,qBAAqB,GACxC,OAAO,CA6BT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,aAAa,EAAE,EAChC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,iBAAiB,CAAC,EAAE,qBAAqB,GACxC,qBAAqB,EAAE,CAyBzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG;IACxD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CA4BA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/D"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Category-Based Filtering
|
|
4
|
+
*
|
|
5
|
+
* Enables CI to fail only on specific vulnerability categories,
|
|
6
|
+
* allowing gradual rollout (e.g., "only block prompt injection")
|
|
7
|
+
* and fine-grained control over which findings are blocking.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Fail only on AI-related and secret categories
|
|
11
|
+
* --fail-on-categories ai-*,secrets-*
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Combined with severity
|
|
15
|
+
* --fail-on high --fail-on-categories ai-*
|
|
16
|
+
* // Only fail on high+ AI findings
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.ALL_CATEGORIES = exports.CATEGORY_GROUPS = void 0;
|
|
20
|
+
exports.normalizeCategory = normalizeCategory;
|
|
21
|
+
exports.expandCategoryPattern = expandCategoryPattern;
|
|
22
|
+
exports.matchesAnyCategory = matchesAnyCategory;
|
|
23
|
+
exports.shouldFailOnCategories = shouldFailOnCategories;
|
|
24
|
+
exports.getMatchingCategories = getMatchingCategories;
|
|
25
|
+
exports.parseCategoryList = parseCategoryList;
|
|
26
|
+
exports.validateCategories = validateCategories;
|
|
27
|
+
exports.getAvailableCategoryGroups = getAvailableCategoryGroups;
|
|
28
|
+
exports.getCategoryGroupCounts = getCategoryGroupCounts;
|
|
29
|
+
const parsed_file_1 = require("./utils/parsed-file");
|
|
30
|
+
/**
|
|
31
|
+
* Category group definitions for wildcard expansion
|
|
32
|
+
*
|
|
33
|
+
* These groups allow users to specify broad categories like "ai-*"
|
|
34
|
+
* which expand to all AI-related vulnerability categories.
|
|
35
|
+
*/
|
|
36
|
+
exports.CATEGORY_GROUPS = {
|
|
37
|
+
'ai-*': [
|
|
38
|
+
'ai_pattern',
|
|
39
|
+
'ai_prompt_injection',
|
|
40
|
+
'ai_unsafe_execution',
|
|
41
|
+
'ai_overpermissive_tool',
|
|
42
|
+
'ai_rag_exfiltration',
|
|
43
|
+
'ai_endpoint_unprotected',
|
|
44
|
+
'ai_schema_mismatch',
|
|
45
|
+
'ai_package_hallucination',
|
|
46
|
+
'ai_rag_corpus_poisoning',
|
|
47
|
+
'ai_rag_pii_leakage',
|
|
48
|
+
'ai_mcp_tool_poisoning',
|
|
49
|
+
'ai_mcp_credential_issue',
|
|
50
|
+
'ai_mcp_confused_deputy',
|
|
51
|
+
'ai_mcp_description_injection',
|
|
52
|
+
'ai_mcp_server_shadowing',
|
|
53
|
+
'ai_mcp_config_secrets',
|
|
54
|
+
'ai_mcp_config_permissions',
|
|
55
|
+
'ai_rag_query_injection',
|
|
56
|
+
'ai_rag_embedding_poisoning',
|
|
57
|
+
'ai_rag_chunk_injection',
|
|
58
|
+
'ai_package_typosquat',
|
|
59
|
+
'ai_package_malicious',
|
|
60
|
+
'ai_unsafe_model_load',
|
|
61
|
+
'ai_unverified_model',
|
|
62
|
+
'ai_unsafe_finetuning',
|
|
63
|
+
'ai_excessive_agency',
|
|
64
|
+
],
|
|
65
|
+
'secrets-*': [
|
|
66
|
+
'hardcoded_secret',
|
|
67
|
+
'high_entropy_string',
|
|
68
|
+
'sensitive_variable',
|
|
69
|
+
],
|
|
70
|
+
'owasp-*': [
|
|
71
|
+
'sql_injection',
|
|
72
|
+
'xss',
|
|
73
|
+
'command_injection',
|
|
74
|
+
'missing_auth',
|
|
75
|
+
'security_bypass',
|
|
76
|
+
'insecure_config',
|
|
77
|
+
'cors_misconfiguration',
|
|
78
|
+
'data_exposure',
|
|
79
|
+
'weak_crypto',
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* All known valid category names for validation
|
|
84
|
+
*/
|
|
85
|
+
exports.ALL_CATEGORIES = [
|
|
86
|
+
'hardcoded_secret',
|
|
87
|
+
'high_entropy_string',
|
|
88
|
+
'sensitive_variable',
|
|
89
|
+
'security_bypass',
|
|
90
|
+
'dangerous_function',
|
|
91
|
+
'sql_injection',
|
|
92
|
+
'xss',
|
|
93
|
+
'command_injection',
|
|
94
|
+
'insecure_config',
|
|
95
|
+
'missing_auth',
|
|
96
|
+
'suspicious_package',
|
|
97
|
+
'cors_misconfiguration',
|
|
98
|
+
'root_container',
|
|
99
|
+
'dangerous_file',
|
|
100
|
+
'ai_pattern',
|
|
101
|
+
'sensitive_url',
|
|
102
|
+
'weak_crypto',
|
|
103
|
+
'data_exposure',
|
|
104
|
+
'ai_prompt_injection',
|
|
105
|
+
'ai_unsafe_execution',
|
|
106
|
+
'ai_overpermissive_tool',
|
|
107
|
+
'ai_rag_exfiltration',
|
|
108
|
+
'ai_endpoint_unprotected',
|
|
109
|
+
'ai_schema_mismatch',
|
|
110
|
+
'ai_package_hallucination',
|
|
111
|
+
'ai_rag_corpus_poisoning',
|
|
112
|
+
'ai_rag_pii_leakage',
|
|
113
|
+
'ai_mcp_tool_poisoning',
|
|
114
|
+
'ai_mcp_credential_issue',
|
|
115
|
+
'ai_mcp_confused_deputy',
|
|
116
|
+
'ai_mcp_description_injection',
|
|
117
|
+
'ai_mcp_server_shadowing',
|
|
118
|
+
'ai_mcp_config_secrets',
|
|
119
|
+
'ai_mcp_config_permissions',
|
|
120
|
+
'ai_rag_query_injection',
|
|
121
|
+
'ai_rag_embedding_poisoning',
|
|
122
|
+
'ai_rag_chunk_injection',
|
|
123
|
+
'ai_package_typosquat',
|
|
124
|
+
'ai_package_malicious',
|
|
125
|
+
'ai_unsafe_model_load',
|
|
126
|
+
'ai_unverified_model',
|
|
127
|
+
'ai_unsafe_finetuning',
|
|
128
|
+
'ai_excessive_agency',
|
|
129
|
+
];
|
|
130
|
+
/**
|
|
131
|
+
* Normalize category name for comparison
|
|
132
|
+
* - Converts to lowercase
|
|
133
|
+
* - Converts hyphens to underscores
|
|
134
|
+
* - Trims whitespace
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* normalizeCategory('SQL-Injection') // 'sql_injection'
|
|
138
|
+
* normalizeCategory('high_entropy_string') // 'high_entropy_string'
|
|
139
|
+
*/
|
|
140
|
+
function normalizeCategory(category) {
|
|
141
|
+
return category
|
|
142
|
+
.toLowerCase()
|
|
143
|
+
.trim()
|
|
144
|
+
.replace(/-/g, '_');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if a string is a valid wildcard pattern
|
|
148
|
+
* Valid wildcards end with '-*' or '_*'
|
|
149
|
+
*/
|
|
150
|
+
function isWildcardPattern(pattern) {
|
|
151
|
+
return pattern.endsWith('-*') || pattern.endsWith('_*');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Expand a wildcard pattern or single category to a list of categories
|
|
155
|
+
*
|
|
156
|
+
* @param pattern - Category name or wildcard (e.g., 'sql_injection', 'ai-*')
|
|
157
|
+
* @returns Array of matching categories
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* expandCategoryPattern('ai-*') // Returns all ai_* categories
|
|
161
|
+
* expandCategoryPattern('sql_injection') // Returns ['sql_injection']
|
|
162
|
+
* expandCategoryPattern('unknown-*') // Returns []
|
|
163
|
+
*/
|
|
164
|
+
function expandCategoryPattern(pattern) {
|
|
165
|
+
const normalized = normalizeCategory(pattern);
|
|
166
|
+
// Check for wildcard patterns
|
|
167
|
+
if (isWildcardPattern(normalized)) {
|
|
168
|
+
// Normalize the wildcard pattern (both ai-* and ai_* should work)
|
|
169
|
+
const normalizedWildcard = normalized.replace('_*', '-*');
|
|
170
|
+
// Look up in category groups
|
|
171
|
+
const expanded = exports.CATEGORY_GROUPS[normalizedWildcard];
|
|
172
|
+
if (expanded) {
|
|
173
|
+
return [...expanded];
|
|
174
|
+
}
|
|
175
|
+
// Unknown wildcard - return empty
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
// Single category - validate and return
|
|
179
|
+
// Handle both hyphenated and underscored versions
|
|
180
|
+
const normalizedCategory = normalized;
|
|
181
|
+
if (exports.ALL_CATEGORIES.includes(normalizedCategory)) {
|
|
182
|
+
return [normalizedCategory];
|
|
183
|
+
}
|
|
184
|
+
// Try hyphenated version converted to underscore
|
|
185
|
+
const underscored = normalized.replace(/-/g, '_');
|
|
186
|
+
if (exports.ALL_CATEGORIES.includes(underscored)) {
|
|
187
|
+
return [underscored];
|
|
188
|
+
}
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if a category matches any pattern in the filter list
|
|
193
|
+
*
|
|
194
|
+
* @param category - The vulnerability category to check
|
|
195
|
+
* @param patterns - Array of category patterns (names or wildcards)
|
|
196
|
+
* @returns true if the category matches any pattern
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* matchesAnyCategory('ai_prompt_injection', ['ai-*']) // true
|
|
200
|
+
* matchesAnyCategory('sql_injection', ['ai-*']) // false
|
|
201
|
+
* matchesAnyCategory('sql_injection', ['sql_injection', 'xss']) // true
|
|
202
|
+
*/
|
|
203
|
+
function matchesAnyCategory(category, patterns) {
|
|
204
|
+
if (!patterns || patterns.length === 0) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
const normalizedCategory = normalizeCategory(category);
|
|
208
|
+
for (const pattern of patterns) {
|
|
209
|
+
const expanded = expandCategoryPattern(pattern);
|
|
210
|
+
// Check if category is in the expanded list
|
|
211
|
+
if (expanded.some(c => normalizeCategory(c) === normalizedCategory)) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
// severityRank imported from utils/parsed-file
|
|
218
|
+
/**
|
|
219
|
+
* Check if vulnerabilities should cause failure based on category filter
|
|
220
|
+
*
|
|
221
|
+
* When both category patterns and severity threshold are provided,
|
|
222
|
+
* BOTH conditions must match for a finding to cause failure.
|
|
223
|
+
*
|
|
224
|
+
* @param vulnerabilities - List of vulnerabilities to check
|
|
225
|
+
* @param categoryPatterns - Category patterns to filter on
|
|
226
|
+
* @param severityThreshold - Optional severity threshold (both must match)
|
|
227
|
+
* @returns true if any vulnerability matches and should cause failure
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* // Only fail on AI findings
|
|
231
|
+
* shouldFailOnCategories(vulns, ['ai-*'])
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* // Only fail on HIGH+ AI findings
|
|
235
|
+
* shouldFailOnCategories(vulns, ['ai-*'], 'high')
|
|
236
|
+
*/
|
|
237
|
+
function shouldFailOnCategories(vulnerabilities, categoryPatterns, severityThreshold) {
|
|
238
|
+
if (!vulnerabilities || vulnerabilities.length === 0) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
if (!categoryPatterns || categoryPatterns.length === 0) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
const thresholdRank = severityThreshold ? (0, parsed_file_1.severityRank)(severityThreshold) : 0;
|
|
245
|
+
for (const vuln of vulnerabilities) {
|
|
246
|
+
// Check if category matches any pattern
|
|
247
|
+
if (!matchesAnyCategory(vuln.category, categoryPatterns)) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// If no severity threshold specified, any matching category triggers failure
|
|
251
|
+
if (!severityThreshold) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
// Check if severity meets threshold
|
|
255
|
+
if ((0, parsed_file_1.severityRank)(vuln.severity) >= thresholdRank) {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get the categories that matched the filter from vulnerabilities
|
|
263
|
+
* Useful for error messages showing which categories caused failure
|
|
264
|
+
*/
|
|
265
|
+
function getMatchingCategories(vulnerabilities, categoryPatterns, severityThreshold) {
|
|
266
|
+
if (!vulnerabilities || vulnerabilities.length === 0) {
|
|
267
|
+
return [];
|
|
268
|
+
}
|
|
269
|
+
if (!categoryPatterns || categoryPatterns.length === 0) {
|
|
270
|
+
return [];
|
|
271
|
+
}
|
|
272
|
+
const thresholdRank = severityThreshold ? (0, parsed_file_1.severityRank)(severityThreshold) : 0;
|
|
273
|
+
const matched = new Set();
|
|
274
|
+
for (const vuln of vulnerabilities) {
|
|
275
|
+
// Check if category matches any pattern
|
|
276
|
+
if (!matchesAnyCategory(vuln.category, categoryPatterns)) {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
// If no severity threshold, or severity meets threshold
|
|
280
|
+
if (!severityThreshold || (0, parsed_file_1.severityRank)(vuln.severity) >= thresholdRank) {
|
|
281
|
+
matched.add(vuln.category);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return Array.from(matched);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Parse comma-separated category string into array
|
|
288
|
+
*
|
|
289
|
+
* @param input - Comma-separated category string
|
|
290
|
+
* @returns Array of trimmed category patterns
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* parseCategoryList('ai-*, secrets-*') // ['ai-*', 'secrets-*']
|
|
294
|
+
* parseCategoryList('sql_injection, xss') // ['sql_injection', 'xss']
|
|
295
|
+
*/
|
|
296
|
+
function parseCategoryList(input) {
|
|
297
|
+
if (!input || typeof input !== 'string') {
|
|
298
|
+
return [];
|
|
299
|
+
}
|
|
300
|
+
return input
|
|
301
|
+
.split(',')
|
|
302
|
+
.map(s => s.trim())
|
|
303
|
+
.filter(s => s.length > 0);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Validate category names, separating valid from invalid
|
|
307
|
+
*
|
|
308
|
+
* @param categories - Array of category patterns to validate
|
|
309
|
+
* @returns Object with valid and invalid category arrays
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* validateCategories(['ai-*', 'sql_injection', 'fake_category'])
|
|
313
|
+
* // { valid: ['ai-*', 'sql_injection'], invalid: ['fake_category'] }
|
|
314
|
+
*/
|
|
315
|
+
function validateCategories(categories) {
|
|
316
|
+
const valid = [];
|
|
317
|
+
const invalid = [];
|
|
318
|
+
for (const category of categories) {
|
|
319
|
+
const normalized = normalizeCategory(category);
|
|
320
|
+
// Check if it's a valid wildcard
|
|
321
|
+
if (isWildcardPattern(normalized)) {
|
|
322
|
+
const normalizedWildcard = normalized.replace('_*', '-*');
|
|
323
|
+
if (exports.CATEGORY_GROUPS[normalizedWildcard]) {
|
|
324
|
+
valid.push(category);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
invalid.push(category);
|
|
328
|
+
}
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
// Check if it's a valid category name
|
|
332
|
+
const expanded = expandCategoryPattern(category);
|
|
333
|
+
if (expanded.length > 0) {
|
|
334
|
+
valid.push(category);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
invalid.push(category);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return { valid, invalid };
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get a human-readable list of available category groups
|
|
344
|
+
* Useful for help text and error messages
|
|
345
|
+
*/
|
|
346
|
+
function getAvailableCategoryGroups() {
|
|
347
|
+
return Object.keys(exports.CATEGORY_GROUPS);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Get the count of categories in each group
|
|
351
|
+
* Useful for documentation and help text
|
|
352
|
+
*/
|
|
353
|
+
function getCategoryGroupCounts() {
|
|
354
|
+
const counts = {};
|
|
355
|
+
for (const [group, categories] of Object.entries(exports.CATEGORY_GROUPS)) {
|
|
356
|
+
counts[group] = categories.length;
|
|
357
|
+
}
|
|
358
|
+
return counts;
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=category-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-filter.js","sourceRoot":"","sources":["../src/category-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Context-Based Severity Adjustments
|
|
3
|
+
*
|
|
4
|
+
* Consolidates the duplicate filter logic from:
|
|
5
|
+
* - layer2/index.ts applyFileContextAdjustments() — per-file with full FileContext
|
|
6
|
+
* - index.ts applyGlobalContextAdjustments() — post-layers with tooling-dir only
|
|
7
|
+
*
|
|
8
|
+
* Both functions are replaced by a single applyContextAdjustments() that handles
|
|
9
|
+
* all context-based severity downgrades in one place.
|
|
10
|
+
*/
|
|
11
|
+
import type { Vulnerability } from '../types';
|
|
12
|
+
import type { FileContext } from '../utils/context-helpers';
|
|
13
|
+
/**
|
|
14
|
+
* Apply context-based severity adjustments to findings.
|
|
15
|
+
*
|
|
16
|
+
* When called with a FileContext (from Layer 2 per-file processing), applies
|
|
17
|
+
* full context-aware rules: test files, tooling dirs, server-only files.
|
|
18
|
+
*
|
|
19
|
+
* When called without a FileContext (from the orchestrator for Layer 1 findings),
|
|
20
|
+
* applies only tooling-directory downgrades based on file path.
|
|
21
|
+
*/
|
|
22
|
+
export declare function applyContextAdjustments(findings: Vulnerability[], fileContext?: FileContext): Vulnerability[];
|
|
23
|
+
//# sourceMappingURL=context-adjustments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-adjustments.d.ts","sourceRoot":"","sources":["../../src/filtering/context-adjustments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAmB3D;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,CAAC,EAAE,WAAW,GACxB,aAAa,EAAE,CA2DjB"}
|