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,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verdict System v2 - Deterministic Enforcement Verdicts
|
|
3
|
+
*
|
|
4
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
+
* AGENT FIREWALL™ - VERDICT SYSTEM
|
|
6
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
7
|
+
*
|
|
8
|
+
* Every Agent Firewall run MUST end in exactly one verdict:
|
|
9
|
+
* - PASS (intent + proof satisfied)
|
|
10
|
+
* - BLOCK (default on any violation)
|
|
11
|
+
*
|
|
12
|
+
* NO "partial success".
|
|
13
|
+
* NO "best effort".
|
|
14
|
+
* NO "WARN" as a final state in ENFORCE mode.
|
|
15
|
+
*
|
|
16
|
+
* Verdicts are:
|
|
17
|
+
* - Deterministic
|
|
18
|
+
* - Signed/hashed
|
|
19
|
+
* - Stored for reuse
|
|
20
|
+
*
|
|
21
|
+
* @module enforcement/verdict-v2
|
|
22
|
+
* @version 2.0.0
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
"use strict";
|
|
26
|
+
|
|
27
|
+
const crypto = require("crypto");
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Verdict decisions - only two options
|
|
31
|
+
*/
|
|
32
|
+
const VERDICT = {
|
|
33
|
+
PASS: "PASS",
|
|
34
|
+
BLOCK: "BLOCK",
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Observation decision (for OBSERVE mode only)
|
|
39
|
+
*/
|
|
40
|
+
const OBSERVATION = {
|
|
41
|
+
WOULD_PASS: "WOULD_PASS",
|
|
42
|
+
WOULD_BLOCK: "WOULD_BLOCK",
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Firewall modes
|
|
47
|
+
*/
|
|
48
|
+
const MODE = {
|
|
49
|
+
ENFORCE: "ENFORCE", // Default: block on violation
|
|
50
|
+
OBSERVE: "OBSERVE", // Log + warn only (returns WOULD_* verdicts)
|
|
51
|
+
CI: "CI", // Fail pipeline on BLOCK
|
|
52
|
+
IDE: "IDE", // Real-time interception, block writes
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Verdict object structure
|
|
57
|
+
* @typedef {Object} Verdict
|
|
58
|
+
* @property {string} decision - PASS or BLOCK
|
|
59
|
+
* @property {string} mode - Mode used for evaluation
|
|
60
|
+
* @property {Object[]} violations - All violations found
|
|
61
|
+
* @property {Object[]} proofs - All proofs collected
|
|
62
|
+
* @property {string} intent_hash - Hash of intent used
|
|
63
|
+
* @property {string} verdict_hash - Hash of entire verdict for signing
|
|
64
|
+
* @property {string} timestamp - ISO timestamp
|
|
65
|
+
* @property {string} id - Unique verdict ID
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Generate verdict ID
|
|
70
|
+
* @returns {string} Unique verdict ID
|
|
71
|
+
*/
|
|
72
|
+
function generateVerdictId() {
|
|
73
|
+
return `vrd-${Date.now().toString(36)}-${crypto.randomBytes(4).toString("hex")}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Compute verdict hash for integrity/signing
|
|
78
|
+
* @param {Object} verdict - Verdict object (without hash)
|
|
79
|
+
* @returns {string} SHA-256 hash
|
|
80
|
+
*/
|
|
81
|
+
function computeVerdictHash(verdict) {
|
|
82
|
+
const content = JSON.stringify({
|
|
83
|
+
decision: verdict.decision,
|
|
84
|
+
mode: verdict.mode,
|
|
85
|
+
violations: verdict.violations.map(v => ({
|
|
86
|
+
code: v.code,
|
|
87
|
+
resource: v.resource,
|
|
88
|
+
})),
|
|
89
|
+
proofs: verdict.proofs.map(p => ({
|
|
90
|
+
id: p.id,
|
|
91
|
+
status: p.status,
|
|
92
|
+
})),
|
|
93
|
+
intent_hash: verdict.intent_hash,
|
|
94
|
+
timestamp: verdict.timestamp,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
return crypto.createHash("sha256").update(content).digest("hex");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Generate deterministic verdict from alignment and proof results
|
|
102
|
+
*
|
|
103
|
+
* RULES:
|
|
104
|
+
* - If ANY violation exists → BLOCK
|
|
105
|
+
* - If ANY required proof failed → BLOCK
|
|
106
|
+
* - If intent is missing → BLOCK
|
|
107
|
+
* - Only if ALL checks pass → PASS
|
|
108
|
+
*
|
|
109
|
+
* @param {Object} params - Verdict parameters
|
|
110
|
+
* @param {Object} params.alignmentResult - Result from alignment engine
|
|
111
|
+
* @param {Object[]} params.proofs - Array of proof artifacts
|
|
112
|
+
* @param {string} params.mode - Firewall mode
|
|
113
|
+
* @param {string} params.intent_hash - Hash of intent used
|
|
114
|
+
* @returns {Verdict} Final verdict
|
|
115
|
+
*/
|
|
116
|
+
function generateVerdict({ alignmentResult, proofs = [], mode = MODE.ENFORCE, intent_hash = null }) {
|
|
117
|
+
const timestamp = new Date().toISOString();
|
|
118
|
+
const id = generateVerdictId();
|
|
119
|
+
|
|
120
|
+
// Collect all violations
|
|
121
|
+
const violations = alignmentResult?.violations || [];
|
|
122
|
+
|
|
123
|
+
// Check for failed proofs
|
|
124
|
+
const failedProofs = proofs.filter(p => p.status === "failed" || p.status === "unverified");
|
|
125
|
+
for (const proof of failedProofs) {
|
|
126
|
+
violations.push({
|
|
127
|
+
code: "PROOF_FAILED",
|
|
128
|
+
rule: `proof_${proof.type}`,
|
|
129
|
+
message: `Required proof failed: ${proof.type} - ${proof.id}`,
|
|
130
|
+
resource: proof.target || "unknown",
|
|
131
|
+
intent_ref: "reality_proof",
|
|
132
|
+
severity: "block",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Determine decision
|
|
137
|
+
// In ENFORCE/CI mode: any violation = BLOCK
|
|
138
|
+
// In OBSERVE mode: violations generate WOULD_BLOCK but don't actually block
|
|
139
|
+
let decision;
|
|
140
|
+
|
|
141
|
+
if (mode === MODE.OBSERVE) {
|
|
142
|
+
decision = violations.length > 0 ? OBSERVATION.WOULD_BLOCK : OBSERVATION.WOULD_PASS;
|
|
143
|
+
} else {
|
|
144
|
+
// ENFORCE, CI, IDE - strict enforcement
|
|
145
|
+
decision = violations.length > 0 ? VERDICT.BLOCK : VERDICT.PASS;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const verdict = {
|
|
149
|
+
id,
|
|
150
|
+
decision,
|
|
151
|
+
mode,
|
|
152
|
+
violations,
|
|
153
|
+
proofs: proofs.map(p => ({
|
|
154
|
+
id: p.id,
|
|
155
|
+
type: p.type,
|
|
156
|
+
status: p.status,
|
|
157
|
+
trace: p.trace,
|
|
158
|
+
})),
|
|
159
|
+
intent_hash,
|
|
160
|
+
timestamp,
|
|
161
|
+
verdict_hash: "", // Will be computed
|
|
162
|
+
|
|
163
|
+
// Summary for humans
|
|
164
|
+
summary: generateSummary(decision, violations, proofs),
|
|
165
|
+
|
|
166
|
+
// Machine-readable status
|
|
167
|
+
passed: decision === VERDICT.PASS || decision === OBSERVATION.WOULD_PASS,
|
|
168
|
+
blocked: decision === VERDICT.BLOCK || decision === OBSERVATION.WOULD_BLOCK,
|
|
169
|
+
violation_count: violations.length,
|
|
170
|
+
proof_count: proofs.length,
|
|
171
|
+
failed_proof_count: failedProofs.length,
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Compute and set hash
|
|
175
|
+
verdict.verdict_hash = computeVerdictHash(verdict);
|
|
176
|
+
|
|
177
|
+
return verdict;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Generate human-readable summary
|
|
182
|
+
* @param {string} decision - Verdict decision
|
|
183
|
+
* @param {Object[]} violations - Violations array
|
|
184
|
+
* @param {Object[]} proofs - Proofs array
|
|
185
|
+
* @returns {string} Summary text
|
|
186
|
+
*/
|
|
187
|
+
function generateSummary(decision, violations, proofs) {
|
|
188
|
+
if (decision === VERDICT.PASS || decision === OBSERVATION.WOULD_PASS) {
|
|
189
|
+
return `All checks passed. Intent aligned, ${proofs.length} proofs verified.`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const violationSummary = violations.slice(0, 3)
|
|
193
|
+
.map(v => v.message)
|
|
194
|
+
.join("; ");
|
|
195
|
+
|
|
196
|
+
const extra = violations.length > 3 ? ` (+${violations.length - 3} more)` : "";
|
|
197
|
+
|
|
198
|
+
return `BLOCKED: ${violations.length} violation(s). ${violationSummary}${extra}`;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Generate block message with exact reason and reference
|
|
203
|
+
* @param {Object[]} violations - Violations array
|
|
204
|
+
* @returns {string} Formatted block message
|
|
205
|
+
*/
|
|
206
|
+
function formatBlockMessage(violations) {
|
|
207
|
+
if (violations.length === 0) {
|
|
208
|
+
return "BLOCKED_BY_AGENT_FIREWALL: Unknown reason";
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const lines = ["BLOCKED_BY_AGENT_FIREWALL:"];
|
|
212
|
+
|
|
213
|
+
for (const violation of violations) {
|
|
214
|
+
lines.push(`- reason: ${violation.code}`);
|
|
215
|
+
lines.push(` resource: ${violation.resource}`);
|
|
216
|
+
lines.push(` intent_ref: ${violation.intent_ref}`);
|
|
217
|
+
if (violation.message) {
|
|
218
|
+
lines.push(` message: ${violation.message}`);
|
|
219
|
+
}
|
|
220
|
+
lines.push("");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return lines.join("\n");
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Verify verdict integrity
|
|
228
|
+
* @param {Object} verdict - Verdict to verify
|
|
229
|
+
* @returns {Object} Verification result
|
|
230
|
+
*/
|
|
231
|
+
function verifyVerdictIntegrity(verdict) {
|
|
232
|
+
if (!verdict || !verdict.verdict_hash) {
|
|
233
|
+
return {
|
|
234
|
+
valid: false,
|
|
235
|
+
reason: "MISSING_HASH",
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const computed = computeVerdictHash(verdict);
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
valid: computed === verdict.verdict_hash,
|
|
243
|
+
reason: computed === verdict.verdict_hash ? "VERIFIED" : "HASH_MISMATCH",
|
|
244
|
+
computed_hash: computed,
|
|
245
|
+
stored_hash: verdict.verdict_hash,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Convert legacy verdict (ALLOW/WARN/BLOCK) to v2 format
|
|
251
|
+
* @param {Object} legacyVerdict - Legacy verdict object
|
|
252
|
+
* @param {string} mode - Firewall mode
|
|
253
|
+
* @returns {Verdict} V2 verdict
|
|
254
|
+
*/
|
|
255
|
+
function convertLegacyVerdict(legacyVerdict, mode = MODE.ENFORCE) {
|
|
256
|
+
const violations = (legacyVerdict.violations || []).map(v => ({
|
|
257
|
+
code: v.rule?.toUpperCase().replace(/-/g, "_") || "UNKNOWN",
|
|
258
|
+
rule: v.rule || "unknown",
|
|
259
|
+
message: v.message || "No message",
|
|
260
|
+
resource: v.claimId || v.file || "unknown",
|
|
261
|
+
intent_ref: "legacy",
|
|
262
|
+
severity: v.severity || "block",
|
|
263
|
+
}));
|
|
264
|
+
|
|
265
|
+
// In v2, WARN becomes BLOCK in ENFORCE mode
|
|
266
|
+
let decision;
|
|
267
|
+
if (mode === MODE.OBSERVE) {
|
|
268
|
+
decision = legacyVerdict.decision === "ALLOW"
|
|
269
|
+
? OBSERVATION.WOULD_PASS
|
|
270
|
+
: OBSERVATION.WOULD_BLOCK;
|
|
271
|
+
} else {
|
|
272
|
+
// ALLOW stays PASS, WARN and BLOCK become BLOCK
|
|
273
|
+
decision = legacyVerdict.decision === "ALLOW" ? VERDICT.PASS : VERDICT.BLOCK;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return generateVerdict({
|
|
277
|
+
alignmentResult: { violations },
|
|
278
|
+
proofs: [],
|
|
279
|
+
mode,
|
|
280
|
+
intent_hash: null,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Create verdict manifest for artifact storage
|
|
286
|
+
* @param {Object} verdict - Verdict object
|
|
287
|
+
* @param {Object} metadata - Additional metadata
|
|
288
|
+
* @returns {Object} Manifest object
|
|
289
|
+
*/
|
|
290
|
+
function createVerdictManifest(verdict, metadata = {}) {
|
|
291
|
+
return {
|
|
292
|
+
schema_version: "2.0.0",
|
|
293
|
+
verdict: {
|
|
294
|
+
id: verdict.id,
|
|
295
|
+
decision: verdict.decision,
|
|
296
|
+
hash: verdict.verdict_hash,
|
|
297
|
+
timestamp: verdict.timestamp,
|
|
298
|
+
},
|
|
299
|
+
intent: {
|
|
300
|
+
hash: verdict.intent_hash,
|
|
301
|
+
},
|
|
302
|
+
violations: verdict.violations.map(v => ({
|
|
303
|
+
code: v.code,
|
|
304
|
+
resource: v.resource,
|
|
305
|
+
intent_ref: v.intent_ref,
|
|
306
|
+
})),
|
|
307
|
+
proofs: verdict.proofs.map(p => ({
|
|
308
|
+
id: p.id,
|
|
309
|
+
type: p.type,
|
|
310
|
+
status: p.status,
|
|
311
|
+
})),
|
|
312
|
+
summary: verdict.summary,
|
|
313
|
+
metadata: {
|
|
314
|
+
mode: verdict.mode,
|
|
315
|
+
...metadata,
|
|
316
|
+
},
|
|
317
|
+
created_at: new Date().toISOString(),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
module.exports = {
|
|
322
|
+
VERDICT,
|
|
323
|
+
OBSERVATION,
|
|
324
|
+
MODE,
|
|
325
|
+
generateVerdict,
|
|
326
|
+
generateVerdictId,
|
|
327
|
+
computeVerdictHash,
|
|
328
|
+
verifyVerdictIntegrity,
|
|
329
|
+
formatBlockMessage,
|
|
330
|
+
generateSummary,
|
|
331
|
+
convertLegacyVerdict,
|
|
332
|
+
createVerdictManifest,
|
|
333
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Evidence Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves auth claims against truthpack.auth.json
|
|
5
|
+
* Checks for auth drift (claimed restriction not enforced).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const { getAuthRules } = require("../truthpack");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Resolve auth claim evidence
|
|
14
|
+
* @param {string} projectRoot - Project root directory
|
|
15
|
+
* @param {object} claim - Auth claim
|
|
16
|
+
* @returns {object} Evidence result
|
|
17
|
+
*/
|
|
18
|
+
function resolve(projectRoot, claim) {
|
|
19
|
+
const authData = getAuthRules(projectRoot);
|
|
20
|
+
|
|
21
|
+
// Extract auth keywords from claim value
|
|
22
|
+
const claimText = claim.value.toLowerCase();
|
|
23
|
+
const hasAuthKeywords = /\b(admin|owner|staff|role|scope|permission|auth|authorize|rbac)\b/i.test(claimText);
|
|
24
|
+
|
|
25
|
+
if (!hasAuthKeywords) {
|
|
26
|
+
// Not an auth-related claim
|
|
27
|
+
return {
|
|
28
|
+
result: "PROVEN",
|
|
29
|
+
sources: [],
|
|
30
|
+
reason: "No auth keywords detected in claim"
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Check if auth middleware exists
|
|
35
|
+
const nextMiddleware = authData.nextMiddleware || [];
|
|
36
|
+
const fastifyHooks = authData.fastify?.hooks || [];
|
|
37
|
+
|
|
38
|
+
if (nextMiddleware.length > 0 || fastifyHooks.length > 0) {
|
|
39
|
+
// Auth infrastructure exists
|
|
40
|
+
// Check if claim matches protected patterns
|
|
41
|
+
const matcherPatterns = authData.nextMatcherPatterns || [];
|
|
42
|
+
const claimFile = claim.file || "";
|
|
43
|
+
|
|
44
|
+
// Check if file is in protected path
|
|
45
|
+
const isProtected = matcherPatterns.some(pattern => {
|
|
46
|
+
// Simple pattern matching
|
|
47
|
+
if (pattern.includes("*")) {
|
|
48
|
+
const regex = new RegExp(pattern.replace(/\*/g, ".*"));
|
|
49
|
+
return regex.test(claimFile);
|
|
50
|
+
}
|
|
51
|
+
return claimFile.includes(pattern);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
if (isProtected) {
|
|
55
|
+
return {
|
|
56
|
+
result: "PROVEN",
|
|
57
|
+
sources: [{
|
|
58
|
+
type: "truthpack.auth",
|
|
59
|
+
pointer: claim.pointer,
|
|
60
|
+
confidence: 0.8
|
|
61
|
+
}],
|
|
62
|
+
reason: "Auth claim matches protected route pattern"
|
|
63
|
+
};
|
|
64
|
+
} else {
|
|
65
|
+
// Auth keywords present but route not protected - potential drift
|
|
66
|
+
return {
|
|
67
|
+
result: "CONTRADICTS",
|
|
68
|
+
sources: [{
|
|
69
|
+
type: "truthpack.auth",
|
|
70
|
+
pointer: claim.pointer,
|
|
71
|
+
confidence: 0.7
|
|
72
|
+
}],
|
|
73
|
+
reason: "Auth keywords present but route not in protected patterns (auth drift)"
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
// No auth infrastructure - cannot verify
|
|
78
|
+
return {
|
|
79
|
+
result: "UNPROVEN",
|
|
80
|
+
sources: [],
|
|
81
|
+
reason: "No auth middleware found in truthpack"
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
module.exports = {
|
|
87
|
+
resolve
|
|
88
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Evidence Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves contract claims against truthpack.contracts.json
|
|
5
|
+
* Checks for contract drift (API shape mismatch).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const { getContracts } = require("../truthpack");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Resolve contract claim evidence
|
|
14
|
+
* @param {string} projectRoot - Project root directory
|
|
15
|
+
* @param {object} claim - Contract claim
|
|
16
|
+
* @returns {object} Evidence result
|
|
17
|
+
*/
|
|
18
|
+
function resolve(projectRoot, claim) {
|
|
19
|
+
const contracts = getContracts(projectRoot);
|
|
20
|
+
|
|
21
|
+
// Extract contract identifier from claim
|
|
22
|
+
// Contract claims might reference API endpoints, types, or schemas
|
|
23
|
+
const claimValue = claim.value.toLowerCase();
|
|
24
|
+
|
|
25
|
+
// Check if contracts exist
|
|
26
|
+
if (!contracts || Object.keys(contracts).length === 0) {
|
|
27
|
+
return {
|
|
28
|
+
result: "UNPROVEN",
|
|
29
|
+
sources: [],
|
|
30
|
+
reason: "No contracts found in truthpack"
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Try to match claim against contract definitions
|
|
35
|
+
// This is a simplified check - full implementation would parse contract schemas
|
|
36
|
+
const contractKeys = Object.keys(contracts);
|
|
37
|
+
const matchingContract = contractKeys.find(key =>
|
|
38
|
+
key.toLowerCase().includes(claimValue) ||
|
|
39
|
+
claimValue.includes(key.toLowerCase())
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
if (matchingContract) {
|
|
43
|
+
return {
|
|
44
|
+
result: "PROVEN",
|
|
45
|
+
sources: [{
|
|
46
|
+
type: "truthpack.contracts",
|
|
47
|
+
pointer: claim.pointer,
|
|
48
|
+
confidence: 0.8
|
|
49
|
+
}],
|
|
50
|
+
reason: `Contract ${matchingContract} found in truthpack`
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check for contract drift by examining the claim context
|
|
55
|
+
// If claim references an API endpoint, check if contract exists for that endpoint
|
|
56
|
+
if (claimValue.includes("api") || claimValue.includes("endpoint")) {
|
|
57
|
+
// Potential contract drift - endpoint referenced but contract not found
|
|
58
|
+
return {
|
|
59
|
+
result: "CONTRADICTS",
|
|
60
|
+
sources: [],
|
|
61
|
+
reason: "API endpoint referenced but contract not found in truthpack (contract drift)"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Cannot verify contract
|
|
66
|
+
return {
|
|
67
|
+
result: "UNPROVEN",
|
|
68
|
+
sources: [],
|
|
69
|
+
reason: "Contract not found in truthpack"
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = {
|
|
74
|
+
resolve
|
|
75
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Evidence Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves env var claims against truthpack.env.json
|
|
5
|
+
* Checks for ghost env vars (used but not declared).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
const { getEnvVars } = require("../truthpack");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolve env var claim evidence
|
|
16
|
+
* @param {string} projectRoot - Project root directory
|
|
17
|
+
* @param {object} claim - Env var claim
|
|
18
|
+
* @returns {object} Evidence result
|
|
19
|
+
*/
|
|
20
|
+
function resolve(projectRoot, claim) {
|
|
21
|
+
const envData = getEnvVars(projectRoot);
|
|
22
|
+
|
|
23
|
+
// Check declared env vars
|
|
24
|
+
const declared = envData.declared || [];
|
|
25
|
+
const declaredSet = new Set(declared.map(v => v.name || v));
|
|
26
|
+
|
|
27
|
+
// Check declared sources (env.schema.ts, .env.example, etc.)
|
|
28
|
+
const declaredSources = envData.declaredSources || [];
|
|
29
|
+
|
|
30
|
+
const envVarName = claim.value;
|
|
31
|
+
|
|
32
|
+
// Check if env var is declared
|
|
33
|
+
if (declaredSet.has(envVarName)) {
|
|
34
|
+
// Find source file
|
|
35
|
+
const source = declaredSources.find(s =>
|
|
36
|
+
s.vars && s.vars.includes(envVarName)
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
result: "PROVEN",
|
|
41
|
+
sources: [{
|
|
42
|
+
type: "truthpack.env",
|
|
43
|
+
pointer: source ? source.file : claim.pointer,
|
|
44
|
+
confidence: 0.9
|
|
45
|
+
}],
|
|
46
|
+
reason: `Environment variable ${envVarName} found in truthpack`
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Check if env var exists in .env.example or schema files
|
|
51
|
+
// Check multiple possible locations for .env.example
|
|
52
|
+
const envExamplePaths = [
|
|
53
|
+
path.join(projectRoot, ".env.example"),
|
|
54
|
+
path.join(projectRoot, "apps", "web-ui", ".env.example"),
|
|
55
|
+
path.join(projectRoot, "apps", "api", ".env.example")
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
for (const envExamplePath of envExamplePaths) {
|
|
59
|
+
if (fs.existsSync(envExamplePath)) {
|
|
60
|
+
const envExample = fs.readFileSync(envExamplePath, "utf8");
|
|
61
|
+
if (envExample.includes(envVarName)) {
|
|
62
|
+
const relativePath = path.relative(projectRoot, envExamplePath).replace(/\\/g, "/");
|
|
63
|
+
return {
|
|
64
|
+
result: "PROVEN",
|
|
65
|
+
sources: [{
|
|
66
|
+
type: "repo.search",
|
|
67
|
+
pointer: relativePath,
|
|
68
|
+
confidence: 0.7
|
|
69
|
+
}],
|
|
70
|
+
reason: `Environment variable ${envVarName} found in ${relativePath}`
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const envSchemaPath = findEnvSchemaFile(projectRoot);
|
|
77
|
+
|
|
78
|
+
if (envSchemaPath && fs.existsSync(envSchemaPath)) {
|
|
79
|
+
const envSchema = fs.readFileSync(envSchemaPath, "utf8");
|
|
80
|
+
if (envSchema.includes(envVarName)) {
|
|
81
|
+
return {
|
|
82
|
+
result: "PROVEN",
|
|
83
|
+
sources: [{
|
|
84
|
+
type: "repo.search",
|
|
85
|
+
pointer: envSchemaPath,
|
|
86
|
+
confidence: 0.8
|
|
87
|
+
}],
|
|
88
|
+
reason: `Environment variable ${envVarName} found in env schema`
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Not found - ghost env var
|
|
94
|
+
return {
|
|
95
|
+
result: "UNPROVEN",
|
|
96
|
+
sources: [],
|
|
97
|
+
reason: `Environment variable ${envVarName} not declared (ghost env var)`
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Find env schema file (env.schema.ts, env.ts, etc.)
|
|
103
|
+
* @param {string} projectRoot - Project root directory
|
|
104
|
+
* @returns {string|null} Path to schema file or null
|
|
105
|
+
*/
|
|
106
|
+
function findEnvSchemaFile(projectRoot) {
|
|
107
|
+
const candidates = [
|
|
108
|
+
"apps/api/src/config/env.schema.ts",
|
|
109
|
+
"apps/api/src/env.schema.ts",
|
|
110
|
+
"src/config/env.schema.ts",
|
|
111
|
+
"src/env.schema.ts",
|
|
112
|
+
"env.schema.ts"
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
for (const candidate of candidates) {
|
|
116
|
+
const fullPath = path.join(projectRoot, candidate);
|
|
117
|
+
if (fs.existsSync(fullPath)) {
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = {
|
|
126
|
+
resolve
|
|
127
|
+
};
|