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,877 @@
1
+ /**
2
+ * vibecheck doctor - Enterprise Environment Diagnostics
3
+ *
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * ENTERPRISE EDITION - World-Class Terminal Experience
6
+ * ═══════════════════════════════════════════════════════════════════════════════
7
+ *
8
+ * Comprehensive environment checks with auto-fix capability.
9
+ *
10
+ * Features:
11
+ * - Full environment diagnostics (Node, npm, OS, build tools, etc.)
12
+ * - OS-specific quirk detection (Windows/macOS/Linux)
13
+ * - Known failure signature matching with exact remediation
14
+ * - "Fix Script" generation (copy-paste commands)
15
+ * - "Diagnosis Receipt" JSON export
16
+ * - Safe `--repair` mode for non-destructive fixes
17
+ */
18
+
19
+ const fs = require("fs");
20
+ const path = require("path");
21
+ const {
22
+ generateRunId,
23
+ createJsonOutput,
24
+ writeJsonOutput,
25
+ exitCodeToVerdict,
26
+ verdictToExitCode,
27
+ saveArtifact
28
+ } = require("./lib/cli-output");
29
+ const { parseGlobalFlags, shouldShowBanner, shouldSuppressOutput, isJsonMode } = require("./lib/global-flags");
30
+ const { EXIT } = require("./lib/exit-codes");
31
+ const { formatWorkflowUpsell } = require("./lib/upsell");
32
+ const { getApiKey } = require("./lib/auth");
33
+
34
+ // ═══════════════════════════════════════════════════════════════════════════════
35
+ // ADVANCED TERMINAL - ANSI CODES & UTILITIES
36
+ // ═══════════════════════════════════════════════════════════════════════════════
37
+
38
+ const c = {
39
+ reset: '\x1b[0m',
40
+ bold: '\x1b[1m',
41
+ dim: '\x1b[2m',
42
+ italic: '\x1b[3m',
43
+ underline: '\x1b[4m',
44
+ // Colors
45
+ black: '\x1b[30m',
46
+ red: '\x1b[31m',
47
+ green: '\x1b[32m',
48
+ yellow: '\x1b[33m',
49
+ blue: '\x1b[34m',
50
+ magenta: '\x1b[35m',
51
+ cyan: '\x1b[36m',
52
+ white: '\x1b[37m',
53
+ // Bright colors
54
+ gray: '\x1b[90m',
55
+ brightRed: '\x1b[91m',
56
+ brightGreen: '\x1b[92m',
57
+ brightYellow: '\x1b[93m',
58
+ brightBlue: '\x1b[94m',
59
+ brightMagenta: '\x1b[95m',
60
+ brightCyan: '\x1b[96m',
61
+ brightWhite: '\x1b[97m',
62
+ // Cursor control
63
+ clearLine: '\x1b[2K',
64
+ hideCursor: '\x1b[?25l',
65
+ showCursor: '\x1b[?25h',
66
+ };
67
+
68
+ // 256-color / True color support
69
+ const rgb = (r, g, b) => `\x1b[38;2;${r};${g};${b}m`;
70
+ const bgRgb = (r, g, b) => `\x1b[48;2;${r};${g};${b}m`;
71
+
72
+ // Premium color palette
73
+ const colors = {
74
+ // Gradients for banner
75
+ gradient1: rgb(100, 200, 255), // Light blue
76
+ gradient2: rgb(80, 180, 255), // Blue
77
+ gradient3: rgb(60, 160, 255), // Deeper blue
78
+ gradient4: rgb(40, 140, 255), // Even deeper
79
+ gradient5: rgb(20, 120, 255), // Deep blue
80
+ gradient6: rgb(0, 100, 255), // Navy
81
+
82
+ // Status colors
83
+ healthy: rgb(0, 255, 150),
84
+ warning: rgb(255, 200, 0),
85
+ error: rgb(255, 80, 80),
86
+ critical: rgb(255, 40, 40),
87
+
88
+ // UI colors
89
+ accent: rgb(100, 200, 255),
90
+ muted: rgb(120, 120, 140),
91
+ subtle: rgb(80, 80, 100),
92
+ highlight: rgb(255, 255, 255),
93
+
94
+ // Category colors
95
+ system: rgb(150, 200, 255),
96
+ runtime: rgb(200, 150, 255),
97
+ project: rgb(255, 200, 150),
98
+ security: rgb(255, 150, 150),
99
+ network: rgb(150, 255, 200),
100
+ vibecheck: rgb(255, 150, 255),
101
+ };
102
+
103
+ // ═══════════════════════════════════════════════════════════════════════════════
104
+ // PREMIUM BANNER
105
+ // ═══════════════════════════════════════════════════════════════════════════════
106
+
107
+ const DOCTOR_BANNER = `
108
+ ${rgb(100, 200, 255)} ██████╗ ██████╗ ██████╗████████╗ ██████╗ ██████╗ ${c.reset}
109
+ ${rgb(80, 180, 255)} ██╔══██╗██╔═══██╗██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗${c.reset}
110
+ ${rgb(60, 160, 255)} ██║ ██║██║ ██║██║ ██║ ██║ ██║██████╔╝${c.reset}
111
+ ${rgb(40, 140, 255)} ██║ ██║██║ ██║██║ ██║ ██║ ██║██╔══██╗${c.reset}
112
+ ${rgb(20, 120, 255)} ██████╔╝╚██████╔╝╚██████╗ ██║ ╚██████╔╝██║ ██║${c.reset}
113
+ ${rgb(0, 100, 255)} ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝${c.reset}
114
+ `;
115
+
116
+ const BANNER_FULL = `
117
+ ${rgb(100, 200, 255)} ██╗ ██╗██╗██████╗ ███████╗ ██████╗██╗ ██╗███████╗ ██████╗██╗ ██╗${c.reset}
118
+ ${rgb(90, 190, 255)} ██║ ██║██║██╔══██╗██╔════╝██╔════╝██║ ██║██╔════╝██╔════╝██║ ██╔╝${c.reset}
119
+ ${rgb(80, 180, 255)} ██║ ██║██║██████╔╝█████╗ ██║ ███████║█████╗ ██║ █████╔╝ ${c.reset}
120
+ ${rgb(60, 160, 255)} ╚██╗ ██╔╝██║██╔══██╗██╔══╝ ██║ ██╔══██║██╔══╝ ██║ ██╔═██╗ ${c.reset}
121
+ ${rgb(40, 140, 255)} ╚████╔╝ ██║██████╔╝███████╗╚██████╗██║ ██║███████╗╚██████╗██║ ██╗${c.reset}
122
+ ${rgb(20, 120, 255)} ╚═══╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝${c.reset}
123
+
124
+ ${c.dim} ┌─────────────────────────────────────────────────────────────────────┐${c.reset}
125
+ ${c.dim} │${c.reset} ${rgb(100, 200, 255)}🩺${c.reset} ${c.bold}DOCTOR${c.reset} ${c.dim}•${c.reset} ${rgb(200, 200, 200)}Environment Diagnostics${c.reset} ${c.dim}•${c.reset} ${rgb(150, 150, 150)}Auto-Fix${c.reset} ${c.dim}•${c.reset} ${rgb(100, 100, 100)}Health Check${c.reset} ${c.dim}│${c.reset}
126
+ ${c.dim} └─────────────────────────────────────────────────────────────────────┘${c.reset}
127
+ `;
128
+
129
+ // ═══════════════════════════════════════════════════════════════════════════════
130
+ // TERMINAL UTILITIES
131
+ // ═══════════════════════════════════════════════════════════════════════════════
132
+
133
+ const BOX = {
134
+ topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',
135
+ horizontal: '─', vertical: '│',
136
+ teeRight: '├', teeLeft: '┤', teeDown: '┬', teeUp: '┴',
137
+ cross: '┼',
138
+ dTopLeft: '╔', dTopRight: '╗', dBottomLeft: '╚', dBottomRight: '╝',
139
+ dHorizontal: '═', dVertical: '║',
140
+ };
141
+
142
+ const ICONS = {
143
+ doctor: '🩺',
144
+ check: '✓',
145
+ cross: '✗',
146
+ warning: '⚠',
147
+ info: 'ℹ',
148
+ arrow: '→',
149
+ bullet: '•',
150
+ sparkle: '✨',
151
+ wrench: '🔧',
152
+ shield: '🛡️',
153
+ lightning: '⚡',
154
+ package: '📦',
155
+ folder: '📁',
156
+ file: '📄',
157
+ gear: '⚙️',
158
+ clock: '⏱',
159
+ network: '🌐',
160
+ lock: '🔒',
161
+ node: '📗',
162
+ npm: '📦',
163
+ ts: '🔷',
164
+ disk: '💾',
165
+ memory: '🧠',
166
+ cpu: '🖥️',
167
+ healthy: '💚',
168
+ sick: '🤒',
169
+ };
170
+
171
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
172
+ const SPINNER_DOTS = ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'];
173
+
174
+ let spinnerIndex = 0;
175
+ let spinnerInterval = null;
176
+ let spinnerStartTime = null;
177
+
178
+ function formatDuration(ms) {
179
+ if (ms < 1000) return `${ms}ms`;
180
+ if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;
181
+ return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;
182
+ }
183
+
184
+ function truncate(str, len) {
185
+ if (!str) return '';
186
+ if (str.length <= len) return str;
187
+ return str.slice(0, len - 3) + '...';
188
+ }
189
+
190
+ function padCenter(str, width) {
191
+ const padding = Math.max(0, width - str.length);
192
+ const left = Math.floor(padding / 2);
193
+ const right = padding - left;
194
+ return ' '.repeat(left) + str + ' '.repeat(right);
195
+ }
196
+
197
+ function progressBar(percent, width = 30, opts = {}) {
198
+ const filled = Math.round((percent / 100) * width);
199
+ const empty = width - filled;
200
+
201
+ let filledColor;
202
+ if (opts.color) {
203
+ filledColor = opts.color;
204
+ } else if (percent >= 80) {
205
+ filledColor = colors.healthy;
206
+ } else if (percent >= 50) {
207
+ filledColor = colors.warning;
208
+ } else {
209
+ filledColor = colors.error;
210
+ }
211
+
212
+ const filledChar = opts.filled || '█';
213
+ const emptyChar = opts.empty || '░';
214
+
215
+ return `${filledColor}${filledChar.repeat(filled)}${c.dim}${emptyChar.repeat(empty)}${c.reset}`;
216
+ }
217
+
218
+ function startSpinner(message, style = 'dots') {
219
+ const frames = style === 'dots' ? SPINNER_DOTS : SPINNER_FRAMES;
220
+ spinnerStartTime = Date.now();
221
+ process.stdout.write(c.hideCursor);
222
+
223
+ spinnerInterval = setInterval(() => {
224
+ const elapsed = formatDuration(Date.now() - spinnerStartTime);
225
+ process.stdout.write(`\r${c.clearLine} ${colors.accent}${frames[spinnerIndex]}${c.reset} ${message} ${c.dim}${elapsed}${c.reset}`);
226
+ spinnerIndex = (spinnerIndex + 1) % frames.length;
227
+ }, 80);
228
+ }
229
+
230
+ function stopSpinner(message, success = true) {
231
+ if (spinnerInterval) {
232
+ clearInterval(spinnerInterval);
233
+ spinnerInterval = null;
234
+ }
235
+ const elapsed = spinnerStartTime ? formatDuration(Date.now() - spinnerStartTime) : '';
236
+ const icon = success ? `${colors.healthy}${ICONS.check}${c.reset}` : `${colors.error}${ICONS.cross}${c.reset}`;
237
+ process.stdout.write(`\r${c.clearLine} ${icon} ${message} ${c.dim}${elapsed}${c.reset}\n`);
238
+ process.stdout.write(c.showCursor);
239
+ spinnerStartTime = null;
240
+ }
241
+
242
+ function printBanner(compact = false) {
243
+ console.log(compact ? DOCTOR_BANNER : BANNER_FULL);
244
+ }
245
+
246
+ function printDivider(char = '─', width = 69, color = c.dim) {
247
+ console.log(`${color} ${char.repeat(width)}${c.reset}`);
248
+ }
249
+
250
+ function printSection(title, icon = '◆') {
251
+ console.log();
252
+ console.log(` ${colors.accent}${icon}${c.reset} ${c.bold}${title}${c.reset}`);
253
+ printDivider();
254
+ }
255
+
256
+ // ═══════════════════════════════════════════════════════════════════════════════
257
+ // CATEGORY ICONS & COLORS
258
+ // ═══════════════════════════════════════════════════════════════════════════════
259
+
260
+ function getCategoryIcon(category) {
261
+ const icons = {
262
+ system: ICONS.cpu,
263
+ runtime: ICONS.node,
264
+ project: ICONS.package,
265
+ dependencies: ICONS.npm,
266
+ security: ICONS.shield,
267
+ network: ICONS.network,
268
+ vibecheck: ICONS.sparkle,
269
+ };
270
+ return icons[category] || ICONS.gear;
271
+ }
272
+
273
+ function getCategoryColor(category) {
274
+ const colorMap = {
275
+ system: colors.system,
276
+ runtime: colors.runtime,
277
+ project: colors.project,
278
+ dependencies: colors.accent,
279
+ security: colors.security,
280
+ network: colors.network,
281
+ vibecheck: colors.vibecheck,
282
+ };
283
+ return colorMap[category] || colors.accent;
284
+ }
285
+
286
+ // ═══════════════════════════════════════════════════════════════════════════════
287
+ // DOCTOR SERVICE LOADING
288
+ // ═══════════════════════════════════════════════════════════════════════════════
289
+
290
+ let DoctorService;
291
+ try {
292
+ DoctorService = require("./lib/doctor").DoctorService;
293
+ } catch {
294
+ // Fallback to legacy implementations
295
+ try {
296
+ DoctorService = require("./lib/doctor-v2").DoctorV2;
297
+ } catch {
298
+ DoctorService = require("./lib/doctor-enhanced").DoctorEnhanced;
299
+ }
300
+ }
301
+
302
+ // ═══════════════════════════════════════════════════════════════════════════════
303
+ // MAIN DOCTOR FUNCTION
304
+ // ═══════════════════════════════════════════════════════════════════════════════
305
+
306
+ async function runDoctor(args, context = {}) {
307
+ // Extract runId from context or generate new one
308
+ const runId = context.runId || generateRunId();
309
+ const startTime = context.startTime || new Date().toISOString();
310
+
311
+ const opts = parseArgs(args);
312
+ const quiet = shouldSuppressOutput(opts);
313
+ const json = isJsonMode(opts);
314
+ const executionStart = Date.now();
315
+
316
+ if (opts.help) {
317
+ printHelp(shouldShowBanner(opts));
318
+ return EXIT.SUCCESS;
319
+ }
320
+
321
+ // Handle --list-actions (list available repair actions)
322
+ if (opts.listActions) {
323
+ return handleListActions(opts);
324
+ }
325
+
326
+ // Handle --analyze (match error text against known signatures)
327
+ if (opts.analyze) {
328
+ return handleAnalyzeError(opts.analyze, opts);
329
+ }
330
+
331
+ const projectPath = path.resolve(opts.path || process.cwd());
332
+
333
+ // Validate project path exists
334
+ if (!fs.existsSync(projectPath)) {
335
+ if (json) {
336
+ console.log(JSON.stringify({ success: false, error: `Project path does not exist: ${projectPath}` }));
337
+ } else {
338
+ console.error(` ❌ Project path does not exist: ${projectPath}`);
339
+ }
340
+ return EXIT.NOT_FOUND;
341
+ }
342
+ const projectName = path.basename(projectPath);
343
+
344
+ try {
345
+ // Print banner conditionally
346
+ if (shouldShowBanner(opts) && !quiet) {
347
+ printBanner();
348
+ console.log(` ${c.dim}Project:${c.reset} ${c.bold}${projectName}${c.reset}`);
349
+ console.log(` ${c.dim}Path:${c.reset} ${projectPath}`);
350
+ console.log();
351
+ }
352
+
353
+ // Use new DoctorService if available
354
+ if (DoctorService.name === 'DoctorService') {
355
+ const doctor = new DoctorService(projectPath, {
356
+ json: opts.json,
357
+ fix: opts.fix && !opts.repair, // Don't use old fix if repair mode
358
+ fixDryRun: opts.dryRun,
359
+ quiet: opts.quiet || quiet,
360
+ verbose: opts.verbose,
361
+ categories: opts.categories,
362
+ skipNetwork: opts.skipNetwork,
363
+ saveReport: opts.saveReport,
364
+ failOnWarn: opts.failOnWarn,
365
+ runId,
366
+ });
367
+
368
+ const results = await doctor.run();
369
+ const endTime = new Date().toISOString();
370
+
371
+ // Get diagnostic results for enhanced features
372
+ const diagnostics = doctor.results || results.checks || [];
373
+
374
+ // Handle --repair mode (safe repairs only)
375
+ if (opts.repair) {
376
+ const repairResults = await handleRepairMode(diagnostics, projectPath, opts);
377
+ if (repairResults.needsRecheck) {
378
+ if (!quiet && !json) {
379
+ console.log(`\n ${colors.accent}↻${c.reset} Re-running diagnostics after repairs...\n`);
380
+ }
381
+ return runDoctor(args.filter(a => a !== '--repair'), context);
382
+ }
383
+ }
384
+
385
+ // Handle --fix-script (generate copy-paste fix commands)
386
+ if (opts.fixScript) {
387
+ handleFixScript(diagnostics, projectPath, opts);
388
+ }
389
+
390
+ // Handle --receipt (generate diagnosis receipt JSON)
391
+ if (opts.receipt) {
392
+ handleReceipt(diagnostics, projectPath, { startTime, endTime, runId }, opts);
393
+ }
394
+
395
+ // Apply CLI output conventions
396
+ if (opts.json || json) {
397
+ // Enhanced JSON output with receipt format
398
+ const output = createJsonOutput({
399
+ runId,
400
+ command: "doctor",
401
+ startTime,
402
+ exitCode: results.exitCode || EXIT.SUCCESS,
403
+ verdict: exitCodeToVerdict(results.exitCode || EXIT.SUCCESS),
404
+ result: {
405
+ health: results.health || "unknown",
406
+ checks: diagnostics.map(d => ({
407
+ id: d.id,
408
+ name: d.name,
409
+ category: d.category,
410
+ severity: d.severity,
411
+ message: d.message,
412
+ detail: d.detail,
413
+ fixes: d.fixes,
414
+ })),
415
+ fixes: results.fixes || [],
416
+ summary: {
417
+ total: results.totalChecks || diagnostics.length,
418
+ passed: results.passedChecks || diagnostics.filter(d => d.severity === 'pass').length,
419
+ warnings: results.warnings || diagnostics.filter(d => d.severity === 'warning').length,
420
+ errors: results.errors || diagnostics.filter(d => d.severity === 'error' || d.severity === 'critical').length,
421
+ }
422
+ },
423
+ tier: "free",
424
+ version: require("../../package.json").version,
425
+ artifacts: results.reportPath ? [{
426
+ type: "report",
427
+ path: results.reportPath,
428
+ description: "Doctor report"
429
+ }] : []
430
+ });
431
+
432
+ writeJsonOutput(output, opts.output);
433
+ }
434
+
435
+ // Save artifacts
436
+ if (diagnostics.length > 0) {
437
+ saveArtifact(runId, "checks", diagnostics);
438
+ }
439
+ if (results.fixes) {
440
+ saveArtifact(runId, "fixes", results.fixes);
441
+ }
442
+
443
+ // Map results to proper exit codes
444
+ if (results.errors > 0) return EXIT.BLOCKING;
445
+ if (results.warnings > 0) return EXIT.WARNINGS;
446
+ return EXIT.SUCCESS;
447
+ }
448
+
449
+ // Legacy fallback
450
+ const doctor = new DoctorService(projectPath, opts);
451
+ return await doctor.diagnose();
452
+ } catch (error) {
453
+ if (json) {
454
+ console.log(JSON.stringify({ success: false, error: error.message }));
455
+ } else {
456
+ console.error(` ❌ Doctor check failed: ${error.message}`);
457
+ }
458
+ return EXIT.INTERNAL_ERROR;
459
+ }
460
+ }
461
+
462
+ // ═══════════════════════════════════════════════════════════════════════════════
463
+ // ENHANCED FEATURE HANDLERS
464
+ // ═══════════════════════════════════════════════════════════════════════════════
465
+
466
+ function handleListActions(opts) {
467
+ const safeRepair = require('./lib/doctor/safe-repair');
468
+ const actions = safeRepair.listSafeRepairActions();
469
+
470
+ if (opts.json) {
471
+ console.log(JSON.stringify({ actions }, null, 2));
472
+ } else {
473
+ console.log(`\n ${colors.accent}🔧${c.reset} ${c.bold}Available Safe Repair Actions${c.reset}\n`);
474
+ printDivider();
475
+
476
+ for (const action of actions) {
477
+ console.log(` ${colors.healthy}${action.id}${c.reset}`);
478
+ console.log(` ${action.name}`);
479
+ console.log(` ${c.dim}${action.description}${c.reset}`);
480
+ console.log();
481
+ }
482
+ }
483
+
484
+ return EXIT.SUCCESS;
485
+ }
486
+
487
+ function handleAnalyzeError(errorText, opts) {
488
+ const failureSignatures = require('./lib/doctor/failure-signatures');
489
+ const matches = failureSignatures.matchFailureSignatures(errorText);
490
+
491
+ if (opts.json) {
492
+ console.log(JSON.stringify({
493
+ analyzed: errorText.slice(0, 200),
494
+ matches: matches.map(m => ({
495
+ id: m.id,
496
+ name: m.name,
497
+ diagnosis: m.diagnosis,
498
+ remediation: m.remediation,
499
+ commands: m.commands,
500
+ })),
501
+ safeCommands: failureSignatures.getSafeCommands(matches),
502
+ }, null, 2));
503
+ } else {
504
+ if (matches.length === 0) {
505
+ console.log(`\n ${colors.warning}⚠${c.reset} No known failure signatures matched.\n`);
506
+ console.log(` ${c.dim}Try running: vibecheck doctor --verbose${c.reset}\n`);
507
+ } else {
508
+ console.log(`\n ${colors.healthy}✓${c.reset} ${c.bold}Matched ${matches.length} known failure signature(s)${c.reset}\n`);
509
+ printDivider();
510
+
511
+ for (const match of matches) {
512
+ console.log(failureSignatures.formatDiagnosis(match));
513
+ console.log();
514
+ }
515
+ }
516
+ }
517
+
518
+ return EXIT.SUCCESS;
519
+ }
520
+
521
+ async function handleRepairMode(diagnostics, projectPath, opts) {
522
+ const safeRepair = require('./lib/doctor/safe-repair');
523
+
524
+ const quiet = shouldSuppressOutput(opts);
525
+ const json = isJsonMode(opts);
526
+
527
+ if (!quiet && !json) {
528
+ console.log(`\n ${colors.accent}🔧${c.reset} ${c.bold}Safe Repair Mode${c.reset}`);
529
+ printDivider();
530
+ }
531
+
532
+ const repairResults = await safeRepair.runSafeRepair(diagnostics, projectPath, {
533
+ dryRun: opts.dryRun,
534
+ verbose: opts.verbose,
535
+ });
536
+
537
+ if (json) {
538
+ console.log(JSON.stringify({ repair: repairResults }, null, 2));
539
+ } else if (!quiet) {
540
+ const { summary, results } = repairResults;
541
+
542
+ for (const result of results) {
543
+ const icon = result.status === 'success' ? `${colors.healthy}✓` :
544
+ result.status === 'failed' ? `${colors.error}✗` :
545
+ `${colors.warning}○`;
546
+ console.log(` ${icon}${c.reset} ${result.actionName}`);
547
+ console.log(` ${c.dim}${result.message}${c.reset}`);
548
+ }
549
+
550
+ console.log();
551
+ console.log(` ${c.bold}Summary:${c.reset} ${summary.succeeded} succeeded, ${summary.failed} failed, ${summary.skipped} skipped`);
552
+ }
553
+
554
+ return repairResults;
555
+ }
556
+
557
+ function handleFixScript(diagnostics, projectPath, opts) {
558
+ const fixScript = require('./lib/doctor/fix-script');
559
+
560
+ const quiet = shouldSuppressOutput(opts);
561
+ const json = isJsonMode(opts);
562
+
563
+ const format = opts.json ? 'json' : (opts.output?.endsWith('.md') ? 'markdown' : 'shell');
564
+ const result = fixScript.generateFixScript(diagnostics, {
565
+ projectPath,
566
+ format,
567
+ includeDangerous: false,
568
+ safeOnly: true,
569
+ });
570
+
571
+ if (json || format === 'json') {
572
+ console.log(JSON.stringify(result, null, 2));
573
+ } else if (!quiet) {
574
+ // Save to file if output specified
575
+ if (opts.output) {
576
+ fs.writeFileSync(opts.output, result.script);
577
+ console.log(`\n ${colors.healthy}✓${c.reset} Fix script saved to: ${opts.output}`);
578
+ } else {
579
+ console.log(`\n ${colors.accent}📋${c.reset} ${c.bold}Fix Script${c.reset}`);
580
+ printDivider();
581
+ console.log(result.script);
582
+ }
583
+
584
+ console.log(`\n ${c.dim}Safe fixes: ${result.safeFixes}, Dangerous: ${result.dangerousFixes}, Manual: ${result.manualFixes}${c.reset}`);
585
+ }
586
+ }
587
+
588
+ function handleReceipt(diagnostics, projectPath, timing, opts) {
589
+ // Lazy load the module
590
+ const diagnosisReceipt = require('./lib/doctor/diagnosis-receipt');
591
+
592
+ const quiet = shouldSuppressOutput(opts);
593
+ const json = isJsonMode(opts);
594
+
595
+ const receipt = diagnosisReceipt.generateDiagnosisReceipt(diagnostics, {
596
+ projectPath,
597
+ startTime: timing.startTime,
598
+ endTime: timing.endTime,
599
+ runId: timing.runId,
600
+ });
601
+
602
+ if (json) {
603
+ console.log(JSON.stringify(receipt, null, 2));
604
+ } else {
605
+ // Save to file
606
+ const outputPath = opts.output || path.join(projectPath, '.vibecheck', 'diagnosis-receipt.json');
607
+ diagnosisReceipt.saveReceipt(receipt, outputPath);
608
+
609
+ if (!quiet) {
610
+ console.log(`\n ${colors.healthy}✓${c.reset} Diagnosis receipt saved to: ${outputPath}`);
611
+ console.log(` ${c.dim}Receipt ID: ${receipt.receiptId}${c.reset}`);
612
+ console.log(` ${c.dim}Health: ${receipt.health.grade} (${receipt.health.score}/100) - ${receipt.health.verdict}${c.reset}`);
613
+ }
614
+ }
615
+ }
616
+
617
+ function parseArgs(args) {
618
+ // Parse global flags first
619
+ const { flags: globalFlags, cleanArgs } = parseGlobalFlags(args);
620
+
621
+ const opts = {
622
+ ...globalFlags, // Merge global flags (json, verbose, noBanner, quiet, ci, help, etc.)
623
+ path: globalFlags.path || process.cwd(),
624
+ fix: false,
625
+ dryRun: false,
626
+ output: null,
627
+ categories: null,
628
+ skipNetwork: false,
629
+ saveReport: true,
630
+ failOnWarn: false,
631
+ // New options for enhanced doctor
632
+ repair: false, // Safe repair mode (--repair)
633
+ fixScript: false, // Generate fix script (--fix-script)
634
+ receipt: false, // Generate diagnosis receipt (--receipt)
635
+ analyze: null, // Analyze error output (--analyze <text>)
636
+ listActions: false, // List available repair actions (--list-actions)
637
+ };
638
+
639
+ // Parse command-specific args from cleanArgs
640
+ for (let i = 0; i < cleanArgs.length; i++) {
641
+ const arg = cleanArgs[i];
642
+ switch (arg) {
643
+ case '--help':
644
+ case '-h':
645
+ opts.help = true;
646
+ break;
647
+ case '--path':
648
+ case '-p':
649
+ opts.path = cleanArgs[++i];
650
+ break;
651
+ case '--fix':
652
+ opts.fix = true;
653
+ break;
654
+ case '--repair':
655
+ opts.repair = true;
656
+ break;
657
+ case '--dry-run':
658
+ opts.dryRun = true;
659
+ break;
660
+ case '--fix-script':
661
+ opts.fixScript = true;
662
+ break;
663
+ case '--receipt':
664
+ opts.receipt = true;
665
+ break;
666
+ case '--analyze':
667
+ opts.analyze = cleanArgs[++i];
668
+ break;
669
+ case '--list-actions':
670
+ opts.listActions = true;
671
+ break;
672
+ case '--category':
673
+ case '-c':
674
+ if (!opts.categories) opts.categories = [];
675
+ opts.categories.push(cleanArgs[++i]);
676
+ break;
677
+ case '--skip-network':
678
+ opts.skipNetwork = true;
679
+ break;
680
+ case '--no-report':
681
+ opts.saveReport = false;
682
+ break;
683
+ case '--fail-on-warn':
684
+ opts.failOnWarn = true;
685
+ break;
686
+ case '--strict':
687
+ opts.strict = true;
688
+ break;
689
+ case '--output':
690
+ case '-o':
691
+ opts.output = cleanArgs[++i];
692
+ break;
693
+ default:
694
+ if (!arg.startsWith('-')) {
695
+ opts.path = path.resolve(arg);
696
+ }
697
+ }
698
+ }
699
+
700
+ return opts;
701
+ }
702
+
703
+ function printHelp(showBanner = true) {
704
+ if (showBanner && shouldShowBanner({})) {
705
+ console.log(BANNER_FULL);
706
+ }
707
+ console.log(`
708
+ ${c.bold}Usage:${c.reset} vibecheck doctor (health, diag) [options] [path]
709
+
710
+ ${c.bold}Environment Diagnostics${c.reset} — Comprehensive checks with auto-fix capability.
711
+ World-class diagnostic that gets you unblocked in minutes.
712
+
713
+ ${c.bold}Core Options:${c.reset}
714
+ ${colors.accent}--path, -p <path>${c.reset} Project path ${c.dim}(default: current directory)${c.reset}
715
+ ${colors.accent}--json${c.reset} Output JSON report only
716
+ ${colors.accent}--fix${c.reset} Auto-fix issues when possible
717
+ ${colors.accent}--dry-run${c.reset} Show what fixes would be applied
718
+ ${colors.accent}--quiet, -q${c.reset} Minimal output
719
+ ${colors.accent}--verbose, -v${c.reset} Show detailed output and fix commands
720
+ ${colors.accent}--category, -c <cat>${c.reset} Run specific category ${c.dim}(can repeat)${c.reset}
721
+ ${colors.accent}--skip-network${c.reset} Skip network connectivity checks
722
+ ${colors.accent}--no-report${c.reset} Don't save report files
723
+ ${colors.accent}--fail-on-warn${c.reset} Exit code 2 for warnings ${c.dim}(CI mode)${c.reset}
724
+ ${colors.accent}--help, -h${c.reset} Show this help
725
+
726
+ ${c.bold}Legendary Features:${c.reset}
727
+ ${colors.healthy}--repair${c.reset} Safe repair mode ${c.dim}(clear cache, regen lock, etc.)${c.reset}
728
+ ${colors.healthy}--fix-script${c.reset} Generate copy-paste fix commands
729
+ ${colors.healthy}--receipt${c.reset} Generate diagnosis receipt JSON
730
+ ${colors.healthy}--analyze <error>${c.reset} Match error against known failure signatures
731
+ ${colors.healthy}--list-actions${c.reset} List all available safe repair actions
732
+
733
+ ${c.bold}Categories:${c.reset}
734
+ ${colors.system}${ICONS.cpu}${c.reset} ${c.bold}system${c.reset} ${c.dim}OS, memory, disk, CPU, shell${c.reset}
735
+ ${colors.runtime}${ICONS.node}${c.reset} ${c.bold}runtime${c.reset} ${c.dim}Node.js, npm, pnpm, yarn${c.reset}
736
+ ${colors.project}${ICONS.package}${c.reset} ${c.bold}project${c.reset} ${c.dim}package.json, tsconfig, git state${c.reset}
737
+ ${colors.accent}${ICONS.npm}${c.reset} ${c.bold}dependencies${c.reset} ${c.dim}Outdated packages, vulnerabilities${c.reset}
738
+ ${colors.security}${ICONS.shield}${c.reset} ${c.bold}security${c.reset} ${c.dim}Secrets, gitignore, env files${c.reset}
739
+ ${colors.network}${ICONS.network}${c.reset} ${c.bold}network${c.reset} ${c.dim}Internet, npm registry, API${c.reset}
740
+ ${colors.vibecheck}${ICONS.sparkle}${c.reset} ${c.bold}vibecheck${c.reset} ${c.dim}Config, truth pack, scan status${c.reset}
741
+
742
+ ${c.bold}OS-Specific Checks:${c.reset}
743
+ ${c.dim}Windows:${c.reset} Long paths, PowerShell policy, antivirus, symlinks
744
+ ${c.dim}macOS:${c.reset} Xcode CLI tools, Homebrew, Rosetta 2, file limits
745
+ ${c.dim}Linux:${c.reset} build-essential, inotify watches, distro detection
746
+
747
+ ${c.bold}Exit Codes:${c.reset}
748
+ ${colors.healthy}0${c.reset} Healthy ${c.dim}(or warnings without --fail-on-warn)${c.reset}
749
+ ${colors.warning}1${c.reset} Warnings found
750
+ ${colors.error}2${c.reset} Errors found
751
+ ${colors.critical}3${c.reset} Critical issues found
752
+
753
+ ${c.bold}Examples:${c.reset}
754
+ ${c.dim}# Full diagnostic${c.reset}
755
+ vibecheck doctor
756
+
757
+ ${c.dim}# Safe repair mode (recommended first step)${c.reset}
758
+ vibecheck doctor --repair
759
+
760
+ ${c.dim}# Generate fix script for manual review${c.reset}
761
+ vibecheck doctor --fix-script -o fix.sh
762
+
763
+ ${c.dim}# Analyze a specific error message${c.reset}
764
+ vibecheck doctor --analyze "EACCES permission denied"
765
+
766
+ ${c.dim}# Generate diagnosis receipt for support${c.reset}
767
+ vibecheck doctor --receipt --json > diagnosis.json
768
+
769
+ ${c.dim}# JSON output for CI${c.reset}
770
+ vibecheck doctor --json --fail-on-warn
771
+
772
+ ${c.dim}# Security checks only${c.reset}
773
+ vibecheck doctor -c security
774
+
775
+ ${c.dim}# Skip slow network checks${c.reset}
776
+ vibecheck doctor --skip-network
777
+ `);
778
+ }
779
+
780
+ // Legacy function for backwards compatibility
781
+ function runDoctorLegacy() {
782
+ console.log("\n 🩺 vibecheck DOCTOR\n");
783
+
784
+ const checks = [];
785
+
786
+ // Node version
787
+ const nodeVersion = process.version;
788
+ const nodeMajor = parseInt(nodeVersion.slice(1).split(".")[0], 10);
789
+ checks.push({
790
+ name: "Node.js",
791
+ status: nodeMajor >= 18 ? "pass" : "fail",
792
+ message: `${nodeVersion}`,
793
+ fix: nodeMajor < 18 ? "Upgrade to Node.js 18+" : null,
794
+ });
795
+
796
+ // Config file
797
+ const configPath = path.join(process.cwd(), ".vibecheckrc");
798
+ const hasConfig =
799
+ fs.existsSync(configPath) ||
800
+ fs.existsSync(path.join(process.cwd(), ".vibecheckrc"));
801
+ checks.push({
802
+ name: "Config",
803
+ status: hasConfig ? "pass" : "warn",
804
+ message: hasConfig ? "Found" : "Not found",
805
+ fix: !hasConfig ? "Run: vibecheck init" : null,
806
+ });
807
+
808
+ // Output directory
809
+ const outputDir = path.join(process.cwd(), ".vibecheck");
810
+ const hasOutput = fs.existsSync(outputDir);
811
+ checks.push({
812
+ name: "Output Dir",
813
+ status: hasOutput ? "pass" : "info",
814
+ message: hasOutput ? ".vibecheck/" : "Will be created on first scan",
815
+ });
816
+
817
+ // Package.json
818
+ const pkgPath = path.join(process.cwd(), "package.json");
819
+ const hasPkg = fs.existsSync(pkgPath);
820
+ checks.push({
821
+ name: "package.json",
822
+ status: hasPkg ? "pass" : "warn",
823
+ message: hasPkg ? "Found" : "Not found",
824
+ });
825
+
826
+ // TypeScript
827
+ const hasTsConfig = fs.existsSync(path.join(process.cwd(), "tsconfig.json"));
828
+ checks.push({
829
+ name: "TypeScript",
830
+ status: hasTsConfig ? "pass" : "info",
831
+ message: hasTsConfig ? "Enabled" : "JavaScript project",
832
+ });
833
+
834
+ // Collect results
835
+ let hasIssues = false;
836
+ const errors = [];
837
+ const warnings = [];
838
+
839
+ for (const check of checks) {
840
+ if (check.status === "fail") {
841
+ hasIssues = true;
842
+ errors.push({ message: check.message || check.name });
843
+ } else if (check.status === "warn") {
844
+ warnings.push({ message: check.message || check.name });
845
+ }
846
+ }
847
+
848
+ // Get tier for upsell
849
+ const { key } = getApiKey();
850
+ const currentTier = key ? "starter" : "free";
851
+
852
+ // Use Mission Control format
853
+ if (!opts.json && !opts.quiet) {
854
+ const { formatDoctorOutput } = require('./lib/doctor-output');
855
+ const summary = {
856
+ total: checks.length,
857
+ passed: checks.filter(c => c.status === "pass").length,
858
+ failed: checks.filter(c => c.status === "fail").length,
859
+ warnings: checks.filter(c => c.status === "warn").length,
860
+ };
861
+
862
+ console.log(formatDoctorOutput({
863
+ checks,
864
+ summary,
865
+ healthy: !hasIssues,
866
+ errors,
867
+ warnings,
868
+ }, { projectPath: root, version: 'v3.5.5' }));
869
+ }
870
+
871
+ return hasIssues ? EXIT.BLOCKING : EXIT.SUCCESS;
872
+ }
873
+
874
+ module.exports = {
875
+ runDoctor: runDoctor,
876
+ runDoctorLegacy: runDoctorLegacy,
877
+ };