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,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Powered False Positive Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Uses AI to analyze code context and determine if a violation is a false positive.
|
|
5
|
+
* Helps reduce false positives by understanding code intent and patterns.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
|
|
13
|
+
// Cache for AI responses to avoid repeated calls
|
|
14
|
+
const aiCache = new Map();
|
|
15
|
+
const CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Analyze if a violation is likely a false positive using AI
|
|
19
|
+
* @param {object} params
|
|
20
|
+
* @param {object} params.violation - Violation object
|
|
21
|
+
* @param {object} params.claim - Original claim
|
|
22
|
+
* @param {string} params.filePath - File path where violation occurred
|
|
23
|
+
* @param {string} params.projectRoot - Project root directory
|
|
24
|
+
* @param {object} params.policy - Policy configuration
|
|
25
|
+
* @returns {Promise<object>} Analysis result with isFalsePositive boolean and confidence
|
|
26
|
+
*/
|
|
27
|
+
async function analyzeFalsePositive({ violation, claim, filePath, projectRoot, policy }) {
|
|
28
|
+
const ruleConfig = policy.rules?.ai_false_positive_detection;
|
|
29
|
+
|
|
30
|
+
// Check if AI analysis is enabled
|
|
31
|
+
if (!ruleConfig || !ruleConfig.enabled) {
|
|
32
|
+
return { isFalsePositive: false, confidence: 0, reason: "AI analysis disabled" };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Check cache first
|
|
36
|
+
const cacheKey = `${violation.rule}|${claim.value}|${filePath}`;
|
|
37
|
+
const cached = aiCache.get(cacheKey);
|
|
38
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
39
|
+
return cached.result;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
// Read the file to get context
|
|
44
|
+
const fullPath = path.join(projectRoot, filePath);
|
|
45
|
+
if (!fs.existsSync(fullPath)) {
|
|
46
|
+
return { isFalsePositive: false, confidence: 0, reason: "File not found" };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const fileContent = fs.readFileSync(fullPath, "utf8");
|
|
50
|
+
const lines = fileContent.split("\n");
|
|
51
|
+
|
|
52
|
+
// Extract context around the violation (10 lines before and after)
|
|
53
|
+
const pointer = claim.pointer || violation.claim?.pointer;
|
|
54
|
+
let startLine = 1;
|
|
55
|
+
let endLine = lines.length;
|
|
56
|
+
|
|
57
|
+
if (pointer) {
|
|
58
|
+
const match = pointer.match(/:(\d+)-(\d+)/);
|
|
59
|
+
if (match) {
|
|
60
|
+
const lineNum = parseInt(match[1], 10);
|
|
61
|
+
startLine = Math.max(1, lineNum - 10);
|
|
62
|
+
endLine = Math.min(lines.length, lineNum + 10);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const context = lines.slice(startLine - 1, endLine).join("\n");
|
|
67
|
+
const lineNumbers = Array.from({ length: endLine - startLine + 1 }, (_, i) => startLine + i);
|
|
68
|
+
const numberedContext = lines.slice(startLine - 1, endLine)
|
|
69
|
+
.map((line, i) => `${lineNumbers[i]}: ${line}`)
|
|
70
|
+
.join("\n");
|
|
71
|
+
|
|
72
|
+
// Build AI prompt
|
|
73
|
+
const prompt = buildAnalysisPrompt({
|
|
74
|
+
violation,
|
|
75
|
+
claim,
|
|
76
|
+
filePath,
|
|
77
|
+
context: numberedContext,
|
|
78
|
+
ruleType: violation.rule
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Try LLM first if enabled, otherwise use heuristics
|
|
82
|
+
let analysis = null;
|
|
83
|
+
if (ruleConfig.useLLM) {
|
|
84
|
+
analysis = await analyzeWithLLM(prompt, ruleConfig);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Fall back to heuristics if LLM not available or failed
|
|
88
|
+
if (!analysis) {
|
|
89
|
+
analysis = await analyzeWithHeuristics({
|
|
90
|
+
violation,
|
|
91
|
+
claim,
|
|
92
|
+
filePath,
|
|
93
|
+
context,
|
|
94
|
+
numberedContext
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Cache result
|
|
99
|
+
aiCache.set(cacheKey, {
|
|
100
|
+
timestamp: Date.now(),
|
|
101
|
+
result: analysis
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return analysis;
|
|
105
|
+
} catch (error) {
|
|
106
|
+
// If AI analysis fails, default to not a false positive
|
|
107
|
+
return {
|
|
108
|
+
isFalsePositive: false,
|
|
109
|
+
confidence: 0,
|
|
110
|
+
reason: `AI analysis failed: ${error.message}`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Build prompt for AI analysis
|
|
117
|
+
*/
|
|
118
|
+
function buildAnalysisPrompt({ violation, claim, filePath, context, ruleType }) {
|
|
119
|
+
return `Analyze this code violation to determine if it's a false positive.
|
|
120
|
+
|
|
121
|
+
Rule: ${ruleType}
|
|
122
|
+
Claim Type: ${claim.type}
|
|
123
|
+
Claim Value: ${claim.value}
|
|
124
|
+
File: ${filePath}
|
|
125
|
+
|
|
126
|
+
Code Context:
|
|
127
|
+
\`\`\`
|
|
128
|
+
${context}
|
|
129
|
+
\`\`\`
|
|
130
|
+
|
|
131
|
+
Question: Is this a false positive? Consider:
|
|
132
|
+
1. Is this an import path being mistaken for a route? (e.g., "from './api/content'")
|
|
133
|
+
2. Is this an external API call that shouldn't be validated? (e.g., "/content/blog" going to backend)
|
|
134
|
+
3. Is this test/fixture code that should be ignored?
|
|
135
|
+
4. Is this a legitimate pattern that the rule doesn't understand?
|
|
136
|
+
|
|
137
|
+
Respond with JSON:
|
|
138
|
+
{
|
|
139
|
+
"isFalsePositive": boolean,
|
|
140
|
+
"confidence": 0.0-1.0,
|
|
141
|
+
"reason": "explanation",
|
|
142
|
+
"suggestedFix": "what to do if false positive"
|
|
143
|
+
}`;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Analyze using heuristics (can be replaced with actual LLM call)
|
|
148
|
+
* This provides immediate value while LLM integration can be added later
|
|
149
|
+
*/
|
|
150
|
+
async function analyzeWithHeuristics({ violation, claim, filePath, context, numberedContext }) {
|
|
151
|
+
const claimValue = String(claim.value || "").trim();
|
|
152
|
+
const filePathLower = filePath.toLowerCase();
|
|
153
|
+
const contextLower = context.toLowerCase();
|
|
154
|
+
|
|
155
|
+
// Heuristic 1: Import paths
|
|
156
|
+
if (claimValue.includes("./") || claimValue.includes("../")) {
|
|
157
|
+
// Check if it's in an import/require statement
|
|
158
|
+
const importPatterns = [
|
|
159
|
+
/from\s+['"]\./,
|
|
160
|
+
/require\(['"]\./,
|
|
161
|
+
/import\s+.*from\s+['"]\./
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
for (const pattern of importPatterns) {
|
|
165
|
+
if (pattern.test(context)) {
|
|
166
|
+
return {
|
|
167
|
+
isFalsePositive: true,
|
|
168
|
+
confidence: 0.95,
|
|
169
|
+
reason: "This appears to be an import path, not a route",
|
|
170
|
+
suggestedFix: "Update route detection to exclude import statements"
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Heuristic 2: External API calls (not starting with /api/)
|
|
177
|
+
if (violation.rule === "ghost_route" && claimValue.startsWith("/")) {
|
|
178
|
+
if (!claimValue.startsWith("/api/")) {
|
|
179
|
+
return {
|
|
180
|
+
isFalsePositive: true,
|
|
181
|
+
confidence: 0.9,
|
|
182
|
+
reason: "This is an external API call to the backend, not a Next.js route",
|
|
183
|
+
suggestedFix: "Only validate Next.js API routes (starting with /api/)"
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Heuristic 3: Test files
|
|
189
|
+
if (filePathLower.includes("test") ||
|
|
190
|
+
filePathLower.includes("spec") ||
|
|
191
|
+
filePathLower.includes("fixture") ||
|
|
192
|
+
filePathLower.includes("mock")) {
|
|
193
|
+
return {
|
|
194
|
+
isFalsePositive: true,
|
|
195
|
+
confidence: 0.85,
|
|
196
|
+
reason: "This is in a test/fixture file",
|
|
197
|
+
suggestedFix: "Add test files to .vibecheckignore"
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Heuristic 4: Comments or strings
|
|
202
|
+
if (claimValue.includes("//") ||
|
|
203
|
+
claimValue.includes("/*") ||
|
|
204
|
+
contextLower.includes(`"${claimValue}"`) ||
|
|
205
|
+
contextLower.includes(`'${claimValue}'`)) {
|
|
206
|
+
// Check if it's in a comment
|
|
207
|
+
const lines = numberedContext.split("\n");
|
|
208
|
+
for (const line of lines) {
|
|
209
|
+
if (line.includes(claimValue)) {
|
|
210
|
+
const beforeValue = line.substring(0, line.indexOf(claimValue));
|
|
211
|
+
if (beforeValue.includes("//") || beforeValue.includes("/*")) {
|
|
212
|
+
return {
|
|
213
|
+
isFalsePositive: true,
|
|
214
|
+
confidence: 0.8,
|
|
215
|
+
reason: "This appears to be in a comment",
|
|
216
|
+
suggestedFix: "Skip route detection in comments"
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Heuristic 5: Environment variable names (for ghost_env)
|
|
224
|
+
if (violation.rule === "ghost_env") {
|
|
225
|
+
// Check if it's a standard/system env var that doesn't need declaration
|
|
226
|
+
const systemEnvVars = [
|
|
227
|
+
"NODE_ENV", "PATH", "HOME", "USER", "SHELL", "TMPDIR",
|
|
228
|
+
"CI", "GITHUB_ACTIONS", "GITLAB_CI", "CIRCLECI", "BUILDKITE",
|
|
229
|
+
"COLORTERM", "TERM", "LANG", "LC_ALL"
|
|
230
|
+
];
|
|
231
|
+
|
|
232
|
+
if (systemEnvVars.includes(claimValue)) {
|
|
233
|
+
return {
|
|
234
|
+
isFalsePositive: true,
|
|
235
|
+
confidence: 0.9,
|
|
236
|
+
reason: "This is a standard system environment variable",
|
|
237
|
+
suggestedFix: "Add system env vars to allowlist"
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Heuristic 6: Success messages in UI components (for fake_success_ui)
|
|
243
|
+
if (violation.rule === "fake_success_ui") {
|
|
244
|
+
// Check if it's just displaying a version number or static text
|
|
245
|
+
if (claimValue.match(/v?\d+\.\d+\.\d+/) || // Version numbers
|
|
246
|
+
claimValue.length < 10) { // Very short messages
|
|
247
|
+
return {
|
|
248
|
+
isFalsePositive: true,
|
|
249
|
+
confidence: 0.7,
|
|
250
|
+
reason: "This appears to be a version number or static text, not a success message",
|
|
251
|
+
suggestedFix: "Improve success message detection to exclude version numbers"
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Default: not a false positive
|
|
257
|
+
return {
|
|
258
|
+
isFalsePositive: false,
|
|
259
|
+
confidence: 0.5,
|
|
260
|
+
reason: "No clear indicators of false positive",
|
|
261
|
+
suggestedFix: null
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Call actual LLM for analysis (when AI is available)
|
|
267
|
+
* Uses OpenAI or Anthropic API directly
|
|
268
|
+
*/
|
|
269
|
+
async function analyzeWithLLM(prompt, config = {}) {
|
|
270
|
+
const { useLLM = false, provider = "openai" } = config;
|
|
271
|
+
|
|
272
|
+
if (!useLLM) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const hasOpenAI = !!process.env.OPENAI_API_KEY;
|
|
277
|
+
const hasAnthropic = !!process.env.ANTHROPIC_API_KEY;
|
|
278
|
+
|
|
279
|
+
if (!hasOpenAI && !hasAnthropic) {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
// Try OpenAI first (default)
|
|
285
|
+
if ((provider === "openai" || !hasAnthropic) && hasOpenAI) {
|
|
286
|
+
return await callOpenAI(prompt);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Try Anthropic
|
|
290
|
+
if ((provider === "anthropic" || !hasOpenAI) && hasAnthropic) {
|
|
291
|
+
return await callAnthropic(prompt);
|
|
292
|
+
}
|
|
293
|
+
} catch (error) {
|
|
294
|
+
// If LLM call fails, fall back to heuristics
|
|
295
|
+
console.warn(`[AI] LLM analysis failed: ${error.message}`);
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Call OpenAI API
|
|
304
|
+
*/
|
|
305
|
+
async function callOpenAI(prompt) {
|
|
306
|
+
const https = require("https");
|
|
307
|
+
const http = require("http");
|
|
308
|
+
|
|
309
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
310
|
+
if (!apiKey) return null;
|
|
311
|
+
|
|
312
|
+
const requestBody = JSON.stringify({
|
|
313
|
+
model: "gpt-4o-mini", // Fast and cheap model
|
|
314
|
+
messages: [
|
|
315
|
+
{
|
|
316
|
+
role: "system",
|
|
317
|
+
content: "You are a code analysis assistant. Analyze if a code violation is a false positive. Respond with JSON only."
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
role: "user",
|
|
321
|
+
content: prompt
|
|
322
|
+
}
|
|
323
|
+
],
|
|
324
|
+
response_format: { type: "json_object" },
|
|
325
|
+
temperature: 0.3,
|
|
326
|
+
max_tokens: 500
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
return new Promise((resolve, reject) => {
|
|
330
|
+
const options = {
|
|
331
|
+
hostname: "api.openai.com",
|
|
332
|
+
path: "/v1/chat/completions",
|
|
333
|
+
method: "POST",
|
|
334
|
+
headers: {
|
|
335
|
+
"Content-Type": "application/json",
|
|
336
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
337
|
+
"Content-Length": Buffer.byteLength(requestBody)
|
|
338
|
+
},
|
|
339
|
+
timeout: 5000
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
const req = https.request(options, (res) => {
|
|
343
|
+
let data = "";
|
|
344
|
+
|
|
345
|
+
res.on("data", (chunk) => {
|
|
346
|
+
data += chunk;
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
res.on("end", () => {
|
|
350
|
+
try {
|
|
351
|
+
const response = JSON.parse(data);
|
|
352
|
+
if (response.error) {
|
|
353
|
+
reject(new Error(response.error.message));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const content = response.choices?.[0]?.message?.content;
|
|
358
|
+
if (!content) {
|
|
359
|
+
resolve(null);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const result = JSON.parse(content);
|
|
364
|
+
resolve(result);
|
|
365
|
+
} catch (error) {
|
|
366
|
+
reject(error);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
req.on("error", reject);
|
|
372
|
+
req.on("timeout", () => {
|
|
373
|
+
req.destroy();
|
|
374
|
+
reject(new Error("Request timeout"));
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
req.write(requestBody);
|
|
378
|
+
req.end();
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Call Anthropic API
|
|
384
|
+
*/
|
|
385
|
+
async function callAnthropic(prompt) {
|
|
386
|
+
const https = require("https");
|
|
387
|
+
|
|
388
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
389
|
+
if (!apiKey) return null;
|
|
390
|
+
|
|
391
|
+
const requestBody = JSON.stringify({
|
|
392
|
+
model: "claude-3-haiku-20240307", // Fast and cheap model
|
|
393
|
+
max_tokens: 500,
|
|
394
|
+
messages: [
|
|
395
|
+
{
|
|
396
|
+
role: "user",
|
|
397
|
+
content: prompt
|
|
398
|
+
}
|
|
399
|
+
],
|
|
400
|
+
system: "You are a code analysis assistant. Analyze if a code violation is a false positive. Respond with JSON only."
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
return new Promise((resolve, reject) => {
|
|
404
|
+
const options = {
|
|
405
|
+
hostname: "api.anthropic.com",
|
|
406
|
+
path: "/v1/messages",
|
|
407
|
+
method: "POST",
|
|
408
|
+
headers: {
|
|
409
|
+
"Content-Type": "application/json",
|
|
410
|
+
"x-api-key": apiKey,
|
|
411
|
+
"anthropic-version": "2023-06-01",
|
|
412
|
+
"Content-Length": Buffer.byteLength(requestBody)
|
|
413
|
+
},
|
|
414
|
+
timeout: 5000
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
const req = https.request(options, (res) => {
|
|
418
|
+
let data = "";
|
|
419
|
+
|
|
420
|
+
res.on("data", (chunk) => {
|
|
421
|
+
data += chunk;
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
res.on("end", () => {
|
|
425
|
+
try {
|
|
426
|
+
const response = JSON.parse(data);
|
|
427
|
+
if (response.error) {
|
|
428
|
+
reject(new Error(response.error.message));
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const content = response.content?.[0]?.text;
|
|
433
|
+
if (!content) {
|
|
434
|
+
resolve(null);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Extract JSON from response (might be wrapped in markdown)
|
|
439
|
+
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
|
440
|
+
if (!jsonMatch) {
|
|
441
|
+
resolve(null);
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
const result = JSON.parse(jsonMatch[0]);
|
|
446
|
+
resolve(result);
|
|
447
|
+
} catch (error) {
|
|
448
|
+
reject(error);
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
req.on("error", reject);
|
|
454
|
+
req.on("timeout", () => {
|
|
455
|
+
req.destroy();
|
|
456
|
+
reject(new Error("Request timeout"));
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
req.write(requestBody);
|
|
460
|
+
req.end();
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Clear AI cache (useful for testing)
|
|
466
|
+
*/
|
|
467
|
+
function clearCache() {
|
|
468
|
+
aiCache.clear();
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
module.exports = {
|
|
472
|
+
analyzeFalsePositive,
|
|
473
|
+
clearCache
|
|
474
|
+
};
|