vibecheck-ai 2.0.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/.generated +25 -0
- package/bin/_deprecations.js +463 -0
- package/bin/_router.js +46 -0
- package/bin/cli-hygiene.js +241 -0
- package/bin/dev/run-v2-torture.js +30 -0
- package/bin/registry.js +656 -0
- package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
- package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
- package/bin/runners/REPORT_AUDIT.md +64 -0
- package/bin/runners/cli-utils.js +1070 -0
- package/bin/runners/context/ai-task-decomposer.js +337 -0
- package/bin/runners/context/analyzer.js +513 -0
- package/bin/runners/context/api-contracts.js +427 -0
- package/bin/runners/context/context-diff.js +342 -0
- package/bin/runners/context/context-pruner.js +291 -0
- package/bin/runners/context/dependency-graph.js +414 -0
- package/bin/runners/context/generators/claude.js +107 -0
- package/bin/runners/context/generators/codex.js +108 -0
- package/bin/runners/context/generators/copilot.js +119 -0
- package/bin/runners/context/generators/cursor-enhanced.js +2525 -0
- package/bin/runners/context/generators/cursor.js +514 -0
- package/bin/runners/context/generators/mcp.js +169 -0
- package/bin/runners/context/generators/windsurf.js +180 -0
- package/bin/runners/context/git-context.js +304 -0
- package/bin/runners/context/index.js +1110 -0
- package/bin/runners/context/insights.js +173 -0
- package/bin/runners/context/mcp-server/generate-rules.js +337 -0
- package/bin/runners/context/mcp-server/index.js +1176 -0
- package/bin/runners/context/mcp-server/package.json +24 -0
- package/bin/runners/context/memory.js +200 -0
- package/bin/runners/context/monorepo.js +215 -0
- package/bin/runners/context/multi-repo-federation.js +404 -0
- package/bin/runners/context/patterns.js +253 -0
- package/bin/runners/context/proof-context.js +1264 -0
- package/bin/runners/context/security-scanner.js +541 -0
- package/bin/runners/context/semantic-search.js +350 -0
- package/bin/runners/context/shared.js +264 -0
- package/bin/runners/context/team-conventions.js +336 -0
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
- package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
- package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
- package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
- package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
- package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
- package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
- package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
- package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
- package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
- package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
- package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
- package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
- package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
- package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
- package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
- package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
- package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
- package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
- package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
- package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
- package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
- package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
- package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
- package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
- package/bin/runners/lib/agent-firewall/index.js +200 -0
- package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
- package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
- package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
- package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
- package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
- package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
- package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
- package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
- package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
- package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
- package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
- package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
- package/bin/runners/lib/agent-firewall/logger.js +141 -0
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
- package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
- package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
- package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
- package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
- package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
- package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
- package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
- package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
- package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
- package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
- package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
- package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
- package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
- package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
- package/bin/runners/lib/agent-firewall/session/index.js +26 -0
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
- package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
- package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
- package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
- package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/ai-bridge.js +416 -0
- package/bin/runners/lib/analysis-core.js +309 -0
- package/bin/runners/lib/analyzers.js +2500 -0
- package/bin/runners/lib/api-client.js +269 -0
- package/bin/runners/lib/approve-output.js +235 -0
- package/bin/runners/lib/artifact-envelope.js +540 -0
- package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
- package/bin/runners/lib/audit-bridge.js +391 -0
- package/bin/runners/lib/auth-shared.js +977 -0
- package/bin/runners/lib/auth-truth.js +193 -0
- package/bin/runners/lib/auth.js +215 -0
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/backup.js +62 -0
- package/bin/runners/lib/billing.js +107 -0
- package/bin/runners/lib/checkpoint.js +941 -0
- package/bin/runners/lib/claims.js +118 -0
- package/bin/runners/lib/classify-output.js +204 -0
- package/bin/runners/lib/cleanup/engine.js +571 -0
- package/bin/runners/lib/cleanup/index.js +53 -0
- package/bin/runners/lib/cleanup/output.js +375 -0
- package/bin/runners/lib/cleanup/rules.js +1060 -0
- package/bin/runners/lib/cli-output.js +400 -0
- package/bin/runners/lib/cli-ui.js +540 -0
- package/bin/runners/lib/compliance-bridge-new.js +0 -0
- package/bin/runners/lib/compliance-bridge.js +165 -0
- package/bin/runners/lib/contracts/auth-contract.js +202 -0
- package/bin/runners/lib/contracts/env-contract.js +181 -0
- package/bin/runners/lib/contracts/external-contract.js +206 -0
- package/bin/runners/lib/contracts/guard.js +168 -0
- package/bin/runners/lib/contracts/index.js +89 -0
- package/bin/runners/lib/contracts/plan-validator.js +311 -0
- package/bin/runners/lib/contracts/route-contract.js +199 -0
- package/bin/runners/lib/contracts.js +804 -0
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/detect.js +89 -0
- package/bin/runners/lib/detectors-v2.js +622 -0
- package/bin/runners/lib/doctor/autofix.js +254 -0
- package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
- package/bin/runners/lib/doctor/failure-signatures.js +526 -0
- package/bin/runners/lib/doctor/fix-script.js +336 -0
- package/bin/runners/lib/doctor/index.js +37 -0
- package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
- package/bin/runners/lib/doctor/modules/index.js +105 -0
- package/bin/runners/lib/doctor/modules/network.js +250 -0
- package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
- package/bin/runners/lib/doctor/modules/project.js +312 -0
- package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
- package/bin/runners/lib/doctor/modules/runtime.js +224 -0
- package/bin/runners/lib/doctor/modules/security.js +350 -0
- package/bin/runners/lib/doctor/modules/system.js +213 -0
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
- package/bin/runners/lib/doctor/reporter.js +262 -0
- package/bin/runners/lib/doctor/safe-repair.js +384 -0
- package/bin/runners/lib/doctor/service.js +262 -0
- package/bin/runners/lib/doctor/types.js +113 -0
- package/bin/runners/lib/doctor/ui.js +263 -0
- package/bin/runners/lib/doctor-enhanced.js +233 -0
- package/bin/runners/lib/doctor-output.js +226 -0
- package/bin/runners/lib/doctor-v2.js +608 -0
- package/bin/runners/lib/drift.js +425 -0
- package/bin/runners/lib/enforcement.js +72 -0
- package/bin/runners/lib/engine/ast-cache.js +210 -0
- package/bin/runners/lib/engine/auth-extractor.js +211 -0
- package/bin/runners/lib/engine/billing-extractor.js +112 -0
- package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
- package/bin/runners/lib/engine/env-extractor.js +207 -0
- package/bin/runners/lib/engine/express-extractor.js +208 -0
- package/bin/runners/lib/engine/extractors.js +849 -0
- package/bin/runners/lib/engine/index.js +207 -0
- package/bin/runners/lib/engine/repo-index.js +514 -0
- package/bin/runners/lib/engine/types.js +124 -0
- package/bin/runners/lib/engines/accessibility-engine.js +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/attack-detector.js +1192 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
- package/bin/runners/lib/enterprise-detect.js +603 -0
- package/bin/runners/lib/enterprise-init.js +942 -0
- package/bin/runners/lib/entitlements-v2.js +265 -0
- package/bin/runners/lib/entitlements.generated.js +0 -0
- package/bin/runners/lib/entitlements.js +340 -0
- package/bin/runners/lib/env-resolver.js +417 -0
- package/bin/runners/lib/env-template.js +66 -0
- package/bin/runners/lib/env.js +189 -0
- package/bin/runners/lib/error-handler.js +368 -0
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +684 -0
- package/bin/runners/lib/exit-codes.js +275 -0
- package/bin/runners/lib/extractors/client-calls.js +990 -0
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
- package/bin/runners/lib/extractors/fastify-routes.js +426 -0
- package/bin/runners/lib/extractors/index.js +363 -0
- package/bin/runners/lib/extractors/next-routes.js +524 -0
- package/bin/runners/lib/extractors/proof-graph.js +431 -0
- package/bin/runners/lib/extractors/route-matcher.js +451 -0
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
- package/bin/runners/lib/extractors/ui-bindings.js +547 -0
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/findings-schema.js +281 -0
- package/bin/runners/lib/fingerprint.js +377 -0
- package/bin/runners/lib/firewall-prompt.js +50 -0
- package/bin/runners/lib/fix-output.js +228 -0
- package/bin/runners/lib/global-flags.js +250 -0
- package/bin/runners/lib/graph/graph-builder.js +265 -0
- package/bin/runners/lib/graph/html-renderer.js +413 -0
- package/bin/runners/lib/graph/index.js +32 -0
- package/bin/runners/lib/graph/runtime-collector.js +215 -0
- package/bin/runners/lib/graph/static-extractor.js +518 -0
- package/bin/runners/lib/help-formatter.js +413 -0
- package/bin/runners/lib/html-proof-report.js +913 -0
- package/bin/runners/lib/html-report.js +650 -0
- package/bin/runners/lib/init-wizard.js +601 -0
- package/bin/runners/lib/interactive-menu.js +1496 -0
- package/bin/runners/lib/json-output.js +76 -0
- package/bin/runners/lib/llm.js +75 -0
- package/bin/runners/lib/logger.js +38 -0
- package/bin/runners/lib/meter.js +61 -0
- package/bin/runners/lib/missions/briefing.js +427 -0
- package/bin/runners/lib/missions/checkpoint.js +753 -0
- package/bin/runners/lib/missions/evidence.js +126 -0
- package/bin/runners/lib/missions/hardening.js +851 -0
- package/bin/runners/lib/missions/plan.js +648 -0
- package/bin/runners/lib/missions/safety-gates.js +645 -0
- package/bin/runners/lib/missions/schema.js +478 -0
- package/bin/runners/lib/missions/templates.js +317 -0
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/packs/bundle.js +675 -0
- package/bin/runners/lib/packs/evidence-pack.js +671 -0
- package/bin/runners/lib/packs/pack-factory.js +837 -0
- package/bin/runners/lib/packs/permissions-pack.js +686 -0
- package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
- package/bin/runners/lib/patch.js +40 -0
- package/bin/runners/lib/permissions/auth-model.js +213 -0
- package/bin/runners/lib/permissions/idor-prover.js +205 -0
- package/bin/runners/lib/permissions/index.js +45 -0
- package/bin/runners/lib/permissions/matrix-builder.js +198 -0
- package/bin/runners/lib/pkgjson.js +28 -0
- package/bin/runners/lib/policy.js +295 -0
- package/bin/runners/lib/polish/accessibility.js +62 -0
- package/bin/runners/lib/polish/analyzer.js +93 -0
- package/bin/runners/lib/polish/backend.js +87 -0
- package/bin/runners/lib/polish/configuration.js +83 -0
- package/bin/runners/lib/polish/documentation.js +83 -0
- package/bin/runners/lib/polish/frontend.js +817 -0
- package/bin/runners/lib/polish/index.js +27 -0
- package/bin/runners/lib/polish/infrastructure.js +80 -0
- package/bin/runners/lib/polish/internationalization.js +85 -0
- package/bin/runners/lib/polish/libraries.js +180 -0
- package/bin/runners/lib/polish/observability.js +75 -0
- package/bin/runners/lib/polish/performance.js +64 -0
- package/bin/runners/lib/polish/privacy.js +110 -0
- package/bin/runners/lib/polish/resilience.js +92 -0
- package/bin/runners/lib/polish/security.js +78 -0
- package/bin/runners/lib/polish/seo.js +71 -0
- package/bin/runners/lib/polish/styles.js +62 -0
- package/bin/runners/lib/polish/utils.js +104 -0
- package/bin/runners/lib/preflight.js +142 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/prove-output.js +220 -0
- package/bin/runners/lib/reality/correlation-detectors.js +359 -0
- package/bin/runners/lib/reality/index.js +318 -0
- package/bin/runners/lib/reality/request-hashing.js +416 -0
- package/bin/runners/lib/reality/request-mapper.js +453 -0
- package/bin/runners/lib/reality/safety-rails.js +463 -0
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
- package/bin/runners/lib/reality/toast-detector.js +393 -0
- package/bin/runners/lib/reality-findings.js +84 -0
- package/bin/runners/lib/reality-output.js +231 -0
- package/bin/runners/lib/receipts.js +179 -0
- package/bin/runners/lib/redact.js +29 -0
- package/bin/runners/lib/replay/capsule-manager.js +154 -0
- package/bin/runners/lib/replay/index.js +263 -0
- package/bin/runners/lib/replay/player.js +348 -0
- package/bin/runners/lib/replay/recorder.js +331 -0
- package/bin/runners/lib/report-engine.js +626 -0
- package/bin/runners/lib/report-html.js +1233 -0
- package/bin/runners/lib/report-output.js +366 -0
- package/bin/runners/lib/report-templates.js +967 -0
- package/bin/runners/lib/report.js +135 -0
- package/bin/runners/lib/route-detection.js +1209 -0
- package/bin/runners/lib/route-truth.js +1322 -0
- package/bin/runners/lib/safelist/index.js +96 -0
- package/bin/runners/lib/safelist/integration.js +334 -0
- package/bin/runners/lib/safelist/matcher.js +696 -0
- package/bin/runners/lib/safelist/schema.js +948 -0
- package/bin/runners/lib/safelist/store.js +438 -0
- package/bin/runners/lib/sandbox/index.js +59 -0
- package/bin/runners/lib/sandbox/proof-chain.js +399 -0
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
- package/bin/runners/lib/sandbox/worktree.js +174 -0
- package/bin/runners/lib/scan-cache.js +330 -0
- package/bin/runners/lib/scan-output-schema.js +344 -0
- package/bin/runners/lib/scan-output.js +631 -0
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schema-validator.js +350 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/contracts.schema.json +160 -0
- package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
- package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
- package/bin/runners/lib/schemas/finding.schema.json +100 -0
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
- package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
- package/bin/runners/lib/schemas/run-request.schema.json +108 -0
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
- package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
- package/bin/runners/lib/schemas/validator.js +465 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -0
- package/bin/runners/lib/score-history.js +282 -0
- package/bin/runners/lib/security-bridge.js +249 -0
- package/bin/runners/lib/server-usage.js +513 -0
- package/bin/runners/lib/share-pack.js +239 -0
- package/bin/runners/lib/ship-gate.js +832 -0
- package/bin/runners/lib/ship-manifest.js +1153 -0
- package/bin/runners/lib/ship-output-enterprise.js +239 -0
- package/bin/runners/lib/ship-output.js +1128 -0
- package/bin/runners/lib/snippets.js +67 -0
- package/bin/runners/lib/status-output.js +340 -0
- package/bin/runners/lib/terminal-ui.js +356 -0
- package/bin/runners/lib/truth.js +1691 -0
- package/bin/runners/lib/ui.js +562 -0
- package/bin/runners/lib/unified-cli-output.js +947 -0
- package/bin/runners/lib/unified-output.js +197 -0
- package/bin/runners/lib/upsell.js +410 -0
- package/bin/runners/lib/usage.js +153 -0
- package/bin/runners/lib/validate-patch.js +156 -0
- package/bin/runners/lib/verdict-engine.js +628 -0
- package/bin/runners/lib/verification.js +345 -0
- package/bin/runners/lib/why-tree.js +650 -0
- package/bin/runners/reality/engine.js +917 -0
- package/bin/runners/reality/flows.js +122 -0
- package/bin/runners/reality/report.js +378 -0
- package/bin/runners/reality/session.js +193 -0
- package/bin/runners/runAIAgent.js +229 -0
- package/bin/runners/runAgent.d.ts +5 -0
- package/bin/runners/runAgent.js +161 -0
- package/bin/runners/runAllowlist.js +418 -0
- package/bin/runners/runApprove.js +320 -0
- package/bin/runners/runAudit.js +692 -0
- package/bin/runners/runAuth.js +731 -0
- package/bin/runners/runCI.js +353 -0
- package/bin/runners/runCheckpoint.js +530 -0
- package/bin/runners/runClassify.js +928 -0
- package/bin/runners/runCleanup.js +343 -0
- package/bin/runners/runContext.d.ts +4 -0
- package/bin/runners/runContext.js +175 -0
- package/bin/runners/runDoctor.js +877 -0
- package/bin/runners/runEvidencePack.js +362 -0
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewall.js +134 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runFirewallHook.js +56 -0
- package/bin/runners/runFix.js +1355 -0
- package/bin/runners/runForge.js +451 -0
- package/bin/runners/runGuard.js +262 -0
- package/bin/runners/runInit.js +1927 -0
- package/bin/runners/runIntent.js +906 -0
- package/bin/runners/runKickoff.js +878 -0
- package/bin/runners/runLabs.js +424 -0
- package/bin/runners/runLaunch.js +2000 -0
- package/bin/runners/runLink.js +785 -0
- package/bin/runners/runMcp.js +1875 -0
- package/bin/runners/runPacks.js +2089 -0
- package/bin/runners/runPolish.d.ts +4 -0
- package/bin/runners/runPolish.js +390 -0
- package/bin/runners/runPromptFirewall.js +211 -0
- package/bin/runners/runProve.js +1411 -0
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +2260 -0
- package/bin/runners/runReport.js +726 -0
- package/bin/runners/runRuntime.js +110 -0
- package/bin/runners/runSafelist.js +1190 -0
- package/bin/runners/runScan.js +688 -0
- package/bin/runners/runShield.js +1282 -0
- package/bin/runners/runShip.js +1660 -0
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/runners/runTruth.js +101 -0
- package/bin/runners/runValidate.js +179 -0
- package/bin/runners/runWatch.js +478 -0
- package/bin/runners/utils.js +360 -0
- package/bin/scan.js +617 -0
- package/bin/vibecheck.js +1617 -0
- package/dist/guardrail/index.d.ts +2405 -0
- package/dist/guardrail/index.js +9747 -0
- package/dist/guardrail/index.js.map +1 -0
- package/dist/scanner/index.d.ts +282 -0
- package/dist/scanner/index.js +3395 -0
- package/dist/scanner/index.js.map +1 -0
- package/package.json +123 -104
- package/README.md +0 -491
- package/dist/index.js +0 -99711
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk Scoring Engine
|
|
3
|
+
*
|
|
4
|
+
* Calculates numerical risk scores for proposed changes.
|
|
5
|
+
* Uses configurable vectors and thresholds to determine risk levels.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const { RISK_VECTORS, RISK_LEVELS, getRiskLevel } = require("./vectors");
|
|
11
|
+
const { loadThresholds, getDecision } = require("./thresholds");
|
|
12
|
+
const { classifyFileDomain } = require("../reality/state");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {Object} RiskScore
|
|
16
|
+
* @property {number} total - Total risk score
|
|
17
|
+
* @property {string} level - Risk level (LOW, MEDIUM, HIGH, CRITICAL)
|
|
18
|
+
* @property {Object} vectors - Individual vector scores
|
|
19
|
+
* @property {string[]} reasons - Human-readable risk reasons
|
|
20
|
+
* @property {Object} decision - Decision based on thresholds
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Build context object for risk calculation
|
|
25
|
+
* @param {Object} params - Score parameters
|
|
26
|
+
* @returns {Object} Risk calculation context
|
|
27
|
+
*/
|
|
28
|
+
function buildContext(params) {
|
|
29
|
+
const {
|
|
30
|
+
files = [],
|
|
31
|
+
operations = [],
|
|
32
|
+
claims = [],
|
|
33
|
+
evidence = [],
|
|
34
|
+
intent = "",
|
|
35
|
+
assumptions = [],
|
|
36
|
+
proposalConfidence = 1,
|
|
37
|
+
policy = {},
|
|
38
|
+
} = params;
|
|
39
|
+
|
|
40
|
+
// Extract domains from files
|
|
41
|
+
const domains = new Set();
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
const path = file.path || file;
|
|
44
|
+
const domain = classifyFileDomain(path);
|
|
45
|
+
domains.add(domain);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Identify unresolved assumptions
|
|
49
|
+
const unresolvedAssumptions = [];
|
|
50
|
+
for (const assumption of assumptions) {
|
|
51
|
+
const evidenceForAssumption = evidence.find(e =>
|
|
52
|
+
e.claim?.key === assumption.key ||
|
|
53
|
+
e.claim?.type === assumption.type
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
if (!evidenceForAssumption || evidenceForAssumption.status === "UNPROVEN") {
|
|
57
|
+
unresolvedAssumptions.push(assumption);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Detect new items
|
|
62
|
+
const newEnvVars = claims
|
|
63
|
+
.filter(c => c.type === "env" && !c.exists)
|
|
64
|
+
.map(c => c.key || c.value);
|
|
65
|
+
|
|
66
|
+
const newRoutes = claims
|
|
67
|
+
.filter(c => c.type === "route" && !c.exists)
|
|
68
|
+
.map(c => c.path || c.value);
|
|
69
|
+
|
|
70
|
+
const newDependencies = claims
|
|
71
|
+
.filter(c => c.type === "dependency" && !c.exists)
|
|
72
|
+
.map(c => c.name || c.value);
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
files,
|
|
76
|
+
operations,
|
|
77
|
+
claims,
|
|
78
|
+
evidence,
|
|
79
|
+
intent,
|
|
80
|
+
assumptions,
|
|
81
|
+
proposalConfidence,
|
|
82
|
+
domains: Array.from(domains),
|
|
83
|
+
unresolvedAssumptions,
|
|
84
|
+
newEnvVars,
|
|
85
|
+
newRoutes,
|
|
86
|
+
newDependencies,
|
|
87
|
+
policy,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Calculate risk score for a change
|
|
93
|
+
* @param {Object} params - Score parameters
|
|
94
|
+
* @returns {RiskScore} Risk score result
|
|
95
|
+
*/
|
|
96
|
+
function calculateRiskScore(params) {
|
|
97
|
+
const context = buildContext(params);
|
|
98
|
+
const policy = params.policy || {};
|
|
99
|
+
const thresholds = loadThresholds(policy);
|
|
100
|
+
|
|
101
|
+
// Calculate individual vector scores
|
|
102
|
+
const vectorScores = {};
|
|
103
|
+
const reasons = [];
|
|
104
|
+
let totalScore = 0;
|
|
105
|
+
|
|
106
|
+
for (const [key, vector] of Object.entries(RISK_VECTORS)) {
|
|
107
|
+
try {
|
|
108
|
+
// Get weight from policy or use default
|
|
109
|
+
const weight = policy.risk?.vectorWeights?.[vector.id] ?? vector.baseWeight;
|
|
110
|
+
|
|
111
|
+
// Skip disabled vectors
|
|
112
|
+
if (weight === 0) continue;
|
|
113
|
+
|
|
114
|
+
// Calculate raw score
|
|
115
|
+
const rawScore = vector.calculate(context);
|
|
116
|
+
const weightedScore = Math.round(rawScore * weight);
|
|
117
|
+
|
|
118
|
+
vectorScores[vector.id] = {
|
|
119
|
+
raw: rawScore,
|
|
120
|
+
weighted: weightedScore,
|
|
121
|
+
weight,
|
|
122
|
+
name: vector.name,
|
|
123
|
+
description: vector.description,
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
totalScore += weightedScore;
|
|
127
|
+
|
|
128
|
+
// Add reason if score is significant
|
|
129
|
+
if (weightedScore > 0) {
|
|
130
|
+
const threshold = thresholds.vectors?.[vector.id];
|
|
131
|
+
if (threshold) {
|
|
132
|
+
if (weightedScore >= threshold.block) {
|
|
133
|
+
reasons.push(`${vector.name}: ${weightedScore} (CRITICAL - exceeds block threshold)`);
|
|
134
|
+
} else if (weightedScore >= threshold.warn) {
|
|
135
|
+
reasons.push(`${vector.name}: ${weightedScore} (WARNING - exceeds warn threshold)`);
|
|
136
|
+
} else if (weightedScore >= 10) {
|
|
137
|
+
reasons.push(`${vector.name}: ${weightedScore}`);
|
|
138
|
+
}
|
|
139
|
+
} else if (weightedScore >= 15) {
|
|
140
|
+
reasons.push(`${vector.name}: ${weightedScore}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
} catch (error) {
|
|
144
|
+
// Log but continue with other vectors
|
|
145
|
+
console.warn(`Error calculating ${vector.id} risk: ${error.message}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Get risk level
|
|
150
|
+
const riskLevel = getRiskLevel(totalScore);
|
|
151
|
+
|
|
152
|
+
// Get decision based on thresholds
|
|
153
|
+
const decision = getDecision(totalScore, thresholds, context.domains);
|
|
154
|
+
|
|
155
|
+
// Build result
|
|
156
|
+
const result = {
|
|
157
|
+
total: totalScore,
|
|
158
|
+
level: riskLevel.label,
|
|
159
|
+
levelColor: riskLevel.color,
|
|
160
|
+
vectors: vectorScores,
|
|
161
|
+
reasons: reasons.length > 0 ? reasons : [`Total risk score: ${totalScore}`],
|
|
162
|
+
decision,
|
|
163
|
+
context: {
|
|
164
|
+
fileCount: context.files.length,
|
|
165
|
+
domains: context.domains,
|
|
166
|
+
unresolvedAssumptions: context.unresolvedAssumptions.length,
|
|
167
|
+
newEnvVars: context.newEnvVars.length,
|
|
168
|
+
newRoutes: context.newRoutes.length,
|
|
169
|
+
},
|
|
170
|
+
thresholds: {
|
|
171
|
+
autoAllow: thresholds.autoAllow,
|
|
172
|
+
requireConfirm: thresholds.requireConfirm,
|
|
173
|
+
autoBlock: thresholds.autoBlock,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Quick risk assessment without full calculation
|
|
182
|
+
* @param {Object} params - Basic parameters
|
|
183
|
+
* @returns {Object} Quick assessment
|
|
184
|
+
*/
|
|
185
|
+
function quickAssess(params) {
|
|
186
|
+
const { files = [], operations = [], domains = [] } = params;
|
|
187
|
+
|
|
188
|
+
// Quick checks
|
|
189
|
+
const hasDeletes = operations.some(op => op.type === "delete");
|
|
190
|
+
const hasMigrations = files.some(f => (f.path || f).includes("migration"));
|
|
191
|
+
const touchesAuth = domains.includes("auth") || files.some(f => (f.path || f).includes("auth"));
|
|
192
|
+
const touchesPayments = domains.includes("payments") || files.some(f =>
|
|
193
|
+
(f.path || f).includes("payment") || (f.path || f).includes("stripe")
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
// Estimate risk level
|
|
197
|
+
let estimatedLevel = "LOW";
|
|
198
|
+
const flags = [];
|
|
199
|
+
|
|
200
|
+
if (hasDeletes) {
|
|
201
|
+
flags.push("Contains deletions");
|
|
202
|
+
estimatedLevel = "MEDIUM";
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (hasMigrations) {
|
|
206
|
+
flags.push("Contains migrations");
|
|
207
|
+
estimatedLevel = "HIGH";
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (touchesAuth) {
|
|
211
|
+
flags.push("Touches auth");
|
|
212
|
+
estimatedLevel = estimatedLevel === "LOW" ? "MEDIUM" : estimatedLevel;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (touchesPayments) {
|
|
216
|
+
flags.push("Touches payments");
|
|
217
|
+
estimatedLevel = "HIGH";
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (files.length > 10) {
|
|
221
|
+
flags.push("Large change (>10 files)");
|
|
222
|
+
estimatedLevel = estimatedLevel === "LOW" ? "MEDIUM" : estimatedLevel;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (files.length > 20) {
|
|
226
|
+
estimatedLevel = "HIGH";
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return {
|
|
230
|
+
estimatedLevel,
|
|
231
|
+
flags,
|
|
232
|
+
requiresFullAssessment: flags.length > 0 || files.length > 5,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get risk breakdown by domain
|
|
238
|
+
* @param {RiskScore} riskScore - Calculated risk score
|
|
239
|
+
* @returns {Object} Domain breakdown
|
|
240
|
+
*/
|
|
241
|
+
function getDomainBreakdown(riskScore) {
|
|
242
|
+
const breakdown = {};
|
|
243
|
+
|
|
244
|
+
for (const domain of riskScore.context?.domains || []) {
|
|
245
|
+
breakdown[domain] = {
|
|
246
|
+
files: 0,
|
|
247
|
+
contribution: 0,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Estimate contribution based on domain vector
|
|
252
|
+
const domainVector = riskScore.vectors?.domain;
|
|
253
|
+
if (domainVector && riskScore.context?.domains) {
|
|
254
|
+
const totalDomains = riskScore.context.domains.length;
|
|
255
|
+
if (totalDomains > 0) {
|
|
256
|
+
const avgContribution = domainVector.weighted / totalDomains;
|
|
257
|
+
for (const domain of riskScore.context.domains) {
|
|
258
|
+
breakdown[domain].contribution = Math.round(avgContribution);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return breakdown;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Format risk score for display
|
|
268
|
+
* @param {RiskScore} riskScore - Risk score
|
|
269
|
+
* @returns {string} Formatted string
|
|
270
|
+
*/
|
|
271
|
+
function formatRiskScore(riskScore) {
|
|
272
|
+
const lines = [
|
|
273
|
+
`Risk Score: ${riskScore.total} (${riskScore.level})`,
|
|
274
|
+
`Decision: ${riskScore.decision.decision}`,
|
|
275
|
+
"",
|
|
276
|
+
"Breakdown:",
|
|
277
|
+
];
|
|
278
|
+
|
|
279
|
+
for (const [id, vector] of Object.entries(riskScore.vectors)) {
|
|
280
|
+
if (vector.weighted > 0) {
|
|
281
|
+
lines.push(` ${vector.name}: ${vector.weighted}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (riskScore.reasons.length > 0) {
|
|
286
|
+
lines.push("", "Risk Factors:");
|
|
287
|
+
for (const reason of riskScore.reasons) {
|
|
288
|
+
lines.push(` - ${reason}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return lines.join("\n");
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Compare two risk scores
|
|
297
|
+
* @param {RiskScore} a - First score
|
|
298
|
+
* @param {RiskScore} b - Second score
|
|
299
|
+
* @returns {Object} Comparison result
|
|
300
|
+
*/
|
|
301
|
+
function compareScores(a, b) {
|
|
302
|
+
return {
|
|
303
|
+
difference: a.total - b.total,
|
|
304
|
+
percentChange: b.total > 0 ? ((a.total - b.total) / b.total) * 100 : 0,
|
|
305
|
+
levelChanged: a.level !== b.level,
|
|
306
|
+
oldLevel: b.level,
|
|
307
|
+
newLevel: a.level,
|
|
308
|
+
vectorChanges: Object.keys(a.vectors).reduce((acc, key) => {
|
|
309
|
+
const oldVal = b.vectors[key]?.weighted || 0;
|
|
310
|
+
const newVal = a.vectors[key]?.weighted || 0;
|
|
311
|
+
if (oldVal !== newVal) {
|
|
312
|
+
acc[key] = { old: oldVal, new: newVal, change: newVal - oldVal };
|
|
313
|
+
}
|
|
314
|
+
return acc;
|
|
315
|
+
}, {}),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
module.exports = {
|
|
320
|
+
calculateRiskScore,
|
|
321
|
+
quickAssess,
|
|
322
|
+
buildContext,
|
|
323
|
+
getDomainBreakdown,
|
|
324
|
+
formatRiskScore,
|
|
325
|
+
compareScores,
|
|
326
|
+
RISK_VECTORS,
|
|
327
|
+
RISK_LEVELS,
|
|
328
|
+
};
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk Thresholds
|
|
3
|
+
*
|
|
4
|
+
* Configurable thresholds for risk-based decisions.
|
|
5
|
+
* These can be overridden in policy configuration.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Default threshold configuration
|
|
12
|
+
*
|
|
13
|
+
* Tuned to reduce false positives while maintaining security.
|
|
14
|
+
* Single-file UI/component changes should typically auto-allow.
|
|
15
|
+
* Multi-file changes to core/auth/payments require confirmation.
|
|
16
|
+
* Only block truly dangerous patterns (migrations, mass deletes, etc.)
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_THRESHOLDS = {
|
|
19
|
+
/**
|
|
20
|
+
* Score thresholds for automatic decisions
|
|
21
|
+
* Raised significantly to focus only on real issues (hallucinations, drift)
|
|
22
|
+
* Normal development changes should almost never trigger
|
|
23
|
+
*/
|
|
24
|
+
autoAllow: 50, // Auto-allow if score <= this (raised from 30)
|
|
25
|
+
requireConfirm: 85, // Require confirmation if score > this (raised from 70)
|
|
26
|
+
autoBlock: 120, // Auto-block if score >= this (raised from 100)
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Vector-specific thresholds
|
|
30
|
+
*/
|
|
31
|
+
vectors: {
|
|
32
|
+
surface_area: {
|
|
33
|
+
warn: 10,
|
|
34
|
+
block: 25,
|
|
35
|
+
},
|
|
36
|
+
blast_radius: {
|
|
37
|
+
warn: 30,
|
|
38
|
+
block: 60,
|
|
39
|
+
},
|
|
40
|
+
irreversibility: {
|
|
41
|
+
warn: 25,
|
|
42
|
+
block: 50,
|
|
43
|
+
},
|
|
44
|
+
confidence: {
|
|
45
|
+
warn: 20,
|
|
46
|
+
block: 60,
|
|
47
|
+
},
|
|
48
|
+
novelty: {
|
|
49
|
+
warn: 20,
|
|
50
|
+
block: 40,
|
|
51
|
+
},
|
|
52
|
+
domain: {
|
|
53
|
+
warn: 30,
|
|
54
|
+
block: 60,
|
|
55
|
+
},
|
|
56
|
+
side_effects: {
|
|
57
|
+
warn: 20,
|
|
58
|
+
block: 50,
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Domain-specific thresholds
|
|
64
|
+
* Multipliers reduced to prevent over-penalization of normal changes
|
|
65
|
+
*/
|
|
66
|
+
domains: {
|
|
67
|
+
auth: {
|
|
68
|
+
multiplier: 1.2, // Reduced from 1.5 - auth changes are common
|
|
69
|
+
requireConfirm: 50, // Raised from 30
|
|
70
|
+
autoBlock: 90, // Raised from 60
|
|
71
|
+
},
|
|
72
|
+
payments: {
|
|
73
|
+
multiplier: 1.3, // Reduced from 1.8 - payments needs care but not blocking
|
|
74
|
+
requireConfirm: 45, // Raised from 25
|
|
75
|
+
autoBlock: 85, // Raised from 50
|
|
76
|
+
},
|
|
77
|
+
database: {
|
|
78
|
+
multiplier: 1.1, // Reduced from 1.3 - DB changes are normal
|
|
79
|
+
requireConfirm: 55, // Raised from 40
|
|
80
|
+
autoBlock: 95, // Raised from 70
|
|
81
|
+
},
|
|
82
|
+
security: {
|
|
83
|
+
multiplier: 1.2, // Reduced from 1.6
|
|
84
|
+
requireConfirm: 50, // Raised from 25
|
|
85
|
+
autoBlock: 90, // Raised from 55
|
|
86
|
+
},
|
|
87
|
+
core: {
|
|
88
|
+
multiplier: 1.1, // Reduced from 1.2
|
|
89
|
+
requireConfirm: 60, // Raised from 45
|
|
90
|
+
autoBlock: 95, // Raised from 75
|
|
91
|
+
},
|
|
92
|
+
middleware: {
|
|
93
|
+
multiplier: 1.0, // Reduced from 1.1 - middleware is usually safe
|
|
94
|
+
requireConfirm: 65, // Raised from 50
|
|
95
|
+
autoBlock: 100, // Raised from 80
|
|
96
|
+
},
|
|
97
|
+
ui: {
|
|
98
|
+
multiplier: 0.7, // Reduced from 0.8 - UI is very safe
|
|
99
|
+
requireConfirm: 80, // Raised from 60
|
|
100
|
+
autoBlock: 120, // Raised from 90 - UI should almost never block
|
|
101
|
+
},
|
|
102
|
+
test: {
|
|
103
|
+
multiplier: 0.3, // Reduced from 0.5 - tests are safest
|
|
104
|
+
requireConfirm: 100, // Raised from 70
|
|
105
|
+
autoBlock: 150, // Raised from 95 - tests should never block
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* File count limits
|
|
111
|
+
*/
|
|
112
|
+
fileLimits: {
|
|
113
|
+
warn: 5,
|
|
114
|
+
block: 15,
|
|
115
|
+
hardLimit: 50,
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Line count limits
|
|
120
|
+
*/
|
|
121
|
+
lineLimits: {
|
|
122
|
+
warn: 200,
|
|
123
|
+
block: 500,
|
|
124
|
+
hardLimit: 2000,
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Profile presets
|
|
130
|
+
*/
|
|
131
|
+
const THRESHOLD_PROFILES = {
|
|
132
|
+
/**
|
|
133
|
+
* Strict profile - very conservative
|
|
134
|
+
*/
|
|
135
|
+
strict: {
|
|
136
|
+
autoAllow: 10,
|
|
137
|
+
requireConfirm: 30,
|
|
138
|
+
autoBlock: 60,
|
|
139
|
+
fileLimits: {
|
|
140
|
+
warn: 3,
|
|
141
|
+
block: 8,
|
|
142
|
+
hardLimit: 20,
|
|
143
|
+
},
|
|
144
|
+
lineLimits: {
|
|
145
|
+
warn: 100,
|
|
146
|
+
block: 300,
|
|
147
|
+
hardLimit: 1000,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Balanced profile - default
|
|
153
|
+
*/
|
|
154
|
+
balanced: {
|
|
155
|
+
...DEFAULT_THRESHOLDS,
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Permissive profile - more lenient
|
|
160
|
+
*/
|
|
161
|
+
permissive: {
|
|
162
|
+
autoAllow: 25,
|
|
163
|
+
requireConfirm: 70,
|
|
164
|
+
autoBlock: 95,
|
|
165
|
+
fileLimits: {
|
|
166
|
+
warn: 10,
|
|
167
|
+
block: 25,
|
|
168
|
+
hardLimit: 100,
|
|
169
|
+
},
|
|
170
|
+
lineLimits: {
|
|
171
|
+
warn: 500,
|
|
172
|
+
block: 1000,
|
|
173
|
+
hardLimit: 5000,
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Repo-lock profile - most conservative
|
|
179
|
+
*/
|
|
180
|
+
"repo-lock": {
|
|
181
|
+
autoAllow: 5,
|
|
182
|
+
requireConfirm: 15,
|
|
183
|
+
autoBlock: 40,
|
|
184
|
+
fileLimits: {
|
|
185
|
+
warn: 2,
|
|
186
|
+
block: 5,
|
|
187
|
+
hardLimit: 10,
|
|
188
|
+
},
|
|
189
|
+
lineLimits: {
|
|
190
|
+
warn: 50,
|
|
191
|
+
block: 150,
|
|
192
|
+
hardLimit: 500,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Load thresholds from policy
|
|
199
|
+
* @param {Object} policy - Policy configuration
|
|
200
|
+
* @returns {Object} Merged threshold configuration
|
|
201
|
+
*/
|
|
202
|
+
function loadThresholds(policy = {}) {
|
|
203
|
+
// Start with default
|
|
204
|
+
let thresholds = { ...DEFAULT_THRESHOLDS };
|
|
205
|
+
|
|
206
|
+
// Apply profile if specified
|
|
207
|
+
const profile = policy.profile || "balanced";
|
|
208
|
+
if (THRESHOLD_PROFILES[profile]) {
|
|
209
|
+
thresholds = mergeDeep(thresholds, THRESHOLD_PROFILES[profile]);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Apply custom thresholds from policy
|
|
213
|
+
if (policy.thresholds) {
|
|
214
|
+
thresholds = mergeDeep(thresholds, policy.thresholds);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Apply risk configuration
|
|
218
|
+
if (policy.risk) {
|
|
219
|
+
if (policy.risk.autoAllow !== undefined) thresholds.autoAllow = policy.risk.autoAllow;
|
|
220
|
+
if (policy.risk.requireConfirm !== undefined) thresholds.requireConfirm = policy.risk.requireConfirm;
|
|
221
|
+
if (policy.risk.autoBlock !== undefined) thresholds.autoBlock = policy.risk.autoBlock;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return thresholds;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Deep merge objects
|
|
229
|
+
*/
|
|
230
|
+
function mergeDeep(target, source) {
|
|
231
|
+
const output = { ...target };
|
|
232
|
+
|
|
233
|
+
for (const key of Object.keys(source)) {
|
|
234
|
+
if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
|
|
235
|
+
output[key] = mergeDeep(output[key] || {}, source[key]);
|
|
236
|
+
} else {
|
|
237
|
+
output[key] = source[key];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return output;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Get decision based on score and thresholds
|
|
246
|
+
* @param {number} score - Risk score
|
|
247
|
+
* @param {Object} thresholds - Threshold configuration
|
|
248
|
+
* @param {string[]} domains - Affected domains
|
|
249
|
+
* @returns {Object} Decision object
|
|
250
|
+
*/
|
|
251
|
+
function getDecision(score, thresholds, domains = []) {
|
|
252
|
+
// Check for domain-specific overrides
|
|
253
|
+
let effectiveThresholds = { ...thresholds };
|
|
254
|
+
let maxMultiplier = 1;
|
|
255
|
+
|
|
256
|
+
for (const domain of domains) {
|
|
257
|
+
const domainConfig = thresholds.domains?.[domain];
|
|
258
|
+
if (domainConfig) {
|
|
259
|
+
if (domainConfig.multiplier > maxMultiplier) {
|
|
260
|
+
maxMultiplier = domainConfig.multiplier;
|
|
261
|
+
}
|
|
262
|
+
// Use the most restrictive domain threshold
|
|
263
|
+
if (domainConfig.autoBlock < effectiveThresholds.autoBlock) {
|
|
264
|
+
effectiveThresholds.autoBlock = domainConfig.autoBlock;
|
|
265
|
+
}
|
|
266
|
+
if (domainConfig.requireConfirm < effectiveThresholds.requireConfirm) {
|
|
267
|
+
effectiveThresholds.requireConfirm = domainConfig.requireConfirm;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Apply domain multiplier to score
|
|
273
|
+
const effectiveScore = Math.round(score * maxMultiplier);
|
|
274
|
+
|
|
275
|
+
// Determine decision
|
|
276
|
+
if (effectiveScore >= effectiveThresholds.autoBlock) {
|
|
277
|
+
return {
|
|
278
|
+
decision: "BLOCK",
|
|
279
|
+
reason: `Risk score ${effectiveScore} exceeds auto-block threshold ${effectiveThresholds.autoBlock}`,
|
|
280
|
+
score: effectiveScore,
|
|
281
|
+
multiplier: maxMultiplier,
|
|
282
|
+
thresholdUsed: effectiveThresholds.autoBlock,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (effectiveScore > effectiveThresholds.requireConfirm) {
|
|
287
|
+
return {
|
|
288
|
+
decision: "REQUIRE_CONFIRMATION",
|
|
289
|
+
reason: `Risk score ${effectiveScore} exceeds confirmation threshold ${effectiveThresholds.requireConfirm}`,
|
|
290
|
+
score: effectiveScore,
|
|
291
|
+
multiplier: maxMultiplier,
|
|
292
|
+
thresholdUsed: effectiveThresholds.requireConfirm,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (effectiveScore <= effectiveThresholds.autoAllow) {
|
|
297
|
+
return {
|
|
298
|
+
decision: "ALLOW",
|
|
299
|
+
reason: `Risk score ${effectiveScore} within auto-allow threshold ${effectiveThresholds.autoAllow}`,
|
|
300
|
+
score: effectiveScore,
|
|
301
|
+
multiplier: maxMultiplier,
|
|
302
|
+
thresholdUsed: effectiveThresholds.autoAllow,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Default to allow with warning for scores in between
|
|
307
|
+
return {
|
|
308
|
+
decision: "ALLOW_WITH_WARNING",
|
|
309
|
+
reason: `Risk score ${effectiveScore} is elevated but within limits`,
|
|
310
|
+
score: effectiveScore,
|
|
311
|
+
multiplier: maxMultiplier,
|
|
312
|
+
thresholdUsed: effectiveThresholds.requireConfirm,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
module.exports = {
|
|
317
|
+
DEFAULT_THRESHOLDS,
|
|
318
|
+
THRESHOLD_PROFILES,
|
|
319
|
+
loadThresholds,
|
|
320
|
+
getDecision,
|
|
321
|
+
mergeDeep,
|
|
322
|
+
};
|