@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
@@ -1,722 +0,0 @@
1
- "use strict";
2
- /**
3
- * scan:vulnerabilities command (OSV Integration)
4
- *
5
- * Enterprise-grade vulnerability detection using real-time OSV API
6
- *
7
- * Features:
8
- * - Real-time OSV API queries with 24h caching
9
- * - Lockfile parsing (package-lock.json, pnpm-lock.yaml, yarn.lock)
10
- * - Multi-ecosystem support (npm, PyPI, RubyGems, Go)
11
- * - CVSS scoring and vectors with optional NVD enrichment
12
- * - Remediation path analysis
13
- * - SARIF v2.1.0 output for GitHub code scanning
14
- * - Direct vs transitive vulnerability grouping
15
- */
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.scanVulnerabilitiesOSV = scanVulnerabilitiesOSV;
18
- exports.toSarifVulnerabilitiesOSV = toSarifVulnerabilitiesOSV;
19
- exports.outputOSVVulnResults = outputOSVVulnResults;
20
- exports.registerScanVulnerabilitiesOSVCommand = registerScanVulnerabilitiesOSVCommand;
21
- const path_1 = require("path");
22
- const fs_1 = require("fs");
23
- const exit_codes_1 = require("../runtime/exit-codes");
24
- const security_1 = require('../bundles/vibecheck-security');
25
- const evidence_1 = require("./evidence");
26
- const c = {
27
- bold: (s) => `\x1b[1m${s}\x1b[0m`,
28
- dim: (s) => `\x1b[2m${s}\x1b[0m`,
29
- critical: (s) => `\x1b[35m${s}\x1b[0m`,
30
- high: (s) => `\x1b[31m${s}\x1b[0m`,
31
- medium: (s) => `\x1b[33m${s}\x1b[0m`,
32
- low: (s) => `\x1b[36m${s}\x1b[0m`,
33
- success: (s) => `\x1b[32m${s}\x1b[0m`,
34
- info: (s) => `\x1b[34m${s}\x1b[0m`,
35
- };
36
- /**
37
- * Detect ecosystems from project files
38
- */
39
- function detectEcosystems(projectPath) {
40
- const ecosystems = [];
41
- if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, 'package.json')) ||
42
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'package-lock.json')) ||
43
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'pnpm-lock.yaml')) ||
44
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'yarn.lock'))) {
45
- ecosystems.push('npm');
46
- }
47
- if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, 'requirements.txt')) ||
48
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'Pipfile')) ||
49
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'poetry.lock')) ||
50
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'pyproject.toml'))) {
51
- ecosystems.push('PyPI');
52
- }
53
- if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, 'Gemfile')) ||
54
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'Gemfile.lock'))) {
55
- ecosystems.push('RubyGems');
56
- }
57
- if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, 'go.mod')) ||
58
- (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'go.sum'))) {
59
- ecosystems.push('Go');
60
- }
61
- return ecosystems;
62
- }
63
- /**
64
- * Find line number of a dependency in package.json
65
- */
66
- function findPackageJsonLine(content, packageName) {
67
- const lines = content.split('\n');
68
- for (let i = 0; i < lines.length; i++) {
69
- if (lines[i].includes(`"${packageName}"`)) {
70
- return i + 1;
71
- }
72
- }
73
- return undefined;
74
- }
75
- /**
76
- * Parse npm dependencies from package.json and lockfiles
77
- */
78
- function parseNpmDependencies(projectPath) {
79
- const packages = [];
80
- const lockfiles = [];
81
- const packageJsonPath = (0, path_1.join)(projectPath, 'package.json');
82
- if (!(0, fs_1.existsSync)(packageJsonPath))
83
- return { packages, lockfiles };
84
- let packageJsonContent = '';
85
- try {
86
- packageJsonContent = (0, fs_1.readFileSync)(packageJsonPath, 'utf-8');
87
- const packageJson = JSON.parse(packageJsonContent);
88
- const deps = packageJson.dependencies || {};
89
- const devDeps = packageJson.devDependencies || {};
90
- for (const [name, version] of Object.entries(deps)) {
91
- const cleanVersion = String(version).replace(/^[\^~>=<]+/, '');
92
- const line = findPackageJsonLine(packageJsonContent, name);
93
- packages.push({
94
- name,
95
- version: cleanVersion,
96
- ecosystem: 'npm',
97
- isDirect: true,
98
- location: { file: 'package.json', line }
99
- });
100
- }
101
- for (const [name, version] of Object.entries(devDeps)) {
102
- const cleanVersion = String(version).replace(/^[\^~>=<]+/, '');
103
- const line = findPackageJsonLine(packageJsonContent, name);
104
- packages.push({
105
- name,
106
- version: cleanVersion,
107
- ecosystem: 'npm',
108
- isDirect: true,
109
- location: { file: 'package.json', line }
110
- });
111
- }
112
- }
113
- catch {
114
- return { packages, lockfiles };
115
- }
116
- // Parse package-lock.json
117
- const npmLockPath = (0, path_1.join)(projectPath, 'package-lock.json');
118
- if ((0, fs_1.existsSync)(npmLockPath)) {
119
- lockfiles.push('package-lock.json');
120
- try {
121
- const lockData = JSON.parse((0, fs_1.readFileSync)(npmLockPath, 'utf-8'));
122
- const lockPackages = lockData.packages || {};
123
- for (const [pkgPath, pkgInfo] of Object.entries(lockPackages)) {
124
- if (typeof pkgInfo === 'object' && pkgInfo !== null) {
125
- const info = pkgInfo;
126
- const name = info.name || pkgPath.replace(/^node_modules\//, '');
127
- const version = info.version;
128
- if (name && version && !packages.find(p => p.name === name && p.version === version)) {
129
- packages.push({
130
- name,
131
- version,
132
- ecosystem: 'npm',
133
- isDirect: false,
134
- location: { file: 'package-lock.json' }
135
- });
136
- }
137
- }
138
- }
139
- }
140
- catch {
141
- // Lockfile parsing failed
142
- }
143
- }
144
- // Parse pnpm-lock.yaml
145
- const pnpmLockPath = (0, path_1.join)(projectPath, 'pnpm-lock.yaml');
146
- if ((0, fs_1.existsSync)(pnpmLockPath)) {
147
- lockfiles.push('pnpm-lock.yaml');
148
- try {
149
- const content = (0, fs_1.readFileSync)(pnpmLockPath, 'utf-8');
150
- // Simple YAML parsing for pnpm lockfile
151
- const lines = content.split('\n');
152
- let inPackages = false;
153
- for (const line of lines) {
154
- if (line.startsWith('packages:')) {
155
- inPackages = true;
156
- continue;
157
- }
158
- if (inPackages && line.match(/^\s{2}'?\/([^@]+)@([^':]+)/)) {
159
- const match = line.match(/^\s{2}'?\/([^@]+)@([^':]+)/);
160
- if (match) {
161
- const name = match[1];
162
- const version = match[2].replace(/['"]/g, '');
163
- if (!packages.find(p => p.name === name && p.version === version)) {
164
- packages.push({
165
- name,
166
- version,
167
- ecosystem: 'npm',
168
- isDirect: false,
169
- location: { file: 'pnpm-lock.yaml' }
170
- });
171
- }
172
- }
173
- }
174
- }
175
- }
176
- catch {
177
- // Lockfile parsing failed
178
- }
179
- }
180
- // Parse yarn.lock
181
- const yarnLockPath = (0, path_1.join)(projectPath, 'yarn.lock');
182
- if ((0, fs_1.existsSync)(yarnLockPath)) {
183
- lockfiles.push('yarn.lock');
184
- try {
185
- const content = (0, fs_1.readFileSync)(yarnLockPath, 'utf-8');
186
- const lines = content.split('\n');
187
- let currentPackage = '';
188
- for (const line of lines) {
189
- // Match package header: "package@version:" or package@version:
190
- const headerMatch = line.match(/^"?([^@]+)@[^"]+:?\s*$/);
191
- if (headerMatch) {
192
- currentPackage = headerMatch[1];
193
- continue;
194
- }
195
- // Match version line
196
- if (currentPackage && line.match(/^\s+version\s+"?([^"]+)"?/)) {
197
- const versionMatch = line.match(/^\s+version\s+"?([^"]+)"?/);
198
- if (versionMatch) {
199
- const version = versionMatch[1];
200
- if (!packages.find(p => p.name === currentPackage && p.version === version)) {
201
- packages.push({
202
- name: currentPackage,
203
- version,
204
- ecosystem: 'npm',
205
- isDirect: false,
206
- location: { file: 'yarn.lock' }
207
- });
208
- }
209
- }
210
- currentPackage = '';
211
- }
212
- }
213
- }
214
- catch {
215
- // Lockfile parsing failed
216
- }
217
- }
218
- return { packages, lockfiles };
219
- }
220
- /**
221
- * Parse Python dependencies
222
- */
223
- function parsePythonDependencies(projectPath) {
224
- const packages = [];
225
- const lockfiles = [];
226
- const requirementsPath = (0, path_1.join)(projectPath, 'requirements.txt');
227
- if ((0, fs_1.existsSync)(requirementsPath)) {
228
- lockfiles.push('requirements.txt');
229
- try {
230
- const content = (0, fs_1.readFileSync)(requirementsPath, 'utf-8');
231
- const lines = content.split('\n');
232
- for (let i = 0; i < lines.length; i++) {
233
- const line = lines[i].trim();
234
- if (!line || line.startsWith('#'))
235
- continue;
236
- const match = line.match(/^([a-zA-Z0-9_-]+)(?:==|>=|<=|~=|>|<)?([\d.]+)?/);
237
- if (match) {
238
- const name = match[1];
239
- const version = match[2] || 'latest';
240
- packages.push({
241
- name,
242
- version,
243
- ecosystem: 'PyPI',
244
- isDirect: true,
245
- location: { file: 'requirements.txt', line: i + 1 }
246
- });
247
- }
248
- }
249
- }
250
- catch {
251
- // Requirements parsing failed
252
- }
253
- }
254
- // Parse Pipfile.lock
255
- const pipfileLockPath = (0, path_1.join)(projectPath, 'Pipfile.lock');
256
- if ((0, fs_1.existsSync)(pipfileLockPath)) {
257
- lockfiles.push('Pipfile.lock');
258
- try {
259
- const lockData = JSON.parse((0, fs_1.readFileSync)(pipfileLockPath, 'utf-8'));
260
- const sections = ['default', 'develop'];
261
- for (const section of sections) {
262
- const deps = lockData[section] || {};
263
- for (const [name, info] of Object.entries(deps)) {
264
- if (typeof info === 'object' && info !== null) {
265
- const pkgInfo = info;
266
- const version = pkgInfo.version?.replace(/^==/, '') || 'latest';
267
- if (!packages.find(p => p.name === name)) {
268
- packages.push({
269
- name,
270
- version,
271
- ecosystem: 'PyPI',
272
- isDirect: section === 'default',
273
- location: { file: 'Pipfile.lock' }
274
- });
275
- }
276
- }
277
- }
278
- }
279
- }
280
- catch {
281
- // Pipfile.lock parsing failed
282
- }
283
- }
284
- return { packages, lockfiles };
285
- }
286
- /**
287
- * Parse Ruby dependencies
288
- */
289
- function parseRubyDependencies(projectPath) {
290
- const packages = [];
291
- const lockfiles = [];
292
- // Parse Gemfile.lock for exact versions
293
- const gemfileLockPath = (0, path_1.join)(projectPath, 'Gemfile.lock');
294
- if ((0, fs_1.existsSync)(gemfileLockPath)) {
295
- lockfiles.push('Gemfile.lock');
296
- try {
297
- const content = (0, fs_1.readFileSync)(gemfileLockPath, 'utf-8');
298
- const lines = content.split('\n');
299
- let inSpecs = false;
300
- for (const line of lines) {
301
- if (line.trim() === 'specs:') {
302
- inSpecs = true;
303
- continue;
304
- }
305
- if (inSpecs && line.match(/^\s{4}(\S+)\s+\(([^)]+)\)/)) {
306
- const match = line.match(/^\s{4}(\S+)\s+\(([^)]+)\)/);
307
- if (match) {
308
- packages.push({
309
- name: match[1],
310
- version: match[2],
311
- ecosystem: 'RubyGems',
312
- isDirect: true,
313
- location: { file: 'Gemfile.lock' }
314
- });
315
- }
316
- }
317
- if (inSpecs && !line.startsWith(' ') && line.trim() !== '') {
318
- inSpecs = false;
319
- }
320
- }
321
- }
322
- catch {
323
- // Gemfile.lock parsing failed
324
- }
325
- }
326
- return { packages, lockfiles };
327
- }
328
- /**
329
- * Parse Go dependencies
330
- */
331
- function parseGoDependencies(projectPath) {
332
- const packages = [];
333
- const lockfiles = [];
334
- // Parse go.sum for exact versions
335
- const goSumPath = (0, path_1.join)(projectPath, 'go.sum');
336
- if ((0, fs_1.existsSync)(goSumPath)) {
337
- lockfiles.push('go.sum');
338
- try {
339
- const content = (0, fs_1.readFileSync)(goSumPath, 'utf-8');
340
- const lines = content.split('\n');
341
- const seen = new Set();
342
- for (const line of lines) {
343
- const match = line.match(/^(\S+)\s+v?([^\s/]+)/);
344
- if (match) {
345
- const name = match[1];
346
- const version = match[2].replace('/go.mod', '');
347
- const key = `${name}@${version}`;
348
- if (!seen.has(key)) {
349
- seen.add(key);
350
- packages.push({
351
- name,
352
- version,
353
- ecosystem: 'Go',
354
- isDirect: true,
355
- location: { file: 'go.sum' }
356
- });
357
- }
358
- }
359
- }
360
- }
361
- catch {
362
- // go.sum parsing failed
363
- }
364
- }
365
- return { packages, lockfiles };
366
- }
367
- /**
368
- * Scan vulnerabilities with OSV integration
369
- */
370
- async function scanVulnerabilitiesOSV(projectPath, options) {
371
- const startTime = Date.now();
372
- const ecosystems = options.ecosystem
373
- ? [options.ecosystem]
374
- : detectEcosystems(projectPath);
375
- if (ecosystems.length === 0) {
376
- return {
377
- projectPath,
378
- scanType: 'vulnerabilities',
379
- ecosystem: 'npm',
380
- packagesScanned: 0,
381
- findings: [],
382
- summary: { critical: 0, high: 0, medium: 0, low: 0 },
383
- directVulnerabilities: 0,
384
- transitiveVulnerabilities: 0,
385
- cacheHitRate: 0,
386
- scanDuration: Date.now() - startTime,
387
- nvdEnriched: false,
388
- lockfilesParsed: [],
389
- };
390
- }
391
- // Parse dependencies from all detected ecosystems
392
- let allPackages = [];
393
- let allLockfiles = [];
394
- for (const ecosystem of ecosystems) {
395
- let result;
396
- switch (ecosystem) {
397
- case 'npm':
398
- result = parseNpmDependencies(projectPath);
399
- break;
400
- case 'PyPI':
401
- result = parsePythonDependencies(projectPath);
402
- break;
403
- case 'RubyGems':
404
- result = parseRubyDependencies(projectPath);
405
- break;
406
- case 'Go':
407
- result = parseGoDependencies(projectPath);
408
- break;
409
- default:
410
- result = { packages: [], lockfiles: [] };
411
- }
412
- allPackages.push(...result.packages);
413
- allLockfiles.push(...result.lockfiles);
414
- }
415
- // Deduplicate packages
416
- const seen = new Set();
417
- allPackages = allPackages.filter(pkg => {
418
- const key = `${pkg.ecosystem}:${pkg.name}:${pkg.version}`;
419
- if (seen.has(key))
420
- return false;
421
- seen.add(key);
422
- return true;
423
- });
424
- // Configure and query OSV
425
- const dbOptions = {
426
- noCache: options.noCache,
427
- nvdEnrichment: options.nvd,
428
- cacheDir: (0, path_1.join)(projectPath, '.vibecheck', 'cache'),
429
- };
430
- const db = new security_1.VulnerabilityDatabase(dbOptions);
431
- const results = await db.checkPackages(allPackages);
432
- // Attach location info to results
433
- const resultsWithLocation = results.map((result, idx) => ({
434
- ...result,
435
- location: allPackages[idx]?.location,
436
- }));
437
- // Calculate summary
438
- const summary = {
439
- critical: 0,
440
- high: 0,
441
- medium: 0,
442
- low: 0,
443
- };
444
- let directVulnerabilities = 0;
445
- let transitiveVulnerabilities = 0;
446
- for (const result of resultsWithLocation) {
447
- if (result.isVulnerable) {
448
- for (const vuln of result.vulnerabilities) {
449
- summary[vuln.severity]++;
450
- }
451
- if (result.isDirect) {
452
- directVulnerabilities += result.vulnerabilities.length;
453
- }
454
- else {
455
- transitiveVulnerabilities += result.vulnerabilities.length;
456
- }
457
- }
458
- }
459
- const cacheStats = db.getCacheStats();
460
- // Warn if we had query failures (OSV unreachable)
461
- const queryFailures = cacheStats.queryFailures ?? 0;
462
- if (queryFailures > 0) {
463
- console.error(`\n ⚠️ WARNING: ${queryFailures} OSV queries failed. Results may be incomplete.`);
464
- console.error(` Some vulnerabilities may not have been detected due to network issues.\n`);
465
- }
466
- return {
467
- projectPath,
468
- scanType: 'vulnerabilities',
469
- ecosystem: ecosystems[0],
470
- packagesScanned: allPackages.length,
471
- findings: resultsWithLocation.filter(r => r.isVulnerable),
472
- summary,
473
- directVulnerabilities,
474
- transitiveVulnerabilities,
475
- cacheHitRate: cacheStats.hitRate,
476
- scanDuration: Date.now() - startTime,
477
- nvdEnriched: options.nvd || false,
478
- lockfilesParsed: [...new Set(allLockfiles)],
479
- };
480
- }
481
- /**
482
- * Generate SARIF v2.1.0 output
483
- */
484
- function toSarifVulnerabilitiesOSV(results) {
485
- const version = '1.0.0';
486
- const ruleMap = new Map();
487
- // Build rules from unique vulnerability IDs
488
- for (const finding of results.findings) {
489
- for (const vuln of finding.vulnerabilities) {
490
- if (!ruleMap.has(vuln.id)) {
491
- const cveId = vuln.aliases?.find(a => a.startsWith('CVE-'));
492
- ruleMap.set(vuln.id, {
493
- id: vuln.id,
494
- name: vuln.title.substring(0, 100),
495
- shortDescription: { text: vuln.title },
496
- fullDescription: { text: vuln.description || vuln.title },
497
- helpUri: vuln.references?.[0] || `https://osv.dev/vulnerability/${vuln.id}`,
498
- help: {
499
- text: `Vulnerability ${vuln.id} affects this package.\n\n` +
500
- `Severity: ${vuln.severity.toUpperCase()}\n` +
501
- (vuln.cvssScore ? `CVSS Score: ${vuln.cvssScore}\n` : '') +
502
- (cveId ? `CVE: ${cveId}\n` : '') +
503
- `\nReferences:\n${vuln.references?.map(r => `- ${r}`).join('\n') || 'None'}`,
504
- markdown: `## ${vuln.title}\n\n` +
505
- `**Severity:** ${vuln.severity.toUpperCase()}\n\n` +
506
- (vuln.cvssScore ? `**CVSS Score:** ${vuln.cvssScore}\n\n` : '') +
507
- (vuln.cvssVector ? `**CVSS Vector:** \`${vuln.cvssVector}\`\n\n` : '') +
508
- (cveId ? `**CVE:** [${cveId}](https://nvd.nist.gov/vuln/detail/${cveId})\n\n` : '') +
509
- `### References\n${vuln.references?.map(r => `- [${r}](${r})`).join('\n') || 'None'}`,
510
- },
511
- defaultConfiguration: {
512
- level: vuln.severity === 'critical' || vuln.severity === 'high' ? 'error' :
513
- vuln.severity === 'medium' ? 'warning' : 'note',
514
- },
515
- properties: {
516
- 'security-severity': vuln.cvssScore?.toString() ||
517
- (vuln.severity === 'critical' ? '9.0' :
518
- vuln.severity === 'high' ? '7.0' :
519
- vuln.severity === 'medium' ? '4.0' : '2.0'),
520
- tags: ['security', 'vulnerability', 'dependency', vuln.source],
521
- precision: 'high',
522
- },
523
- });
524
- }
525
- }
526
- }
527
- const sarifResults = [];
528
- for (const finding of results.findings) {
529
- for (const vuln of finding.vulnerabilities) {
530
- const location = finding.location || { file: 'package.json', line: 1 };
531
- const remediationText = finding.remediationPath
532
- ? `${finding.remediationPath.description}${finding.remediationPath.breakingChange ? ' (Breaking change)' : ''}`
533
- : `Upgrade to ${finding.recommendedVersion || 'latest'}`;
534
- sarifResults.push({
535
- ruleId: vuln.id,
536
- ruleIndex: Array.from(ruleMap.keys()).indexOf(vuln.id),
537
- level: vuln.severity === 'critical' || vuln.severity === 'high' ? 'error' :
538
- vuln.severity === 'medium' ? 'warning' : 'note',
539
- message: {
540
- text: `${vuln.title} in ${finding.package}@${finding.version}. ${remediationText}`,
541
- },
542
- locations: [{
543
- physicalLocation: {
544
- artifactLocation: {
545
- uri: location.file,
546
- uriBaseId: '%SRCROOT%',
547
- },
548
- region: {
549
- startLine: location.line || 1,
550
- startColumn: 1,
551
- },
552
- },
553
- }],
554
- fingerprints: {
555
- 'vibecheck/v1': `${vuln.id}:${finding.package}:${finding.version}`,
556
- },
557
- partialFingerprints: {
558
- 'primaryLocationLineHash': `${finding.package}:${finding.version}:${vuln.id}`,
559
- },
560
- properties: {
561
- package: finding.package,
562
- version: finding.version,
563
- ecosystem: results.ecosystem,
564
- isDirect: finding.isDirect,
565
- severity: vuln.severity,
566
- cvssScore: vuln.cvssScore,
567
- cvssVector: vuln.cvssVector,
568
- cwe: vuln.cwe,
569
- aliases: vuln.aliases,
570
- source: vuln.source,
571
- affectedVersions: vuln.affectedVersions,
572
- patchedVersions: vuln.patchedVersions,
573
- references: vuln.references,
574
- remediationPath: finding.remediationPath,
575
- recommendedVersion: finding.recommendedVersion,
576
- },
577
- });
578
- }
579
- }
580
- return {
581
- $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json',
582
- version: '2.1.0',
583
- runs: [{
584
- tool: {
585
- driver: {
586
- name: 'vibecheck-cli-tool',
587
- version,
588
- informationUri: 'https://vibecheckai.dev',
589
- rules: Array.from(ruleMap.values()),
590
- },
591
- },
592
- results: sarifResults,
593
- invocations: [{
594
- executionSuccessful: true,
595
- commandLine: `vibecheck scan:vulnerabilities --path ${results.projectPath}`,
596
- startTimeUtc: new Date().toISOString(),
597
- workingDirectory: { uri: results.projectPath.replace(/\\/g, '/') },
598
- }],
599
- }],
600
- };
601
- }
602
- /**
603
- * Output OSV vulnerability results
604
- */
605
- function outputOSVVulnResults(results, options) {
606
- if (options.format === 'json') {
607
- console.log(JSON.stringify(results, null, 2));
608
- return;
609
- }
610
- if (options.format === 'sarif') {
611
- const sarif = toSarifVulnerabilitiesOSV(results);
612
- console.log(JSON.stringify(sarif, null, 2));
613
- return;
614
- }
615
- console.log(`\n ${c.info('Ecosystem:')} ${results.ecosystem}`);
616
- console.log(` ${c.info('Packages scanned:')} ${results.packagesScanned}`);
617
- console.log(` ${c.info('Lockfiles parsed:')} ${results.lockfilesParsed.join(', ') || 'none'}`);
618
- console.log(` ${c.info('Cache hit rate:')} ${(results.cacheHitRate * 100).toFixed(1)}%`);
619
- console.log(` ${c.info('NVD enrichment:')} ${results.nvdEnriched ? 'enabled' : 'disabled'}`);
620
- console.log(` ${c.info('Scan duration:')} ${(results.scanDuration / 1000).toFixed(2)}s\n`);
621
- const { summary } = results;
622
- const total = summary.critical + summary.high + summary.medium + summary.low;
623
- if (total === 0) {
624
- console.log(` ${c.success('✓')} ${c.bold('No vulnerabilities found!')}\n`);
625
- return;
626
- }
627
- console.log(` ${c.critical('CRITICAL')} ${summary.critical}`);
628
- console.log(` ${c.high('HIGH')} ${summary.high}`);
629
- console.log(` ${c.medium('MEDIUM')} ${summary.medium}`);
630
- console.log(` ${c.low('LOW')} ${summary.low}\n`);
631
- console.log(` ${c.info('Direct:')} ${results.directVulnerabilities} | ${c.info('Transitive:')} ${results.transitiveVulnerabilities}\n`);
632
- // Group by direct vs transitive
633
- const directFindings = results.findings.filter(f => f.isDirect);
634
- const transitiveFindings = results.findings.filter(f => !f.isDirect);
635
- if (directFindings.length > 0) {
636
- console.log(`${c.bold(' DIRECT DEPENDENCIES:')}\n`);
637
- outputFindingsList(directFindings);
638
- }
639
- if (transitiveFindings.length > 0) {
640
- console.log(`\n${c.bold(' TRANSITIVE DEPENDENCIES:')}\n`);
641
- outputFindingsList(transitiveFindings);
642
- }
643
- }
644
- function outputFindingsList(findings) {
645
- for (const finding of findings) {
646
- for (const vuln of finding.vulnerabilities) {
647
- const severityLabel = vuln.severity === 'critical' ? c.critical('CRITICAL') :
648
- vuln.severity === 'high' ? c.high('HIGH') :
649
- vuln.severity === 'medium' ? c.medium('MEDIUM') :
650
- c.low('LOW');
651
- console.log(` ${severityLabel} ${finding.package}@${finding.version}`);
652
- console.log(` ${c.dim('├─')} ${c.info('ID:')} ${vuln.id}`);
653
- console.log(` ${c.dim('├─')} ${c.info('Summary:')} ${vuln.title}`);
654
- if (vuln.cvssScore != null && typeof vuln.cvssScore === 'number') {
655
- console.log(` ${c.dim('├─')} ${c.info('CVSS:')} ${vuln.cvssScore.toFixed(1)}${vuln.cvssVector ? ` (${vuln.cvssVector.substring(0, 30)}...)` : ''}`);
656
- }
657
- if (finding.remediationPath) {
658
- const remed = finding.remediationPath;
659
- const breakingLabel = remed.breakingChange ? c.medium(' [BREAKING]') : c.success(' [NON-BREAKING]');
660
- console.log(` ${c.dim('└─')} ${c.info('Fix:')} ${remed.description}${breakingLabel}\n`);
661
- }
662
- else {
663
- console.log(` ${c.dim('└─')} ${c.info('Fix:')} Upgrade to ${finding.recommendedVersion || 'latest'}\n`);
664
- }
665
- }
666
- }
667
- }
668
- /**
669
- * Register scan:vulnerabilities command with OSV integration
670
- */
671
- function registerScanVulnerabilitiesOSVCommand(program, requireAuth, printLogo) {
672
- program
673
- .command('scan:vulnerabilities')
674
- .description('Scan dependencies for known vulnerabilities using OSV')
675
- .option('-p, --path <path>', 'Project path to scan', '.')
676
- .option('-f, --format <format>', 'Output format: table, json, sarif', 'table')
677
- .option('-o, --output <file>', 'Output file path')
678
- .option('--no-cache', 'Bypass cache and fetch fresh data from OSV')
679
- .option('--nvd', 'Enable NVD enrichment for CVSS scores (slower)')
680
- .option('--fail-on-critical', 'Exit with error if critical vulnerabilities found', false)
681
- .option('--fail-on-high', 'Exit with error if high+ vulnerabilities found', false)
682
- .option('--evidence', 'Generate signed evidence pack', false)
683
- .option('--ecosystem <ecosystem>', 'Filter by ecosystem: npm, PyPI, RubyGems, Go')
684
- .action(async (opts) => {
685
- requireAuth();
686
- printLogo();
687
- console.log(`\n${c.bold('🛡️ VULNERABILITY SCAN (OSV Integration)')}\n`);
688
- const projectPath = (0, path_1.resolve)(opts.path);
689
- if (opts.noCache) {
690
- console.log(` ${c.dim('Cache:')} disabled (--no-cache)\n`);
691
- }
692
- if (opts.nvd) {
693
- console.log(` ${c.dim('NVD enrichment:')} enabled\n`);
694
- }
695
- const results = await scanVulnerabilitiesOSV(projectPath, {
696
- noCache: opts.noCache,
697
- nvd: opts.nvd,
698
- ecosystem: opts.ecosystem,
699
- });
700
- console.log(`${c.success('✓')} Vulnerability scan complete`);
701
- outputOSVVulnResults(results, opts);
702
- // Write output file if specified
703
- if (opts.output) {
704
- const { writeFileSync } = require('fs');
705
- const output = opts.format === 'sarif'
706
- ? toSarifVulnerabilitiesOSV(results)
707
- : results;
708
- writeFileSync(opts.output, JSON.stringify(output, null, 2));
709
- console.log(`\n ${c.success('✓')} Report written to ${opts.output}`);
710
- }
711
- if (opts.evidence) {
712
- await (0, evidence_1.generateEvidence)('vulnerabilities', results, projectPath);
713
- }
714
- if (opts.failOnCritical && results.summary.critical > 0) {
715
- (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.POLICY_FAIL, `${results.summary.critical} critical vulnerabilities found`);
716
- }
717
- if (opts.failOnHigh && (results.summary.critical + results.summary.high) > 0) {
718
- (0, exit_codes_1.exitWith)(exit_codes_1.ExitCode.POLICY_FAIL, `${results.summary.critical + results.summary.high} high+ vulnerabilities found`);
719
- }
720
- });
721
- }
722
- //# sourceMappingURL=scan-vulnerabilities-osv.js.map