browser-debugger-cli 0.2.0 → 0.5.1

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 (554) hide show
  1. package/README.md +137 -126
  2. package/dist/__tests__/fixtures/schema-v0.2.1.golden.json +47 -0
  3. package/dist/__tests__/schema.contract.test.d.ts +19 -0
  4. package/dist/__tests__/schema.contract.test.d.ts.map +1 -0
  5. package/dist/__tests__/schema.contract.test.js +236 -0
  6. package/dist/__tests__/schema.contract.test.js.map +1 -0
  7. package/dist/__tests__/smoke/error-handling.smoke.test.d.ts +8 -0
  8. package/dist/__tests__/smoke/error-handling.smoke.test.d.ts.map +1 -0
  9. package/dist/__tests__/smoke/error-handling.smoke.test.js +106 -0
  10. package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -0
  11. package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts +8 -0
  12. package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts.map +1 -0
  13. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +109 -0
  14. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -0
  15. package/dist/__testutils__/commandRunner.d.ts +45 -0
  16. package/dist/__testutils__/commandRunner.d.ts.map +1 -0
  17. package/dist/__testutils__/commandRunner.js +108 -0
  18. package/dist/__testutils__/commandRunner.js.map +1 -0
  19. package/dist/__testutils__/daemonHelpers.d.ts +81 -0
  20. package/dist/__testutils__/daemonHelpers.d.ts.map +1 -0
  21. package/dist/__testutils__/daemonHelpers.js +206 -0
  22. package/dist/__testutils__/daemonHelpers.js.map +1 -0
  23. package/dist/__testutils__/index.d.ts +1 -0
  24. package/dist/__testutils__/index.d.ts.map +1 -1
  25. package/dist/__testutils__/index.js +1 -0
  26. package/dist/__testutils__/index.js.map +1 -1
  27. package/dist/__testutils__/testCleanup.d.ts +45 -0
  28. package/dist/__testutils__/testCleanup.d.ts.map +1 -0
  29. package/dist/__testutils__/testCleanup.js +87 -0
  30. package/dist/__testutils__/testCleanup.js.map +1 -0
  31. package/dist/__testutils__/testHome.d.ts +26 -0
  32. package/dist/__testutils__/testHome.d.ts.map +1 -0
  33. package/dist/__testutils__/testHome.js +57 -0
  34. package/dist/__testutils__/testHome.js.map +1 -0
  35. package/dist/__testutils__/testProcess.d.ts.map +1 -1
  36. package/dist/__testutils__/testProcess.js +11 -3
  37. package/dist/__testutils__/testProcess.js.map +1 -1
  38. package/dist/cli/commands/__tests__/start.unit.test.d.ts +2 -0
  39. package/dist/cli/commands/__tests__/start.unit.test.d.ts.map +1 -0
  40. package/dist/cli/commands/__tests__/start.unit.test.js +131 -0
  41. package/dist/cli/commands/__tests__/start.unit.test.js.map +1 -0
  42. package/dist/cli/commands/cleanup.d.ts +1 -0
  43. package/dist/cli/commands/cleanup.d.ts.map +1 -1
  44. package/dist/cli/commands/cleanup.js +80 -61
  45. package/dist/cli/commands/cleanup.js.map +1 -1
  46. package/dist/cli/commands/details.d.ts +2 -1
  47. package/dist/cli/commands/details.d.ts.map +1 -1
  48. package/dist/cli/commands/details.js +104 -52
  49. package/dist/cli/commands/details.js.map +1 -1
  50. package/dist/cli/commands/peek.d.ts +2 -1
  51. package/dist/cli/commands/peek.d.ts.map +1 -1
  52. package/dist/cli/commands/peek.js +22 -67
  53. package/dist/cli/commands/peek.js.map +1 -1
  54. package/dist/cli/commands/query.d.ts +9 -0
  55. package/dist/cli/commands/query.d.ts.map +1 -0
  56. package/dist/cli/commands/query.js +125 -0
  57. package/dist/cli/commands/query.js.map +1 -0
  58. package/dist/cli/commands/start.d.ts +74 -0
  59. package/dist/cli/commands/start.d.ts.map +1 -1
  60. package/dist/cli/commands/start.js +147 -38
  61. package/dist/cli/commands/start.js.map +1 -1
  62. package/dist/cli/commands/status.d.ts.map +1 -1
  63. package/dist/cli/commands/status.js +37 -49
  64. package/dist/cli/commands/status.js.map +1 -1
  65. package/dist/cli/commands/stop.d.ts +1 -0
  66. package/dist/cli/commands/stop.d.ts.map +1 -1
  67. package/dist/cli/commands/stop.js +106 -120
  68. package/dist/cli/commands/stop.js.map +1 -1
  69. package/dist/cli/formatters/detailsFormatter.d.ts +1 -1
  70. package/dist/cli/formatters/previewFormatter.d.ts +7 -7
  71. package/dist/cli/formatters/previewFormatter.d.ts.map +1 -1
  72. package/dist/cli/formatters/previewFormatter.js +5 -10
  73. package/dist/cli/formatters/previewFormatter.js.map +1 -1
  74. package/dist/cli/formatters/statusFormatter.d.ts +13 -10
  75. package/dist/cli/formatters/statusFormatter.d.ts.map +1 -1
  76. package/dist/cli/formatters/statusFormatter.js +26 -53
  77. package/dist/cli/formatters/statusFormatter.js.map +1 -1
  78. package/dist/cli/handlers/ChromeBootstrap.d.ts +24 -0
  79. package/dist/cli/handlers/ChromeBootstrap.d.ts.map +1 -0
  80. package/dist/cli/handlers/ChromeBootstrap.js +50 -0
  81. package/dist/cli/handlers/ChromeBootstrap.js.map +1 -0
  82. package/dist/cli/handlers/OutputBuilder.d.ts +2 -3
  83. package/dist/cli/handlers/OutputBuilder.d.ts.map +1 -1
  84. package/dist/cli/handlers/OutputBuilder.js +2 -4
  85. package/dist/cli/handlers/OutputBuilder.js.map +1 -1
  86. package/dist/cli/handlers/OutputWriter.d.ts +15 -0
  87. package/dist/cli/handlers/OutputWriter.d.ts.map +1 -0
  88. package/dist/cli/handlers/OutputWriter.js +34 -0
  89. package/dist/cli/handlers/OutputWriter.js.map +1 -0
  90. package/dist/cli/handlers/PreviewWriter.d.ts +52 -0
  91. package/dist/cli/handlers/PreviewWriter.d.ts.map +1 -0
  92. package/dist/cli/handlers/PreviewWriter.js +118 -0
  93. package/dist/cli/handlers/PreviewWriter.js.map +1 -0
  94. package/dist/cli/handlers/SessionLock.d.ts +16 -0
  95. package/dist/cli/handlers/SessionLock.d.ts.map +1 -0
  96. package/dist/cli/handlers/SessionLock.js +35 -0
  97. package/dist/cli/handlers/SessionLock.js.map +1 -0
  98. package/dist/cli/handlers/SessionLoop.d.ts +19 -0
  99. package/dist/cli/handlers/SessionLoop.d.ts.map +1 -0
  100. package/dist/cli/handlers/SessionLoop.js +47 -0
  101. package/dist/cli/handlers/SessionLoop.js.map +1 -0
  102. package/dist/cli/handlers/ShutdownController.d.ts +41 -0
  103. package/dist/cli/handlers/ShutdownController.d.ts.map +1 -0
  104. package/dist/cli/handlers/ShutdownController.js +94 -0
  105. package/dist/cli/handlers/ShutdownController.js.map +1 -0
  106. package/dist/cli/handlers/SignalHandler.d.ts +35 -0
  107. package/dist/cli/handlers/SignalHandler.d.ts.map +1 -0
  108. package/dist/cli/handlers/SignalHandler.js +81 -0
  109. package/dist/cli/handlers/SignalHandler.js.map +1 -0
  110. package/dist/cli/handlers/TargetSetup.d.ts +42 -0
  111. package/dist/cli/handlers/TargetSetup.d.ts.map +1 -0
  112. package/dist/cli/handlers/TargetSetup.js +87 -0
  113. package/dist/cli/handlers/TargetSetup.js.map +1 -0
  114. package/dist/cli/handlers/sessionController.d.ts +41 -0
  115. package/dist/cli/handlers/sessionController.d.ts.map +1 -1
  116. package/dist/cli/handlers/sessionController.js +266 -5
  117. package/dist/cli/handlers/sessionController.js.map +1 -1
  118. package/dist/cli/registry.d.ts +2 -2
  119. package/dist/cli/registry.d.ts.map +1 -1
  120. package/dist/cli/registry.js +12 -37
  121. package/dist/cli/registry.js.map +1 -1
  122. package/dist/collectors/console.d.ts +1 -1
  123. package/dist/collectors/console.js +2 -2
  124. package/dist/collectors/console.js.map +1 -1
  125. package/dist/collectors/dom.d.ts +1 -1
  126. package/dist/collectors/network.d.ts +1 -2
  127. package/dist/collectors/network.d.ts.map +1 -1
  128. package/dist/collectors/network.js +3 -3
  129. package/dist/collectors/network.js.map +1 -1
  130. package/dist/commands/__tests__/cdp.contract.test.d.ts.map +1 -1
  131. package/dist/commands/__tests__/cdp.contract.test.js +0 -1
  132. package/dist/commands/__tests__/cdp.contract.test.js.map +1 -1
  133. package/dist/commands/__tests__/domEval.contract.test.d.ts +17 -0
  134. package/dist/commands/__tests__/domEval.contract.test.d.ts.map +1 -0
  135. package/dist/commands/__tests__/domEval.contract.test.js +231 -0
  136. package/dist/commands/__tests__/domEval.contract.test.js.map +1 -0
  137. package/dist/commands/cdp.js +1 -1
  138. package/dist/commands/cdp.js.map +1 -1
  139. package/dist/commands/cleanup.d.ts.map +1 -1
  140. package/dist/commands/cleanup.js +51 -13
  141. package/dist/commands/cleanup.js.map +1 -1
  142. package/dist/commands/console.d.ts.map +1 -1
  143. package/dist/commands/console.js +8 -8
  144. package/dist/commands/console.js.map +1 -1
  145. package/dist/commands/details.js +2 -2
  146. package/dist/commands/details.js.map +1 -1
  147. package/dist/commands/dom.d.ts.map +1 -1
  148. package/dist/commands/dom.js +114 -128
  149. package/dist/commands/dom.js.map +1 -1
  150. package/dist/commands/domEvalHelpers.d.ts +7 -11
  151. package/dist/commands/domEvalHelpers.d.ts.map +1 -1
  152. package/dist/commands/domEvalHelpers.js +67 -22
  153. package/dist/commands/domEvalHelpers.js.map +1 -1
  154. package/dist/commands/domOptionsBuilder.d.ts +32 -0
  155. package/dist/commands/domOptionsBuilder.d.ts.map +1 -1
  156. package/dist/commands/domOptionsBuilder.js +35 -0
  157. package/dist/commands/domOptionsBuilder.js.map +1 -1
  158. package/dist/commands/machineReadableHelp.d.ts +98 -0
  159. package/dist/commands/machineReadableHelp.d.ts.map +1 -0
  160. package/dist/commands/machineReadableHelp.js +137 -0
  161. package/dist/commands/machineReadableHelp.js.map +1 -0
  162. package/dist/commands/network.d.ts.map +1 -1
  163. package/dist/commands/network.js +2 -4
  164. package/dist/commands/network.js.map +1 -1
  165. package/dist/commands/peek.d.ts.map +1 -1
  166. package/dist/commands/peek.js +3 -2
  167. package/dist/commands/peek.js.map +1 -1
  168. package/dist/commands/shared/CommandRunner.d.ts +4 -2
  169. package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
  170. package/dist/commands/shared/CommandRunner.js +18 -3
  171. package/dist/commands/shared/CommandRunner.js.map +1 -1
  172. package/dist/commands/shared/OutputBuilder.js +1 -1
  173. package/dist/commands/shared/OutputBuilder.js.map +1 -1
  174. package/dist/commands/shared/commonOptions.d.ts.map +1 -1
  175. package/dist/commands/shared/commonOptions.js +10 -3
  176. package/dist/commands/shared/commonOptions.js.map +1 -1
  177. package/dist/commands/shared/daemonSessionController.d.ts +2 -0
  178. package/dist/commands/shared/daemonSessionController.d.ts.map +1 -1
  179. package/dist/commands/shared/daemonSessionController.js +13 -16
  180. package/dist/commands/shared/daemonSessionController.js.map +1 -1
  181. package/dist/commands/shared/sessionController.d.ts.map +1 -1
  182. package/dist/commands/shared/sessionController.js +8 -9
  183. package/dist/commands/shared/sessionController.js.map +1 -1
  184. package/dist/commands/start.d.ts.map +1 -1
  185. package/dist/commands/start.js +16 -1
  186. package/dist/commands/start.js.map +1 -1
  187. package/dist/commands/status.d.ts.map +1 -1
  188. package/dist/commands/status.js +72 -54
  189. package/dist/commands/status.js.map +1 -1
  190. package/dist/commands/stop.d.ts.map +1 -1
  191. package/dist/commands/stop.js +16 -28
  192. package/dist/commands/stop.js.map +1 -1
  193. package/dist/commands/tail.d.ts +11 -0
  194. package/dist/commands/tail.d.ts.map +1 -0
  195. package/dist/commands/tail.js +114 -0
  196. package/dist/commands/tail.js.map +1 -0
  197. package/dist/commands.d.ts.map +1 -1
  198. package/dist/commands.js +2 -0
  199. package/dist/commands.js.map +1 -1
  200. package/dist/connection/__tests__/cdp.contract.test.d.ts.map +1 -1
  201. package/dist/connection/__tests__/cdp.contract.test.js +0 -1
  202. package/dist/connection/__tests__/cdp.contract.test.js.map +1 -1
  203. package/dist/connection/cdp.d.ts +46 -2
  204. package/dist/connection/cdp.d.ts.map +1 -1
  205. package/dist/connection/cdp.js +71 -5
  206. package/dist/connection/cdp.js.map +1 -1
  207. package/dist/connection/diagnostics.d.ts +16 -0
  208. package/dist/connection/diagnostics.d.ts.map +1 -0
  209. package/dist/connection/diagnostics.js +37 -0
  210. package/dist/connection/diagnostics.js.map +1 -0
  211. package/dist/connection/errors.d.ts +74 -0
  212. package/dist/connection/errors.d.ts.map +1 -0
  213. package/dist/connection/errors.js +83 -0
  214. package/dist/connection/errors.js.map +1 -0
  215. package/dist/connection/handlers.d.ts +31 -0
  216. package/dist/connection/handlers.d.ts.map +1 -0
  217. package/dist/connection/handlers.js +38 -0
  218. package/dist/connection/handlers.js.map +1 -0
  219. package/dist/connection/launcher.d.ts +3 -20
  220. package/dist/connection/launcher.d.ts.map +1 -1
  221. package/dist/connection/launcher.js +140 -32
  222. package/dist/connection/launcher.js.map +1 -1
  223. package/dist/connection/pageReadiness.d.ts +46 -0
  224. package/dist/connection/pageReadiness.d.ts.map +1 -0
  225. package/dist/connection/pageReadiness.js +270 -0
  226. package/dist/connection/pageReadiness.js.map +1 -0
  227. package/dist/connection/tabs.d.ts +52 -0
  228. package/dist/connection/tabs.d.ts.map +1 -0
  229. package/dist/connection/tabs.js +227 -0
  230. package/dist/connection/tabs.js.map +1 -0
  231. package/dist/constants.d.ts +20 -40
  232. package/dist/constants.d.ts.map +1 -1
  233. package/dist/constants.js +26 -40
  234. package/dist/constants.js.map +1 -1
  235. package/dist/daemon/ipcServer.d.ts +5 -7
  236. package/dist/daemon/ipcServer.d.ts.map +1 -1
  237. package/dist/daemon/ipcServer.js +178 -143
  238. package/dist/daemon/ipcServer.js.map +1 -1
  239. package/dist/daemon/launcher.js +1 -1
  240. package/dist/daemon/launcher.js.map +1 -1
  241. package/dist/daemon/server/SocketServer.d.ts +22 -0
  242. package/dist/daemon/server/SocketServer.d.ts.map +1 -0
  243. package/dist/daemon/server/SocketServer.js +67 -0
  244. package/dist/daemon/server/SocketServer.js.map +1 -0
  245. package/dist/daemon/server/WorkerManager.d.ts +36 -0
  246. package/dist/daemon/server/WorkerManager.d.ts.map +1 -0
  247. package/dist/daemon/server/WorkerManager.js +98 -0
  248. package/dist/daemon/server/WorkerManager.js.map +1 -0
  249. package/dist/daemon/startSession.d.ts +2 -0
  250. package/dist/daemon/startSession.d.ts.map +1 -1
  251. package/dist/daemon/startSession.js +9 -5
  252. package/dist/daemon/startSession.js.map +1 -1
  253. package/dist/daemon/worker/TelemetryStore.d.ts +18 -0
  254. package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -0
  255. package/dist/daemon/worker/TelemetryStore.js +49 -0
  256. package/dist/daemon/worker/TelemetryStore.js.map +1 -0
  257. package/dist/daemon/worker/collectors.d.ts +8 -0
  258. package/dist/daemon/worker/collectors.d.ts.map +1 -0
  259. package/dist/daemon/worker/collectors.js +19 -0
  260. package/dist/daemon/worker/collectors.js.map +1 -0
  261. package/dist/daemon/worker/commandRegistry.d.ts +10 -0
  262. package/dist/daemon/worker/commandRegistry.d.ts.map +1 -0
  263. package/dist/daemon/worker/commandRegistry.js +289 -0
  264. package/dist/daemon/worker/commandRegistry.js.map +1 -0
  265. package/dist/daemon/worker/plugins.d.ts +21 -0
  266. package/dist/daemon/worker/plugins.d.ts.map +1 -0
  267. package/dist/daemon/worker/plugins.js +71 -0
  268. package/dist/daemon/worker/plugins.js.map +1 -0
  269. package/dist/daemon/worker/types.d.ts +13 -0
  270. package/dist/daemon/worker/types.d.ts.map +1 -0
  271. package/dist/daemon/worker/types.js +2 -0
  272. package/dist/daemon/worker/types.js.map +1 -0
  273. package/dist/daemon/worker.js +232 -484
  274. package/dist/daemon/worker.js.map +1 -1
  275. package/dist/help/machineReadableHelp.d.ts +100 -0
  276. package/dist/help/machineReadableHelp.d.ts.map +1 -0
  277. package/dist/help/machineReadableHelp.js +139 -0
  278. package/dist/help/machineReadableHelp.js.map +1 -0
  279. package/dist/index.js +18 -9
  280. package/dist/index.js.map +1 -1
  281. package/dist/ipc/__tests__/client.contract.test.js +2 -2
  282. package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
  283. package/dist/ipc/client.d.ts +16 -1
  284. package/dist/ipc/client.d.ts.map +1 -1
  285. package/dist/ipc/client.js +40 -11
  286. package/dist/ipc/client.js.map +1 -1
  287. package/dist/ipc/commands.d.ts +20 -0
  288. package/dist/ipc/commands.d.ts.map +1 -1
  289. package/dist/ipc/commands.js +4 -0
  290. package/dist/ipc/commands.js.map +1 -1
  291. package/dist/ipc/types.d.ts +2 -0
  292. package/dist/ipc/types.d.ts.map +1 -1
  293. package/dist/session/BdgSession.d.ts +91 -0
  294. package/dist/session/BdgSession.d.ts.map +1 -0
  295. package/dist/session/BdgSession.js +230 -0
  296. package/dist/session/BdgSession.js.map +1 -0
  297. package/dist/session/cleanup.d.ts.map +1 -1
  298. package/dist/session/cleanup.js +67 -65
  299. package/dist/session/cleanup.js.map +1 -1
  300. package/dist/session/fileOps.d.ts +25 -0
  301. package/dist/session/fileOps.d.ts.map +1 -0
  302. package/dist/session/fileOps.js +39 -0
  303. package/dist/session/fileOps.js.map +1 -0
  304. package/dist/session/metadata.js +2 -2
  305. package/dist/session/metadata.js.map +1 -1
  306. package/dist/session/paths.d.ts +2 -7
  307. package/dist/session/paths.d.ts.map +1 -1
  308. package/dist/session/paths.js +8 -8
  309. package/dist/session/paths.js.map +1 -1
  310. package/dist/session/queryCache.js +1 -1
  311. package/dist/session/queryCache.js.map +1 -1
  312. package/dist/telemetry/__tests__/filters.unit.test.d.ts +2 -0
  313. package/dist/telemetry/__tests__/filters.unit.test.d.ts.map +1 -0
  314. package/dist/telemetry/__tests__/filters.unit.test.js +239 -0
  315. package/dist/telemetry/__tests__/filters.unit.test.js.map +1 -0
  316. package/dist/telemetry/console.d.ts +1 -1
  317. package/dist/telemetry/console.d.ts.map +1 -1
  318. package/dist/telemetry/console.js +5 -3
  319. package/dist/telemetry/console.js.map +1 -1
  320. package/dist/telemetry/dialogs.d.ts +27 -0
  321. package/dist/telemetry/dialogs.d.ts.map +1 -0
  322. package/dist/telemetry/dialogs.js +51 -0
  323. package/dist/telemetry/dialogs.js.map +1 -0
  324. package/dist/telemetry/filters.d.ts +148 -0
  325. package/dist/telemetry/filters.d.ts.map +1 -0
  326. package/dist/telemetry/filters.js +358 -0
  327. package/dist/telemetry/filters.js.map +1 -0
  328. package/dist/telemetry/navigation.d.ts +49 -0
  329. package/dist/telemetry/navigation.d.ts.map +1 -0
  330. package/dist/telemetry/navigation.js +69 -0
  331. package/dist/telemetry/navigation.js.map +1 -0
  332. package/dist/telemetry/network.d.ts +1 -0
  333. package/dist/telemetry/network.d.ts.map +1 -1
  334. package/dist/telemetry/network.js +23 -34
  335. package/dist/telemetry/network.js.map +1 -1
  336. package/dist/types.d.ts +26 -0
  337. package/dist/types.d.ts.map +1 -1
  338. package/dist/ui/errors/CommandError.d.ts +39 -0
  339. package/dist/ui/errors/CommandError.d.ts.map +1 -0
  340. package/dist/ui/errors/CommandError.js +48 -0
  341. package/dist/ui/errors/CommandError.js.map +1 -0
  342. package/dist/ui/errors/SystemErrors.d.ts +22 -0
  343. package/dist/ui/errors/SystemErrors.d.ts.map +1 -0
  344. package/dist/ui/errors/SystemErrors.js +23 -0
  345. package/dist/ui/errors/SystemErrors.js.map +1 -0
  346. package/dist/ui/errors/index.d.ts +9 -0
  347. package/dist/ui/errors/index.d.ts.map +1 -0
  348. package/dist/ui/errors/index.js +12 -0
  349. package/dist/ui/errors/index.js.map +1 -0
  350. package/dist/ui/errors/utils.d.ts +24 -0
  351. package/dist/ui/errors/utils.d.ts.map +1 -0
  352. package/dist/ui/errors/utils.js +28 -0
  353. package/dist/ui/errors/utils.js.map +1 -0
  354. package/dist/ui/errors.d.ts +39 -0
  355. package/dist/ui/errors.d.ts.map +1 -0
  356. package/dist/ui/errors.js +48 -0
  357. package/dist/ui/errors.js.map +1 -0
  358. package/dist/ui/formatters/cookies.d.ts.map +1 -1
  359. package/dist/ui/formatters/cookies.js +18 -21
  360. package/dist/ui/formatters/cookies.js.map +1 -1
  361. package/dist/ui/formatters/details.d.ts.map +1 -1
  362. package/dist/ui/formatters/details.js +34 -36
  363. package/dist/ui/formatters/details.js.map +1 -1
  364. package/dist/ui/formatters/dom.d.ts +135 -0
  365. package/dist/ui/formatters/dom.d.ts.map +1 -0
  366. package/dist/ui/formatters/dom.js +193 -0
  367. package/dist/ui/formatters/dom.js.map +1 -0
  368. package/dist/ui/formatters/index.d.ts +1 -0
  369. package/dist/ui/formatters/index.d.ts.map +1 -1
  370. package/dist/ui/formatters/index.js +1 -0
  371. package/dist/ui/formatters/index.js.map +1 -1
  372. package/dist/ui/formatters/preview.js +43 -38
  373. package/dist/ui/formatters/preview.js.map +1 -1
  374. package/dist/ui/formatters/status.d.ts.map +1 -1
  375. package/dist/ui/formatters/status.js +45 -45
  376. package/dist/ui/formatters/status.js.map +1 -1
  377. package/dist/ui/formatting.d.ts +104 -1
  378. package/dist/ui/formatting.d.ts.map +1 -1
  379. package/dist/ui/formatting.js +138 -2
  380. package/dist/ui/formatting.js.map +1 -1
  381. package/dist/ui/logging/index.d.ts +7 -0
  382. package/dist/ui/logging/index.d.ts.map +1 -0
  383. package/dist/ui/logging/index.js +7 -0
  384. package/dist/ui/logging/index.js.map +1 -0
  385. package/dist/ui/logging/logger.d.ts +98 -0
  386. package/dist/ui/logging/logger.d.ts.map +1 -0
  387. package/dist/ui/logging/logger.js +93 -0
  388. package/dist/ui/logging/logger.js.map +1 -0
  389. package/dist/ui/messages/chrome.d.ts +120 -1
  390. package/dist/ui/messages/chrome.d.ts.map +1 -1
  391. package/dist/ui/messages/chrome.js +168 -0
  392. package/dist/ui/messages/chrome.js.map +1 -1
  393. package/dist/ui/messages/debug.d.ts +4 -2
  394. package/dist/ui/messages/debug.d.ts.map +1 -1
  395. package/dist/ui/messages/debug.js +31 -29
  396. package/dist/ui/messages/debug.js.map +1 -1
  397. package/dist/ui/messages/deprecation.d.ts +30 -0
  398. package/dist/ui/messages/deprecation.d.ts.map +1 -0
  399. package/dist/ui/messages/deprecation.js +49 -0
  400. package/dist/ui/messages/deprecation.js.map +1 -0
  401. package/dist/ui/messages/errors.d.ts +11 -0
  402. package/dist/ui/messages/errors.d.ts.map +1 -1
  403. package/dist/ui/messages/errors.js +13 -0
  404. package/dist/ui/messages/errors.js.map +1 -1
  405. package/dist/ui/messages/preview.d.ts +24 -0
  406. package/dist/ui/messages/preview.d.ts.map +1 -1
  407. package/dist/ui/messages/preview.js +32 -1
  408. package/dist/ui/messages/preview.js.map +1 -1
  409. package/dist/ui/messages/session.d.ts.map +1 -1
  410. package/dist/ui/messages/session.js +21 -7
  411. package/dist/ui/messages/session.js.map +1 -1
  412. package/dist/ui/messages/validation.d.ts +14 -0
  413. package/dist/ui/messages/validation.d.ts.map +1 -1
  414. package/dist/ui/messages/validation.js +16 -0
  415. package/dist/ui/messages/validation.js.map +1 -1
  416. package/dist/utils/__tests__/session.contract.test.js +15 -1
  417. package/dist/utils/__tests__/session.contract.test.js.map +1 -1
  418. package/dist/utils/filters.d.ts +40 -0
  419. package/dist/utils/filters.d.ts.map +1 -1
  420. package/dist/utils/filters.js +55 -1
  421. package/dist/utils/filters.js.map +1 -1
  422. package/dist/utils/pageReadiness.d.ts +9 -14
  423. package/dist/utils/pageReadiness.d.ts.map +1 -1
  424. package/dist/utils/pageReadiness.js +40 -41
  425. package/dist/utils/pageReadiness.js.map +1 -1
  426. package/dist/utils/session.d.ts +200 -0
  427. package/dist/utils/session.d.ts.map +1 -0
  428. package/dist/utils/session.js +498 -0
  429. package/dist/utils/session.js.map +1 -0
  430. package/dist/utils/url.d.ts +58 -6
  431. package/dist/utils/url.d.ts.map +1 -1
  432. package/dist/utils/url.js +137 -20
  433. package/dist/utils/url.js.map +1 -1
  434. package/dist/utils/validation.d.ts +12 -0
  435. package/dist/utils/validation.d.ts.map +1 -0
  436. package/dist/utils/validation.js +20 -0
  437. package/dist/utils/validation.js.map +1 -0
  438. package/package.json +3 -5
  439. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +0 -24
  440. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +0 -1
  441. package/dist/cli/commands/__tests__/cdp.contract.test.js +0 -467
  442. package/dist/cli/commands/__tests__/cdp.contract.test.js.map +0 -1
  443. package/dist/cli/commands/cdp.d.ts +0 -8
  444. package/dist/cli/commands/cdp.d.ts.map +0 -1
  445. package/dist/cli/commands/cdp.js +0 -45
  446. package/dist/cli/commands/cdp.js.map +0 -1
  447. package/dist/cli/commands/console.d.ts +0 -8
  448. package/dist/cli/commands/console.d.ts.map +0 -1
  449. package/dist/cli/commands/console.js +0 -97
  450. package/dist/cli/commands/console.js.map +0 -1
  451. package/dist/cli/commands/dom/helpers/domCache.d.ts +0 -36
  452. package/dist/cli/commands/dom/helpers/domCache.d.ts.map +0 -1
  453. package/dist/cli/commands/dom/helpers/domCache.js +0 -65
  454. package/dist/cli/commands/dom/helpers/domCache.js.map +0 -1
  455. package/dist/cli/commands/dom/helpers/domQuery.d.ts +0 -48
  456. package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +0 -1
  457. package/dist/cli/commands/dom/helpers/domQuery.js +0 -104
  458. package/dist/cli/commands/dom/helpers/domQuery.js.map +0 -1
  459. package/dist/cli/commands/dom/helpers/errorHandler.d.ts +0 -45
  460. package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +0 -1
  461. package/dist/cli/commands/dom/helpers/errorHandler.js +0 -71
  462. package/dist/cli/commands/dom/helpers/errorHandler.js.map +0 -1
  463. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +0 -52
  464. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +0 -1
  465. package/dist/cli/commands/dom/helpers/evalHelpers.js +0 -75
  466. package/dist/cli/commands/dom/helpers/evalHelpers.js.map +0 -1
  467. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +0 -35
  468. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +0 -1
  469. package/dist/cli/commands/dom/helpers/optionsBuilder.js +0 -51
  470. package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +0 -1
  471. package/dist/cli/commands/dom/helpers/selectorParser.d.ts +0 -20
  472. package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +0 -1
  473. package/dist/cli/commands/dom/helpers/selectorParser.js +0 -20
  474. package/dist/cli/commands/dom/helpers/selectorParser.js.map +0 -1
  475. package/dist/cli/commands/dom/index.d.ts +0 -8
  476. package/dist/cli/commands/dom/index.d.ts.map +0 -1
  477. package/dist/cli/commands/dom/index.js +0 -257
  478. package/dist/cli/commands/dom/index.js.map +0 -1
  479. package/dist/cli/commands/dom.d.ts +0 -8
  480. package/dist/cli/commands/dom.d.ts.map +0 -1
  481. package/dist/cli/commands/dom.js +0 -257
  482. package/dist/cli/commands/dom.js.map +0 -1
  483. package/dist/cli/commands/domErrorHandler.d.ts +0 -45
  484. package/dist/cli/commands/domErrorHandler.d.ts.map +0 -1
  485. package/dist/cli/commands/domErrorHandler.js +0 -71
  486. package/dist/cli/commands/domErrorHandler.js.map +0 -1
  487. package/dist/cli/commands/domEvalHelpers.d.ts +0 -52
  488. package/dist/cli/commands/domEvalHelpers.d.ts.map +0 -1
  489. package/dist/cli/commands/domEvalHelpers.js +0 -76
  490. package/dist/cli/commands/domEvalHelpers.js.map +0 -1
  491. package/dist/cli/commands/domOptionsBuilder.d.ts +0 -35
  492. package/dist/cli/commands/domOptionsBuilder.d.ts.map +0 -1
  493. package/dist/cli/commands/domOptionsBuilder.js +0 -51
  494. package/dist/cli/commands/domOptionsBuilder.js.map +0 -1
  495. package/dist/cli/commands/domSelectorParser.d.ts +0 -20
  496. package/dist/cli/commands/domSelectorParser.d.ts.map +0 -1
  497. package/dist/cli/commands/domSelectorParser.js +0 -20
  498. package/dist/cli/commands/domSelectorParser.js.map +0 -1
  499. package/dist/cli/commands/network.d.ts +0 -8
  500. package/dist/cli/commands/network.d.ts.map +0 -1
  501. package/dist/cli/commands/network.js +0 -43
  502. package/dist/cli/commands/network.js.map +0 -1
  503. package/dist/cli/handlers/CommandRunner.d.ts +0 -60
  504. package/dist/cli/handlers/CommandRunner.d.ts.map +0 -1
  505. package/dist/cli/handlers/CommandRunner.js +0 -81
  506. package/dist/cli/handlers/CommandRunner.js.map +0 -1
  507. package/dist/cli/handlers/commonOptions.d.ts +0 -54
  508. package/dist/cli/handlers/commonOptions.d.ts.map +0 -1
  509. package/dist/cli/handlers/commonOptions.js +0 -64
  510. package/dist/cli/handlers/commonOptions.js.map +0 -1
  511. package/dist/cli/handlers/daemonSessionController.d.ts +0 -23
  512. package/dist/cli/handlers/daemonSessionController.d.ts.map +0 -1
  513. package/dist/cli/handlers/daemonSessionController.js +0 -79
  514. package/dist/cli/handlers/daemonSessionController.js.map +0 -1
  515. package/dist/cli/handlers/landingPage.d.ts +0 -8
  516. package/dist/cli/handlers/landingPage.d.ts.map +0 -1
  517. package/dist/cli/handlers/landingPage.js +0 -8
  518. package/dist/cli/handlers/landingPage.js.map +0 -1
  519. package/dist/collectors/__tests__/network.contract.test.d.ts +0 -28
  520. package/dist/collectors/__tests__/network.contract.test.d.ts.map +0 -1
  521. package/dist/collectors/__tests__/network.contract.test.js +0 -540
  522. package/dist/collectors/__tests__/network.contract.test.js.map +0 -1
  523. package/dist/commandRegistry.d.ts +0 -11
  524. package/dist/commandRegistry.d.ts.map +0 -1
  525. package/dist/commandRegistry.js +0 -45
  526. package/dist/commandRegistry.js.map +0 -1
  527. package/dist/commands/domErrorHandler.d.ts +0 -45
  528. package/dist/commands/domErrorHandler.d.ts.map +0 -1
  529. package/dist/commands/domErrorHandler.js +0 -71
  530. package/dist/commands/domErrorHandler.js.map +0 -1
  531. package/dist/dom/cache.d.ts +0 -36
  532. package/dist/dom/cache.d.ts.map +0 -1
  533. package/dist/dom/cache.js +0 -65
  534. package/dist/dom/cache.js.map +0 -1
  535. package/dist/dom/index.d.ts +0 -9
  536. package/dist/dom/index.d.ts.map +0 -1
  537. package/dist/dom/index.js +0 -9
  538. package/dist/dom/index.js.map +0 -1
  539. package/dist/dom/query.d.ts +0 -48
  540. package/dist/dom/query.d.ts.map +0 -1
  541. package/dist/dom/query.js +0 -104
  542. package/dist/dom/query.js.map +0 -1
  543. package/dist/utils/formatters/network.d.ts +0 -23
  544. package/dist/utils/formatters/network.d.ts.map +0 -1
  545. package/dist/utils/formatters/network.js +0 -35
  546. package/dist/utils/formatters/network.js.map +0 -1
  547. package/dist/utils/ui.d.ts +0 -36
  548. package/dist/utils/ui.d.ts.map +0 -1
  549. package/dist/utils/ui.js +0 -47
  550. package/dist/utils/ui.js.map +0 -1
  551. package/dist/utils/url/safeParseUrl.d.ts +0 -63
  552. package/dist/utils/url/safeParseUrl.d.ts.map +0 -1
  553. package/dist/utils/url/safeParseUrl.js +0 -84
  554. package/dist/utils/url/safeParseUrl.js.map +0 -1
package/README.md CHANGED
@@ -5,7 +5,23 @@
5
5
  [![Security](https://github.com/szymdzum/browser-debugger-cli/actions/workflows/security.yml/badge.svg)](https://github.com/szymdzum/browser-debugger-cli/actions/workflows/security.yml)
6
6
  [![npm downloads](https://img.shields.io/npm/dt/browser-debugger-cli?color=blue)](https://www.npmjs.com/package/browser-debugger-cli)
7
7
 
8
- DevTools telemetry in your terminal. For humans and agents. Direct WebSocket to Chrome's debugging port. Stream DOM, network, and console data straight to stdout. Pipe it, grep it, feed it to agents for full context debugging.
8
+ Chrome DevTools Protocol in your terminal. Run any CDP command, pipe the output, build browser automation with tools you already know. Design to be agent friendly
9
+
10
+ ## Why This Exists
11
+ Puppeteer is great but heavy. CDP is powerful but raw. This tool sits in between: direct protocol access with session management and a few helpful wrappers. No abstractions hiding what's actually happening.
12
+ Built for debugging web apps and scripting browser automation without spinning up a full testing framework.
13
+
14
+ ## Current State
15
+
16
+ **Raw [CDP](https://chromedevtools.github.io/devtools-protocol/) access is complete.** All 300+ protocol methods work now. This makes it immediately useful for AI agents and developers comfortable with CDP.
17
+
18
+ **Human-friendly wrappers are in progress.** Commands like `bdg dom query` and `bdg peek` are being added for common operations. For now, most automation work happens through `bdg cdp` and Unix pipes.
19
+
20
+ ## Demo
21
+
22
+ [![asciicast](https://asciinema.org/a/RE6Iup9sB1iSWBK0wgUUn3bBl.svg)](https://asciinema.org/a/RE6Iup9sB1iSWBK0wgUUn3bBl)
23
+
24
+ *Watch bdg scrape GitHub trending pages and extract repository data in real-time using DOM queries and CDP.*
9
25
 
10
26
  ## Installation
11
27
 
@@ -13,178 +29,173 @@ DevTools telemetry in your terminal. For humans and agents. Direct WebSocket to
13
29
  npm install -g browser-debugger-cli@alpha
14
30
  ```
15
31
 
32
+ **Platform Support:**
33
+ - ✅ macOS and Linux (native support)
34
+ - ✅ Windows via WSL (Windows Subsystem for Linux)
35
+ - ❌ PowerShell and Git Bash on Windows (not yet supported)
36
+
37
+ The CLI uses Unix domain sockets for inter-process communication. Windows users should run bdg inside WSL for full compatibility.
38
+
16
39
  ## Quick Start
17
40
 
18
41
  ```bash
19
- # Start session (opens example.com in Chrome)
42
+ # Start a session
20
43
  bdg example.com
21
44
 
22
- # Daemon starts in background, Chrome opens
23
- # Session is active - you can now run commands
24
-
25
- # Check session status
26
- bdg status
27
- # Status: Active
28
- # Worker PID: 12345
29
- # Chrome PID: 67890
30
- # Target: http://example.com
31
-
32
- # Execute raw CDP commands
45
+ # Run any CDP command
33
46
  bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
34
- # { "result": { "type": "string", "value": "Example Domain" } }
35
-
36
47
  bdg cdp Network.getCookies
37
- # { "cookies": [...] }
38
48
 
39
- # Stop session
49
+ # Check what's running
50
+ bdg status
51
+
52
+ # Done
40
53
  bdg stop
41
54
  ```
42
55
 
43
- ## How It Works
56
+ ## What You Can Do
57
+
58
+ ### Run Any CDP Command
59
+
60
+ All 300+ methods from [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) work out of the box:
61
+
62
+ ```bash
63
+ # Get cookies and filter with jq
64
+ bdg cdp Network.getCookies | jq '.cookies[] | select(.httpOnly)'
65
+
66
+ # Execute JavaScript in the page
67
+ bdg cdp Runtime.evaluate --params '{"expression":"document.querySelectorAll(\"a\").length","returnByValue":true}'
68
+
69
+ # Monitor memory usage
70
+ bdg cdp Performance.getMetrics | jq '.metrics[] | select(.name == "JSHeapUsedSize")'
71
+
72
+ # Capture a screenshot
73
+ bdg cdp Page.captureScreenshot | jq -r '.data' | base64 -d > screenshot.png
74
+ ```
44
75
 
45
- `bdg` is built on a **layered architecture** — raw CDP access with human-friendly wrappers on top.
76
+ The daemon keeps a WebSocket open to Chrome, so commands run immediately against the live session.
46
77
 
47
- ### Layer 1: Raw CDP Access ✅
78
+ ### Pipe Everything
48
79
 
49
- Direct access to **60+ domains, 300+ methods** from [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/):
80
+ Output is JSON by default. Use it with `jq`, `grep`, `awk` - whatever works:
50
81
 
51
82
  ```bash
52
- # Execute any CDP method
53
- bdg cdp Network.getCookies
54
- bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
55
- bdg cdp Performance.getMetrics
83
+ # Find all failed network requests
84
+ bdg peek --network --json | jq '.data.network[] | select(.status >= 400)'
56
85
 
57
- # Pipe to jq for filtering
58
- bdg cdp Network.getCookies | jq '.cookies[] | select(.name == "session")'
86
+ # Extract every link on the page
87
+ bdg cdp Runtime.evaluate --params '{
88
+ "expression": "Array.from(document.querySelectorAll(\"a\")).map(a => ({text: a.textContent.trim(), href: a.href}))",
89
+ "returnByValue": true
90
+ }' | jq '.result.value'
91
+
92
+ # Count console errors
93
+ bdg peek --console --json | jq '[.data.console[] | select(.level == "error")] | length'
59
94
  ```
60
95
 
61
- **Why raw CDP first?**
62
- - ✅ Zero abstraction overhead — direct WebSocket to Chrome
63
- - ✅ Full protocol power — all CDP methods work immediately
64
- - ✅ Future-proof — new CDP features work without code changes
65
- - ✅ Agent-friendly — structured input/output, composable with Unix tools
96
+ ### For AI Agents
97
+
98
+ Claude skill included at `.claude/skills/bdg/` with working automation patterns:
66
99
 
67
- ### Layer 2: Human-Friendly Wrappers 🚧
100
+ - Common CDP workflows (scraping, polling, navigation)
101
+ - Exit codes and error handling
102
+ - Troubleshooting reference
68
103
 
69
- Building ergonomic commands on top of raw CDP for common workflows:
104
+ The `--help --json` flag outputs the complete CLI schema for programmatic discovery:
70
105
 
71
106
  ```bash
72
- # Session management
73
- bdg status # Check active session
74
- bdg stop # Stop session gracefully
75
- bdg cleanup # Clean up stale sessions
76
-
77
- # Data inspection
78
- bdg peek # Quick preview of collected data
79
- bdg peek --follow # Live updates every second
80
- bdg details # Full details for specific items
81
- bdg dom query # Query DOM elements
82
- bdg dom eval # Execute JavaScript in browser context
83
- bdg dom highlight # Highlight elements visually
84
- bdg dom get # Get full HTML for elements
107
+ bdg --help --json | jq '.command.subcommands[].name'
108
+ bdg --help --json | jq '.exitCodes'
85
109
  ```
86
110
 
87
- **Progressive disclosure**: Start with raw CDP power, add convenience wrappers for common patterns.
111
+ Agents can figure out what commands exist and how to use them without hardcoded knowledge.
88
112
 
89
- **Why CLI over protocol servers?**
90
- - **Token efficiency**: CDP is in the model's training data (~3k tokens for patterns vs. 5-10k for MCP server definitions)
91
- - **Composability**: Unix pipes with `jq`, `grep`, `awk` — tools models already know
92
- - **Transparent errors**: See exactly what failed, no protocol layers hiding issues
93
- - **Real-time evolution**: Update patterns anytime, no server redeployment
113
+ ### Debug Live Apps
94
114
 
95
- ## Available Commands
115
+ Point at localhost, monitor what's happening:
96
116
 
97
- ### Raw CDP Access
117
+ ```bash
118
+ bdg localhost:3000 --headless
119
+ bdg tail --console # Stream console output
120
+ bdg tail --network # Watch requests in real-time
121
+ ```
122
+
123
+ Helpful for catching issues during development without opening DevTools.
124
+
125
+ ### Automate Browser Tasks
98
126
 
99
- Full Chrome DevTools Protocol access via `bdg cdp` command – **any CDP method works**:
127
+ Poll for elements, click buttons, extract data:
100
128
 
101
129
  ```bash
102
- # Get all cookies (raw CDP)
103
- bdg cdp Network.getCookies
104
- # {
105
- # "cookies": [
106
- # {
107
- # "name": "session_id",
108
- # "value": "1234567890abcdef",
109
- # "domain": "example.com",
110
- # "httpOnly": true,
111
- # "secure": true,
112
- # "sameSite": "Strict"
113
- # }
114
- # ]
115
- # }
116
-
117
- # Evaluate JavaScript
118
- bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
119
- # {
120
- # "result": {
121
- # "type": "string",
122
- # "value": "Example Domain"
123
- # }
124
- # }
125
-
126
- # Get browser version
127
- bdg cdp Browser.getVersion
128
- # {
129
- # "protocolVersion": "1.3",
130
- # "product": "Chrome/142.0.7444.60",
131
- # "jsVersion": "14.2.231.14"
132
- # }
133
-
134
- # Pipe to jq for filtering
135
- bdg cdp Network.getCookies | jq '.cookies[] | select(.name == "session_id") | .value'
136
- # "1234567890abcdef"
130
+ # Wait for an element to appear
131
+ while ! bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\"#target\") !== null","returnByValue":true}' | jq -e '.result.value'; do
132
+ sleep 0.5
133
+ done
134
+
135
+ # Click it
136
+ bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\"#target\").click()"}'
137
+
138
+ # Get the result
139
+ bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\".result\").textContent","returnByValue":true}'
137
140
  ```
138
141
 
139
- **60+ domains, 300+ methods** from the [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) are available.
142
+ Check `.claude/skills/bdg/WORKFLOWS.md` for more complete examples (GitHub scraper, form automation, etc).
143
+
144
+ ## Session Management
140
145
 
141
- ### Session Management
146
+ Sessions persist until you stop them. Chrome stays open, data keeps collecting:
142
147
 
143
148
  ```bash
144
- # Start session
145
- bdg example.com # Opens Chrome with daemon in background
149
+ bdg example.com # Opens Chrome, starts daemon
150
+ bdg status # Check what's running
151
+ bdg status --verbose # Show Chrome process details
152
+ bdg stop # Kill everything
153
+ bdg cleanup # Remove stale files
154
+ ```
146
155
 
147
- # Check if session is active
148
- bdg status # Show session info
149
- bdg status --verbose # Include Chrome diagnostics
156
+ ## Helper Commands
150
157
 
151
- # Stop session
152
- bdg stop # Gracefully stop daemon and close Chrome
158
+ A few convenience wrappers for common operations. Most work still happens through `bdg cdp`:
153
159
 
154
- # Clean up stale sessions
155
- bdg cleanup # Remove stale session files
156
- bdg cleanup --force # Force cleanup even if session appears active
160
+ ```bash
161
+ # Query DOM
162
+ bdg dom query "button.primary" # Find elements
163
+ bdg dom get "button.primary" # Get HTML
164
+ bdg dom eval "document.title" # Run JavaScript
165
+ bdg dom highlight ".navbar" # Visual debugging
166
+
167
+ # Inspect collected data
168
+ bdg peek # Quick snapshot
169
+ bdg peek --network # Just network data
170
+ bdg tail # Stream like tail -f
157
171
  ```
158
172
 
159
- ## Technical Overview
173
+ ## Page Readiness
160
174
 
161
- `bdg` runs a daemon that maintains a WebSocket connection to Chrome's debugging port.
162
- When you run commands like `bdg network` or `bdg console`, they communicate with the
163
- daemon via IPC, which forwards [Chrome DevTools
164
- Protocol](https://chromedevtools.github.io/devtools-protocol/) commands and streams
165
- responses back.
175
+ By default, `bdg` waits for pages to fully load using three signals:
166
176
 
167
- **Architecture:**
168
- - **Daemon** – Background process managing Chrome connection lifecycle
169
- - **IPC** – Unix sockets for CLI ↔ daemon communication
170
- - **WebSocket** – Direct connection to Chrome's `--remote-debugging-port`
171
- - **CDP** – Native Chrome DevTools Protocol for all browser inspection
177
+ 1. Browser's `window.onload` fires
178
+ 2. Network goes quiet (200ms without new requests)
179
+ 3. DOM stops changing (300ms without mutations)
172
180
 
173
- **Benefits:**
174
- - Sessions persist across commands (Chrome stays open)
175
- - Live queries without stopping collection
176
- - No intermediate files data flows from Chrome to stdout
177
- - Real CDP with full protocol access
181
+ Catches server-rendered HTML, client hydration, and lazy-loaded content. Works with Next.js, React, Vue, whatever. Times out after 5 seconds if something hangs.
178
182
 
179
- ## Contributing
183
+ Skip it with `--no-wait` if you want immediate connection.
180
184
 
181
- Contributions welcome! But honestly, I'd just be happy if you give it a try.
185
+ ## Architecture
186
+
187
+ Three processes:
188
+
189
+ - **CLI** talks to daemon via Unix socket
190
+ - **Daemon** manages Chrome and routes commands
191
+ - **Worker** holds the WebSocket to CDP
192
+
193
+ Chrome stays running between commands. No startup cost for each operation.
194
+
195
+ ## Contributing
182
196
 
183
- Let me know how you use it
184
- ([discussions](https://github.com/szymdzum/browser-debugger-cli/discussions)), let me
185
- know what's broken
186
- ([issues](https://github.com/szymdzum/browser-debugger-cli/issues/new)).
197
+ If you use this and something breaks, [open an issue](https://github.com/szymdzum/browser-debugger-cli/issues/new). If you have ideas, start a [discussion](https://github.com/szymdzum/browser-debugger-cli/discussions). PRs welcome.
187
198
 
188
199
  ## License
189
200
 
190
- MIT – see [LICENSE](LICENSE) for details.
201
+ MIT
@@ -0,0 +1,47 @@
1
+ {
2
+ "version": "0.2.1",
3
+ "success": true,
4
+ "timestamp": "2025-11-06T20:00:00.000Z",
5
+ "duration": 4500,
6
+ "target": {
7
+ "url": "https://example.com/",
8
+ "title": "Example Domain"
9
+ },
10
+ "data": {
11
+ "network": [
12
+ {
13
+ "requestId": "1000.1",
14
+ "url": "https://example.com/",
15
+ "method": "GET",
16
+ "timestamp": 1730923200000,
17
+ "status": 200,
18
+ "mimeType": "text/html",
19
+ "requestHeaders": {
20
+ "User-Agent": "Chrome/120.0.0.0"
21
+ },
22
+ "responseHeaders": {
23
+ "Content-Type": "text/html; charset=UTF-8"
24
+ },
25
+ "responseBody": "<!DOCTYPE html><html>...</html>"
26
+ }
27
+ ],
28
+ "console": [
29
+ {
30
+ "type": "log",
31
+ "text": "Page loaded",
32
+ "timestamp": 1730923201000,
33
+ "args": [
34
+ {
35
+ "type": "string",
36
+ "value": "Page loaded"
37
+ }
38
+ ]
39
+ }
40
+ ],
41
+ "dom": {
42
+ "url": "https://example.com/",
43
+ "title": "Example Domain",
44
+ "outerHTML": "<!DOCTYPE html><html><head><title>Example Domain</title></head><body><h1>Example Domain</h1></body></html>"
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Schema contract tests
3
+ *
4
+ * These tests lock the JSON schema shape to prevent breaking changes.
5
+ * Golden files define the expected structure that consumers depend on.
6
+ *
7
+ * Test philosophy:
8
+ * - Ensure all required fields are present with correct types
9
+ * - Detect unexpected fields (potential breaking changes)
10
+ * - Validate nested structure matches interface definitions
11
+ * - Test both success and error output formats
12
+ *
13
+ * When tests fail:
14
+ * 1. If adding optional fields → Update golden file, bump minor version
15
+ * 2. If changing existing fields → This is a BREAKING CHANGE, requires major version bump
16
+ * 3. If removing fields → This is a BREAKING CHANGE, requires major version bump
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=schema.contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Schema contract tests
3
+ *
4
+ * These tests lock the JSON schema shape to prevent breaking changes.
5
+ * Golden files define the expected structure that consumers depend on.
6
+ *
7
+ * Test philosophy:
8
+ * - Ensure all required fields are present with correct types
9
+ * - Detect unexpected fields (potential breaking changes)
10
+ * - Validate nested structure matches interface definitions
11
+ * - Test both success and error output formats
12
+ *
13
+ * When tests fail:
14
+ * 1. If adding optional fields → Update golden file, bump minor version
15
+ * 2. If changing existing fields → This is a BREAKING CHANGE, requires major version bump
16
+ * 3. If removing fields → This is a BREAKING CHANGE, requires major version bump
17
+ */
18
+ import assert from 'node:assert/strict';
19
+ import fs from 'node:fs';
20
+ import path from 'node:path';
21
+ import { describe, it } from 'node:test';
22
+ import { fileURLToPath } from 'node:url';
23
+ const __filename = fileURLToPath(import.meta.url);
24
+ const __dirname = path.dirname(__filename);
25
+ /**
26
+ * Load golden file from fixtures directory
27
+ */
28
+ function loadGoldenFile(filename) {
29
+ const goldenPath = path.join(__dirname, 'fixtures', filename);
30
+ const content = fs.readFileSync(goldenPath, 'utf-8');
31
+ return JSON.parse(content);
32
+ }
33
+ describe('BdgOutput schema contract', () => {
34
+ describe('v0.2.1 schema', () => {
35
+ let golden;
36
+ it('should load golden file successfully', () => {
37
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
38
+ assert.ok(golden, 'Golden file should load');
39
+ });
40
+ it('should have all required top-level fields', () => {
41
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
42
+ // Required fields
43
+ assert.equal(typeof golden.version, 'string', 'version must be string');
44
+ assert.equal(typeof golden.success, 'boolean', 'success must be boolean');
45
+ assert.equal(typeof golden.timestamp, 'string', 'timestamp must be string');
46
+ assert.equal(typeof golden.duration, 'number', 'duration must be number');
47
+ assert.ok(golden.target, 'target must be present');
48
+ assert.ok(golden.data, 'data must be present');
49
+ // Validate ISO8601 timestamp format
50
+ assert.ok(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(golden.timestamp), 'timestamp must be ISO8601 format');
51
+ });
52
+ it('should have target structure with url and title', () => {
53
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
54
+ assert.equal(typeof golden.target.url, 'string', 'target.url must be string');
55
+ assert.equal(typeof golden.target.title, 'string', 'target.title must be string');
56
+ // Should not have extra fields
57
+ const targetKeys = Object.keys(golden.target);
58
+ assert.deepEqual(targetKeys.sort(), ['title', 'url'].sort(), 'target should only have url and title');
59
+ });
60
+ it('should have data object with optional telemetry arrays', () => {
61
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
62
+ assert.equal(typeof golden.data, 'object', 'data must be object');
63
+ // Validate network array if present
64
+ if (golden.data.network !== undefined) {
65
+ assert.ok(Array.isArray(golden.data.network), 'data.network must be array');
66
+ }
67
+ // Validate console array if present
68
+ if (golden.data.console !== undefined) {
69
+ assert.ok(Array.isArray(golden.data.console), 'data.console must be array');
70
+ }
71
+ // Validate dom object if present
72
+ if (golden.data.dom !== undefined) {
73
+ assert.equal(typeof golden.data.dom, 'object', 'data.dom must be object');
74
+ }
75
+ // Should only have known telemetry types
76
+ const dataKeys = Object.keys(golden.data);
77
+ const allowedKeys = ['network', 'console', 'dom'];
78
+ for (const key of dataKeys) {
79
+ assert.ok(allowedKeys.includes(key), `data.${key} is not a known telemetry type. Allowed: ${allowedKeys.join(', ')}`);
80
+ }
81
+ });
82
+ it('should validate NetworkRequest structure', () => {
83
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
84
+ if (!golden.data.network || golden.data.network.length === 0) {
85
+ assert.fail('Golden file must have at least one network request for validation');
86
+ }
87
+ const request = golden.data.network[0];
88
+ // Required fields
89
+ assert.equal(typeof request.requestId, 'string', 'requestId must be string');
90
+ assert.equal(typeof request.url, 'string', 'url must be string');
91
+ assert.equal(typeof request.method, 'string', 'method must be string');
92
+ assert.equal(typeof request.timestamp, 'number', 'timestamp must be number');
93
+ // Optional fields with type validation
94
+ if (request.status !== undefined) {
95
+ assert.equal(typeof request.status, 'number', 'status must be number if present');
96
+ }
97
+ if (request.mimeType !== undefined) {
98
+ assert.equal(typeof request.mimeType, 'string', 'mimeType must be string if present');
99
+ }
100
+ if (request.requestHeaders !== undefined) {
101
+ assert.equal(typeof request.requestHeaders, 'object', 'requestHeaders must be object if present');
102
+ }
103
+ if (request.responseHeaders !== undefined) {
104
+ assert.equal(typeof request.responseHeaders, 'object', 'responseHeaders must be object if present');
105
+ }
106
+ if (request.requestBody !== undefined) {
107
+ assert.equal(typeof request.requestBody, 'string', 'requestBody must be string if present');
108
+ }
109
+ if (request.responseBody !== undefined) {
110
+ assert.equal(typeof request.responseBody, 'string', 'responseBody must be string if present');
111
+ }
112
+ // Validate no unexpected fields
113
+ const allowedKeys = [
114
+ 'requestId',
115
+ 'url',
116
+ 'method',
117
+ 'timestamp',
118
+ 'status',
119
+ 'mimeType',
120
+ 'requestHeaders',
121
+ 'responseHeaders',
122
+ 'requestBody',
123
+ 'responseBody',
124
+ ];
125
+ const requestKeys = Object.keys(request);
126
+ for (const key of requestKeys) {
127
+ assert.ok(allowedKeys.includes(key), `NetworkRequest.${key} is not in schema. Allowed: ${allowedKeys.join(', ')}`);
128
+ }
129
+ });
130
+ it('should validate ConsoleMessage structure', () => {
131
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
132
+ if (!golden.data.console || golden.data.console.length === 0) {
133
+ assert.fail('Golden file must have at least one console message for validation');
134
+ }
135
+ const message = golden.data.console[0];
136
+ // Required fields
137
+ assert.equal(typeof message.type, 'string', 'type must be string');
138
+ assert.equal(typeof message.text, 'string', 'text must be string');
139
+ assert.equal(typeof message.timestamp, 'number', 'timestamp must be number');
140
+ // Optional fields
141
+ if (message.args !== undefined) {
142
+ assert.ok(Array.isArray(message.args), 'args must be array if present');
143
+ }
144
+ // Validate no unexpected fields
145
+ const allowedKeys = ['type', 'text', 'timestamp', 'args'];
146
+ const messageKeys = Object.keys(message);
147
+ for (const key of messageKeys) {
148
+ assert.ok(allowedKeys.includes(key), `ConsoleMessage.${key} is not in schema. Allowed: ${allowedKeys.join(', ')}`);
149
+ }
150
+ });
151
+ it('should validate DOMData structure', () => {
152
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
153
+ if (!golden.data.dom) {
154
+ assert.fail('Golden file must have dom data for validation');
155
+ }
156
+ const dom = golden.data.dom;
157
+ // Required fields
158
+ assert.equal(typeof dom.url, 'string', 'url must be string');
159
+ assert.equal(typeof dom.title, 'string', 'title must be string');
160
+ assert.equal(typeof dom.outerHTML, 'string', 'outerHTML must be string');
161
+ // Validate no unexpected fields
162
+ const allowedKeys = ['url', 'title', 'outerHTML'];
163
+ const domKeys = Object.keys(dom);
164
+ for (const key of domKeys) {
165
+ assert.ok(allowedKeys.includes(key), `DOMData.${key} is not in schema. Allowed: ${allowedKeys.join(', ')}`);
166
+ }
167
+ });
168
+ it('should validate optional error field', () => {
169
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
170
+ // Error field is optional
171
+ if (golden.error !== undefined) {
172
+ assert.equal(typeof golden.error, 'string', 'error must be string if present');
173
+ }
174
+ });
175
+ it('should validate optional partial field', () => {
176
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
177
+ // Partial field is optional
178
+ if (golden.partial !== undefined) {
179
+ assert.equal(typeof golden.partial, 'boolean', 'partial must be boolean if present');
180
+ }
181
+ });
182
+ it('should detect unexpected top-level fields', () => {
183
+ golden = loadGoldenFile('schema-v0.2.1.golden.json');
184
+ const allowedTopLevelKeys = [
185
+ 'version',
186
+ 'success',
187
+ 'timestamp',
188
+ 'duration',
189
+ 'target',
190
+ 'data',
191
+ 'error',
192
+ 'partial',
193
+ ];
194
+ const actualKeys = Object.keys(golden);
195
+ for (const key of actualKeys) {
196
+ assert.ok(allowedTopLevelKeys.includes(key), `Unexpected top-level field: ${key}. This may be a breaking change.`);
197
+ }
198
+ });
199
+ });
200
+ describe('Error output format', () => {
201
+ it('should have success=false and error field on failure', () => {
202
+ const errorOutput = {
203
+ version: '0.2.1',
204
+ success: false,
205
+ timestamp: new Date().toISOString(),
206
+ duration: 1000,
207
+ target: { url: '', title: '' },
208
+ data: {},
209
+ error: 'Connection failed',
210
+ };
211
+ assert.equal(errorOutput.success, false, 'success must be false on error');
212
+ assert.equal(typeof errorOutput.error, 'string', 'error must be string');
213
+ assert.ok(errorOutput.error !== undefined, 'error must be defined');
214
+ assert.ok(errorOutput.error.length > 0, 'error message must not be empty');
215
+ });
216
+ });
217
+ describe('Partial output format', () => {
218
+ it('should have partial=true for live previews', () => {
219
+ const previewOutput = {
220
+ version: '0.2.1',
221
+ success: true,
222
+ timestamp: new Date().toISOString(),
223
+ duration: 1000,
224
+ target: { url: 'https://example.com', title: 'Example' },
225
+ data: {
226
+ network: [],
227
+ console: [],
228
+ },
229
+ partial: true,
230
+ };
231
+ assert.equal(previewOutput.partial, true, 'partial must be true for live previews');
232
+ assert.equal(previewOutput.success, true, 'success can be true with partial=true');
233
+ });
234
+ });
235
+ });
236
+ //# sourceMappingURL=schema.contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.contract.test.js","sourceRoot":"","sources":["../../src/__tests__/schema.contract.test.ts"],"names":[],"mappings":"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"}