browser-debugger-cli 0.3.0 → 0.6.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 (482) hide show
  1. package/README.md +182 -125
  2. package/dist/__tests__/smoke/error-handling.smoke.test.d.ts +8 -0
  3. package/dist/__tests__/smoke/error-handling.smoke.test.d.ts.map +1 -0
  4. package/dist/__tests__/smoke/error-handling.smoke.test.js +95 -0
  5. package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -0
  6. package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts +8 -0
  7. package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts.map +1 -0
  8. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +109 -0
  9. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -0
  10. package/dist/__testutils__/commandRunner.d.ts +45 -0
  11. package/dist/__testutils__/commandRunner.d.ts.map +1 -0
  12. package/dist/__testutils__/commandRunner.js +108 -0
  13. package/dist/__testutils__/commandRunner.js.map +1 -0
  14. package/dist/__testutils__/daemonHelpers.d.ts +81 -0
  15. package/dist/__testutils__/daemonHelpers.d.ts.map +1 -0
  16. package/dist/__testutils__/daemonHelpers.js +206 -0
  17. package/dist/__testutils__/daemonHelpers.js.map +1 -0
  18. package/dist/__testutils__/index.d.ts +1 -0
  19. package/dist/__testutils__/index.d.ts.map +1 -1
  20. package/dist/__testutils__/index.js +1 -0
  21. package/dist/__testutils__/index.js.map +1 -1
  22. package/dist/__testutils__/testCleanup.d.ts +45 -0
  23. package/dist/__testutils__/testCleanup.d.ts.map +1 -0
  24. package/dist/__testutils__/testCleanup.js +87 -0
  25. package/dist/__testutils__/testCleanup.js.map +1 -0
  26. package/dist/__testutils__/testHome.d.ts +26 -0
  27. package/dist/__testutils__/testHome.d.ts.map +1 -0
  28. package/dist/__testutils__/testHome.js +57 -0
  29. package/dist/__testutils__/testHome.js.map +1 -0
  30. package/dist/__testutils__/testProcess.d.ts.map +1 -1
  31. package/dist/__testutils__/testProcess.js +11 -3
  32. package/dist/__testutils__/testProcess.js.map +1 -1
  33. package/dist/cdp/protocol.d.ts +121 -0
  34. package/dist/cdp/protocol.d.ts.map +1 -0
  35. package/dist/cdp/protocol.js +215 -0
  36. package/dist/cdp/protocol.js.map +1 -0
  37. package/dist/cdp/schema.d.ts +159 -0
  38. package/dist/cdp/schema.d.ts.map +1 -0
  39. package/dist/cdp/schema.js +256 -0
  40. package/dist/cdp/schema.js.map +1 -0
  41. package/dist/cdp/types.d.ts +139 -0
  42. package/dist/cdp/types.d.ts.map +1 -0
  43. package/dist/cdp/types.js +7 -0
  44. package/dist/cdp/types.js.map +1 -0
  45. package/dist/commands/cdp.d.ts +10 -1
  46. package/dist/commands/cdp.d.ts.map +1 -1
  47. package/dist/commands/cdp.js +363 -26
  48. package/dist/commands/cdp.js.map +1 -1
  49. package/dist/commands/cleanup.d.ts.map +1 -1
  50. package/dist/commands/cleanup.js +15 -18
  51. package/dist/commands/cleanup.js.map +1 -1
  52. package/dist/commands/dom.d.ts.map +1 -1
  53. package/dist/commands/dom.js +14 -19
  54. package/dist/commands/dom.js.map +1 -1
  55. package/dist/commands/domEvalHelpers.d.ts +3 -16
  56. package/dist/commands/domEvalHelpers.d.ts.map +1 -1
  57. package/dist/commands/domEvalHelpers.js +56 -7
  58. package/dist/commands/domEvalHelpers.js.map +1 -1
  59. package/dist/commands/domOptionsBuilder.d.ts +32 -0
  60. package/dist/commands/domOptionsBuilder.d.ts.map +1 -1
  61. package/dist/commands/domOptionsBuilder.js +35 -0
  62. package/dist/commands/domOptionsBuilder.js.map +1 -1
  63. package/dist/commands/machineReadableHelp.d.ts +98 -0
  64. package/dist/commands/machineReadableHelp.d.ts.map +1 -0
  65. package/dist/commands/machineReadableHelp.js +137 -0
  66. package/dist/commands/machineReadableHelp.js.map +1 -0
  67. package/dist/commands/peek.d.ts.map +1 -1
  68. package/dist/commands/peek.js +12 -6
  69. package/dist/commands/peek.js.map +1 -1
  70. package/dist/commands/shared/CommandRunner.d.ts +2 -0
  71. package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
  72. package/dist/commands/shared/CommandRunner.js +15 -4
  73. package/dist/commands/shared/CommandRunner.js.map +1 -1
  74. package/dist/commands/shared/OutputBuilder.js +1 -1
  75. package/dist/commands/shared/OutputBuilder.js.map +1 -1
  76. package/dist/commands/shared/commonOptions.d.ts.map +1 -1
  77. package/dist/commands/shared/commonOptions.js +11 -5
  78. package/dist/commands/shared/commonOptions.js.map +1 -1
  79. package/dist/commands/shared/daemonSessionController.d.ts +2 -0
  80. package/dist/commands/shared/daemonSessionController.d.ts.map +1 -1
  81. package/dist/commands/shared/daemonSessionController.js +13 -16
  82. package/dist/commands/shared/daemonSessionController.js.map +1 -1
  83. package/dist/commands/shared/sessionController.js +1 -1
  84. package/dist/commands/shared/sessionController.js.map +1 -1
  85. package/dist/commands/start.d.ts.map +1 -1
  86. package/dist/commands/start.js +35 -11
  87. package/dist/commands/start.js.map +1 -1
  88. package/dist/commands/status.d.ts.map +1 -1
  89. package/dist/commands/status.js +74 -57
  90. package/dist/commands/status.js.map +1 -1
  91. package/dist/commands/stop.d.ts.map +1 -1
  92. package/dist/commands/stop.js +13 -27
  93. package/dist/commands/stop.js.map +1 -1
  94. package/dist/commands/tail.d.ts +11 -0
  95. package/dist/commands/tail.d.ts.map +1 -0
  96. package/dist/commands/tail.js +117 -0
  97. package/dist/commands/tail.js.map +1 -0
  98. package/dist/commands.d.ts.map +1 -1
  99. package/dist/commands.js +2 -0
  100. package/dist/commands.js.map +1 -1
  101. package/dist/connection/cdp.d.ts +46 -2
  102. package/dist/connection/cdp.d.ts.map +1 -1
  103. package/dist/connection/cdp.js +86 -7
  104. package/dist/connection/cdp.js.map +1 -1
  105. package/dist/{utils/chromeDiagnostics.d.ts → connection/diagnostics.d.ts} +1 -1
  106. package/dist/connection/diagnostics.d.ts.map +1 -0
  107. package/dist/{utils/chromeDiagnostics.js → connection/diagnostics.js} +1 -1
  108. package/dist/connection/diagnostics.js.map +1 -0
  109. package/dist/connection/domOperations.d.ts.map +1 -1
  110. package/dist/connection/domOperations.js +3 -1
  111. package/dist/connection/domOperations.js.map +1 -1
  112. package/dist/{utils → connection}/errors.d.ts +9 -17
  113. package/dist/connection/errors.d.ts.map +1 -0
  114. package/dist/{utils → connection}/errors.js +12 -17
  115. package/dist/connection/errors.js.map +1 -0
  116. package/dist/connection/handlers.d.ts +63 -0
  117. package/dist/connection/handlers.d.ts.map +1 -0
  118. package/dist/connection/handlers.js +64 -0
  119. package/dist/connection/handlers.js.map +1 -0
  120. package/dist/connection/launcher.d.ts +3 -20
  121. package/dist/connection/launcher.d.ts.map +1 -1
  122. package/dist/connection/launcher.js +141 -31
  123. package/dist/connection/launcher.js.map +1 -1
  124. package/dist/connection/pageReadiness.d.ts.map +1 -0
  125. package/dist/{utils → connection}/pageReadiness.js +30 -31
  126. package/dist/connection/pageReadiness.js.map +1 -0
  127. package/dist/connection/typed-cdp.d.ts +144 -0
  128. package/dist/connection/typed-cdp.d.ts.map +1 -0
  129. package/dist/connection/typed-cdp.js +120 -0
  130. package/dist/connection/typed-cdp.js.map +1 -0
  131. package/dist/constants.d.ts +20 -40
  132. package/dist/constants.d.ts.map +1 -1
  133. package/dist/constants.js +26 -40
  134. package/dist/constants.js.map +1 -1
  135. package/dist/daemon/ipcServer.d.ts +5 -7
  136. package/dist/daemon/ipcServer.d.ts.map +1 -1
  137. package/dist/daemon/ipcServer.js +178 -143
  138. package/dist/daemon/ipcServer.js.map +1 -1
  139. package/dist/daemon/launcher.js +1 -1
  140. package/dist/daemon/launcher.js.map +1 -1
  141. package/dist/daemon/server/SocketServer.d.ts +22 -0
  142. package/dist/daemon/server/SocketServer.d.ts.map +1 -0
  143. package/dist/daemon/server/SocketServer.js +67 -0
  144. package/dist/daemon/server/SocketServer.js.map +1 -0
  145. package/dist/daemon/server/WorkerManager.d.ts +36 -0
  146. package/dist/daemon/server/WorkerManager.d.ts.map +1 -0
  147. package/dist/daemon/server/WorkerManager.js +98 -0
  148. package/dist/daemon/server/WorkerManager.js.map +1 -0
  149. package/dist/daemon/startSession.d.ts +2 -0
  150. package/dist/daemon/startSession.d.ts.map +1 -1
  151. package/dist/daemon/startSession.js +4 -2
  152. package/dist/daemon/startSession.js.map +1 -1
  153. package/dist/daemon/worker/TelemetryStore.d.ts +18 -0
  154. package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -0
  155. package/dist/daemon/worker/TelemetryStore.js +49 -0
  156. package/dist/daemon/worker/TelemetryStore.js.map +1 -0
  157. package/dist/daemon/worker/collectors.d.ts +8 -0
  158. package/dist/daemon/worker/collectors.d.ts.map +1 -0
  159. package/dist/daemon/worker/collectors.js +19 -0
  160. package/dist/daemon/worker/collectors.js.map +1 -0
  161. package/dist/daemon/worker/commandRegistry.d.ts +10 -0
  162. package/dist/daemon/worker/commandRegistry.d.ts.map +1 -0
  163. package/dist/daemon/worker/commandRegistry.js +289 -0
  164. package/dist/daemon/worker/commandRegistry.js.map +1 -0
  165. package/dist/daemon/worker/plugins.d.ts +21 -0
  166. package/dist/daemon/worker/plugins.d.ts.map +1 -0
  167. package/dist/daemon/worker/plugins.js +71 -0
  168. package/dist/daemon/worker/plugins.js.map +1 -0
  169. package/dist/daemon/worker/types.d.ts +13 -0
  170. package/dist/daemon/worker/types.d.ts.map +1 -0
  171. package/dist/daemon/worker/types.js +2 -0
  172. package/dist/daemon/worker/types.js.map +1 -0
  173. package/dist/daemon/worker.js +206 -529
  174. package/dist/daemon/worker.js.map +1 -1
  175. package/dist/index.js +18 -9
  176. package/dist/index.js.map +1 -1
  177. package/dist/ipc/__tests__/client.contract.test.js +2 -2
  178. package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
  179. package/dist/ipc/client.d.ts +3 -1
  180. package/dist/ipc/client.d.ts.map +1 -1
  181. package/dist/ipc/client.js +27 -14
  182. package/dist/ipc/client.js.map +1 -1
  183. package/dist/ipc/commands.d.ts +1 -0
  184. package/dist/ipc/commands.d.ts.map +1 -1
  185. package/dist/ipc/commands.js.map +1 -1
  186. package/dist/ipc/types.d.ts +2 -0
  187. package/dist/ipc/types.d.ts.map +1 -1
  188. package/dist/session/cleanup.d.ts.map +1 -1
  189. package/dist/session/cleanup.js +67 -65
  190. package/dist/session/cleanup.js.map +1 -1
  191. package/dist/session/fileOps.d.ts +25 -0
  192. package/dist/session/fileOps.d.ts.map +1 -0
  193. package/dist/session/fileOps.js +39 -0
  194. package/dist/session/fileOps.js.map +1 -0
  195. package/dist/session/metadata.js +2 -2
  196. package/dist/session/metadata.js.map +1 -1
  197. package/dist/session/paths.d.ts +2 -7
  198. package/dist/session/paths.d.ts.map +1 -1
  199. package/dist/session/paths.js +8 -8
  200. package/dist/session/paths.js.map +1 -1
  201. package/dist/session/queryCache.js +1 -1
  202. package/dist/session/queryCache.js.map +1 -1
  203. package/dist/telemetry/__tests__/filters.unit.test.d.ts.map +1 -0
  204. package/dist/{utils → telemetry}/__tests__/filters.unit.test.js +1 -1
  205. package/dist/telemetry/__tests__/filters.unit.test.js.map +1 -0
  206. package/dist/telemetry/__tests__/network.contract.test.js +124 -93
  207. package/dist/telemetry/__tests__/network.contract.test.js.map +1 -1
  208. package/dist/telemetry/console.d.ts +1 -1
  209. package/dist/telemetry/console.d.ts.map +1 -1
  210. package/dist/telemetry/console.js +8 -5
  211. package/dist/telemetry/console.js.map +1 -1
  212. package/dist/telemetry/dialogs.d.ts +27 -0
  213. package/dist/telemetry/dialogs.d.ts.map +1 -0
  214. package/dist/telemetry/dialogs.js +51 -0
  215. package/dist/telemetry/dialogs.js.map +1 -0
  216. package/dist/telemetry/dom.d.ts.map +1 -1
  217. package/dist/telemetry/dom.js +3 -1
  218. package/dist/telemetry/dom.js.map +1 -1
  219. package/dist/{utils → telemetry}/filters.d.ts +40 -0
  220. package/dist/telemetry/filters.d.ts.map +1 -0
  221. package/dist/{utils → telemetry}/filters.js +55 -1
  222. package/dist/telemetry/filters.js.map +1 -0
  223. package/dist/telemetry/navigation.d.ts +49 -0
  224. package/dist/telemetry/navigation.d.ts.map +1 -0
  225. package/dist/telemetry/navigation.js +69 -0
  226. package/dist/telemetry/navigation.js.map +1 -0
  227. package/dist/telemetry/network.d.ts +1 -0
  228. package/dist/telemetry/network.d.ts.map +1 -1
  229. package/dist/telemetry/network.js +23 -34
  230. package/dist/telemetry/network.js.map +1 -1
  231. package/dist/types.d.ts +2 -141
  232. package/dist/types.d.ts.map +1 -1
  233. package/dist/ui/{errors.d.ts → errors/CommandError.d.ts} +1 -1
  234. package/dist/ui/errors/CommandError.d.ts.map +1 -0
  235. package/dist/ui/{errors.js → errors/CommandError.js} +1 -1
  236. package/dist/ui/errors/CommandError.js.map +1 -0
  237. package/dist/ui/errors/index.d.ts +9 -0
  238. package/dist/ui/errors/index.d.ts.map +1 -0
  239. package/dist/ui/errors/index.js +12 -0
  240. package/dist/ui/errors/index.js.map +1 -0
  241. package/dist/ui/errors/utils.d.ts +24 -0
  242. package/dist/ui/errors/utils.d.ts.map +1 -0
  243. package/dist/ui/errors/utils.js +28 -0
  244. package/dist/ui/errors/utils.js.map +1 -0
  245. package/dist/ui/formatters/status.d.ts.map +1 -1
  246. package/dist/ui/formatters/status.js +1 -1
  247. package/dist/ui/formatters/status.js.map +1 -1
  248. package/dist/ui/logging/index.d.ts +7 -0
  249. package/dist/ui/logging/index.d.ts.map +1 -0
  250. package/dist/ui/logging/index.js +7 -0
  251. package/dist/ui/logging/index.js.map +1 -0
  252. package/dist/{utils → ui/logging}/logger.d.ts +1 -1
  253. package/dist/ui/logging/logger.d.ts.map +1 -0
  254. package/dist/ui/logging/logger.js.map +1 -0
  255. package/dist/ui/messages/chrome.d.ts +50 -1
  256. package/dist/ui/messages/chrome.d.ts.map +1 -1
  257. package/dist/ui/messages/chrome.js +77 -0
  258. package/dist/ui/messages/chrome.js.map +1 -1
  259. package/dist/ui/messages/commands.d.ts +1 -0
  260. package/dist/ui/messages/commands.d.ts.map +1 -1
  261. package/dist/ui/messages/commands.js +1 -0
  262. package/dist/ui/messages/commands.js.map +1 -1
  263. package/dist/ui/messages/errors.d.ts +30 -3
  264. package/dist/ui/messages/errors.d.ts.map +1 -1
  265. package/dist/ui/messages/errors.js +36 -8
  266. package/dist/ui/messages/errors.js.map +1 -1
  267. package/dist/ui/messages/preview.js +1 -1
  268. package/dist/ui/messages/preview.js.map +1 -1
  269. package/dist/ui/messages/session.d.ts.map +1 -1
  270. package/dist/ui/messages/session.js +22 -7
  271. package/dist/ui/messages/session.js.map +1 -1
  272. package/dist/ui/messages/validation.d.ts +22 -4
  273. package/dist/ui/messages/validation.d.ts.map +1 -1
  274. package/dist/ui/messages/validation.js +26 -5
  275. package/dist/ui/messages/validation.js.map +1 -1
  276. package/dist/utils/__tests__/session.contract.test.js +15 -1
  277. package/dist/utils/__tests__/session.contract.test.js.map +1 -1
  278. package/dist/utils/url.d.ts.map +1 -1
  279. package/dist/utils/url.js +10 -0
  280. package/dist/utils/url.js.map +1 -1
  281. package/package.json +3 -1
  282. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +0 -24
  283. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +0 -1
  284. package/dist/cli/commands/__tests__/cdp.contract.test.js +0 -467
  285. package/dist/cli/commands/__tests__/cdp.contract.test.js.map +0 -1
  286. package/dist/cli/commands/cdp.d.ts +0 -8
  287. package/dist/cli/commands/cdp.d.ts.map +0 -1
  288. package/dist/cli/commands/cdp.js +0 -45
  289. package/dist/cli/commands/cdp.js.map +0 -1
  290. package/dist/cli/commands/cleanup.d.ts +0 -8
  291. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  292. package/dist/cli/commands/cleanup.js +0 -129
  293. package/dist/cli/commands/cleanup.js.map +0 -1
  294. package/dist/cli/commands/console.d.ts +0 -8
  295. package/dist/cli/commands/console.d.ts.map +0 -1
  296. package/dist/cli/commands/console.js +0 -97
  297. package/dist/cli/commands/console.js.map +0 -1
  298. package/dist/cli/commands/details.d.ts +0 -8
  299. package/dist/cli/commands/details.d.ts.map +0 -1
  300. package/dist/cli/commands/details.js +0 -68
  301. package/dist/cli/commands/details.js.map +0 -1
  302. package/dist/cli/commands/dom/helpers/domCache.d.ts +0 -36
  303. package/dist/cli/commands/dom/helpers/domCache.d.ts.map +0 -1
  304. package/dist/cli/commands/dom/helpers/domCache.js +0 -65
  305. package/dist/cli/commands/dom/helpers/domCache.js.map +0 -1
  306. package/dist/cli/commands/dom/helpers/domQuery.d.ts +0 -48
  307. package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +0 -1
  308. package/dist/cli/commands/dom/helpers/domQuery.js +0 -104
  309. package/dist/cli/commands/dom/helpers/domQuery.js.map +0 -1
  310. package/dist/cli/commands/dom/helpers/errorHandler.d.ts +0 -45
  311. package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +0 -1
  312. package/dist/cli/commands/dom/helpers/errorHandler.js +0 -71
  313. package/dist/cli/commands/dom/helpers/errorHandler.js.map +0 -1
  314. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +0 -52
  315. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +0 -1
  316. package/dist/cli/commands/dom/helpers/evalHelpers.js +0 -75
  317. package/dist/cli/commands/dom/helpers/evalHelpers.js.map +0 -1
  318. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +0 -35
  319. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +0 -1
  320. package/dist/cli/commands/dom/helpers/optionsBuilder.js +0 -51
  321. package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +0 -1
  322. package/dist/cli/commands/dom/helpers/selectorParser.d.ts +0 -20
  323. package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +0 -1
  324. package/dist/cli/commands/dom/helpers/selectorParser.js +0 -20
  325. package/dist/cli/commands/dom/helpers/selectorParser.js.map +0 -1
  326. package/dist/cli/commands/dom/index.d.ts +0 -8
  327. package/dist/cli/commands/dom/index.d.ts.map +0 -1
  328. package/dist/cli/commands/dom/index.js +0 -257
  329. package/dist/cli/commands/dom/index.js.map +0 -1
  330. package/dist/cli/commands/dom.d.ts +0 -8
  331. package/dist/cli/commands/dom.d.ts.map +0 -1
  332. package/dist/cli/commands/dom.js +0 -257
  333. package/dist/cli/commands/dom.js.map +0 -1
  334. package/dist/cli/commands/domErrorHandler.d.ts +0 -45
  335. package/dist/cli/commands/domErrorHandler.d.ts.map +0 -1
  336. package/dist/cli/commands/domErrorHandler.js +0 -71
  337. package/dist/cli/commands/domErrorHandler.js.map +0 -1
  338. package/dist/cli/commands/domEvalHelpers.d.ts +0 -52
  339. package/dist/cli/commands/domEvalHelpers.d.ts.map +0 -1
  340. package/dist/cli/commands/domEvalHelpers.js +0 -76
  341. package/dist/cli/commands/domEvalHelpers.js.map +0 -1
  342. package/dist/cli/commands/domOptionsBuilder.d.ts +0 -35
  343. package/dist/cli/commands/domOptionsBuilder.d.ts.map +0 -1
  344. package/dist/cli/commands/domOptionsBuilder.js +0 -51
  345. package/dist/cli/commands/domOptionsBuilder.js.map +0 -1
  346. package/dist/cli/commands/domSelectorParser.d.ts +0 -20
  347. package/dist/cli/commands/domSelectorParser.d.ts.map +0 -1
  348. package/dist/cli/commands/domSelectorParser.js +0 -20
  349. package/dist/cli/commands/domSelectorParser.js.map +0 -1
  350. package/dist/cli/commands/network.d.ts +0 -8
  351. package/dist/cli/commands/network.d.ts.map +0 -1
  352. package/dist/cli/commands/network.js +0 -43
  353. package/dist/cli/commands/network.js.map +0 -1
  354. package/dist/cli/commands/peek.d.ts +0 -8
  355. package/dist/cli/commands/peek.d.ts.map +0 -1
  356. package/dist/cli/commands/peek.js +0 -109
  357. package/dist/cli/commands/peek.js.map +0 -1
  358. package/dist/cli/commands/start.d.ts +0 -9
  359. package/dist/cli/commands/start.d.ts.map +0 -1
  360. package/dist/cli/commands/start.js +0 -95
  361. package/dist/cli/commands/start.js.map +0 -1
  362. package/dist/cli/commands/status.d.ts +0 -9
  363. package/dist/cli/commands/status.d.ts.map +0 -1
  364. package/dist/cli/commands/status.js +0 -87
  365. package/dist/cli/commands/status.js.map +0 -1
  366. package/dist/cli/commands/stop.d.ts +0 -8
  367. package/dist/cli/commands/stop.d.ts.map +0 -1
  368. package/dist/cli/commands/stop.js +0 -147
  369. package/dist/cli/commands/stop.js.map +0 -1
  370. package/dist/cli/formatters/detailsFormatter.d.ts +0 -10
  371. package/dist/cli/formatters/detailsFormatter.d.ts.map +0 -1
  372. package/dist/cli/formatters/detailsFormatter.js +0 -63
  373. package/dist/cli/formatters/detailsFormatter.js.map +0 -1
  374. package/dist/cli/formatters/previewFormatter.d.ts +0 -27
  375. package/dist/cli/formatters/previewFormatter.d.ts.map +0 -1
  376. package/dist/cli/formatters/previewFormatter.js +0 -160
  377. package/dist/cli/formatters/previewFormatter.js.map +0 -1
  378. package/dist/cli/formatters/statusFormatter.d.ts +0 -39
  379. package/dist/cli/formatters/statusFormatter.d.ts.map +0 -1
  380. package/dist/cli/formatters/statusFormatter.js +0 -153
  381. package/dist/cli/formatters/statusFormatter.js.map +0 -1
  382. package/dist/cli/handlers/CommandRunner.d.ts +0 -60
  383. package/dist/cli/handlers/CommandRunner.d.ts.map +0 -1
  384. package/dist/cli/handlers/CommandRunner.js +0 -81
  385. package/dist/cli/handlers/CommandRunner.js.map +0 -1
  386. package/dist/cli/handlers/OutputBuilder.d.ts +0 -60
  387. package/dist/cli/handlers/OutputBuilder.d.ts.map +0 -1
  388. package/dist/cli/handlers/OutputBuilder.js +0 -138
  389. package/dist/cli/handlers/OutputBuilder.js.map +0 -1
  390. package/dist/cli/handlers/commonOptions.d.ts +0 -54
  391. package/dist/cli/handlers/commonOptions.d.ts.map +0 -1
  392. package/dist/cli/handlers/commonOptions.js +0 -64
  393. package/dist/cli/handlers/commonOptions.js.map +0 -1
  394. package/dist/cli/handlers/daemonSessionController.d.ts +0 -23
  395. package/dist/cli/handlers/daemonSessionController.d.ts.map +0 -1
  396. package/dist/cli/handlers/daemonSessionController.js +0 -79
  397. package/dist/cli/handlers/daemonSessionController.js.map +0 -1
  398. package/dist/cli/handlers/landingPage.d.ts +0 -8
  399. package/dist/cli/handlers/landingPage.d.ts.map +0 -1
  400. package/dist/cli/handlers/landingPage.js +0 -8
  401. package/dist/cli/handlers/landingPage.js.map +0 -1
  402. package/dist/cli/handlers/sessionController.d.ts +0 -21
  403. package/dist/cli/handlers/sessionController.d.ts.map +0 -1
  404. package/dist/cli/handlers/sessionController.js +0 -55
  405. package/dist/cli/handlers/sessionController.js.map +0 -1
  406. package/dist/cli/registry.d.ts +0 -11
  407. package/dist/cli/registry.d.ts.map +0 -1
  408. package/dist/cli/registry.js +0 -46
  409. package/dist/cli/registry.js.map +0 -1
  410. package/dist/collectors/__tests__/network.contract.test.d.ts +0 -28
  411. package/dist/collectors/__tests__/network.contract.test.d.ts.map +0 -1
  412. package/dist/collectors/__tests__/network.contract.test.js +0 -540
  413. package/dist/collectors/__tests__/network.contract.test.js.map +0 -1
  414. package/dist/collectors/console.d.ts +0 -19
  415. package/dist/collectors/console.d.ts.map +0 -1
  416. package/dist/collectors/console.js +0 -87
  417. package/dist/collectors/console.js.map +0 -1
  418. package/dist/collectors/dom.d.ts +0 -21
  419. package/dist/collectors/dom.d.ts.map +0 -1
  420. package/dist/collectors/dom.js +0 -99
  421. package/dist/collectors/dom.js.map +0 -1
  422. package/dist/collectors/network.d.ts +0 -33
  423. package/dist/collectors/network.d.ts.map +0 -1
  424. package/dist/collectors/network.js +0 -191
  425. package/dist/collectors/network.js.map +0 -1
  426. package/dist/commandRegistry.d.ts +0 -11
  427. package/dist/commandRegistry.d.ts.map +0 -1
  428. package/dist/commandRegistry.js +0 -45
  429. package/dist/commandRegistry.js.map +0 -1
  430. package/dist/commands/domErrorHandler.d.ts +0 -45
  431. package/dist/commands/domErrorHandler.d.ts.map +0 -1
  432. package/dist/commands/domErrorHandler.js +0 -71
  433. package/dist/commands/domErrorHandler.js.map +0 -1
  434. package/dist/dom/cache.d.ts +0 -36
  435. package/dist/dom/cache.d.ts.map +0 -1
  436. package/dist/dom/cache.js +0 -65
  437. package/dist/dom/cache.js.map +0 -1
  438. package/dist/dom/index.d.ts +0 -9
  439. package/dist/dom/index.d.ts.map +0 -1
  440. package/dist/dom/index.js +0 -9
  441. package/dist/dom/index.js.map +0 -1
  442. package/dist/dom/query.d.ts +0 -48
  443. package/dist/dom/query.d.ts.map +0 -1
  444. package/dist/dom/query.js +0 -104
  445. package/dist/dom/query.js.map +0 -1
  446. package/dist/ui/errors.d.ts.map +0 -1
  447. package/dist/ui/errors.js.map +0 -1
  448. package/dist/ui/messages/index.d.ts +0 -12
  449. package/dist/ui/messages/index.d.ts.map +0 -1
  450. package/dist/ui/messages/index.js +0 -12
  451. package/dist/ui/messages/index.js.map +0 -1
  452. package/dist/utils/__tests__/filters.unit.test.d.ts.map +0 -1
  453. package/dist/utils/__tests__/filters.unit.test.js.map +0 -1
  454. package/dist/utils/cdpHandlers.d.ts +0 -31
  455. package/dist/utils/cdpHandlers.d.ts.map +0 -1
  456. package/dist/utils/cdpHandlers.js +0 -38
  457. package/dist/utils/cdpHandlers.js.map +0 -1
  458. package/dist/utils/chromeDiagnostics.d.ts.map +0 -1
  459. package/dist/utils/chromeDiagnostics.js.map +0 -1
  460. package/dist/utils/errors.d.ts.map +0 -1
  461. package/dist/utils/errors.js.map +0 -1
  462. package/dist/utils/filters.d.ts.map +0 -1
  463. package/dist/utils/filters.js.map +0 -1
  464. package/dist/utils/formatters/network.d.ts +0 -23
  465. package/dist/utils/formatters/network.d.ts.map +0 -1
  466. package/dist/utils/formatters/network.js +0 -35
  467. package/dist/utils/formatters/network.js.map +0 -1
  468. package/dist/utils/logger.d.ts.map +0 -1
  469. package/dist/utils/logger.js.map +0 -1
  470. package/dist/utils/pageReadiness.d.ts.map +0 -1
  471. package/dist/utils/pageReadiness.js.map +0 -1
  472. package/dist/utils/ui.d.ts +0 -36
  473. package/dist/utils/ui.d.ts.map +0 -1
  474. package/dist/utils/ui.js +0 -47
  475. package/dist/utils/ui.js.map +0 -1
  476. package/dist/utils/url/safeParseUrl.d.ts +0 -63
  477. package/dist/utils/url/safeParseUrl.d.ts.map +0 -1
  478. package/dist/utils/url/safeParseUrl.js +0 -84
  479. package/dist/utils/url/safeParseUrl.js.map +0 -1
  480. /package/dist/{utils → connection}/pageReadiness.d.ts +0 -0
  481. /package/dist/{utils → telemetry}/__tests__/filters.unit.test.d.ts +0 -0
  482. /package/dist/{utils → ui/logging}/logger.js +0 -0
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. Self-documenting CDP access with discovery, search, and introspection. Perfect for AI agents and developers who want direct browser control without the framework overhead.
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,219 @@ 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
45
+ # Discover what's available
46
+ bdg cdp --list # List all 53 domains
47
+ bdg cdp Network --list # List Network methods
48
+ bdg cdp --search cookie # Search by keyword
31
49
 
32
- # Execute raw CDP commands
50
+ # Run any CDP command
51
+ bdg cdp Network.getCookies
33
52
  bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
34
- # { "result": { "type": "string", "value": "Example Domain" } }
35
53
 
36
- bdg cdp Network.getCookies
37
- # { "cookies": [...] }
54
+ # Check what's running
55
+ bdg status
38
56
 
39
- # Stop session
57
+ # Done
40
58
  bdg stop
41
59
  ```
42
60
 
43
- ## How It Works
61
+ ## What You Can Do
44
62
 
45
- `bdg` is built on a **layered architecture** — raw CDP access with human-friendly wrappers on top.
63
+ ### Discover CDP Commands (53 Domains, 300+ Methods)
46
64
 
47
- ### Layer 1: Raw CDP Access ✅
65
+ Built-in introspection helps you find what you need without reading docs:
48
66
 
49
- Direct access to **60+ domains, 300+ methods** from [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/):
67
+ ```bash
68
+ # What can I do with this browser?
69
+ bdg cdp --list
70
+ # Returns: 53 domains (Network, DOM, Page, Runtime, Storage, etc.)
71
+
72
+ # What Network operations exist?
73
+ bdg cdp Network --list
74
+ # Returns: 39 methods with descriptions and parameter counts
75
+
76
+ # How do I use this method?
77
+ bdg cdp Network.getCookies --describe
78
+ # Returns: Full schema with parameters, types, examples
79
+
80
+ # Find cookie-related methods
81
+ bdg cdp --search cookie
82
+ # Returns: 14 methods across domains (Network.getCookies, Storage.getCookies, etc.)
83
+ ```
84
+
85
+ All discovery commands output JSON for easy parsing. Perfect for AI agents building automation on the fly.
86
+
87
+ ### Run Any CDP Command
88
+
89
+ All 300+ methods from [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) work out of the box:
50
90
 
51
91
  ```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
92
+ # Get cookies and filter with jq
93
+ bdg cdp Network.getCookies | jq '.cookies[] | select(.httpOnly)'
94
+
95
+ # Execute JavaScript in the page
96
+ bdg cdp Runtime.evaluate --params '{"expression":"document.querySelectorAll(\"a\").length","returnByValue":true}'
97
+
98
+ # Monitor memory usage
99
+ bdg cdp Performance.getMetrics | jq '.metrics[] | select(.name == "JSHeapUsedSize")'
56
100
 
57
- # Pipe to jq for filtering
58
- bdg cdp Network.getCookies | jq '.cookies[] | select(.name == "session")'
101
+ # Capture a screenshot
102
+ bdg cdp Page.captureScreenshot | jq -r '.data' | base64 -d > screenshot.png
59
103
  ```
60
104
 
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
105
+ The daemon keeps a WebSocket open to Chrome, so commands run immediately against the live session.
66
106
 
67
- ### Layer 2: Human-Friendly Wrappers 🚧
107
+ ### Pipe Everything
68
108
 
69
- Building ergonomic commands on top of raw CDP for common workflows:
109
+ Output is JSON by default. Use it with `jq`, `grep`, `awk` - whatever works:
70
110
 
71
111
  ```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
112
+ # Find all failed network requests
113
+ bdg peek --network --json | jq '.data.network[] | select(.status >= 400)'
114
+
115
+ # Extract every link on the page
116
+ bdg cdp Runtime.evaluate --params '{
117
+ "expression": "Array.from(document.querySelectorAll(\"a\")).map(a => ({text: a.textContent.trim(), href: a.href}))",
118
+ "returnByValue": true
119
+ }' | jq '.result.value'
120
+
121
+ # Count console errors
122
+ bdg peek --console --json | jq '[.data.console[] | select(.level == "error")] | length'
85
123
  ```
86
124
 
87
- **Progressive disclosure**: Start with raw CDP power, add convenience wrappers for common patterns.
125
+ ### For AI Agents
88
126
 
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
127
+ **Self-documenting CDP discovery** - agents can explore 300+ browser capabilities without external docs:
94
128
 
95
- ## Available Commands
129
+ ```bash
130
+ # Agent discovers what's possible
131
+ bdg cdp --list # 53 domains available
132
+ bdg cdp --search screenshot # Find relevant methods
133
+ bdg cdp Page.captureScreenshot --describe # Learn parameters
134
+ bdg cdp Page.captureScreenshot --params '{"format":"png"}' # Execute
96
135
 
97
- ### Raw CDP Access
136
+ # All commands return structured JSON for easy parsing
137
+ ```
138
+
139
+ **Why this matters for agents:**
140
+ - No need to memorize CDP docs (1000+ pages)
141
+ - Discover → Learn → Execute in one tool
142
+ - Search by keyword (`--search`)
143
+ - Case-insensitive execution (forgiving for LLM outputs)
144
+ - Semantic exit codes for error handling
145
+
146
+ Claude skill included at `.claude/skills/bdg/` with working automation patterns:
147
+
148
+ - Common CDP workflows (scraping, polling, navigation)
149
+ - Exit codes and error handling
150
+ - Troubleshooting reference
98
151
 
99
- Full Chrome DevTools Protocol access via `bdg cdp` command – **any CDP method works**:
152
+ The `--help --json` flag outputs the complete CLI schema for programmatic discovery:
100
153
 
101
154
  ```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"
155
+ bdg --help --json | jq '.command.subcommands[].name'
156
+ bdg --help --json | jq '.exitCodes'
137
157
  ```
138
158
 
139
- **60+ domains, 300+ methods** from the [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) are available.
159
+ ### Debug Live Apps
140
160
 
141
- ### Session Management
161
+ Point at localhost, monitor what's happening:
142
162
 
143
163
  ```bash
144
- # Start session
145
- bdg example.com # Opens Chrome with daemon in background
164
+ bdg localhost:3000 --headless
165
+ bdg tail --console # Stream console output
166
+ bdg tail --network # Watch requests in real-time
167
+ ```
146
168
 
147
- # Check if session is active
148
- bdg status # Show session info
149
- bdg status --verbose # Include Chrome diagnostics
169
+ Helpful for catching issues during development without opening DevTools.
150
170
 
151
- # Stop session
152
- bdg stop # Gracefully stop daemon and close Chrome
171
+ ### Automate Browser Tasks
153
172
 
154
- # Clean up stale sessions
155
- bdg cleanup # Remove stale session files
156
- bdg cleanup --force # Force cleanup even if session appears active
173
+ Poll for elements, click buttons, extract data:
174
+
175
+ ```bash
176
+ # Wait for an element to appear
177
+ while ! bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\"#target\") !== null","returnByValue":true}' | jq -e '.result.value'; do
178
+ sleep 0.5
179
+ done
180
+
181
+ # Click it
182
+ bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\"#target\").click()"}'
183
+
184
+ # Get the result
185
+ bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\".result\").textContent","returnByValue":true}'
157
186
  ```
158
187
 
159
- ## Technical Overview
188
+ Check `.claude/skills/bdg/WORKFLOWS.md` for more complete examples (GitHub scraper, form automation, etc).
160
189
 
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.
190
+ ## Session Management
166
191
 
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
192
+ Sessions persist until you stop them. Chrome stays open, data keeps collecting:
172
193
 
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
194
+ ```bash
195
+ bdg example.com # Opens Chrome, starts daemon
196
+ bdg status # Check what's running
197
+ bdg status --verbose # Show Chrome process details
198
+ bdg stop # Kill everything
199
+ bdg cleanup # Remove stale files
200
+ ```
178
201
 
179
- ## Contributing
202
+ ## Helper Commands
180
203
 
181
- Contributions welcome! But honestly, I'd just be happy if you give it a try.
204
+ A few convenience wrappers for common operations. Most work still happens through `bdg cdp`:
205
+
206
+ ```bash
207
+ # Query DOM
208
+ bdg dom query "button.primary" # Find elements
209
+ bdg dom get "button.primary" # Get HTML
210
+ bdg dom eval "document.title" # Run JavaScript
211
+ bdg dom highlight ".navbar" # Visual debugging
212
+
213
+ # Inspect collected data
214
+ bdg peek # Quick snapshot
215
+ bdg peek --network # Just network data
216
+ bdg tail # Stream like tail -f
217
+ ```
218
+
219
+ ## Page Readiness
220
+
221
+ By default, `bdg` waits for pages to fully load using three signals:
222
+
223
+ 1. Browser's `window.onload` fires
224
+ 2. Network goes quiet (200ms without new requests)
225
+ 3. DOM stops changing (300ms without mutations)
226
+
227
+ 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.
228
+
229
+ Skip it with `--no-wait` if you want immediate connection.
230
+
231
+ ## Architecture
232
+
233
+ Three processes:
234
+
235
+ - **CLI** talks to daemon via Unix socket
236
+ - **Daemon** manages Chrome and routes commands
237
+ - **Worker** holds the WebSocket to CDP
238
+
239
+ Chrome stays running between commands. No startup cost for each operation.
240
+
241
+ ## Contributing
182
242
 
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)).
243
+ 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
244
 
188
245
  ## License
189
246
 
190
- MIT – see [LICENSE](LICENSE) for details.
247
+ MIT
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Error handling smoke tests.
3
+ *
4
+ * Tests error paths and user-facing error messages.
5
+ * WHY: Errors are high-risk areas - tests ensure helpful messages and proper exit codes.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=error-handling.smoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling.smoke.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/smoke/error-handling.smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Error handling smoke tests.
3
+ *
4
+ * Tests error paths and user-facing error messages.
5
+ * WHY: Errors are high-risk areas - tests ensure helpful messages and proper exit codes.
6
+ */
7
+ import * as assert from 'node:assert/strict';
8
+ import { describe, it, afterEach } from 'node:test';
9
+ import { runCommand } from '../../__testutils__/commandRunner.js';
10
+ import { cleanupAllSessions, isDaemonRunning, killDaemon, waitForDaemon, } from '../../__testutils__/daemonHelpers.js';
11
+ import { EXIT_CODES } from '../../utils/exitCodes.js';
12
+ void describe('Error Handling Smoke Tests', () => {
13
+ afterEach(async () => {
14
+ // Cleanup after each test (no beforeEach needed if this works properly)
15
+ await cleanupAllSessions();
16
+ });
17
+ void it('should fail with helpful message when daemon not running', async () => {
18
+ // Try to peek without daemon running
19
+ // Note: peek auto-starts daemon, so it returns 83 after starting daemon
20
+ const result = await runCommand('peek', [], { timeout: 5000 });
21
+ // Should fail with resource not found (no session)
22
+ assert.equal(result.exitCode, EXIT_CODES.RESOURCE_NOT_FOUND);
23
+ // Should provide helpful error message about no session
24
+ assert.ok(/no.*session|session.*not.*found/i.test(result.stderr));
25
+ });
26
+ void it('should fail with helpful message when trying to stop without session', async () => {
27
+ // Try to stop without session
28
+ const result = await runCommand('stop', [], { timeout: 5000 });
29
+ // Should fail
30
+ assert.notEqual(result.exitCode, 0);
31
+ // Should provide helpful error message
32
+ assert.ok(result.stderr.includes('daemon'));
33
+ });
34
+ void it('should handle daemon crash during session', async () => {
35
+ // Start session with unique port
36
+ await runCommand('http://example.com', ['--port', '9230', '--headless'], { timeout: 10000 });
37
+ await waitForDaemon(5000);
38
+ // Kill daemon forcefully (simulate crash)
39
+ await killDaemon('SIGKILL');
40
+ // Wait for process to fully die
41
+ await new Promise((resolve) => setTimeout(resolve, 1000));
42
+ // Try to peek (should fail)
43
+ const peekResult = await runCommand('peek', [], { timeout: 5000 });
44
+ // Should fail
45
+ assert.notEqual(peekResult.exitCode, 0);
46
+ // Should provide helpful error message
47
+ assert.ok(peekResult.stderr.includes('daemon'));
48
+ // Daemon should not be running
49
+ assert.equal(isDaemonRunning(), false);
50
+ });
51
+ void it('should provide helpful error when Chrome fails to launch', async () => {
52
+ // Try to start with invalid Chrome path and unique port
53
+ const result = await runCommand('http://example.com', ['--port', '9231', '--headless'], {
54
+ timeout: 10000,
55
+ env: {
56
+ CHROME_PATH: '/nonexistent/chrome',
57
+ },
58
+ });
59
+ // Should fail (exit code 104 is acceptable for worker errors)
60
+ assert.notEqual(result.exitCode, 0);
61
+ // Should provide helpful error message mentioning Chrome
62
+ assert.ok(/chrome|browser|launch|binary/i.test(result.stderr));
63
+ });
64
+ void it('should cleanup stale sessions automatically', async () => {
65
+ // Start session with unique port
66
+ await runCommand('http://example.com', ['--port', '9232', '--headless'], { timeout: 10000 });
67
+ await waitForDaemon(5000);
68
+ // Kill daemon without cleanup (simulate crash)
69
+ await killDaemon('SIGKILL');
70
+ // Kill Chrome on port 9232 (simulating what happens when daemon crashes)
71
+ try {
72
+ const { execSync } = await import('child_process');
73
+ execSync(`lsof -ti:9232 | xargs kill -9 2>/dev/null || true`, { stdio: 'ignore' });
74
+ }
75
+ catch {
76
+ // Ignore errors if no process on port
77
+ }
78
+ // Wait for processes to fully die and port to be released
79
+ await new Promise((resolve) => setTimeout(resolve, 2000));
80
+ // Try to start new session (should cleanup stale and succeed)
81
+ const result = await runCommand('http://example.com', ['--port', '9232', '--headless'], {
82
+ timeout: 10000,
83
+ });
84
+ // Should succeed after cleanup
85
+ if (result.exitCode !== 0) {
86
+ console.error('Exit code:', result.exitCode);
87
+ console.error('Stderr:', result.stderr);
88
+ console.error('Stdout:', result.stdout);
89
+ }
90
+ assert.equal(result.exitCode, 0);
91
+ // New daemon should be running
92
+ assert.equal(isDaemonRunning(), true);
93
+ });
94
+ });
95
+ //# sourceMappingURL=error-handling.smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling.smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/smoke/error-handling.smoke.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Session lifecycle smoke tests.
3
+ *
4
+ * Tests the complete user flow: start → collect data → stop → verify output.
5
+ * WHY: Highest-risk path with 0% coverage despite being critical user flow.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=session-lifecycle.smoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.smoke.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/smoke/session-lifecycle.smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Session lifecycle smoke tests.
3
+ *
4
+ * Tests the complete user flow: start → collect data → stop → verify output.
5
+ * WHY: Highest-risk path with 0% coverage despite being critical user flow.
6
+ */
7
+ import * as assert from 'node:assert/strict';
8
+ import { describe, it, afterEach } from 'node:test';
9
+ import { runCommand, runCommandJSON } from '../../__testutils__/commandRunner.js';
10
+ import { cleanupAllSessions, isDaemonRunning, isSessionActive, readSessionOutput, waitForDaemon, } from '../../__testutils__/daemonHelpers.js';
11
+ void describe('Session Lifecycle Smoke Tests', () => {
12
+ afterEach(async () => {
13
+ // Cleanup after each test (no beforeEach needed if this works properly)
14
+ await cleanupAllSessions();
15
+ });
16
+ void it('should start session and create daemon', async () => {
17
+ // Start session with a simple URL using a unique port to avoid conflicts
18
+ const result = await runCommand('http://example.com', ['--port', '9223', '--headless'], {
19
+ timeout: 10000,
20
+ });
21
+ // Should succeed
22
+ assert.equal(result.exitCode, 0);
23
+ // Daemon should be running
24
+ assert.equal(isDaemonRunning(), true);
25
+ // Session should be active
26
+ assert.equal(isSessionActive(), true);
27
+ });
28
+ void it('should collect data during session', async () => {
29
+ // Start session with unique port
30
+ const startResult = await runCommand('http://example.com', ['--port', '9224', '--headless'], {
31
+ timeout: 10000,
32
+ });
33
+ assert.equal(startResult.exitCode, 0, `Session start failed: ${startResult.stderr}`);
34
+ // Wait for daemon to be ready
35
+ await waitForDaemon(5000);
36
+ // Give Chrome time to navigate and collect some data
37
+ await new Promise((resolve) => setTimeout(resolve, 2000));
38
+ // Peek at collected data
39
+ const peekResult = await runCommandJSON('peek', [
40
+ '--json',
41
+ ]);
42
+ // Should have collected some data
43
+ assert.ok(peekResult);
44
+ assert.ok(typeof peekResult === 'object');
45
+ assert.ok('preview' in peekResult);
46
+ assert.ok('data' in peekResult.preview);
47
+ // Stop session to clean up
48
+ const stopResult = await runCommand('stop', [], { timeout: 10000 });
49
+ assert.equal(stopResult.exitCode, 0, `Stop failed: ${stopResult.stderr}`);
50
+ });
51
+ void it('should write output on stop', async () => {
52
+ // Start session with unique port
53
+ const startResult = await runCommand('http://example.com', ['--port', '9225', '--headless'], {
54
+ timeout: 10000,
55
+ });
56
+ assert.equal(startResult.exitCode, 0, `Session start failed: ${startResult.stderr}`);
57
+ await waitForDaemon(5000);
58
+ // Give Chrome time to collect data
59
+ await new Promise((resolve) => setTimeout(resolve, 2000));
60
+ // Stop session
61
+ const stopResult = await runCommand('stop', [], { timeout: 10000 });
62
+ // Should succeed
63
+ assert.equal(stopResult.exitCode, 0, `Stop failed: ${stopResult.stderr}`);
64
+ // Give filesystem time to write the file (increased for test stability)
65
+ await new Promise((resolve) => setTimeout(resolve, 2000));
66
+ // Output file should exist
67
+ const output = readSessionOutput();
68
+ assert.ok(output, 'Session output file should exist after stop');
69
+ assert.ok(typeof output === 'object');
70
+ // Output should have expected structure
71
+ assert.ok('version' in output);
72
+ assert.ok('success' in output);
73
+ assert.equal(output.success, true);
74
+ assert.ok('timestamp' in output);
75
+ assert.ok('data' in output);
76
+ assert.ok('target' in output);
77
+ });
78
+ void it('should cleanup daemon on stop', async () => {
79
+ // Start session with unique port
80
+ await runCommand('http://example.com', ['--port', '9226', '--headless'], { timeout: 10000 });
81
+ await waitForDaemon(5000);
82
+ // Stop session
83
+ await runCommand('stop', [], { timeout: 10000 });
84
+ // Wait for cleanup
85
+ await new Promise((resolve) => setTimeout(resolve, 1000));
86
+ // Daemon should no longer be running
87
+ assert.equal(isDaemonRunning(), false);
88
+ // Session should no longer be active
89
+ assert.equal(isSessionActive(), false);
90
+ });
91
+ void it('should handle concurrent session attempts gracefully', async () => {
92
+ // Start first session with unique port
93
+ const firstResult = await runCommand('http://example.com', ['--port', '9227', '--headless'], {
94
+ timeout: 10000,
95
+ });
96
+ assert.equal(firstResult.exitCode, 0, `First session start failed: ${firstResult.stderr}`);
97
+ await waitForDaemon(5000);
98
+ // Try to start second session (should fail)
99
+ const secondResult = await runCommand('http://another.com', ['--port', '9228', '--headless'], {
100
+ timeout: 10000,
101
+ });
102
+ // Should fail with daemon already running error
103
+ assert.notEqual(secondResult.exitCode, 0);
104
+ assert.ok(secondResult.stderr.includes('daemon') || secondResult.stderr.includes('already'), `Expected error about daemon, got: ${secondResult.stderr}`);
105
+ // First session should still be running
106
+ assert.equal(isDaemonRunning(), true);
107
+ });
108
+ });
109
+ //# sourceMappingURL=session-lifecycle.smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/smoke/session-lifecycle.smoke.test.ts"],"names":[],"mappings":"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"}