@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,265 @@
1
+ /**
2
+ * Graph Builder
3
+ * Builds the complete ProofGraph from static and runtime edges
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const crypto = require("crypto");
9
+
10
+ function sha256(text) {
11
+ return crypto.createHash("sha256").update(text).digest("hex").slice(0, 16);
12
+ }
13
+
14
+ /**
15
+ * Build ProofGraph from extracted nodes and edges
16
+ */
17
+ function buildProofGraph({ nodes, edges, runtimeEdges = [], meta = {} }) {
18
+ const graph = {
19
+ meta: {
20
+ version: "1.0.0",
21
+ generatedAt: new Date().toISOString(),
22
+ commit: meta.commit || process.env.VIBECHECK_COMMIT_SHA || "unknown",
23
+ ...meta
24
+ },
25
+ nodes: [],
26
+ edges: [],
27
+ brokenEdges: [],
28
+ coverage: {
29
+ static: 0,
30
+ runtime: 0,
31
+ total: 0
32
+ }
33
+ };
34
+
35
+ // Dedupe and add nodes
36
+ const nodeMap = new Map();
37
+ for (const n of nodes) {
38
+ if (!nodeMap.has(n.id)) {
39
+ nodeMap.set(n.id, n);
40
+ }
41
+ }
42
+ graph.nodes = Array.from(nodeMap.values());
43
+
44
+ // Process edges, separate broken ones
45
+ const brokenEdges = [];
46
+ const validEdges = [];
47
+
48
+ for (const edge of edges) {
49
+ if (edge.broken) {
50
+ brokenEdges.push({
51
+ edge: {
52
+ id: edge.id,
53
+ from: edge.from,
54
+ to: edge.to,
55
+ type: edge.type,
56
+ confidence: edge.confidence || "low"
57
+ },
58
+ reason: edge.brokenReason || "Edge target not found",
59
+ severity: determineSeverity(edge),
60
+ route: edge.toRoute || null
61
+ });
62
+ } else {
63
+ validEdges.push({
64
+ id: edge.id,
65
+ from: edge.from,
66
+ to: edge.to,
67
+ type: edge.type,
68
+ confidence: edge.confidence || "med",
69
+ verifiedAt: "static"
70
+ });
71
+ }
72
+ }
73
+
74
+ // Add runtime edges
75
+ for (const re of runtimeEdges) {
76
+ const existing = validEdges.find(e => e.from === re.from && e.to === re.to);
77
+ if (existing) {
78
+ existing.verifiedAt = "runtime";
79
+ existing.runtimeData = re.data;
80
+ } else {
81
+ validEdges.push({
82
+ id: re.id || `runtime_${sha256(re.from + re.to)}`,
83
+ from: re.from,
84
+ to: re.to,
85
+ type: re.type || "runtime",
86
+ confidence: "high",
87
+ verifiedAt: "runtime",
88
+ runtimeData: re.data
89
+ });
90
+ }
91
+ }
92
+
93
+ graph.edges = validEdges;
94
+ graph.brokenEdges = brokenEdges;
95
+
96
+ // Calculate coverage
97
+ const totalPossibleEdges = graph.edges.length + graph.brokenEdges.length;
98
+ graph.coverage = {
99
+ static: graph.edges.filter(e => e.verifiedAt === "static").length,
100
+ runtime: graph.edges.filter(e => e.verifiedAt === "runtime").length,
101
+ broken: graph.brokenEdges.length,
102
+ total: totalPossibleEdges,
103
+ percent: totalPossibleEdges > 0
104
+ ? Math.round((graph.edges.length / totalPossibleEdges) * 100)
105
+ : 100
106
+ };
107
+
108
+ return graph;
109
+ }
110
+
111
+ function determineSeverity(edge) {
112
+ // Missing routes are always BLOCK
113
+ if (edge.toRoute) return "BLOCK";
114
+
115
+ // Unresolved function calls are WARN
116
+ if (edge.to?.startsWith("unresolved_")) return "WARN";
117
+
118
+ return "WARN";
119
+ }
120
+
121
+ /**
122
+ * Merge runtime verification results into graph
123
+ */
124
+ function mergeRuntimeResults(graph, runtimeResults) {
125
+ const updatedGraph = { ...graph };
126
+
127
+ for (const result of runtimeResults) {
128
+ // Find edge that matches this runtime result
129
+ const edge = updatedGraph.edges.find(e =>
130
+ e.to?.includes(result.path) ||
131
+ (e.type === "calls_route" && e.toRoute?.path === result.path)
132
+ );
133
+
134
+ if (edge) {
135
+ edge.verifiedAt = "runtime";
136
+ edge.runtimeData = {
137
+ status: result.status,
138
+ latencyMs: result.latencyMs,
139
+ error: result.error
140
+ };
141
+
142
+ // Check for runtime failures
143
+ if (result.status >= 400) {
144
+ const brokenEdge = {
145
+ edge: { ...edge },
146
+ reason: `Route returns ${result.status} at runtime`,
147
+ severity: result.status >= 500 ? "BLOCK" : "WARN",
148
+ runtimeData: edge.runtimeData
149
+ };
150
+
151
+ // Move to broken edges
152
+ updatedGraph.brokenEdges.push(brokenEdge);
153
+ updatedGraph.edges = updatedGraph.edges.filter(e => e.id !== edge.id);
154
+ }
155
+ }
156
+ }
157
+
158
+ // Recalculate coverage
159
+ const totalPossibleEdges = updatedGraph.edges.length + updatedGraph.brokenEdges.length;
160
+ updatedGraph.coverage = {
161
+ static: updatedGraph.edges.filter(e => e.verifiedAt === "static").length,
162
+ runtime: updatedGraph.edges.filter(e => e.verifiedAt === "runtime").length,
163
+ broken: updatedGraph.brokenEdges.length,
164
+ total: totalPossibleEdges,
165
+ percent: totalPossibleEdges > 0
166
+ ? Math.round((updatedGraph.edges.length / totalPossibleEdges) * 100)
167
+ : 100
168
+ };
169
+
170
+ return updatedGraph;
171
+ }
172
+
173
+ /**
174
+ * Compute graph diff between two graphs
175
+ */
176
+ function computeGraphDiff(before, after) {
177
+ const diff = {
178
+ nodesAdded: [],
179
+ nodesRemoved: [],
180
+ edgesAdded: [],
181
+ edgesRemoved: [],
182
+ edgesFixed: [],
183
+ edgesBroken: []
184
+ };
185
+
186
+ const beforeNodeIds = new Set(before.nodes.map(n => n.id));
187
+ const afterNodeIds = new Set(after.nodes.map(n => n.id));
188
+
189
+ for (const n of after.nodes) {
190
+ if (!beforeNodeIds.has(n.id)) diff.nodesAdded.push(n);
191
+ }
192
+ for (const n of before.nodes) {
193
+ if (!afterNodeIds.has(n.id)) diff.nodesRemoved.push(n);
194
+ }
195
+
196
+ const beforeEdgeIds = new Set(before.edges.map(e => e.id));
197
+ const afterEdgeIds = new Set(after.edges.map(e => e.id));
198
+ const beforeBrokenIds = new Set(before.brokenEdges.map(e => e.edge.id));
199
+ const afterBrokenIds = new Set(after.brokenEdges.map(e => e.edge.id));
200
+
201
+ for (const e of after.edges) {
202
+ if (!beforeEdgeIds.has(e.id)) {
203
+ if (beforeBrokenIds.has(e.id)) {
204
+ diff.edgesFixed.push(e);
205
+ } else {
206
+ diff.edgesAdded.push(e);
207
+ }
208
+ }
209
+ }
210
+
211
+ for (const e of before.edges) {
212
+ if (!afterEdgeIds.has(e.id)) {
213
+ if (afterBrokenIds.has(e.id)) {
214
+ diff.edgesBroken.push(e);
215
+ } else {
216
+ diff.edgesRemoved.push(e);
217
+ }
218
+ }
219
+ }
220
+
221
+ return diff;
222
+ }
223
+
224
+ /**
225
+ * Get findings from broken edges
226
+ */
227
+ function getFindingsFromGraph(graph) {
228
+ const findings = [];
229
+
230
+ for (const broken of graph.brokenEdges) {
231
+ const finding = {
232
+ id: `GRAPH_${broken.edge.id}`,
233
+ severity: broken.severity,
234
+ category: "BrokenEdge",
235
+ title: broken.reason,
236
+ evidence: [],
237
+ graphEdge: broken.edge
238
+ };
239
+
240
+ if (broken.route) {
241
+ finding.title = `Route ${broken.route.method} ${broken.route.path} referenced but doesn't exist`;
242
+ finding.category = "MissingRoute";
243
+ }
244
+
245
+ if (broken.runtimeData) {
246
+ finding.title = `Route returns ${broken.runtimeData.status} at runtime`;
247
+ finding.category = "RuntimeFailure";
248
+ if (broken.runtimeData.status === 401) {
249
+ finding.title = "UI shows success but server returned 401 (auth required)";
250
+ finding.category = "CausalContradiction";
251
+ }
252
+ }
253
+
254
+ findings.push(finding);
255
+ }
256
+
257
+ return findings;
258
+ }
259
+
260
+ module.exports = {
261
+ buildProofGraph,
262
+ mergeRuntimeResults,
263
+ computeGraphDiff,
264
+ getFindingsFromGraph
265
+ };
@@ -0,0 +1,413 @@
1
+ /**
2
+ * HTML Renderer
3
+ * Generates interactive visualization of the Proof Graph
4
+ */
5
+
6
+ "use strict";
7
+
8
+ function escapeHtml(str) {
9
+ return String(str || "")
10
+ .replace(/&/g, "&")
11
+ .replace(/</g, "&lt;")
12
+ .replace(/>/g, "&gt;")
13
+ .replace(/"/g, "&quot;");
14
+ }
15
+
16
+ /**
17
+ * Generate interactive HTML visualization
18
+ */
19
+ function renderGraphHtml(graph) {
20
+ const nodesJson = JSON.stringify(graph.nodes);
21
+ const edgesJson = JSON.stringify(graph.edges);
22
+ const brokenJson = JSON.stringify(graph.brokenEdges);
23
+
24
+ return `<!DOCTYPE html>
25
+ <html lang="en">
26
+ <head>
27
+ <meta charset="UTF-8">
28
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
29
+ <title>Reality Proof Graph - Vibecheck</title>
30
+ <script src="https://d3js.org/d3.v7.min.js"></script>
31
+ <style>
32
+ * { box-sizing: border-box; margin: 0; padding: 0; }
33
+ body {
34
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
35
+ background: #0d1117;
36
+ color: #c9d1d9;
37
+ overflow: hidden;
38
+ }
39
+ .header {
40
+ position: fixed;
41
+ top: 0;
42
+ left: 0;
43
+ right: 0;
44
+ height: 60px;
45
+ background: #161b22;
46
+ border-bottom: 1px solid #30363d;
47
+ display: flex;
48
+ align-items: center;
49
+ padding: 0 20px;
50
+ z-index: 100;
51
+ }
52
+ .header h1 {
53
+ font-size: 18px;
54
+ font-weight: 600;
55
+ color: #58a6ff;
56
+ }
57
+ .stats {
58
+ margin-left: auto;
59
+ display: flex;
60
+ gap: 20px;
61
+ font-size: 13px;
62
+ }
63
+ .stat { display: flex; align-items: center; gap: 6px; }
64
+ .stat-dot {
65
+ width: 8px;
66
+ height: 8px;
67
+ border-radius: 50%;
68
+ }
69
+ .stat-dot.green { background: #3fb950; }
70
+ .stat-dot.yellow { background: #d29922; }
71
+ .stat-dot.red { background: #f85149; }
72
+
73
+ .sidebar {
74
+ position: fixed;
75
+ top: 60px;
76
+ right: 0;
77
+ width: 350px;
78
+ bottom: 0;
79
+ background: #161b22;
80
+ border-left: 1px solid #30363d;
81
+ overflow-y: auto;
82
+ z-index: 90;
83
+ }
84
+ .sidebar-section {
85
+ padding: 16px;
86
+ border-bottom: 1px solid #30363d;
87
+ }
88
+ .sidebar-section h2 {
89
+ font-size: 14px;
90
+ font-weight: 600;
91
+ margin-bottom: 12px;
92
+ color: #8b949e;
93
+ text-transform: uppercase;
94
+ letter-spacing: 0.5px;
95
+ }
96
+ .broken-edge {
97
+ background: #21262d;
98
+ border-radius: 6px;
99
+ padding: 12px;
100
+ margin-bottom: 8px;
101
+ border-left: 3px solid #f85149;
102
+ }
103
+ .broken-edge.warn { border-left-color: #d29922; }
104
+ .broken-edge-title {
105
+ font-size: 13px;
106
+ font-weight: 500;
107
+ margin-bottom: 4px;
108
+ }
109
+ .broken-edge-reason {
110
+ font-size: 12px;
111
+ color: #8b949e;
112
+ }
113
+
114
+ .graph-container {
115
+ position: fixed;
116
+ top: 60px;
117
+ left: 0;
118
+ right: 350px;
119
+ bottom: 0;
120
+ }
121
+ svg { width: 100%; height: 100%; }
122
+
123
+ .node {
124
+ cursor: pointer;
125
+ transition: opacity 0.2s;
126
+ }
127
+ .node:hover { opacity: 0.8; }
128
+ .node circle {
129
+ stroke: #30363d;
130
+ stroke-width: 2;
131
+ }
132
+ .node text {
133
+ font-size: 10px;
134
+ fill: #c9d1d9;
135
+ pointer-events: none;
136
+ }
137
+ .node.ui_action circle { fill: #a371f7; }
138
+ .node.client_function circle { fill: #58a6ff; }
139
+ .node.network_call circle { fill: #3fb950; }
140
+ .node.server_route circle { fill: #d29922; }
141
+ .node.handler circle { fill: #f0883e; }
142
+ .node.db_call circle { fill: #f85149; }
143
+ .node.external_call circle { fill: #bc8cff; }
144
+
145
+ .edge {
146
+ fill: none;
147
+ stroke: #30363d;
148
+ stroke-width: 1.5;
149
+ }
150
+ .edge.verified { stroke: #3fb950; }
151
+ .edge.broken { stroke: #f85149; stroke-dasharray: 4; }
152
+
153
+ .tooltip {
154
+ position: fixed;
155
+ background: #21262d;
156
+ border: 1px solid #30363d;
157
+ border-radius: 6px;
158
+ padding: 12px;
159
+ font-size: 12px;
160
+ max-width: 300px;
161
+ pointer-events: none;
162
+ z-index: 200;
163
+ display: none;
164
+ }
165
+ .tooltip.visible { display: block; }
166
+ .tooltip-title {
167
+ font-weight: 600;
168
+ margin-bottom: 8px;
169
+ color: #58a6ff;
170
+ }
171
+ .tooltip-row {
172
+ display: flex;
173
+ margin-bottom: 4px;
174
+ }
175
+ .tooltip-label {
176
+ color: #8b949e;
177
+ width: 60px;
178
+ }
179
+ .tooltip-value {
180
+ flex: 1;
181
+ word-break: break-all;
182
+ }
183
+
184
+ .legend {
185
+ position: fixed;
186
+ bottom: 20px;
187
+ left: 20px;
188
+ background: #161b22;
189
+ border: 1px solid #30363d;
190
+ border-radius: 6px;
191
+ padding: 12px;
192
+ font-size: 11px;
193
+ z-index: 90;
194
+ }
195
+ .legend-item {
196
+ display: flex;
197
+ align-items: center;
198
+ gap: 8px;
199
+ margin-bottom: 6px;
200
+ }
201
+ .legend-dot {
202
+ width: 12px;
203
+ height: 12px;
204
+ border-radius: 50%;
205
+ }
206
+ </style>
207
+ </head>
208
+ <body>
209
+ <div class="header">
210
+ <h1>🔍 Reality Proof Graph</h1>
211
+ <div class="stats">
212
+ <div class="stat">
213
+ <div class="stat-dot green"></div>
214
+ <span id="stat-valid">0</span> valid edges
215
+ </div>
216
+ <div class="stat">
217
+ <div class="stat-dot red"></div>
218
+ <span id="stat-broken">0</span> broken edges
219
+ </div>
220
+ <div class="stat">
221
+ <div class="stat-dot yellow"></div>
222
+ <span id="stat-coverage">0</span>% coverage
223
+ </div>
224
+ </div>
225
+ </div>
226
+
227
+ <div class="graph-container" id="graph"></div>
228
+
229
+ <div class="sidebar">
230
+ <div class="sidebar-section">
231
+ <h2>Broken Edges</h2>
232
+ <div id="broken-list"></div>
233
+ </div>
234
+ </div>
235
+
236
+ <div class="tooltip" id="tooltip"></div>
237
+
238
+ <div class="legend">
239
+ <div class="legend-item"><div class="legend-dot" style="background:#a371f7"></div> UI Action</div>
240
+ <div class="legend-item"><div class="legend-dot" style="background:#58a6ff"></div> Client Function</div>
241
+ <div class="legend-item"><div class="legend-dot" style="background:#3fb950"></div> Network Call</div>
242
+ <div class="legend-item"><div class="legend-dot" style="background:#d29922"></div> Server Route</div>
243
+ <div class="legend-item"><div class="legend-dot" style="background:#f85149"></div> DB Call</div>
244
+ <div class="legend-item"><div class="legend-dot" style="background:#bc8cff"></div> External Call</div>
245
+ </div>
246
+
247
+ <script>
248
+ const nodes = ${nodesJson};
249
+ const edges = ${edgesJson};
250
+ const brokenEdges = ${brokenJson};
251
+
252
+ // Update stats
253
+ document.getElementById('stat-valid').textContent = edges.length;
254
+ document.getElementById('stat-broken').textContent = brokenEdges.length;
255
+ const total = edges.length + brokenEdges.length;
256
+ const coverage = total > 0 ? Math.round((edges.length / total) * 100) : 100;
257
+ document.getElementById('stat-coverage').textContent = coverage;
258
+
259
+ // Render broken edges list
260
+ const brokenList = document.getElementById('broken-list');
261
+ if (brokenEdges.length === 0) {
262
+ brokenList.innerHTML = '<div style="color:#8b949e;font-size:13px">No broken edges found</div>';
263
+ } else {
264
+ brokenList.innerHTML = brokenEdges.map(b => \`
265
+ <div class="broken-edge \${b.severity === 'WARN' ? 'warn' : ''}">
266
+ <div class="broken-edge-title">\${escapeHtml(b.reason)}</div>
267
+ <div class="broken-edge-reason">\${b.route ? b.route.method + ' ' + b.route.path : b.edge.from}</div>
268
+ </div>
269
+ \`).join('');
270
+ }
271
+
272
+ function escapeHtml(str) {
273
+ const div = document.createElement('div');
274
+ div.textContent = str;
275
+ return div.innerHTML;
276
+ }
277
+
278
+ // D3 Graph
279
+ const container = document.getElementById('graph');
280
+ const width = container.clientWidth;
281
+ const height = container.clientHeight;
282
+
283
+ const svg = d3.select('#graph')
284
+ .append('svg')
285
+ .attr('width', width)
286
+ .attr('height', height);
287
+
288
+ const g = svg.append('g');
289
+
290
+ // Zoom
291
+ const zoom = d3.zoom()
292
+ .scaleExtent([0.1, 4])
293
+ .on('zoom', (event) => g.attr('transform', event.transform));
294
+ svg.call(zoom);
295
+
296
+ // Build node map
297
+ const nodeMap = new Map(nodes.map(n => [n.id, n]));
298
+
299
+ // Filter edges to only those with valid nodes
300
+ const validEdges = edges.filter(e => nodeMap.has(e.from) && nodeMap.has(e.to));
301
+
302
+ // Simulation
303
+ const simulation = d3.forceSimulation(nodes)
304
+ .force('link', d3.forceLink(validEdges).id(d => d.id).distance(100))
305
+ .force('charge', d3.forceManyBody().strength(-300))
306
+ .force('center', d3.forceCenter(width / 2, height / 2))
307
+ .force('collision', d3.forceCollide().radius(30));
308
+
309
+ // Edges
310
+ const link = g.append('g')
311
+ .selectAll('line')
312
+ .data(validEdges)
313
+ .join('line')
314
+ .attr('class', d => 'edge' + (d.verifiedAt === 'runtime' ? ' verified' : ''));
315
+
316
+ // Nodes
317
+ const node = g.append('g')
318
+ .selectAll('g')
319
+ .data(nodes)
320
+ .join('g')
321
+ .attr('class', d => 'node ' + d.type)
322
+ .call(d3.drag()
323
+ .on('start', dragstarted)
324
+ .on('drag', dragged)
325
+ .on('end', dragended));
326
+
327
+ node.append('circle')
328
+ .attr('r', 12);
329
+
330
+ node.append('text')
331
+ .attr('dy', 25)
332
+ .attr('text-anchor', 'middle')
333
+ .text(d => d.type.split('_').map(w => w[0]).join('').toUpperCase());
334
+
335
+ // Tooltip
336
+ const tooltip = document.getElementById('tooltip');
337
+
338
+ node.on('mouseover', (event, d) => {
339
+ tooltip.innerHTML = \`
340
+ <div class="tooltip-title">\${d.type}</div>
341
+ <div class="tooltip-row"><span class="tooltip-label">File:</span><span class="tooltip-value">\${escapeHtml(d.file)}</span></div>
342
+ <div class="tooltip-row"><span class="tooltip-label">Line:</span><span class="tooltip-value">\${d.line}</span></div>
343
+ \${d.url ? '<div class="tooltip-row"><span class="tooltip-label">URL:</span><span class="tooltip-value">' + escapeHtml(d.url) + '</span></div>' : ''}
344
+ \${d.path ? '<div class="tooltip-row"><span class="tooltip-label">Path:</span><span class="tooltip-value">' + escapeHtml(d.path) + '</span></div>' : ''}
345
+ \`;
346
+ tooltip.style.left = (event.clientX + 10) + 'px';
347
+ tooltip.style.top = (event.clientY + 10) + 'px';
348
+ tooltip.classList.add('visible');
349
+ })
350
+ .on('mouseout', () => tooltip.classList.remove('visible'));
351
+
352
+ simulation.on('tick', () => {
353
+ link
354
+ .attr('x1', d => d.source.x)
355
+ .attr('y1', d => d.source.y)
356
+ .attr('x2', d => d.target.x)
357
+ .attr('y2', d => d.target.y);
358
+
359
+ node.attr('transform', d => \`translate(\${d.x},\${d.y})\`);
360
+ });
361
+
362
+ function dragstarted(event) {
363
+ if (!event.active) simulation.alphaTarget(0.3).restart();
364
+ event.subject.fx = event.subject.x;
365
+ event.subject.fy = event.subject.y;
366
+ }
367
+
368
+ function dragged(event) {
369
+ event.subject.fx = event.x;
370
+ event.subject.fy = event.y;
371
+ }
372
+
373
+ function dragended(event) {
374
+ if (!event.active) simulation.alphaTarget(0);
375
+ event.subject.fx = null;
376
+ event.subject.fy = null;
377
+ }
378
+ </script>
379
+ </body>
380
+ </html>`;
381
+ }
382
+
383
+ /**
384
+ * Render Mermaid diagram for graph
385
+ */
386
+ function renderGraphMermaid(graph) {
387
+ const lines = ["graph TD"];
388
+
389
+ // Add nodes
390
+ for (const node of graph.nodes) {
391
+ const label = `${node.type}\\n${node.file.split("/").pop()}:${node.line}`;
392
+ lines.push(` ${node.id}["${label}"]`);
393
+ }
394
+
395
+ // Add edges
396
+ for (const edge of graph.edges) {
397
+ const style = edge.verifiedAt === "runtime" ? "==>" : "-->";
398
+ lines.push(` ${edge.from} ${style} ${edge.to}`);
399
+ }
400
+
401
+ // Add broken edges with different style
402
+ for (const broken of graph.brokenEdges) {
403
+ lines.push(` ${broken.edge.from} -.-> ${broken.edge.to}`);
404
+ lines.push(` style ${broken.edge.to} fill:#f85149`);
405
+ }
406
+
407
+ return lines.join("\n");
408
+ }
409
+
410
+ module.exports = {
411
+ renderGraphHtml,
412
+ renderGraphMermaid
413
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Reality Proof Graph - Module Index
3
+ *
4
+ * Exports all graph functionality for CLI and MCP use
5
+ */
6
+
7
+ "use strict";
8
+
9
+ const { extractStaticGraph } = require("./static-extractor");
10
+ const { buildProofGraph, mergeRuntimeResults, computeGraphDiff, getFindingsFromGraph } = require("./graph-builder");
11
+ const { renderGraphHtml, renderGraphMermaid } = require("./html-renderer");
12
+ const { generateFetchWrapper, collectRequests, buildRuntimeEdges } = require("./runtime-collector");
13
+
14
+ module.exports = {
15
+ // Static extraction
16
+ extractStaticGraph,
17
+
18
+ // Graph building
19
+ buildProofGraph,
20
+ mergeRuntimeResults,
21
+ computeGraphDiff,
22
+ getFindingsFromGraph,
23
+
24
+ // Rendering
25
+ renderGraphHtml,
26
+ renderGraphMermaid,
27
+
28
+ // Runtime collection
29
+ generateFetchWrapper,
30
+ collectRequests,
31
+ buildRuntimeEdges
32
+ };