@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,391 @@
1
+ /**
2
+ * Audit Bridge - CLI Integration
3
+ *
4
+ * Provides a CommonJS wrapper for the audit trail functionality.
5
+ * Used by CLI runners to emit audit events.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ const path = require("path");
11
+ const fs = require("fs");
12
+ const crypto = require("crypto");
13
+
14
+ // Configuration
15
+ const AUDIT_DIR = ".vibecheck/audit";
16
+ const AUDIT_FILE = "audit.log.jsonl";
17
+ const GENESIS_HASH = "0".repeat(64);
18
+
19
+ // Tier from environment or default
20
+ function getCurrentTier() {
21
+ return process.env.VIBECHECK_TIER || "free";
22
+ }
23
+
24
+ // Get current actor from environment
25
+ function getCurrentActor() {
26
+ const userId = process.env.VIBECHECK_USER_ID || process.env.USER || process.env.USERNAME || "anonymous";
27
+ const userName = process.env.VIBECHECK_USER_NAME || process.env.USERNAME;
28
+ const userEmail = process.env.VIBECHECK_USER_EMAIL;
29
+
30
+ // Detect CI environment
31
+ if (process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI) {
32
+ return {
33
+ id: process.env.GITHUB_ACTOR || process.env.GITLAB_USER_LOGIN || "ci-system",
34
+ type: "ci",
35
+ name: process.env.GITHUB_ACTOR || process.env.GITLAB_USER_NAME,
36
+ };
37
+ }
38
+
39
+ return {
40
+ id: userId,
41
+ type: "user",
42
+ name: userName,
43
+ email: userEmail,
44
+ };
45
+ }
46
+
47
+ // Redaction patterns for sensitive data
48
+ const REDACTION_PATTERNS = [
49
+ /(?:api[_-]?key|apikey|token|secret|password|pwd|auth)[=:]\s*['"]?([a-zA-Z0-9_\-]{16,})['"]?/gi,
50
+ /eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g,
51
+ /(?:AKIA|ABIA|ACCA|ASIA)[A-Z0-9]{16}/g,
52
+ /(?:sk_live_|sk_test_|pk_live_|pk_test_)[a-zA-Z0-9]+/g,
53
+ ];
54
+
55
+ function redactSensitive(input) {
56
+ if (typeof input !== "string") return input;
57
+ let result = input;
58
+ for (const pattern of REDACTION_PATTERNS) {
59
+ result = result.replace(pattern, "[REDACTED]");
60
+ }
61
+ return result;
62
+ }
63
+
64
+ function redactMetadata(metadata, tier) {
65
+ if (!metadata) return undefined;
66
+
67
+ // Compliance+ gets full metadata (still redact secrets)
68
+ if (["compliance", "enterprise", "unlimited"].includes(tier)) {
69
+ return redactObject(metadata);
70
+ }
71
+
72
+ // Pro gets limited metadata
73
+ if (tier === "pro") {
74
+ return {
75
+ command: metadata.command,
76
+ score: metadata.score,
77
+ grade: metadata.grade,
78
+ issueCount: metadata.issueCount,
79
+ fixCount: metadata.fixCount,
80
+ durationMs: metadata.durationMs,
81
+ errorCode: metadata.errorCode,
82
+ };
83
+ }
84
+
85
+ // Free/Starter get minimal
86
+ return {
87
+ score: metadata.score,
88
+ grade: metadata.grade,
89
+ };
90
+ }
91
+
92
+ function redactObject(obj) {
93
+ if (!obj || typeof obj !== "object") return obj;
94
+ const result = {};
95
+ for (const [key, value] of Object.entries(obj)) {
96
+ if (typeof value === "string") {
97
+ result[key] = redactSensitive(value);
98
+ } else if (Array.isArray(value)) {
99
+ result[key] = value.map((v) => (typeof v === "string" ? redactSensitive(v) : v));
100
+ } else if (typeof value === "object" && value !== null) {
101
+ result[key] = redactObject(value);
102
+ } else {
103
+ result[key] = value;
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+
109
+ // Compute SHA-256 hash
110
+ function computeHash(event) {
111
+ const payload = JSON.stringify({
112
+ id: event.id,
113
+ timestamp: event.timestamp,
114
+ actor: event.actor,
115
+ surface: event.surface,
116
+ action: event.action,
117
+ category: event.category,
118
+ target: event.target,
119
+ tier: event.tier,
120
+ result: event.result,
121
+ metadata: event.metadata,
122
+ prevHash: event.prevHash,
123
+ version: event.version,
124
+ });
125
+ return crypto.createHash("sha256").update(payload).digest("hex");
126
+ }
127
+
128
+ // Get audit file path
129
+ function getAuditFilePath(basePath = process.cwd()) {
130
+ return path.join(basePath, AUDIT_DIR, AUDIT_FILE);
131
+ }
132
+
133
+ // Ensure audit directory exists
134
+ function ensureAuditDir(basePath = process.cwd()) {
135
+ const dir = path.join(basePath, AUDIT_DIR);
136
+ if (!fs.existsSync(dir)) {
137
+ fs.mkdirSync(dir, { recursive: true });
138
+ }
139
+ }
140
+
141
+ // Get last hash from audit log
142
+ function getLastHash(basePath = process.cwd()) {
143
+ const filePath = getAuditFilePath(basePath);
144
+ if (!fs.existsSync(filePath)) {
145
+ return GENESIS_HASH;
146
+ }
147
+
148
+ const content = fs.readFileSync(filePath, "utf8");
149
+ const lines = content.split("\n").filter((line) => line.trim());
150
+ if (lines.length === 0) {
151
+ return GENESIS_HASH;
152
+ }
153
+
154
+ try {
155
+ const lastEvent = JSON.parse(lines[lines.length - 1]);
156
+ return lastEvent.hash || GENESIS_HASH;
157
+ } catch {
158
+ return GENESIS_HASH;
159
+ }
160
+ }
161
+
162
+ // Create audit event
163
+ function createEvent(input, prevHash) {
164
+ const tier = getCurrentTier();
165
+ const id = crypto.randomUUID();
166
+ const timestamp = new Date().toISOString();
167
+
168
+ const eventWithoutHash = {
169
+ id,
170
+ timestamp,
171
+ actor: input.actor || getCurrentActor(),
172
+ surface: input.surface,
173
+ action: input.action,
174
+ category: input.category,
175
+ target: input.target,
176
+ tier,
177
+ result: input.result,
178
+ metadata: redactMetadata(input.metadata, tier),
179
+ prevHash,
180
+ version: 1,
181
+ };
182
+
183
+ const hash = computeHash(eventWithoutHash);
184
+
185
+ return {
186
+ ...eventWithoutHash,
187
+ hash,
188
+ };
189
+ }
190
+
191
+ // Emit audit event
192
+ function emit(input, basePath = process.cwd()) {
193
+ try {
194
+ ensureAuditDir(basePath);
195
+ const prevHash = getLastHash(basePath);
196
+ const event = createEvent(input, prevHash);
197
+
198
+ const filePath = getAuditFilePath(basePath);
199
+ fs.appendFileSync(filePath, JSON.stringify(event) + "\n", "utf8");
200
+
201
+ return event;
202
+ } catch (err) {
203
+ // Silently fail - audit should not break main functionality
204
+ if (process.env.VIBECHECK_DEBUG) {
205
+ console.error("[audit] Failed to emit event:", err.message);
206
+ }
207
+ return null;
208
+ }
209
+ }
210
+
211
+ // Pre-defined actions
212
+ const AuditActions = {
213
+ SCAN_START: "scan.start",
214
+ SCAN_COMPLETE: "scan.complete",
215
+ SCAN_ERROR: "scan.error",
216
+ SHIP_CHECK: "ship.check",
217
+ SHIP_APPROVE: "ship.approve",
218
+ SHIP_REJECT: "ship.reject",
219
+ REALITY_START: "reality.start",
220
+ REALITY_COMPLETE: "reality.complete",
221
+ REALITY_ERROR: "reality.error",
222
+ AUTOPILOT_ENABLE: "autopilot.enable",
223
+ AUTOPILOT_DISABLE: "autopilot.disable",
224
+ AUTOPILOT_RUN: "autopilot.run",
225
+ AUTOPILOT_REPORT: "autopilot.report",
226
+ FIX_PLAN: "fix.plan",
227
+ FIX_APPLY: "fix.apply",
228
+ FIX_REVERT: "fix.revert",
229
+ GATE_CHECK: "gate.check",
230
+ GATE_PASS: "gate.pass",
231
+ GATE_FAIL: "gate.fail",
232
+ AUTH_LOGIN: "auth.login",
233
+ AUTH_LOGOUT: "auth.logout",
234
+ TOOL_INVOKE: "tool.invoke",
235
+ TOOL_COMPLETE: "tool.complete",
236
+ TOOL_ERROR: "tool.error",
237
+ };
238
+
239
+ // Convenience emitters
240
+ function emitScanStart(projectPath, args) {
241
+ return emit({
242
+ surface: "cli",
243
+ action: AuditActions.SCAN_START,
244
+ category: "scan",
245
+ target: { type: "project", path: projectPath },
246
+ result: "success",
247
+ metadata: { command: "scan", args, projectPath },
248
+ });
249
+ }
250
+
251
+ function emitScanComplete(projectPath, result, metadata) {
252
+ return emit({
253
+ surface: "cli",
254
+ action: AuditActions.SCAN_COMPLETE,
255
+ category: "scan",
256
+ target: { type: "project", path: projectPath },
257
+ result,
258
+ metadata: { command: "scan", projectPath, ...metadata },
259
+ });
260
+ }
261
+
262
+ function emitShipCheck(projectPath, result, metadata) {
263
+ return emit({
264
+ surface: "cli",
265
+ action: AuditActions.SHIP_CHECK,
266
+ category: "ship",
267
+ target: { type: "project", path: projectPath },
268
+ result,
269
+ metadata: { command: "ship", projectPath, ...metadata },
270
+ });
271
+ }
272
+
273
+ function emitRealityStart(url, flows) {
274
+ return emit({
275
+ surface: "cli",
276
+ action: AuditActions.REALITY_START,
277
+ category: "reality",
278
+ target: { type: "url", path: url },
279
+ result: "success",
280
+ metadata: { command: "reality", url, flows },
281
+ });
282
+ }
283
+
284
+ function emitRealityComplete(url, result, metadata) {
285
+ return emit({
286
+ surface: "cli",
287
+ action: AuditActions.REALITY_COMPLETE,
288
+ category: "reality",
289
+ target: { type: "url", path: url },
290
+ result,
291
+ metadata: { command: "reality", ...metadata },
292
+ });
293
+ }
294
+
295
+ function emitAutopilotAction(action, projectPath, result, metadata) {
296
+ const actionMap = {
297
+ enable: AuditActions.AUTOPILOT_ENABLE,
298
+ disable: AuditActions.AUTOPILOT_DISABLE,
299
+ run: AuditActions.AUTOPILOT_RUN,
300
+ report: AuditActions.AUTOPILOT_REPORT,
301
+ };
302
+
303
+ return emit({
304
+ surface: "cli",
305
+ action: actionMap[action] || action,
306
+ category: "autopilot",
307
+ target: { type: "project", path: projectPath },
308
+ result,
309
+ metadata: { command: "autopilot", projectPath, ...metadata },
310
+ });
311
+ }
312
+
313
+ function emitFixPlan(projectPath, result, metadata) {
314
+ return emit({
315
+ surface: "cli",
316
+ action: AuditActions.FIX_PLAN,
317
+ category: "fix",
318
+ target: { type: "project", path: projectPath },
319
+ result,
320
+ metadata: { command: "fix", projectPath, ...metadata },
321
+ });
322
+ }
323
+
324
+ function emitFixApply(projectPath, result, metadata) {
325
+ return emit({
326
+ surface: "cli",
327
+ action: AuditActions.FIX_APPLY,
328
+ category: "fix",
329
+ target: { type: "project", path: projectPath },
330
+ result,
331
+ metadata: { command: "fix", projectPath, ...metadata },
332
+ });
333
+ }
334
+
335
+ function emitGateCheck(projectPath, passed, metadata) {
336
+ return emit({
337
+ surface: "cli",
338
+ action: passed ? AuditActions.GATE_PASS : AuditActions.GATE_FAIL,
339
+ category: "gate",
340
+ target: { type: "project", path: projectPath },
341
+ result: passed ? "success" : "failure",
342
+ metadata: { command: "gate", projectPath, ...metadata },
343
+ });
344
+ }
345
+
346
+ function emitToolInvoke(surface, toolName, args, result, metadata) {
347
+ return emit({
348
+ surface,
349
+ action: AuditActions.TOOL_INVOKE,
350
+ category: "tool",
351
+ target: { type: "tool", name: toolName },
352
+ result,
353
+ metadata: { command: toolName, args, ...metadata },
354
+ });
355
+ }
356
+
357
+ function emitAuth(action, result, metadata) {
358
+ const actionMap = {
359
+ login: AuditActions.AUTH_LOGIN,
360
+ logout: AuditActions.AUTH_LOGOUT,
361
+ };
362
+
363
+ return emit({
364
+ surface: "cli",
365
+ action: actionMap[action] || action,
366
+ category: "auth",
367
+ target: { type: "auth" },
368
+ result,
369
+ metadata,
370
+ });
371
+ }
372
+
373
+ // Export the audit bridge
374
+ module.exports = {
375
+ emit,
376
+ AuditActions,
377
+ emitScanStart,
378
+ emitScanComplete,
379
+ emitShipCheck,
380
+ emitRealityStart,
381
+ emitRealityComplete,
382
+ emitAutopilotAction,
383
+ emitFixPlan,
384
+ emitFixApply,
385
+ emitGateCheck,
386
+ emitToolInvoke,
387
+ emitAuth,
388
+ getCurrentTier,
389
+ getCurrentActor,
390
+ getAuditFilePath,
391
+ };
@@ -0,0 +1,193 @@
1
+ // bin/runners/lib/auth-truth.js
2
+ // Auth Truth v1 - Detects auth/protection patterns in Next + Fastify codebases
3
+ const fg = require("fast-glob");
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const crypto = require("crypto");
7
+
8
+ function sha256(text) {
9
+ return "sha256:" + crypto.createHash("sha256").update(text).digest("hex");
10
+ }
11
+
12
+ function safeRead(fileAbs) {
13
+ return fs.readFileSync(fileAbs, "utf8");
14
+ }
15
+
16
+ function evidenceFromLine({ fileAbs, repoRoot, lineNo, reason }) {
17
+ const fileRel = path.relative(repoRoot, fileAbs).replace(/\\/g, "/");
18
+ const lines = safeRead(fileAbs).split(/\r?\n/);
19
+ const idx = Math.max(0, Math.min(lines.length - 1, lineNo - 1));
20
+ const snippet = lines[idx] || "";
21
+ return {
22
+ id: `ev_${crypto.randomBytes(4).toString("hex")}`,
23
+ file: fileRel,
24
+ lines: `${lineNo}-${lineNo}`,
25
+ snippetHash: sha256(snippet),
26
+ reason
27
+ };
28
+ }
29
+
30
+ function findLineMatches(code, regex) {
31
+ const out = [];
32
+ const lines = code.split(/\r?\n/);
33
+ for (let i = 0; i < lines.length; i++) {
34
+ if (regex.test(lines[i])) out.push(i + 1);
35
+ }
36
+ return out;
37
+ }
38
+
39
+ function guessAuthSignalsFromCode(code) {
40
+ const signals = [];
41
+
42
+ const patterns = [
43
+ { key: "next_middleware", rx: /\bNextResponse\.(redirect|rewrite)\b/ },
44
+ { key: "next_auth", rx: /\bgetServerSession\b|\bNextAuth\b|\bauth\(\)\b/ },
45
+ { key: "clerk", rx: /\bclerkMiddleware\b|\bauthMiddleware\b|@clerk\/nextjs/ },
46
+ { key: "supabase", rx: /\bcreateRouteHandlerClient\b|\bcreateServerClient\b|@supabase/ },
47
+ { key: "jwt_verify", rx: /\b(jwtVerify|verifyJWT|verifyToken|authorization|bearer)\b/i },
48
+ { key: "session", rx: /\b(session|cookie|setCookie|getCookie)\b/i },
49
+ { key: "rbac", rx: /\b(role|roles|permissions|rbac|isAdmin|adminOnly)\b/i },
50
+ { key: "fastify_hook", rx: /\.addHook\(\s*['"](onRequest|preHandler|preValidation)['"]/ },
51
+ { key: "fastify_jwt", rx: /@fastify\/jwt|fastify-jwt|fastify\.jwt/i },
52
+ ];
53
+
54
+ for (const p of patterns) {
55
+ if (p.rx.test(code)) signals.push(p.key);
56
+ }
57
+ return Array.from(new Set(signals));
58
+ }
59
+
60
+ async function resolveNextMiddleware(repoRoot) {
61
+ const candidates = await fg(
62
+ ["middleware.@(ts|js)", "src/middleware.@(ts|js)"],
63
+ { cwd: repoRoot, absolute: true, onlyFiles: true }
64
+ );
65
+
66
+ const middlewares = [];
67
+
68
+ for (const fileAbs of candidates) {
69
+ const code = safeRead(fileAbs);
70
+ const fileRel = path.relative(repoRoot, fileAbs).replace(/\\/g, "/");
71
+
72
+ const matcherLines = findLineMatches(code, /\bmatcher\b/);
73
+ const redirectLines = findLineMatches(code, /\bNextResponse\.(redirect|rewrite)\b/);
74
+
75
+ const evidence = [];
76
+ for (const ln of matcherLines.slice(0, 5)) {
77
+ evidence.push(evidenceFromLine({ fileAbs, repoRoot, lineNo: ln, reason: "Next middleware matcher config" }));
78
+ }
79
+ for (const ln of redirectLines.slice(0, 5)) {
80
+ evidence.push(evidenceFromLine({ fileAbs, repoRoot, lineNo: ln, reason: "Next middleware redirect/rewrite" }));
81
+ }
82
+
83
+ const matcher = [];
84
+ const matcherBlock = code.match(/matcher\s*:\s*(\[[\s\S]*?\])/);
85
+ if (matcherBlock && matcherBlock[1]) {
86
+ const raw = matcherBlock[1];
87
+ const strings = Array.from(raw.matchAll(/['"`]([^'"`]+)['"`]/g)).map(m => m[1]);
88
+ matcher.push(...strings);
89
+ }
90
+
91
+ middlewares.push({
92
+ file: fileRel,
93
+ matcher,
94
+ signals: guessAuthSignalsFromCode(code),
95
+ evidence
96
+ });
97
+ }
98
+
99
+ return middlewares;
100
+ }
101
+
102
+ async function resolveFastifyAuthSignals(repoRoot, truthpackRoutes) {
103
+ const handlerFiles = new Set((truthpackRoutes || []).map(r => r.handler).filter(Boolean));
104
+ const signals = [];
105
+ const evidence = [];
106
+
107
+ for (const fileRel of handlerFiles) {
108
+ const fileAbs = path.join(repoRoot, fileRel);
109
+ if (!fs.existsSync(fileAbs)) continue;
110
+
111
+ const code = safeRead(fileAbs);
112
+ const sigs = guessAuthSignalsFromCode(code);
113
+ if (!sigs.length) continue;
114
+
115
+ for (const s of sigs) signals.push({ type: s, file: fileRel });
116
+
117
+ const authLinePatterns = [
118
+ { rx: /\.addHook\(\s*['"](onRequest|preHandler|preValidation)['"]/, reason: "Fastify hook likely used for auth" },
119
+ { rx: /\b(jwtVerify|authorization|bearer)\b/i, reason: "JWT/Authorization verification signal" },
120
+ { rx: /@fastify\/jwt|fastify\.jwt/i, reason: "Fastify JWT plugin signal" },
121
+ { rx: /\b(isAdmin|adminOnly|permissions|rbac)\b/i, reason: "RBAC/permissions signal" },
122
+ ];
123
+
124
+ const lines = code.split(/\r?\n/);
125
+ for (let i = 0; i < lines.length; i++) {
126
+ const line = lines[i];
127
+ for (const p of authLinePatterns) {
128
+ if (p.rx.test(line)) {
129
+ evidence.push({
130
+ id: `ev_${crypto.randomBytes(4).toString("hex")}`,
131
+ file: fileRel,
132
+ lines: `${i + 1}-${i + 1}`,
133
+ snippetHash: sha256(line),
134
+ reason: p.reason
135
+ });
136
+ }
137
+ }
138
+ if (evidence.length > 30) break;
139
+ }
140
+ }
141
+
142
+ const uniqueTypes = Array.from(new Set(signals.map(s => s.type)));
143
+
144
+ return {
145
+ signalTypes: uniqueTypes,
146
+ signals,
147
+ evidence
148
+ };
149
+ }
150
+
151
+ function matcherCoversPath(matcherList, p) {
152
+ if (!Array.isArray(matcherList) || !matcherList.length) return false;
153
+ const pathStr = p.startsWith("/") ? p : `/${p}`;
154
+
155
+ return matcherList.some(m => {
156
+ if (!m) return false;
157
+
158
+ if (m.includes(":path*")) {
159
+ const prefix = m.split(":path*")[0].replace(/\/$/, "");
160
+ return pathStr.startsWith(prefix || "/");
161
+ }
162
+ if (m.includes("(.*)")) {
163
+ const prefix = m.split("(.*)")[0].replace(/\/$/, "");
164
+ return pathStr.startsWith(prefix || "/");
165
+ }
166
+
167
+ if (m === pathStr) return true;
168
+ if (pathStr.startsWith(m.endsWith("/") ? m : m + "/")) return true;
169
+
170
+ return false;
171
+ });
172
+ }
173
+
174
+ async function buildAuthTruth(repoRoot, routesServer) {
175
+ const middlewares = await resolveNextMiddleware(repoRoot);
176
+ const matchers = middlewares.flatMap(mw => mw.matcher || []);
177
+ const fastify = await resolveFastifyAuthSignals(repoRoot, routesServer);
178
+
179
+ return {
180
+ nextMiddleware: middlewares,
181
+ nextMatcherPatterns: matchers,
182
+ fastify,
183
+ helpers: {
184
+ matcherCoversPath: "runtime-only"
185
+ }
186
+ };
187
+ }
188
+
189
+ module.exports = {
190
+ buildAuthTruth,
191
+ matcherCoversPath,
192
+ guessAuthSignalsFromCode
193
+ };