@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,964 @@
1
+ /**
2
+ * Enhanced Report Templates
3
+ *
4
+ * Beautiful, professional report generation with:
5
+ * - Modern design with gradients and shadows
6
+ * - Visual score gauges (SVG)
7
+ * - Category progress bars
8
+ * - Severity breakdown charts
9
+ * - Trend sparklines
10
+ * - Professional branding
11
+ */
12
+
13
+ /**
14
+ * Generate SVG score gauge
15
+ */
16
+ function generateScoreGauge(score, size = 180) {
17
+ const radius = (size - 20) / 2;
18
+ const circumference = 2 * Math.PI * radius;
19
+ const progress = (score / 100) * circumference;
20
+ const remaining = circumference - progress;
21
+
22
+ const color = score >= 80 ? '#22c55e' : score >= 60 ? '#eab308' : '#ef4444';
23
+ const bgColor = '#e2e8f0';
24
+
25
+ return `
26
+ <svg width="${size}" height="${size}" viewBox="0 0 ${size} ${size}" class="score-gauge">
27
+ <circle
28
+ cx="${size/2}" cy="${size/2}" r="${radius}"
29
+ fill="none" stroke="${bgColor}" stroke-width="12"
30
+ />
31
+ <circle
32
+ cx="${size/2}" cy="${size/2}" r="${radius}"
33
+ fill="none" stroke="${color}" stroke-width="12"
34
+ stroke-dasharray="${progress} ${remaining}"
35
+ stroke-linecap="round"
36
+ transform="rotate(-90 ${size/2} ${size/2})"
37
+ class="gauge-progress"
38
+ />
39
+ <text x="${size/2}" y="${size/2 + 8}" text-anchor="middle" class="gauge-score">${score}</text>
40
+ <text x="${size/2}" y="${size/2 + 28}" text-anchor="middle" class="gauge-label">/ 100</text>
41
+ </svg>
42
+ `;
43
+ }
44
+
45
+ /**
46
+ * Generate category bar chart
47
+ */
48
+ function generateCategoryBars(categories) {
49
+ let html = '<div class="category-bars">';
50
+
51
+ for (const [name, score] of Object.entries(categories)) {
52
+ const color = score >= 80 ? '#22c55e' : score >= 60 ? '#eab308' : '#ef4444';
53
+ const icon = score >= 80 ? '✓' : score >= 60 ? '!' : '✗';
54
+ const displayName = formatCategoryName(name);
55
+
56
+ html += `
57
+ <div class="category-bar-item">
58
+ <div class="category-bar-header">
59
+ <span class="category-icon" style="color: ${color}">${icon}</span>
60
+ <span class="category-name">${displayName}</span>
61
+ <span class="category-score" style="color: ${color}">${score}%</span>
62
+ </div>
63
+ <div class="category-bar-track">
64
+ <div class="category-bar-fill" style="width: ${score}%; background: ${color}"></div>
65
+ </div>
66
+ </div>
67
+ `;
68
+ }
69
+
70
+ html += '</div>';
71
+ return html;
72
+ }
73
+
74
+ /**
75
+ * Generate severity breakdown
76
+ */
77
+ function generateSeverityBreakdown(findings) {
78
+ const counts = {
79
+ critical: findings.filter(f => f.severity === 'critical').length,
80
+ high: findings.filter(f => f.severity === 'high').length,
81
+ medium: findings.filter(f => f.severity === 'medium').length,
82
+ low: findings.filter(f => f.severity === 'low').length,
83
+ };
84
+
85
+ const total = counts.critical + counts.high + counts.medium + counts.low;
86
+
87
+ const colors = {
88
+ critical: '#dc2626',
89
+ high: '#f97316',
90
+ medium: '#eab308',
91
+ low: '#94a3b8',
92
+ };
93
+
94
+ const icons = {
95
+ critical: '🔴',
96
+ high: '🟠',
97
+ medium: '🟡',
98
+ low: '⚪',
99
+ };
100
+
101
+ let html = `
102
+ <div class="severity-breakdown">
103
+ <div class="severity-chart">
104
+ `;
105
+
106
+ // Stacked bar
107
+ if (total > 0) {
108
+ html += '<div class="severity-bar">';
109
+ for (const [sev, count] of Object.entries(counts)) {
110
+ if (count > 0) {
111
+ const width = (count / total) * 100;
112
+ html += `<div class="severity-segment" style="width: ${width}%; background: ${colors[sev]}" title="${sev}: ${count}"></div>`;
113
+ }
114
+ }
115
+ html += '</div>';
116
+ }
117
+
118
+ html += '</div><div class="severity-legend">';
119
+
120
+ for (const [sev, count] of Object.entries(counts)) {
121
+ html += `
122
+ <div class="severity-item">
123
+ <span class="severity-icon">${icons[sev]}</span>
124
+ <span class="severity-label">${sev.charAt(0).toUpperCase() + sev.slice(1)}</span>
125
+ <span class="severity-count">${count}</span>
126
+ </div>
127
+ `;
128
+ }
129
+
130
+ html += '</div></div>';
131
+ return html;
132
+ }
133
+
134
+ /**
135
+ * Generate findings list
136
+ */
137
+ function generateFindingsList(findings, options = {}) {
138
+ const limit = options.limit || 10;
139
+ const showFile = !options.redactPaths;
140
+
141
+ const severityColors = {
142
+ critical: '#dc2626',
143
+ high: '#f97316',
144
+ medium: '#eab308',
145
+ low: '#94a3b8',
146
+ };
147
+
148
+ let html = '<div class="findings-list">';
149
+
150
+ const displayFindings = findings.slice(0, limit);
151
+
152
+ for (const finding of displayFindings) {
153
+ const color = severityColors[finding.severity] || '#94a3b8';
154
+ const sevLabel = (finding.severity || 'medium').toUpperCase();
155
+
156
+ html += `
157
+ <div class="finding-card" style="border-left-color: ${color}">
158
+ <div class="finding-header">
159
+ <span class="finding-severity" style="background: ${color}">${sevLabel}</span>
160
+ <span class="finding-title">${finding.message || finding.title || 'Finding'}</span>
161
+ </div>
162
+ ${finding.description ? `<p class="finding-description">${finding.description}</p>` : ''}
163
+ ${showFile && finding.file ? `<code class="finding-file">${finding.file}${finding.line ? ':' + finding.line : ''}</code>` : ''}
164
+ ${finding.fix ? `<div class="finding-fix"><strong>Fix:</strong> ${finding.fix}</div>` : ''}
165
+ </div>
166
+ `;
167
+ }
168
+
169
+ if (findings.length > limit) {
170
+ html += `<div class="findings-more">+ ${findings.length - limit} more findings...</div>`;
171
+ }
172
+
173
+ html += '</div>';
174
+ return html;
175
+ }
176
+
177
+ /**
178
+ * Get enhanced CSS styles
179
+ */
180
+ function getEnhancedStyles() {
181
+ return `
182
+ :root {
183
+ --primary: #3b82f6;
184
+ --primary-dark: #1d4ed8;
185
+ --success: #22c55e;
186
+ --warning: #eab308;
187
+ --danger: #ef4444;
188
+ --gray-50: #f8fafc;
189
+ --gray-100: #f1f5f9;
190
+ --gray-200: #e2e8f0;
191
+ --gray-300: #cbd5e1;
192
+ --gray-600: #475569;
193
+ --gray-800: #1e293b;
194
+ --gray-900: #0f172a;
195
+ --shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
196
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
197
+ }
198
+
199
+ * { box-sizing: border-box; margin: 0; padding: 0; }
200
+
201
+ body {
202
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
203
+ color: var(--gray-800);
204
+ line-height: 1.6;
205
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
206
+ min-height: 100vh;
207
+ padding: 40px 20px;
208
+ }
209
+
210
+ .report {
211
+ max-width: 900px;
212
+ margin: 0 auto;
213
+ background: white;
214
+ border-radius: 24px;
215
+ box-shadow: var(--shadow-lg);
216
+ overflow: hidden;
217
+ }
218
+
219
+ /* Header */
220
+ .report-header {
221
+ background: linear-gradient(135deg, var(--gray-900) 0%, var(--gray-800) 100%);
222
+ color: white;
223
+ padding: 48px;
224
+ position: relative;
225
+ overflow: hidden;
226
+ }
227
+
228
+ .report-header::before {
229
+ content: '';
230
+ position: absolute;
231
+ top: -50%;
232
+ right: -20%;
233
+ width: 60%;
234
+ height: 200%;
235
+ background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, transparent 100%);
236
+ transform: rotate(-15deg);
237
+ }
238
+
239
+ .report-header h1 {
240
+ font-size: 32px;
241
+ font-weight: 700;
242
+ margin-bottom: 8px;
243
+ position: relative;
244
+ }
245
+
246
+ .report-meta {
247
+ opacity: 0.8;
248
+ font-size: 14px;
249
+ }
250
+
251
+ .report-logo {
252
+ position: absolute;
253
+ top: 48px;
254
+ right: 48px;
255
+ font-size: 24px;
256
+ font-weight: 700;
257
+ opacity: 0.3;
258
+ }
259
+
260
+ /* Score Section */
261
+ .score-section {
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: space-between;
265
+ padding: 48px;
266
+ background: var(--gray-50);
267
+ border-bottom: 1px solid var(--gray-200);
268
+ }
269
+
270
+ .score-main {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 32px;
274
+ }
275
+
276
+ .score-gauge {
277
+ filter: drop-shadow(0 4px 6px rgb(0 0 0 / 0.1));
278
+ }
279
+
280
+ .gauge-progress {
281
+ transition: stroke-dasharray 1s ease-out;
282
+ }
283
+
284
+ .gauge-score {
285
+ font-size: 42px;
286
+ font-weight: 700;
287
+ fill: var(--gray-900);
288
+ }
289
+
290
+ .gauge-label {
291
+ font-size: 14px;
292
+ fill: var(--gray-600);
293
+ }
294
+
295
+ .verdict-badge {
296
+ padding: 12px 28px;
297
+ border-radius: 50px;
298
+ font-weight: 600;
299
+ font-size: 18px;
300
+ text-transform: uppercase;
301
+ letter-spacing: 0.5px;
302
+ box-shadow: var(--shadow);
303
+ }
304
+
305
+ .verdict-badge.ship {
306
+ background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
307
+ color: white;
308
+ }
309
+
310
+ .verdict-badge.warn {
311
+ background: linear-gradient(135deg, #eab308 0%, #ca8a04 100%);
312
+ color: white;
313
+ }
314
+
315
+ .verdict-badge.block {
316
+ background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
317
+ color: white;
318
+ }
319
+
320
+ .score-info h2 {
321
+ font-size: 24px;
322
+ margin-bottom: 4px;
323
+ }
324
+
325
+ .score-info p {
326
+ color: var(--gray-600);
327
+ font-size: 14px;
328
+ }
329
+
330
+ /* Content Sections */
331
+ .report-content {
332
+ padding: 48px;
333
+ }
334
+
335
+ .section {
336
+ margin-bottom: 48px;
337
+ }
338
+
339
+ .section-header {
340
+ display: flex;
341
+ align-items: center;
342
+ gap: 12px;
343
+ margin-bottom: 24px;
344
+ }
345
+
346
+ .section-icon {
347
+ width: 40px;
348
+ height: 40px;
349
+ border-radius: 10px;
350
+ display: flex;
351
+ align-items: center;
352
+ justify-content: center;
353
+ font-size: 20px;
354
+ background: var(--primary);
355
+ color: white;
356
+ }
357
+
358
+ .section-title {
359
+ font-size: 20px;
360
+ font-weight: 600;
361
+ }
362
+
363
+ /* Category Bars */
364
+ .category-bars {
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: 16px;
368
+ }
369
+
370
+ .category-bar-item {
371
+ background: var(--gray-50);
372
+ padding: 16px;
373
+ border-radius: 12px;
374
+ }
375
+
376
+ .category-bar-header {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 8px;
380
+ margin-bottom: 8px;
381
+ }
382
+
383
+ .category-icon {
384
+ font-weight: 600;
385
+ }
386
+
387
+ .category-name {
388
+ flex: 1;
389
+ font-weight: 500;
390
+ }
391
+
392
+ .category-score {
393
+ font-weight: 700;
394
+ }
395
+
396
+ .category-bar-track {
397
+ height: 8px;
398
+ background: var(--gray-200);
399
+ border-radius: 4px;
400
+ overflow: hidden;
401
+ }
402
+
403
+ .category-bar-fill {
404
+ height: 100%;
405
+ border-radius: 4px;
406
+ transition: width 0.5s ease-out;
407
+ }
408
+
409
+ /* Severity Breakdown */
410
+ .severity-breakdown {
411
+ background: var(--gray-50);
412
+ padding: 24px;
413
+ border-radius: 12px;
414
+ }
415
+
416
+ .severity-bar {
417
+ display: flex;
418
+ height: 24px;
419
+ border-radius: 12px;
420
+ overflow: hidden;
421
+ margin-bottom: 20px;
422
+ }
423
+
424
+ .severity-segment {
425
+ transition: width 0.5s ease-out;
426
+ }
427
+
428
+ .severity-legend {
429
+ display: grid;
430
+ grid-template-columns: repeat(4, 1fr);
431
+ gap: 16px;
432
+ }
433
+
434
+ .severity-item {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 8px;
438
+ }
439
+
440
+ .severity-label {
441
+ flex: 1;
442
+ font-size: 14px;
443
+ color: var(--gray-600);
444
+ }
445
+
446
+ .severity-count {
447
+ font-weight: 700;
448
+ font-size: 18px;
449
+ }
450
+
451
+ /* Findings List */
452
+ .findings-list {
453
+ display: flex;
454
+ flex-direction: column;
455
+ gap: 16px;
456
+ }
457
+
458
+ .finding-card {
459
+ background: var(--gray-50);
460
+ border-left: 4px solid;
461
+ padding: 16px 20px;
462
+ border-radius: 0 12px 12px 0;
463
+ }
464
+
465
+ .finding-header {
466
+ display: flex;
467
+ align-items: center;
468
+ gap: 12px;
469
+ margin-bottom: 8px;
470
+ }
471
+
472
+ .finding-severity {
473
+ padding: 2px 8px;
474
+ border-radius: 4px;
475
+ font-size: 10px;
476
+ font-weight: 700;
477
+ color: white;
478
+ }
479
+
480
+ .finding-title {
481
+ font-weight: 600;
482
+ }
483
+
484
+ .finding-description {
485
+ color: var(--gray-600);
486
+ font-size: 14px;
487
+ margin-bottom: 8px;
488
+ }
489
+
490
+ .finding-file {
491
+ display: inline-block;
492
+ background: var(--gray-200);
493
+ padding: 4px 8px;
494
+ border-radius: 4px;
495
+ font-size: 12px;
496
+ color: var(--gray-600);
497
+ }
498
+
499
+ .finding-fix {
500
+ margin-top: 8px;
501
+ padding: 8px 12px;
502
+ background: rgba(34, 197, 94, 0.1);
503
+ border-radius: 6px;
504
+ font-size: 13px;
505
+ color: #166534;
506
+ }
507
+
508
+ .findings-more {
509
+ text-align: center;
510
+ padding: 16px;
511
+ color: var(--gray-600);
512
+ font-style: italic;
513
+ }
514
+
515
+ /* Footer */
516
+ .report-footer {
517
+ background: var(--gray-900);
518
+ color: white;
519
+ padding: 32px 48px;
520
+ display: flex;
521
+ justify-content: space-between;
522
+ align-items: center;
523
+ }
524
+
525
+ .footer-brand {
526
+ display: flex;
527
+ align-items: center;
528
+ gap: 8px;
529
+ font-weight: 600;
530
+ }
531
+
532
+ .footer-meta {
533
+ font-size: 12px;
534
+ opacity: 0.6;
535
+ }
536
+
537
+ /* Recommendation */
538
+ .recommendation {
539
+ background: linear-gradient(135deg, var(--gray-50) 0%, var(--gray-100) 100%);
540
+ padding: 24px;
541
+ border-radius: 12px;
542
+ border: 1px solid var(--gray-200);
543
+ }
544
+
545
+ .recommendation h3 {
546
+ margin-bottom: 8px;
547
+ }
548
+
549
+ .recommendation p {
550
+ color: var(--gray-600);
551
+ }
552
+
553
+ @media print {
554
+ body {
555
+ background: white;
556
+ padding: 0;
557
+ }
558
+ .report {
559
+ box-shadow: none;
560
+ border-radius: 0;
561
+ }
562
+ }
563
+ `;
564
+ }
565
+
566
+ /**
567
+ * Format category name
568
+ */
569
+ function formatCategoryName(name) {
570
+ const names = {
571
+ functionality: 'Core Functionality',
572
+ auth: 'Authentication',
573
+ billing: 'Payment Integration',
574
+ reality: 'Runtime Verification',
575
+ code_quality: 'Code Quality',
576
+ };
577
+ return names[name] || name.charAt(0).toUpperCase() + name.slice(1).replace(/_/g, ' ');
578
+ }
579
+
580
+ /**
581
+ * Generate enhanced executive report
582
+ */
583
+ function generateEnhancedExecutiveReport(data, options = {}) {
584
+ const verdictClass = data.verdict === 'SHIP' ? 'ship' : data.verdict === 'WARN' ? 'warn' : 'block';
585
+ const verdictText = data.verdict === 'SHIP' ? '✅ Ready to Ship' :
586
+ data.verdict === 'WARN' ? '⚠️ Ship with Caution' : '🚫 Not Ready';
587
+ const verdictMessage = data.verdict === 'SHIP'
588
+ ? 'All systems go. This application is ready for production.'
589
+ : data.verdict === 'WARN'
590
+ ? 'Minor issues detected. Review recommended before deployment.'
591
+ : 'Critical issues found. Remediation required before shipping.';
592
+
593
+ return `<!DOCTYPE html>
594
+ <html lang="en">
595
+ <head>
596
+ <meta charset="UTF-8">
597
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
598
+ <title>Ship Readiness Report - ${data.projectName}</title>
599
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
600
+ <style>${getEnhancedStyles()}</style>
601
+ </head>
602
+ <body>
603
+ <div class="report">
604
+ <header class="report-header">
605
+ <h1>Ship Readiness Report</h1>
606
+ <div class="report-meta">
607
+ <p><strong>Project:</strong> ${data.projectName}</p>
608
+ <p><strong>Generated:</strong> ${new Date(data.generatedAt).toLocaleString()}</p>
609
+ ${options.company ? `<p><strong>Prepared for:</strong> ${options.company}</p>` : ''}
610
+ </div>
611
+ <div class="report-logo">VIBECHECK</div>
612
+ </header>
613
+
614
+ <section class="score-section">
615
+ <div class="score-main">
616
+ ${generateScoreGauge(data.score)}
617
+ <div class="score-info">
618
+ <h2>Vibe Score</h2>
619
+ <p>${verdictMessage}</p>
620
+ </div>
621
+ </div>
622
+ <div class="verdict-badge ${verdictClass}">${verdictText}</div>
623
+ </section>
624
+
625
+ <div class="report-content">
626
+ <section class="section">
627
+ <div class="section-header">
628
+ <div class="section-icon">📊</div>
629
+ <h3 class="section-title">Category Breakdown</h3>
630
+ </div>
631
+ ${generateCategoryBars(data.categoryScores)}
632
+ </section>
633
+
634
+ <section class="section">
635
+ <div class="section-header">
636
+ <div class="section-icon">🎯</div>
637
+ <h3 class="section-title">Issues by Severity</h3>
638
+ </div>
639
+ ${generateSeverityBreakdown(data.findings)}
640
+ </section>
641
+
642
+ ${data.findings.length > 0 ? `
643
+ <section class="section">
644
+ <div class="section-header">
645
+ <div class="section-icon">🔍</div>
646
+ <h3 class="section-title">Key Findings</h3>
647
+ </div>
648
+ ${generateFindingsList(data.findings, { limit: 5, redactPaths: options.redactPaths })}
649
+ </section>
650
+ ` : ''}
651
+
652
+ <section class="section">
653
+ <div class="recommendation">
654
+ <h3>📋 Recommendation</h3>
655
+ <p>${data.verdict === 'SHIP'
656
+ ? 'This application has passed all quality checks and is ready for production deployment. Continue monitoring after launch.'
657
+ : data.verdict === 'WARN'
658
+ ? 'This application can be deployed, but the identified issues should be addressed in the next sprint to ensure long-term stability.'
659
+ : 'This application requires immediate attention. Critical issues must be resolved before deployment to prevent production incidents.'
660
+ }</p>
661
+ </div>
662
+ </section>
663
+ </div>
664
+
665
+ <footer class="report-footer">
666
+ <div class="footer-brand">
667
+ <span>⚡</span>
668
+ <span>Vibecheck</span>
669
+ </div>
670
+ <div class="footer-meta">
671
+ Report ID: VC-${Date.now().toString(36).toUpperCase()} · vibecheck.dev
672
+ </div>
673
+ </footer>
674
+ </div>
675
+ </body>
676
+ </html>`;
677
+ }
678
+
679
+ /**
680
+ * Generate enhanced technical report
681
+ */
682
+ function generateEnhancedTechnicalReport(data, options = {}) {
683
+ const verdictClass = data.verdict === 'SHIP' ? 'ship' : data.verdict === 'WARN' ? 'warn' : 'block';
684
+
685
+ return `<!DOCTYPE html>
686
+ <html lang="en">
687
+ <head>
688
+ <meta charset="UTF-8">
689
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
690
+ <title>Technical Quality Report - ${data.projectName}</title>
691
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono&display=swap" rel="stylesheet">
692
+ <style>
693
+ ${getEnhancedStyles()}
694
+ .code-block { font-family: 'JetBrains Mono', monospace; background: #1e293b; color: #e2e8f0; padding: 16px; border-radius: 8px; overflow-x: auto; }
695
+ .finding-card { margin-bottom: 16px; }
696
+ .tech-table { width: 100%; border-collapse: collapse; margin: 16px 0; }
697
+ .tech-table th, .tech-table td { padding: 12px; text-align: left; border-bottom: 1px solid var(--gray-200); }
698
+ .tech-table th { background: var(--gray-100); font-weight: 600; }
699
+ .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 600; }
700
+ .badge-critical { background: #fee2e2; color: #991b1b; }
701
+ .badge-high { background: #ffedd5; color: #9a3412; }
702
+ .badge-medium { background: #fef9c3; color: #854d0e; }
703
+ .badge-low { background: #f1f5f9; color: #475569; }
704
+ </style>
705
+ </head>
706
+ <body>
707
+ <div class="report">
708
+ <header class="report-header">
709
+ <h1>Technical Quality Report</h1>
710
+ <div class="report-meta">
711
+ <p><strong>Project:</strong> ${data.projectName}</p>
712
+ <p><strong>Generated:</strong> ${new Date(data.generatedAt).toLocaleString()}</p>
713
+ <p><strong>Scan ID:</strong> VC-${Date.now().toString(36).toUpperCase()}</p>
714
+ </div>
715
+ <div class="report-logo">VIBECHECK</div>
716
+ </header>
717
+
718
+ <section class="score-section">
719
+ <div class="score-main">
720
+ ${generateScoreGauge(data.score)}
721
+ <div class="score-info">
722
+ <h2>Technical Score</h2>
723
+ <p>${data.findings.length} issues found across ${Object.keys(data.categoryScores).length} categories</p>
724
+ </div>
725
+ </div>
726
+ <div class="verdict-badge ${verdictClass}">${data.verdict}</div>
727
+ </section>
728
+
729
+ <div class="report-content">
730
+ <section class="section">
731
+ <div class="section-header">
732
+ <div class="section-icon">📊</div>
733
+ <h3 class="section-title">Score Breakdown</h3>
734
+ </div>
735
+ <table class="tech-table">
736
+ <thead>
737
+ <tr><th>Category</th><th>Score</th><th>Status</th><th>Details</th></tr>
738
+ </thead>
739
+ <tbody>
740
+ ${Object.entries(data.categoryScores).map(([cat, score]) => `
741
+ <tr>
742
+ <td>${formatCategoryName(cat)}</td>
743
+ <td><strong>${score}%</strong></td>
744
+ <td>${score >= 80 ? '✅ Pass' : score >= 60 ? '⚠️ Warning' : '❌ Fail'}</td>
745
+ <td>${score >= 80 ? 'No issues' : 'Requires attention'}</td>
746
+ </tr>
747
+ `).join('')}
748
+ </tbody>
749
+ </table>
750
+ </section>
751
+
752
+ <section class="section">
753
+ <div class="section-header">
754
+ <div class="section-icon">🎯</div>
755
+ <h3 class="section-title">Issues by Severity</h3>
756
+ </div>
757
+ ${generateSeverityBreakdown(data.findings)}
758
+ </section>
759
+
760
+ <section class="section">
761
+ <div class="section-header">
762
+ <div class="section-icon">🔍</div>
763
+ <h3 class="section-title">All Findings (${data.findings.length})</h3>
764
+ </div>
765
+ ${generateFindingsList(data.findings, { limit: 50, redactPaths: options.redactPaths })}
766
+ </section>
767
+ </div>
768
+
769
+ <footer class="report-footer">
770
+ <div class="footer-brand">
771
+ <span>⚡</span>
772
+ <span>Vibecheck Technical Report</span>
773
+ </div>
774
+ <div class="footer-meta">
775
+ vibecheck.dev
776
+ </div>
777
+ </footer>
778
+ </div>
779
+ </body>
780
+ </html>`;
781
+ }
782
+
783
+ /**
784
+ * Generate enhanced compliance report
785
+ */
786
+ function generateEnhancedComplianceReport(data, options = {}) {
787
+ const assessmentId = `VC-${new Date().toISOString().split('T')[0].replace(/-/g, '')}-${Math.random().toString(36).substring(2, 8).toUpperCase()}`;
788
+ const verdictClass = data.verdict === 'SHIP' ? 'ship' : data.verdict === 'WARN' ? 'warn' : 'block';
789
+
790
+ const criticalCount = data.findings.filter(f => f.severity === 'critical').length;
791
+ const highCount = data.findings.filter(f => f.severity === 'high').length;
792
+
793
+ return `<!DOCTYPE html>
794
+ <html lang="en">
795
+ <head>
796
+ <meta charset="UTF-8">
797
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
798
+ <title>Security Assessment Report - ${data.projectName}</title>
799
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
800
+ <style>
801
+ ${getEnhancedStyles()}
802
+ .compliance-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin: 24px 0; }
803
+ .compliance-card { background: var(--gray-50); padding: 20px; border-radius: 12px; border: 1px solid var(--gray-200); }
804
+ .compliance-card h4 { margin-bottom: 12px; display: flex; align-items: center; gap: 8px; }
805
+ .control-item { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px solid var(--gray-200); }
806
+ .control-item:last-child { border-bottom: none; }
807
+ .control-status { width: 24px; text-align: center; }
808
+ .attestation { background: linear-gradient(135deg, #1e293b 0%, #334155 100%); color: white; padding: 32px; border-radius: 12px; margin-top: 32px; }
809
+ .attestation h3 { margin-bottom: 16px; }
810
+ .signature-line { margin-top: 32px; padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.2); display: flex; justify-content: space-between; }
811
+ </style>
812
+ </head>
813
+ <body>
814
+ <div class="report">
815
+ <header class="report-header" style="background: linear-gradient(135deg, #1e3a5f 0%, #0f172a 100%);">
816
+ <h1>Application Security Assessment</h1>
817
+ <div class="report-meta">
818
+ <p><strong>Application:</strong> ${data.projectName}</p>
819
+ <p><strong>Assessment Date:</strong> ${new Date(data.generatedAt).toLocaleDateString()}</p>
820
+ <p><strong>Assessment ID:</strong> ${assessmentId}</p>
821
+ ${options.company ? `<p><strong>Prepared For:</strong> ${options.company}</p>` : ''}
822
+ </div>
823
+ <div class="report-logo">VIBECHECK</div>
824
+ </header>
825
+
826
+ <section class="score-section">
827
+ <div class="score-main">
828
+ ${generateScoreGauge(data.score)}
829
+ <div class="score-info">
830
+ <h2>Security Score</h2>
831
+ <p>Based on automated code analysis and security checks</p>
832
+ </div>
833
+ </div>
834
+ <div class="verdict-badge ${verdictClass}">${data.verdict === 'SHIP' ? '✅ COMPLIANT' : data.verdict === 'WARN' ? '⚠️ PARTIAL' : '🚫 NON-COMPLIANT'}</div>
835
+ </section>
836
+
837
+ <div class="report-content">
838
+ <section class="section">
839
+ <div class="section-header">
840
+ <div class="section-icon" style="background: #1e3a5f;">📋</div>
841
+ <h3 class="section-title">Executive Summary</h3>
842
+ </div>
843
+ <p style="margin-bottom: 16px;">
844
+ This assessment evaluates the application's compliance with security best practices
845
+ and industry standards. The analysis covers code quality, authentication mechanisms,
846
+ data protection, and operational security controls.
847
+ </p>
848
+ <div class="compliance-grid">
849
+ <div class="compliance-card">
850
+ <h4>🔴 Critical Findings</h4>
851
+ <div style="font-size: 32px; font-weight: 700; color: ${criticalCount > 0 ? '#dc2626' : '#22c55e'};">${criticalCount}</div>
852
+ <p style="color: var(--gray-600); font-size: 14px;">${criticalCount > 0 ? 'Immediate remediation required' : 'No critical issues'}</p>
853
+ </div>
854
+ <div class="compliance-card">
855
+ <h4>🟠 High Priority</h4>
856
+ <div style="font-size: 32px; font-weight: 700; color: ${highCount > 0 ? '#f97316' : '#22c55e'};">${highCount}</div>
857
+ <p style="color: var(--gray-600); font-size: 14px;">${highCount > 0 ? 'Should be addressed soon' : 'No high priority issues'}</p>
858
+ </div>
859
+ </div>
860
+ </section>
861
+
862
+ <section class="section">
863
+ <div class="section-header">
864
+ <div class="section-icon" style="background: #1e3a5f;">🔒</div>
865
+ <h3 class="section-title">Control Areas Assessed</h3>
866
+ </div>
867
+ <div class="compliance-grid">
868
+ <div class="compliance-card">
869
+ <h4>🔐 Access Control</h4>
870
+ <div class="control-item">
871
+ <span class="control-status">${data.categoryScores.auth >= 80 ? '✅' : '❌'}</span>
872
+ <span>Authentication required for protected routes</span>
873
+ </div>
874
+ <div class="control-item">
875
+ <span class="control-status">⬜</span>
876
+ <span>Session management (manual review)</span>
877
+ </div>
878
+ <div class="control-item">
879
+ <span class="control-status">⬜</span>
880
+ <span>Password hashing (manual review)</span>
881
+ </div>
882
+ </div>
883
+ <div class="compliance-card">
884
+ <h4>🛡️ Data Protection</h4>
885
+ <div class="control-item">
886
+ <span class="control-status">⬜</span>
887
+ <span>Encryption in transit (TLS)</span>
888
+ </div>
889
+ <div class="control-item">
890
+ <span class="control-status">${data.findings.filter(f => f.type === 'secret').length === 0 ? '✅' : '❌'}</span>
891
+ <span>No secrets in codebase</span>
892
+ </div>
893
+ </div>
894
+ <div class="compliance-card">
895
+ <h4>💳 Payment Security</h4>
896
+ <div class="control-item">
897
+ <span class="control-status">${data.categoryScores.billing >= 80 ? '✅' : '❌'}</span>
898
+ <span>Billing gates enforced server-side</span>
899
+ </div>
900
+ </div>
901
+ <div class="compliance-card">
902
+ <h4>📝 Code Quality</h4>
903
+ <div class="control-item">
904
+ <span class="control-status">${data.categoryScores.code_quality >= 80 ? '✅' : '❌'}</span>
905
+ <span>No mock/demo code in production paths</span>
906
+ </div>
907
+ </div>
908
+ </div>
909
+ </section>
910
+
911
+ ${data.findings.length > 0 ? `
912
+ <section class="section">
913
+ <div class="section-header">
914
+ <div class="section-icon" style="background: #1e3a5f;">🔍</div>
915
+ <h3 class="section-title">Findings Detail</h3>
916
+ </div>
917
+ ${generateFindingsList(data.findings, { limit: 10, redactPaths: options.redactPaths })}
918
+ </section>
919
+ ` : ''}
920
+
921
+ <div class="attestation">
922
+ <h3>📜 Attestation</h3>
923
+ <p>
924
+ This assessment was conducted using automated static code analysis and security scanning tools.
925
+ ${data.verdict === 'SHIP'
926
+ ? 'The application meets the baseline security requirements for production deployment.'
927
+ : 'The application has identified issues that should be remediated before production deployment.'}
928
+ </p>
929
+ <div class="signature-line">
930
+ <div>
931
+ <strong>Assessment ID:</strong> ${assessmentId}
932
+ </div>
933
+ <div>
934
+ <strong>Verification:</strong> vibecheck.dev/verify/${assessmentId}
935
+ </div>
936
+ </div>
937
+ </div>
938
+ </div>
939
+
940
+ <footer class="report-footer">
941
+ <div class="footer-brand">
942
+ <span>🔒</span>
943
+ <span>Vibecheck Security Assessment</span>
944
+ </div>
945
+ <div class="footer-meta">
946
+ vibecheck.dev
947
+ </div>
948
+ </footer>
949
+ </div>
950
+ </body>
951
+ </html>`;
952
+ }
953
+
954
+ module.exports = {
955
+ generateScoreGauge,
956
+ generateCategoryBars,
957
+ generateSeverityBreakdown,
958
+ generateFindingsList,
959
+ getEnhancedStyles,
960
+ generateEnhancedExecutiveReport,
961
+ generateEnhancedTechnicalReport,
962
+ generateEnhancedComplianceReport,
963
+ formatCategoryName,
964
+ };