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.
Files changed (456) hide show
  1. package/bin/.generated +25 -0
  2. package/bin/_deprecations.js +463 -0
  3. package/bin/_router.js +46 -0
  4. package/bin/cli-hygiene.js +241 -0
  5. package/bin/dev/run-v2-torture.js +30 -0
  6. package/bin/registry.js +656 -0
  7. package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
  8. package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
  9. package/bin/runners/REPORT_AUDIT.md +64 -0
  10. package/bin/runners/cli-utils.js +1070 -0
  11. package/bin/runners/context/ai-task-decomposer.js +337 -0
  12. package/bin/runners/context/analyzer.js +513 -0
  13. package/bin/runners/context/api-contracts.js +427 -0
  14. package/bin/runners/context/context-diff.js +342 -0
  15. package/bin/runners/context/context-pruner.js +291 -0
  16. package/bin/runners/context/dependency-graph.js +414 -0
  17. package/bin/runners/context/generators/claude.js +107 -0
  18. package/bin/runners/context/generators/codex.js +108 -0
  19. package/bin/runners/context/generators/copilot.js +119 -0
  20. package/bin/runners/context/generators/cursor-enhanced.js +2525 -0
  21. package/bin/runners/context/generators/cursor.js +514 -0
  22. package/bin/runners/context/generators/mcp.js +169 -0
  23. package/bin/runners/context/generators/windsurf.js +180 -0
  24. package/bin/runners/context/git-context.js +304 -0
  25. package/bin/runners/context/index.js +1110 -0
  26. package/bin/runners/context/insights.js +173 -0
  27. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  28. package/bin/runners/context/mcp-server/index.js +1176 -0
  29. package/bin/runners/context/mcp-server/package.json +24 -0
  30. package/bin/runners/context/memory.js +200 -0
  31. package/bin/runners/context/monorepo.js +215 -0
  32. package/bin/runners/context/multi-repo-federation.js +404 -0
  33. package/bin/runners/context/patterns.js +253 -0
  34. package/bin/runners/context/proof-context.js +1264 -0
  35. package/bin/runners/context/security-scanner.js +541 -0
  36. package/bin/runners/context/semantic-search.js +350 -0
  37. package/bin/runners/context/shared.js +264 -0
  38. package/bin/runners/context/team-conventions.js +336 -0
  39. package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
  40. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
  41. package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
  42. package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
  43. package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
  44. package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
  45. package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
  46. package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
  47. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  48. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  49. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  50. package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
  51. package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
  52. package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
  53. package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
  54. package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
  55. package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
  56. package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
  57. package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
  58. package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
  59. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
  60. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
  61. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
  62. package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
  63. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
  64. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
  65. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
  66. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
  67. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
  68. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
  69. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
  70. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
  71. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
  72. package/bin/runners/lib/agent-firewall/index.js +200 -0
  73. package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
  74. package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
  75. package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
  76. package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
  77. package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
  78. package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
  79. package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
  80. package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
  81. package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
  82. package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
  83. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
  84. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
  85. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
  86. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  87. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  88. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  89. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  90. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  91. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  92. package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
  93. package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
  94. package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
  95. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
  96. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
  97. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
  98. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
  99. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
  100. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
  101. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
  102. package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
  103. package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
  104. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  105. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  106. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  107. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  108. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  109. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  110. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  111. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  112. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  113. package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
  114. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  115. package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
  116. package/bin/runners/lib/agent-firewall/session/index.js +26 -0
  117. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  118. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  119. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  120. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  121. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  122. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  123. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  124. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  125. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  126. package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
  127. package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
  128. package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
  129. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
  130. package/bin/runners/lib/ai-bridge.js +416 -0
  131. package/bin/runners/lib/analysis-core.js +309 -0
  132. package/bin/runners/lib/analyzers.js +2500 -0
  133. package/bin/runners/lib/api-client.js +269 -0
  134. package/bin/runners/lib/approve-output.js +235 -0
  135. package/bin/runners/lib/artifact-envelope.js +540 -0
  136. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  137. package/bin/runners/lib/audit-bridge.js +391 -0
  138. package/bin/runners/lib/auth-shared.js +977 -0
  139. package/bin/runners/lib/auth-truth.js +193 -0
  140. package/bin/runners/lib/auth.js +215 -0
  141. package/bin/runners/lib/authority-badge.js +425 -0
  142. package/bin/runners/lib/backup.js +62 -0
  143. package/bin/runners/lib/billing.js +107 -0
  144. package/bin/runners/lib/checkpoint.js +941 -0
  145. package/bin/runners/lib/claims.js +118 -0
  146. package/bin/runners/lib/classify-output.js +204 -0
  147. package/bin/runners/lib/cleanup/engine.js +571 -0
  148. package/bin/runners/lib/cleanup/index.js +53 -0
  149. package/bin/runners/lib/cleanup/output.js +375 -0
  150. package/bin/runners/lib/cleanup/rules.js +1060 -0
  151. package/bin/runners/lib/cli-output.js +400 -0
  152. package/bin/runners/lib/cli-ui.js +540 -0
  153. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  154. package/bin/runners/lib/compliance-bridge.js +165 -0
  155. package/bin/runners/lib/contracts/auth-contract.js +202 -0
  156. package/bin/runners/lib/contracts/env-contract.js +181 -0
  157. package/bin/runners/lib/contracts/external-contract.js +206 -0
  158. package/bin/runners/lib/contracts/guard.js +168 -0
  159. package/bin/runners/lib/contracts/index.js +89 -0
  160. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  161. package/bin/runners/lib/contracts/route-contract.js +199 -0
  162. package/bin/runners/lib/contracts.js +804 -0
  163. package/bin/runners/lib/default-config.js +127 -0
  164. package/bin/runners/lib/detect.js +89 -0
  165. package/bin/runners/lib/detectors-v2.js +622 -0
  166. package/bin/runners/lib/doctor/autofix.js +254 -0
  167. package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
  168. package/bin/runners/lib/doctor/failure-signatures.js +526 -0
  169. package/bin/runners/lib/doctor/fix-script.js +336 -0
  170. package/bin/runners/lib/doctor/index.js +37 -0
  171. package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
  172. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  173. package/bin/runners/lib/doctor/modules/index.js +105 -0
  174. package/bin/runners/lib/doctor/modules/network.js +250 -0
  175. package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
  176. package/bin/runners/lib/doctor/modules/project.js +312 -0
  177. package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
  178. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  179. package/bin/runners/lib/doctor/modules/security.js +350 -0
  180. package/bin/runners/lib/doctor/modules/system.js +213 -0
  181. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  182. package/bin/runners/lib/doctor/reporter.js +262 -0
  183. package/bin/runners/lib/doctor/safe-repair.js +384 -0
  184. package/bin/runners/lib/doctor/service.js +262 -0
  185. package/bin/runners/lib/doctor/types.js +113 -0
  186. package/bin/runners/lib/doctor/ui.js +263 -0
  187. package/bin/runners/lib/doctor-enhanced.js +233 -0
  188. package/bin/runners/lib/doctor-output.js +226 -0
  189. package/bin/runners/lib/doctor-v2.js +608 -0
  190. package/bin/runners/lib/drift.js +425 -0
  191. package/bin/runners/lib/enforcement.js +72 -0
  192. package/bin/runners/lib/engine/ast-cache.js +210 -0
  193. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  194. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  195. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  196. package/bin/runners/lib/engine/env-extractor.js +207 -0
  197. package/bin/runners/lib/engine/express-extractor.js +208 -0
  198. package/bin/runners/lib/engine/extractors.js +849 -0
  199. package/bin/runners/lib/engine/index.js +207 -0
  200. package/bin/runners/lib/engine/repo-index.js +514 -0
  201. package/bin/runners/lib/engine/types.js +124 -0
  202. package/bin/runners/lib/engines/accessibility-engine.js +190 -0
  203. package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
  204. package/bin/runners/lib/engines/ast-cache.js +99 -0
  205. package/bin/runners/lib/engines/attack-detector.js +1192 -0
  206. package/bin/runners/lib/engines/code-quality-engine.js +255 -0
  207. package/bin/runners/lib/engines/console-logs-engine.js +115 -0
  208. package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
  209. package/bin/runners/lib/engines/dead-code-engine.js +198 -0
  210. package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
  211. package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
  212. package/bin/runners/lib/engines/file-filter.js +131 -0
  213. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
  214. package/bin/runners/lib/engines/mock-data-engine.js +272 -0
  215. package/bin/runners/lib/engines/parallel-processor.js +71 -0
  216. package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
  217. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
  218. package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
  219. package/bin/runners/lib/engines/type-aware-engine.js +152 -0
  220. package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
  221. package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
  222. package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
  223. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  224. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  225. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  226. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  227. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  228. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  229. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  230. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
  231. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  232. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  233. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  234. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  235. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  236. package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
  237. package/bin/runners/lib/enterprise-detect.js +603 -0
  238. package/bin/runners/lib/enterprise-init.js +942 -0
  239. package/bin/runners/lib/entitlements-v2.js +265 -0
  240. package/bin/runners/lib/entitlements.generated.js +0 -0
  241. package/bin/runners/lib/entitlements.js +340 -0
  242. package/bin/runners/lib/env-resolver.js +417 -0
  243. package/bin/runners/lib/env-template.js +66 -0
  244. package/bin/runners/lib/env.js +189 -0
  245. package/bin/runners/lib/error-handler.js +368 -0
  246. package/bin/runners/lib/error-messages.js +289 -0
  247. package/bin/runners/lib/evidence-pack.js +684 -0
  248. package/bin/runners/lib/exit-codes.js +275 -0
  249. package/bin/runners/lib/extractors/client-calls.js +990 -0
  250. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  251. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  252. package/bin/runners/lib/extractors/index.js +363 -0
  253. package/bin/runners/lib/extractors/next-routes.js +524 -0
  254. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  255. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  256. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  257. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  258. package/bin/runners/lib/finding-id.js +69 -0
  259. package/bin/runners/lib/finding-sorter.js +89 -0
  260. package/bin/runners/lib/findings-schema.js +281 -0
  261. package/bin/runners/lib/fingerprint.js +377 -0
  262. package/bin/runners/lib/firewall-prompt.js +50 -0
  263. package/bin/runners/lib/fix-output.js +228 -0
  264. package/bin/runners/lib/global-flags.js +250 -0
  265. package/bin/runners/lib/graph/graph-builder.js +265 -0
  266. package/bin/runners/lib/graph/html-renderer.js +413 -0
  267. package/bin/runners/lib/graph/index.js +32 -0
  268. package/bin/runners/lib/graph/runtime-collector.js +215 -0
  269. package/bin/runners/lib/graph/static-extractor.js +518 -0
  270. package/bin/runners/lib/help-formatter.js +413 -0
  271. package/bin/runners/lib/html-proof-report.js +913 -0
  272. package/bin/runners/lib/html-report.js +650 -0
  273. package/bin/runners/lib/init-wizard.js +601 -0
  274. package/bin/runners/lib/interactive-menu.js +1496 -0
  275. package/bin/runners/lib/json-output.js +76 -0
  276. package/bin/runners/lib/llm.js +75 -0
  277. package/bin/runners/lib/logger.js +38 -0
  278. package/bin/runners/lib/meter.js +61 -0
  279. package/bin/runners/lib/missions/briefing.js +427 -0
  280. package/bin/runners/lib/missions/checkpoint.js +753 -0
  281. package/bin/runners/lib/missions/evidence.js +126 -0
  282. package/bin/runners/lib/missions/hardening.js +851 -0
  283. package/bin/runners/lib/missions/plan.js +648 -0
  284. package/bin/runners/lib/missions/safety-gates.js +645 -0
  285. package/bin/runners/lib/missions/schema.js +478 -0
  286. package/bin/runners/lib/missions/templates.js +317 -0
  287. package/bin/runners/lib/next-action.js +560 -0
  288. package/bin/runners/lib/packs/bundle.js +675 -0
  289. package/bin/runners/lib/packs/evidence-pack.js +671 -0
  290. package/bin/runners/lib/packs/pack-factory.js +837 -0
  291. package/bin/runners/lib/packs/permissions-pack.js +686 -0
  292. package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
  293. package/bin/runners/lib/patch.js +40 -0
  294. package/bin/runners/lib/permissions/auth-model.js +213 -0
  295. package/bin/runners/lib/permissions/idor-prover.js +205 -0
  296. package/bin/runners/lib/permissions/index.js +45 -0
  297. package/bin/runners/lib/permissions/matrix-builder.js +198 -0
  298. package/bin/runners/lib/pkgjson.js +28 -0
  299. package/bin/runners/lib/policy.js +295 -0
  300. package/bin/runners/lib/polish/accessibility.js +62 -0
  301. package/bin/runners/lib/polish/analyzer.js +93 -0
  302. package/bin/runners/lib/polish/backend.js +87 -0
  303. package/bin/runners/lib/polish/configuration.js +83 -0
  304. package/bin/runners/lib/polish/documentation.js +83 -0
  305. package/bin/runners/lib/polish/frontend.js +817 -0
  306. package/bin/runners/lib/polish/index.js +27 -0
  307. package/bin/runners/lib/polish/infrastructure.js +80 -0
  308. package/bin/runners/lib/polish/internationalization.js +85 -0
  309. package/bin/runners/lib/polish/libraries.js +180 -0
  310. package/bin/runners/lib/polish/observability.js +75 -0
  311. package/bin/runners/lib/polish/performance.js +64 -0
  312. package/bin/runners/lib/polish/privacy.js +110 -0
  313. package/bin/runners/lib/polish/resilience.js +92 -0
  314. package/bin/runners/lib/polish/security.js +78 -0
  315. package/bin/runners/lib/polish/seo.js +71 -0
  316. package/bin/runners/lib/polish/styles.js +62 -0
  317. package/bin/runners/lib/polish/utils.js +104 -0
  318. package/bin/runners/lib/preflight.js +142 -0
  319. package/bin/runners/lib/prerequisites.js +149 -0
  320. package/bin/runners/lib/prove-output.js +220 -0
  321. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  322. package/bin/runners/lib/reality/index.js +318 -0
  323. package/bin/runners/lib/reality/request-hashing.js +416 -0
  324. package/bin/runners/lib/reality/request-mapper.js +453 -0
  325. package/bin/runners/lib/reality/safety-rails.js +463 -0
  326. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  327. package/bin/runners/lib/reality/toast-detector.js +393 -0
  328. package/bin/runners/lib/reality-findings.js +84 -0
  329. package/bin/runners/lib/reality-output.js +231 -0
  330. package/bin/runners/lib/receipts.js +179 -0
  331. package/bin/runners/lib/redact.js +29 -0
  332. package/bin/runners/lib/replay/capsule-manager.js +154 -0
  333. package/bin/runners/lib/replay/index.js +263 -0
  334. package/bin/runners/lib/replay/player.js +348 -0
  335. package/bin/runners/lib/replay/recorder.js +331 -0
  336. package/bin/runners/lib/report-engine.js +626 -0
  337. package/bin/runners/lib/report-html.js +1233 -0
  338. package/bin/runners/lib/report-output.js +366 -0
  339. package/bin/runners/lib/report-templates.js +967 -0
  340. package/bin/runners/lib/report.js +135 -0
  341. package/bin/runners/lib/route-detection.js +1209 -0
  342. package/bin/runners/lib/route-truth.js +1322 -0
  343. package/bin/runners/lib/safelist/index.js +96 -0
  344. package/bin/runners/lib/safelist/integration.js +334 -0
  345. package/bin/runners/lib/safelist/matcher.js +696 -0
  346. package/bin/runners/lib/safelist/schema.js +948 -0
  347. package/bin/runners/lib/safelist/store.js +438 -0
  348. package/bin/runners/lib/sandbox/index.js +59 -0
  349. package/bin/runners/lib/sandbox/proof-chain.js +399 -0
  350. package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
  351. package/bin/runners/lib/sandbox/worktree.js +174 -0
  352. package/bin/runners/lib/scan-cache.js +330 -0
  353. package/bin/runners/lib/scan-output-schema.js +344 -0
  354. package/bin/runners/lib/scan-output.js +631 -0
  355. package/bin/runners/lib/scan-runner.js +135 -0
  356. package/bin/runners/lib/schema-validator.js +350 -0
  357. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  358. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  359. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  360. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  361. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  362. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  363. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  364. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  365. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  366. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  367. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  368. package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
  369. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  370. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  371. package/bin/runners/lib/schemas/validator.js +465 -0
  372. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  373. package/bin/runners/lib/score-history.js +282 -0
  374. package/bin/runners/lib/security-bridge.js +249 -0
  375. package/bin/runners/lib/server-usage.js +513 -0
  376. package/bin/runners/lib/share-pack.js +239 -0
  377. package/bin/runners/lib/ship-gate.js +832 -0
  378. package/bin/runners/lib/ship-manifest.js +1153 -0
  379. package/bin/runners/lib/ship-output-enterprise.js +239 -0
  380. package/bin/runners/lib/ship-output.js +1128 -0
  381. package/bin/runners/lib/snippets.js +67 -0
  382. package/bin/runners/lib/status-output.js +340 -0
  383. package/bin/runners/lib/terminal-ui.js +356 -0
  384. package/bin/runners/lib/truth.js +1691 -0
  385. package/bin/runners/lib/ui.js +562 -0
  386. package/bin/runners/lib/unified-cli-output.js +947 -0
  387. package/bin/runners/lib/unified-output.js +197 -0
  388. package/bin/runners/lib/upsell.js +410 -0
  389. package/bin/runners/lib/usage.js +153 -0
  390. package/bin/runners/lib/validate-patch.js +156 -0
  391. package/bin/runners/lib/verdict-engine.js +628 -0
  392. package/bin/runners/lib/verification.js +345 -0
  393. package/bin/runners/lib/why-tree.js +650 -0
  394. package/bin/runners/reality/engine.js +917 -0
  395. package/bin/runners/reality/flows.js +122 -0
  396. package/bin/runners/reality/report.js +378 -0
  397. package/bin/runners/reality/session.js +193 -0
  398. package/bin/runners/runAIAgent.js +229 -0
  399. package/bin/runners/runAgent.d.ts +5 -0
  400. package/bin/runners/runAgent.js +161 -0
  401. package/bin/runners/runAllowlist.js +418 -0
  402. package/bin/runners/runApprove.js +320 -0
  403. package/bin/runners/runAudit.js +692 -0
  404. package/bin/runners/runAuth.js +731 -0
  405. package/bin/runners/runCI.js +353 -0
  406. package/bin/runners/runCheckpoint.js +530 -0
  407. package/bin/runners/runClassify.js +928 -0
  408. package/bin/runners/runCleanup.js +343 -0
  409. package/bin/runners/runContext.d.ts +4 -0
  410. package/bin/runners/runContext.js +175 -0
  411. package/bin/runners/runDoctor.js +877 -0
  412. package/bin/runners/runEvidencePack.js +362 -0
  413. package/bin/runners/runFirewall.d.ts +5 -0
  414. package/bin/runners/runFirewall.js +134 -0
  415. package/bin/runners/runFirewallHook.d.ts +5 -0
  416. package/bin/runners/runFirewallHook.js +56 -0
  417. package/bin/runners/runFix.js +1355 -0
  418. package/bin/runners/runForge.js +451 -0
  419. package/bin/runners/runGuard.js +262 -0
  420. package/bin/runners/runInit.js +1927 -0
  421. package/bin/runners/runIntent.js +906 -0
  422. package/bin/runners/runKickoff.js +878 -0
  423. package/bin/runners/runLabs.js +424 -0
  424. package/bin/runners/runLaunch.js +2000 -0
  425. package/bin/runners/runLink.js +785 -0
  426. package/bin/runners/runMcp.js +1875 -0
  427. package/bin/runners/runPacks.js +2089 -0
  428. package/bin/runners/runPolish.d.ts +4 -0
  429. package/bin/runners/runPolish.js +390 -0
  430. package/bin/runners/runPromptFirewall.js +211 -0
  431. package/bin/runners/runProve.js +1411 -0
  432. package/bin/runners/runQuickstart.js +531 -0
  433. package/bin/runners/runReality.js +2260 -0
  434. package/bin/runners/runReport.js +726 -0
  435. package/bin/runners/runRuntime.js +110 -0
  436. package/bin/runners/runSafelist.js +1190 -0
  437. package/bin/runners/runScan.js +688 -0
  438. package/bin/runners/runShield.js +1282 -0
  439. package/bin/runners/runShip.js +1660 -0
  440. package/bin/runners/runTruth.d.ts +5 -0
  441. package/bin/runners/runTruth.js +101 -0
  442. package/bin/runners/runValidate.js +179 -0
  443. package/bin/runners/runWatch.js +478 -0
  444. package/bin/runners/utils.js +360 -0
  445. package/bin/scan.js +617 -0
  446. package/bin/vibecheck.js +1617 -0
  447. package/dist/guardrail/index.d.ts +2405 -0
  448. package/dist/guardrail/index.js +9747 -0
  449. package/dist/guardrail/index.js.map +1 -0
  450. package/dist/scanner/index.d.ts +282 -0
  451. package/dist/scanner/index.js +3395 -0
  452. package/dist/scanner/index.js.map +1 -0
  453. package/package.json +123 -104
  454. package/README.md +0 -491
  455. package/dist/index.js +0 -99711
  456. 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
+ };