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,92 @@
1
+ /**
2
+ * Resilience Polish Engine
3
+ *
4
+ * Checks: Circuit breakers, retry logic, timeouts, graceful shutdown, bulkhead.
5
+ */
6
+
7
+ const path = require("path");
8
+ const { pathExists, findFile, readFileSafe } = require("./utils");
9
+
10
+ module.exports = async function resilienceEngine(projectPath) {
11
+ const issues = [];
12
+ const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
13
+ const srcPath = path.join(projectPath, "src");
14
+ const hasSrc = await pathExists(srcPath);
15
+ const searchPath = hasSrc ? srcPath : projectPath;
16
+
17
+ // Circuit breaker
18
+ if (!(packageJson && /opossum|cockatiel|resilience4j|circuit.*breaker/i.test(packageJson))) {
19
+ issues.push({
20
+ id: "missing-circuit-breaker",
21
+ category: "Resilience",
22
+ severity: "medium",
23
+ title: "Missing Circuit Breaker",
24
+ description: "No circuit breaker library found. External service failures can cascade.",
25
+ suggestion: "Add opossum or cockatiel for circuit breaker patterns on external calls.",
26
+ autoFixable: false,
27
+ aiPrompt: "Implement circuit breaker pattern using opossum for external API calls. Configure thresholds, fallback responses, and health checks.",
28
+ });
29
+ }
30
+
31
+ // Retry logic
32
+ const hasRetryLib = packageJson && /axios-retry|got|ky|p-retry|async-retry/i.test(packageJson);
33
+ const hasRetryInCode = await findFile(searchPath, /retry|exponential.*backoff|maxRetries/i);
34
+ if (!hasRetryLib && !hasRetryInCode) {
35
+ issues.push({
36
+ id: "missing-retry-logic",
37
+ category: "Resilience",
38
+ severity: "high",
39
+ title: "Missing Retry Logic",
40
+ description: "No retry mechanism found. Transient failures will cause immediate errors.",
41
+ suggestion: "Add retry logic with exponential backoff for external API calls.",
42
+ autoFixable: false,
43
+ aiPrompt: "Add retry logic with exponential backoff using axios-retry or p-retry. Configure max retries, backoff multiplier, and jitter.",
44
+ });
45
+ }
46
+
47
+ // Timeouts
48
+ const hasTimeoutConfig = await findFile(searchPath, /timeout|AbortController|AbortSignal/i);
49
+ if (!hasTimeoutConfig && hasSrc) {
50
+ issues.push({
51
+ id: "missing-timeouts",
52
+ category: "Resilience",
53
+ severity: "high",
54
+ title: "Missing Request Timeouts",
55
+ description: "No timeout configuration found. Slow external services can hang your app.",
56
+ suggestion: "Add timeouts to all external HTTP calls and database queries.",
57
+ autoFixable: false,
58
+ aiPrompt: "Add timeout handling to all external API calls and database queries. Use AbortController for fetch, configure connection/query timeouts for DB.",
59
+ });
60
+ }
61
+
62
+ // Graceful shutdown
63
+ const hasGracefulShutdown = await findFile(searchPath, /graceful.*shutdown|SIGTERM|SIGINT|beforeExit/i);
64
+ if (!hasGracefulShutdown) {
65
+ issues.push({
66
+ id: "missing-graceful-shutdown",
67
+ category: "Resilience",
68
+ severity: "high",
69
+ title: "Missing Graceful Shutdown",
70
+ description: "No graceful shutdown handling found. In-flight requests may be dropped.",
71
+ suggestion: "Add SIGTERM/SIGINT handlers to drain connections before shutdown.",
72
+ autoFixable: true,
73
+ aiPrompt: "Implement graceful shutdown. Handle SIGTERM/SIGINT, stop accepting new connections, drain existing ones, close DB pools, exit cleanly.",
74
+ });
75
+ }
76
+
77
+ // Bulkhead / concurrency limiting
78
+ if (!(packageJson && /bottleneck|p-limit|p-queue|semaphore/i.test(packageJson))) {
79
+ issues.push({
80
+ id: "missing-bulkhead",
81
+ category: "Resilience",
82
+ severity: "low",
83
+ title: "Missing Bulkhead/Rate Limiting for Internal Operations",
84
+ description: "No internal concurrency limiting found. Resource exhaustion possible.",
85
+ suggestion: "Add bottleneck or p-limit to limit concurrent operations.",
86
+ autoFixable: false,
87
+ aiPrompt: "Add concurrency limiting using bottleneck or p-limit for resource-intensive operations (file uploads, heavy computations, external API calls).",
88
+ });
89
+ }
90
+
91
+ return issues;
92
+ };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Security Polish Engine
3
+ *
4
+ * Checks: .env management, gitignore, security headers, CORS.
5
+ */
6
+
7
+ const path = require("path");
8
+ const { pathExists, readFileSafe } = require("./utils");
9
+
10
+ module.exports = async function securityEngine(projectPath) {
11
+ const issues = [];
12
+
13
+ // .env.example
14
+ const hasEnvExample =
15
+ (await pathExists(path.join(projectPath, ".env.example"))) ||
16
+ (await pathExists(path.join(projectPath, ".env.sample")));
17
+ if (!hasEnvExample) {
18
+ issues.push({
19
+ id: "missing-env-example",
20
+ category: "Security",
21
+ severity: "medium",
22
+ title: "Missing .env.example",
23
+ description: "No .env.example file found. Team members won't know what env vars are needed.",
24
+ suggestion: "Create .env.example with all required environment variables (without values).",
25
+ autoFixable: true,
26
+ });
27
+ }
28
+
29
+ // .env in .gitignore
30
+ const gitignore = await readFileSafe(path.join(projectPath, ".gitignore"));
31
+ if (gitignore && !gitignore.includes(".env")) {
32
+ issues.push({
33
+ id: "env-not-gitignored",
34
+ category: "Security",
35
+ severity: "critical",
36
+ title: ".env Not in .gitignore",
37
+ description: "Environment files may be committed to git, exposing secrets.",
38
+ suggestion: "Add .env* to .gitignore immediately.",
39
+ autoFixable: true,
40
+ });
41
+ }
42
+
43
+ // Security headers
44
+ const packageJson = await readFileSafe(path.join(projectPath, "package.json"));
45
+ const hasHelmet = packageJson && /helmet|next-secure-headers/i.test(packageJson);
46
+ if (!hasHelmet) {
47
+ issues.push({
48
+ id: "missing-security-headers",
49
+ category: "Security",
50
+ severity: "high",
51
+ title: "Missing Security Headers",
52
+ description: "No security headers library found (helmet, etc.).",
53
+ suggestion: "Add helmet or security headers middleware for CSP, HSTS, etc.",
54
+ autoFixable: false,
55
+ });
56
+ }
57
+
58
+ // CORS
59
+ const hasCors = packageJson && /cors|@fastify\/cors/i.test(packageJson);
60
+ const nextConfig =
61
+ (await readFileSafe(path.join(projectPath, "next.config.js"))) ||
62
+ (await readFileSafe(path.join(projectPath, "next.config.mjs")));
63
+ const hasNextCors = nextConfig && /headers|Access-Control/i.test(nextConfig);
64
+
65
+ if (!hasCors && !hasNextCors) {
66
+ issues.push({
67
+ id: "missing-cors",
68
+ category: "Security",
69
+ severity: "medium",
70
+ title: "No CORS Configuration",
71
+ description: "No CORS configuration found. May have issues with cross-origin requests.",
72
+ suggestion: "Add CORS configuration to control which origins can access your API.",
73
+ autoFixable: false,
74
+ });
75
+ }
76
+
77
+ return issues;
78
+ };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * SEO Polish Engine
3
+ *
4
+ * Checks: robots.txt, sitemap, meta tags, Open Graph.
5
+ */
6
+
7
+ const path = require("path");
8
+ const { pathExists, findFile } = require("./utils");
9
+
10
+ module.exports = async function seoEngine(projectPath) {
11
+ const issues = [];
12
+
13
+ const hasRobots = await pathExists(path.join(projectPath, "public", "robots.txt"));
14
+ if (!hasRobots) {
15
+ issues.push({
16
+ id: "missing-robots",
17
+ category: "SEO",
18
+ severity: "medium",
19
+ title: "Missing robots.txt",
20
+ description: "No robots.txt file found. Search engines may not crawl correctly.",
21
+ suggestion: "Add robots.txt to public folder to guide search engine crawlers.",
22
+ autoFixable: true,
23
+ });
24
+ }
25
+
26
+ const hasSitemap =
27
+ (await pathExists(path.join(projectPath, "public", "sitemap.xml"))) ||
28
+ (await findFile(projectPath, /sitemap/i));
29
+ if (!hasSitemap) {
30
+ issues.push({
31
+ id: "missing-sitemap",
32
+ category: "SEO",
33
+ severity: "medium",
34
+ title: "Missing Sitemap",
35
+ description: "No sitemap found. Search engines may miss some pages.",
36
+ suggestion: "Generate sitemap.xml for better search engine indexing.",
37
+ autoFixable: false,
38
+ });
39
+ }
40
+
41
+ const hasMetaTags = await findFile(projectPath, /MetaTags|Seo|Head|metadata/i);
42
+ if (!hasMetaTags) {
43
+ issues.push({
44
+ id: "missing-meta-setup",
45
+ category: "SEO",
46
+ severity: "high",
47
+ title: "Missing Meta Tag Setup",
48
+ description: "No meta tag component found. Pages may lack proper SEO metadata.",
49
+ suggestion: "Add a SEO/MetaTags component for consistent meta descriptions.",
50
+ autoFixable: true,
51
+ });
52
+ }
53
+
54
+ const hasOgImage =
55
+ (await pathExists(path.join(projectPath, "public", "og-image.png"))) ||
56
+ (await pathExists(path.join(projectPath, "public", "og.png"))) ||
57
+ (await findFile(path.join(projectPath, "public"), /og[-_]?image/i));
58
+ if (!hasOgImage) {
59
+ issues.push({
60
+ id: "missing-og-image",
61
+ category: "SEO",
62
+ severity: "low",
63
+ title: "Missing Open Graph Image",
64
+ description: "No OG image found. Social media shares will look plain.",
65
+ suggestion: "Add og-image.png to public folder for social media previews.",
66
+ autoFixable: false,
67
+ });
68
+ }
69
+
70
+ return issues;
71
+ };
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Terminal styling constants for polish command output.
3
+ */
4
+
5
+ const c = {
6
+ reset: '\x1b[0m',
7
+ bold: '\x1b[1m',
8
+ dim: '\x1b[2m',
9
+ italic: '\x1b[3m',
10
+ underline: '\x1b[4m',
11
+ red: '\x1b[31m',
12
+ green: '\x1b[32m',
13
+ yellow: '\x1b[33m',
14
+ blue: '\x1b[34m',
15
+ magenta: '\x1b[35m',
16
+ cyan: '\x1b[36m',
17
+ white: '\x1b[37m',
18
+ bgRed: '\x1b[41m',
19
+ bgGreen: '\x1b[42m',
20
+ bgYellow: '\x1b[43m',
21
+ bgBlue: '\x1b[44m',
22
+ };
23
+
24
+ const icons = {
25
+ critical: '🔴',
26
+ high: '🟠',
27
+ medium: '🟡',
28
+ low: '🔵',
29
+ check: '✓',
30
+ cross: '✗',
31
+ arrow: '→',
32
+ star: '★',
33
+ sparkle: '✨',
34
+ wrench: '🔧',
35
+ rocket: '🚀',
36
+ shield: '🛡️',
37
+ lightning: '⚡',
38
+ eye: '👁️',
39
+ search: '🔍',
40
+ book: '📖',
41
+ gear: '⚙️',
42
+ server: '🖥️',
43
+ lock: '🔒',
44
+ };
45
+
46
+ const categoryIcons = {
47
+ Frontend: icons.sparkle,
48
+ Backend: icons.server,
49
+ Security: icons.lock,
50
+ Performance: icons.lightning,
51
+ Accessibility: icons.eye,
52
+ SEO: icons.search,
53
+ Configuration: icons.gear,
54
+ Documentation: icons.book,
55
+ Infrastructure: icons.rocket,
56
+ Observability: '📊',
57
+ Resilience: '🛡️',
58
+ Internationalization: '🌍',
59
+ Privacy: '🔐',
60
+ };
61
+
62
+ module.exports = { c, icons, categoryIcons };
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Shared filesystem utilities for polish engines.
3
+ *
4
+ * Every engine needs these. Centralizing here avoids duplication
5
+ * and keeps engine files focused on detection logic.
6
+ */
7
+
8
+ const fs = require("fs");
9
+ const path = require("path");
10
+
11
+ async function pathExists(filePath) {
12
+ try {
13
+ await fs.promises.access(filePath);
14
+ return true;
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ async function findFile(dir, pattern, maxDepth = 5, currentDepth = 0) {
21
+ if (currentDepth >= maxDepth) return null;
22
+
23
+ try {
24
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
25
+
26
+ for (const entry of entries) {
27
+ if (
28
+ entry.name.startsWith(".") ||
29
+ entry.name === "node_modules" ||
30
+ entry.name === "dist" ||
31
+ entry.name === "build"
32
+ ) {
33
+ continue;
34
+ }
35
+
36
+ const fullPath = path.join(dir, entry.name);
37
+
38
+ if (entry.isDirectory()) {
39
+ const found = await findFile(fullPath, pattern, maxDepth, currentDepth + 1);
40
+ if (found) return found;
41
+ } else if (pattern.test(entry.name)) {
42
+ return fullPath;
43
+ }
44
+ }
45
+ return null;
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ async function findAllFiles(dir, pattern, maxDepth = 5, currentDepth = 0) {
52
+ if (currentDepth >= maxDepth) return [];
53
+ const results = [];
54
+
55
+ try {
56
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
57
+
58
+ for (const entry of entries) {
59
+ if (
60
+ entry.name.startsWith(".") ||
61
+ entry.name === "node_modules" ||
62
+ entry.name === "dist" ||
63
+ entry.name === "build"
64
+ ) {
65
+ continue;
66
+ }
67
+
68
+ const fullPath = path.join(dir, entry.name);
69
+
70
+ if (entry.isDirectory()) {
71
+ const found = await findAllFiles(fullPath, pattern, maxDepth, currentDepth + 1);
72
+ results.push(...found);
73
+ } else if (pattern.test(entry.name)) {
74
+ results.push(fullPath);
75
+ }
76
+ }
77
+ } catch {
78
+ // Ignore permission / read errors
79
+ }
80
+
81
+ return results;
82
+ }
83
+
84
+ async function readFileSafe(filePath) {
85
+ try {
86
+ return await fs.promises.readFile(filePath, "utf8");
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ async function fileContains(filePath, pattern) {
93
+ const content = await readFileSafe(filePath);
94
+ if (!content) return false;
95
+ return pattern.test(content);
96
+ }
97
+
98
+ module.exports = {
99
+ pathExists,
100
+ findFile,
101
+ findAllFiles,
102
+ readFileSafe,
103
+ fileContains,
104
+ };
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Preflight checks - Run before any vibecheck command
3
+ *
4
+ * Validates:
5
+ * - Node version
6
+ * - Required dependencies
7
+ * - Project structure
8
+ * - Configuration
9
+ */
10
+
11
+ "use strict";
12
+
13
+ const fs = require("fs");
14
+ const path = require("path");
15
+
16
+ const MIN_NODE_VERSION = 18;
17
+
18
+ function checkNodeVersion() {
19
+ const version = process.version;
20
+ const major = parseInt(version.slice(1).split(".")[0], 10);
21
+ if (major < MIN_NODE_VERSION) {
22
+ return {
23
+ ok: false,
24
+ message: `Node.js ${MIN_NODE_VERSION}+ required (you have ${version})`
25
+ };
26
+ }
27
+ return { ok: true };
28
+ }
29
+
30
+ function checkPlaywright() {
31
+ try {
32
+ require.resolve("playwright");
33
+ return { ok: true };
34
+ } catch {
35
+ return {
36
+ ok: false,
37
+ optional: true,
38
+ message: "Playwright not installed. Reality mode requires: npm i -D playwright"
39
+ };
40
+ }
41
+ }
42
+
43
+ function checkFastGlob() {
44
+ try {
45
+ require.resolve("fast-glob");
46
+ return { ok: true };
47
+ } catch {
48
+ return {
49
+ ok: false,
50
+ message: "fast-glob not installed. Run: npm install"
51
+ };
52
+ }
53
+ }
54
+
55
+ function checkProjectRoot(root) {
56
+ const pkgPath = path.join(root, "package.json");
57
+ if (!fs.existsSync(pkgPath)) {
58
+ return {
59
+ ok: false,
60
+ message: "No package.json found. Are you in a project directory?"
61
+ };
62
+ }
63
+ return { ok: true };
64
+ }
65
+
66
+ function checkGit(root) {
67
+ const gitPath = path.join(root, ".git");
68
+ if (!fs.existsSync(gitPath)) {
69
+ return {
70
+ ok: false,
71
+ optional: true,
72
+ message: "Not a git repository. Some features may not work."
73
+ };
74
+ }
75
+ return { ok: true };
76
+ }
77
+
78
+ function checkWritable(root) {
79
+ const vibecheckDir = path.join(root, ".vibecheck");
80
+ try {
81
+ fs.mkdirSync(vibecheckDir, { recursive: true });
82
+ const testFile = path.join(vibecheckDir, ".write_test");
83
+ fs.writeFileSync(testFile, "test");
84
+ fs.unlinkSync(testFile);
85
+ return { ok: true };
86
+ } catch {
87
+ return {
88
+ ok: false,
89
+ message: "Cannot write to .vibecheck directory. Check permissions."
90
+ };
91
+ }
92
+ }
93
+
94
+ function runPreflight(root, { silent = false, strict = false } = {}) {
95
+ const checks = [
96
+ { name: "Node.js", check: checkNodeVersion },
97
+ { name: "Project", check: () => checkProjectRoot(root) },
98
+ { name: "Writable", check: () => checkWritable(root) },
99
+ { name: "Git", check: () => checkGit(root) },
100
+ { name: "fast-glob", check: checkFastGlob },
101
+ { name: "Playwright", check: checkPlaywright },
102
+ ];
103
+
104
+ const results = [];
105
+ let hasError = false;
106
+
107
+ for (const { name, check } of checks) {
108
+ const result = check();
109
+ results.push({ name, ...result });
110
+
111
+ if (!result.ok && !result.optional) {
112
+ hasError = true;
113
+ }
114
+ }
115
+
116
+ if (!silent && hasError) {
117
+ console.error("\n⚠️ Preflight checks failed:\n");
118
+ for (const r of results) {
119
+ if (!r.ok && !r.optional) {
120
+ console.error(` ✗ ${r.name}: ${r.message}`);
121
+ }
122
+ }
123
+ console.error("");
124
+ }
125
+
126
+ if (!silent && !hasError) {
127
+ // Show optional warnings
128
+ const optionalWarnings = results.filter(r => !r.ok && r.optional);
129
+ if (optionalWarnings.length && process.env.VIBECHECK_VERBOSE) {
130
+ for (const r of optionalWarnings) {
131
+ console.warn(` ⚠ ${r.name}: ${r.message}`);
132
+ }
133
+ }
134
+ }
135
+
136
+ return {
137
+ ok: !hasError,
138
+ results
139
+ };
140
+ }
141
+
142
+ module.exports = { runPreflight, checkNodeVersion, checkPlaywright };
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Prerequisite Auto-Running
3
+ *
4
+ * Automatically runs prerequisites (like scan) if they're missing
5
+ * to improve UX - users don't need to know the correct command order.
6
+ */
7
+
8
+ const fs = require("fs");
9
+ const path = require("path");
10
+
11
+ /**
12
+ * Check if scan results exist
13
+ */
14
+ function hasScanResults(projectPath) {
15
+ const latestPath = path.join(projectPath, ".vibecheck", "results", "latest.json");
16
+ return fs.existsSync(latestPath);
17
+ }
18
+
19
+ /**
20
+ * Check if ship results exist
21
+ */
22
+ function hasShipResults(projectPath) {
23
+ const shipPath = path.join(projectPath, ".vibecheck", "last_ship.json");
24
+ return fs.existsSync(shipPath);
25
+ }
26
+
27
+ /**
28
+ * Check if truthpack exists
29
+ */
30
+ function hasTruthpack(projectPath) {
31
+ const truthpackPath = path.join(projectPath, ".vibecheck", "truthpack.json");
32
+ return fs.existsSync(truthpackPath);
33
+ }
34
+
35
+ /**
36
+ * Auto-run scan if results are missing
37
+ */
38
+ async function ensureScanResults(projectPath, opts = {}) {
39
+ if (hasScanResults(projectPath)) {
40
+ return { ran: false, reason: "Scan results already exist" };
41
+ }
42
+
43
+ // Don't auto-run in CI or if explicitly disabled
44
+ if (opts.ci || opts.noAutoRun || process.env.CI) {
45
+ return { ran: false, reason: "Auto-run disabled (CI mode or --no-auto-run)" };
46
+ }
47
+
48
+ try {
49
+ const { runScan } = require("../runScan");
50
+
51
+ if (!opts.quiet && !opts.json) {
52
+ console.log(`\n ${opts.colors?.info || ''}${opts.icons?.info || 'ℹ'}${opts.ansi?.reset || ''} No scan results found. Running scan first...\n`);
53
+ }
54
+
55
+ const scanArgs = ["--path", projectPath, "--offline", "--quiet"];
56
+ if (opts.json) scanArgs.push("--json");
57
+
58
+ const exitCode = await runScan(scanArgs);
59
+
60
+ if (hasScanResults(projectPath)) {
61
+ return { ran: true, exitCode, success: true };
62
+ } else {
63
+ return { ran: true, exitCode, success: false, reason: "Scan completed but no results file created" };
64
+ }
65
+ } catch (error) {
66
+ return { ran: true, success: false, error: error.message };
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Auto-run ship if results are missing (for commands that need ship results)
72
+ */
73
+ async function ensureShipResults(projectPath, opts = {}) {
74
+ if (hasShipResults(projectPath)) {
75
+ return { ran: false, reason: "Ship results already exist" };
76
+ }
77
+
78
+ // Don't auto-run in CI or if explicitly disabled
79
+ if (opts.ci || opts.noAutoRun || process.env.CI) {
80
+ return { ran: false, reason: "Auto-run disabled (CI mode or --no-auto-run)" };
81
+ }
82
+
83
+ try {
84
+ const { runShip } = require("../runShip");
85
+
86
+ if (!opts.quiet && !opts.json) {
87
+ console.log(`\n ${opts.colors?.info || ''}${opts.icons?.info || 'ℹ'}${opts.ansi?.reset || ''} No ship results found. Running ship first...\n`);
88
+ }
89
+
90
+ const shipArgs = ["--path", projectPath, "--no-banner", "--offline"];
91
+ if (opts.quiet) shipArgs.push("--quiet");
92
+ if (opts.json) shipArgs.push("--json");
93
+
94
+ const exitCode = await runShip(shipArgs);
95
+
96
+ if (hasShipResults(projectPath)) {
97
+ return { ran: true, exitCode, success: true };
98
+ } else {
99
+ return { ran: true, exitCode, success: false, reason: "Ship completed but no results file created" };
100
+ }
101
+ } catch (error) {
102
+ return { ran: true, success: false, error: error.message };
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Auto-run context if truthpack is missing
108
+ */
109
+ async function ensureTruthpack(projectPath, opts = {}) {
110
+ if (hasTruthpack(projectPath)) {
111
+ return { ran: false, reason: "Truthpack already exists" };
112
+ }
113
+
114
+ // Don't auto-run in CI or if explicitly disabled
115
+ if (opts.ci || opts.noAutoRun || process.env.CI) {
116
+ return { ran: false, reason: "Auto-run disabled (CI mode or --no-auto-run)" };
117
+ }
118
+
119
+ try {
120
+ const { runContext } = require("../runContext");
121
+
122
+ if (!opts.quiet && !opts.json) {
123
+ console.log(`\n ${opts.colors?.info || ''}${opts.icons?.info || 'ℹ'}${opts.ansi?.reset || ''} No truthpack found. Generating context first...\n`);
124
+ }
125
+
126
+ const contextArgs = ["--path", projectPath];
127
+ if (opts.quiet) contextArgs.push("--quiet");
128
+ if (opts.json) contextArgs.push("--json");
129
+
130
+ const exitCode = await runContext(contextArgs);
131
+
132
+ if (hasTruthpack(projectPath)) {
133
+ return { ran: true, exitCode, success: true };
134
+ } else {
135
+ return { ran: true, exitCode, success: false, reason: "Context completed but no truthpack created" };
136
+ }
137
+ } catch (error) {
138
+ return { ran: true, success: false, error: error.message };
139
+ }
140
+ }
141
+
142
+ module.exports = {
143
+ hasScanResults,
144
+ hasShipResults,
145
+ hasTruthpack,
146
+ ensureScanResults,
147
+ ensureShipResults,
148
+ ensureTruthpack,
149
+ };