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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Truthpack Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads truthpack files from .vibecheck/truthpack/
|
|
5
|
+
* Caches for performance and validates freshness.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
|
|
13
|
+
const TRUTHPACK_DIR = ".vibecheck/truthpack";
|
|
14
|
+
const STALE_AFTER_HOURS = 24;
|
|
15
|
+
|
|
16
|
+
let cache = {
|
|
17
|
+
routes: null,
|
|
18
|
+
env: null,
|
|
19
|
+
auth: null,
|
|
20
|
+
contracts: null,
|
|
21
|
+
loadedAt: null
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Load truthpack from project root
|
|
26
|
+
* @param {string} projectRoot - Project root directory
|
|
27
|
+
* @param {boolean} forceRefresh - Force reload even if cached
|
|
28
|
+
* @returns {object} Truthpack data
|
|
29
|
+
*/
|
|
30
|
+
function loadTruthpack(projectRoot, forceRefresh = false) {
|
|
31
|
+
const truthpackPath = path.join(projectRoot, TRUTHPACK_DIR);
|
|
32
|
+
|
|
33
|
+
// Check cache freshness
|
|
34
|
+
if (!forceRefresh && cache.loadedAt) {
|
|
35
|
+
const ageHours = (Date.now() - cache.loadedAt) / (1000 * 60 * 60);
|
|
36
|
+
if (ageHours < STALE_AFTER_HOURS && cache.routes !== null) {
|
|
37
|
+
return cache;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const truthpack = {
|
|
42
|
+
routes: loadTruthpackFile(projectRoot, "routes.json"),
|
|
43
|
+
env: loadTruthpackFile(projectRoot, "env.json"),
|
|
44
|
+
auth: loadTruthpackFile(projectRoot, "auth.json"),
|
|
45
|
+
contracts: loadTruthpackFile(projectRoot, "contracts.json"),
|
|
46
|
+
uiGraph: loadTruthpackFile(projectRoot, "ui.graph.json")
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Update cache
|
|
50
|
+
cache = {
|
|
51
|
+
...truthpack,
|
|
52
|
+
loadedAt: Date.now()
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return truthpack;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Load a specific truthpack file
|
|
60
|
+
* @param {string} projectRoot - Project root directory
|
|
61
|
+
* @param {string} filename - Truthpack filename
|
|
62
|
+
* @returns {object|null} Parsed JSON or null if not found
|
|
63
|
+
*/
|
|
64
|
+
function loadTruthpackFile(projectRoot, filename) {
|
|
65
|
+
const filePath = path.join(projectRoot, TRUTHPACK_DIR, filename);
|
|
66
|
+
|
|
67
|
+
if (!fs.existsSync(filePath)) {
|
|
68
|
+
// Fallback: try loading from truthpack.json if routes.json doesn't exist
|
|
69
|
+
if (filename === "routes.json") {
|
|
70
|
+
const truthpackPath = path.join(projectRoot, ".vibecheck", "truthpack.json");
|
|
71
|
+
if (fs.existsSync(truthpackPath)) {
|
|
72
|
+
try {
|
|
73
|
+
const truthpack = JSON.parse(fs.readFileSync(truthpackPath, "utf8"));
|
|
74
|
+
// Extract server routes from truthpack.json format
|
|
75
|
+
if (truthpack.routes && truthpack.routes.server) {
|
|
76
|
+
return {
|
|
77
|
+
routes: truthpack.routes.server.map(r => ({
|
|
78
|
+
path: r.path,
|
|
79
|
+
method: r.method,
|
|
80
|
+
handler: r.handler || r.source
|
|
81
|
+
}))
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
} catch (error) {
|
|
85
|
+
// Fall through to return null
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
94
|
+
} catch (error) {
|
|
95
|
+
console.warn(`Failed to load truthpack file ${filename}: ${error.message}`);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Check if truthpack is fresh
|
|
102
|
+
* @param {string} projectRoot - Project root directory
|
|
103
|
+
* @returns {boolean} True if truthpack exists and is fresh
|
|
104
|
+
*/
|
|
105
|
+
function isTruthpackFresh(projectRoot) {
|
|
106
|
+
const truthpackPath = path.join(projectRoot, TRUTHPACK_DIR);
|
|
107
|
+
const routesPath = path.join(truthpackPath, "routes.json");
|
|
108
|
+
|
|
109
|
+
if (!fs.existsSync(routesPath)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const stats = fs.statSync(routesPath);
|
|
114
|
+
const ageHours = (Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60);
|
|
115
|
+
|
|
116
|
+
return ageHours < STALE_AFTER_HOURS;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Clear truthpack cache
|
|
121
|
+
*/
|
|
122
|
+
function clearCache() {
|
|
123
|
+
cache = {
|
|
124
|
+
routes: null,
|
|
125
|
+
env: null,
|
|
126
|
+
auth: null,
|
|
127
|
+
contracts: null,
|
|
128
|
+
loadedAt: null
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = {
|
|
133
|
+
loadTruthpack,
|
|
134
|
+
loadTruthpackFile,
|
|
135
|
+
isTruthpackFresh,
|
|
136
|
+
clearCache
|
|
137
|
+
};
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Unblock Planner
|
|
3
|
+
*
|
|
4
|
+
* Generates exact missing proofs and minimal patch plans when blocked.
|
|
5
|
+
* No open-ended advice - specific file/line instructions.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
|
|
10
|
+
const path = require("path");
|
|
11
|
+
const fs = require("fs");
|
|
12
|
+
const { CLAIM_TYPES } = require("../claims/claim-types");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generate unblock plan from violations
|
|
16
|
+
* @param {object} params
|
|
17
|
+
* @param {array} params.violations - Rule violations
|
|
18
|
+
* @param {array} params.claims - Extracted claims
|
|
19
|
+
* @param {string} params.projectRoot - Project root directory
|
|
20
|
+
* @returns {object} Unblock plan with specific steps
|
|
21
|
+
*/
|
|
22
|
+
function generateUnblockPlan({ violations, claims, projectRoot }) {
|
|
23
|
+
const steps = [];
|
|
24
|
+
|
|
25
|
+
for (const violation of violations) {
|
|
26
|
+
if (violation.severity !== "block") {
|
|
27
|
+
continue; // Only generate plans for blocking violations
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const claim = violation.claim || claims.find(c =>
|
|
31
|
+
violation.claimId && c.type === violation.claim?.type
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
switch (violation.rule) {
|
|
35
|
+
case "ghost_route":
|
|
36
|
+
steps.push(...planGhostRoute(claim, projectRoot));
|
|
37
|
+
break;
|
|
38
|
+
|
|
39
|
+
case "ghost_env":
|
|
40
|
+
steps.push(...planGhostEnv(claim, projectRoot));
|
|
41
|
+
break;
|
|
42
|
+
|
|
43
|
+
case "auth_drift":
|
|
44
|
+
steps.push(...planAuthDrift(claim, projectRoot));
|
|
45
|
+
break;
|
|
46
|
+
|
|
47
|
+
case "contract_drift":
|
|
48
|
+
steps.push(...planContractDrift(claim, projectRoot));
|
|
49
|
+
break;
|
|
50
|
+
|
|
51
|
+
case "scope_explosion":
|
|
52
|
+
steps.push(...planScopeExplosion(violation));
|
|
53
|
+
break;
|
|
54
|
+
|
|
55
|
+
case "unsafe_side_effect":
|
|
56
|
+
steps.push(...planUnsafeSideEffect(claim, projectRoot));
|
|
57
|
+
break;
|
|
58
|
+
|
|
59
|
+
case "fake_success_ui":
|
|
60
|
+
steps.push(...planFakeSuccess(claim, projectRoot));
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
steps: deduplicateSteps(steps)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Plan for ghost route violation
|
|
72
|
+
*/
|
|
73
|
+
function planGhostRoute(claim, projectRoot) {
|
|
74
|
+
if (!claim || claim.type !== CLAIM_TYPES.ROUTE) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const routePath = claim.value;
|
|
79
|
+
const steps = [];
|
|
80
|
+
|
|
81
|
+
// Determine framework and suggest route file location
|
|
82
|
+
const isApiRoute = routePath.startsWith("/api/");
|
|
83
|
+
|
|
84
|
+
if (isApiRoute) {
|
|
85
|
+
// Next.js App Router
|
|
86
|
+
const routePathSegments = routePath.replace("/api/", "").split("/");
|
|
87
|
+
const routeFile = path.join("app", "api", ...routePathSegments, "route.ts");
|
|
88
|
+
const routeFileAbs = path.join(projectRoot, routeFile);
|
|
89
|
+
|
|
90
|
+
steps.push({
|
|
91
|
+
action: "create",
|
|
92
|
+
file: routeFile,
|
|
93
|
+
line: 1,
|
|
94
|
+
description: `Create route handler at ${routeFile} for ${routePath}`
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Also suggest adding to truthpack
|
|
98
|
+
steps.push({
|
|
99
|
+
action: "modify",
|
|
100
|
+
file: ".vibecheck/truthpack/routes.json",
|
|
101
|
+
line: null,
|
|
102
|
+
description: `Run 'vibecheck truth' to regenerate truthpack with new route`
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return steps;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Plan for ghost env violation
|
|
111
|
+
*/
|
|
112
|
+
function planGhostEnv(claim, projectRoot) {
|
|
113
|
+
if (!claim || claim.type !== CLAIM_TYPES.ENV) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const envVarName = claim.value;
|
|
118
|
+
const steps = [];
|
|
119
|
+
|
|
120
|
+
// Find env schema file
|
|
121
|
+
const envSchemaFiles = [
|
|
122
|
+
"apps/api/src/config/env.schema.ts",
|
|
123
|
+
"apps/api/src/env.schema.ts",
|
|
124
|
+
"src/config/env.schema.ts",
|
|
125
|
+
"src/env.schema.ts"
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
let envSchemaFile = null;
|
|
129
|
+
for (const candidate of envSchemaFiles) {
|
|
130
|
+
const fullPath = path.join(projectRoot, candidate);
|
|
131
|
+
if (fs.existsSync(fullPath)) {
|
|
132
|
+
envSchemaFile = candidate;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (!envSchemaFile) {
|
|
138
|
+
// Create new schema file
|
|
139
|
+
envSchemaFile = "apps/api/src/config/env.schema.ts";
|
|
140
|
+
steps.push({
|
|
141
|
+
action: "create",
|
|
142
|
+
file: envSchemaFile,
|
|
143
|
+
line: 1,
|
|
144
|
+
description: `Create env schema file and add ${envVarName}`
|
|
145
|
+
});
|
|
146
|
+
} else {
|
|
147
|
+
// Add to existing schema
|
|
148
|
+
steps.push({
|
|
149
|
+
action: "modify",
|
|
150
|
+
file: envSchemaFile,
|
|
151
|
+
line: null, // Will need to find insertion point
|
|
152
|
+
description: `Add ${envVarName} to env schema`
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Also add to .env.example
|
|
157
|
+
steps.push({
|
|
158
|
+
action: "modify",
|
|
159
|
+
file: ".env.example",
|
|
160
|
+
line: null,
|
|
161
|
+
description: `Add ${envVarName}=<value> to .env.example`
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return steps;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Plan for auth drift violation
|
|
169
|
+
*/
|
|
170
|
+
function planAuthDrift(claim, projectRoot) {
|
|
171
|
+
if (!claim || claim.type !== CLAIM_TYPES.AUTH) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const steps = [];
|
|
176
|
+
|
|
177
|
+
// Find middleware file
|
|
178
|
+
const middlewareFiles = [
|
|
179
|
+
"middleware.ts",
|
|
180
|
+
"src/middleware.ts",
|
|
181
|
+
"apps/api/src/middleware.ts"
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
let middlewareFile = null;
|
|
185
|
+
for (const candidate of middlewareFiles) {
|
|
186
|
+
const fullPath = path.join(projectRoot, candidate);
|
|
187
|
+
if (fs.existsSync(fullPath)) {
|
|
188
|
+
middlewareFile = candidate;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (middlewareFile) {
|
|
194
|
+
steps.push({
|
|
195
|
+
action: "modify",
|
|
196
|
+
file: middlewareFile,
|
|
197
|
+
line: null,
|
|
198
|
+
description: `Add protected route pattern to middleware matcher for ${claim.file || "affected route"}`
|
|
199
|
+
});
|
|
200
|
+
} else {
|
|
201
|
+
steps.push({
|
|
202
|
+
action: "create",
|
|
203
|
+
file: "middleware.ts",
|
|
204
|
+
line: 1,
|
|
205
|
+
description: `Create middleware.ts and add auth protection for ${claim.file || "affected route"}`
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return steps;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Plan for contract drift violation
|
|
214
|
+
*/
|
|
215
|
+
function planContractDrift(claim, projectRoot) {
|
|
216
|
+
if (!claim || claim.type !== CLAIM_TYPES.CONTRACT) {
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const steps = [];
|
|
221
|
+
|
|
222
|
+
steps.push({
|
|
223
|
+
action: "modify",
|
|
224
|
+
file: ".vibecheck/truthpack/contracts.json",
|
|
225
|
+
line: null,
|
|
226
|
+
description: `Update contract definition for ${claim.value} or run 'vibecheck truth' to regenerate`
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return steps;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Plan for scope explosion violation
|
|
234
|
+
*/
|
|
235
|
+
function planScopeExplosion(violation) {
|
|
236
|
+
const steps = [];
|
|
237
|
+
|
|
238
|
+
const metadata = violation.metadata || {};
|
|
239
|
+
|
|
240
|
+
if (metadata.totalFiles) {
|
|
241
|
+
steps.push({
|
|
242
|
+
action: "modify",
|
|
243
|
+
file: null,
|
|
244
|
+
line: null,
|
|
245
|
+
description: `Reduce scope: ${metadata.totalFiles} files touched (max: ${metadata.maxFiles}). Split into smaller changes or provide explicit intent message.`
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (metadata.totalLines) {
|
|
250
|
+
steps.push({
|
|
251
|
+
action: "modify",
|
|
252
|
+
file: null,
|
|
253
|
+
line: null,
|
|
254
|
+
description: `Reduce scope: ${metadata.totalLines} lines changed (max: ${metadata.maxLines}). Split into smaller changes or provide explicit intent message.`
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return steps;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Plan for unsafe side effect violation
|
|
263
|
+
*/
|
|
264
|
+
function planUnsafeSideEffect(claim, projectRoot) {
|
|
265
|
+
if (!claim || claim.type !== CLAIM_TYPES.SIDE_EFFECT) {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const steps = [];
|
|
270
|
+
|
|
271
|
+
// Suggest creating test file
|
|
272
|
+
const claimFile = claim.file || "";
|
|
273
|
+
if (claimFile) {
|
|
274
|
+
const baseName = path.basename(claimFile, path.extname(claimFile));
|
|
275
|
+
const dir = path.dirname(claimFile);
|
|
276
|
+
const testFile = path.join(dir, `${baseName}.test.ts`);
|
|
277
|
+
|
|
278
|
+
steps.push({
|
|
279
|
+
action: "create",
|
|
280
|
+
file: testFile,
|
|
281
|
+
line: 1,
|
|
282
|
+
description: `Create test file to verify side effect: ${claim.value}`
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Also suggest reality proof
|
|
287
|
+
steps.push({
|
|
288
|
+
action: "modify",
|
|
289
|
+
file: null,
|
|
290
|
+
line: null,
|
|
291
|
+
description: `Run 'vibecheck reality' to generate proof for side effect: ${claim.value}`
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
return steps;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Plan for fake success UI violation
|
|
299
|
+
*/
|
|
300
|
+
function planFakeSuccess(claim, projectRoot) {
|
|
301
|
+
if (!claim || claim.type !== CLAIM_TYPES.UI_SUCCESS) {
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const steps = [];
|
|
306
|
+
|
|
307
|
+
steps.push({
|
|
308
|
+
action: "modify",
|
|
309
|
+
file: claim.file || "unknown",
|
|
310
|
+
line: null,
|
|
311
|
+
description: `Add HTTP call or side effect before showing success message: ${claim.value}`
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
return steps;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Deduplicate steps by file+action
|
|
319
|
+
*/
|
|
320
|
+
function deduplicateSteps(steps) {
|
|
321
|
+
const seen = new Set();
|
|
322
|
+
const unique = [];
|
|
323
|
+
|
|
324
|
+
for (const step of steps) {
|
|
325
|
+
const key = `${step.action}|${step.file || "null"}`;
|
|
326
|
+
if (!seen.has(key)) {
|
|
327
|
+
seen.add(key);
|
|
328
|
+
unique.push(step);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return unique;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
module.exports = {
|
|
336
|
+
generateUnblockPlan
|
|
337
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignore File Checker
|
|
3
|
+
*
|
|
4
|
+
* Checks if a file matches patterns in .vibecheckignore
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
const fs = require("fs");
|
|
10
|
+
const path = require("path");
|
|
11
|
+
|
|
12
|
+
// Try to use minimatch if available, otherwise use simple pattern matching
|
|
13
|
+
let minimatch;
|
|
14
|
+
try {
|
|
15
|
+
minimatch = require("minimatch").minimatch;
|
|
16
|
+
} catch {
|
|
17
|
+
minimatch = null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let ignorePatterns = null;
|
|
21
|
+
let ignoreFile = null;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Load ignore patterns from .vibecheckignore
|
|
25
|
+
* @param {string} projectRoot - Project root directory
|
|
26
|
+
* @returns {array} Array of ignore patterns
|
|
27
|
+
*/
|
|
28
|
+
function loadIgnorePatterns(projectRoot) {
|
|
29
|
+
if (ignorePatterns !== null && ignoreFile === projectRoot) {
|
|
30
|
+
return ignorePatterns;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const ignorePath = path.join(projectRoot, ".vibecheckignore");
|
|
34
|
+
ignorePatterns = [];
|
|
35
|
+
|
|
36
|
+
if (fs.existsSync(ignorePath)) {
|
|
37
|
+
const content = fs.readFileSync(ignorePath, "utf8");
|
|
38
|
+
ignorePatterns = content
|
|
39
|
+
.split("\n")
|
|
40
|
+
.map(line => line.trim())
|
|
41
|
+
.filter(line => line && !line.startsWith("#"));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
ignoreFile = projectRoot;
|
|
45
|
+
return ignorePatterns;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Check if a file should be ignored
|
|
50
|
+
* @param {string} projectRoot - Project root directory
|
|
51
|
+
* @param {string} filePath - File path (relative to project root)
|
|
52
|
+
* @returns {boolean} True if file should be ignored
|
|
53
|
+
*/
|
|
54
|
+
function shouldIgnore(projectRoot, filePath) {
|
|
55
|
+
const patterns = loadIgnorePatterns(projectRoot);
|
|
56
|
+
const normalizedPath = filePath.replace(/\\/g, "/");
|
|
57
|
+
|
|
58
|
+
// Check against all patterns
|
|
59
|
+
for (const pattern of patterns) {
|
|
60
|
+
// Handle both glob patterns and simple path matches
|
|
61
|
+
if (minimatch) {
|
|
62
|
+
if (minimatch(normalizedPath, pattern, { matchBase: true }) ||
|
|
63
|
+
minimatch(normalizedPath, `**/${pattern}`, { matchBase: true })) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
// Fallback: simple pattern matching
|
|
68
|
+
const regexPattern = pattern
|
|
69
|
+
.replace(/\*\*/g, ".*")
|
|
70
|
+
.replace(/\*/g, "[^/]*")
|
|
71
|
+
.replace(/\//g, "\\/");
|
|
72
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
73
|
+
if (regex.test(normalizedPath)) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Also check if path contains the pattern as a substring (for directory patterns)
|
|
79
|
+
const cleanPattern = pattern.replace(/\*\*/g, "").replace(/\*/g, "");
|
|
80
|
+
if (normalizedPath.includes(cleanPattern)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Also check common test file patterns
|
|
86
|
+
const testPatterns = [
|
|
87
|
+
/\/__tests__\//,
|
|
88
|
+
/\.test\.(ts|tsx|js|jsx)$/,
|
|
89
|
+
/\.spec\.(ts|tsx|js|jsx)$/,
|
|
90
|
+
/\/tests\//,
|
|
91
|
+
/\/test\//,
|
|
92
|
+
/\/fixtures\//,
|
|
93
|
+
/\/examples\//,
|
|
94
|
+
/\/templates\//
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
for (const pattern of testPatterns) {
|
|
98
|
+
if (pattern.test(normalizedPath)) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Clear cached ignore patterns (for testing)
|
|
108
|
+
*/
|
|
109
|
+
function clearCache() {
|
|
110
|
+
ignorePatterns = null;
|
|
111
|
+
ignoreFile = null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
module.exports = {
|
|
115
|
+
shouldIgnore,
|
|
116
|
+
loadIgnorePatterns,
|
|
117
|
+
clearCache
|
|
118
|
+
};
|