@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,513 @@
1
+ /**
2
+ * Server-Authoritative Usage Enforcement (CLI Client)
3
+ *
4
+ * This module handles server-side usage checks and enforcement.
5
+ * Local ~/.vibecheck/usage.json is ONLY a cache - never authoritative.
6
+ *
7
+ * Flow:
8
+ * 1. Check server for usage limits before any quota-limited action
9
+ * 2. If online: server is source of truth
10
+ * 3. If offline: allow 1 action max, require sync next time
11
+ * 4. Cache signed tokens locally for optimization (short TTL)
12
+ */
13
+
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+ const os = require('os');
17
+ const crypto = require('crypto');
18
+
19
+ // ============================================================================
20
+ // CONFIGURATION
21
+ // ============================================================================
22
+
23
+ const CONFIG_DIR = path.join(os.homedir(), '.vibecheck');
24
+ const CACHE_FILE = path.join(CONFIG_DIR, 'usage-cache.json');
25
+ const OFFLINE_FILE = path.join(CONFIG_DIR, 'offline-queue.json');
26
+
27
+ const API_BASE_URL = process.env.VIBECHECK_API_URL || 'https://api.vibecheckai.dev';
28
+ const USAGE_API_PATH = '/api/usage/v2';
29
+
30
+ const OFFLINE_ALLOWANCE = 1; // Max offline actions before sync required
31
+ const TOKEN_GRACE_PERIOD_MS = 30000; // 30 seconds grace period for token expiry
32
+
33
+ // ============================================================================
34
+ // HELPERS
35
+ // ============================================================================
36
+
37
+ async function ensureConfigDir() {
38
+ try {
39
+ await fs.promises.mkdir(CONFIG_DIR, { recursive: true });
40
+ } catch {
41
+ // Directory exists
42
+ }
43
+ }
44
+
45
+ function getAuthToken() {
46
+ // Check environment variable first
47
+ if (process.env.VIBECHECK_API_KEY) {
48
+ return process.env.VIBECHECK_API_KEY;
49
+ }
50
+
51
+ // Check license file
52
+ try {
53
+ const licensePath = path.join(CONFIG_DIR, 'license.json');
54
+ const license = JSON.parse(fs.readFileSync(licensePath, 'utf8'));
55
+ return license.apiKey || license.token;
56
+ } catch {
57
+ return null;
58
+ }
59
+ }
60
+
61
+ function getMachineId() {
62
+ // Generate a stable machine identifier
63
+ const hostname = os.hostname();
64
+ const platform = os.platform();
65
+ const arch = os.arch();
66
+ const hash = crypto.createHash('sha256');
67
+ hash.update(`${hostname}-${platform}-${arch}`);
68
+ return hash.digest('hex').substring(0, 16);
69
+ }
70
+
71
+ // ============================================================================
72
+ // CACHE MANAGEMENT
73
+ // ============================================================================
74
+
75
+ async function readCache() {
76
+ try {
77
+ const content = await fs.promises.readFile(CACHE_FILE, 'utf8');
78
+ return JSON.parse(content);
79
+ } catch {
80
+ return null;
81
+ }
82
+ }
83
+
84
+ async function writeCache(data) {
85
+ await ensureConfigDir();
86
+ await fs.promises.writeFile(CACHE_FILE, JSON.stringify(data, null, 2));
87
+ }
88
+
89
+ async function readOfflineQueue() {
90
+ try {
91
+ const content = await fs.promises.readFile(OFFLINE_FILE, 'utf8');
92
+ return JSON.parse(content);
93
+ } catch {
94
+ return { queue: [], lastSync: null };
95
+ }
96
+ }
97
+
98
+ async function writeOfflineQueue(data) {
99
+ await ensureConfigDir();
100
+ await fs.promises.writeFile(OFFLINE_FILE, JSON.stringify(data, null, 2));
101
+ }
102
+
103
+ // ============================================================================
104
+ // API CLIENT
105
+ // ============================================================================
106
+
107
+ async function apiRequest(endpoint, method = 'GET', body = null) {
108
+ const token = getAuthToken();
109
+ if (!token) {
110
+ return { success: false, error: 'No API key configured', offline: true };
111
+ }
112
+
113
+ const url = `${API_BASE_URL}${USAGE_API_PATH}${endpoint}`;
114
+ const options = {
115
+ method,
116
+ headers: {
117
+ 'Authorization': `Bearer ${token}`,
118
+ 'Content-Type': 'application/json',
119
+ 'X-Machine-Id': getMachineId(),
120
+ },
121
+ };
122
+
123
+ if (body) {
124
+ options.body = JSON.stringify(body);
125
+ }
126
+
127
+ try {
128
+ const response = await fetch(url, options);
129
+ const data = await response.json();
130
+
131
+ if (!response.ok) {
132
+ return {
133
+ success: false,
134
+ error: data.error || `HTTP ${response.status}`,
135
+ code: data.code,
136
+ offline: false,
137
+ };
138
+ }
139
+
140
+ return { success: true, ...data, offline: false };
141
+ } catch (error) {
142
+ // Network error - we're offline
143
+ return {
144
+ success: false,
145
+ error: error.message,
146
+ offline: true,
147
+ };
148
+ }
149
+ }
150
+
151
+ // ============================================================================
152
+ // SERVER-AUTHORITATIVE USAGE ENFORCEMENT
153
+ // ============================================================================
154
+
155
+ class ServerUsageEnforcement {
156
+ /**
157
+ * Check if an action is allowed (server-authoritative)
158
+ * This does NOT increment usage - use recordUsage() after action completes
159
+ */
160
+ async checkUsage(actionType) {
161
+ // Try server first
162
+ const result = await apiRequest('/check', 'POST', { action: actionType });
163
+
164
+ if (result.offline) {
165
+ return this.handleOfflineCheck(actionType);
166
+ }
167
+
168
+ if (!result.success) {
169
+ // Server error - check cache as fallback
170
+ return this.checkCachedUsage(actionType, result.error);
171
+ }
172
+
173
+ // Update cache with server response
174
+ await this.updateCacheFromServer(result);
175
+
176
+ return {
177
+ allowed: result.allowed,
178
+ current: result.current,
179
+ limit: result.limit,
180
+ remaining: result.remaining,
181
+ reason: result.reason,
182
+ source: 'server',
183
+ };
184
+ }
185
+
186
+ /**
187
+ * Record usage after action completes (server-authoritative)
188
+ * This increments the server counter and returns updated usage
189
+ */
190
+ async recordUsage(actionType, count = 1) {
191
+ // Try server first
192
+ const result = await apiRequest('/increment', 'POST', { action: actionType, count });
193
+
194
+ if (result.offline) {
195
+ return this.handleOfflineRecord(actionType, count);
196
+ }
197
+
198
+ if (!result.success) {
199
+ // Server error - queue for later sync
200
+ await this.queueOfflineAction(actionType, count);
201
+ return {
202
+ success: false,
203
+ error: result.error,
204
+ queued: true,
205
+ };
206
+ }
207
+
208
+ // Update cache with signed token
209
+ if (result.signedToken) {
210
+ await this.updateCacheWithToken(result.signedToken, result);
211
+ }
212
+
213
+ return {
214
+ success: true,
215
+ allowed: result.allowed,
216
+ current: result.current,
217
+ limit: result.limit,
218
+ remaining: result.remaining,
219
+ source: 'server',
220
+ };
221
+ }
222
+
223
+ /**
224
+ * Enforce usage limit (throws if not allowed)
225
+ */
226
+ async enforceLimit(actionType) {
227
+ const check = await this.checkUsage(actionType);
228
+
229
+ if (!check.allowed) {
230
+ const error = new Error(check.reason || `Monthly ${actionType} limit reached`);
231
+ error.code = 'LIMIT_EXCEEDED';
232
+ error.usage = check.current;
233
+ error.limit = check.limit;
234
+ error.upgradePrompt = this.formatUpgradePrompt(actionType, check);
235
+ throw error;
236
+ }
237
+
238
+ return check;
239
+ }
240
+
241
+ /**
242
+ * Get full usage summary from server
243
+ */
244
+ async getUsageSummary() {
245
+ const result = await apiRequest('/summary', 'GET');
246
+
247
+ if (result.offline || !result.success) {
248
+ // Return cached data if available
249
+ const cache = await readCache();
250
+ if (cache?.usage) {
251
+ return { ...cache, source: 'cache' };
252
+ }
253
+ return { error: result.error || 'Unable to fetch usage', source: 'none' };
254
+ }
255
+
256
+ // Update cache
257
+ await this.updateCacheFromServer(result);
258
+
259
+ return { ...result, source: 'server' };
260
+ }
261
+
262
+ /**
263
+ * Sync any pending offline usage to server
264
+ */
265
+ async syncOfflineUsage() {
266
+ const offline = await readOfflineQueue();
267
+
268
+ if (!offline.queue || offline.queue.length === 0) {
269
+ return { synced: 0, pending: 0 };
270
+ }
271
+
272
+ const result = await apiRequest('/sync', 'POST');
273
+
274
+ if (result.offline || !result.success) {
275
+ return {
276
+ synced: 0,
277
+ pending: offline.queue.length,
278
+ error: result.error || 'Unable to sync',
279
+ };
280
+ }
281
+
282
+ // Clear local queue on successful sync
283
+ await writeOfflineQueue({ queue: [], lastSync: new Date().toISOString() });
284
+
285
+ // Update cache with new token
286
+ if (result.signedToken) {
287
+ await this.updateCacheWithToken(result.signedToken, result);
288
+ }
289
+
290
+ return {
291
+ synced: result.synced || offline.queue.length,
292
+ pending: 0,
293
+ usage: result.usage,
294
+ };
295
+ }
296
+
297
+ /**
298
+ * Check if sync is required before any action
299
+ */
300
+ async requiresSync() {
301
+ const offline = await readOfflineQueue();
302
+ return offline.queue && offline.queue.length >= OFFLINE_ALLOWANCE;
303
+ }
304
+
305
+ // ============================================================================
306
+ // OFFLINE HANDLING
307
+ // ============================================================================
308
+
309
+ async handleOfflineCheck(actionType) {
310
+ const offline = await readOfflineQueue();
311
+ const cache = await readCache();
312
+
313
+ // Check if we've exceeded offline allowance
314
+ if (offline.queue && offline.queue.length >= OFFLINE_ALLOWANCE) {
315
+ return {
316
+ allowed: false,
317
+ reason: 'Offline limit reached. Please connect to sync usage.',
318
+ requiresSync: true,
319
+ source: 'offline',
320
+ };
321
+ }
322
+
323
+ // Check cached limits if available
324
+ if (cache?.signedToken && cache?.usage) {
325
+ const tokenExpiry = new Date(cache.signedToken.expiresAt);
326
+ const now = new Date();
327
+
328
+ // Allow some grace period for cached data
329
+ if (tokenExpiry.getTime() + TOKEN_GRACE_PERIOD_MS > now.getTime()) {
330
+ const actionMap = {
331
+ scan: 'scan',
332
+ reality: 'reality',
333
+ agent: 'agent',
334
+ gate: 'gate',
335
+ fix: 'fix',
336
+ };
337
+ const usageKey = actionMap[actionType];
338
+ const current = cache.usage[usageKey] || 0;
339
+ const limit = cache.limits?.[usageKey === 'scan' ? 'scans' : usageKey] || 0;
340
+
341
+ if (limit === -1 || current < limit) {
342
+ return {
343
+ allowed: true,
344
+ current,
345
+ limit,
346
+ remaining: limit === -1 ? -1 : limit - current,
347
+ source: 'cache',
348
+ warning: 'Using cached data (offline)',
349
+ };
350
+ }
351
+ }
352
+ }
353
+
354
+ // Allow one offline action
355
+ return {
356
+ allowed: true,
357
+ source: 'offline',
358
+ warning: 'Offline mode - action will be synced when online',
359
+ offlineAllowance: OFFLINE_ALLOWANCE - (offline.queue?.length || 0),
360
+ };
361
+ }
362
+
363
+ async handleOfflineRecord(actionType, count) {
364
+ const queued = await this.queueOfflineAction(actionType, count);
365
+
366
+ if (!queued) {
367
+ return {
368
+ success: false,
369
+ error: 'Offline limit reached. Please connect to sync usage.',
370
+ requiresSync: true,
371
+ };
372
+ }
373
+
374
+ return {
375
+ success: true,
376
+ queued: true,
377
+ source: 'offline',
378
+ warning: 'Action queued for sync',
379
+ };
380
+ }
381
+
382
+ async queueOfflineAction(actionType, count = 1) {
383
+ const offline = await readOfflineQueue();
384
+
385
+ if (offline.queue && offline.queue.length >= OFFLINE_ALLOWANCE) {
386
+ return false;
387
+ }
388
+
389
+ offline.queue = offline.queue || [];
390
+ offline.queue.push({
391
+ action: actionType,
392
+ count,
393
+ timestamp: new Date().toISOString(),
394
+ machineId: getMachineId(),
395
+ });
396
+
397
+ await writeOfflineQueue(offline);
398
+ return true;
399
+ }
400
+
401
+ // ============================================================================
402
+ // CACHE MANAGEMENT
403
+ // ============================================================================
404
+
405
+ async checkCachedUsage(actionType, serverError) {
406
+ const cache = await readCache();
407
+
408
+ if (!cache?.signedToken || !cache?.usage) {
409
+ return {
410
+ allowed: false,
411
+ error: serverError || 'Unable to verify usage',
412
+ source: 'none',
413
+ };
414
+ }
415
+
416
+ // Check token expiry
417
+ const tokenExpiry = new Date(cache.signedToken.expiresAt);
418
+ if (tokenExpiry < new Date()) {
419
+ return {
420
+ allowed: false,
421
+ error: 'Cached usage expired. Please try again.',
422
+ source: 'cache_expired',
423
+ };
424
+ }
425
+
426
+ const actionMap = {
427
+ scan: 'scan',
428
+ reality: 'reality',
429
+ agent: 'agent',
430
+ gate: 'gate',
431
+ fix: 'fix',
432
+ };
433
+ const usageKey = actionMap[actionType];
434
+ const current = cache.usage[usageKey] || 0;
435
+ const limitKey = usageKey === 'scan' ? 'scans' : usageKey;
436
+ const limit = cache.limits?.[limitKey] || 0;
437
+
438
+ const allowed = limit === -1 || current < limit;
439
+
440
+ return {
441
+ allowed,
442
+ current,
443
+ limit,
444
+ remaining: limit === -1 ? -1 : Math.max(0, limit - current),
445
+ source: 'cache',
446
+ warning: 'Using cached data due to server error',
447
+ };
448
+ }
449
+
450
+ async updateCacheFromServer(serverResponse) {
451
+ const cache = await readCache() || {};
452
+
453
+ cache.usage = serverResponse.usage;
454
+ cache.limits = serverResponse.limits;
455
+ cache.tier = serverResponse.tier;
456
+ cache.period = serverResponse.period;
457
+ cache.lastUpdated = new Date().toISOString();
458
+
459
+ if (serverResponse.signedToken) {
460
+ cache.signedToken = serverResponse.signedToken;
461
+ }
462
+
463
+ await writeCache(cache);
464
+ }
465
+
466
+ async updateCacheWithToken(signedToken, serverResponse) {
467
+ const cache = await readCache() || {};
468
+
469
+ cache.signedToken = signedToken;
470
+ cache.usage = serverResponse.usage || cache.usage;
471
+ cache.limits = serverResponse.limits || cache.limits;
472
+ cache.lastUpdated = new Date().toISOString();
473
+
474
+ await writeCache(cache);
475
+ }
476
+
477
+ // ============================================================================
478
+ // UI HELPERS
479
+ // ============================================================================
480
+
481
+ formatUpgradePrompt(actionType, check) {
482
+ const lines = [
483
+ '',
484
+ '\x1b[31m╭─────────────────────────────────────────────────────────────╮\x1b[0m',
485
+ '\x1b[31m│\x1b[0m \x1b[1m⚠️ MONTHLY LIMIT REACHED\x1b[0m \x1b[31m│\x1b[0m',
486
+ '\x1b[31m├─────────────────────────────────────────────────────────────┤\x1b[0m',
487
+ `\x1b[31m│\x1b[0m ${actionType}: \x1b[33m${check.current}/${check.limit}\x1b[0m used this month`.padEnd(72) + '\x1b[31m│\x1b[0m',
488
+ '\x1b[31m├─────────────────────────────────────────────────────────────┤\x1b[0m',
489
+ '\x1b[31m│\x1b[0m \x1b[36m→ vibecheck upgrade\x1b[0m \x1b[31m│\x1b[0m',
490
+ '\x1b[31m│\x1b[0m \x1b[36m→ https://vibecheckai.dev/pricing\x1b[0m \x1b[31m│\x1b[0m',
491
+ '\x1b[31m╰─────────────────────────────────────────────────────────────╯\x1b[0m',
492
+ '',
493
+ ];
494
+ return lines.join('\n');
495
+ }
496
+ }
497
+
498
+ // ============================================================================
499
+ // SINGLETON EXPORT
500
+ // ============================================================================
501
+
502
+ const serverUsage = new ServerUsageEnforcement();
503
+
504
+ module.exports = {
505
+ serverUsage,
506
+ checkUsage: (actionType) => serverUsage.checkUsage(actionType),
507
+ recordUsage: (actionType, count) => serverUsage.recordUsage(actionType, count),
508
+ enforceLimit: (actionType) => serverUsage.enforceLimit(actionType),
509
+ getUsageSummary: () => serverUsage.getUsageSummary(),
510
+ syncOfflineUsage: () => serverUsage.syncOfflineUsage(),
511
+ requiresSync: () => serverUsage.requiresSync(),
512
+ OFFLINE_ALLOWANCE,
513
+ };