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,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized error handling for CLI runners
|
|
3
|
+
*
|
|
4
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
+
* World-Class Error Handling
|
|
6
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
7
|
+
*
|
|
8
|
+
* Design principles:
|
|
9
|
+
* - Every error has a human-readable message
|
|
10
|
+
* - Every error suggests a next step
|
|
11
|
+
* - Exit codes are consistent and documented
|
|
12
|
+
* - Errors include "receipt" (file:line evidence) where possible
|
|
13
|
+
* - Debug mode shows stack traces
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const { EXIT, getExitInfo, getHint } = require("./exit-codes");
|
|
17
|
+
|
|
18
|
+
const colors = {
|
|
19
|
+
reset: "\x1b[0m",
|
|
20
|
+
red: "\x1b[31m",
|
|
21
|
+
yellow: "\x1b[33m",
|
|
22
|
+
cyan: "\x1b[36m",
|
|
23
|
+
green: "\x1b[32m",
|
|
24
|
+
bold: "\x1b[1m",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const c = {
|
|
28
|
+
error: (text) => `${colors.red}${colors.bold}${text}${colors.reset}`,
|
|
29
|
+
warning: (text) => `${colors.yellow}${text}${colors.reset}`,
|
|
30
|
+
info: (text) => `${colors.cyan}${text}${colors.reset}`,
|
|
31
|
+
success: (text) => `${colors.green}${text}${colors.reset}`,
|
|
32
|
+
dim: (text) => `\x1b[2m${text}${colors.reset}`,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Re-export EXIT for backward compatibility
|
|
36
|
+
// NOTE: Prefer importing from exit-codes.js directly
|
|
37
|
+
const EXIT_CODES = {
|
|
38
|
+
SUCCESS: EXIT.SUCCESS,
|
|
39
|
+
POLICY_FAIL: EXIT.WARNINGS, // Findings above threshold (policy fail)
|
|
40
|
+
USER_ERROR: EXIT.USER_ERROR, // User error: invalid args, bad config
|
|
41
|
+
SYSTEM_ERROR: EXIT.INTERNAL_ERROR, // System error: crash, unexpected exceptions
|
|
42
|
+
AUTH_FAILURE: EXIT.AUTH_REQUIRED, // Auth/entitlement failure
|
|
43
|
+
NETWORK_FAILURE: EXIT.NETWORK_ERROR, // Network/backend failure
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Error-specific guidance
|
|
47
|
+
const ERROR_GUIDANCE = {
|
|
48
|
+
ENOENT: {
|
|
49
|
+
title: "File or directory not found",
|
|
50
|
+
nextSteps: [
|
|
51
|
+
"Verify the path exists and is spelled correctly",
|
|
52
|
+
"Run from the project root directory",
|
|
53
|
+
"Check if the file was deleted or moved",
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
EACCES: {
|
|
57
|
+
title: "Permission denied",
|
|
58
|
+
nextSteps: [
|
|
59
|
+
"Check file/directory permissions",
|
|
60
|
+
"Try running with appropriate permissions",
|
|
61
|
+
"Ensure you own the files or have read access",
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
ECONNREFUSED: {
|
|
65
|
+
title: "Connection refused",
|
|
66
|
+
nextSteps: [
|
|
67
|
+
"Check if the API server is running",
|
|
68
|
+
"Verify VIBECHECK_API_URL is correct",
|
|
69
|
+
"Check firewall/network settings",
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
ETIMEDOUT: {
|
|
73
|
+
title: "Connection timed out",
|
|
74
|
+
nextSteps: [
|
|
75
|
+
"Check your internet connection",
|
|
76
|
+
"The server may be overloaded, try again later",
|
|
77
|
+
"Increase timeout with --timeout flag if available",
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
INVALID_API_KEY: {
|
|
81
|
+
title: "Invalid API key",
|
|
82
|
+
nextSteps: [
|
|
83
|
+
'Run "vibecheck login" to authenticate',
|
|
84
|
+
"Get a new API key at https://vibecheckai.dev/settings/keys",
|
|
85
|
+
"Check VIBECHECK_API_KEY environment variable",
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
PLAN_REQUIRED: {
|
|
89
|
+
title: "Feature requires a paid plan",
|
|
90
|
+
nextSteps: [
|
|
91
|
+
"Upgrade at https://vibecheckai.dev/pricing",
|
|
92
|
+
'Run "vibecheck upgrade" to manage your subscription',
|
|
93
|
+
"Some features have free tier limits",
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
RATE_LIMITED: {
|
|
97
|
+
title: "Rate limit exceeded",
|
|
98
|
+
nextSteps: [
|
|
99
|
+
"Wait a moment and try again",
|
|
100
|
+
"Upgrade your plan for higher limits",
|
|
101
|
+
"Batch operations to reduce API calls",
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Get guidance for an error
|
|
108
|
+
*/
|
|
109
|
+
function getErrorGuidance(error) {
|
|
110
|
+
const code = error.code || error.name;
|
|
111
|
+
|
|
112
|
+
// Check for known error types
|
|
113
|
+
if (ERROR_GUIDANCE[code]) {
|
|
114
|
+
return ERROR_GUIDANCE[code];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Infer from error message
|
|
118
|
+
if (error.message?.includes("API key")) {
|
|
119
|
+
return ERROR_GUIDANCE.INVALID_API_KEY;
|
|
120
|
+
}
|
|
121
|
+
if (error.message?.includes("rate limit")) {
|
|
122
|
+
return ERROR_GUIDANCE.RATE_LIMITED;
|
|
123
|
+
}
|
|
124
|
+
if (error.message?.includes("plan") || error.message?.includes("upgrade")) {
|
|
125
|
+
return ERROR_GUIDANCE.PLAN_REQUIRED;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Handle CLI errors with consistent formatting and guidance
|
|
133
|
+
* @param {Error|string} error - The error to handle
|
|
134
|
+
* @param {string} context - Additional context (command name, file path, etc.)
|
|
135
|
+
* @param {Object} metadata - Additional metadata (command, file, line, receipt, verifyCommand, etc.)
|
|
136
|
+
*/
|
|
137
|
+
function handleError(error, context = "", metadata = {}) {
|
|
138
|
+
// Ensure error is an Error object
|
|
139
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
140
|
+
|
|
141
|
+
// Build receipt string (file:line or evidence)
|
|
142
|
+
let receipt = "";
|
|
143
|
+
if (metadata.file && metadata.line) {
|
|
144
|
+
receipt = `${metadata.file}:${metadata.line}`;
|
|
145
|
+
} else if (metadata.file) {
|
|
146
|
+
receipt = metadata.file;
|
|
147
|
+
} else if (metadata.receipt) {
|
|
148
|
+
receipt = metadata.receipt;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Build enriched context message
|
|
152
|
+
const contextParts = [context];
|
|
153
|
+
if (receipt) contextParts.push(`Receipt: ${receipt}`);
|
|
154
|
+
if (metadata.command && !context.includes(metadata.command)) contextParts.push(`Command: ${metadata.command}`);
|
|
155
|
+
const enrichedContext = contextParts.filter(Boolean).join(' | ');
|
|
156
|
+
|
|
157
|
+
// Add context to error message if provided
|
|
158
|
+
const message = enrichedContext ? `${enrichedContext}: ${err.message}` : err.message;
|
|
159
|
+
|
|
160
|
+
// Get specific guidance
|
|
161
|
+
const guidance = getErrorGuidance(err);
|
|
162
|
+
|
|
163
|
+
// Check for JSON mode (via NO_COLOR env var or explicit check)
|
|
164
|
+
const isJsonMode = process.env.NO_COLOR === '1' || process.env.VIBECHECK_JSON === '1';
|
|
165
|
+
|
|
166
|
+
// Print error header
|
|
167
|
+
if (guidance) {
|
|
168
|
+
if (isJsonMode) {
|
|
169
|
+
// JSON error output
|
|
170
|
+
const errorOutput = {
|
|
171
|
+
success: false,
|
|
172
|
+
error: {
|
|
173
|
+
code: err.code || err.name || 'ERROR',
|
|
174
|
+
message: message,
|
|
175
|
+
type: guidance.title,
|
|
176
|
+
nextSteps: guidance.nextSteps,
|
|
177
|
+
},
|
|
178
|
+
exitCode: err.exitCode || 1
|
|
179
|
+
};
|
|
180
|
+
console.error(JSON.stringify(errorOutput, null, 2));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
console.error(`\n${c.error("✗")} ${c.error(guidance.title)}`);
|
|
184
|
+
console.error(` ${message}`);
|
|
185
|
+
|
|
186
|
+
// Print next steps
|
|
187
|
+
console.error(`\n${c.info("Next steps:")}`);
|
|
188
|
+
for (const step of guidance.nextSteps) {
|
|
189
|
+
console.error(` ${c.dim("•")} ${step}`);
|
|
190
|
+
}
|
|
191
|
+
} else {
|
|
192
|
+
// Check for JSON mode
|
|
193
|
+
const isJsonMode = process.env.NO_COLOR === '1' || process.env.VIBECHECK_JSON === '1';
|
|
194
|
+
|
|
195
|
+
// Generic error handling with specific type detection
|
|
196
|
+
if (err.code === "ENOENT") {
|
|
197
|
+
if (isJsonMode) {
|
|
198
|
+
const errorOutput = {
|
|
199
|
+
success: false,
|
|
200
|
+
error: { code: 'ENOENT', message: err.path || message, receipt },
|
|
201
|
+
exitCode: 4
|
|
202
|
+
};
|
|
203
|
+
console.error(JSON.stringify(errorOutput, null, 2));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
console.error(`\n${c.error("✗")} File or directory not found`);
|
|
207
|
+
console.error(` ${err.path || message}`);
|
|
208
|
+
// Print receipt if available
|
|
209
|
+
if (receipt) {
|
|
210
|
+
console.error(`\n${c.dim("Receipt:")} ${receipt}`);
|
|
211
|
+
}
|
|
212
|
+
console.error(`\n${c.info("Next steps:")}`);
|
|
213
|
+
console.error(` ${c.dim("•")} Verify the path exists`);
|
|
214
|
+
console.error(` ${c.dim("•")} Run from the correct directory`);
|
|
215
|
+
if (metadata.verifyCommand) {
|
|
216
|
+
console.error(`\n${c.info("Verify it's fixed:")}`);
|
|
217
|
+
console.error(` ${c.dim("•")} ${metadata.verifyCommand}`);
|
|
218
|
+
}
|
|
219
|
+
} else if (err.code === "EACCES") {
|
|
220
|
+
console.error(`\n${c.error("✗")} Permission denied`);
|
|
221
|
+
console.error(` ${message}`);
|
|
222
|
+
// Print receipt if available
|
|
223
|
+
if (receipt) {
|
|
224
|
+
console.error(`\n${c.dim("Receipt:")} ${receipt}`);
|
|
225
|
+
}
|
|
226
|
+
console.error(`\n${c.info("Next steps:")}`);
|
|
227
|
+
console.error(` ${c.dim("•")} Check file permissions`);
|
|
228
|
+
if (metadata.verifyCommand) {
|
|
229
|
+
console.error(`\n${c.info("Verify it's fixed:")}`);
|
|
230
|
+
console.error(` ${c.dim("•")} ${metadata.verifyCommand}`);
|
|
231
|
+
}
|
|
232
|
+
} else if (err.name === "AuthenticationError") {
|
|
233
|
+
console.error(`\n${c.error("✗")} Authentication required`);
|
|
234
|
+
console.error(` ${message}`);
|
|
235
|
+
console.error(`\n${c.info("Next steps:")}`);
|
|
236
|
+
console.error(` ${c.dim("•")} Run "vibecheck login" to authenticate`);
|
|
237
|
+
console.error(` ${c.dim("•")} Get your API key at https://vibecheckai.dev/settings/keys`);
|
|
238
|
+
} else if (err.name === "NetworkError" || err.code === "ECONNREFUSED" || err.code === "ETIMEDOUT") {
|
|
239
|
+
console.error(`\n${c.error("✗")} Network error`);
|
|
240
|
+
console.error(` ${message}`);
|
|
241
|
+
console.error(`\n${c.info("Next steps:")}`);
|
|
242
|
+
console.error(` ${c.dim("•")} Check your internet connection`);
|
|
243
|
+
console.error(` ${c.dim("•")} Verify VIBECHECK_API_URL is correct`);
|
|
244
|
+
} else {
|
|
245
|
+
// Generic error
|
|
246
|
+
if (isJsonMode) {
|
|
247
|
+
const errorOutput = {
|
|
248
|
+
success: false,
|
|
249
|
+
error: { code: err.code || err.name || 'ERROR', message, receipt },
|
|
250
|
+
exitCode: err.exitCode || 1
|
|
251
|
+
};
|
|
252
|
+
console.error(JSON.stringify(errorOutput, null, 2));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
console.error(`\n${c.error("✗")} Error`);
|
|
256
|
+
console.error(` ${message}`);
|
|
257
|
+
// Print receipt if available
|
|
258
|
+
if (receipt) {
|
|
259
|
+
console.error(`\n${c.dim("Receipt:")} ${receipt}`);
|
|
260
|
+
}
|
|
261
|
+
console.error(`\n${c.info("Need help?")}`);
|
|
262
|
+
console.error(` ${c.dim("•")} Run "vibecheck doctor" for diagnostics`);
|
|
263
|
+
console.error(` ${c.dim("•")} Visit https://docs.vibecheckai.dev/troubleshooting`);
|
|
264
|
+
if (metadata.verifyCommand) {
|
|
265
|
+
console.error(`\n${c.info("Verify it's fixed:")}`);
|
|
266
|
+
console.error(` ${c.dim("•")} ${metadata.verifyCommand}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Show stack trace in debug mode (skip in JSON mode)
|
|
272
|
+
if (!isJsonMode && (process.env.DEBUG || process.env.VIBECHECK_DEBUG)) {
|
|
273
|
+
console.error(`\n${c.dim("Stack trace:")}`);
|
|
274
|
+
console.error(c.dim(err.stack));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (!isJsonMode) {
|
|
278
|
+
console.error(""); // Empty line for readability
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Wrap an async function with error handling
|
|
284
|
+
*/
|
|
285
|
+
function withErrorHandling(fn, context = "") {
|
|
286
|
+
return async (...args) => {
|
|
287
|
+
try {
|
|
288
|
+
return await fn(...args);
|
|
289
|
+
} catch (error) {
|
|
290
|
+
handleError(error, context);
|
|
291
|
+
return 1; // Return error exit code
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Create a user-friendly error for specific scenarios
|
|
298
|
+
*/
|
|
299
|
+
function createUserError(message, type = "Error") {
|
|
300
|
+
const error = new Error(message);
|
|
301
|
+
error.name = type;
|
|
302
|
+
error.isUserError = true;
|
|
303
|
+
return error;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Check if an error should be retried
|
|
308
|
+
*/
|
|
309
|
+
function shouldRetry(error) {
|
|
310
|
+
// Retry on network errors
|
|
311
|
+
if (
|
|
312
|
+
error.code === "ECONNRESET" ||
|
|
313
|
+
error.code === "ECONNREFUSED" ||
|
|
314
|
+
error.code === "ETIMEDOUT" ||
|
|
315
|
+
error.name === "NetworkError"
|
|
316
|
+
) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Don't retry on user errors
|
|
321
|
+
if (
|
|
322
|
+
error.isUserError ||
|
|
323
|
+
error.name === "ValidationError" ||
|
|
324
|
+
error.name === "AuthenticationError"
|
|
325
|
+
) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Default: don't retry
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Retry a function with exponential backoff
|
|
335
|
+
*/
|
|
336
|
+
async function retry(fn, maxAttempts = 3, context = "") {
|
|
337
|
+
let lastError;
|
|
338
|
+
|
|
339
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
340
|
+
try {
|
|
341
|
+
return await fn();
|
|
342
|
+
} catch (error) {
|
|
343
|
+
lastError = error;
|
|
344
|
+
|
|
345
|
+
if (!shouldRetry(error) || attempt === maxAttempts) {
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const delay = Math.pow(2, attempt) * 1000; // Exponential backoff
|
|
350
|
+
console.warn(
|
|
351
|
+
c.warning(`Attempt ${attempt} failed, retrying in ${delay / 1000}s...`),
|
|
352
|
+
);
|
|
353
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
throw lastError;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
module.exports = {
|
|
361
|
+
handleError,
|
|
362
|
+
withErrorHandling,
|
|
363
|
+
createUserError,
|
|
364
|
+
shouldRetry,
|
|
365
|
+
retry,
|
|
366
|
+
EXIT_CODES,
|
|
367
|
+
getErrorGuidance,
|
|
368
|
+
};
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actionable Error Messages
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized error messages with actionable next steps,
|
|
5
|
+
* documentation links, and clear guidance for users.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { EXIT } = require('./exit-codes');
|
|
9
|
+
|
|
10
|
+
const DOCS_BASE_URL = 'https://docs.vibecheckai.dev';
|
|
11
|
+
const DASHBOARD_URL = 'https://app.vibecheckai.dev';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Format an actionable error message
|
|
15
|
+
*/
|
|
16
|
+
function formatError(error, context = {}) {
|
|
17
|
+
const {
|
|
18
|
+
command = '',
|
|
19
|
+
suggestion = null,
|
|
20
|
+
docsLink = null,
|
|
21
|
+
nextSteps = [],
|
|
22
|
+
code = null,
|
|
23
|
+
} = context;
|
|
24
|
+
|
|
25
|
+
const lines = [];
|
|
26
|
+
|
|
27
|
+
// Main error message
|
|
28
|
+
lines.push(`\n ❌ ${error.message || error}`);
|
|
29
|
+
|
|
30
|
+
// Error code if provided
|
|
31
|
+
if (code) {
|
|
32
|
+
lines.push(`\n Code: ${code}`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Next steps
|
|
36
|
+
if (nextSteps.length > 0) {
|
|
37
|
+
lines.push(`\n Next steps:`);
|
|
38
|
+
nextSteps.forEach((step, i) => {
|
|
39
|
+
lines.push(` ${i + 1}. ${step}`);
|
|
40
|
+
});
|
|
41
|
+
} else if (suggestion) {
|
|
42
|
+
lines.push(`\n 💡 ${suggestion}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Documentation link
|
|
46
|
+
if (docsLink) {
|
|
47
|
+
lines.push(`\n 📖 Docs: ${docsLink}`);
|
|
48
|
+
} else if (command) {
|
|
49
|
+
lines.push(`\n 📖 Docs: ${DOCS_BASE_URL}/commands/${command}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
lines.push('');
|
|
53
|
+
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Common error templates with actionable guidance
|
|
59
|
+
*/
|
|
60
|
+
const ERROR_TEMPLATES = {
|
|
61
|
+
PROJECT_NOT_INITIALIZED: {
|
|
62
|
+
message: 'Project not initialized',
|
|
63
|
+
suggestion: 'Run `vibecheck init` to set up your project',
|
|
64
|
+
nextSteps: [
|
|
65
|
+
'Run: vibecheck init',
|
|
66
|
+
'This creates .vibecheckrc config file',
|
|
67
|
+
'Then run: vibecheck scan',
|
|
68
|
+
],
|
|
69
|
+
docsLink: `${DOCS_BASE_URL}/getting-started/init`,
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
NO_SCAN_RESULTS: {
|
|
73
|
+
message: 'No scan results found',
|
|
74
|
+
suggestion: 'Run `vibecheck scan` first to generate results',
|
|
75
|
+
nextSteps: [
|
|
76
|
+
'Run: vibecheck scan',
|
|
77
|
+
'This analyzes your codebase',
|
|
78
|
+
'Then re-run this command',
|
|
79
|
+
],
|
|
80
|
+
docsLink: `${DOCS_BASE_URL}/commands/scan`,
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
NO_TRUTHPACK: {
|
|
84
|
+
message: 'No truthpack found',
|
|
85
|
+
suggestion: 'Run `vibecheck context` to generate truthpack',
|
|
86
|
+
nextSteps: [
|
|
87
|
+
'Run: vibecheck context',
|
|
88
|
+
'This generates route/auth/env mapping',
|
|
89
|
+
'Then re-run this command',
|
|
90
|
+
],
|
|
91
|
+
docsLink: `${DOCS_BASE_URL}/commands/context`,
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
AUTH_REQUIRED: {
|
|
95
|
+
message: 'Authentication required',
|
|
96
|
+
suggestion: 'Run `vibecheck login` to authenticate',
|
|
97
|
+
nextSteps: [
|
|
98
|
+
'Run: vibecheck login',
|
|
99
|
+
'Enter your API key',
|
|
100
|
+
'Get your key from: https://app.vibecheckai.dev/settings/api-keys',
|
|
101
|
+
],
|
|
102
|
+
docsLink: `${DOCS_BASE_URL}/getting-started/authentication`,
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
INVALID_API_KEY: {
|
|
106
|
+
message: 'Invalid API key format',
|
|
107
|
+
suggestion: 'Check your API key format',
|
|
108
|
+
nextSteps: [
|
|
109
|
+
'API keys should start with grl_ (from dashboard)',
|
|
110
|
+
'Get a new key: https://app.vibecheckai.dev/settings/api-keys',
|
|
111
|
+
'Run: vibecheck login --key YOUR_KEY',
|
|
112
|
+
],
|
|
113
|
+
docsLink: `${DOCS_BASE_URL}/getting-started/authentication`,
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
TIER_REQUIRED: {
|
|
117
|
+
message: 'This feature requires PRO tier',
|
|
118
|
+
suggestion: 'Upgrade to PRO to access this feature',
|
|
119
|
+
nextSteps: [
|
|
120
|
+
'Visit: https://app.vibecheckai.dev/pricing',
|
|
121
|
+
'Upgrade your account',
|
|
122
|
+
'Re-run this command',
|
|
123
|
+
],
|
|
124
|
+
docsLink: `${DOCS_BASE_URL}/pricing`,
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
PROJECT_PATH_NOT_FOUND: {
|
|
128
|
+
message: 'Project path does not exist',
|
|
129
|
+
suggestion: 'Check the path and try again',
|
|
130
|
+
nextSteps: [
|
|
131
|
+
'Verify the path exists: ls <path>',
|
|
132
|
+
'Use absolute path if relative path fails',
|
|
133
|
+
'Run: vibecheck init --path <path>',
|
|
134
|
+
],
|
|
135
|
+
docsLink: `${DOCS_BASE_URL}/commands/init`,
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
CONFIG_INVALID: {
|
|
139
|
+
message: 'Invalid configuration file',
|
|
140
|
+
suggestion: 'Run `vibecheck doctor --fix` to repair config',
|
|
141
|
+
nextSteps: [
|
|
142
|
+
'Run: vibecheck doctor --fix',
|
|
143
|
+
'This auto-fixes common config issues',
|
|
144
|
+
'Or manually edit .vibecheckrc',
|
|
145
|
+
],
|
|
146
|
+
docsLink: `${DOCS_BASE_URL}/configuration`,
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
NETWORK_ERROR: {
|
|
150
|
+
message: 'Network connection failed',
|
|
151
|
+
suggestion: 'Check your internet connection or use --offline mode',
|
|
152
|
+
nextSteps: [
|
|
153
|
+
'Check internet connection',
|
|
154
|
+
'Or run with --offline flag for local-only mode',
|
|
155
|
+
'Example: vibecheck scan --offline',
|
|
156
|
+
],
|
|
157
|
+
docsLink: `${DOCS_BASE_URL}/commands/scan#offline-mode`,
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
MISSING_DEPENDENCY: {
|
|
161
|
+
message: 'Missing required dependency',
|
|
162
|
+
suggestion: 'Install missing dependencies',
|
|
163
|
+
nextSteps: [
|
|
164
|
+
'Run: npm install',
|
|
165
|
+
'Or: pnpm install',
|
|
166
|
+
'Check package.json for required packages',
|
|
167
|
+
],
|
|
168
|
+
docsLink: `${DOCS_BASE_URL}/troubleshooting/dependencies`,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Get error template by key
|
|
174
|
+
*/
|
|
175
|
+
function getErrorTemplate(key, overrides = {}) {
|
|
176
|
+
const template = ERROR_TEMPLATES[key];
|
|
177
|
+
if (!template) {
|
|
178
|
+
return {
|
|
179
|
+
message: key,
|
|
180
|
+
suggestion: 'Check the documentation for help',
|
|
181
|
+
docsLink: DOCS_BASE_URL,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return { ...template, ...overrides };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Print actionable error and return exit code
|
|
190
|
+
*/
|
|
191
|
+
function printActionableError(errorKey, context = {}) {
|
|
192
|
+
const template = getErrorTemplate(errorKey, context);
|
|
193
|
+
const error = {
|
|
194
|
+
message: template.message,
|
|
195
|
+
code: context.code || errorKey,
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const formatted = formatError(error, {
|
|
199
|
+
...context,
|
|
200
|
+
suggestion: template.suggestion,
|
|
201
|
+
nextSteps: template.nextSteps || [],
|
|
202
|
+
docsLink: template.docsLink,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
console.error(formatted);
|
|
206
|
+
|
|
207
|
+
// Map error keys to exit codes
|
|
208
|
+
const exitCodeMap = {
|
|
209
|
+
AUTH_REQUIRED: EXIT.AUTH_REQUIRED,
|
|
210
|
+
INVALID_API_KEY: EXIT.AUTH_FAILED,
|
|
211
|
+
TIER_REQUIRED: EXIT.TIER_REQUIRED,
|
|
212
|
+
PROJECT_PATH_NOT_FOUND: EXIT.USER_ERROR,
|
|
213
|
+
CONFIG_INVALID: EXIT.USER_ERROR,
|
|
214
|
+
NETWORK_ERROR: EXIT.NETWORK_ERROR || 1,
|
|
215
|
+
MISSING_DEPENDENCY: EXIT.USER_ERROR,
|
|
216
|
+
PROJECT_NOT_INITIALIZED: EXIT.USER_ERROR,
|
|
217
|
+
NO_SCAN_RESULTS: EXIT.NOT_FOUND || 1,
|
|
218
|
+
NO_TRUTHPACK: EXIT.NOT_FOUND || 1,
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
return exitCodeMap[errorKey] || EXIT.USER_ERROR;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Enhance existing error with actionable guidance
|
|
226
|
+
*/
|
|
227
|
+
function enhanceError(error, command = '', additionalContext = {}) {
|
|
228
|
+
const errorMessage = error.message || String(error);
|
|
229
|
+
const lowerMessage = errorMessage.toLowerCase();
|
|
230
|
+
|
|
231
|
+
// Detect error type from message
|
|
232
|
+
if (lowerMessage.includes('not initialized') || lowerMessage.includes('no config')) {
|
|
233
|
+
return printActionableError('PROJECT_NOT_INITIALIZED', { command, ...additionalContext });
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (lowerMessage.includes('scan result') || lowerMessage.includes('no results')) {
|
|
237
|
+
return printActionableError('NO_SCAN_RESULTS', { command, ...additionalContext });
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (lowerMessage.includes('truthpack') || lowerMessage.includes('context')) {
|
|
241
|
+
return printActionableError('NO_TRUTHPACK', { command, ...additionalContext });
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (lowerMessage.includes('auth') && (lowerMessage.includes('required') || lowerMessage.includes('unauthorized'))) {
|
|
245
|
+
return printActionableError('AUTH_REQUIRED', { command, ...additionalContext });
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (lowerMessage.includes('api key') && (lowerMessage.includes('invalid') || lowerMessage.includes('format'))) {
|
|
249
|
+
return printActionableError('INVALID_API_KEY', { command, ...additionalContext });
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (lowerMessage.includes('tier') || lowerMessage.includes('pro') || lowerMessage.includes('upgrade')) {
|
|
253
|
+
return printActionableError('TIER_REQUIRED', { command, ...additionalContext });
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (lowerMessage.includes('path') && (lowerMessage.includes('not found') || lowerMessage.includes('does not exist'))) {
|
|
257
|
+
return printActionableError('PROJECT_PATH_NOT_FOUND', { command, path: additionalContext.path });
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (lowerMessage.includes('config') && (lowerMessage.includes('invalid') || lowerMessage.includes('error'))) {
|
|
261
|
+
return printActionableError('CONFIG_INVALID', { command, ...additionalContext });
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (lowerMessage.includes('network') || lowerMessage.includes('connection') || lowerMessage.includes('fetch')) {
|
|
265
|
+
return printActionableError('NETWORK_ERROR', { command, ...additionalContext });
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (lowerMessage.includes('cannot find module') || lowerMessage.includes('missing')) {
|
|
269
|
+
return printActionableError('MISSING_DEPENDENCY', { command, dependency: additionalContext.dependency });
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Default: print enhanced error
|
|
273
|
+
console.error(formatError(error, {
|
|
274
|
+
command,
|
|
275
|
+
suggestion: additionalContext.suggestion || 'Check the documentation for help',
|
|
276
|
+
docsLink: additionalContext.docsLink || `${DOCS_BASE_URL}/commands/${command}`,
|
|
277
|
+
nextSteps: additionalContext.nextSteps || [],
|
|
278
|
+
}));
|
|
279
|
+
|
|
280
|
+
return EXIT.USER_ERROR;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
module.exports = {
|
|
284
|
+
formatError,
|
|
285
|
+
getErrorTemplate,
|
|
286
|
+
printActionableError,
|
|
287
|
+
enhanceError,
|
|
288
|
+
ERROR_TEMPLATES,
|
|
289
|
+
};
|