@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,540 @@
1
+ /**
2
+ * CLI UI Library — Beautiful Interactive Experience
3
+ *
4
+ * Features:
5
+ * - Stunning ASCII art headers
6
+ * - Beautiful bordered tables
7
+ * - Interactive menus
8
+ * - Progress bars and spinners
9
+ * - Color gradients
10
+ * - Box drawing characters
11
+ */
12
+
13
+ const readline = require("readline");
14
+
15
+ // Extended ANSI color palette
16
+ const colors = {
17
+ reset: "\x1b[0m",
18
+ bold: "\x1b[1m",
19
+ dim: "\x1b[2m",
20
+ italic: "\x1b[3m",
21
+ underline: "\x1b[4m",
22
+ blink: "\x1b[5m",
23
+ inverse: "\x1b[7m",
24
+ hidden: "\x1b[8m",
25
+ strikethrough: "\x1b[9m",
26
+
27
+ // Foreground colors
28
+ black: "\x1b[30m",
29
+ red: "\x1b[31m",
30
+ green: "\x1b[32m",
31
+ yellow: "\x1b[33m",
32
+ blue: "\x1b[34m",
33
+ magenta: "\x1b[35m",
34
+ cyan: "\x1b[36m",
35
+ white: "\x1b[37m",
36
+
37
+ // Bright foreground
38
+ brightBlack: "\x1b[90m",
39
+ brightRed: "\x1b[91m",
40
+ brightGreen: "\x1b[92m",
41
+ brightYellow: "\x1b[93m",
42
+ brightBlue: "\x1b[94m",
43
+ brightMagenta: "\x1b[95m",
44
+ brightCyan: "\x1b[96m",
45
+ brightWhite: "\x1b[97m",
46
+
47
+ // Background colors
48
+ bgBlack: "\x1b[40m",
49
+ bgRed: "\x1b[41m",
50
+ bgGreen: "\x1b[42m",
51
+ bgYellow: "\x1b[43m",
52
+ bgBlue: "\x1b[44m",
53
+ bgMagenta: "\x1b[45m",
54
+ bgCyan: "\x1b[46m",
55
+ bgWhite: "\x1b[47m",
56
+
57
+ // Bright background
58
+ bgBrightBlack: "\x1b[100m",
59
+ bgBrightRed: "\x1b[101m",
60
+ bgBrightGreen: "\x1b[102m",
61
+ bgBrightYellow: "\x1b[103m",
62
+ bgBrightBlue: "\x1b[104m",
63
+ bgBrightMagenta: "\x1b[105m",
64
+ bgBrightCyan: "\x1b[106m",
65
+ bgBrightWhite: "\x1b[107m",
66
+ };
67
+
68
+ const c = colors;
69
+
70
+ // Box drawing characters
71
+ const box = {
72
+ // Single line
73
+ topLeft: "┌",
74
+ topRight: "┐",
75
+ bottomLeft: "└",
76
+ bottomRight: "┘",
77
+ horizontal: "─",
78
+ vertical: "│",
79
+ leftT: "├",
80
+ rightT: "┤",
81
+ topT: "┬",
82
+ bottomT: "┴",
83
+ cross: "┼",
84
+
85
+ // Double line
86
+ dTopLeft: "╔",
87
+ dTopRight: "╗",
88
+ dBottomLeft: "╚",
89
+ dBottomRight: "╝",
90
+ dHorizontal: "═",
91
+ dVertical: "║",
92
+ dLeftT: "╠",
93
+ dRightT: "╣",
94
+ dTopT: "╦",
95
+ dBottomT: "╩",
96
+ dCross: "╬",
97
+
98
+ // Rounded
99
+ rTopLeft: "╭",
100
+ rTopRight: "╮",
101
+ rBottomLeft: "╰",
102
+ rBottomRight: "╯",
103
+ };
104
+
105
+ // Spinner frames
106
+ const spinners = {
107
+ dots: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
108
+ line: ["-", "\\", "|", "/"],
109
+ circle: ["◐", "◓", "◑", "◒"],
110
+ arc: ["◜", "◠", "◝", "◞", "◡", "◟"],
111
+ box: ["▖", "▘", "▝", "▗"],
112
+ bounce: ["⠁", "⠂", "⠄", "⠂"],
113
+ pulse: ["█", "▓", "▒", "░", "▒", "▓"],
114
+ arrows: ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"],
115
+ star: ["✶", "✷", "✸", "✹", "✺", "✹", "✸", "✷"],
116
+ };
117
+
118
+ // Progress bar characters
119
+ const progressChars = {
120
+ filled: "█",
121
+ empty: "░",
122
+ gradient: ["░", "▒", "▓", "█"],
123
+ smooth: ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"],
124
+ };
125
+
126
+ /**
127
+ * Create a beautiful header with ASCII art border
128
+ */
129
+ function createHeader(title, subtitle = "", options = {}) {
130
+ const width = options.width || 70;
131
+ const style = options.style || "double"; // single, double, rounded
132
+ const color = options.color || c.cyan;
133
+
134
+ const chars = style === "double" ? {
135
+ tl: box.dTopLeft, tr: box.dTopRight, bl: box.dBottomLeft, br: box.dBottomRight,
136
+ h: box.dHorizontal, v: box.dVertical
137
+ } : style === "rounded" ? {
138
+ tl: box.rTopLeft, tr: box.rTopRight, bl: box.rBottomLeft, br: box.rBottomRight,
139
+ h: box.horizontal, v: box.vertical
140
+ } : {
141
+ tl: box.topLeft, tr: box.topRight, bl: box.bottomLeft, br: box.bottomRight,
142
+ h: box.horizontal, v: box.vertical
143
+ };
144
+
145
+ const innerWidth = width - 2;
146
+ const titlePad = Math.floor((innerWidth - title.length) / 2);
147
+ const subtitlePad = Math.floor((innerWidth - subtitle.length) / 2);
148
+
149
+ let output = "";
150
+ output += `${color}${chars.tl}${chars.h.repeat(innerWidth)}${chars.tr}${c.reset}\n`;
151
+ output += `${color}${chars.v}${c.reset}${" ".repeat(innerWidth)}${color}${chars.v}${c.reset}\n`;
152
+ output += `${color}${chars.v}${c.reset}${" ".repeat(titlePad)}${c.bold}${c.brightWhite}${title}${c.reset}${" ".repeat(innerWidth - titlePad - title.length)}${color}${chars.v}${c.reset}\n`;
153
+
154
+ if (subtitle) {
155
+ output += `${color}${chars.v}${c.reset}${" ".repeat(subtitlePad)}${c.dim}${subtitle}${c.reset}${" ".repeat(innerWidth - subtitlePad - subtitle.length)}${color}${chars.v}${c.reset}\n`;
156
+ }
157
+
158
+ output += `${color}${chars.v}${c.reset}${" ".repeat(innerWidth)}${color}${chars.v}${c.reset}\n`;
159
+ output += `${color}${chars.bl}${chars.h.repeat(innerWidth)}${chars.br}${c.reset}`;
160
+
161
+ return output;
162
+ }
163
+
164
+ /**
165
+ * Create a beautiful table
166
+ */
167
+ function createTable(headers, rows, options = {}) {
168
+ const style = options.style || "rounded";
169
+ const headerColor = options.headerColor || c.cyan;
170
+ const borderColor = options.borderColor || c.dim;
171
+
172
+ // Calculate column widths
173
+ const colWidths = headers.map((h, i) => {
174
+ const headerLen = stripAnsi(h).length;
175
+ const maxRowLen = Math.max(...rows.map(r => stripAnsi(String(r[i] || "")).length));
176
+ return Math.max(headerLen, maxRowLen) + 2;
177
+ });
178
+
179
+ const chars = style === "rounded" ? {
180
+ tl: box.rTopLeft, tr: box.rTopRight, bl: box.rBottomLeft, br: box.rBottomRight,
181
+ h: box.horizontal, v: box.vertical, lt: box.leftT, rt: box.rightT,
182
+ tt: box.topT, bt: box.bottomT, cr: box.cross
183
+ } : {
184
+ tl: box.topLeft, tr: box.topRight, bl: box.bottomLeft, br: box.bottomRight,
185
+ h: box.horizontal, v: box.vertical, lt: box.leftT, rt: box.rightT,
186
+ tt: box.topT, bt: box.bottomT, cr: box.cross
187
+ };
188
+
189
+ let output = "";
190
+
191
+ // Top border
192
+ output += borderColor + chars.tl;
193
+ output += colWidths.map(w => chars.h.repeat(w)).join(chars.tt);
194
+ output += chars.tr + c.reset + "\n";
195
+
196
+ // Header row
197
+ output += borderColor + chars.v + c.reset;
198
+ headers.forEach((h, i) => {
199
+ const padded = padCenter(h, colWidths[i]);
200
+ output += `${headerColor}${c.bold}${padded}${c.reset}${borderColor}${chars.v}${c.reset}`;
201
+ });
202
+ output += "\n";
203
+
204
+ // Header separator
205
+ output += borderColor + chars.lt;
206
+ output += colWidths.map(w => chars.h.repeat(w)).join(chars.cr);
207
+ output += chars.rt + c.reset + "\n";
208
+
209
+ // Data rows
210
+ rows.forEach((row, rowIdx) => {
211
+ output += borderColor + chars.v + c.reset;
212
+ row.forEach((cell, i) => {
213
+ const cellStr = String(cell || "");
214
+ const padded = padCenter(cellStr, colWidths[i]);
215
+ output += `${padded}${borderColor}${chars.v}${c.reset}`;
216
+ });
217
+ output += "\n";
218
+ });
219
+
220
+ // Bottom border
221
+ output += borderColor + chars.bl;
222
+ output += colWidths.map(w => chars.h.repeat(w)).join(chars.bt);
223
+ output += chars.br + c.reset;
224
+
225
+ return output;
226
+ }
227
+
228
+ /**
229
+ * Create a beautiful progress bar
230
+ */
231
+ function createProgressBar(percent, options = {}) {
232
+ const width = options.width || 40;
233
+ const showPercent = options.showPercent !== false;
234
+ const showLabel = options.label || "";
235
+ const color = options.color || c.green;
236
+
237
+ const filled = Math.round((percent / 100) * width);
238
+ const empty = width - filled;
239
+
240
+ let bar = "";
241
+
242
+ // Gradient effect
243
+ for (let i = 0; i < filled; i++) {
244
+ const charIdx = Math.min(3, Math.floor((i / width) * 4));
245
+ bar += color + progressChars.gradient[charIdx];
246
+ }
247
+ bar += c.dim;
248
+ for (let i = 0; i < empty; i++) {
249
+ bar += progressChars.empty;
250
+ }
251
+ bar += c.reset;
252
+
253
+ let output = "";
254
+ if (showLabel) {
255
+ output += `${showLabel} `;
256
+ }
257
+ output += `${c.dim}[${c.reset}${bar}${c.dim}]${c.reset}`;
258
+ if (showPercent) {
259
+ output += ` ${color}${percent.toFixed(0)}%${c.reset}`;
260
+ }
261
+
262
+ return output;
263
+ }
264
+
265
+ /**
266
+ * Create a category score display with visual bars
267
+ */
268
+ function createScoreCard(categories, options = {}) {
269
+ const width = options.width || 50;
270
+ const barWidth = options.barWidth || 25;
271
+
272
+ let output = "";
273
+
274
+ for (const [name, score] of Object.entries(categories)) {
275
+ const color = score >= 80 ? c.green : score >= 60 ? c.yellow : c.red;
276
+ const icon = score >= 80 ? "✓" : score >= 60 ? "!" : "✗";
277
+
278
+ const filled = Math.round((score / 100) * barWidth);
279
+ const empty = barWidth - filled;
280
+ const bar = color + progressChars.filled.repeat(filled) + c.dim + progressChars.empty.repeat(empty) + c.reset;
281
+
282
+ const nameStr = name.padEnd(15);
283
+ const scoreStr = `${score}%`.padStart(4);
284
+
285
+ output += ` ${c.dim}${icon}${c.reset} ${nameStr} ${bar} ${color}${scoreStr}${c.reset}\n`;
286
+ }
287
+
288
+ return output;
289
+ }
290
+
291
+ /**
292
+ * Create an interactive menu
293
+ */
294
+ async function createMenu(title, options, config = {}) {
295
+ const menuColor = config.color || c.cyan;
296
+
297
+ return new Promise((resolve) => {
298
+ console.log("");
299
+ console.log(createHeader(title, config.subtitle || "", { color: menuColor, style: "rounded" }));
300
+ console.log("");
301
+
302
+ options.forEach((opt, i) => {
303
+ const num = `${i + 1}`.padStart(2);
304
+ const icon = opt.icon || "›";
305
+ console.log(` ${menuColor}${num}${c.reset} ${icon} ${c.bold}${opt.label}${c.reset}`);
306
+ if (opt.description) {
307
+ console.log(` ${c.dim}${opt.description}${c.reset}`);
308
+ }
309
+ });
310
+
311
+ console.log("");
312
+ console.log(` ${c.dim}${options.length + 1}. Exit${c.reset}`);
313
+ console.log("");
314
+
315
+ const rl = readline.createInterface({
316
+ input: process.stdin,
317
+ output: process.stdout,
318
+ });
319
+
320
+ rl.question(` ${menuColor}›${c.reset} Select an option: `, (answer) => {
321
+ rl.close();
322
+ const choice = parseInt(answer, 10);
323
+
324
+ if (choice >= 1 && choice <= options.length) {
325
+ resolve(options[choice - 1]);
326
+ } else {
327
+ resolve(null);
328
+ }
329
+ });
330
+ });
331
+ }
332
+
333
+ /**
334
+ * Create a spinner
335
+ */
336
+ function createSpinner(message, type = "dots") {
337
+ const frames = spinners[type] || spinners.dots;
338
+ let frameIdx = 0;
339
+ let interval = null;
340
+
341
+ const spinner = {
342
+ start() {
343
+ process.stdout.write(`\n ${frames[0]} ${message}`);
344
+ interval = setInterval(() => {
345
+ frameIdx = (frameIdx + 1) % frames.length;
346
+ process.stdout.write(`\r ${c.cyan}${frames[frameIdx]}${c.reset} ${message}`);
347
+ }, 80);
348
+ return this;
349
+ },
350
+
351
+ update(newMessage) {
352
+ message = newMessage;
353
+ return this;
354
+ },
355
+
356
+ success(finalMessage) {
357
+ if (interval) clearInterval(interval);
358
+ process.stdout.write(`\r ${c.green}✓${c.reset} ${finalMessage || message}\n`);
359
+ return this;
360
+ },
361
+
362
+ error(finalMessage) {
363
+ if (interval) clearInterval(interval);
364
+ process.stdout.write(`\r ${c.red}✗${c.reset} ${finalMessage || message}\n`);
365
+ return this;
366
+ },
367
+
368
+ stop() {
369
+ if (interval) clearInterval(interval);
370
+ process.stdout.write("\r" + " ".repeat(message.length + 10) + "\r");
371
+ return this;
372
+ },
373
+ };
374
+
375
+ return spinner;
376
+ }
377
+
378
+ /**
379
+ * Create a beautiful verdict display
380
+ */
381
+ function createVerdictDisplay(verdict, score, options = {}) {
382
+ const width = options.width || 60;
383
+
384
+ const configs = {
385
+ SHIP: {
386
+ color: c.green,
387
+ bgColor: c.bgGreen,
388
+ icon: "🚀",
389
+ ascii: [
390
+ " ███████╗██╗ ██╗██╗██████╗ ",
391
+ " ██╔════╝██║ ██║██║██╔══██╗",
392
+ " ███████╗███████║██║██████╔╝",
393
+ " ╚════██║██╔══██║██║██╔═══╝ ",
394
+ " ███████║██║ ██║██║██║ ",
395
+ " ╚══════╝╚═╝ ╚═╝╚═╝╚═╝ ",
396
+ ],
397
+ message: "Ready to ship!",
398
+ tagline: "All systems go. Deploy with confidence.",
399
+ },
400
+ WARN: {
401
+ color: c.yellow,
402
+ bgColor: c.bgYellow,
403
+ icon: "⚠️",
404
+ ascii: [
405
+ " ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗",
406
+ " ██║ ██║██╔══██╗██╔══██╗████╗ ██║",
407
+ " ██║ █╗ ██║███████║██████╔╝██╔██╗ ██║",
408
+ " ██║███╗██║██╔══██║██╔══██╗██║╚██╗██║",
409
+ " ╚███╔███╔╝██║ ██║██║ ██║██║ ╚████║",
410
+ " ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝",
411
+ ],
412
+ message: "Ship with caution",
413
+ tagline: "Minor issues found. Review before deploy.",
414
+ },
415
+ BLOCK: {
416
+ color: c.red,
417
+ bgColor: c.bgRed,
418
+ icon: "🚫",
419
+ ascii: [
420
+ " ██████╗ ██╗ ██████╗ ██████╗██╗ ██╗",
421
+ " ██╔══██╗██║ ██╔═══██╗██╔════╝██║ ██╔╝",
422
+ " ██████╔╝██║ ██║ ██║██║ █████╔╝ ",
423
+ " ██╔══██╗██║ ██║ ██║██║ ██╔═██╗ ",
424
+ " ██████╔╝███████╗╚██████╔╝╚██████╗██║ ██╗",
425
+ " ╚═════╝ ╚══════╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝",
426
+ ],
427
+ message: "Do not ship!",
428
+ tagline: "Critical issues must be fixed first.",
429
+ },
430
+ };
431
+
432
+ const config = configs[verdict] || configs.BLOCK;
433
+
434
+ let output = "\n";
435
+
436
+ // ASCII art verdict
437
+ for (const line of config.ascii) {
438
+ output += `${config.color}${line}${c.reset}\n`;
439
+ }
440
+
441
+ output += "\n";
442
+
443
+ // Score display
444
+ const scoreDisplay = `SCORE: ${score}`;
445
+ output += ` ${config.color}${c.bold}${config.icon} ${scoreDisplay}${c.reset}\n`;
446
+ output += ` ${c.dim}${config.tagline}${c.reset}\n`;
447
+
448
+ return output;
449
+ }
450
+
451
+ /**
452
+ * Create a badge display (the stunning one)
453
+ */
454
+ function createBadgeDisplay(projectId, score, verdict) {
455
+ const config = {
456
+ SHIP: { color: c.green, bg: c.bgGreen, icon: "✓", glow: "🌟" },
457
+ WARN: { color: c.yellow, bg: c.bgYellow, icon: "!", glow: "⚡" },
458
+ BLOCK: { color: c.red, bg: c.bgRed, icon: "✗", glow: "🔥" },
459
+ };
460
+
461
+ const cfg = config[verdict] || config.BLOCK;
462
+
463
+ const badge = `
464
+ ${cfg.color}${c.bold}
465
+ ╔══════════════════════════════════════════════════════════════╗
466
+ ║ ║
467
+ ║ ${cfg.glow} ██╗ ██╗██╗██████╗ ███████╗ ██████╗██╗ ██╗███████╗ ${cfg.glow} ║
468
+ ║ ██║ ██║██║██╔══██╗██╔════╝██╔════╝██║ ██║██╔════╝ ║
469
+ ║ ██║ ██║██║██████╔╝█████╗ ██║ ███████║█████╗ ║
470
+ ║ ╚██╗ ██╔╝██║██╔══██╗██╔══╝ ██║ ██╔══██║██╔══╝ ║
471
+ ║ ╚████╔╝ ██║██████╔╝███████╗╚██████╗██║ ██║███████╗ ║
472
+ ║ ╚═══╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ║
473
+ ║ ║
474
+ ║ ┌────────────────────────────────────────────────────────┐ ║
475
+ ║ │ │ ║
476
+ ║ │ ${cfg.icon} ${verdict} │ SCORE: ${String(score).padStart(3)} │ ${projectId.substring(0, 20).padEnd(20)} │ ║
477
+ ║ │ │ ║
478
+ ║ └────────────────────────────────────────────────────────┘ ║
479
+ ║ ║
480
+ ║ ════════════════════════════════════════════ ║
481
+ ║ VERIFIED BY VIBECHECK ║
482
+ ║ ════════════════════════════════════════════ ║
483
+ ║ ║
484
+ ╚══════════════════════════════════════════════════════════════╝
485
+ ${c.reset}`;
486
+
487
+ return badge;
488
+ }
489
+
490
+ /**
491
+ * Strip ANSI codes from string
492
+ */
493
+ function stripAnsi(str) {
494
+ return str.replace(/\x1b\[[0-9;]*m/g, "");
495
+ }
496
+
497
+ /**
498
+ * Pad string to center
499
+ */
500
+ function padCenter(str, width) {
501
+ const len = stripAnsi(str).length;
502
+ const pad = Math.max(0, width - len);
503
+ const padLeft = Math.floor(pad / 2);
504
+ const padRight = pad - padLeft;
505
+ return " ".repeat(padLeft) + str + " ".repeat(padRight);
506
+ }
507
+
508
+ /**
509
+ * Create a divider line
510
+ */
511
+ function divider(width = 60, char = "─", color = c.dim) {
512
+ return `${color}${char.repeat(width)}${c.reset}`;
513
+ }
514
+
515
+ /**
516
+ * Create a section header
517
+ */
518
+ function sectionHeader(title, icon = "›") {
519
+ return `\n${c.cyan}${icon}${c.reset} ${c.bold}${title}${c.reset}\n${divider(40)}`;
520
+ }
521
+
522
+ module.exports = {
523
+ colors,
524
+ c,
525
+ box,
526
+ spinners,
527
+ progressChars,
528
+ createHeader,
529
+ createTable,
530
+ createProgressBar,
531
+ createScoreCard,
532
+ createMenu,
533
+ createSpinner,
534
+ createVerdictDisplay,
535
+ createBadgeDisplay,
536
+ stripAnsi,
537
+ padCenter,
538
+ divider,
539
+ sectionHeader,
540
+ };
File without changes
@@ -0,0 +1,165 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+
4
+ // Import from the built TypeScript package
5
+ const {
6
+ IaCSecurityScanner,
7
+ PIIDetector,
8
+ } = require("../../../../packages/compliance/dist/index.js");
9
+
10
+ function walkDir(dir, fileList = []) {
11
+ if (!fs.existsSync(dir)) return fileList;
12
+ const files = fs.readdirSync(dir);
13
+ for (const file of files) {
14
+ if (["node_modules", ".git", "dist", "build", ".vibecheck"].includes(file))
15
+ continue;
16
+ const filePath = path.join(dir, file);
17
+ const stat = fs.statSync(filePath);
18
+ if (stat.isDirectory()) {
19
+ walkDir(filePath, fileList);
20
+ } else {
21
+ fileList.push(filePath);
22
+ }
23
+ }
24
+ return fileList;
25
+ }
26
+
27
+ async function runComplianceScan(projectPath) {
28
+ const results = {
29
+ iac: [],
30
+ pii: [],
31
+ summary: { score: 100, risk: "low" },
32
+ };
33
+
34
+ try {
35
+ // Use the IaCSecurityScanner from TypeScript package
36
+ const iacScanner = new IaCSecurityScanner();
37
+ const projectId = "local-scan"; // Required parameter for the scanner
38
+ const iacResult = await iacScanner.scan(projectPath, projectId);
39
+
40
+ // Transform IaC findings to match expected format
41
+ if (iacResult.findings) {
42
+ results.iac = iacResult.findings.map((finding) => ({
43
+ severity: finding.severity,
44
+ title: finding.title,
45
+ filePath: finding.filePath,
46
+ recommendation: finding.recommendation,
47
+ rule: finding.ruleId,
48
+ category: finding.category,
49
+ description: finding.description,
50
+ }));
51
+ }
52
+
53
+ // Use the PIIDetector from TypeScript package
54
+ const piiDetector = new PIIDetector();
55
+ const piiResult = await piiDetector.detectPII(projectPath, projectId);
56
+
57
+ // Transform PII findings to match expected format
58
+ if (piiResult.findings) {
59
+ results.pii = piiResult.findings.map((finding) => ({
60
+ severity: finding.severity || "medium",
61
+ category: finding.category,
62
+ location: {
63
+ file: finding.filePath,
64
+ line: finding.line,
65
+ column: finding.column,
66
+ },
67
+ value: finding.value,
68
+ context: finding.context,
69
+ }));
70
+ }
71
+
72
+ // Calculate score based on findings
73
+ const criticalIssues = results.iac.filter(
74
+ (f) => f.severity === "critical",
75
+ ).length;
76
+ const highIssues = results.iac.filter((f) => f.severity === "high").length;
77
+ const mediumIssues = results.iac.filter(
78
+ (f) => f.severity === "medium",
79
+ ).length;
80
+ const piiHighRisk = results.pii.filter(
81
+ (f) => f.category === "SSN" || f.category === "Credit Card",
82
+ ).length;
83
+
84
+ // Score calculation: Critical -20, High -10, Medium -5, PII High Risk -10
85
+ const deduction =
86
+ criticalIssues * 20 +
87
+ highIssues * 10 +
88
+ mediumIssues * 5 +
89
+ piiHighRisk * 10;
90
+ results.summary.score = Math.max(0, 100 - deduction);
91
+ results.summary.risk =
92
+ results.summary.score < 50
93
+ ? "high"
94
+ : results.summary.score < 80
95
+ ? "medium"
96
+ : "low";
97
+ } catch (e) {
98
+ console.error("Compliance Bridge Error:", e.message);
99
+ // Fallback to basic scanning if TypeScript classes fail
100
+ console.warn("Falling back to basic compliance scanning...");
101
+
102
+ try {
103
+ const files = walkDir(projectPath);
104
+
105
+ // Basic IaC checks
106
+ const tfFiles = files.filter((f) => f.endsWith(".tf"));
107
+ for (const f of tfFiles) {
108
+ const content = fs.readFileSync(f, "utf8");
109
+ if (
110
+ content.includes('acl = "public-read"') ||
111
+ content.includes('acl = "public-write"')
112
+ ) {
113
+ results.iac.push({
114
+ severity: "high",
115
+ title: "Public S3 bucket detected",
116
+ filePath: path.relative(projectPath, f),
117
+ recommendation: "Remove public ACL from S3 bucket",
118
+ rule: "TF-S3-001",
119
+ });
120
+ }
121
+ }
122
+
123
+ // Basic PII checks
124
+ const sourceFiles = files.filter((f) =>
125
+ /\.(js|ts|tsx|jsx|json)$/.test(f),
126
+ );
127
+ const piiPatterns = [
128
+ {
129
+ regex: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/,
130
+ category: "Credit Card",
131
+ },
132
+ { regex: /\b\d{3}[-\s]?\d{2}[-\s]?\d{4}\b/, category: "SSN" },
133
+ {
134
+ regex: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/,
135
+ category: "Email",
136
+ },
137
+ ];
138
+
139
+ for (const f of sourceFiles) {
140
+ const content = fs.readFileSync(f, "utf8");
141
+ for (const pattern of piiPatterns) {
142
+ if (pattern.regex.test(content)) {
143
+ results.pii.push({
144
+ severity: "medium",
145
+ category: pattern.category,
146
+ location: { file: path.relative(projectPath, f) },
147
+ });
148
+ }
149
+ }
150
+ }
151
+
152
+ // Update score
153
+ const issueCount = results.iac.length + results.pii.length;
154
+ results.summary.score = Math.max(0, 100 - issueCount * 5);
155
+ results.summary.risk =
156
+ issueCount > 5 ? "high" : issueCount > 0 ? "medium" : "low";
157
+ } catch (fallbackError) {
158
+ console.error("Fallback scanning also failed:", fallbackError.message);
159
+ }
160
+ }
161
+
162
+ return results;
163
+ }
164
+
165
+ module.exports = { runComplianceScan };