@vibecheckai/cli 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +532 -0
- package/dist/autopatch/verified-autopatch.d.ts +111 -0
- package/dist/autopatch/verified-autopatch.d.ts.map +1 -0
- package/dist/autopatch/verified-autopatch.js +503 -0
- package/dist/autopatch/verified-autopatch.js.map +1 -0
- package/dist/bundles/guardrail-core.js +25799 -0
- package/dist/bundles/guardrail-security.js +208687 -0
- package/dist/bundles/guardrail-ship.js +2318 -0
- package/dist/bundles/index.js +8 -0
- package/dist/commands/autopilot-decision.d.ts +24 -0
- package/dist/commands/autopilot-decision.d.ts.map +1 -0
- package/dist/commands/autopilot-decision.js +304 -0
- package/dist/commands/autopilot-decision.js.map +1 -0
- package/dist/commands/autopilot.d.ts +33 -0
- package/dist/commands/autopilot.d.ts.map +1 -0
- package/dist/commands/autopilot.js +1539 -0
- package/dist/commands/autopilot.js.map +1 -0
- package/dist/commands/baseline.d.ts +7 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +79 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/cache.d.ts +13 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +165 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +8 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +35 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +340 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/debug.d.ts +78 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +381 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/doctor.d.ts +17 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +226 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/evidence.d.ts +45 -0
- package/dist/commands/evidence.d.ts.map +1 -0
- package/dist/commands/evidence.js +197 -0
- package/dist/commands/evidence.js.map +1 -0
- package/dist/commands/explain.d.ts +8 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +52 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/fix-consolidated.d.ts +19 -0
- package/dist/commands/fix-consolidated.d.ts.map +1 -0
- package/dist/commands/fix-consolidated.js +165 -0
- package/dist/commands/fix-consolidated.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +15 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +125 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/launcher.d.ts +10 -0
- package/dist/commands/launcher.d.ts.map +1 -0
- package/dist/commands/launcher.js +174 -0
- package/dist/commands/launcher.js.map +1 -0
- package/dist/commands/on.d.ts +8 -0
- package/dist/commands/on.d.ts.map +1 -0
- package/dist/commands/on.js +123 -0
- package/dist/commands/on.js.map +1 -0
- package/dist/commands/preview.d.ts +54 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +352 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/quality/check.d.ts +31 -0
- package/dist/commands/quality/check.d.ts.map +1 -0
- package/dist/commands/quality/check.js +242 -0
- package/dist/commands/quality/check.js.map +1 -0
- package/dist/commands/quality/index.d.ts +8 -0
- package/dist/commands/quality/index.d.ts.map +1 -0
- package/dist/commands/quality/index.js +14 -0
- package/dist/commands/quality/index.js.map +1 -0
- package/dist/commands/quality/setup-quality.d.ts +23 -0
- package/dist/commands/quality/setup-quality.d.ts.map +1 -0
- package/dist/commands/quality/setup-quality.js +452 -0
- package/dist/commands/quality/setup-quality.js.map +1 -0
- package/dist/commands/quality/tidy.d.ts +41 -0
- package/dist/commands/quality/tidy.d.ts.map +1 -0
- package/dist/commands/quality/tidy.js +466 -0
- package/dist/commands/quality/tidy.js.map +1 -0
- package/dist/commands/quality/utils.d.ts +73 -0
- package/dist/commands/quality/utils.d.ts.map +1 -0
- package/dist/commands/quality/utils.js +158 -0
- package/dist/commands/quality/utils.js.map +1 -0
- package/dist/commands/replay.d.ts +8 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +52 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/scan-consolidated.d.ts +61 -0
- package/dist/commands/scan-consolidated.d.ts.map +1 -0
- package/dist/commands/scan-consolidated.js +243 -0
- package/dist/commands/scan-consolidated.js.map +1 -0
- package/dist/commands/scan-secrets.d.ts +47 -0
- package/dist/commands/scan-secrets.d.ts.map +1 -0
- package/dist/commands/scan-secrets.js +225 -0
- package/dist/commands/scan-secrets.js.map +1 -0
- package/dist/commands/scan-vulnerabilities-enhanced.d.ts +41 -0
- package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +1 -0
- package/dist/commands/scan-vulnerabilities-enhanced.js +368 -0
- package/dist/commands/scan-vulnerabilities-enhanced.js.map +1 -0
- package/dist/commands/scan-vulnerabilities-osv.d.ts +58 -0
- package/dist/commands/scan-vulnerabilities-osv.d.ts.map +1 -0
- package/dist/commands/scan-vulnerabilities-osv.js +716 -0
- package/dist/commands/scan-vulnerabilities-osv.js.map +1 -0
- package/dist/commands/scan-vulnerabilities.d.ts +32 -0
- package/dist/commands/scan-vulnerabilities.d.ts.map +1 -0
- package/dist/commands/scan-vulnerabilities.js +283 -0
- package/dist/commands/scan-vulnerabilities.js.map +1 -0
- package/dist/commands/secrets-allowlist.d.ts +7 -0
- package/dist/commands/secrets-allowlist.d.ts.map +1 -0
- package/dist/commands/secrets-allowlist.js +85 -0
- package/dist/commands/secrets-allowlist.js.map +1 -0
- package/dist/commands/ship-consolidated.d.ts +58 -0
- package/dist/commands/ship-consolidated.d.ts.map +1 -0
- package/dist/commands/ship-consolidated.js +515 -0
- package/dist/commands/ship-consolidated.js.map +1 -0
- package/dist/commands/stats.d.ts +8 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +134 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +30 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/fix/analytics.d.ts +121 -0
- package/dist/fix/analytics.d.ts.map +1 -0
- package/dist/fix/analytics.js +289 -0
- package/dist/fix/analytics.js.map +1 -0
- package/dist/fix/applicator.d.ts +44 -0
- package/dist/fix/applicator.d.ts.map +1 -0
- package/dist/fix/applicator.js +144 -0
- package/dist/fix/applicator.js.map +1 -0
- package/dist/fix/audit.d.ts +61 -0
- package/dist/fix/audit.d.ts.map +1 -0
- package/dist/fix/audit.js +149 -0
- package/dist/fix/audit.js.map +1 -0
- package/dist/fix/backup.d.ts +38 -0
- package/dist/fix/backup.d.ts.map +1 -0
- package/dist/fix/backup.js +154 -0
- package/dist/fix/backup.js.map +1 -0
- package/dist/fix/config.d.ts +78 -0
- package/dist/fix/config.d.ts.map +1 -0
- package/dist/fix/config.js +200 -0
- package/dist/fix/config.js.map +1 -0
- package/dist/fix/engine.d.ts +55 -0
- package/dist/fix/engine.d.ts.map +1 -0
- package/dist/fix/engine.js +285 -0
- package/dist/fix/engine.js.map +1 -0
- package/dist/fix/impact.d.ts +74 -0
- package/dist/fix/impact.d.ts.map +1 -0
- package/dist/fix/impact.js +281 -0
- package/dist/fix/impact.js.map +1 -0
- package/dist/fix/index.d.ts +5 -0
- package/dist/fix/index.d.ts.map +1 -0
- package/dist/fix/index.js +12 -0
- package/dist/fix/index.js.map +1 -0
- package/dist/fix/interactive.d.ts +22 -0
- package/dist/fix/interactive.d.ts.map +1 -0
- package/dist/fix/interactive.js +172 -0
- package/dist/fix/interactive.js.map +1 -0
- package/dist/fix/learning.d.ts +109 -0
- package/dist/fix/learning.d.ts.map +1 -0
- package/dist/fix/learning.js +296 -0
- package/dist/fix/learning.js.map +1 -0
- package/dist/fix/metrics.d.ts +106 -0
- package/dist/fix/metrics.d.ts.map +1 -0
- package/dist/fix/metrics.js +138 -0
- package/dist/fix/metrics.js.map +1 -0
- package/dist/fix/parallel.d.ts +69 -0
- package/dist/fix/parallel.d.ts.map +1 -0
- package/dist/fix/parallel.js +203 -0
- package/dist/fix/parallel.js.map +1 -0
- package/dist/fix/report.d.ts +40 -0
- package/dist/fix/report.d.ts.map +1 -0
- package/dist/fix/report.js +212 -0
- package/dist/fix/report.js.map +1 -0
- package/dist/fix/strategy.d.ts +53 -0
- package/dist/fix/strategy.d.ts.map +1 -0
- package/dist/fix/strategy.js +143 -0
- package/dist/fix/strategy.js.map +1 -0
- package/dist/fix/templates.d.ts +58 -0
- package/dist/fix/templates.d.ts.map +1 -0
- package/dist/fix/templates.js +259 -0
- package/dist/fix/templates.js.map +1 -0
- package/dist/fix/testing.d.ts +68 -0
- package/dist/fix/testing.d.ts.map +1 -0
- package/dist/fix/testing.js +245 -0
- package/dist/fix/testing.js.map +1 -0
- package/dist/fix/validation.d.ts +71 -0
- package/dist/fix/validation.d.ts.map +1 -0
- package/dist/fix/validation.js +267 -0
- package/dist/fix/validation.js.map +1 -0
- package/dist/fix/visualization.d.ts +73 -0
- package/dist/fix/visualization.d.ts.map +1 -0
- package/dist/fix/visualization.js +243 -0
- package/dist/fix/visualization.js.map +1 -0
- package/dist/formatters/index.d.ts +6 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +11 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/sarif-enhanced.d.ts +78 -0
- package/dist/formatters/sarif-enhanced.d.ts.map +1 -0
- package/dist/formatters/sarif-enhanced.js +144 -0
- package/dist/formatters/sarif-enhanced.js.map +1 -0
- package/dist/formatters/sarif-v2.d.ts +121 -0
- package/dist/formatters/sarif-v2.d.ts.map +1 -0
- package/dist/formatters/sarif-v2.js +356 -0
- package/dist/formatters/sarif-v2.js.map +1 -0
- package/dist/formatters/sarif.d.ts +72 -0
- package/dist/formatters/sarif.d.ts.map +1 -0
- package/dist/formatters/sarif.js +146 -0
- package/dist/formatters/sarif.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4455 -0
- package/dist/index.js.map +1 -0
- package/dist/init/ci-generator.d.ts +18 -0
- package/dist/init/ci-generator.d.ts.map +1 -0
- package/dist/init/ci-generator.js +317 -0
- package/dist/init/ci-generator.js.map +1 -0
- package/dist/init/detect-framework.d.ts +15 -0
- package/dist/init/detect-framework.d.ts.map +1 -0
- package/dist/init/detect-framework.js +301 -0
- package/dist/init/detect-framework.js.map +1 -0
- package/dist/init/hooks-installer.d.ts +22 -0
- package/dist/init/hooks-installer.d.ts.map +1 -0
- package/dist/init/hooks-installer.js +310 -0
- package/dist/init/hooks-installer.js.map +1 -0
- package/dist/init/index.d.ts +8 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +22 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/templates.d.ts +401 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +240 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +42 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/telemetry.d.ts +40 -0
- package/dist/mcp/telemetry.d.ts.map +1 -0
- package/dist/mcp/telemetry.js +98 -0
- package/dist/mcp/telemetry.js.map +1 -0
- package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts +32 -0
- package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts.map +1 -0
- package/dist/reality/no-dead-buttons/button-sweep-generator.js +236 -0
- package/dist/reality/no-dead-buttons/button-sweep-generator.js.map +1 -0
- package/dist/reality/no-dead-buttons/index.d.ts +11 -0
- package/dist/reality/no-dead-buttons/index.d.ts.map +1 -0
- package/dist/reality/no-dead-buttons/index.js +18 -0
- package/dist/reality/no-dead-buttons/index.js.map +1 -0
- package/dist/reality/no-dead-buttons/static-scanner.d.ts +34 -0
- package/dist/reality/no-dead-buttons/static-scanner.d.ts.map +1 -0
- package/dist/reality/no-dead-buttons/static-scanner.js +230 -0
- package/dist/reality/no-dead-buttons/static-scanner.js.map +1 -0
- package/dist/reality/reality-graph.d.ts +192 -0
- package/dist/reality/reality-graph.d.ts.map +1 -0
- package/dist/reality/reality-graph.js +600 -0
- package/dist/reality/reality-graph.js.map +1 -0
- package/dist/reality/reality-runner.d.ts +89 -0
- package/dist/reality/reality-runner.d.ts.map +1 -0
- package/dist/reality/reality-runner.js +540 -0
- package/dist/reality/reality-runner.js.map +1 -0
- package/dist/reality/receipt-generator.d.ts +152 -0
- package/dist/reality/receipt-generator.d.ts.map +1 -0
- package/dist/reality/receipt-generator.js +495 -0
- package/dist/reality/receipt-generator.js.map +1 -0
- package/dist/reality/runtime-tracer.d.ts +75 -0
- package/dist/reality/runtime-tracer.d.ts.map +1 -0
- package/dist/reality/runtime-tracer.js +109 -0
- package/dist/reality/runtime-tracer.js.map +1 -0
- package/dist/runtime/auth-utils.d.ts +43 -0
- package/dist/runtime/auth-utils.d.ts.map +1 -0
- package/dist/runtime/auth-utils.js +130 -0
- package/dist/runtime/auth-utils.js.map +1 -0
- package/dist/runtime/cli-errors.d.ts +38 -0
- package/dist/runtime/cli-errors.d.ts.map +1 -0
- package/dist/runtime/cli-errors.js +354 -0
- package/dist/runtime/cli-errors.js.map +1 -0
- package/dist/runtime/client.d.ts +74 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +222 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/creds.d.ts +48 -0
- package/dist/runtime/creds.d.ts.map +1 -0
- package/dist/runtime/creds.js +245 -0
- package/dist/runtime/creds.js.map +1 -0
- package/dist/runtime/exit-codes.d.ts +49 -0
- package/dist/runtime/exit-codes.d.ts.map +1 -0
- package/dist/runtime/exit-codes.js +93 -0
- package/dist/runtime/exit-codes.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +25 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/json-output.d.ts +42 -0
- package/dist/runtime/json-output.d.ts.map +1 -0
- package/dist/runtime/json-output.js +59 -0
- package/dist/runtime/json-output.js.map +1 -0
- package/dist/runtime/owner-mode.d.ts +48 -0
- package/dist/runtime/owner-mode.d.ts.map +1 -0
- package/dist/runtime/owner-mode.js +284 -0
- package/dist/runtime/owner-mode.js.map +1 -0
- package/dist/runtime/semver.d.ts +37 -0
- package/dist/runtime/semver.d.ts.map +1 -0
- package/dist/runtime/semver.js +110 -0
- package/dist/runtime/semver.js.map +1 -0
- package/dist/scan/dead-ui-detector.d.ts +48 -0
- package/dist/scan/dead-ui-detector.d.ts.map +1 -0
- package/dist/scan/dead-ui-detector.js +170 -0
- package/dist/scan/dead-ui-detector.js.map +1 -0
- package/dist/scan/playwright-sweep.d.ts +40 -0
- package/dist/scan/playwright-sweep.d.ts.map +1 -0
- package/dist/scan/playwright-sweep.js +216 -0
- package/dist/scan/playwright-sweep.js.map +1 -0
- package/dist/scan/proof-bundle.d.ts +25 -0
- package/dist/scan/proof-bundle.d.ts.map +1 -0
- package/dist/scan/proof-bundle.js +203 -0
- package/dist/scan/proof-bundle.js.map +1 -0
- package/dist/scan/proof-graph.d.ts +59 -0
- package/dist/scan/proof-graph.d.ts.map +1 -0
- package/dist/scan/proof-graph.js +64 -0
- package/dist/scan/proof-graph.js.map +1 -0
- package/dist/scan/reality-sniff.d.ts +56 -0
- package/dist/scan/reality-sniff.d.ts.map +1 -0
- package/dist/scan/reality-sniff.js +200 -0
- package/dist/scan/reality-sniff.js.map +1 -0
- package/dist/scan/structural-verifier.d.ts +20 -0
- package/dist/scan/structural-verifier.d.ts.map +1 -0
- package/dist/scan/structural-verifier.js +112 -0
- package/dist/scan/structural-verifier.js.map +1 -0
- package/dist/scan/verification-engine.d.ts +47 -0
- package/dist/scan/verification-engine.d.ts.map +1 -0
- package/dist/scan/verification-engine.js +141 -0
- package/dist/scan/verification-engine.js.map +1 -0
- package/dist/scanner/baseline.d.ts +52 -0
- package/dist/scanner/baseline.d.ts.map +1 -0
- package/dist/scanner/baseline.js +85 -0
- package/dist/scanner/baseline.js.map +1 -0
- package/dist/scanner/incremental.d.ts +30 -0
- package/dist/scanner/incremental.d.ts.map +1 -0
- package/dist/scanner/incremental.js +82 -0
- package/dist/scanner/incremental.js.map +1 -0
- package/dist/scanner/index.d.ts +8 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +15 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/parallel.d.ts +43 -0
- package/dist/scanner/parallel.d.ts.map +1 -0
- package/dist/scanner/parallel.js +99 -0
- package/dist/scanner/parallel.js.map +1 -0
- package/dist/scanner/placeholder-detector.d.ts +56 -0
- package/dist/scanner/placeholder-detector.d.ts.map +1 -0
- package/dist/scanner/placeholder-detector.js +220 -0
- package/dist/scanner/placeholder-detector.js.map +1 -0
- package/dist/scanner/route-detector.d.ts +100 -0
- package/dist/scanner/route-detector.d.ts.map +1 -0
- package/dist/scanner/route-detector.js +455 -0
- package/dist/scanner/route-detector.js.map +1 -0
- package/dist/scanner/scoring.d.ts +67 -0
- package/dist/scanner/scoring.d.ts.map +1 -0
- package/dist/scanner/scoring.js +284 -0
- package/dist/scanner/scoring.js.map +1 -0
- package/dist/ship-baseline.d.ts +56 -0
- package/dist/ship-baseline.d.ts.map +1 -0
- package/dist/ship-baseline.js +194 -0
- package/dist/ship-baseline.js.map +1 -0
- package/dist/ship-config.d.ts +91 -0
- package/dist/ship-config.d.ts.map +1 -0
- package/dist/ship-config.js +133 -0
- package/dist/ship-config.js.map +1 -0
- package/dist/ship-data-loader.d.ts +70 -0
- package/dist/ship-data-loader.d.ts.map +1 -0
- package/dist/ship-data-loader.js +301 -0
- package/dist/ship-data-loader.js.map +1 -0
- package/dist/standalone.d.ts +1 -0
- package/dist/standalone.d.ts.map +1 -0
- package/dist/standalone.js +1 -0
- package/dist/standalone.js.map +1 -0
- package/dist/truth-pack/index.d.ts +102 -0
- package/dist/truth-pack/index.d.ts.map +1 -0
- package/dist/truth-pack/index.js +694 -0
- package/dist/truth-pack/index.js.map +1 -0
- package/dist/ui/frame.d.ts +68 -0
- package/dist/ui/frame.d.ts.map +1 -0
- package/dist/ui/frame.js +165 -0
- package/dist/ui/frame.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +16 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui.d.ts +36 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +45 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/ai-helpers.d.ts +72 -0
- package/dist/utils/ai-helpers.d.ts.map +1 -0
- package/dist/utils/ai-helpers.js +339 -0
- package/dist/utils/ai-helpers.js.map +1 -0
- package/dist/utils/validation.d.ts +34 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +160 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Structural Verification (Level 2)
|
|
4
|
+
*
|
|
5
|
+
* AST + reachability + callsite context analysis
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.StructuralVerifier = void 0;
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
class StructuralVerifier {
|
|
11
|
+
/**
|
|
12
|
+
* Verify finding using AST and structural analysis
|
|
13
|
+
*/
|
|
14
|
+
async verify(finding, projectPath) {
|
|
15
|
+
try {
|
|
16
|
+
// Try to use TypeScript compiler API if available
|
|
17
|
+
if (this.isTypeScriptAvailable()) {
|
|
18
|
+
return await this.verifyWithTypeScript(finding, projectPath);
|
|
19
|
+
}
|
|
20
|
+
// Fallback to basic structural analysis
|
|
21
|
+
return await this.verifyBasic(finding, projectPath);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
// If structural verification fails, return null (fallback to lexical)
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async verifyWithTypeScript(finding, projectPath) {
|
|
29
|
+
// TODO: Implement full TypeScript AST analysis
|
|
30
|
+
// This would:
|
|
31
|
+
// 1. Parse file with TypeScript compiler API
|
|
32
|
+
// 2. Find the specific node at file:line
|
|
33
|
+
// 3. Analyze reachability (is it called? is it exported?)
|
|
34
|
+
// 4. Analyze context (is it in error handler? is it in test?)
|
|
35
|
+
// 5. Calculate evidence strength based on context
|
|
36
|
+
// For now, return basic structural evidence
|
|
37
|
+
return {
|
|
38
|
+
level: 'structural',
|
|
39
|
+
strength: 0.7,
|
|
40
|
+
data: {
|
|
41
|
+
method: 'ast_analysis',
|
|
42
|
+
reachable: true, // TODO: Actually check
|
|
43
|
+
context: 'production', // TODO: Actually determine
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async verifyBasic(finding, projectPath) {
|
|
48
|
+
try {
|
|
49
|
+
const content = (0, fs_1.readFileSync)(finding.file, 'utf-8');
|
|
50
|
+
const lines = content.split('\n');
|
|
51
|
+
const targetLine = lines[finding.line - 1];
|
|
52
|
+
// Basic structural checks
|
|
53
|
+
const isExported = this.isExported(content, finding.line);
|
|
54
|
+
const isInErrorHandler = this.isInErrorHandler(content, finding.line);
|
|
55
|
+
const isInTest = finding.file.includes('test') || finding.file.includes('spec');
|
|
56
|
+
const isReachable = !this.isDeadCode(content, finding.line);
|
|
57
|
+
// Calculate strength based on context
|
|
58
|
+
let strength = 0.6; // Base strength
|
|
59
|
+
if (isExported && !isInTest) {
|
|
60
|
+
strength += 0.1; // Exported code is more important
|
|
61
|
+
}
|
|
62
|
+
if (isInErrorHandler && finding.type === 'fake_success') {
|
|
63
|
+
strength += 0.2; // Fake success in error handler is worse
|
|
64
|
+
}
|
|
65
|
+
if (!isReachable) {
|
|
66
|
+
strength -= 0.2; // Dead code is less critical
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
level: 'structural',
|
|
70
|
+
strength: Math.max(0.3, Math.min(1.0, strength)),
|
|
71
|
+
data: {
|
|
72
|
+
method: 'basic_analysis',
|
|
73
|
+
exported: isExported,
|
|
74
|
+
inErrorHandler: isInErrorHandler,
|
|
75
|
+
inTest: isInTest,
|
|
76
|
+
reachable: isReachable,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
isExported(content, lineNum) {
|
|
85
|
+
const lines = content.split('\n');
|
|
86
|
+
const beforeContext = lines.slice(Math.max(0, lineNum - 10), lineNum).join('\n');
|
|
87
|
+
return /\bexport\b/.test(beforeContext);
|
|
88
|
+
}
|
|
89
|
+
isInErrorHandler(content, lineNum) {
|
|
90
|
+
const lines = content.split('\n');
|
|
91
|
+
const beforeContext = lines.slice(Math.max(0, lineNum - 20), lineNum).join('\n');
|
|
92
|
+
return /catch|onError|error|exception/i.test(beforeContext);
|
|
93
|
+
}
|
|
94
|
+
isDeadCode(content, lineNum) {
|
|
95
|
+
const lines = content.split('\n');
|
|
96
|
+
const afterContext = lines.slice(lineNum, Math.min(lines.length, lineNum + 20)).join('\n');
|
|
97
|
+
// Check if there's a return or throw before this line that would make it unreachable
|
|
98
|
+
const beforeContext = lines.slice(Math.max(0, lineNum - 20), lineNum).join('\n');
|
|
99
|
+
return /return\s*;|throw\s+/.test(beforeContext) && !/if\s*\(/.test(beforeContext);
|
|
100
|
+
}
|
|
101
|
+
isTypeScriptAvailable() {
|
|
102
|
+
try {
|
|
103
|
+
require.resolve('typescript');
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.StructuralVerifier = StructuralVerifier;
|
|
112
|
+
//# sourceMappingURL=structural-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-verifier.js","sourceRoot":"","sources":["../../src/scan/structural-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Engine with 3-Level Evidence Ladder
|
|
3
|
+
*
|
|
4
|
+
* Level 1: Lexical (fast regex/keywords) → usually WARN
|
|
5
|
+
* Level 2: Structural (AST + reachability + callsite context) → can FAIL
|
|
6
|
+
* Level 3: Runtime witness (probes / Playwright trace / HAR) → definitive FAIL
|
|
7
|
+
*/
|
|
8
|
+
import { RealityFinding } from './reality-sniff';
|
|
9
|
+
export type EvidenceLevel = 'lexical' | 'structural' | 'runtime';
|
|
10
|
+
export type Verdict = 'PASS' | 'FAIL' | 'WARN';
|
|
11
|
+
export interface Evidence {
|
|
12
|
+
level: EvidenceLevel;
|
|
13
|
+
strength: number;
|
|
14
|
+
data: any;
|
|
15
|
+
}
|
|
16
|
+
export interface VerifiedFinding {
|
|
17
|
+
finding: RealityFinding;
|
|
18
|
+
evidence: Evidence[];
|
|
19
|
+
verdict: Verdict;
|
|
20
|
+
confidence: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class VerificationEngine {
|
|
23
|
+
/**
|
|
24
|
+
* Verify finding with evidence ladder
|
|
25
|
+
*/
|
|
26
|
+
verify(finding: RealityFinding, options?: {
|
|
27
|
+
enableStructural?: boolean;
|
|
28
|
+
enableRuntime?: boolean;
|
|
29
|
+
}): Promise<VerifiedFinding>;
|
|
30
|
+
/**
|
|
31
|
+
* Level 1: Lexical verification (fast regex/keywords)
|
|
32
|
+
*/
|
|
33
|
+
private lexicalVerification;
|
|
34
|
+
/**
|
|
35
|
+
* Level 2: Structural verification (AST + reachability)
|
|
36
|
+
*/
|
|
37
|
+
private structuralVerification;
|
|
38
|
+
/**
|
|
39
|
+
* Level 3: Runtime verification (probes / Playwright / HAR)
|
|
40
|
+
*/
|
|
41
|
+
private runtimeVerification;
|
|
42
|
+
/**
|
|
43
|
+
* Calculate verdict based on evidence
|
|
44
|
+
*/
|
|
45
|
+
private calculateVerdict;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=verification-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-engine.d.ts","sourceRoot":"","sources":["../../src/scan/verification-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AACjE,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;CACX;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE;QAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;KACpB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkCjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;YACW,sBAAsB;IAQpC;;OAEG;YACW,mBAAmB;IAMjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAgCzB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Verification Engine with 3-Level Evidence Ladder
|
|
4
|
+
*
|
|
5
|
+
* Level 1: Lexical (fast regex/keywords) → usually WARN
|
|
6
|
+
* Level 2: Structural (AST + reachability + callsite context) → can FAIL
|
|
7
|
+
* Level 3: Runtime witness (probes / Playwright trace / HAR) → definitive FAIL
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.VerificationEngine = void 0;
|
|
44
|
+
class VerificationEngine {
|
|
45
|
+
/**
|
|
46
|
+
* Verify finding with evidence ladder
|
|
47
|
+
*/
|
|
48
|
+
async verify(finding, options = {}) {
|
|
49
|
+
const evidence = [];
|
|
50
|
+
// Level 1: Lexical (always done)
|
|
51
|
+
const lexicalEvidence = this.lexicalVerification(finding);
|
|
52
|
+
evidence.push(lexicalEvidence);
|
|
53
|
+
// Level 2: Structural (if enabled)
|
|
54
|
+
if (options.enableStructural) {
|
|
55
|
+
const structuralEvidence = await this.structuralVerification(finding);
|
|
56
|
+
if (structuralEvidence) {
|
|
57
|
+
evidence.push(structuralEvidence);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Level 3: Runtime (if enabled)
|
|
61
|
+
if (options.enableRuntime) {
|
|
62
|
+
const runtimeEvidence = await this.runtimeVerification(finding);
|
|
63
|
+
if (runtimeEvidence) {
|
|
64
|
+
evidence.push(runtimeEvidence);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Determine verdict and confidence
|
|
68
|
+
const { verdict, confidence } = this.calculateVerdict(evidence, finding);
|
|
69
|
+
return {
|
|
70
|
+
finding,
|
|
71
|
+
evidence,
|
|
72
|
+
verdict,
|
|
73
|
+
confidence,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Level 1: Lexical verification (fast regex/keywords)
|
|
78
|
+
*/
|
|
79
|
+
lexicalVerification(finding) {
|
|
80
|
+
// Already detected by lexical scan, so this is confirmation
|
|
81
|
+
return {
|
|
82
|
+
level: 'lexical',
|
|
83
|
+
strength: 0.6, // Moderate confidence
|
|
84
|
+
data: {
|
|
85
|
+
pattern: finding.evidence.pattern,
|
|
86
|
+
snippet: finding.evidence.snippet,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Level 2: Structural verification (AST + reachability)
|
|
92
|
+
*/
|
|
93
|
+
async structuralVerification(finding) {
|
|
94
|
+
const { StructuralVerifier } = await Promise.resolve().then(() => __importStar(require('./structural-verifier')));
|
|
95
|
+
const verifier = new StructuralVerifier();
|
|
96
|
+
// Extract project path from finding file
|
|
97
|
+
const projectPath = finding.file.split('/').slice(0, -1).join('/') || '.';
|
|
98
|
+
return await verifier.verify(finding, projectPath);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Level 3: Runtime verification (probes / Playwright / HAR)
|
|
102
|
+
*/
|
|
103
|
+
async runtimeVerification(finding) {
|
|
104
|
+
// TODO: Implement runtime probes
|
|
105
|
+
// For now, return null (not implemented)
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Calculate verdict based on evidence
|
|
110
|
+
*/
|
|
111
|
+
calculateVerdict(evidence, finding) {
|
|
112
|
+
if (evidence.length === 0) {
|
|
113
|
+
return { verdict: 'WARN', confidence: 0.5 };
|
|
114
|
+
}
|
|
115
|
+
// Check for runtime evidence (definitive)
|
|
116
|
+
const runtimeEvidence = evidence.find(e => e.level === 'runtime');
|
|
117
|
+
if (runtimeEvidence && runtimeEvidence.strength > 0.8) {
|
|
118
|
+
return { verdict: 'FAIL', confidence: runtimeEvidence.strength };
|
|
119
|
+
}
|
|
120
|
+
// Check for structural evidence
|
|
121
|
+
const structuralEvidence = evidence.find(e => e.level === 'structural');
|
|
122
|
+
if (structuralEvidence && structuralEvidence.strength > 0.7) {
|
|
123
|
+
// Can FAIL if severity is high/critical
|
|
124
|
+
if (finding.severity === 'critical' || finding.severity === 'high') {
|
|
125
|
+
return { verdict: 'FAIL', confidence: structuralEvidence.strength };
|
|
126
|
+
}
|
|
127
|
+
return { verdict: 'WARN', confidence: structuralEvidence.strength };
|
|
128
|
+
}
|
|
129
|
+
// Lexical only → WARN (unless critical severity)
|
|
130
|
+
const lexicalEvidence = evidence.find(e => e.level === 'lexical');
|
|
131
|
+
if (lexicalEvidence) {
|
|
132
|
+
if (finding.severity === 'critical' && lexicalEvidence.strength > 0.7) {
|
|
133
|
+
return { verdict: 'FAIL', confidence: lexicalEvidence.strength };
|
|
134
|
+
}
|
|
135
|
+
return { verdict: 'WARN', confidence: lexicalEvidence.strength };
|
|
136
|
+
}
|
|
137
|
+
return { verdict: 'WARN', confidence: 0.5 };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.VerificationEngine = VerificationEngine;
|
|
141
|
+
//# sourceMappingURL=verification-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-engine.js","sourceRoot":"","sources":["../../src/scan/verification-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline support for suppressing known findings
|
|
3
|
+
*/
|
|
4
|
+
export interface BaselineFinding {
|
|
5
|
+
fingerprint: string;
|
|
6
|
+
category: string;
|
|
7
|
+
title: string;
|
|
8
|
+
file: string;
|
|
9
|
+
line: number;
|
|
10
|
+
suppressedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Baseline {
|
|
13
|
+
version: string;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
findings: BaselineFinding[];
|
|
16
|
+
}
|
|
17
|
+
export interface Finding {
|
|
18
|
+
type?: string;
|
|
19
|
+
category?: string;
|
|
20
|
+
title: string;
|
|
21
|
+
file: string;
|
|
22
|
+
line: number;
|
|
23
|
+
match?: string;
|
|
24
|
+
snippet?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class BaselineManager {
|
|
27
|
+
/**
|
|
28
|
+
* Generate stable fingerprint for a finding
|
|
29
|
+
* fingerprint = sha256(category + title + file + line + snippetNormalized)
|
|
30
|
+
*/
|
|
31
|
+
static generateFingerprint(finding: Finding): string;
|
|
32
|
+
/**
|
|
33
|
+
* Load baseline from file
|
|
34
|
+
*/
|
|
35
|
+
static loadBaseline(path: string): Baseline | null;
|
|
36
|
+
/**
|
|
37
|
+
* Save baseline to file
|
|
38
|
+
*/
|
|
39
|
+
static saveBaseline(path: string, findings: Finding[]): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a finding is suppressed by baseline
|
|
42
|
+
*/
|
|
43
|
+
static isSuppressed(finding: Finding, baseline: Baseline | null): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Filter findings by baseline
|
|
46
|
+
*/
|
|
47
|
+
static filterFindings<T extends Finding>(findings: T[], baselinePath?: string): {
|
|
48
|
+
filtered: T[];
|
|
49
|
+
suppressed: number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/scanner/baseline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAcpD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAalD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAiB5D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO;IASzE;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAetH"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Baseline support for suppressing known findings
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BaselineManager = void 0;
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
class BaselineManager {
|
|
10
|
+
/**
|
|
11
|
+
* Generate stable fingerprint for a finding
|
|
12
|
+
* fingerprint = sha256(category + title + file + line + snippetNormalized)
|
|
13
|
+
*/
|
|
14
|
+
static generateFingerprint(finding) {
|
|
15
|
+
const category = finding.category || finding.type || 'unknown';
|
|
16
|
+
const title = finding.title || '';
|
|
17
|
+
const file = finding.file || '';
|
|
18
|
+
const line = finding.line || 0;
|
|
19
|
+
// Normalize snippet by removing whitespace variations
|
|
20
|
+
let snippet = finding.snippet || finding.match || '';
|
|
21
|
+
snippet = snippet.replace(/\s+/g, ' ').trim();
|
|
22
|
+
const data = `${category}:${title}:${file}:${line}:${snippet}`;
|
|
23
|
+
return (0, crypto_1.createHash)('sha256').update(data).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load baseline from file
|
|
27
|
+
*/
|
|
28
|
+
static loadBaseline(path) {
|
|
29
|
+
if (!(0, fs_1.existsSync)(path)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = (0, fs_1.readFileSync)(path, 'utf8');
|
|
34
|
+
return JSON.parse(content);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Save baseline to file
|
|
42
|
+
*/
|
|
43
|
+
static saveBaseline(path, findings) {
|
|
44
|
+
const baseline = {
|
|
45
|
+
version: '1.0.0',
|
|
46
|
+
createdAt: new Date().toISOString(),
|
|
47
|
+
findings: findings.map(f => ({
|
|
48
|
+
fingerprint: this.generateFingerprint(f),
|
|
49
|
+
category: f.category || f.type || 'unknown',
|
|
50
|
+
title: f.title,
|
|
51
|
+
file: f.file,
|
|
52
|
+
line: f.line,
|
|
53
|
+
suppressedAt: new Date().toISOString(),
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
(0, fs_1.writeFileSync)(path, JSON.stringify(baseline, null, 2), 'utf8');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a finding is suppressed by baseline
|
|
60
|
+
*/
|
|
61
|
+
static isSuppressed(finding, baseline) {
|
|
62
|
+
if (!baseline) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const fingerprint = this.generateFingerprint(finding);
|
|
66
|
+
return baseline.findings.some(bf => bf.fingerprint === fingerprint);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Filter findings by baseline
|
|
70
|
+
*/
|
|
71
|
+
static filterFindings(findings, baselinePath) {
|
|
72
|
+
if (!baselinePath) {
|
|
73
|
+
return { filtered: findings, suppressed: 0 };
|
|
74
|
+
}
|
|
75
|
+
const baseline = this.loadBaseline(baselinePath);
|
|
76
|
+
if (!baseline) {
|
|
77
|
+
return { filtered: findings, suppressed: 0 };
|
|
78
|
+
}
|
|
79
|
+
const filtered = findings.filter(f => !this.isSuppressed(f, baseline));
|
|
80
|
+
const suppressed = findings.length - filtered.length;
|
|
81
|
+
return { filtered, suppressed };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.BaselineManager = BaselineManager;
|
|
85
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/scanner/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental scanning with git diff support
|
|
3
|
+
*/
|
|
4
|
+
export interface IncrementalOptions {
|
|
5
|
+
since?: string;
|
|
6
|
+
projectPath: string;
|
|
7
|
+
}
|
|
8
|
+
export interface IncrementalResult {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
changedFiles: string[];
|
|
11
|
+
baseCommit?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class IncrementalScanner {
|
|
15
|
+
/**
|
|
16
|
+
* Get list of changed files since a commit
|
|
17
|
+
* Returns all files if not a git repo or if since is not provided
|
|
18
|
+
*/
|
|
19
|
+
static getChangedFiles(options: IncrementalOptions): IncrementalResult;
|
|
20
|
+
/**
|
|
21
|
+
* Filter files to scan based on incremental mode
|
|
22
|
+
* Only applies to secrets scan - vulnerabilities/compliance run full
|
|
23
|
+
*/
|
|
24
|
+
static shouldScanFile(filePath: string, incrementalResult: IncrementalResult): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get explanation message for incremental mode
|
|
27
|
+
*/
|
|
28
|
+
static getIncrementalMessage(incrementalResult: IncrementalResult): string;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=incremental.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/scanner/incremental.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB;IA8CtE;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO;IAWtF;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,MAAM;CAW3E"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Incremental scanning with git diff support
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.IncrementalScanner = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
class IncrementalScanner {
|
|
11
|
+
/**
|
|
12
|
+
* Get list of changed files since a commit
|
|
13
|
+
* Returns all files if not a git repo or if since is not provided
|
|
14
|
+
*/
|
|
15
|
+
static getChangedFiles(options) {
|
|
16
|
+
if (!options.since) {
|
|
17
|
+
return {
|
|
18
|
+
enabled: false,
|
|
19
|
+
changedFiles: [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Check if this is a git repository
|
|
23
|
+
const gitDir = (0, path_1.join)(options.projectPath, '.git');
|
|
24
|
+
if (!(0, fs_1.existsSync)(gitDir)) {
|
|
25
|
+
return {
|
|
26
|
+
enabled: false,
|
|
27
|
+
changedFiles: [],
|
|
28
|
+
error: 'Not a git repository',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
// Get changed files using git diff
|
|
33
|
+
const output = (0, child_process_1.execSync)(`git diff --name-only ${options.since}...HEAD`, {
|
|
34
|
+
cwd: options.projectPath,
|
|
35
|
+
encoding: 'utf8',
|
|
36
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
37
|
+
});
|
|
38
|
+
const changedFiles = output
|
|
39
|
+
.split('\n')
|
|
40
|
+
.map(f => f.trim())
|
|
41
|
+
.filter(f => f.length > 0);
|
|
42
|
+
return {
|
|
43
|
+
enabled: true,
|
|
44
|
+
changedFiles,
|
|
45
|
+
baseCommit: options.since,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// Git command failed (invalid commit, not a repo, etc.)
|
|
50
|
+
return {
|
|
51
|
+
enabled: false,
|
|
52
|
+
changedFiles: [],
|
|
53
|
+
error: error.message || 'Git diff failed',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Filter files to scan based on incremental mode
|
|
59
|
+
* Only applies to secrets scan - vulnerabilities/compliance run full
|
|
60
|
+
*/
|
|
61
|
+
static shouldScanFile(filePath, incrementalResult) {
|
|
62
|
+
if (!incrementalResult.enabled) {
|
|
63
|
+
return true; // Scan all files if incremental mode disabled
|
|
64
|
+
}
|
|
65
|
+
// Check if file is in changed files list
|
|
66
|
+
return incrementalResult.changedFiles.some(changed => filePath.includes(changed) || changed.includes(filePath));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get explanation message for incremental mode
|
|
70
|
+
*/
|
|
71
|
+
static getIncrementalMessage(incrementalResult) {
|
|
72
|
+
if (!incrementalResult.enabled) {
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
if (incrementalResult.error) {
|
|
76
|
+
return `Incremental mode disabled: ${incrementalResult.error}`;
|
|
77
|
+
}
|
|
78
|
+
return `Incremental mode: scanning ${incrementalResult.changedFiles.length} changed files since ${incrementalResult.baseCommit}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.IncrementalScanner = IncrementalScanner;
|
|
82
|
+
//# sourceMappingURL=incremental.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/scanner/incremental.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iDAAyC;AACzC,2BAAgC;AAChC,+BAA4B;AAc5B,MAAa,kBAAkB;IAC7B;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,OAA2B;QAChD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,EAAE;aACjB,CAAC;QACJ,CAAC;QAED,oCAAoC;QACpC,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,EAAE;gBAChB,KAAK,EAAE,sBAAsB;aAC9B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,wBAAwB,OAAO,CAAC,KAAK,SAAS,EAAE;gBACtE,GAAG,EAAE,OAAO,CAAC,WAAW;gBACxB,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM;iBACxB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE7B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,UAAU,EAAE,OAAO,CAAC,KAAK;aAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,wDAAwD;YACxD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,EAAE;gBAChB,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,iBAAiB;aAC1C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,iBAAoC;QAC1E,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,CAAC,8CAA8C;QAC7D,CAAC;QAED,yCAAyC;QACzC,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CACnD,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACzD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,iBAAoC;QAC/D,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,8BAA8B,iBAAiB,CAAC,KAAK,EAAE,CAAC;QACjE,CAAC;QAED,OAAO,8BAA8B,iBAAiB,CAAC,YAAY,CAAC,MAAM,wBAAwB,iBAAiB,CAAC,UAAU,EAAE,CAAC;IACnI,CAAC;CACF;AAhFD,gDAgFC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scanner Module
|
|
3
|
+
* Re-exports all scanner functionality
|
|
4
|
+
*/
|
|
5
|
+
export { PlaceholderDetector, type PlaceholderFinding, type PlaceholderDetectorConfig, } from './placeholder-detector';
|
|
6
|
+
export { RouteDetector, type RouteInfo, type RouteDetectionResult, type RouteDetectorConfig, } from './route-detector';
|
|
7
|
+
export { calculateScore, formatScoreAsText, type ScoringResult, type ScoringInputs, type ScoreComponent, } from './scoring';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scanner Module
|
|
4
|
+
* Re-exports all scanner functionality
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.formatScoreAsText = exports.calculateScore = exports.RouteDetector = exports.PlaceholderDetector = void 0;
|
|
8
|
+
var placeholder_detector_1 = require("./placeholder-detector");
|
|
9
|
+
Object.defineProperty(exports, "PlaceholderDetector", { enumerable: true, get: function () { return placeholder_detector_1.PlaceholderDetector; } });
|
|
10
|
+
var route_detector_1 = require("./route-detector");
|
|
11
|
+
Object.defineProperty(exports, "RouteDetector", { enumerable: true, get: function () { return route_detector_1.RouteDetector; } });
|
|
12
|
+
var scoring_1 = require("./scoring");
|
|
13
|
+
Object.defineProperty(exports, "calculateScore", { enumerable: true, get: function () { return scoring_1.calculateScore; } });
|
|
14
|
+
Object.defineProperty(exports, "formatScoreAsText", { enumerable: true, get: function () { return scoring_1.formatScoreAsText; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAIgC;AAH9B,2HAAA,mBAAmB,OAAA;AAIrB,mDAK0B;AAJxB,+GAAA,aAAa,OAAA;AAKf,qCAMmB;AALjB,yGAAA,cAAc,OAAA;AACd,4GAAA,iBAAiB,OAAA"}
|