devharness 0.8.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 (627) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/build/atomic-write.d.ts +28 -0
  4. package/build/atomic-write.d.ts.map +1 -0
  5. package/build/atomic-write.js +126 -0
  6. package/build/atomic-write.js.map +1 -0
  7. package/build/cdp-manager.d.ts +524 -0
  8. package/build/cdp-manager.d.ts.map +1 -0
  9. package/build/cdp-manager.js +1828 -0
  10. package/build/cdp-manager.js.map +1 -0
  11. package/build/cdp-manager.test.d.ts +6 -0
  12. package/build/cdp-manager.test.d.ts.map +1 -0
  13. package/build/cdp-manager.test.js +546 -0
  14. package/build/cdp-manager.test.js.map +1 -0
  15. package/build/chrome-launcher.d.ts +400 -0
  16. package/build/chrome-launcher.d.ts.map +1 -0
  17. package/build/chrome-launcher.js +1071 -0
  18. package/build/chrome-launcher.js.map +1 -0
  19. package/build/chrome-launcher.test.d.ts +11 -0
  20. package/build/chrome-launcher.test.d.ts.map +1 -0
  21. package/build/chrome-launcher.test.js +204 -0
  22. package/build/chrome-launcher.test.js.map +1 -0
  23. package/build/clickable-cache.d.ts +73 -0
  24. package/build/clickable-cache.d.ts.map +1 -0
  25. package/build/clickable-cache.js +90 -0
  26. package/build/clickable-cache.js.map +1 -0
  27. package/build/command-recorder.d.ts +401 -0
  28. package/build/command-recorder.d.ts.map +1 -0
  29. package/build/command-recorder.js +701 -0
  30. package/build/command-recorder.js.map +1 -0
  31. package/build/config.d.ts +390 -0
  32. package/build/config.d.ts.map +1 -0
  33. package/build/config.js +826 -0
  34. package/build/config.js.map +1 -0
  35. package/build/config.test.d.ts +2 -0
  36. package/build/config.test.d.ts.map +1 -0
  37. package/build/config.test.js +112 -0
  38. package/build/config.test.js.map +1 -0
  39. package/build/connection-manager.d.ts +159 -0
  40. package/build/connection-manager.d.ts.map +1 -0
  41. package/build/connection-manager.js +432 -0
  42. package/build/connection-manager.js.map +1 -0
  43. package/build/connection-manager.test.d.ts +11 -0
  44. package/build/connection-manager.test.d.ts.map +1 -0
  45. package/build/connection-manager.test.js +114 -0
  46. package/build/connection-manager.test.js.map +1 -0
  47. package/build/console-monitor.d.ts +150 -0
  48. package/build/console-monitor.d.ts.map +1 -0
  49. package/build/console-monitor.js +454 -0
  50. package/build/console-monitor.js.map +1 -0
  51. package/build/dashboard/bundle.js +1 -0
  52. package/build/dashboard/dashboard-client.d.ts +42 -0
  53. package/build/dashboard/dashboard-client.d.ts.map +1 -0
  54. package/build/dashboard/dashboard-client.js +184 -0
  55. package/build/dashboard/dashboard-client.js.map +1 -0
  56. package/build/dashboard/dashboard-hub.d.ts +50 -0
  57. package/build/dashboard/dashboard-hub.d.ts.map +1 -0
  58. package/build/dashboard/dashboard-hub.js +654 -0
  59. package/build/dashboard/dashboard-hub.js.map +1 -0
  60. package/build/dashboard/hub-lock.d.ts +16 -0
  61. package/build/dashboard/hub-lock.d.ts.map +1 -0
  62. package/build/dashboard/hub-lock.js +77 -0
  63. package/build/dashboard/hub-lock.js.map +1 -0
  64. package/build/dashboard/index.d.ts +25 -0
  65. package/build/dashboard/index.d.ts.map +1 -0
  66. package/build/dashboard/index.js +77 -0
  67. package/build/dashboard/index.js.map +1 -0
  68. package/build/dashboard/types.d.ts +83 -0
  69. package/build/dashboard/types.d.ts.map +1 -0
  70. package/build/dashboard/types.js +6 -0
  71. package/build/dashboard/types.js.map +1 -0
  72. package/build/debug-logger.d.ts +85 -0
  73. package/build/debug-logger.d.ts.map +1 -0
  74. package/build/debug-logger.js +195 -0
  75. package/build/debug-logger.js.map +1 -0
  76. package/build/debugger-aware-wrapper.d.ts +37 -0
  77. package/build/debugger-aware-wrapper.d.ts.map +1 -0
  78. package/build/debugger-aware-wrapper.js +128 -0
  79. package/build/debugger-aware-wrapper.js.map +1 -0
  80. package/build/dom-change-monitor.d.ts +92 -0
  81. package/build/dom-change-monitor.d.ts.map +1 -0
  82. package/build/dom-change-monitor.js +437 -0
  83. package/build/dom-change-monitor.js.map +1 -0
  84. package/build/element-collector.d.ts +16 -0
  85. package/build/element-collector.d.ts.map +1 -0
  86. package/build/element-collector.js +207 -0
  87. package/build/element-collector.js.map +1 -0
  88. package/build/error-helpers.d.ts +43 -0
  89. package/build/error-helpers.d.ts.map +1 -0
  90. package/build/error-helpers.js +143 -0
  91. package/build/error-helpers.js.map +1 -0
  92. package/build/formatters/console-formatter.d.ts +160 -0
  93. package/build/formatters/console-formatter.d.ts.map +1 -0
  94. package/build/formatters/console-formatter.js +338 -0
  95. package/build/formatters/console-formatter.js.map +1 -0
  96. package/build/helpers/parser-plugins.d.ts +44 -0
  97. package/build/helpers/parser-plugins.d.ts.map +1 -0
  98. package/build/helpers/parser-plugins.js +102 -0
  99. package/build/helpers/parser-plugins.js.map +1 -0
  100. package/build/helpers/paths.d.ts +79 -0
  101. package/build/helpers/paths.d.ts.map +1 -0
  102. package/build/helpers/paths.js +168 -0
  103. package/build/helpers/paths.js.map +1 -0
  104. package/build/helpers/process-liveness.d.ts +24 -0
  105. package/build/helpers/process-liveness.d.ts.map +1 -0
  106. package/build/helpers/process-liveness.js +36 -0
  107. package/build/helpers/process-liveness.js.map +1 -0
  108. package/build/helpers/process-liveness.test.d.ts +2 -0
  109. package/build/helpers/process-liveness.test.d.ts.map +1 -0
  110. package/build/helpers/process-liveness.test.js +40 -0
  111. package/build/helpers/process-liveness.test.js.map +1 -0
  112. package/build/helpers/sequence-tree.d.ts +27 -0
  113. package/build/helpers/sequence-tree.d.ts.map +1 -0
  114. package/build/helpers/sequence-tree.js +80 -0
  115. package/build/helpers/sequence-tree.js.map +1 -0
  116. package/build/helpers/sequence-tree.test.d.ts +2 -0
  117. package/build/helpers/sequence-tree.test.d.ts.map +1 -0
  118. package/build/helpers/sequence-tree.test.js +122 -0
  119. package/build/helpers/sequence-tree.test.js.map +1 -0
  120. package/build/index.d.ts +3 -0
  121. package/build/index.d.ts.map +1 -0
  122. package/build/index.js +2007 -0
  123. package/build/index.js.map +1 -0
  124. package/build/interaction-recorder.d.ts +214 -0
  125. package/build/interaction-recorder.d.ts.map +1 -0
  126. package/build/interaction-recorder.js +2007 -0
  127. package/build/interaction-recorder.js.map +1 -0
  128. package/build/issue-tracker.d.ts +107 -0
  129. package/build/issue-tracker.d.ts.map +1 -0
  130. package/build/issue-tracker.js +582 -0
  131. package/build/issue-tracker.js.map +1 -0
  132. package/build/issue-tracker.test.d.ts +2 -0
  133. package/build/issue-tracker.test.d.ts.map +1 -0
  134. package/build/issue-tracker.test.js +88 -0
  135. package/build/issue-tracker.test.js.map +1 -0
  136. package/build/launch-chrome-port.test.d.ts +14 -0
  137. package/build/launch-chrome-port.test.d.ts.map +1 -0
  138. package/build/launch-chrome-port.test.js +97 -0
  139. package/build/launch-chrome-port.test.js.map +1 -0
  140. package/build/log-processor/orchestrator.d.ts +32 -0
  141. package/build/log-processor/orchestrator.d.ts.map +1 -0
  142. package/build/log-processor/orchestrator.js +27 -0
  143. package/build/log-processor/orchestrator.js.map +1 -0
  144. package/build/logpoint-execution-tracker.d.ts +57 -0
  145. package/build/logpoint-execution-tracker.d.ts.map +1 -0
  146. package/build/logpoint-execution-tracker.js +112 -0
  147. package/build/logpoint-execution-tracker.js.map +1 -0
  148. package/build/mcp-supervisor.d.ts +3 -0
  149. package/build/mcp-supervisor.d.ts.map +1 -0
  150. package/build/mcp-supervisor.js +211 -0
  151. package/build/mcp-supervisor.js.map +1 -0
  152. package/build/messages.d.ts +165 -0
  153. package/build/messages.d.ts.map +1 -0
  154. package/build/messages.js +574 -0
  155. package/build/messages.js.map +1 -0
  156. package/build/network-monitor.d.ts +172 -0
  157. package/build/network-monitor.d.ts.map +1 -0
  158. package/build/network-monitor.js +350 -0
  159. package/build/network-monitor.js.map +1 -0
  160. package/build/overlays.d.ts +49 -0
  161. package/build/overlays.d.ts.map +1 -0
  162. package/build/overlays.js +409 -0
  163. package/build/overlays.js.map +1 -0
  164. package/build/persistent-profiles.test.d.ts +15 -0
  165. package/build/persistent-profiles.test.d.ts.map +1 -0
  166. package/build/persistent-profiles.test.js +470 -0
  167. package/build/persistent-profiles.test.js.map +1 -0
  168. package/build/port-reserver.d.ts +32 -0
  169. package/build/port-reserver.d.ts.map +1 -0
  170. package/build/port-reserver.js +118 -0
  171. package/build/port-reserver.js.map +1 -0
  172. package/build/puppeteer-manager.d.ts +47 -0
  173. package/build/puppeteer-manager.d.ts.map +1 -0
  174. package/build/puppeteer-manager.js +116 -0
  175. package/build/puppeteer-manager.js.map +1 -0
  176. package/build/recording-coverage.test.d.ts +12 -0
  177. package/build/recording-coverage.test.d.ts.map +1 -0
  178. package/build/recording-coverage.test.js +72 -0
  179. package/build/recording-coverage.test.js.map +1 -0
  180. package/build/reference-validator.d.ts +47 -0
  181. package/build/reference-validator.d.ts.map +1 -0
  182. package/build/reference-validator.js +86 -0
  183. package/build/reference-validator.js.map +1 -0
  184. package/build/reference-validator.test.d.ts +5 -0
  185. package/build/reference-validator.test.d.ts.map +1 -0
  186. package/build/reference-validator.test.js +243 -0
  187. package/build/reference-validator.test.js.map +1 -0
  188. package/build/replay-cursor.d.ts +27 -0
  189. package/build/replay-cursor.d.ts.map +1 -0
  190. package/build/replay-cursor.js +240 -0
  191. package/build/replay-cursor.js.map +1 -0
  192. package/build/runners/docker-compose-runner.d.ts +69 -0
  193. package/build/runners/docker-compose-runner.d.ts.map +1 -0
  194. package/build/runners/docker-compose-runner.js +438 -0
  195. package/build/runners/docker-compose-runner.js.map +1 -0
  196. package/build/runners/docker-runner.d.ts +65 -0
  197. package/build/runners/docker-runner.d.ts.map +1 -0
  198. package/build/runners/docker-runner.js +414 -0
  199. package/build/runners/docker-runner.js.map +1 -0
  200. package/build/runners/index.d.ts +19 -0
  201. package/build/runners/index.d.ts.map +1 -0
  202. package/build/runners/index.js +35 -0
  203. package/build/runners/index.js.map +1 -0
  204. package/build/runners/native-runner.d.ts +95 -0
  205. package/build/runners/native-runner.d.ts.map +1 -0
  206. package/build/runners/native-runner.js +370 -0
  207. package/build/runners/native-runner.js.map +1 -0
  208. package/build/runners/types.d.ts +147 -0
  209. package/build/runners/types.d.ts.map +1 -0
  210. package/build/runners/types.js +25 -0
  211. package/build/runners/types.js.map +1 -0
  212. package/build/self-restart.d.ts +12 -0
  213. package/build/self-restart.d.ts.map +1 -0
  214. package/build/self-restart.js +41 -0
  215. package/build/self-restart.js.map +1 -0
  216. package/build/self-restart.test.d.ts +2 -0
  217. package/build/self-restart.test.d.ts.map +1 -0
  218. package/build/self-restart.test.js +34 -0
  219. package/build/self-restart.test.js.map +1 -0
  220. package/build/server-claims.d.ts +161 -0
  221. package/build/server-claims.d.ts.map +1 -0
  222. package/build/server-claims.js +382 -0
  223. package/build/server-claims.js.map +1 -0
  224. package/build/server-claims.test.d.ts +2 -0
  225. package/build/server-claims.test.d.ts.map +1 -0
  226. package/build/server-claims.test.js +197 -0
  227. package/build/server-claims.test.js.map +1 -0
  228. package/build/server-manager.d.ts +438 -0
  229. package/build/server-manager.d.ts.map +1 -0
  230. package/build/server-manager.js +1674 -0
  231. package/build/server-manager.js.map +1 -0
  232. package/build/server-manager.test.d.ts +17 -0
  233. package/build/server-manager.test.d.ts.map +1 -0
  234. package/build/server-manager.test.js +122 -0
  235. package/build/server-manager.test.js.map +1 -0
  236. package/build/server-ownership.test.d.ts +2 -0
  237. package/build/server-ownership.test.d.ts.map +1 -0
  238. package/build/server-ownership.test.js +238 -0
  239. package/build/server-ownership.test.js.map +1 -0
  240. package/build/server-watcher.d.ts +21 -0
  241. package/build/server-watcher.d.ts.map +1 -0
  242. package/build/server-watcher.js +105 -0
  243. package/build/server-watcher.js.map +1 -0
  244. package/build/session-detector.d.ts +47 -0
  245. package/build/session-detector.d.ts.map +1 -0
  246. package/build/session-detector.js +229 -0
  247. package/build/session-detector.js.map +1 -0
  248. package/build/session-detector.test.d.ts +9 -0
  249. package/build/session-detector.test.d.ts.map +1 -0
  250. package/build/session-detector.test.js +45 -0
  251. package/build/session-detector.test.js.map +1 -0
  252. package/build/sourcemap-handler.d.ts +114 -0
  253. package/build/sourcemap-handler.d.ts.map +1 -0
  254. package/build/sourcemap-handler.js +479 -0
  255. package/build/sourcemap-handler.js.map +1 -0
  256. package/build/supervisor/child-manager.d.ts +43 -0
  257. package/build/supervisor/child-manager.d.ts.map +1 -0
  258. package/build/supervisor/child-manager.js +148 -0
  259. package/build/supervisor/child-manager.js.map +1 -0
  260. package/build/supervisor/child-manager.test.d.ts +2 -0
  261. package/build/supervisor/child-manager.test.d.ts.map +1 -0
  262. package/build/supervisor/child-manager.test.js +107 -0
  263. package/build/supervisor/child-manager.test.js.map +1 -0
  264. package/build/supervisor/client-watcher.d.ts +48 -0
  265. package/build/supervisor/client-watcher.d.ts.map +1 -0
  266. package/build/supervisor/client-watcher.js +186 -0
  267. package/build/supervisor/client-watcher.js.map +1 -0
  268. package/build/supervisor/client-watcher.test.d.ts +2 -0
  269. package/build/supervisor/client-watcher.test.d.ts.map +1 -0
  270. package/build/supervisor/client-watcher.test.js +121 -0
  271. package/build/supervisor/client-watcher.test.js.map +1 -0
  272. package/build/supervisor/idle-config.d.ts +30 -0
  273. package/build/supervisor/idle-config.d.ts.map +1 -0
  274. package/build/supervisor/idle-config.js +76 -0
  275. package/build/supervisor/idle-config.js.map +1 -0
  276. package/build/supervisor/idle-config.test.d.ts +2 -0
  277. package/build/supervisor/idle-config.test.d.ts.map +1 -0
  278. package/build/supervisor/idle-config.test.js +119 -0
  279. package/build/supervisor/idle-config.test.js.map +1 -0
  280. package/build/supervisor/ndjson-reader.d.ts +47 -0
  281. package/build/supervisor/ndjson-reader.d.ts.map +1 -0
  282. package/build/supervisor/ndjson-reader.js +75 -0
  283. package/build/supervisor/ndjson-reader.js.map +1 -0
  284. package/build/supervisor/ndjson-reader.test.d.ts +2 -0
  285. package/build/supervisor/ndjson-reader.test.d.ts.map +1 -0
  286. package/build/supervisor/ndjson-reader.test.js +92 -0
  287. package/build/supervisor/ndjson-reader.test.js.map +1 -0
  288. package/build/supervisor/pidfile.d.ts +11 -0
  289. package/build/supervisor/pidfile.d.ts.map +1 -0
  290. package/build/supervisor/pidfile.js +29 -0
  291. package/build/supervisor/pidfile.js.map +1 -0
  292. package/build/supervisor/pidfile.test.d.ts +8 -0
  293. package/build/supervisor/pidfile.test.d.ts.map +1 -0
  294. package/build/supervisor/pidfile.test.js +46 -0
  295. package/build/supervisor/pidfile.test.js.map +1 -0
  296. package/build/supervisor/restart-coordinator.d.ts +73 -0
  297. package/build/supervisor/restart-coordinator.d.ts.map +1 -0
  298. package/build/supervisor/restart-coordinator.js +300 -0
  299. package/build/supervisor/restart-coordinator.js.map +1 -0
  300. package/build/supervisor/restart-coordinator.test.d.ts +2 -0
  301. package/build/supervisor/restart-coordinator.test.d.ts.map +1 -0
  302. package/build/supervisor/restart-coordinator.test.js +434 -0
  303. package/build/supervisor/restart-coordinator.test.js.map +1 -0
  304. package/build/test-support/fake-execute-tool-call.d.ts +11 -0
  305. package/build/test-support/fake-execute-tool-call.d.ts.map +1 -0
  306. package/build/test-support/fake-execute-tool-call.js +19 -0
  307. package/build/test-support/fake-execute-tool-call.js.map +1 -0
  308. package/build/tool-error.d.ts +14 -0
  309. package/build/tool-error.d.ts.map +1 -0
  310. package/build/tool-error.js +18 -0
  311. package/build/tool-error.js.map +1 -0
  312. package/build/tool-response.d.ts +293 -0
  313. package/build/tool-response.d.ts.map +1 -0
  314. package/build/tool-response.js +365 -0
  315. package/build/tool-response.js.map +1 -0
  316. package/build/tools/assert-tools.d.ts +62 -0
  317. package/build/tools/assert-tools.d.ts.map +1 -0
  318. package/build/tools/assert-tools.js +330 -0
  319. package/build/tools/assert-tools.js.map +1 -0
  320. package/build/tools/breakpoint-await-abort.test.d.ts +2 -0
  321. package/build/tools/breakpoint-await-abort.test.d.ts.map +1 -0
  322. package/build/tools/breakpoint-await-abort.test.js +124 -0
  323. package/build/tools/breakpoint-await-abort.test.js.map +1 -0
  324. package/build/tools/breakpoint-tools.d.ts +99 -0
  325. package/build/tools/breakpoint-tools.d.ts.map +1 -0
  326. package/build/tools/breakpoint-tools.js +1197 -0
  327. package/build/tools/breakpoint-tools.js.map +1 -0
  328. package/build/tools/config-tools.d.ts +58 -0
  329. package/build/tools/config-tools.d.ts.map +1 -0
  330. package/build/tools/config-tools.js +180 -0
  331. package/build/tools/config-tools.js.map +1 -0
  332. package/build/tools/connection-routing.test.d.ts +12 -0
  333. package/build/tools/connection-routing.test.d.ts.map +1 -0
  334. package/build/tools/connection-routing.test.js +206 -0
  335. package/build/tools/connection-routing.test.js.map +1 -0
  336. package/build/tools/console-tools.d.ts +84 -0
  337. package/build/tools/console-tools.d.ts.map +1 -0
  338. package/build/tools/console-tools.js +241 -0
  339. package/build/tools/console-tools.js.map +1 -0
  340. package/build/tools/content-tools.d.ts +74 -0
  341. package/build/tools/content-tools.d.ts.map +1 -0
  342. package/build/tools/content-tools.js +582 -0
  343. package/build/tools/content-tools.js.map +1 -0
  344. package/build/tools/dashboard-tools.d.ts +38 -0
  345. package/build/tools/dashboard-tools.d.ts.map +1 -0
  346. package/build/tools/dashboard-tools.js +123 -0
  347. package/build/tools/dashboard-tools.js.map +1 -0
  348. package/build/tools/dom-tools.d.ts +41 -0
  349. package/build/tools/dom-tools.d.ts.map +1 -0
  350. package/build/tools/dom-tools.js +277 -0
  351. package/build/tools/dom-tools.js.map +1 -0
  352. package/build/tools/download-tools.d.ts +55 -0
  353. package/build/tools/download-tools.d.ts.map +1 -0
  354. package/build/tools/download-tools.js +280 -0
  355. package/build/tools/download-tools.js.map +1 -0
  356. package/build/tools/execution-tools.d.ts +40 -0
  357. package/build/tools/execution-tools.d.ts.map +1 -0
  358. package/build/tools/execution-tools.js +121 -0
  359. package/build/tools/execution-tools.js.map +1 -0
  360. package/build/tools/input-abort.test.d.ts +2 -0
  361. package/build/tools/input-abort.test.d.ts.map +1 -0
  362. package/build/tools/input-abort.test.js +227 -0
  363. package/build/tools/input-abort.test.js.map +1 -0
  364. package/build/tools/input-ambiguous-selector.test.d.ts +2 -0
  365. package/build/tools/input-ambiguous-selector.test.d.ts.map +1 -0
  366. package/build/tools/input-ambiguous-selector.test.js +34 -0
  367. package/build/tools/input-ambiguous-selector.test.js.map +1 -0
  368. package/build/tools/input-tools.d.ts +168 -0
  369. package/build/tools/input-tools.d.ts.map +1 -0
  370. package/build/tools/input-tools.js +1397 -0
  371. package/build/tools/input-tools.js.map +1 -0
  372. package/build/tools/inspection-tools.d.ts +112 -0
  373. package/build/tools/inspection-tools.d.ts.map +1 -0
  374. package/build/tools/inspection-tools.js +637 -0
  375. package/build/tools/inspection-tools.js.map +1 -0
  376. package/build/tools/interpolation.d.ts +30 -0
  377. package/build/tools/interpolation.d.ts.map +1 -0
  378. package/build/tools/interpolation.js +143 -0
  379. package/build/tools/interpolation.js.map +1 -0
  380. package/build/tools/issues-abort-hygiene.test.d.ts +2 -0
  381. package/build/tools/issues-abort-hygiene.test.d.ts.map +1 -0
  382. package/build/tools/issues-abort-hygiene.test.js +79 -0
  383. package/build/tools/issues-abort-hygiene.test.js.map +1 -0
  384. package/build/tools/issues-tools.d.ts +98 -0
  385. package/build/tools/issues-tools.d.ts.map +1 -0
  386. package/build/tools/issues-tools.js +821 -0
  387. package/build/tools/issues-tools.js.map +1 -0
  388. package/build/tools/issues-tools.test.d.ts +8 -0
  389. package/build/tools/issues-tools.test.d.ts.map +1 -0
  390. package/build/tools/issues-tools.test.js +184 -0
  391. package/build/tools/issues-tools.test.js.map +1 -0
  392. package/build/tools/modal-tools.d.ts +73 -0
  393. package/build/tools/modal-tools.d.ts.map +1 -0
  394. package/build/tools/modal-tools.js +161 -0
  395. package/build/tools/modal-tools.js.map +1 -0
  396. package/build/tools/network-tools.d.ts +72 -0
  397. package/build/tools/network-tools.d.ts.map +1 -0
  398. package/build/tools/network-tools.js +432 -0
  399. package/build/tools/network-tools.js.map +1 -0
  400. package/build/tools/page-tools.d.ts +78 -0
  401. package/build/tools/page-tools.d.ts.map +1 -0
  402. package/build/tools/page-tools.js +255 -0
  403. package/build/tools/page-tools.js.map +1 -0
  404. package/build/tools/plugin-tools.d.ts +16 -0
  405. package/build/tools/plugin-tools.d.ts.map +1 -0
  406. package/build/tools/plugin-tools.js +17 -0
  407. package/build/tools/plugin-tools.js.map +1 -0
  408. package/build/tools/replay-abort.test.d.ts +2 -0
  409. package/build/tools/replay-abort.test.d.ts.map +1 -0
  410. package/build/tools/replay-abort.test.js +259 -0
  411. package/build/tools/replay-abort.test.js.map +1 -0
  412. package/build/tools/replay-add-conditional.test.d.ts +2 -0
  413. package/build/tools/replay-add-conditional.test.d.ts.map +1 -0
  414. package/build/tools/replay-add-conditional.test.js +205 -0
  415. package/build/tools/replay-add-conditional.test.js.map +1 -0
  416. package/build/tools/replay-background-run.test.d.ts +2 -0
  417. package/build/tools/replay-background-run.test.d.ts.map +1 -0
  418. package/build/tools/replay-background-run.test.js +176 -0
  419. package/build/tools/replay-background-run.test.js.map +1 -0
  420. package/build/tools/replay-capture-variables.test.d.ts +2 -0
  421. package/build/tools/replay-capture-variables.test.d.ts.map +1 -0
  422. package/build/tools/replay-capture-variables.test.js +331 -0
  423. package/build/tools/replay-capture-variables.test.js.map +1 -0
  424. package/build/tools/replay-conditional-idb-and-launch.test.d.ts +11 -0
  425. package/build/tools/replay-conditional-idb-and-launch.test.d.ts.map +1 -0
  426. package/build/tools/replay-conditional-idb-and-launch.test.js +429 -0
  427. package/build/tools/replay-conditional-idb-and-launch.test.js.map +1 -0
  428. package/build/tools/replay-conditional-timeout.test.d.ts +14 -0
  429. package/build/tools/replay-conditional-timeout.test.d.ts.map +1 -0
  430. package/build/tools/replay-conditional-timeout.test.js +126 -0
  431. package/build/tools/replay-conditional-timeout.test.js.map +1 -0
  432. package/build/tools/replay-declare.test.d.ts +2 -0
  433. package/build/tools/replay-declare.test.d.ts.map +1 -0
  434. package/build/tools/replay-declare.test.js +106 -0
  435. package/build/tools/replay-declare.test.js.map +1 -0
  436. package/build/tools/replay-declared-browser-cleanup.test.d.ts +2 -0
  437. package/build/tools/replay-declared-browser-cleanup.test.d.ts.map +1 -0
  438. package/build/tools/replay-declared-browser-cleanup.test.js +103 -0
  439. package/build/tools/replay-declared-browser-cleanup.test.js.map +1 -0
  440. package/build/tools/replay-declared-profile.test.d.ts +2 -0
  441. package/build/tools/replay-declared-profile.test.d.ts.map +1 -0
  442. package/build/tools/replay-declared-profile.test.js +116 -0
  443. package/build/tools/replay-declared-profile.test.js.map +1 -0
  444. package/build/tools/replay-executor.d.ts +556 -0
  445. package/build/tools/replay-executor.d.ts.map +1 -0
  446. package/build/tools/replay-executor.js +2347 -0
  447. package/build/tools/replay-executor.js.map +1 -0
  448. package/build/tools/replay-folder-save.test.d.ts +2 -0
  449. package/build/tools/replay-folder-save.test.d.ts.map +1 -0
  450. package/build/tools/replay-folder-save.test.js +63 -0
  451. package/build/tools/replay-folder-save.test.js.map +1 -0
  452. package/build/tools/replay-formatters.d.ts +148 -0
  453. package/build/tools/replay-formatters.d.ts.map +1 -0
  454. package/build/tools/replay-formatters.js +856 -0
  455. package/build/tools/replay-formatters.js.map +1 -0
  456. package/build/tools/replay-kill-chrome-on-finish.test.d.ts +2 -0
  457. package/build/tools/replay-kill-chrome-on-finish.test.d.ts.map +1 -0
  458. package/build/tools/replay-kill-chrome-on-finish.test.js +175 -0
  459. package/build/tools/replay-kill-chrome-on-finish.test.js.map +1 -0
  460. package/build/tools/replay-multi-connection.test.d.ts +2 -0
  461. package/build/tools/replay-multi-connection.test.d.ts.map +1 -0
  462. package/build/tools/replay-multi-connection.test.js +547 -0
  463. package/build/tools/replay-multi-connection.test.js.map +1 -0
  464. package/build/tools/replay-output-and-record-options.test.d.ts +2 -0
  465. package/build/tools/replay-output-and-record-options.test.d.ts.map +1 -0
  466. package/build/tools/replay-output-and-record-options.test.js +240 -0
  467. package/build/tools/replay-output-and-record-options.test.js.map +1 -0
  468. package/build/tools/replay-production-error-shape.test.d.ts +7 -0
  469. package/build/tools/replay-production-error-shape.test.d.ts.map +1 -0
  470. package/build/tools/replay-production-error-shape.test.js +93 -0
  471. package/build/tools/replay-production-error-shape.test.js.map +1 -0
  472. package/build/tools/replay-rebase.test.d.ts +2 -0
  473. package/build/tools/replay-rebase.test.d.ts.map +1 -0
  474. package/build/tools/replay-rebase.test.js +58 -0
  475. package/build/tools/replay-rebase.test.js.map +1 -0
  476. package/build/tools/replay-retry-classification.test.d.ts +9 -0
  477. package/build/tools/replay-retry-classification.test.d.ts.map +1 -0
  478. package/build/tools/replay-retry-classification.test.js +57 -0
  479. package/build/tools/replay-retry-classification.test.js.map +1 -0
  480. package/build/tools/replay-run-registry.d.ts +55 -0
  481. package/build/tools/replay-run-registry.d.ts.map +1 -0
  482. package/build/tools/replay-run-registry.js +65 -0
  483. package/build/tools/replay-run-registry.js.map +1 -0
  484. package/build/tools/replay-sequence-reload.test.d.ts +2 -0
  485. package/build/tools/replay-sequence-reload.test.d.ts.map +1 -0
  486. package/build/tools/replay-sequence-reload.test.js +82 -0
  487. package/build/tools/replay-sequence-reload.test.js.map +1 -0
  488. package/build/tools/replay-socket-scope.test.d.ts +2 -0
  489. package/build/tools/replay-socket-scope.test.d.ts.map +1 -0
  490. package/build/tools/replay-socket-scope.test.js +75 -0
  491. package/build/tools/replay-socket-scope.test.js.map +1 -0
  492. package/build/tools/replay-step-connection.test.d.ts +2 -0
  493. package/build/tools/replay-step-connection.test.d.ts.map +1 -0
  494. package/build/tools/replay-step-connection.test.js +292 -0
  495. package/build/tools/replay-step-connection.test.js.map +1 -0
  496. package/build/tools/replay-step-timeout.test.d.ts +2 -0
  497. package/build/tools/replay-step-timeout.test.d.ts.map +1 -0
  498. package/build/tools/replay-step-timeout.test.js +204 -0
  499. package/build/tools/replay-step-timeout.test.js.map +1 -0
  500. package/build/tools/replay-tags.test.d.ts +2 -0
  501. package/build/tools/replay-tags.test.d.ts.map +1 -0
  502. package/build/tools/replay-tags.test.js +99 -0
  503. package/build/tools/replay-tags.test.js.map +1 -0
  504. package/build/tools/replay-teardown-and-foreach.test.d.ts +13 -0
  505. package/build/tools/replay-teardown-and-foreach.test.d.ts.map +1 -0
  506. package/build/tools/replay-teardown-and-foreach.test.js +318 -0
  507. package/build/tools/replay-teardown-and-foreach.test.js.map +1 -0
  508. package/build/tools/replay-tool-name-validation.test.d.ts +2 -0
  509. package/build/tools/replay-tool-name-validation.test.d.ts.map +1 -0
  510. package/build/tools/replay-tool-name-validation.test.js +280 -0
  511. package/build/tools/replay-tool-name-validation.test.js.map +1 -0
  512. package/build/tools/replay-tools.d.ts +288 -0
  513. package/build/tools/replay-tools.d.ts.map +1 -0
  514. package/build/tools/replay-tools.js +2994 -0
  515. package/build/tools/replay-tools.js.map +1 -0
  516. package/build/tools/request-abort.test.d.ts +2 -0
  517. package/build/tools/request-abort.test.d.ts.map +1 -0
  518. package/build/tools/request-abort.test.js +130 -0
  519. package/build/tools/request-abort.test.js.map +1 -0
  520. package/build/tools/request-tools.d.ts +56 -0
  521. package/build/tools/request-tools.d.ts.map +1 -0
  522. package/build/tools/request-tools.js +174 -0
  523. package/build/tools/request-tools.js.map +1 -0
  524. package/build/tools/screenshot-tools.d.ts +135 -0
  525. package/build/tools/screenshot-tools.d.ts.map +1 -0
  526. package/build/tools/screenshot-tools.js +636 -0
  527. package/build/tools/screenshot-tools.js.map +1 -0
  528. package/build/tools/server-tools.d.ts +88 -0
  529. package/build/tools/server-tools.d.ts.map +1 -0
  530. package/build/tools/server-tools.js +485 -0
  531. package/build/tools/server-tools.js.map +1 -0
  532. package/build/tools/source-tools.d.ts +46 -0
  533. package/build/tools/source-tools.d.ts.map +1 -0
  534. package/build/tools/source-tools.js +47 -0
  535. package/build/tools/source-tools.js.map +1 -0
  536. package/build/tools/storage-tools.d.ts +141 -0
  537. package/build/tools/storage-tools.d.ts.map +1 -0
  538. package/build/tools/storage-tools.js +894 -0
  539. package/build/tools/storage-tools.js.map +1 -0
  540. package/build/tools/storage-tools.test.d.ts +13 -0
  541. package/build/tools/storage-tools.test.d.ts.map +1 -0
  542. package/build/tools/storage-tools.test.js +707 -0
  543. package/build/tools/storage-tools.test.js.map +1 -0
  544. package/build/tools/tab-tools.d.ts +42 -0
  545. package/build/tools/tab-tools.d.ts.map +1 -0
  546. package/build/tools/tab-tools.js +296 -0
  547. package/build/tools/tab-tools.js.map +1 -0
  548. package/build/tools/wait-tools.d.ts +85 -0
  549. package/build/tools/wait-tools.d.ts.map +1 -0
  550. package/build/tools/wait-tools.js +236 -0
  551. package/build/tools/wait-tools.js.map +1 -0
  552. package/build/tools/wait-tools.test.d.ts +9 -0
  553. package/build/tools/wait-tools.test.d.ts.map +1 -0
  554. package/build/tools/wait-tools.test.js +193 -0
  555. package/build/tools/wait-tools.test.js.map +1 -0
  556. package/build/types.d.ts +133 -0
  557. package/build/types.d.ts.map +1 -0
  558. package/build/types.js +5 -0
  559. package/build/types.js.map +1 -0
  560. package/build/ui-verifier.d.ts +88 -0
  561. package/build/ui-verifier.d.ts.map +1 -0
  562. package/build/ui-verifier.js +540 -0
  563. package/build/ui-verifier.js.map +1 -0
  564. package/build/utils/abort.d.ts +68 -0
  565. package/build/utils/abort.d.ts.map +1 -0
  566. package/build/utils/abort.js +159 -0
  567. package/build/utils/abort.js.map +1 -0
  568. package/build/utils/abort.test.d.ts +2 -0
  569. package/build/utils/abort.test.d.ts.map +1 -0
  570. package/build/utils/abort.test.js +174 -0
  571. package/build/utils/abort.test.js.map +1 -0
  572. package/build/utils/modal-detection-core.d.ts +150 -0
  573. package/build/utils/modal-detection-core.d.ts.map +1 -0
  574. package/build/utils/modal-detection-core.js +332 -0
  575. package/build/utils/modal-detection-core.js.map +1 -0
  576. package/build/utils/modal-detection-core.test.d.ts +5 -0
  577. package/build/utils/modal-detection-core.test.d.ts.map +1 -0
  578. package/build/utils/modal-detection-core.test.js +492 -0
  579. package/build/utils/modal-detection-core.test.js.map +1 -0
  580. package/build/utils/modal-detector.d.ts +29 -0
  581. package/build/utils/modal-detector.d.ts.map +1 -0
  582. package/build/utils/modal-detector.js +281 -0
  583. package/build/utils/modal-detector.js.map +1 -0
  584. package/build/utils/modal-dismissal.d.ts +32 -0
  585. package/build/utils/modal-dismissal.d.ts.map +1 -0
  586. package/build/utils/modal-dismissal.js +190 -0
  587. package/build/utils/modal-dismissal.js.map +1 -0
  588. package/build/utils/port-check.d.ts +31 -0
  589. package/build/utils/port-check.d.ts.map +1 -0
  590. package/build/utils/port-check.js +87 -0
  591. package/build/utils/port-check.js.map +1 -0
  592. package/build/utils/port-check.test.d.ts +2 -0
  593. package/build/utils/port-check.test.d.ts.map +1 -0
  594. package/build/utils/port-check.test.js +66 -0
  595. package/build/utils/port-check.test.js.map +1 -0
  596. package/build/utils/selector-resolver.d.ts +66 -0
  597. package/build/utils/selector-resolver.d.ts.map +1 -0
  598. package/build/utils/selector-resolver.js +200 -0
  599. package/build/utils/selector-resolver.js.map +1 -0
  600. package/build/validation-helpers.d.ts +41 -0
  601. package/build/validation-helpers.d.ts.map +1 -0
  602. package/build/validation-helpers.js +236 -0
  603. package/build/validation-helpers.js.map +1 -0
  604. package/build/window-sizing.d.ts +26 -0
  605. package/build/window-sizing.d.ts.map +1 -0
  606. package/build/window-sizing.js +87 -0
  607. package/build/window-sizing.js.map +1 -0
  608. package/build/window-sizing.test.d.ts +8 -0
  609. package/build/window-sizing.test.d.ts.map +1 -0
  610. package/build/window-sizing.test.js +113 -0
  611. package/build/window-sizing.test.js.map +1 -0
  612. package/docs/README.md +74 -0
  613. package/docs/automation.md +562 -0
  614. package/docs/debugging.md +229 -0
  615. package/docs/installation.md +133 -0
  616. package/docs/instructions.md +227 -0
  617. package/docs/mcp-instructions.md +15 -0
  618. package/docs/message-system.md +327 -0
  619. package/docs/messages.md +3480 -0
  620. package/docs/parser-plugins.md +132 -0
  621. package/docs/replay.md +1411 -0
  622. package/docs/troubleshooting.md +272 -0
  623. package/docs/working_with_llm_notes.md +5 -0
  624. package/package.json +87 -0
  625. package/skills/devharness/SKILL.md +195 -0
  626. package/skills/devharness/references/sequences.md +613 -0
  627. package/skills/devharness/references/tool-categories.md +99 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * UI Verifier - CDP-based deterministic UI verification
3
+ *
4
+ * Uses Chrome DevTools Protocol directly for accurate, deterministic checks:
5
+ * - DOMDebugger.getEventListeners: Detect buttons/elements without click handlers
6
+ * - DOM.getBoxModel: Get exact element positions and dimensions
7
+ * - Page.getLayoutMetrics: Get viewport and content size
8
+ * - CSS.getComputedStyleForNode: Get computed styles for overflow detection
9
+ * - DOM.getNodeForLocation: Check what's actually clickable at a point
10
+ */
11
+ import type { Page } from 'puppeteer-core';
12
+ export interface UIIssue {
13
+ type: UIIssueType;
14
+ severity: 'error' | 'warning' | 'info';
15
+ selector: string;
16
+ text?: string;
17
+ details: Record<string, any>;
18
+ recommendation: string;
19
+ }
20
+ export type UIIssueType = 'no-click-handler' | 'outside-viewport' | 'partially-outside-viewport' | 'small-touch-target' | 'overflow-clipping' | 'not-clickable' | 'dead-link' | 'horizontal-scroll';
21
+ export interface ViewportMetrics {
22
+ width: number;
23
+ height: number;
24
+ scrollX: number;
25
+ scrollY: number;
26
+ contentWidth: number;
27
+ contentHeight: number;
28
+ }
29
+ export interface VerifyOptions {
30
+ checks?: UICheckType[];
31
+ minTouchTargetSize?: number;
32
+ }
33
+ export type UICheckType = 'handlers' | 'viewport' | 'touch' | 'overflow' | 'clickability' | 'links' | 'scroll';
34
+ export interface VerifyResult {
35
+ issues: UIIssue[];
36
+ viewport: ViewportMetrics;
37
+ scannedElements: number;
38
+ timestamp: number;
39
+ checksPerformed: UICheckType[];
40
+ }
41
+ export declare class UIVerifier {
42
+ private page;
43
+ private cdpSession;
44
+ constructor(page: Page);
45
+ /**
46
+ * Run UI verification with specified checks
47
+ */
48
+ verify(options?: VerifyOptions): Promise<VerifyResult>;
49
+ /**
50
+ * Get viewport and content metrics using Page.getLayoutMetrics
51
+ */
52
+ private getViewportMetrics;
53
+ /**
54
+ * Find all interactive elements and get their properties
55
+ */
56
+ private findInteractiveElements;
57
+ /**
58
+ * Check if an element has click/touch event handlers using DOMDebugger.getEventListeners
59
+ */
60
+ private checkEventListeners;
61
+ /**
62
+ * Determine if an element should have a click handler based on its type
63
+ */
64
+ private shouldHaveHandler;
65
+ /**
66
+ * Check if a link href is "dead" (empty, #, javascript:void)
67
+ */
68
+ private isDeadLink;
69
+ /**
70
+ * Check element position relative to viewport
71
+ */
72
+ private checkViewportPosition;
73
+ /**
74
+ * Check if an element is actually clickable at its center point
75
+ * Uses DOM.getNodeForLocation to see what's at that position
76
+ */
77
+ private checkClickability;
78
+ /**
79
+ * Check if nodeId is an ancestor of childNodeId
80
+ */
81
+ private isAncestor;
82
+ /**
83
+ * Check for overflow on all elements
84
+ * Reports ALL overflow with context about how it's handled
85
+ */
86
+ private checkOverflowClipping;
87
+ }
88
+ //# sourceMappingURL=ui-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-verifier.d.ts","sourceRoot":"","sources":["../src/ui-verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,gBAAgB,CAAC;AAGvD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,4BAA4B,GAC5B,oBAAoB,GACpB,mBAAmB,GACnB,eAAe,GACf,WAAW,GACX,mBAAmB,CAAC;AAExB,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,UAAU,GACV,OAAO,GACP,UAAU,GACV,cAAc,GACd,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,WAAW,EAAE,CAAC;CAChC;AAWD,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,UAAU,CAA2B;gBAEjC,IAAI,EAAE,IAAI;IAItB;;OAEG;IACG,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAkKhE;;OAEG;YACW,kBAAkB;IAahC;;OAEG;YACW,uBAAuB;IAkHrC;;OAEG;YACW,mBAAmB;IAoBjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;OAGG;YACW,iBAAiB;IA2B/B;;OAEG;YACW,UAAU;IAqBxB;;;OAGG;YACW,qBAAqB;CAkGpC"}
@@ -0,0 +1,540 @@
1
+ /**
2
+ * UI Verifier - CDP-based deterministic UI verification
3
+ *
4
+ * Uses Chrome DevTools Protocol directly for accurate, deterministic checks:
5
+ * - DOMDebugger.getEventListeners: Detect buttons/elements without click handlers
6
+ * - DOM.getBoxModel: Get exact element positions and dimensions
7
+ * - Page.getLayoutMetrics: Get viewport and content size
8
+ * - CSS.getComputedStyleForNode: Get computed styles for overflow detection
9
+ * - DOM.getNodeForLocation: Check what's actually clickable at a point
10
+ */
11
+ // Default checks (clickability and touch are expensive/noisy, disabled by default)
12
+ const DEFAULT_CHECKS = ['handlers', 'viewport', 'overflow', 'links', 'scroll'];
13
+ // Click event types that indicate an element is interactive
14
+ const CLICK_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'pointerdown', 'pointerup'];
15
+ // Minimum touch target size per WCAG 2.2
16
+ const DEFAULT_MIN_TOUCH_TARGET = 44;
17
+ export class UIVerifier {
18
+ page;
19
+ cdpSession = null;
20
+ constructor(page) {
21
+ this.page = page;
22
+ }
23
+ /**
24
+ * Run UI verification with specified checks
25
+ */
26
+ async verify(options = {}) {
27
+ const checks = options.checks || DEFAULT_CHECKS;
28
+ const minTouchTargetSize = options.minTouchTargetSize || DEFAULT_MIN_TOUCH_TARGET;
29
+ // Create CDP session for direct protocol access
30
+ this.cdpSession = await this.page.target().createCDPSession();
31
+ try {
32
+ const issues = [];
33
+ // Get viewport metrics first
34
+ const viewport = await this.getViewportMetrics();
35
+ // Check for horizontal scroll (page-level)
36
+ if (checks.includes('scroll')) {
37
+ if (viewport.contentWidth > viewport.width) {
38
+ issues.push({
39
+ type: 'horizontal-scroll',
40
+ severity: 'info',
41
+ selector: 'document',
42
+ details: {
43
+ contentWidth: viewport.contentWidth,
44
+ viewportWidth: viewport.width,
45
+ overflow: viewport.contentWidth - viewport.width,
46
+ },
47
+ recommendation: 'Page has horizontal scroll - may indicate layout issue or intentional design',
48
+ });
49
+ }
50
+ }
51
+ // Get all interactive elements
52
+ const interactives = await this.findInteractiveElements();
53
+ // Run checks on each element
54
+ for (const element of interactives) {
55
+ // Check 1: Event listeners (dead buttons)
56
+ if (checks.includes('handlers')) {
57
+ const hasHandler = await this.checkEventListeners(element.objectId, element.tagName);
58
+ if (!hasHandler && this.shouldHaveHandler(element)) {
59
+ issues.push({
60
+ type: 'no-click-handler',
61
+ severity: 'error',
62
+ selector: element.selector,
63
+ text: element.text,
64
+ details: {
65
+ tagName: element.tagName,
66
+ eventListeners: [],
67
+ },
68
+ recommendation: 'This element looks interactive but has no click/touch event handlers attached',
69
+ });
70
+ }
71
+ }
72
+ // Check 2: Viewport position
73
+ if (checks.includes('viewport') && element.box) {
74
+ const position = this.checkViewportPosition(element.box, viewport);
75
+ if (position === 'outside') {
76
+ issues.push({
77
+ type: 'outside-viewport',
78
+ severity: 'info',
79
+ selector: element.selector,
80
+ text: element.text,
81
+ details: {
82
+ x: element.box.x,
83
+ y: element.box.y,
84
+ viewportWidth: viewport.width,
85
+ viewportHeight: viewport.height,
86
+ },
87
+ recommendation: 'Element is outside visible area - user must scroll to interact',
88
+ });
89
+ }
90
+ else if (position === 'partial') {
91
+ issues.push({
92
+ type: 'partially-outside-viewport',
93
+ severity: 'warning',
94
+ selector: element.selector,
95
+ text: element.text,
96
+ details: {
97
+ x: element.box.x,
98
+ y: element.box.y,
99
+ width: element.box.width,
100
+ height: element.box.height,
101
+ },
102
+ recommendation: 'Element is partially clipped by viewport edge',
103
+ });
104
+ }
105
+ }
106
+ // Check 3: Touch target size
107
+ if (checks.includes('touch') && element.box) {
108
+ if (element.box.width < minTouchTargetSize || element.box.height < minTouchTargetSize) {
109
+ issues.push({
110
+ type: 'small-touch-target',
111
+ severity: 'warning',
112
+ selector: element.selector,
113
+ text: element.text,
114
+ details: {
115
+ width: Math.round(element.box.width),
116
+ height: Math.round(element.box.height),
117
+ minimum: minTouchTargetSize,
118
+ },
119
+ recommendation: `Touch target should be at least ${minTouchTargetSize}x${minTouchTargetSize}px (WCAG 2.2)`,
120
+ });
121
+ }
122
+ }
123
+ // Check 4: Dead links
124
+ if (checks.includes('links') && element.tagName === 'A') {
125
+ const href = element.attributes?.href;
126
+ if (this.isDeadLink(href)) {
127
+ issues.push({
128
+ type: 'dead-link',
129
+ severity: 'warning',
130
+ selector: element.selector,
131
+ text: element.text,
132
+ details: {
133
+ href: href || '(empty)',
134
+ },
135
+ recommendation: 'Link has no valid destination',
136
+ });
137
+ }
138
+ }
139
+ // Check 5: Clickability (z-index blocking) - expensive
140
+ if (checks.includes('clickability') && element.box && element.nodeId) {
141
+ const isClickable = await this.checkClickability(element.nodeId, element.box);
142
+ if (!isClickable) {
143
+ issues.push({
144
+ type: 'not-clickable',
145
+ severity: 'error',
146
+ selector: element.selector,
147
+ text: element.text,
148
+ details: {
149
+ reason: 'Another element is blocking this element',
150
+ },
151
+ recommendation: 'Element is covered by another element - check z-index and positioning',
152
+ });
153
+ }
154
+ }
155
+ }
156
+ // Check 6: Overflow clipping (on all elements, not just interactive)
157
+ if (checks.includes('overflow')) {
158
+ const overflowIssues = await this.checkOverflowClipping();
159
+ issues.push(...overflowIssues);
160
+ }
161
+ return {
162
+ issues,
163
+ viewport,
164
+ scannedElements: interactives.length,
165
+ timestamp: Date.now(),
166
+ checksPerformed: checks,
167
+ };
168
+ }
169
+ finally {
170
+ // Clean up CDP session
171
+ if (this.cdpSession) {
172
+ await this.cdpSession.detach().catch(() => { });
173
+ this.cdpSession = null;
174
+ }
175
+ }
176
+ }
177
+ /**
178
+ * Get viewport and content metrics using Page.getLayoutMetrics
179
+ */
180
+ async getViewportMetrics() {
181
+ const metrics = await this.cdpSession.send('Page.getLayoutMetrics');
182
+ return {
183
+ width: metrics.layoutViewport.clientWidth,
184
+ height: metrics.layoutViewport.clientHeight,
185
+ scrollX: metrics.layoutViewport.pageX,
186
+ scrollY: metrics.layoutViewport.pageY,
187
+ contentWidth: metrics.contentSize.width,
188
+ contentHeight: metrics.contentSize.height,
189
+ };
190
+ }
191
+ /**
192
+ * Find all interactive elements and get their properties
193
+ */
194
+ async findInteractiveElements() {
195
+ // Get all interactive elements with their properties in one evaluate
196
+ // @ts-ignore - This code runs in browser context
197
+ const elements = await this.page.evaluate(() => {
198
+ const interactiveSelectors = [
199
+ 'button',
200
+ 'a',
201
+ 'input:not([type="hidden"])',
202
+ 'select',
203
+ 'textarea',
204
+ '[role="button"]',
205
+ '[role="link"]',
206
+ '[role="menuitem"]',
207
+ '[role="tab"]',
208
+ '[tabindex]:not([tabindex="-1"])',
209
+ '[onclick]',
210
+ '[data-click]',
211
+ ];
212
+ const elements = [];
213
+ // @ts-ignore
214
+ const seen = new Set();
215
+ for (const selectorStr of interactiveSelectors) {
216
+ // @ts-ignore
217
+ document.querySelectorAll(selectorStr).forEach((el) => {
218
+ if (seen.has(el))
219
+ return;
220
+ seen.add(el);
221
+ const rect = el.getBoundingClientRect();
222
+ const isVisible = rect.width > 0 && rect.height > 0;
223
+ // Skip invisible elements
224
+ if (!isVisible)
225
+ return;
226
+ // Get attributes
227
+ const attributes = {};
228
+ for (const attr of Array.from(el.attributes)) {
229
+ attributes[attr.name] = attr.value;
230
+ }
231
+ // Generate a unique selector
232
+ let uniqueSelector = '';
233
+ if (el.id) {
234
+ uniqueSelector = `#${el.id}`;
235
+ }
236
+ else if (attributes['data-testid']) {
237
+ uniqueSelector = `[data-testid="${attributes['data-testid']}"]`;
238
+ }
239
+ else if (attributes['aria-label']) {
240
+ uniqueSelector = `[aria-label="${attributes['aria-label']}"]`;
241
+ }
242
+ else {
243
+ const tag = el.tagName.toLowerCase();
244
+ const text = (el.textContent || '').trim().substring(0, 30);
245
+ if (text) {
246
+ uniqueSelector = `${tag}:has-text("${text}")`;
247
+ }
248
+ else {
249
+ uniqueSelector = tag;
250
+ }
251
+ }
252
+ elements.push({
253
+ tagName: el.tagName,
254
+ text: (el.textContent || '').trim().substring(0, 100),
255
+ selector: uniqueSelector,
256
+ attributes,
257
+ box: {
258
+ x: rect.x,
259
+ y: rect.y,
260
+ width: rect.width,
261
+ height: rect.height,
262
+ },
263
+ });
264
+ });
265
+ }
266
+ return elements;
267
+ });
268
+ // Now get objectId for each element for CDP calls
269
+ const results = [];
270
+ for (const el of elements) {
271
+ try {
272
+ // Get element handle and objectId via Runtime.evaluate
273
+ const result = await this.cdpSession.send('Runtime.evaluate', {
274
+ expression: `document.querySelector('${el.selector.replace(/'/g, "\\'")}')`,
275
+ objectGroup: 'ui-verify',
276
+ });
277
+ if (result.result.objectId) {
278
+ // Also get nodeId for clickability check
279
+ const { node } = await this.cdpSession.send('DOM.describeNode', {
280
+ objectId: result.result.objectId,
281
+ });
282
+ results.push({
283
+ ...el,
284
+ objectId: result.result.objectId,
285
+ nodeId: node.nodeId,
286
+ });
287
+ }
288
+ else {
289
+ results.push(el);
290
+ }
291
+ }
292
+ catch {
293
+ // Element might not be found, skip
294
+ results.push(el);
295
+ }
296
+ }
297
+ // Clean up object group
298
+ await this.cdpSession.send('Runtime.releaseObjectGroup', { objectGroup: 'ui-verify' }).catch(() => { });
299
+ return results;
300
+ }
301
+ /**
302
+ * Check if an element has click/touch event handlers using DOMDebugger.getEventListeners
303
+ */
304
+ async checkEventListeners(objectId, tagName) {
305
+ if (!objectId)
306
+ return true; // Can't check, assume it has handlers
307
+ try {
308
+ const result = await this.cdpSession.send('DOMDebugger.getEventListeners', {
309
+ objectId,
310
+ depth: 1,
311
+ pierce: true, // Include shadow DOM
312
+ });
313
+ const listeners = result.listeners || [];
314
+ // Check if any listener is a click-type event
315
+ return listeners.some((l) => CLICK_EVENT_TYPES.includes(l.type));
316
+ }
317
+ catch {
318
+ // If we can't get listeners, assume it has them (fail safe)
319
+ return true;
320
+ }
321
+ }
322
+ /**
323
+ * Determine if an element should have a click handler based on its type
324
+ */
325
+ shouldHaveHandler(element) {
326
+ const { tagName, attributes } = element;
327
+ // Buttons should always have handlers unless they're submit buttons in a form
328
+ if (tagName === 'BUTTON') {
329
+ const type = attributes?.type?.toLowerCase();
330
+ // Submit and reset buttons work without JS handlers
331
+ if (type === 'submit' || type === 'reset')
332
+ return false;
333
+ return true;
334
+ }
335
+ // Links with valid href don't need handlers
336
+ if (tagName === 'A') {
337
+ const href = attributes?.href;
338
+ if (href && !this.isDeadLink(href))
339
+ return false;
340
+ return true;
341
+ }
342
+ // Elements with role="button" should have handlers
343
+ if (attributes?.role === 'button')
344
+ return true;
345
+ // Elements with onclick attribute already have handlers (checked via attribute)
346
+ if (attributes?.onclick)
347
+ return false;
348
+ // Input types that need handlers
349
+ if (tagName === 'INPUT') {
350
+ const type = attributes?.type?.toLowerCase() || 'text';
351
+ // These work without JS handlers
352
+ if (['submit', 'reset', 'text', 'password', 'email', 'number', 'tel', 'url', 'search', 'checkbox', 'radio'].includes(type)) {
353
+ return false;
354
+ }
355
+ return true;
356
+ }
357
+ // Select, textarea work without handlers
358
+ if (tagName === 'SELECT' || tagName === 'TEXTAREA')
359
+ return false;
360
+ return false;
361
+ }
362
+ /**
363
+ * Check if a link href is "dead" (empty, #, javascript:void)
364
+ */
365
+ isDeadLink(href) {
366
+ if (!href)
367
+ return true;
368
+ const trimmed = href.trim();
369
+ if (trimmed === '')
370
+ return true;
371
+ if (trimmed === '#')
372
+ return true;
373
+ if (trimmed.startsWith('javascript:void'))
374
+ return true;
375
+ if (trimmed === 'javascript:;')
376
+ return true;
377
+ if (trimmed === 'javascript:')
378
+ return true;
379
+ return false;
380
+ }
381
+ /**
382
+ * Check element position relative to viewport
383
+ */
384
+ checkViewportPosition(box, viewport) {
385
+ const right = box.x + box.width;
386
+ const bottom = box.y + box.height;
387
+ // Fully outside viewport
388
+ if (right < 0 || box.x > viewport.width || bottom < 0 || box.y > viewport.height) {
389
+ return 'outside';
390
+ }
391
+ // Partially outside
392
+ if (box.x < 0 || box.y < 0 || right > viewport.width || bottom > viewport.height) {
393
+ return 'partial';
394
+ }
395
+ return 'visible';
396
+ }
397
+ /**
398
+ * Check if an element is actually clickable at its center point
399
+ * Uses DOM.getNodeForLocation to see what's at that position
400
+ */
401
+ async checkClickability(nodeId, box) {
402
+ try {
403
+ const centerX = Math.round(box.x + box.width / 2);
404
+ const centerY = Math.round(box.y + box.height / 2);
405
+ const result = await this.cdpSession.send('DOM.getNodeForLocation', {
406
+ x: centerX,
407
+ y: centerY,
408
+ includeUserAgentShadowDOM: false,
409
+ });
410
+ // Check if the node at this location is the same as our element
411
+ // or if our element is an ancestor of the node at this location
412
+ if (!result.nodeId)
413
+ return true; // Can't determine, assume clickable
414
+ if (result.nodeId === nodeId)
415
+ return true;
416
+ // Check if our node is an ancestor
417
+ return await this.isAncestor(nodeId, result.nodeId);
418
+ }
419
+ catch {
420
+ // If we can't check, assume it's clickable
421
+ return true;
422
+ }
423
+ }
424
+ /**
425
+ * Check if nodeId is an ancestor of childNodeId
426
+ */
427
+ async isAncestor(ancestorNodeId, childNodeId) {
428
+ try {
429
+ let currentId = childNodeId;
430
+ const maxDepth = 20; // Prevent infinite loops
431
+ for (let i = 0; i < maxDepth; i++) {
432
+ const { node } = await this.cdpSession.send('DOM.describeNode', {
433
+ nodeId: currentId,
434
+ });
435
+ if (!node.parentId)
436
+ return false;
437
+ if (node.parentId === ancestorNodeId)
438
+ return true;
439
+ currentId = node.parentId;
440
+ }
441
+ return false;
442
+ }
443
+ catch {
444
+ return false;
445
+ }
446
+ }
447
+ /**
448
+ * Check for overflow on all elements
449
+ * Reports ALL overflow with context about how it's handled
450
+ */
451
+ async checkOverflowClipping() {
452
+ const issues = [];
453
+ const overflowElements = await this.page.evaluate(() => {
454
+ const results = [];
455
+ const TOLERANCE = 5; // Rounding tolerance
456
+ // Check all elements - the check is fast (just property reads)
457
+ // @ts-ignore - browser context
458
+ document.querySelectorAll('*').forEach((el) => {
459
+ // Skip elements with no dimensions
460
+ if (!el.clientWidth && !el.clientHeight)
461
+ return;
462
+ const scrollW = el.scrollWidth;
463
+ const clientW = el.clientWidth;
464
+ const scrollH = el.scrollHeight;
465
+ const clientH = el.clientHeight;
466
+ // Check if content exceeds container
467
+ const overflowsX = scrollW > clientW + TOLERANCE;
468
+ const overflowsY = scrollH > clientH + TOLERANCE;
469
+ if (!overflowsX && !overflowsY)
470
+ return;
471
+ // Get computed overflow style
472
+ // @ts-ignore - browser context
473
+ const style = window.getComputedStyle(el);
474
+ // Generate selector - prefer stable attributes
475
+ let selector = '';
476
+ const testId = el.getAttribute('data-testid');
477
+ const id = el.id;
478
+ if (testId) {
479
+ selector = `[data-testid="${testId}"]`;
480
+ }
481
+ else if (id && !id.includes(':') && !id.includes('__')) {
482
+ selector = `#${id}`;
483
+ }
484
+ else {
485
+ const tag = el.tagName.toLowerCase();
486
+ const cls = Array.from(el.classList)
487
+ .find((c) => !c.includes('__') && !c.includes(':') && c.length > 2);
488
+ selector = cls ? `${tag}.${cls}` : tag;
489
+ }
490
+ results.push({
491
+ selector,
492
+ overflowX: overflowsX ? scrollW - clientW : 0,
493
+ overflowY: overflowsY ? scrollH - clientH : 0,
494
+ styleX: style.overflowX,
495
+ styleY: style.overflowY,
496
+ });
497
+ });
498
+ return results;
499
+ });
500
+ for (const el of overflowElements) {
501
+ const direction = el.overflowX && el.overflowY ? 'both' :
502
+ el.overflowX ? 'horizontal' : 'vertical';
503
+ const pixels = direction === 'horizontal' ? el.overflowX : el.overflowY;
504
+ const style = direction === 'horizontal' ? el.styleX : el.styleY;
505
+ // Determine severity based on whether content is reachable
506
+ const isClipped = style === 'hidden' || style === 'clip';
507
+ const isScrollable = style === 'auto' || style === 'scroll';
508
+ let message;
509
+ let severity;
510
+ if (isClipped) {
511
+ severity = 'warning';
512
+ message = `${pixels}px clipped and unreachable (overflow:${style}) - intentional?`;
513
+ }
514
+ else if (isScrollable) {
515
+ severity = 'info';
516
+ message = `${pixels}px scrollable content (overflow:${style})`;
517
+ }
518
+ else {
519
+ // visible or other
520
+ severity = 'info';
521
+ message = `${pixels}px overflows container bounds (overflow:${style}) - intentional?`;
522
+ }
523
+ issues.push({
524
+ type: 'overflow-clipping',
525
+ severity,
526
+ selector: el.selector,
527
+ details: {
528
+ direction,
529
+ overflowPixelsX: el.overflowX,
530
+ overflowPixelsY: el.overflowY,
531
+ overflowStyleX: el.styleX,
532
+ overflowStyleY: el.styleY,
533
+ },
534
+ recommendation: message,
535
+ });
536
+ }
537
+ return issues;
538
+ }
539
+ }
540
+ //# sourceMappingURL=ui-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-verifier.js","sourceRoot":"","sources":["../src/ui-verifier.ts"],"names":[],"mappings":"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"}