@vibecheckai/cli 2.8.2 → 3.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 (454) hide show
  1. package/README.md +8 -8
  2. package/bin/_deprecations.js +35 -0
  3. package/bin/_router.js +46 -0
  4. package/bin/cli-hygiene.js +241 -0
  5. package/bin/guardrail.js +834 -0
  6. package/bin/runners/cli-utils.js +1070 -0
  7. package/bin/runners/context/ai-task-decomposer.js +337 -0
  8. package/bin/runners/context/analyzer.js +462 -0
  9. package/bin/runners/context/api-contracts.js +427 -0
  10. package/bin/runners/context/context-diff.js +342 -0
  11. package/bin/runners/context/context-pruner.js +291 -0
  12. package/bin/runners/context/dependency-graph.js +414 -0
  13. package/bin/runners/context/generators/claude.js +107 -0
  14. package/bin/runners/context/generators/codex.js +108 -0
  15. package/bin/runners/context/generators/copilot.js +119 -0
  16. package/bin/runners/context/generators/cursor.js +514 -0
  17. package/bin/runners/context/generators/mcp.js +151 -0
  18. package/bin/runners/context/generators/windsurf.js +180 -0
  19. package/bin/runners/context/git-context.js +302 -0
  20. package/bin/runners/context/index.js +1042 -0
  21. package/bin/runners/context/insights.js +173 -0
  22. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  23. package/bin/runners/context/mcp-server/index.js +1176 -0
  24. package/bin/runners/context/mcp-server/package.json +24 -0
  25. package/bin/runners/context/memory.js +200 -0
  26. package/bin/runners/context/monorepo.js +215 -0
  27. package/bin/runners/context/multi-repo-federation.js +404 -0
  28. package/bin/runners/context/patterns.js +253 -0
  29. package/bin/runners/context/proof-context.js +972 -0
  30. package/bin/runners/context/security-scanner.js +303 -0
  31. package/bin/runners/context/semantic-search.js +350 -0
  32. package/bin/runners/context/shared.js +264 -0
  33. package/bin/runners/context/team-conventions.js +310 -0
  34. package/bin/runners/lib/ai-bridge.js +416 -0
  35. package/bin/runners/lib/analysis-core.js +271 -0
  36. package/bin/runners/lib/analyzers.js +541 -0
  37. package/bin/runners/lib/audit-bridge.js +391 -0
  38. package/bin/runners/lib/auth-truth.js +193 -0
  39. package/bin/runners/lib/auth.js +215 -0
  40. package/bin/runners/lib/backup.js +62 -0
  41. package/bin/runners/lib/billing.js +107 -0
  42. package/bin/runners/lib/claims.js +118 -0
  43. package/bin/runners/lib/cli-ui.js +540 -0
  44. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  45. package/bin/runners/lib/compliance-bridge.js +165 -0
  46. package/bin/runners/lib/contracts/auth-contract.js +194 -0
  47. package/bin/runners/lib/contracts/env-contract.js +178 -0
  48. package/bin/runners/lib/contracts/external-contract.js +198 -0
  49. package/bin/runners/lib/contracts/guard.js +168 -0
  50. package/bin/runners/lib/contracts/index.js +89 -0
  51. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  52. package/bin/runners/lib/contracts/route-contract.js +192 -0
  53. package/bin/runners/lib/detect.js +89 -0
  54. package/bin/runners/lib/doctor/autofix.js +254 -0
  55. package/bin/runners/lib/doctor/index.js +37 -0
  56. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  57. package/bin/runners/lib/doctor/modules/index.js +46 -0
  58. package/bin/runners/lib/doctor/modules/network.js +250 -0
  59. package/bin/runners/lib/doctor/modules/project.js +312 -0
  60. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  61. package/bin/runners/lib/doctor/modules/security.js +348 -0
  62. package/bin/runners/lib/doctor/modules/system.js +213 -0
  63. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  64. package/bin/runners/lib/doctor/reporter.js +262 -0
  65. package/bin/runners/lib/doctor/service.js +262 -0
  66. package/bin/runners/lib/doctor/types.js +113 -0
  67. package/bin/runners/lib/doctor/ui.js +263 -0
  68. package/bin/runners/lib/doctor-enhanced.js +233 -0
  69. package/bin/runners/lib/doctor-v2.js +608 -0
  70. package/bin/runners/lib/enforcement.js +72 -0
  71. package/bin/runners/lib/enterprise-detect.js +603 -0
  72. package/bin/runners/lib/enterprise-init.js +942 -0
  73. package/bin/runners/lib/entitlements-v2.js +381 -0
  74. package/bin/runners/lib/entitlements.generated.js +0 -0
  75. package/bin/runners/lib/entitlements.js +332 -0
  76. package/bin/runners/lib/env-template.js +66 -0
  77. package/bin/runners/lib/env.js +189 -0
  78. package/bin/runners/lib/error-handler.js +320 -0
  79. package/bin/runners/lib/firewall-prompt.js +50 -0
  80. package/bin/runners/lib/graph/graph-builder.js +265 -0
  81. package/bin/runners/lib/graph/html-renderer.js +413 -0
  82. package/bin/runners/lib/graph/index.js +32 -0
  83. package/bin/runners/lib/graph/runtime-collector.js +215 -0
  84. package/bin/runners/lib/graph/static-extractor.js +518 -0
  85. package/bin/runners/lib/init-wizard.js +308 -0
  86. package/bin/runners/lib/json-output.js +76 -0
  87. package/bin/runners/lib/llm.js +75 -0
  88. package/bin/runners/lib/meter.js +61 -0
  89. package/bin/runners/lib/missions/evidence.js +126 -0
  90. package/bin/runners/lib/missions/plan.js +69 -0
  91. package/bin/runners/lib/missions/templates.js +147 -0
  92. package/bin/runners/lib/patch.js +40 -0
  93. package/bin/runners/lib/permissions/auth-model.js +213 -0
  94. package/bin/runners/lib/permissions/idor-prover.js +205 -0
  95. package/bin/runners/lib/permissions/index.js +45 -0
  96. package/bin/runners/lib/permissions/matrix-builder.js +198 -0
  97. package/bin/runners/lib/pkgjson.js +28 -0
  98. package/bin/runners/lib/preflight.js +142 -0
  99. package/bin/runners/lib/reality-findings.js +84 -0
  100. package/bin/runners/lib/redact.js +29 -0
  101. package/bin/runners/lib/replay/capsule-manager.js +154 -0
  102. package/bin/runners/lib/replay/index.js +263 -0
  103. package/bin/runners/lib/replay/player.js +348 -0
  104. package/bin/runners/lib/replay/recorder.js +331 -0
  105. package/bin/runners/lib/report-engine.js +447 -0
  106. package/bin/runners/lib/report-html.js +1117 -0
  107. package/bin/runners/lib/report-templates.js +964 -0
  108. package/bin/runners/lib/route-detection.js +1140 -0
  109. package/bin/runners/lib/route-truth.js +477 -0
  110. package/bin/runners/lib/sandbox/index.js +59 -0
  111. package/bin/runners/lib/sandbox/proof-chain.js +399 -0
  112. package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
  113. package/bin/runners/lib/sandbox/worktree.js +174 -0
  114. package/bin/runners/lib/scan-cache.js +330 -0
  115. package/bin/runners/lib/scan-output-schema.js +344 -0
  116. package/bin/runners/lib/score-history.js +282 -0
  117. package/bin/runners/lib/security-bridge.js +249 -0
  118. package/bin/runners/lib/server-usage.js +513 -0
  119. package/bin/runners/lib/share-pack.js +239 -0
  120. package/bin/runners/lib/snippets.js +67 -0
  121. package/bin/runners/lib/truth.js +667 -0
  122. package/bin/runners/lib/unified-output.js +189 -0
  123. package/bin/runners/lib/validate-patch.js +156 -0
  124. package/bin/runners/lib/verification.js +345 -0
  125. package/bin/runners/reality/engine.js +917 -0
  126. package/bin/runners/reality/flows.js +122 -0
  127. package/bin/runners/reality/report.js +378 -0
  128. package/bin/runners/reality/session.js +193 -0
  129. package/bin/runners/runAIAgent.js +2 -0
  130. package/bin/runners/runAudit.js +2 -0
  131. package/bin/runners/runAuth.js +106 -0
  132. package/bin/runners/runAutopilot.js +2 -0
  133. package/bin/runners/runBadge.js +2 -0
  134. package/bin/runners/runCertify.js +2 -0
  135. package/bin/runners/runClaimVerifier.js +483 -0
  136. package/bin/runners/runContext.js +56 -0
  137. package/bin/runners/runContextCompiler.js +385 -0
  138. package/bin/runners/runCtx.js +187 -0
  139. package/bin/runners/runCtxGuard.js +176 -0
  140. package/bin/runners/runCtxSync.js +116 -0
  141. package/bin/runners/runDashboard.js +10 -0
  142. package/bin/runners/runDoctor.js +245 -0
  143. package/bin/runners/runEnhancedShip.js +2 -0
  144. package/bin/runners/runFix.js +735 -0
  145. package/bin/runners/runFixPacks.js +2 -0
  146. package/bin/runners/runGate.js +17 -0
  147. package/bin/runners/runGraph.js +283 -0
  148. package/bin/runners/runInit.js +260 -0
  149. package/bin/runners/runInitGha.js +101 -0
  150. package/bin/runners/runInstall.js +76 -0
  151. package/bin/runners/runInteractive.js +388 -0
  152. package/bin/runners/runLaunch.js +2 -0
  153. package/bin/runners/runMcp.js +19 -0
  154. package/bin/runners/runMdc.js +2 -0
  155. package/bin/runners/runMissionGenerator.js +282 -0
  156. package/bin/runners/runNaturalLanguage.js +3 -0
  157. package/bin/runners/runPR.js +96 -0
  158. package/bin/runners/runPermissions.js +290 -0
  159. package/bin/runners/runPromptFirewall.js +211 -0
  160. package/bin/runners/runProof.js +2 -0
  161. package/bin/runners/runProve.js +392 -0
  162. package/bin/runners/runReality.js +489 -0
  163. package/bin/runners/runRealitySniff.js +2 -0
  164. package/bin/runners/runReplay.js +469 -0
  165. package/bin/runners/runReport.js +478 -0
  166. package/bin/runners/runScan.js +835 -0
  167. package/bin/runners/runShare.js +34 -0
  168. package/bin/runners/runShip.js +1062 -0
  169. package/bin/runners/runStatus.js +136 -0
  170. package/bin/runners/runTruthpack.js +634 -0
  171. package/bin/runners/runUpgrade.js +2 -0
  172. package/bin/runners/runValidate.js +2 -0
  173. package/bin/runners/runVerifyAgentOutput.js +2 -0
  174. package/bin/runners/runWatch.js +230 -0
  175. package/bin/runners/utils.js +360 -0
  176. package/bin/scan.js +612 -0
  177. package/bin/vibecheck.js +834 -0
  178. package/package.json +11 -11
  179. package/dist/autopatch/verified-autopatch.d.ts +0 -111
  180. package/dist/autopatch/verified-autopatch.d.ts.map +0 -1
  181. package/dist/autopatch/verified-autopatch.js +0 -503
  182. package/dist/autopatch/verified-autopatch.js.map +0 -1
  183. package/dist/bundles/index.js +0 -8
  184. package/dist/bundles/vibecheck-core.js +0 -25799
  185. package/dist/bundles/vibecheck-security.js +0 -208693
  186. package/dist/bundles/vibecheck-ship.js +0 -2318
  187. package/dist/commands/baseline.d.ts +0 -7
  188. package/dist/commands/baseline.d.ts.map +0 -1
  189. package/dist/commands/baseline.js +0 -79
  190. package/dist/commands/baseline.js.map +0 -1
  191. package/dist/commands/cache.d.ts +0 -13
  192. package/dist/commands/cache.d.ts.map +0 -1
  193. package/dist/commands/cache.js +0 -165
  194. package/dist/commands/cache.js.map +0 -1
  195. package/dist/commands/checkpoint.d.ts +0 -8
  196. package/dist/commands/checkpoint.d.ts.map +0 -1
  197. package/dist/commands/checkpoint.js +0 -35
  198. package/dist/commands/checkpoint.js.map +0 -1
  199. package/dist/commands/doctor.d.ts +0 -17
  200. package/dist/commands/doctor.d.ts.map +0 -1
  201. package/dist/commands/doctor.js +0 -226
  202. package/dist/commands/doctor.js.map +0 -1
  203. package/dist/commands/evidence.d.ts +0 -45
  204. package/dist/commands/evidence.d.ts.map +0 -1
  205. package/dist/commands/evidence.js +0 -197
  206. package/dist/commands/evidence.js.map +0 -1
  207. package/dist/commands/explain.d.ts +0 -8
  208. package/dist/commands/explain.d.ts.map +0 -1
  209. package/dist/commands/explain.js +0 -52
  210. package/dist/commands/explain.js.map +0 -1
  211. package/dist/commands/fix-consolidated.d.ts +0 -19
  212. package/dist/commands/fix-consolidated.d.ts.map +0 -1
  213. package/dist/commands/fix-consolidated.js +0 -165
  214. package/dist/commands/fix-consolidated.js.map +0 -1
  215. package/dist/commands/index.d.ts +0 -8
  216. package/dist/commands/index.d.ts.map +0 -1
  217. package/dist/commands/index.js +0 -15
  218. package/dist/commands/index.js.map +0 -1
  219. package/dist/commands/init.d.ts +0 -8
  220. package/dist/commands/init.d.ts.map +0 -1
  221. package/dist/commands/init.js +0 -125
  222. package/dist/commands/init.js.map +0 -1
  223. package/dist/commands/launcher.d.ts +0 -10
  224. package/dist/commands/launcher.d.ts.map +0 -1
  225. package/dist/commands/launcher.js +0 -174
  226. package/dist/commands/launcher.js.map +0 -1
  227. package/dist/commands/on.d.ts +0 -8
  228. package/dist/commands/on.d.ts.map +0 -1
  229. package/dist/commands/on.js +0 -123
  230. package/dist/commands/on.js.map +0 -1
  231. package/dist/commands/replay.d.ts +0 -8
  232. package/dist/commands/replay.d.ts.map +0 -1
  233. package/dist/commands/replay.js +0 -52
  234. package/dist/commands/replay.js.map +0 -1
  235. package/dist/commands/scan-consolidated.d.ts +0 -61
  236. package/dist/commands/scan-consolidated.d.ts.map +0 -1
  237. package/dist/commands/scan-consolidated.js +0 -243
  238. package/dist/commands/scan-consolidated.js.map +0 -1
  239. package/dist/commands/scan-secrets.d.ts +0 -47
  240. package/dist/commands/scan-secrets.d.ts.map +0 -1
  241. package/dist/commands/scan-secrets.js +0 -225
  242. package/dist/commands/scan-secrets.js.map +0 -1
  243. package/dist/commands/scan-vulnerabilities-enhanced.d.ts +0 -41
  244. package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +0 -1
  245. package/dist/commands/scan-vulnerabilities-enhanced.js +0 -368
  246. package/dist/commands/scan-vulnerabilities-enhanced.js.map +0 -1
  247. package/dist/commands/scan-vulnerabilities-osv.d.ts +0 -58
  248. package/dist/commands/scan-vulnerabilities-osv.d.ts.map +0 -1
  249. package/dist/commands/scan-vulnerabilities-osv.js +0 -722
  250. package/dist/commands/scan-vulnerabilities-osv.js.map +0 -1
  251. package/dist/commands/scan-vulnerabilities.d.ts +0 -32
  252. package/dist/commands/scan-vulnerabilities.d.ts.map +0 -1
  253. package/dist/commands/scan-vulnerabilities.js +0 -283
  254. package/dist/commands/scan-vulnerabilities.js.map +0 -1
  255. package/dist/commands/secrets-allowlist.d.ts +0 -7
  256. package/dist/commands/secrets-allowlist.d.ts.map +0 -1
  257. package/dist/commands/secrets-allowlist.js +0 -85
  258. package/dist/commands/secrets-allowlist.js.map +0 -1
  259. package/dist/commands/ship-consolidated.d.ts +0 -58
  260. package/dist/commands/ship-consolidated.d.ts.map +0 -1
  261. package/dist/commands/ship-consolidated.js +0 -515
  262. package/dist/commands/ship-consolidated.js.map +0 -1
  263. package/dist/commands/stats.d.ts +0 -8
  264. package/dist/commands/stats.d.ts.map +0 -1
  265. package/dist/commands/stats.js +0 -134
  266. package/dist/commands/stats.js.map +0 -1
  267. package/dist/commands/upgrade.d.ts +0 -8
  268. package/dist/commands/upgrade.d.ts.map +0 -1
  269. package/dist/commands/upgrade.js +0 -30
  270. package/dist/commands/upgrade.js.map +0 -1
  271. package/dist/fix/applicator.d.ts +0 -44
  272. package/dist/fix/applicator.d.ts.map +0 -1
  273. package/dist/fix/applicator.js +0 -144
  274. package/dist/fix/applicator.js.map +0 -1
  275. package/dist/fix/backup.d.ts +0 -38
  276. package/dist/fix/backup.d.ts.map +0 -1
  277. package/dist/fix/backup.js +0 -154
  278. package/dist/fix/backup.js.map +0 -1
  279. package/dist/fix/engine.d.ts +0 -55
  280. package/dist/fix/engine.d.ts.map +0 -1
  281. package/dist/fix/engine.js +0 -285
  282. package/dist/fix/engine.js.map +0 -1
  283. package/dist/fix/index.d.ts +0 -5
  284. package/dist/fix/index.d.ts.map +0 -1
  285. package/dist/fix/index.js +0 -12
  286. package/dist/fix/index.js.map +0 -1
  287. package/dist/fix/interactive.d.ts +0 -22
  288. package/dist/fix/interactive.d.ts.map +0 -1
  289. package/dist/fix/interactive.js +0 -172
  290. package/dist/fix/interactive.js.map +0 -1
  291. package/dist/formatters/index.d.ts +0 -6
  292. package/dist/formatters/index.d.ts.map +0 -1
  293. package/dist/formatters/index.js +0 -11
  294. package/dist/formatters/index.js.map +0 -1
  295. package/dist/formatters/sarif-enhanced.d.ts +0 -78
  296. package/dist/formatters/sarif-enhanced.d.ts.map +0 -1
  297. package/dist/formatters/sarif-enhanced.js +0 -144
  298. package/dist/formatters/sarif-enhanced.js.map +0 -1
  299. package/dist/formatters/sarif-v2.d.ts +0 -121
  300. package/dist/formatters/sarif-v2.d.ts.map +0 -1
  301. package/dist/formatters/sarif-v2.js +0 -356
  302. package/dist/formatters/sarif-v2.js.map +0 -1
  303. package/dist/formatters/sarif.d.ts +0 -72
  304. package/dist/formatters/sarif.d.ts.map +0 -1
  305. package/dist/formatters/sarif.js +0 -146
  306. package/dist/formatters/sarif.js.map +0 -1
  307. package/dist/index.d.ts +0 -61
  308. package/dist/index.d.ts.map +0 -1
  309. package/dist/index.js +0 -4388
  310. package/dist/index.js.map +0 -1
  311. package/dist/init/ci-generator.d.ts +0 -18
  312. package/dist/init/ci-generator.d.ts.map +0 -1
  313. package/dist/init/ci-generator.js +0 -317
  314. package/dist/init/ci-generator.js.map +0 -1
  315. package/dist/init/detect-framework.d.ts +0 -15
  316. package/dist/init/detect-framework.d.ts.map +0 -1
  317. package/dist/init/detect-framework.js +0 -301
  318. package/dist/init/detect-framework.js.map +0 -1
  319. package/dist/init/hooks-installer.d.ts +0 -22
  320. package/dist/init/hooks-installer.d.ts.map +0 -1
  321. package/dist/init/hooks-installer.js +0 -310
  322. package/dist/init/hooks-installer.js.map +0 -1
  323. package/dist/init/index.d.ts +0 -8
  324. package/dist/init/index.d.ts.map +0 -1
  325. package/dist/init/index.js +0 -22
  326. package/dist/init/index.js.map +0 -1
  327. package/dist/init/templates.d.ts +0 -402
  328. package/dist/init/templates.d.ts.map +0 -1
  329. package/dist/init/templates.js +0 -240
  330. package/dist/init/templates.js.map +0 -1
  331. package/dist/mcp/server.d.ts +0 -12
  332. package/dist/mcp/server.d.ts.map +0 -1
  333. package/dist/mcp/server.js +0 -42
  334. package/dist/mcp/server.js.map +0 -1
  335. package/dist/mcp/telemetry.d.ts +0 -40
  336. package/dist/mcp/telemetry.d.ts.map +0 -1
  337. package/dist/mcp/telemetry.js +0 -98
  338. package/dist/mcp/telemetry.js.map +0 -1
  339. package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts +0 -32
  340. package/dist/reality/no-dead-buttons/button-sweep-generator.d.ts.map +0 -1
  341. package/dist/reality/no-dead-buttons/button-sweep-generator.js +0 -236
  342. package/dist/reality/no-dead-buttons/button-sweep-generator.js.map +0 -1
  343. package/dist/reality/no-dead-buttons/index.d.ts +0 -11
  344. package/dist/reality/no-dead-buttons/index.d.ts.map +0 -1
  345. package/dist/reality/no-dead-buttons/index.js +0 -18
  346. package/dist/reality/no-dead-buttons/index.js.map +0 -1
  347. package/dist/reality/no-dead-buttons/static-scanner.d.ts +0 -34
  348. package/dist/reality/no-dead-buttons/static-scanner.d.ts.map +0 -1
  349. package/dist/reality/no-dead-buttons/static-scanner.js +0 -230
  350. package/dist/reality/no-dead-buttons/static-scanner.js.map +0 -1
  351. package/dist/reality/reality-graph.d.ts +0 -192
  352. package/dist/reality/reality-graph.d.ts.map +0 -1
  353. package/dist/reality/reality-graph.js +0 -600
  354. package/dist/reality/reality-graph.js.map +0 -1
  355. package/dist/reality/reality-runner.d.ts +0 -89
  356. package/dist/reality/reality-runner.d.ts.map +0 -1
  357. package/dist/reality/reality-runner.js +0 -540
  358. package/dist/reality/reality-runner.js.map +0 -1
  359. package/dist/reality/receipt-generator.d.ts +0 -152
  360. package/dist/reality/receipt-generator.d.ts.map +0 -1
  361. package/dist/reality/receipt-generator.js +0 -495
  362. package/dist/reality/receipt-generator.js.map +0 -1
  363. package/dist/reality/runtime-tracer.d.ts +0 -75
  364. package/dist/reality/runtime-tracer.d.ts.map +0 -1
  365. package/dist/reality/runtime-tracer.js +0 -109
  366. package/dist/reality/runtime-tracer.js.map +0 -1
  367. package/dist/runtime/auth-utils.d.ts +0 -43
  368. package/dist/runtime/auth-utils.d.ts.map +0 -1
  369. package/dist/runtime/auth-utils.js +0 -130
  370. package/dist/runtime/auth-utils.js.map +0 -1
  371. package/dist/runtime/client.d.ts +0 -74
  372. package/dist/runtime/client.d.ts.map +0 -1
  373. package/dist/runtime/client.js +0 -222
  374. package/dist/runtime/client.js.map +0 -1
  375. package/dist/runtime/creds.d.ts +0 -48
  376. package/dist/runtime/creds.d.ts.map +0 -1
  377. package/dist/runtime/creds.js +0 -245
  378. package/dist/runtime/creds.js.map +0 -1
  379. package/dist/runtime/exit-codes.d.ts +0 -49
  380. package/dist/runtime/exit-codes.d.ts.map +0 -1
  381. package/dist/runtime/exit-codes.js +0 -93
  382. package/dist/runtime/exit-codes.js.map +0 -1
  383. package/dist/runtime/index.d.ts +0 -9
  384. package/dist/runtime/index.d.ts.map +0 -1
  385. package/dist/runtime/index.js +0 -25
  386. package/dist/runtime/index.js.map +0 -1
  387. package/dist/runtime/json-output.d.ts +0 -42
  388. package/dist/runtime/json-output.d.ts.map +0 -1
  389. package/dist/runtime/json-output.js +0 -59
  390. package/dist/runtime/json-output.js.map +0 -1
  391. package/dist/runtime/semver.d.ts +0 -37
  392. package/dist/runtime/semver.d.ts.map +0 -1
  393. package/dist/runtime/semver.js +0 -110
  394. package/dist/runtime/semver.js.map +0 -1
  395. package/dist/scan/dead-ui-detector.d.ts +0 -48
  396. package/dist/scan/dead-ui-detector.d.ts.map +0 -1
  397. package/dist/scan/dead-ui-detector.js +0 -170
  398. package/dist/scan/dead-ui-detector.js.map +0 -1
  399. package/dist/scan/playwright-sweep.d.ts +0 -40
  400. package/dist/scan/playwright-sweep.d.ts.map +0 -1
  401. package/dist/scan/playwright-sweep.js +0 -216
  402. package/dist/scan/playwright-sweep.js.map +0 -1
  403. package/dist/scan/proof-bundle.d.ts +0 -25
  404. package/dist/scan/proof-bundle.d.ts.map +0 -1
  405. package/dist/scan/proof-bundle.js +0 -203
  406. package/dist/scan/proof-bundle.js.map +0 -1
  407. package/dist/scan/proof-graph.d.ts +0 -59
  408. package/dist/scan/proof-graph.d.ts.map +0 -1
  409. package/dist/scan/proof-graph.js +0 -64
  410. package/dist/scan/proof-graph.js.map +0 -1
  411. package/dist/scan/reality-sniff.d.ts +0 -56
  412. package/dist/scan/reality-sniff.d.ts.map +0 -1
  413. package/dist/scan/reality-sniff.js +0 -200
  414. package/dist/scan/reality-sniff.js.map +0 -1
  415. package/dist/scan/structural-verifier.d.ts +0 -20
  416. package/dist/scan/structural-verifier.d.ts.map +0 -1
  417. package/dist/scan/structural-verifier.js +0 -112
  418. package/dist/scan/structural-verifier.js.map +0 -1
  419. package/dist/scan/verification-engine.d.ts +0 -47
  420. package/dist/scan/verification-engine.d.ts.map +0 -1
  421. package/dist/scan/verification-engine.js +0 -141
  422. package/dist/scan/verification-engine.js.map +0 -1
  423. package/dist/scanner/baseline.d.ts +0 -52
  424. package/dist/scanner/baseline.d.ts.map +0 -1
  425. package/dist/scanner/baseline.js +0 -85
  426. package/dist/scanner/baseline.js.map +0 -1
  427. package/dist/scanner/incremental.d.ts +0 -30
  428. package/dist/scanner/incremental.d.ts.map +0 -1
  429. package/dist/scanner/incremental.js +0 -82
  430. package/dist/scanner/incremental.js.map +0 -1
  431. package/dist/scanner/parallel.d.ts +0 -43
  432. package/dist/scanner/parallel.d.ts.map +0 -1
  433. package/dist/scanner/parallel.js +0 -99
  434. package/dist/scanner/parallel.js.map +0 -1
  435. package/dist/standalone.d.ts +0 -1
  436. package/dist/standalone.d.ts.map +0 -1
  437. package/dist/standalone.js +0 -1
  438. package/dist/standalone.js.map +0 -1
  439. package/dist/truth-pack/index.d.ts +0 -102
  440. package/dist/truth-pack/index.d.ts.map +0 -1
  441. package/dist/truth-pack/index.js +0 -694
  442. package/dist/truth-pack/index.js.map +0 -1
  443. package/dist/ui/frame.d.ts +0 -68
  444. package/dist/ui/frame.d.ts.map +0 -1
  445. package/dist/ui/frame.js +0 -165
  446. package/dist/ui/frame.js.map +0 -1
  447. package/dist/ui/index.d.ts +0 -5
  448. package/dist/ui/index.d.ts.map +0 -1
  449. package/dist/ui/index.js +0 -16
  450. package/dist/ui/index.js.map +0 -1
  451. package/dist/ui.d.ts +0 -36
  452. package/dist/ui.d.ts.map +0 -1
  453. package/dist/ui.js +0 -45
  454. package/dist/ui.js.map +0 -1
@@ -0,0 +1,478 @@
1
+ /**
2
+ * vibecheck report - World-Class Professional Reports
3
+ *
4
+ * Enterprise-grade report generation with:
5
+ * - Beautiful interactive HTML with modern design
6
+ * - Multiple export formats (HTML, MD, JSON, SARIF, CSV)
7
+ * - Executive, Technical, Compliance report types
8
+ * - Historical trends and fix time estimates
9
+ * - Print-optimized layouts
10
+ */
11
+
12
+ const path = require("path");
13
+ const fs = require("fs");
14
+
15
+ // Report engine modules
16
+ let reportEngine, reportHtml;
17
+ try {
18
+ reportEngine = require("./lib/report-engine");
19
+ reportHtml = require("./lib/report-html");
20
+ } catch (e) {
21
+ // Fallback to basic templates if enhanced modules unavailable
22
+ reportEngine = null;
23
+ reportHtml = null;
24
+ }
25
+
26
+ // ANSI color codes
27
+ const c = {
28
+ reset: "\x1b[0m",
29
+ bold: "\x1b[1m",
30
+ dim: "\x1b[2m",
31
+ red: "\x1b[31m",
32
+ green: "\x1b[32m",
33
+ yellow: "\x1b[33m",
34
+ blue: "\x1b[34m",
35
+ magenta: "\x1b[35m",
36
+ cyan: "\x1b[36m",
37
+ };
38
+
39
+ function parseArgs(args) {
40
+ const opts = {
41
+ type: "executive",
42
+ format: "html",
43
+ path: ".",
44
+ output: null,
45
+ logo: null,
46
+ company: null,
47
+ theme: "dark",
48
+ includeVerify: false,
49
+ includeTrends: false,
50
+ redactPaths: false,
51
+ maxFindings: 50,
52
+ help: false,
53
+ };
54
+
55
+ for (let i = 0; i < args.length; i++) {
56
+ const a = args[i];
57
+ if (a === "--type" || a === "-t") opts.type = args[++i];
58
+ if (a === "--format" || a === "-f") opts.format = args[++i];
59
+ if (a === "--output" || a === "-o") opts.output = args[++i];
60
+ if (a === "--logo") opts.logo = args[++i];
61
+ if (a === "--company") opts.company = args[++i];
62
+ if (a === "--theme") opts.theme = args[++i];
63
+ if (a === "--light") opts.theme = "light";
64
+ if (a === "--dark") opts.theme = "dark";
65
+ if (a === "--include-verify") opts.includeVerify = true;
66
+ if (a === "--include-trends" || a === "--trends") opts.includeTrends = true;
67
+ if (a === "--redact-paths" || a === "--redact") opts.redactPaths = true;
68
+ if (a === "--max-findings") opts.maxFindings = parseInt(args[++i]) || 50;
69
+ if (a.startsWith("--path=")) opts.path = a.split("=")[1];
70
+ if (a === "--path" || a === "-p") opts.path = args[++i];
71
+ if (a === "--help" || a === "-h") opts.help = true;
72
+ }
73
+
74
+ return opts;
75
+ }
76
+
77
+ function printHelp() {
78
+ console.log(`
79
+ ${c.bold}${c.cyan}vibecheck report${c.reset} — World-Class Professional Reports
80
+
81
+ ${c.dim}Generate beautiful, professional reports for stakeholders.${c.reset}
82
+
83
+ ${c.bold}USAGE${c.reset}
84
+ vibecheck report Generate executive HTML report
85
+ vibecheck report --format=md Generate Markdown report
86
+ vibecheck report --format=sarif Generate SARIF for security tools
87
+ vibecheck report --type=compliance Generate compliance report
88
+
89
+ ${c.bold}REPORT TYPES${c.reset}
90
+ ${c.cyan}executive${c.reset} One-page overview for stakeholders (default)
91
+ ${c.cyan}technical${c.reset} Detailed findings for developers/CTOs
92
+ ${c.cyan}compliance${c.reset} SOC2/HIPAA-ready language for regulated industries
93
+ ${c.cyan}trend${c.reset} Historical score analysis over time
94
+
95
+ ${c.bold}OUTPUT FORMATS${c.reset}
96
+ ${c.green}html${c.reset} Beautiful interactive report (default)
97
+ ${c.green}md${c.reset} Markdown for documentation/GitHub
98
+ ${c.green}json${c.reset} Machine-readable JSON
99
+ ${c.green}sarif${c.reset} SARIF for security tool integration
100
+ ${c.green}csv${c.reset} CSV for spreadsheet analysis
101
+
102
+ ${c.bold}OPTIONS${c.reset}
103
+ --type, -t <type> Report type: executive, technical, compliance, trend
104
+ --format, -f <format> Output format: html, md, json, sarif, csv
105
+ --output, -o <path> Output file path
106
+ --theme <dark|light> HTML theme (default: dark)
107
+ --company <name> Company name for branding
108
+ --logo <path> Custom logo path/URL
109
+ --include-trends Include historical trend data
110
+ --redact-paths Hide file paths for client reports
111
+ --max-findings <n> Max findings to show (default: 50)
112
+ --path, -p <dir> Project path (default: current directory)
113
+ --help, -h Show this help
114
+
115
+ ${c.bold}EXAMPLES${c.reset}
116
+ vibecheck report # Interactive HTML
117
+ vibecheck report --format=md --output=REPORT.md # Markdown file
118
+ vibecheck report --type=compliance --company=Acme # Compliance report
119
+ vibecheck report --format=sarif -o report.sarif # Security tooling
120
+ vibecheck report --theme=light --redact # Client-safe HTML
121
+ vibecheck report --trends # Include history
122
+
123
+ ${c.bold}OUTPUT${c.reset}
124
+ HTML reports include:
125
+ • Animated score visualization
126
+ • Interactive severity charts
127
+ • Category breakdown bars
128
+ • Fix time estimates
129
+ • Dark/light mode toggle
130
+ • Print-optimized layout
131
+ `);
132
+ }
133
+
134
+ async function runReport(args) {
135
+ const opts = parseArgs(args);
136
+
137
+ if (opts.help) {
138
+ printHelp();
139
+ return 0;
140
+ }
141
+
142
+ const projectPath = path.resolve(opts.path);
143
+ const outputDir = path.join(projectPath, ".vibecheck");
144
+ const projectName = path.basename(projectPath);
145
+
146
+ console.log(`\n${c.bold}${c.cyan}📄 Generating ${opts.type} report...${c.reset}\n`);
147
+
148
+ // Load ship results from multiple possible sources
149
+ let shipResults = loadShipResults(projectPath, outputDir);
150
+
151
+ if (!shipResults) {
152
+ console.log(`${c.yellow}⚠${c.reset} No scan results found. Using demo data for preview.\n`);
153
+ console.log(`${c.dim} Tip: Run 'vibecheck ship' first for real results.${c.reset}\n`);
154
+ shipResults = getDemoData();
155
+ }
156
+
157
+ // Build comprehensive report data using the new engine
158
+ let reportData;
159
+ if (reportEngine) {
160
+ reportData = reportEngine.buildReportData(shipResults, {
161
+ projectName,
162
+ repoRoot: projectPath,
163
+ includeTrends: opts.includeTrends,
164
+ });
165
+ } else {
166
+ // Fallback to basic report data
167
+ reportData = buildBasicReportData(shipResults, projectName);
168
+ }
169
+
170
+ // Generate report content based on format
171
+ let reportContent = "";
172
+ let fileExtension = opts.format;
173
+
174
+ switch (opts.format) {
175
+ case "html":
176
+ reportContent = generateHTMLReport(reportData, opts);
177
+ break;
178
+ case "md":
179
+ case "markdown":
180
+ reportContent = generateMarkdownReport(reportData, opts);
181
+ fileExtension = "md";
182
+ break;
183
+ case "json":
184
+ reportContent = generateJSONReport(reportData, opts);
185
+ break;
186
+ case "sarif":
187
+ reportContent = generateSARIFReport(reportData, opts);
188
+ break;
189
+ case "csv":
190
+ reportContent = generateCSVReport(reportData, opts);
191
+ break;
192
+ default:
193
+ console.error(`${c.red}✗${c.reset} Unknown format: ${opts.format}`);
194
+ console.log(`${c.dim} Supported: html, md, json, sarif, csv${c.reset}`);
195
+ return 1;
196
+ }
197
+
198
+ // Determine output path
199
+ const outputFileName = opts.output || path.join(outputDir, `report.${fileExtension}`);
200
+
201
+ // Ensure output directory exists
202
+ const outputDirPath = path.dirname(outputFileName);
203
+ if (!fs.existsSync(outputDirPath)) {
204
+ fs.mkdirSync(outputDirPath, { recursive: true });
205
+ }
206
+
207
+ // Write report
208
+ fs.writeFileSync(outputFileName, reportContent);
209
+
210
+ // Save report history for trend analysis
211
+ saveReportHistory(outputDir, reportData);
212
+
213
+ // Print success message
214
+ console.log(`${c.green}✓${c.reset} Report generated successfully!\n`);
215
+ printReportSummary(reportData, opts, outputFileName);
216
+
217
+ return 0;
218
+ }
219
+
220
+ // ============================================================================
221
+ // DATA LOADING
222
+ // ============================================================================
223
+
224
+ function loadShipResults(projectPath, outputDir) {
225
+ // Try multiple sources for ship results
226
+ const sources = [
227
+ path.join(outputDir, "ship_report.json"),
228
+ path.join(outputDir, "report.json"),
229
+ path.join(outputDir, "truth", "truthpack.json"),
230
+ ];
231
+
232
+ for (const src of sources) {
233
+ if (fs.existsSync(src)) {
234
+ try {
235
+ return JSON.parse(fs.readFileSync(src, "utf8"));
236
+ } catch {
237
+ continue;
238
+ }
239
+ }
240
+ }
241
+
242
+ return null;
243
+ }
244
+
245
+ function getDemoData() {
246
+ return {
247
+ score: 72,
248
+ verdict: "WARN",
249
+ findings: [
250
+ { id: "SEC001", severity: "BLOCK", type: "secret", message: "API key exposed in source code", file: "src/config.ts", line: 42, fix: "Move to environment variable" },
251
+ { id: "AUTH001", severity: "BLOCK", type: "auth", message: "Authentication bypass in admin route", file: "src/routes/admin.ts", line: 15, fix: "Add auth middleware" },
252
+ { id: "MOCK001", severity: "WARN", type: "mock", message: "Mock data used in production path", file: "src/api/users.ts", line: 88, fix: "Remove mock data fallback" },
253
+ { id: "ERR001", severity: "WARN", type: "error", message: "Empty catch block in payment flow", file: "src/billing/checkout.ts", line: 156, fix: "Add error handling" },
254
+ { id: "CFG001", severity: "INFO", type: "config", message: "Hardcoded timeout value", file: "src/utils/http.ts", line: 23, fix: "Move to config" },
255
+ { id: "DBG001", severity: "INFO", type: "quality", message: "Console.log statement", file: "src/debug.ts", line: 5, fix: "Remove or use logger" },
256
+ ],
257
+ truthpack: {
258
+ routes: { server: Array(12).fill({}) },
259
+ env: { vars: Array(8).fill("") },
260
+ auth: { nextMiddleware: [{}] },
261
+ billing: { webhooks: [{}] },
262
+ },
263
+ };
264
+ }
265
+
266
+ function buildBasicReportData(shipResults, projectName) {
267
+ const findings = shipResults?.findings || [];
268
+ return {
269
+ meta: {
270
+ projectName,
271
+ generatedAt: new Date().toISOString(),
272
+ version: "2.0.0",
273
+ reportId: `VC-${Date.now().toString(36).toUpperCase()}`,
274
+ },
275
+ summary: {
276
+ score: shipResults?.score || 0,
277
+ verdict: shipResults?.verdict || (shipResults?.canShip ? "SHIP" : "WARN"),
278
+ totalFindings: findings.length,
279
+ severityCounts: {
280
+ critical: findings.filter(f => f.severity === "BLOCK" || f.severity === "critical").length,
281
+ high: findings.filter(f => f.severity === "high").length,
282
+ medium: findings.filter(f => f.severity === "WARN" || f.severity === "medium").length,
283
+ low: findings.filter(f => f.severity === "low" || f.severity === "INFO").length,
284
+ },
285
+ categoryScores: shipResults?.categoryScores || { security: 80, auth: 70, billing: 90, quality: 60 },
286
+ },
287
+ findings: findings.map((f, i) => ({ ...f, id: f.id || `F${String(i+1).padStart(3,"0")}` })),
288
+ fixEstimates: { humanReadable: "~2h", totalMinutes: 120, bySeverity: {} },
289
+ truthpack: { routes: 0, envVars: 0, hasAuth: false, hasBilling: false },
290
+ };
291
+ }
292
+
293
+ // ============================================================================
294
+ // REPORT GENERATORS
295
+ // ============================================================================
296
+
297
+ function generateHTMLReport(reportData, opts) {
298
+ // Use world-class HTML generator if available
299
+ if (reportHtml && reportHtml.generateWorldClassHTML) {
300
+ return reportHtml.generateWorldClassHTML(reportData, opts);
301
+ }
302
+
303
+ // Fallback to enhanced templates
304
+ try {
305
+ const templates = require("./lib/report-templates");
306
+ switch (opts.type) {
307
+ case "technical":
308
+ return templates.generateEnhancedTechnicalReport(convertToLegacyFormat(reportData), opts);
309
+ case "compliance":
310
+ return templates.generateEnhancedComplianceReport(convertToLegacyFormat(reportData), opts);
311
+ default:
312
+ return templates.generateEnhancedExecutiveReport(convertToLegacyFormat(reportData), opts);
313
+ }
314
+ } catch {
315
+ return generateBasicHTML(reportData, opts);
316
+ }
317
+ }
318
+
319
+ function generateMarkdownReport(reportData, opts) {
320
+ if (reportEngine && reportEngine.exportToMarkdown) {
321
+ return reportEngine.exportToMarkdown(reportData, opts);
322
+ }
323
+ return generateBasicMarkdown(reportData, opts);
324
+ }
325
+
326
+ function generateJSONReport(reportData, opts) {
327
+ if (reportEngine && reportEngine.exportToJSON) {
328
+ return reportEngine.exportToJSON(reportData);
329
+ }
330
+ return JSON.stringify(reportData, null, 2);
331
+ }
332
+
333
+ function generateSARIFReport(reportData, opts) {
334
+ if (reportEngine && reportEngine.exportToSARIF) {
335
+ return JSON.stringify(reportEngine.exportToSARIF(reportData), null, 2);
336
+ }
337
+ // Basic SARIF fallback
338
+ return JSON.stringify({
339
+ $schema: "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
340
+ version: "2.1.0",
341
+ runs: [{
342
+ tool: { driver: { name: "vibecheck", version: "2.0.0" } },
343
+ results: reportData.findings.map(f => ({
344
+ ruleId: f.id,
345
+ level: f.severity === "critical" ? "error" : "warning",
346
+ message: { text: f.title || f.message },
347
+ })),
348
+ }],
349
+ }, null, 2);
350
+ }
351
+
352
+ function generateCSVReport(reportData, opts) {
353
+ if (reportEngine && reportEngine.exportToCSV) {
354
+ return reportEngine.exportToCSV(reportData);
355
+ }
356
+ // Basic CSV fallback
357
+ const headers = ["ID", "Severity", "Title", "File", "Line"];
358
+ const rows = reportData.findings.map(f => [
359
+ f.id || "",
360
+ f.severity || "",
361
+ `"${(f.title || f.message || "").replace(/"/g, '""')}"`,
362
+ f.file || "",
363
+ f.line || "",
364
+ ]);
365
+ return [headers.join(","), ...rows.map(r => r.join(","))].join("\n");
366
+ }
367
+
368
+ function convertToLegacyFormat(reportData) {
369
+ return {
370
+ projectName: reportData.meta.projectName,
371
+ generatedAt: reportData.meta.generatedAt,
372
+ score: reportData.summary.score,
373
+ verdict: reportData.summary.verdict,
374
+ findings: reportData.findings,
375
+ categoryScores: reportData.summary.categoryScores,
376
+ };
377
+ }
378
+
379
+ // ============================================================================
380
+ // FALLBACK GENERATORS
381
+ // ============================================================================
382
+
383
+ function generateBasicHTML(reportData, opts) {
384
+ const { meta, summary } = reportData;
385
+ const verdictColor = summary.verdict === "SHIP" ? "#22c55e" : summary.verdict === "WARN" ? "#f59e0b" : "#ef4444";
386
+
387
+ return `<!DOCTYPE html>
388
+ <html lang="en">
389
+ <head>
390
+ <meta charset="UTF-8">
391
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
392
+ <title>Vibecheck Report - ${meta.projectName}</title>
393
+ <style>
394
+ body { font-family: -apple-system, sans-serif; max-width: 800px; margin: 0 auto; padding: 40px; background: #0f172a; color: #f8fafc; }
395
+ .header { border-bottom: 2px solid #334155; padding-bottom: 20px; margin-bottom: 30px; }
396
+ .score { font-size: 4rem; font-weight: 800; text-align: center; margin: 40px 0; }
397
+ .verdict { display: inline-block; padding: 12px 24px; border-radius: 50px; font-weight: 600; background: ${verdictColor}22; color: ${verdictColor}; }
398
+ .section { margin: 30px 0; }
399
+ h2 { color: #94a3b8; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.1em; }
400
+ .finding { background: #1e293b; padding: 16px; border-radius: 8px; margin: 12px 0; border-left: 4px solid #3b82f6; }
401
+ .footer { margin-top: 60px; text-align: center; color: #64748b; }
402
+ </style>
403
+ </head>
404
+ <body>
405
+ <div class="header">
406
+ <h1>Ship Readiness Report</h1>
407
+ <p>Project: ${meta.projectName} · ${new Date(meta.generatedAt).toLocaleString()}</p>
408
+ </div>
409
+ <div class="score">${summary.score}</div>
410
+ <div style="text-align: center;"><span class="verdict">${summary.verdict}</span></div>
411
+ <div class="section">
412
+ <h2>Findings (${summary.totalFindings})</h2>
413
+ ${reportData.findings.slice(0, 10).map(f => `
414
+ <div class="finding">
415
+ <strong>${f.severity?.toUpperCase()}</strong>: ${f.title || f.message}
416
+ ${f.file ? `<br><code>${f.file}${f.line ? `:${f.line}` : ""}</code>` : ""}
417
+ </div>
418
+ `).join("")}
419
+ </div>
420
+ <div class="footer">Generated by Vibecheck · ${meta.reportId}</div>
421
+ </body>
422
+ </html>`;
423
+ }
424
+
425
+ function generateBasicMarkdown(reportData, opts) {
426
+ const { meta, summary, findings } = reportData;
427
+ return `# Vibecheck Report
428
+
429
+ **Project:** ${meta.projectName}
430
+ **Generated:** ${new Date(meta.generatedAt).toLocaleString()}
431
+ **Score:** ${summary.score}/100
432
+ **Verdict:** ${summary.verdict}
433
+
434
+ ## Findings (${summary.totalFindings})
435
+
436
+ ${findings.slice(0, 20).map(f => `- **${f.severity?.toUpperCase()}**: ${f.title || f.message}${f.file ? ` (\`${f.file}\`)` : ""}`).join("\n")}
437
+
438
+ ---
439
+ *Generated by Vibecheck · ${meta.reportId}*
440
+ `;
441
+ }
442
+
443
+ // ============================================================================
444
+ // UTILITIES
445
+ // ============================================================================
446
+
447
+ function saveReportHistory(outputDir, reportData) {
448
+ try {
449
+ const historyDir = path.join(outputDir, "history");
450
+ if (!fs.existsSync(historyDir)) {
451
+ fs.mkdirSync(historyDir, { recursive: true });
452
+ }
453
+
454
+ const timestamp = new Date().toISOString().split("T")[0];
455
+ const historyFile = path.join(historyDir, `${timestamp}.json`);
456
+
457
+ fs.writeFileSync(historyFile, JSON.stringify({
458
+ meta: reportData.meta,
459
+ summary: reportData.summary,
460
+ }, null, 2));
461
+ } catch {
462
+ // Silently fail history saving
463
+ }
464
+ }
465
+
466
+ function printReportSummary(reportData, opts, outputFile) {
467
+ const { summary } = reportData;
468
+ const verdictColor = summary.verdict === "SHIP" ? c.green : summary.verdict === "WARN" ? c.yellow : c.red;
469
+
470
+ console.log(` ${c.dim}Type:${c.reset} ${c.bold}${opts.type}${c.reset}`);
471
+ console.log(` ${c.dim}Format:${c.reset} ${c.bold}${opts.format}${c.reset}`);
472
+ console.log(` ${c.dim}Score:${c.reset} ${verdictColor}${c.bold}${summary.score}${c.reset}/100`);
473
+ console.log(` ${c.dim}Verdict:${c.reset} ${verdictColor}${c.bold}${summary.verdict}${c.reset}`);
474
+ console.log(` ${c.dim}Findings:${c.reset} ${summary.totalFindings}`);
475
+ console.log(`\n ${c.dim}Output:${c.reset} ${c.cyan}${outputFile}${c.reset}\n`);
476
+ }
477
+
478
+ module.exports = { runReport };