tabwright 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/dist/agent-skills/tabwright/SKILL.md +3 -0
  2. package/dist/aria-snapshot.d.ts +0 -1
  3. package/dist/aria-snapshot.js +9 -1
  4. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
  5. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
  6. package/dist/bippy.js +5 -5
  7. package/dist/browser-config.d.ts +0 -1
  8. package/dist/browser-config.js +0 -1
  9. package/dist/browser-install.d.ts +0 -1
  10. package/dist/browser-install.js +0 -1
  11. package/dist/browser-launch.d.ts +0 -1
  12. package/dist/browser-launch.js +0 -1
  13. package/dist/capability-agent-skill.d.ts +0 -1
  14. package/dist/capability-agent-skill.js +0 -1
  15. package/dist/capability-auth-state.d.ts +0 -1
  16. package/dist/capability-auth-state.js +0 -1
  17. package/dist/capability-auth.d.ts +0 -1
  18. package/dist/capability-auth.js +0 -1
  19. package/dist/capability-options.d.ts +0 -1
  20. package/dist/capability-options.js +0 -1
  21. package/dist/capability-package.d.ts +0 -1
  22. package/dist/capability-package.js +47 -2
  23. package/dist/capability-registry.d.ts +0 -1
  24. package/dist/capability-registry.js +0 -1
  25. package/dist/capability-runner.d.ts +0 -1
  26. package/dist/capability-runner.js +0 -1
  27. package/dist/capability-studio.d.ts +0 -1
  28. package/dist/capability-studio.js +0 -1
  29. package/dist/cdp-log.d.ts +0 -1
  30. package/dist/cdp-log.js +0 -1
  31. package/dist/cdp-relay.d.ts +0 -1
  32. package/dist/cdp-relay.js +0 -1
  33. package/dist/cdp-session.d.ts +0 -1
  34. package/dist/cdp-session.js +0 -1
  35. package/dist/cdp-types.d.ts +0 -1
  36. package/dist/cdp-types.js +0 -1
  37. package/dist/chrome-discovery.d.ts +0 -1
  38. package/dist/chrome-discovery.js +0 -1
  39. package/dist/clean-html.d.ts +0 -1
  40. package/dist/clean-html.js +0 -1
  41. package/dist/cli.d.ts +0 -1
  42. package/dist/cli.js +10 -56
  43. package/dist/cloud-client.d.ts +0 -1
  44. package/dist/cloud-client.js +0 -1
  45. package/dist/create-logger.d.ts +0 -1
  46. package/dist/create-logger.js +0 -1
  47. package/dist/debugger-examples-types.d.ts +0 -1
  48. package/dist/debugger-examples-types.js +0 -1
  49. package/dist/debugger-examples.d.ts +0 -1
  50. package/dist/debugger-examples.js +0 -1
  51. package/dist/debugger.d.ts +0 -1
  52. package/dist/debugger.js +0 -1
  53. package/dist/diff-utils.d.ts +0 -1
  54. package/dist/diff-utils.js +0 -1
  55. package/dist/doctor.d.ts +0 -1
  56. package/dist/doctor.js +5 -7
  57. package/dist/editor-examples.d.ts +0 -1
  58. package/dist/editor-examples.js +0 -1
  59. package/dist/editor.d.ts +0 -1
  60. package/dist/editor.js +0 -1
  61. package/dist/env-compat.d.ts +0 -1
  62. package/dist/env-compat.js +0 -1
  63. package/dist/executor.d.ts +0 -1
  64. package/dist/executor.js +1 -2
  65. package/dist/extension/background.js +10 -6
  66. package/dist/extension/manifest.json +1 -1
  67. package/dist/extension/options.js +1 -1
  68. package/dist/extension/rrweb-recorder.js +1 -1
  69. package/dist/ghost-browser.d.ts +0 -1
  70. package/dist/ghost-browser.js +0 -1
  71. package/dist/ghost-cursor-controller.d.ts +0 -1
  72. package/dist/ghost-cursor-controller.js +0 -1
  73. package/dist/ghost-cursor.d.ts +0 -1
  74. package/dist/ghost-cursor.js +0 -1
  75. package/dist/htmlrewrite.d.ts +0 -1
  76. package/dist/htmlrewrite.js +0 -1
  77. package/dist/index.d.ts +0 -1
  78. package/dist/index.js +0 -1
  79. package/dist/kill-port.d.ts +0 -1
  80. package/dist/kill-port.js +0 -1
  81. package/dist/kitty-graphics.d.ts +0 -1
  82. package/dist/kitty-graphics.js +0 -1
  83. package/dist/mcp.d.ts +0 -1
  84. package/dist/mcp.js +0 -1
  85. package/dist/package-paths.d.ts +0 -1
  86. package/dist/package-paths.js +0 -1
  87. package/dist/page-markdown.d.ts +0 -1
  88. package/dist/page-markdown.js +0 -1
  89. package/dist/performance-examples.d.ts +0 -1
  90. package/dist/performance-examples.js +0 -1
  91. package/dist/playwright-import.d.ts +0 -1
  92. package/dist/playwright-import.js +0 -1
  93. package/dist/product-paths.d.ts +0 -1
  94. package/dist/product-paths.js +0 -1
  95. package/dist/protocol.d.ts +0 -1
  96. package/dist/protocol.js +0 -1
  97. package/dist/react-source.d.ts +0 -1
  98. package/dist/react-source.js +0 -1
  99. package/dist/readability.js +4 -4
  100. package/dist/relay-client.d.ts +0 -1
  101. package/dist/relay-client.js +0 -1
  102. package/dist/relay-state.d.ts +0 -1
  103. package/dist/relay-state.js +0 -1
  104. package/dist/replay-ai-index.d.ts +0 -1
  105. package/dist/replay-ai-index.js +0 -1
  106. package/dist/replay-eval.d.ts +0 -1
  107. package/dist/replay-eval.js +0 -1
  108. package/dist/replay-handoff.d.ts +0 -1
  109. package/dist/replay-handoff.js +0 -1
  110. package/dist/replay-workflow-compiler.d.ts +0 -1
  111. package/dist/replay-workflow-compiler.js +0 -1
  112. package/dist/rrweb-recording-relay.d.ts +0 -1
  113. package/dist/rrweb-recording-relay.js +0 -1
  114. package/dist/rrweb-recording.d.ts +0 -1
  115. package/dist/rrweb-recording.js +0 -1
  116. package/dist/scoped-fs.d.ts +0 -1
  117. package/dist/scoped-fs.js +0 -1
  118. package/dist/selector-generator.js +2 -2
  119. package/dist/start-relay-server.d.ts +0 -1
  120. package/dist/start-relay-server.js +0 -1
  121. package/dist/styles-examples.d.ts +0 -1
  122. package/dist/styles-examples.js +0 -1
  123. package/dist/styles.d.ts +0 -1
  124. package/dist/styles.js +0 -1
  125. package/dist/tabwright-agent-skill.d.ts +0 -1
  126. package/dist/tabwright-agent-skill.js +0 -1
  127. package/dist/test-declarations.d.ts +0 -1
  128. package/dist/test-declarations.js +0 -1
  129. package/dist/utils.d.ts +0 -1
  130. package/dist/utils.js +2 -2
  131. package/dist/wait-for-page-load.d.ts +0 -1
  132. package/dist/wait-for-page-load.js +0 -1
  133. package/dist/workflow-capability.d.ts +0 -1
  134. package/dist/workflow-capability.js +0 -1
  135. package/package.json +8 -4
  136. package/readme.md +43 -0
  137. package/src/skill.md +5 -2
  138. package/dist/aria-snapshot.d.ts.map +0 -1
  139. package/dist/aria-snapshot.js.map +0 -1
  140. package/dist/aria-snapshot.test.d.ts +0 -2
  141. package/dist/aria-snapshot.test.d.ts.map +0 -1
  142. package/dist/aria-snapshot.test.js +0 -270
  143. package/dist/aria-snapshot.test.js.map +0 -1
  144. package/dist/aria-snapshot.unit.test.d.ts +0 -2
  145. package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
  146. package/dist/aria-snapshot.unit.test.js +0 -542
  147. package/dist/aria-snapshot.unit.test.js.map +0 -1
  148. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
  149. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
  150. package/dist/browser-config.d.ts.map +0 -1
  151. package/dist/browser-config.js.map +0 -1
  152. package/dist/browser-install.d.ts.map +0 -1
  153. package/dist/browser-install.js.map +0 -1
  154. package/dist/browser-launch.d.ts.map +0 -1
  155. package/dist/browser-launch.js.map +0 -1
  156. package/dist/builtin-capabilities.d.ts +0 -28
  157. package/dist/builtin-capabilities.d.ts.map +0 -1
  158. package/dist/builtin-capabilities.js +0 -2673
  159. package/dist/builtin-capabilities.js.map +0 -1
  160. package/dist/capability-agent-skill.d.ts.map +0 -1
  161. package/dist/capability-agent-skill.js.map +0 -1
  162. package/dist/capability-auth-state.d.ts.map +0 -1
  163. package/dist/capability-auth-state.js.map +0 -1
  164. package/dist/capability-auth.d.ts.map +0 -1
  165. package/dist/capability-auth.js.map +0 -1
  166. package/dist/capability-cli-confirmation.test.d.ts +0 -2
  167. package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
  168. package/dist/capability-cli-confirmation.test.js +0 -79
  169. package/dist/capability-cli-confirmation.test.js.map +0 -1
  170. package/dist/capability-options.d.ts.map +0 -1
  171. package/dist/capability-options.js.map +0 -1
  172. package/dist/capability-options.test.d.ts +0 -2
  173. package/dist/capability-options.test.d.ts.map +0 -1
  174. package/dist/capability-options.test.js +0 -81
  175. package/dist/capability-options.test.js.map +0 -1
  176. package/dist/capability-package.d.ts.map +0 -1
  177. package/dist/capability-package.js.map +0 -1
  178. package/dist/capability-package.test.d.ts +0 -2
  179. package/dist/capability-package.test.d.ts.map +0 -1
  180. package/dist/capability-package.test.js +0 -179
  181. package/dist/capability-package.test.js.map +0 -1
  182. package/dist/capability-registry.d.ts.map +0 -1
  183. package/dist/capability-registry.js.map +0 -1
  184. package/dist/capability-registry.test.d.ts +0 -2
  185. package/dist/capability-registry.test.d.ts.map +0 -1
  186. package/dist/capability-registry.test.js +0 -1683
  187. package/dist/capability-registry.test.js.map +0 -1
  188. package/dist/capability-runner.d.ts.map +0 -1
  189. package/dist/capability-runner.js.map +0 -1
  190. package/dist/capability-search-relevance.test.d.ts +0 -2
  191. package/dist/capability-search-relevance.test.d.ts.map +0 -1
  192. package/dist/capability-search-relevance.test.js +0 -67
  193. package/dist/capability-search-relevance.test.js.map +0 -1
  194. package/dist/capability-studio.d.ts.map +0 -1
  195. package/dist/capability-studio.js.map +0 -1
  196. package/dist/capability-studio.test.d.ts +0 -2
  197. package/dist/capability-studio.test.d.ts.map +0 -1
  198. package/dist/capability-studio.test.js +0 -41
  199. package/dist/capability-studio.test.js.map +0 -1
  200. package/dist/cdp-log.d.ts.map +0 -1
  201. package/dist/cdp-log.js.map +0 -1
  202. package/dist/cdp-log.test.d.ts +0 -2
  203. package/dist/cdp-log.test.d.ts.map +0 -1
  204. package/dist/cdp-log.test.js +0 -109
  205. package/dist/cdp-log.test.js.map +0 -1
  206. package/dist/cdp-relay.d.ts.map +0 -1
  207. package/dist/cdp-relay.js.map +0 -1
  208. package/dist/cdp-session.d.ts.map +0 -1
  209. package/dist/cdp-session.js.map +0 -1
  210. package/dist/cdp-types.d.ts.map +0 -1
  211. package/dist/cdp-types.js.map +0 -1
  212. package/dist/channel-owner-inspect.test.d.ts +0 -2
  213. package/dist/channel-owner-inspect.test.d.ts.map +0 -1
  214. package/dist/channel-owner-inspect.test.js +0 -75
  215. package/dist/channel-owner-inspect.test.js.map +0 -1
  216. package/dist/chrome-discovery.d.ts.map +0 -1
  217. package/dist/chrome-discovery.js.map +0 -1
  218. package/dist/chrome-discovery.test.d.ts +0 -2
  219. package/dist/chrome-discovery.test.d.ts.map +0 -1
  220. package/dist/chrome-discovery.test.js +0 -41
  221. package/dist/chrome-discovery.test.js.map +0 -1
  222. package/dist/clean-html.d.ts.map +0 -1
  223. package/dist/clean-html.js.map +0 -1
  224. package/dist/cli-help.test.d.ts +0 -2
  225. package/dist/cli-help.test.d.ts.map +0 -1
  226. package/dist/cli-help.test.js +0 -98
  227. package/dist/cli-help.test.js.map +0 -1
  228. package/dist/cli.d.ts.map +0 -1
  229. package/dist/cli.js.map +0 -1
  230. package/dist/cloud-client.d.ts.map +0 -1
  231. package/dist/cloud-client.js.map +0 -1
  232. package/dist/create-logger.d.ts.map +0 -1
  233. package/dist/create-logger.js.map +0 -1
  234. package/dist/debugger-examples-types.d.ts.map +0 -1
  235. package/dist/debugger-examples-types.js.map +0 -1
  236. package/dist/debugger-examples.d.ts.map +0 -1
  237. package/dist/debugger-examples.js.map +0 -1
  238. package/dist/debugger.d.ts.map +0 -1
  239. package/dist/debugger.js.map +0 -1
  240. package/dist/diff-utils.d.ts.map +0 -1
  241. package/dist/diff-utils.js.map +0 -1
  242. package/dist/diff-utils.test.d.ts +0 -2
  243. package/dist/diff-utils.test.d.ts.map +0 -1
  244. package/dist/diff-utils.test.js +0 -137
  245. package/dist/diff-utils.test.js.map +0 -1
  246. package/dist/doctor.d.ts.map +0 -1
  247. package/dist/doctor.js.map +0 -1
  248. package/dist/doctor.test.d.ts +0 -2
  249. package/dist/doctor.test.d.ts.map +0 -1
  250. package/dist/doctor.test.js +0 -208
  251. package/dist/doctor.test.js.map +0 -1
  252. package/dist/editor-examples.d.ts.map +0 -1
  253. package/dist/editor-examples.js.map +0 -1
  254. package/dist/editor.d.ts.map +0 -1
  255. package/dist/editor.js.map +0 -1
  256. package/dist/env-compat.d.ts.map +0 -1
  257. package/dist/env-compat.js.map +0 -1
  258. package/dist/executor.d.ts.map +0 -1
  259. package/dist/executor.js.map +0 -1
  260. package/dist/executor.unit.test.d.ts +0 -2
  261. package/dist/executor.unit.test.d.ts.map +0 -1
  262. package/dist/executor.unit.test.js +0 -143
  263. package/dist/executor.unit.test.js.map +0 -1
  264. package/dist/extension-connection.test.d.ts +0 -2
  265. package/dist/extension-connection.test.d.ts.map +0 -1
  266. package/dist/extension-connection.test.js +0 -708
  267. package/dist/extension-connection.test.js.map +0 -1
  268. package/dist/extension-icon-warning.test.d.ts +0 -2
  269. package/dist/extension-icon-warning.test.d.ts.map +0 -1
  270. package/dist/extension-icon-warning.test.js +0 -33
  271. package/dist/extension-icon-warning.test.js.map +0 -1
  272. package/dist/ghost-browser.d.ts.map +0 -1
  273. package/dist/ghost-browser.js.map +0 -1
  274. package/dist/ghost-cursor-controller.d.ts.map +0 -1
  275. package/dist/ghost-cursor-controller.js.map +0 -1
  276. package/dist/ghost-cursor.d.ts.map +0 -1
  277. package/dist/ghost-cursor.js.map +0 -1
  278. package/dist/htmlrewrite.d.ts.map +0 -1
  279. package/dist/htmlrewrite.js.map +0 -1
  280. package/dist/htmlrewrite.test.d.ts +0 -2
  281. package/dist/htmlrewrite.test.d.ts.map +0 -1
  282. package/dist/htmlrewrite.test.js +0 -7975
  283. package/dist/htmlrewrite.test.js.map +0 -1
  284. package/dist/index.d.ts.map +0 -1
  285. package/dist/index.js.map +0 -1
  286. package/dist/kill-port.d.ts.map +0 -1
  287. package/dist/kill-port.js.map +0 -1
  288. package/dist/kitty-graphics.d.ts.map +0 -1
  289. package/dist/kitty-graphics.js.map +0 -1
  290. package/dist/kitty-graphics.test.d.ts +0 -2
  291. package/dist/kitty-graphics.test.d.ts.map +0 -1
  292. package/dist/kitty-graphics.test.js +0 -125
  293. package/dist/kitty-graphics.test.js.map +0 -1
  294. package/dist/locator-selector.test.d.ts +0 -2
  295. package/dist/locator-selector.test.d.ts.map +0 -1
  296. package/dist/locator-selector.test.js +0 -98
  297. package/dist/locator-selector.test.js.map +0 -1
  298. package/dist/mcp-client.d.ts +0 -20
  299. package/dist/mcp-client.d.ts.map +0 -1
  300. package/dist/mcp-client.js +0 -56
  301. package/dist/mcp-client.js.map +0 -1
  302. package/dist/mcp.d.ts.map +0 -1
  303. package/dist/mcp.js.map +0 -1
  304. package/dist/on-mouse-action.test.d.ts +0 -2
  305. package/dist/on-mouse-action.test.d.ts.map +0 -1
  306. package/dist/on-mouse-action.test.js +0 -180
  307. package/dist/on-mouse-action.test.js.map +0 -1
  308. package/dist/options-page.test.d.ts +0 -2
  309. package/dist/options-page.test.d.ts.map +0 -1
  310. package/dist/options-page.test.js +0 -773
  311. package/dist/options-page.test.js.map +0 -1
  312. package/dist/package-paths.d.ts.map +0 -1
  313. package/dist/package-paths.js.map +0 -1
  314. package/dist/page-markdown.d.ts.map +0 -1
  315. package/dist/page-markdown.js.map +0 -1
  316. package/dist/performance-examples.d.ts.map +0 -1
  317. package/dist/performance-examples.js.map +0 -1
  318. package/dist/playwright-import.d.ts.map +0 -1
  319. package/dist/playwright-import.js.map +0 -1
  320. package/dist/popup-relocation.test.d.ts +0 -7
  321. package/dist/popup-relocation.test.d.ts.map +0 -1
  322. package/dist/popup-relocation.test.js +0 -139
  323. package/dist/popup-relocation.test.js.map +0 -1
  324. package/dist/product-paths.d.ts.map +0 -1
  325. package/dist/product-paths.js.map +0 -1
  326. package/dist/product-paths.test.d.ts +0 -2
  327. package/dist/product-paths.test.d.ts.map +0 -1
  328. package/dist/product-paths.test.js +0 -39
  329. package/dist/product-paths.test.js.map +0 -1
  330. package/dist/protocol.d.ts.map +0 -1
  331. package/dist/protocol.js.map +0 -1
  332. package/dist/protocol.test.d.ts +0 -2
  333. package/dist/protocol.test.d.ts.map +0 -1
  334. package/dist/protocol.test.js +0 -31
  335. package/dist/protocol.test.js.map +0 -1
  336. package/dist/react-source.d.ts.map +0 -1
  337. package/dist/react-source.js.map +0 -1
  338. package/dist/relay-client.d.ts.map +0 -1
  339. package/dist/relay-client.js.map +0 -1
  340. package/dist/relay-client.test.d.ts +0 -2
  341. package/dist/relay-client.test.d.ts.map +0 -1
  342. package/dist/relay-client.test.js +0 -305
  343. package/dist/relay-client.test.js.map +0 -1
  344. package/dist/relay-core.test.d.ts +0 -2
  345. package/dist/relay-core.test.d.ts.map +0 -1
  346. package/dist/relay-core.test.js +0 -1427
  347. package/dist/relay-core.test.js.map +0 -1
  348. package/dist/relay-navigation.test.d.ts +0 -2
  349. package/dist/relay-navigation.test.d.ts.map +0 -1
  350. package/dist/relay-navigation.test.js +0 -661
  351. package/dist/relay-navigation.test.js.map +0 -1
  352. package/dist/relay-session.test.d.ts +0 -2
  353. package/dist/relay-session.test.d.ts.map +0 -1
  354. package/dist/relay-session.test.js +0 -1121
  355. package/dist/relay-session.test.js.map +0 -1
  356. package/dist/relay-state.d.ts.map +0 -1
  357. package/dist/relay-state.js.map +0 -1
  358. package/dist/relay-state.test.d.ts +0 -2
  359. package/dist/relay-state.test.d.ts.map +0 -1
  360. package/dist/relay-state.test.js +0 -594
  361. package/dist/relay-state.test.js.map +0 -1
  362. package/dist/replay-ai-index.d.ts.map +0 -1
  363. package/dist/replay-ai-index.js.map +0 -1
  364. package/dist/replay-ai-index.test.d.ts +0 -2
  365. package/dist/replay-ai-index.test.d.ts.map +0 -1
  366. package/dist/replay-ai-index.test.js +0 -255
  367. package/dist/replay-ai-index.test.js.map +0 -1
  368. package/dist/replay-cli.test.d.ts +0 -2
  369. package/dist/replay-cli.test.d.ts.map +0 -1
  370. package/dist/replay-cli.test.js +0 -275
  371. package/dist/replay-cli.test.js.map +0 -1
  372. package/dist/replay-eval.d.ts.map +0 -1
  373. package/dist/replay-eval.js.map +0 -1
  374. package/dist/replay-handoff.d.ts.map +0 -1
  375. package/dist/replay-handoff.js.map +0 -1
  376. package/dist/replay-handoff.test.d.ts +0 -2
  377. package/dist/replay-handoff.test.d.ts.map +0 -1
  378. package/dist/replay-handoff.test.js +0 -123
  379. package/dist/replay-handoff.test.js.map +0 -1
  380. package/dist/replay-workflow-compiler.d.ts.map +0 -1
  381. package/dist/replay-workflow-compiler.js.map +0 -1
  382. package/dist/replay-workflow-compiler.test.d.ts +0 -2
  383. package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
  384. package/dist/replay-workflow-compiler.test.js +0 -223
  385. package/dist/replay-workflow-compiler.test.js.map +0 -1
  386. package/dist/rrweb-recording-relay.d.ts.map +0 -1
  387. package/dist/rrweb-recording-relay.js.map +0 -1
  388. package/dist/rrweb-recording-relay.test.d.ts +0 -2
  389. package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
  390. package/dist/rrweb-recording-relay.test.js +0 -85
  391. package/dist/rrweb-recording-relay.test.js.map +0 -1
  392. package/dist/rrweb-recording.d.ts.map +0 -1
  393. package/dist/rrweb-recording.js.map +0 -1
  394. package/dist/scoped-fs.d.ts.map +0 -1
  395. package/dist/scoped-fs.js.map +0 -1
  396. package/dist/scoped-fs.test.d.ts +0 -5
  397. package/dist/scoped-fs.test.d.ts.map +0 -1
  398. package/dist/scoped-fs.test.js +0 -73
  399. package/dist/scoped-fs.test.js.map +0 -1
  400. package/dist/skill-stub.test.d.ts +0 -2
  401. package/dist/skill-stub.test.d.ts.map +0 -1
  402. package/dist/skill-stub.test.js +0 -22
  403. package/dist/skill-stub.test.js.map +0 -1
  404. package/dist/snapshot-tools.test.d.ts +0 -2
  405. package/dist/snapshot-tools.test.d.ts.map +0 -1
  406. package/dist/snapshot-tools.test.js +0 -856
  407. package/dist/snapshot-tools.test.js.map +0 -1
  408. package/dist/start-relay-server.d.ts.map +0 -1
  409. package/dist/start-relay-server.js.map +0 -1
  410. package/dist/styles-examples.d.ts.map +0 -1
  411. package/dist/styles-examples.js.map +0 -1
  412. package/dist/styles.d.ts.map +0 -1
  413. package/dist/styles.js.map +0 -1
  414. package/dist/tabwright-agent-skill.d.ts.map +0 -1
  415. package/dist/tabwright-agent-skill.js.map +0 -1
  416. package/dist/tabwright-agent-skill.test.d.ts +0 -2
  417. package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
  418. package/dist/tabwright-agent-skill.test.js +0 -51
  419. package/dist/tabwright-agent-skill.test.js.map +0 -1
  420. package/dist/test-declarations.d.ts.map +0 -1
  421. package/dist/test-declarations.js.map +0 -1
  422. package/dist/test-utils.d.ts +0 -69
  423. package/dist/test-utils.d.ts.map +0 -1
  424. package/dist/test-utils.js +0 -448
  425. package/dist/test-utils.js.map +0 -1
  426. package/dist/test-utils.test.d.ts +0 -2
  427. package/dist/test-utils.test.d.ts.map +0 -1
  428. package/dist/test-utils.test.js +0 -55
  429. package/dist/test-utils.test.js.map +0 -1
  430. package/dist/utils.d.ts.map +0 -1
  431. package/dist/utils.js.map +0 -1
  432. package/dist/wait-for-page-load.d.ts.map +0 -1
  433. package/dist/wait-for-page-load.js.map +0 -1
  434. package/dist/workflow-capability.d.ts.map +0 -1
  435. package/dist/workflow-capability.js.map +0 -1
  436. package/dist/workflow-script-flow.test.d.ts +0 -2
  437. package/dist/workflow-script-flow.test.d.ts.map +0 -1
  438. package/dist/workflow-script-flow.test.js +0 -285
  439. package/dist/workflow-script-flow.test.js.map +0 -1
  440. package/src/__snapshots__/x.com.processed.html +0 -1003
  441. package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
  442. package/src/a11y-client.ts +0 -241
  443. package/src/agent-skills/conan-config/SKILL.md +0 -141
  444. package/src/agent-skills/conan-config/agents/openai.yaml +0 -4
  445. package/src/aria-snapshot.test.ts +0 -311
  446. package/src/aria-snapshot.ts +0 -1681
  447. package/src/aria-snapshot.unit.test.ts +0 -615
  448. package/src/aria-snapshots/github-interactive.txt +0 -193
  449. package/src/aria-snapshots/github-raw.txt +0 -309
  450. package/src/aria-snapshots/hackernews-interactive.txt +0 -477
  451. package/src/aria-snapshots/hackernews-raw.txt +0 -428
  452. package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
  453. package/src/aria-snapshots/prosemirror-raw.txt +0 -145
  454. package/src/assets/aria-labels-hacker-news.png +0 -0
  455. package/src/assets/aria-labels-old-reddit.png +0 -0
  456. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
  457. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
  458. package/src/assets/x.com.html +0 -32946
  459. package/src/browser-config.ts +0 -179
  460. package/src/browser-install.ts +0 -284
  461. package/src/browser-launch.ts +0 -75
  462. package/src/builtin-capabilities.ts +0 -2765
  463. package/src/capability-agent-skill.ts +0 -305
  464. package/src/capability-auth-state.ts +0 -197
  465. package/src/capability-auth.ts +0 -249
  466. package/src/capability-cli-confirmation.test.ts +0 -90
  467. package/src/capability-options.test.ts +0 -89
  468. package/src/capability-options.ts +0 -57
  469. package/src/capability-package.test.ts +0 -204
  470. package/src/capability-package.ts +0 -555
  471. package/src/capability-registry.test.ts +0 -1905
  472. package/src/capability-registry.ts +0 -1234
  473. package/src/capability-runner.ts +0 -801
  474. package/src/capability-search-relevance.test.ts +0 -73
  475. package/src/capability-studio.test.ts +0 -45
  476. package/src/capability-studio.ts +0 -641
  477. package/src/cdp-log.test.ts +0 -131
  478. package/src/cdp-log.ts +0 -112
  479. package/src/cdp-relay.ts +0 -2944
  480. package/src/cdp-session.ts +0 -77
  481. package/src/cdp-types.ts +0 -158
  482. package/src/channel-owner-inspect.test.ts +0 -94
  483. package/src/chrome-discovery.test.ts +0 -50
  484. package/src/chrome-discovery.ts +0 -220
  485. package/src/clean-html.ts +0 -141
  486. package/src/cli-help.test.ts +0 -123
  487. package/src/cli.ts +0 -3181
  488. package/src/cloud-client.ts +0 -179
  489. package/src/create-logger.ts +0 -38
  490. package/src/debugger-examples-types.ts +0 -16
  491. package/src/debugger-examples.ts +0 -66
  492. package/src/debugger.ts +0 -708
  493. package/src/diff-utils.test.ts +0 -152
  494. package/src/diff-utils.ts +0 -70
  495. package/src/doctor.test.ts +0 -244
  496. package/src/doctor.ts +0 -321
  497. package/src/editor-examples.ts +0 -158
  498. package/src/editor.ts +0 -426
  499. package/src/env-compat.ts +0 -28
  500. package/src/executor.ts +0 -1824
  501. package/src/executor.unit.test.ts +0 -168
  502. package/src/extension-connection.test.ts +0 -855
  503. package/src/extension-icon-warning.test.ts +0 -45
  504. package/src/ghost-browser.ts +0 -149
  505. package/src/ghost-cursor-client.ts +0 -494
  506. package/src/ghost-cursor-controller.ts +0 -129
  507. package/src/ghost-cursor.ts +0 -123
  508. package/src/htmlrewrite.test.ts +0 -8008
  509. package/src/htmlrewrite.ts +0 -390
  510. package/src/index.ts +0 -53
  511. package/src/kill-port.ts +0 -219
  512. package/src/kitty-graphics.test.ts +0 -139
  513. package/src/kitty-graphics.ts +0 -79
  514. package/src/locator-selector.test.ts +0 -119
  515. package/src/mcp-client.ts +0 -78
  516. package/src/mcp.ts +0 -629
  517. package/src/on-mouse-action.test.ts +0 -226
  518. package/src/options-page.test.ts +0 -839
  519. package/src/package-paths.ts +0 -38
  520. package/src/page-markdown.ts +0 -240
  521. package/src/performance-examples.ts +0 -186
  522. package/src/playwright-import.ts +0 -59
  523. package/src/popup-relocation.test.ts +0 -163
  524. package/src/product-paths.test.ts +0 -47
  525. package/src/product-paths.ts +0 -28
  526. package/src/protocol.test.ts +0 -52
  527. package/src/protocol.ts +0 -351
  528. package/src/react-source.ts +0 -379
  529. package/src/relay-client.test.ts +0 -375
  530. package/src/relay-client.ts +0 -572
  531. package/src/relay-core.test.ts +0 -1603
  532. package/src/relay-navigation.test.ts +0 -790
  533. package/src/relay-session.test.ts +0 -1375
  534. package/src/relay-state.test.ts +0 -729
  535. package/src/relay-state.ts +0 -561
  536. package/src/replay-ai-index.test.ts +0 -278
  537. package/src/replay-ai-index.ts +0 -872
  538. package/src/replay-cli.test.ts +0 -325
  539. package/src/replay-eval.ts +0 -1039
  540. package/src/replay-handoff.test.ts +0 -163
  541. package/src/replay-handoff.ts +0 -109
  542. package/src/replay-workflow-compiler.test.ts +0 -250
  543. package/src/replay-workflow-compiler.ts +0 -700
  544. package/src/resource.md +0 -409
  545. package/src/rrweb-recording-relay.test.ts +0 -99
  546. package/src/rrweb-recording-relay.ts +0 -400
  547. package/src/rrweb-recording.ts +0 -322
  548. package/src/scoped-fs.test.ts +0 -80
  549. package/src/scoped-fs.ts +0 -420
  550. package/src/skill-stub.test.ts +0 -24
  551. package/src/snapshot-tools.test.ts +0 -1017
  552. package/src/snapshots/hacker-news-accessibility-full.md +0 -81
  553. package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
  554. package/src/snapshots/page-markdown-output.txt +0 -16
  555. package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
  556. package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
  557. package/src/start-relay-server.ts +0 -69
  558. package/src/styles-examples.ts +0 -84
  559. package/src/styles.ts +0 -343
  560. package/src/tabwright-agent-skill.test.ts +0 -61
  561. package/src/tabwright-agent-skill.ts +0 -105
  562. package/src/test-declarations.ts +0 -13
  563. package/src/test-utils.test.ts +0 -70
  564. package/src/test-utils.ts +0 -566
  565. package/src/utils.ts +0 -78
  566. package/src/wait-for-page-load.ts +0 -198
  567. package/src/workflow-capability.ts +0 -417
  568. package/src/workflow-script-flow.test.ts +0 -388
@@ -1,375 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
2
-
3
- const { getListeningPidsForPortMock, killPortProcessMock, spawnMock, unrefMock } = vi.hoisted(() => {
4
- return {
5
- getListeningPidsForPortMock: vi.fn(),
6
- killPortProcessMock: vi.fn(),
7
- spawnMock: vi.fn(),
8
- unrefMock: vi.fn(),
9
- }
10
- })
11
-
12
- vi.mock('node:child_process', () => {
13
- return { spawn: spawnMock }
14
- })
15
-
16
- vi.mock('./kill-port.js', () => {
17
- return {
18
- getListeningPidsForPort: getListeningPidsForPortMock,
19
- killPortProcess: killPortProcessMock,
20
- }
21
- })
22
-
23
- import {
24
- ensureRelayServer,
25
- getExtensionsStatus,
26
- type ExtensionStatus,
27
- selectImplicitExtension,
28
- waitForConnectedExtensions,
29
- waitForRelayVersion,
30
- } from './relay-client.js'
31
- import { RELAY_FEATURE, RELAY_FEATURES } from './protocol.js'
32
- import { VERSION } from './utils.js'
33
-
34
- afterEach(() => {
35
- vi.useRealTimers()
36
- vi.unstubAllGlobals()
37
- })
38
-
39
- function extension({ extensionId, activeTargets }: { extensionId: string; activeTargets: number }): ExtensionStatus {
40
- return {
41
- extensionId,
42
- browser: 'Chrome',
43
- profile: null,
44
- activeTargets,
45
- playwriterVersion: VERSION,
46
- }
47
- }
48
-
49
- function relayVersionResponse(version: string): Response {
50
- return new Response(JSON.stringify({ version }), {
51
- status: 200,
52
- headers: { 'content-type': 'application/json' },
53
- })
54
- }
55
-
56
- function relayFeaturesResponse(features: readonly string[] = RELAY_FEATURES): Response {
57
- return new Response(JSON.stringify({ protocolVersion: 1, features }), {
58
- status: 200,
59
- headers: { 'content-type': 'application/json' },
60
- })
61
- }
62
-
63
- function extensionsResponse(extensions: ExtensionStatus[]): Response {
64
- return new Response(JSON.stringify({ extensions }), {
65
- status: 200,
66
- headers: { 'content-type': 'application/json' },
67
- })
68
- }
69
-
70
- describe('selectImplicitExtension', () => {
71
- test('returns null without connections', () => {
72
- expect(selectImplicitExtension([])).toBeNull()
73
- })
74
-
75
- test('selects the only connection even when it has no active tabs', () => {
76
- const onlyExtension = extension({ extensionId: 'extension-1', activeTargets: 0 })
77
-
78
- expect(selectImplicitExtension([onlyExtension])).toBe(onlyExtension)
79
- })
80
-
81
- test('selects the only active connection when multiple are connected', () => {
82
- const activeExtension = extension({ extensionId: 'extension-2', activeTargets: 1 })
83
-
84
- expect(
85
- selectImplicitExtension([
86
- extension({ extensionId: 'extension-1', activeTargets: 0 }),
87
- activeExtension,
88
- extension({ extensionId: 'extension-3', activeTargets: 0 }),
89
- ]),
90
- ).toBe(activeExtension)
91
- })
92
-
93
- test.each([
94
- {
95
- name: 'none are active',
96
- activeTargets: [0, 0],
97
- },
98
- {
99
- name: 'multiple are active',
100
- activeTargets: [1, 2],
101
- },
102
- ])('returns null when $name', ({ activeTargets }) => {
103
- const extensions = activeTargets.map((targets, index) => {
104
- return extension({ extensionId: `extension-${index}`, activeTargets: targets })
105
- })
106
-
107
- expect(selectImplicitExtension(extensions)).toBeNull()
108
- })
109
- })
110
-
111
- describe('getExtensionsStatus', () => {
112
- test('preserves optional feature negotiation fields from the legacy status fallback', async () => {
113
- const fetchMock = vi.fn<typeof fetch>().mockImplementation((input) => {
114
- if (String(input).includes('/extensions/status')) {
115
- return Promise.resolve(new Response(null, { status: 404 }))
116
- }
117
- return Promise.resolve(
118
- new Response(
119
- JSON.stringify({
120
- connected: true,
121
- activeTargets: 1,
122
- browser: 'Chrome',
123
- profile: null,
124
- playwriterVersion: VERSION,
125
- protocolVersion: 1,
126
- features: ['heartbeat-v1'],
127
- connectionHealth: 'limited',
128
- missingFeatures: ['rrweb-recording-v1'],
129
- }),
130
- { status: 200, headers: { 'content-type': 'application/json' } },
131
- ),
132
- )
133
- })
134
- vi.stubGlobal('fetch', fetchMock)
135
-
136
- await expect(getExtensionsStatus()).resolves.toEqual([
137
- expect.objectContaining({
138
- extensionId: 'default',
139
- protocolVersion: 1,
140
- features: ['heartbeat-v1'],
141
- connectionHealth: 'limited',
142
- missingFeatures: ['rrweb-recording-v1'],
143
- }),
144
- ])
145
- })
146
- })
147
-
148
- describe('waitForRelayVersion', () => {
149
- beforeEach(() => {
150
- vi.restoreAllMocks()
151
- vi.clearAllMocks()
152
- vi.useRealTimers()
153
- })
154
-
155
- test('accepts the first responding version when no expected version is provided', async () => {
156
- const fetchMock = vi.fn<typeof fetch>().mockResolvedValue(relayVersionResponse('9.9.9'))
157
- vi.stubGlobal('fetch', fetchMock)
158
-
159
- await expect(waitForRelayVersion({ timeoutMs: 100 })).resolves.toBe('9.9.9')
160
- expect(fetchMock).toHaveBeenCalledTimes(1)
161
- })
162
-
163
- test('keeps polling until the expected version responds', async () => {
164
- vi.useFakeTimers()
165
- const fetchMock = vi
166
- .fn<typeof fetch>()
167
- .mockResolvedValueOnce(relayVersionResponse('9.9.9'))
168
- .mockResolvedValueOnce(relayVersionResponse(VERSION))
169
- vi.stubGlobal('fetch', fetchMock)
170
-
171
- const result = waitForRelayVersion({ timeoutMs: 500, intervalMs: 50, expectedVersion: VERSION })
172
- await vi.advanceTimersByTimeAsync(50)
173
-
174
- await expect(result).resolves.toBe(VERSION)
175
- expect(fetchMock).toHaveBeenCalledTimes(2)
176
- })
177
- })
178
-
179
- describe('waitForConnectedExtensions', () => {
180
- beforeEach(() => {
181
- vi.restoreAllMocks()
182
- vi.clearAllMocks()
183
- vi.useFakeTimers()
184
- })
185
-
186
- test('waits for a changing connection snapshot to settle before returning', async () => {
187
- const inactiveA = extension({ extensionId: 'extension-a', activeTargets: 0 })
188
- const activeB = extension({ extensionId: 'extension-b', activeTargets: 1 })
189
- const settledSnapshot = [inactiveA, activeB]
190
- const fetchMock = vi
191
- .fn<typeof fetch>()
192
- .mockResolvedValueOnce(extensionsResponse([inactiveA]))
193
- .mockResolvedValueOnce(extensionsResponse(settledSnapshot))
194
- .mockImplementation(() => {
195
- return Promise.resolve(extensionsResponse(settledSnapshot))
196
- })
197
- vi.stubGlobal('fetch', fetchMock)
198
-
199
- let settled = false
200
- const result = waitForConnectedExtensions({ timeoutMs: 500, pollIntervalMs: 50, settleMs: 100 }).then(
201
- (extensions) => {
202
- settled = true
203
- return extensions
204
- },
205
- )
206
-
207
- await vi.advanceTimersByTimeAsync(99)
208
- expect(settled).toBe(false)
209
-
210
- await vi.advanceTimersByTimeAsync(51)
211
-
212
- await expect(result).resolves.toEqual(settledSnapshot)
213
- expect(fetchMock).toHaveBeenCalledTimes(4)
214
- })
215
-
216
- test('returns the latest non-empty snapshot when the settle window exceeds the timeout', async () => {
217
- const inactiveA = extension({ extensionId: 'extension-a', activeTargets: 0 })
218
- const activeB = extension({ extensionId: 'extension-b', activeTargets: 1 })
219
- const latestSnapshot = [inactiveA, activeB]
220
- const fetchMock = vi
221
- .fn<typeof fetch>()
222
- .mockResolvedValueOnce(extensionsResponse([inactiveA]))
223
- .mockImplementation(() => {
224
- return Promise.resolve(extensionsResponse(latestSnapshot))
225
- })
226
- vi.stubGlobal('fetch', fetchMock)
227
-
228
- const result = waitForConnectedExtensions({ timeoutMs: 100, pollIntervalMs: 50, settleMs: 500 })
229
- await vi.advanceTimersByTimeAsync(100)
230
-
231
- await expect(result).resolves.toEqual(latestSnapshot)
232
- })
233
-
234
- test('does not return a connection that disappeared during the settle window', async () => {
235
- const inactiveA = extension({ extensionId: 'extension-a', activeTargets: 0 })
236
- const fetchMock = vi
237
- .fn<typeof fetch>()
238
- .mockResolvedValueOnce(extensionsResponse([inactiveA]))
239
- .mockImplementation(() => {
240
- return Promise.resolve(extensionsResponse([]))
241
- })
242
- vi.stubGlobal('fetch', fetchMock)
243
-
244
- const result = waitForConnectedExtensions({ timeoutMs: 100, pollIntervalMs: 50, settleMs: 500 })
245
- await vi.advanceTimersByTimeAsync(100)
246
-
247
- await expect(result).resolves.toEqual([])
248
- })
249
- })
250
-
251
- describe('ensureRelayServer', () => {
252
- beforeEach(() => {
253
- vi.restoreAllMocks()
254
- vi.clearAllMocks()
255
- vi.useFakeTimers()
256
- getListeningPidsForPortMock.mockResolvedValue([])
257
- killPortProcessMock.mockResolvedValue(undefined)
258
- spawnMock.mockReturnValue({ unref: unrefMock })
259
- })
260
-
261
- test('rejects an older spawned relay until the package version responds', async () => {
262
- const fetchMock = vi
263
- .fn<typeof fetch>()
264
- .mockRejectedValueOnce(new Error('not listening on IPv4'))
265
- .mockRejectedValueOnce(new Error('not listening on localhost'))
266
- .mockRejectedValueOnce(new Error('not listening on IPv6'))
267
- .mockResolvedValueOnce(relayVersionResponse('0.3.9'))
268
- .mockResolvedValueOnce(relayVersionResponse(VERSION))
269
- .mockResolvedValueOnce(relayFeaturesResponse())
270
- vi.stubGlobal('fetch', fetchMock)
271
-
272
- let settled = false
273
- const result = ensureRelayServer().then((value) => {
274
- settled = true
275
- return value
276
- })
277
-
278
- await vi.advanceTimersByTimeAsync(0)
279
- expect(settled).toBe(false)
280
- expect(spawnMock).toHaveBeenCalledTimes(1)
281
-
282
- await vi.advanceTimersByTimeAsync(1_200)
283
-
284
- await expect(result).resolves.toBe(true)
285
- expect(fetchMock).toHaveBeenCalledTimes(6)
286
- expect(unrefMock).toHaveBeenCalledTimes(1)
287
- })
288
-
289
- test('restarts a same-version relay that is missing current features', async () => {
290
- let spawnedCurrentRelay = false
291
- const staleRelayFeatures = RELAY_FEATURES.filter((feature) => {
292
- return feature !== RELAY_FEATURE.capabilityAuthAutoTab
293
- })
294
- spawnMock.mockImplementation(() => {
295
- spawnedCurrentRelay = true
296
- return { unref: unrefMock }
297
- })
298
- const fetchMock = vi.fn<typeof fetch>().mockImplementation((input) => {
299
- if (String(input).includes('/features')) {
300
- return Promise.resolve(spawnedCurrentRelay ? relayFeaturesResponse() : relayFeaturesResponse(staleRelayFeatures))
301
- }
302
- return Promise.resolve(relayVersionResponse(VERSION))
303
- })
304
- vi.stubGlobal('fetch', fetchMock)
305
-
306
- const result = ensureRelayServer()
307
- await vi.advanceTimersByTimeAsync(200)
308
- expect(spawnMock).toHaveBeenCalledTimes(1)
309
- await vi.advanceTimersByTimeAsync(1_000)
310
-
311
- await expect(result).resolves.toBe(true)
312
- expect(killPortProcessMock).toHaveBeenCalledTimes(1)
313
- expect(unrefMock).toHaveBeenCalledTimes(1)
314
- })
315
-
316
- test('rechecks features when a same-version relay wins the startup race', async () => {
317
- getListeningPidsForPortMock.mockResolvedValueOnce([123]).mockResolvedValue([])
318
- let spawnedCurrentRelay = false
319
- let initialVersionAttempts = 0
320
- spawnMock.mockImplementation(() => {
321
- spawnedCurrentRelay = true
322
- return { unref: unrefMock }
323
- })
324
- const fetchMock = vi.fn<typeof fetch>().mockImplementation((input) => {
325
- if (String(input).includes('/features')) {
326
- return Promise.resolve(spawnedCurrentRelay ? relayFeaturesResponse() : new Response(null, { status: 404 }))
327
- }
328
- if (!spawnedCurrentRelay && initialVersionAttempts < 3) {
329
- initialVersionAttempts += 1
330
- return Promise.reject(new Error('relay is still starting'))
331
- }
332
- return Promise.resolve(relayVersionResponse(VERSION))
333
- })
334
- vi.stubGlobal('fetch', fetchMock)
335
-
336
- const result = ensureRelayServer()
337
- await vi.advanceTimersByTimeAsync(200)
338
- expect(spawnMock).toHaveBeenCalledTimes(1)
339
- await vi.advanceTimersByTimeAsync(1_000)
340
-
341
- await expect(result).resolves.toBe(true)
342
- expect(killPortProcessMock).toHaveBeenCalledTimes(1)
343
- expect(unrefMock).toHaveBeenCalledTimes(1)
344
- })
345
-
346
- test('keeps a same-version relay that advertises current features', async () => {
347
- const fetchMock = vi.fn<typeof fetch>().mockImplementation((input) => {
348
- return Promise.resolve(
349
- String(input).includes('/features') ? relayFeaturesResponse() : relayVersionResponse(VERSION),
350
- )
351
- })
352
- vi.stubGlobal('fetch', fetchMock)
353
-
354
- await expect(ensureRelayServer()).resolves.toBeUndefined()
355
- expect(killPortProcessMock).not.toHaveBeenCalled()
356
- expect(spawnMock).not.toHaveBeenCalled()
357
- })
358
-
359
- test('accepts a newer relay that wins the startup race', async () => {
360
- const fetchMock = vi
361
- .fn<typeof fetch>()
362
- .mockRejectedValueOnce(new Error('not listening on IPv4'))
363
- .mockRejectedValueOnce(new Error('not listening on localhost'))
364
- .mockRejectedValueOnce(new Error('not listening on IPv6'))
365
- .mockResolvedValueOnce(relayVersionResponse('9.9.9'))
366
- vi.stubGlobal('fetch', fetchMock)
367
-
368
- const result = ensureRelayServer()
369
- await vi.advanceTimersByTimeAsync(1_000)
370
-
371
- await expect(result).resolves.toBe(true)
372
- expect(fetchMock).toHaveBeenCalledTimes(4)
373
- expect(spawnMock).toHaveBeenCalledTimes(1)
374
- })
375
- })