testdriverai 7.2.64 → 7.2.69

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 (369) hide show
  1. package/agent/index.js +4 -3
  2. package/agent/interface.js +11 -251
  3. package/agent/lib/debugger-server.js +2 -1
  4. package/agent/lib/logger.js +56 -0
  5. package/agent/lib/sandbox.js +6 -7
  6. package/ai/agents/test-writer.md +457 -0
  7. package/{docs/v7/ai.mdx → ai/skills/testdriver:ai/SKILL.md} +3 -5
  8. package/{docs/v7/assert.mdx → ai/skills/testdriver:assert/SKILL.md} +3 -4
  9. package/{docs/v7/aws-setup.mdx → ai/skills/testdriver:aws-setup/SKILL.md} +3 -4
  10. package/{docs/v7/caching.mdx → ai/skills/testdriver:caching/SKILL.md} +3 -7
  11. package/{docs/v7/captcha.mdx → ai/skills/testdriver:captcha/SKILL.md} +4 -5
  12. package/{docs/v7/ci-cd.mdx → ai/skills/testdriver:ci-cd/SKILL.md} +3 -4
  13. package/{docs/v7/click.mdx → ai/skills/testdriver:click/SKILL.md} +3 -4
  14. package/{docs/v7/client.mdx → ai/skills/testdriver:client/SKILL.md} +11 -5
  15. package/{docs/v7/cloud.mdx → ai/skills/testdriver:cloud/SKILL.md} +3 -4
  16. package/{docs/v7/customizing-devices.mdx → ai/skills/testdriver:customizing-devices/SKILL.md} +36 -26
  17. package/{docs/v7/dashcam.mdx → ai/skills/testdriver:dashcam/SKILL.md} +3 -4
  18. package/{docs/v7/device-config.mdx → ai/skills/testdriver:device-config/SKILL.md} +3 -3
  19. package/{docs/v7/double-click.mdx → ai/skills/testdriver:double-click/SKILL.md} +3 -3
  20. package/{docs/v7/elements.mdx → ai/skills/testdriver:elements/SKILL.md} +3 -4
  21. package/{docs/v7/enterprise.mdx → ai/skills/testdriver:enterprise/SKILL.md} +3 -5
  22. package/ai/skills/testdriver:examples/SKILL.md +7 -0
  23. package/{docs/v7/exec.mdx → ai/skills/testdriver:exec/SKILL.md} +3 -4
  24. package/{docs/v7/find.mdx → ai/skills/testdriver:find/SKILL.md} +81 -4
  25. package/{docs/v7/focus-application.mdx → ai/skills/testdriver:focus-application/SKILL.md} +3 -4
  26. package/{docs/v7/generating-tests.mdx → ai/skills/testdriver:generating-tests/SKILL.md} +3 -3
  27. package/{docs/v7/hover.mdx → ai/skills/testdriver:hover/SKILL.md} +3 -4
  28. package/{docs/v7/locating-elements.mdx → ai/skills/testdriver:locating-elements/SKILL.md} +3 -3
  29. package/{docs/v7/making-assertions.mdx → ai/skills/testdriver:making-assertions/SKILL.md} +3 -3
  30. package/ai/skills/testdriver:mcp-workflow/SKILL.md +410 -0
  31. package/{docs/v7/mouse-down.mdx → ai/skills/testdriver:mouse-down/SKILL.md} +3 -3
  32. package/{docs/v7/mouse-up.mdx → ai/skills/testdriver:mouse-up/SKILL.md} +3 -3
  33. package/{docs/v7/performing-actions.mdx → ai/skills/testdriver:performing-actions/SKILL.md} +3 -3
  34. package/{docs/v7/press-keys.mdx → ai/skills/testdriver:press-keys/SKILL.md} +3 -4
  35. package/{docs/v7/quickstart.mdx → ai/skills/testdriver:quickstart/SKILL.md} +3 -4
  36. package/{docs/v7/reusable-code.mdx → ai/skills/testdriver:reusable-code/SKILL.md} +3 -3
  37. package/{docs/v7/right-click.mdx → ai/skills/testdriver:right-click/SKILL.md} +3 -3
  38. package/{docs/v7/running-tests.mdx → ai/skills/testdriver:running-tests/SKILL.md} +3 -3
  39. package/{docs/v7/screenshot.mdx → ai/skills/testdriver:screenshot/SKILL.md} +3 -4
  40. package/{docs/v7/scroll.mdx → ai/skills/testdriver:scroll/SKILL.md} +3 -4
  41. package/{docs/v7/secrets.mdx → ai/skills/testdriver:secrets/SKILL.md} +3 -3
  42. package/{docs/v7/self-hosted.mdx → ai/skills/testdriver:self-hosted/SKILL.md} +3 -4
  43. package/ai/skills/testdriver:testdriver/SKILL.md +31 -0
  44. package/{docs/v7/type.mdx → ai/skills/testdriver:type/SKILL.md} +3 -4
  45. package/{docs/v7/variables.mdx → ai/skills/testdriver:variables/SKILL.md} +3 -3
  46. package/{docs/v7/waiting-for-elements.mdx → ai/skills/testdriver:waiting-for-elements/SKILL.md} +3 -3
  47. package/{docs/v7/what-is-testdriver.mdx → ai/skills/testdriver:what-is-testdriver/SKILL.md} +3 -3
  48. package/interfaces/cli/commands/init.js +278 -1
  49. package/interfaces/cli/commands/setup.js +382 -0
  50. package/interfaces/vitest-plugin.mjs +190 -122
  51. package/lib/sentry.js +4 -3
  52. package/lib/vitest/hooks.mjs +70 -16
  53. package/mcp-server/dist/codegen.d.ts +9 -0
  54. package/mcp-server/dist/codegen.js +165 -0
  55. package/mcp-server/dist/mcp-app.html +114 -0
  56. package/mcp-server/dist/provision-types.d.ts +290 -0
  57. package/mcp-server/dist/provision-types.js +174 -0
  58. package/mcp-server/dist/server.d.ts +6 -0
  59. package/mcp-server/dist/server.js +1441 -0
  60. package/mcp-server/dist/session.d.ts +85 -0
  61. package/mcp-server/dist/session.js +152 -0
  62. package/package.json +30 -9
  63. package/sdk.d.ts +29 -2
  64. package/sdk.js +1 -0
  65. package/.env.example +0 -4
  66. package/.github/workflows/acceptance-linux-scheduled.yaml +0 -45
  67. package/.github/workflows/acceptance-windows-scheduled.yaml +0 -54
  68. package/.github/workflows/acceptance.yaml +0 -87
  69. package/.github/workflows/publish.yaml +0 -68
  70. package/.github/workflows/test-init.yml +0 -145
  71. package/.github/workflows/testdriver.yml +0 -170
  72. package/.github/workflows/windows-self-hosted.yaml +0 -82
  73. package/.prettierignore +0 -4
  74. package/.prettierrc +0 -1
  75. package/CHANGELOG.md +0 -34
  76. package/agents.md +0 -455
  77. package/debugger/bg.png +0 -0
  78. package/debugger/icon.png +0 -0
  79. package/debugger/index.html +0 -797
  80. package/debugger/td.png +0 -0
  81. package/debugger/tray-buffered.png +0 -0
  82. package/debugger/tray.png +0 -0
  83. package/docs/GITHUB_COMMENTS.md +0 -330
  84. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +0 -167
  85. package/docs/QUICK-START-GITHUB-COMMENTS.md +0 -84
  86. package/docs/TEST-GITHUB-COMMENTS.md +0 -129
  87. package/docs/_scripts/link-replacer.js +0 -164
  88. package/docs/_scripts/upload-docs-to-openai.js +0 -284
  89. package/docs/docs.json +0 -393
  90. package/docs/github-integration-setup.md +0 -266
  91. package/docs/guide/best-practices-polling.mdx +0 -154
  92. package/docs/images/content/account/newprojectsettings.png +0 -0
  93. package/docs/images/content/account/projectpage.png +0 -0
  94. package/docs/images/content/account/projectreplays.png +0 -0
  95. package/docs/images/content/account/team-manage.png +0 -0
  96. package/docs/images/content/account/teampage.png +0 -0
  97. package/docs/images/content/extension/cursor.svg +0 -1
  98. package/docs/images/content/extension/vscode.svg +0 -57
  99. package/docs/images/content/extension/windsurf.svg +0 -3
  100. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  101. package/docs/images/content/side-by-side.png +0 -0
  102. package/docs/images/content/vscode/ide-full.png +0 -0
  103. package/docs/images/content/vscode/running.png +0 -0
  104. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  105. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  106. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  107. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  108. package/docs/images/content/vscode/vscode-install.png +0 -0
  109. package/docs/images/content/vscode/vscode-overview.png +0 -0
  110. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  111. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  112. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  113. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  114. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  115. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  116. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  117. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  118. package/docs/images/template/dark.png +0 -0
  119. package/docs/images/template/icon.png +0 -0
  120. package/docs/images/template/light.png +0 -0
  121. package/docs/snippets/calendar-link.mdx +0 -4
  122. package/docs/snippets/gitignore-warning.mdx +0 -7
  123. package/docs/snippets/lifecycle-warning.mdx +0 -6
  124. package/docs/snippets/test-prereqs.mdx +0 -12
  125. package/docs/snippets/tests/assert-replay.mdx +0 -7
  126. package/docs/snippets/tests/assert-yaml.mdx +0 -8
  127. package/docs/snippets/tests/exec-js-replay.mdx +0 -7
  128. package/docs/snippets/tests/exec-js-yaml.mdx +0 -32
  129. package/docs/snippets/tests/exec-shell-replay.mdx +0 -7
  130. package/docs/snippets/tests/exec-shell-yaml.mdx +0 -15
  131. package/docs/snippets/tests/hover-image-replay.mdx +0 -7
  132. package/docs/snippets/tests/hover-image-yaml.mdx +0 -17
  133. package/docs/snippets/tests/hover-text-replay.mdx +0 -7
  134. package/docs/snippets/tests/hover-text-with-description-replay.mdx +0 -7
  135. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +0 -24
  136. package/docs/snippets/tests/hover-text-yaml.mdx +0 -14
  137. package/docs/snippets/tests/match-image-replay.mdx +0 -7
  138. package/docs/snippets/tests/match-image-yaml.mdx +0 -17
  139. package/docs/snippets/tests/press-keys-replay.mdx +0 -7
  140. package/docs/snippets/tests/press-keys-yaml.mdx +0 -36
  141. package/docs/snippets/tests/remember-replay.mdx +0 -7
  142. package/docs/snippets/tests/remember-yaml.mdx +0 -28
  143. package/docs/snippets/tests/scroll-replay.mdx +0 -7
  144. package/docs/snippets/tests/scroll-until-image-replay.mdx +0 -7
  145. package/docs/snippets/tests/scroll-until-image-yaml.mdx +0 -14
  146. package/docs/snippets/tests/scroll-until-text-replay.mdx +0 -7
  147. package/docs/snippets/tests/scroll-until-text-yaml.mdx +0 -17
  148. package/docs/snippets/tests/scroll-yaml.mdx +0 -30
  149. package/docs/snippets/tests/type-repeated-replay.mdx +0 -7
  150. package/docs/snippets/tests/type-repeated-yaml.mdx +0 -22
  151. package/docs/snippets/tests/type-replay.mdx +0 -7
  152. package/docs/snippets/tests/type-yaml.mdx +0 -28
  153. package/docs/snippets/tests/wait-for-image-replay.mdx +0 -7
  154. package/docs/snippets/tests/wait-for-image-yaml.mdx +0 -18
  155. package/docs/snippets/tests/wait-for-text-replay.mdx +0 -7
  156. package/docs/snippets/tests/wait-for-text-yaml.mdx +0 -18
  157. package/docs/snippets/tests/wait-replay.mdx +0 -7
  158. package/docs/snippets/tests/wait-yaml.mdx +0 -13
  159. package/docs/styles.css +0 -65
  160. package/docs/v6/account/dashboard.mdx +0 -16
  161. package/docs/v6/account/enterprise.mdx +0 -110
  162. package/docs/v6/account/pricing.mdx +0 -33
  163. package/docs/v6/account/projects.mdx +0 -33
  164. package/docs/v6/account/team.mdx +0 -35
  165. package/docs/v6/action/ami.mdx +0 -109
  166. package/docs/v6/action/performance.mdx +0 -105
  167. package/docs/v6/action/secrets.mdx +0 -93
  168. package/docs/v6/apps/chrome-extensions.mdx +0 -48
  169. package/docs/v6/apps/desktop-apps.mdx +0 -93
  170. package/docs/v6/apps/mobile-apps.mdx +0 -26
  171. package/docs/v6/apps/static-websites.mdx +0 -54
  172. package/docs/v6/apps/tauri-apps.mdx +0 -361
  173. package/docs/v6/bugs/jira.mdx +0 -232
  174. package/docs/v6/cli/overview.mdx +0 -66
  175. package/docs/v6/commands/assert.mdx +0 -45
  176. package/docs/v6/commands/exec.mdx +0 -282
  177. package/docs/v6/commands/focus-application.mdx +0 -44
  178. package/docs/v6/commands/hover-image.mdx +0 -69
  179. package/docs/v6/commands/hover-text.mdx +0 -47
  180. package/docs/v6/commands/if.mdx +0 -53
  181. package/docs/v6/commands/match-image.mdx +0 -67
  182. package/docs/v6/commands/press-keys.mdx +0 -87
  183. package/docs/v6/commands/remember.mdx +0 -49
  184. package/docs/v6/commands/run.mdx +0 -44
  185. package/docs/v6/commands/scroll-until-image.mdx +0 -66
  186. package/docs/v6/commands/scroll-until-text.mdx +0 -60
  187. package/docs/v6/commands/scroll.mdx +0 -69
  188. package/docs/v6/commands/type.mdx +0 -45
  189. package/docs/v6/commands/wait-for-image.mdx +0 -54
  190. package/docs/v6/commands/wait-for-text.mdx +0 -48
  191. package/docs/v6/commands/wait.mdx +0 -45
  192. package/docs/v6/exporting/junit.mdx +0 -218
  193. package/docs/v6/exporting/playwright.mdx +0 -197
  194. package/docs/v6/features/auto-healing.mdx +0 -144
  195. package/docs/v6/features/generation.mdx +0 -116
  196. package/docs/v6/features/parallel-testing.mdx +0 -151
  197. package/docs/v6/features/reusable-snippets.mdx +0 -131
  198. package/docs/v6/features/selectorless.mdx +0 -80
  199. package/docs/v6/features/visual-assertions.mdx +0 -139
  200. package/docs/v6/getting-started/ci.mdx +0 -146
  201. package/docs/v6/getting-started/cli.mdx +0 -91
  202. package/docs/v6/getting-started/editing.mdx +0 -100
  203. package/docs/v6/getting-started/playwright.mdx +0 -342
  204. package/docs/v6/getting-started/running.mdx +0 -48
  205. package/docs/v6/getting-started/self-hosting.mdx +0 -408
  206. package/docs/v6/getting-started/vscode.mdx +0 -89
  207. package/docs/v6/guide/assertions.mdx +0 -189
  208. package/docs/v6/guide/authentication.mdx +0 -136
  209. package/docs/v6/guide/code.mdx +0 -65
  210. package/docs/v6/guide/dashcam.mdx +0 -118
  211. package/docs/v6/guide/environment-variables.mdx +0 -26
  212. package/docs/v6/guide/lifecycle.mdx +0 -242
  213. package/docs/v6/guide/locating.mdx +0 -141
  214. package/docs/v6/guide/protips.mdx +0 -43
  215. package/docs/v6/guide/variables.mdx +0 -143
  216. package/docs/v6/guide/waiting.mdx +0 -130
  217. package/docs/v6/importing/csv.mdx +0 -196
  218. package/docs/v6/importing/gherkin.mdx +0 -143
  219. package/docs/v6/importing/jira.mdx +0 -164
  220. package/docs/v6/importing/testrail.mdx +0 -162
  221. package/docs/v6/integrations/electron.mdx +0 -146
  222. package/docs/v6/integrations/netlify.mdx +0 -100
  223. package/docs/v6/integrations/vercel.mdx +0 -125
  224. package/docs/v6/interactive/explore.mdx +0 -99
  225. package/docs/v6/interactive/run.mdx +0 -52
  226. package/docs/v6/interactive/save.mdx +0 -63
  227. package/docs/v6/overview/comparison.mdx +0 -101
  228. package/docs/v6/overview/faq.mdx +0 -162
  229. package/docs/v6/overview/performance.mdx +0 -52
  230. package/docs/v6/overview/quickstart.mdx +0 -137
  231. package/docs/v6/overview/what-is-testdriver.mdx +0 -85
  232. package/docs/v6/scenarios/ai-chatbot.mdx +0 -28
  233. package/docs/v6/scenarios/cookie-banner.mdx +0 -32
  234. package/docs/v6/scenarios/file-upload.mdx +0 -33
  235. package/docs/v6/scenarios/form-filling.mdx +0 -32
  236. package/docs/v6/scenarios/log-in.mdx +0 -75
  237. package/docs/v6/scenarios/pdf-generation.mdx +0 -25
  238. package/docs/v6/scenarios/spell-check.mdx +0 -22
  239. package/docs/v6/security/action.mdx +0 -84
  240. package/docs/v6/security/agent.mdx +0 -73
  241. package/docs/v6/security/platform.mdx +0 -77
  242. package/docs/v6/tutorials/advanced-test.mdx +0 -81
  243. package/docs/v6/tutorials/basic-test.mdx +0 -45
  244. package/docs/v7/_drafts/agents.mdx +0 -852
  245. package/docs/v7/_drafts/architecture.mdx +0 -399
  246. package/docs/v7/_drafts/auto-cache-key.mdx +0 -167
  247. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +0 -100
  248. package/docs/v7/_drafts/best-practices.mdx +0 -486
  249. package/docs/v7/_drafts/caching-ai.mdx +0 -215
  250. package/docs/v7/_drafts/caching-selectors.mdx +0 -424
  251. package/docs/v7/_drafts/caching.mdx +0 -366
  252. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +0 -425
  253. package/docs/v7/_drafts/commands/assert.mdx +0 -45
  254. package/docs/v7/_drafts/commands/exec.mdx +0 -282
  255. package/docs/v7/_drafts/commands/focus-application.mdx +0 -44
  256. package/docs/v7/_drafts/commands/hover-image.mdx +0 -69
  257. package/docs/v7/_drafts/commands/hover-text.mdx +0 -47
  258. package/docs/v7/_drafts/commands/if.mdx +0 -53
  259. package/docs/v7/_drafts/commands/match-image.mdx +0 -67
  260. package/docs/v7/_drafts/commands/press-keys.mdx +0 -87
  261. package/docs/v7/_drafts/commands/remember.mdx +0 -49
  262. package/docs/v7/_drafts/commands/run.mdx +0 -44
  263. package/docs/v7/_drafts/commands/scroll-until-image.mdx +0 -66
  264. package/docs/v7/_drafts/commands/scroll-until-text.mdx +0 -60
  265. package/docs/v7/_drafts/commands/scroll.mdx +0 -69
  266. package/docs/v7/_drafts/commands/type.mdx +0 -45
  267. package/docs/v7/_drafts/commands/wait-for-image.mdx +0 -54
  268. package/docs/v7/_drafts/commands/wait-for-text.mdx +0 -48
  269. package/docs/v7/_drafts/commands/wait.mdx +0 -45
  270. package/docs/v7/_drafts/configuration.mdx +0 -378
  271. package/docs/v7/_drafts/contributing.mdx +0 -174
  272. package/docs/v7/_drafts/core.mdx +0 -458
  273. package/docs/v7/_drafts/dashcam-title-feature.mdx +0 -89
  274. package/docs/v7/_drafts/debugging.mdx +0 -349
  275. package/docs/v7/_drafts/error-handling.mdx +0 -501
  276. package/docs/v7/_drafts/faq.mdx +0 -393
  277. package/docs/v7/_drafts/hooks.mdx +0 -360
  278. package/docs/v7/_drafts/init-command.mdx +0 -95
  279. package/docs/v7/_drafts/installation.mdx +0 -420
  280. package/docs/v7/_drafts/migration.mdx +0 -562
  281. package/docs/v7/_drafts/observable.mdx +0 -604
  282. package/docs/v7/_drafts/playwright.mdx +0 -342
  283. package/docs/v7/_drafts/plugin-migration.mdx +0 -220
  284. package/docs/v7/_drafts/powerful.mdx +0 -419
  285. package/docs/v7/_drafts/presets.mdx +0 -210
  286. package/docs/v7/_drafts/progressive-disclosure.mdx +0 -230
  287. package/docs/v7/_drafts/prompt-cache.mdx +0 -200
  288. package/docs/v7/_drafts/provision.mdx +0 -390
  289. package/docs/v7/_drafts/quick-start-test-recording.mdx +0 -214
  290. package/docs/v7/_drafts/readme.mdx +0 -135
  291. package/docs/v7/_drafts/reports.mdx +0 -414
  292. package/docs/v7/_drafts/scalable.mdx +0 -754
  293. package/docs/v7/_drafts/screenshot.mdx +0 -155
  294. package/docs/v7/_drafts/sdk-awesome-logs.mdx +0 -468
  295. package/docs/v7/_drafts/sdk-browser-rendering.mdx +0 -167
  296. package/docs/v7/_drafts/sdk-migration.mdx +0 -474
  297. package/docs/v7/_drafts/sdk-v7-complete.mdx +0 -345
  298. package/docs/v7/_drafts/self-hosting.mdx +0 -369
  299. package/docs/v7/_drafts/test-recording.mdx +0 -382
  300. package/docs/v7/_drafts/troubleshooting.mdx +0 -526
  301. package/docs/v7/_drafts/vitest-plugin.mdx +0 -477
  302. package/docs/v7/_drafts/vitest.mdx +0 -535
  303. package/docs/v7/_drafts/writing-tests.mdx +0 -25
  304. package/docs/v7/examples.mdx +0 -5
  305. package/eslint.config.js +0 -67
  306. package/examples/ai.test.mjs +0 -30
  307. package/examples/assert.test.mjs +0 -46
  308. package/examples/captcha-api.test.mjs +0 -50
  309. package/examples/chrome-extension.test.mjs +0 -94
  310. package/examples/drag-and-drop.test.mjs +0 -58
  311. package/examples/element-not-found.test.mjs +0 -26
  312. package/examples/exec-output.test.mjs +0 -59
  313. package/examples/exec-pwsh.test.mjs +0 -57
  314. package/examples/focus-window.test.mjs +0 -36
  315. package/examples/formatted-logging.test.mjs +0 -26
  316. package/examples/hover-image.test.mjs +0 -52
  317. package/examples/hover-text-with-description.test.mjs +0 -56
  318. package/examples/hover-text.test.mjs +0 -27
  319. package/examples/installer.test.mjs +0 -49
  320. package/examples/launch-vscode-linux.test.mjs +0 -54
  321. package/examples/match-image.test.mjs +0 -54
  322. package/examples/no-provision.test.mjs +0 -23
  323. package/examples/press-keys.test.mjs +0 -50
  324. package/examples/prompt.test.mjs +0 -33
  325. package/examples/scroll-keyboard.test.mjs +0 -37
  326. package/examples/scroll-until-image.test.mjs +0 -39
  327. package/examples/scroll-until-text.test.mjs +0 -67
  328. package/examples/scroll.test.mjs +0 -41
  329. package/examples/type.test.mjs +0 -45
  330. package/examples/windows-installer.test.mjs +0 -53
  331. package/interfaces/cli/commands/edit.js +0 -3
  332. package/interfaces/cli/commands/generate.js +0 -3
  333. package/interfaces/cli/commands/run.js +0 -3
  334. package/interfaces/cli/utils/factory.js +0 -71
  335. package/jsconfig.json +0 -26
  336. package/manual/test-init-command.js +0 -223
  337. package/sdk-log-formatter.js +0 -930
  338. package/setup/aws/cloudformation.yaml +0 -470
  339. package/setup/aws/spawn-runner.sh +0 -190
  340. package/test/api-resilience.test.mjs +0 -0
  341. package/test/captcha-solver.test.mjs +0 -70
  342. package/test/chrome-remote-debugging.test.mjs +0 -66
  343. package/test/manual/debug-locate-response.js +0 -82
  344. package/test/manual/reconnect-provision.test.mjs +0 -49
  345. package/test/manual/test-console-logs.test.mjs +0 -42
  346. package/test/manual/test-find-api.js +0 -73
  347. package/test/manual/test-init.sh +0 -54
  348. package/test/manual/test-prompt-cache.js +0 -96
  349. package/test/manual/test-provision-auth.mjs +0 -22
  350. package/test/manual/test-sandbox-render.js +0 -28
  351. package/test/manual/test-sdk-methods.js +0 -15
  352. package/test/manual/test-sdk-refactor.js +0 -53
  353. package/test/manual/test-stack-trace.mjs +0 -57
  354. package/test/manual/verify-element-api.js +0 -89
  355. package/test/manual/verify-types.js +0 -0
  356. package/test/manual-unawaited-promise.test.mjs +0 -31
  357. package/testdriver-plugin/skills/actions/SKILL.md +0 -93
  358. package/testdriver-plugin/skills/assertions/SKILL.md +0 -77
  359. package/testdriver-plugin/skills/caching/SKILL.md +0 -66
  360. package/testdriver-plugin/skills/creating-tests/SKILL.md +0 -104
  361. package/testdriver-plugin/skills/finding-elements/SKILL.md +0 -77
  362. package/testdriver-plugin/skills/github-actions/SKILL.md +0 -100
  363. package/testdriver-plugin/skills/running-tests/SKILL.md +0 -77
  364. package/testdriver-plugin/skills/secrets/SKILL.md +0 -87
  365. package/testdriver-plugin/skills/self-hosting/SKILL.md +0 -89
  366. package/testdriver-plugin/skills/setup/SKILL.md +0 -76
  367. package/testdriver-plugin/skills/variables/SKILL.md +0 -88
  368. package/testdriver-plugin/skills/waiting/SKILL.md +0 -72
  369. package/vitest.config.mjs +0 -29
@@ -1,167 +0,0 @@
1
- # SDK Browser Rendering Feature
2
-
3
- ## Overview
4
-
5
- The TestDriver SDK now supports automatic browser rendering of the sandbox environment, matching the behavior of the existing agent CLI. When connecting to a sandbox, the SDK will automatically open a browser window showing the live VNC session, allowing you to watch test execution in real-time.
6
-
7
- ## Changes Made
8
-
9
- ### 1. SDK Core (`sdk.js`)
10
-
11
- #### Added Dependencies
12
- - Imported `createDebuggerProcess` from `./agent/lib/debugger.js` to enable the debugger server
13
-
14
- #### New Instance Variables
15
- - `debuggerProcess`: Reference to the debugger server process
16
- - `debuggerUrl`: URL of the debugger web interface
17
-
18
- #### Enhanced `connect()` Method
19
- - Automatically starts the debugger server when connecting (unless in headless mode)
20
- - Calls `_renderSandbox()` after successful connection to open the browser window
21
- - Supports new `headless` option to disable browser rendering
22
-
23
- #### New Methods
24
-
25
- **`_renderSandbox(instance)`**
26
- - Constructs the VNC URL from the sandbox instance details
27
- - Creates encoded data payload for the debugger
28
- - Emits the `show-window` event with the debugger URL
29
-
30
- **`_openBrowser(url)`**
31
- - Uses the `open` npm package to launch the default browser
32
- - Handles errors gracefully with fallback to manual URL copy
33
- - Uses dynamic import for ES module compatibility
34
-
35
- #### Enhanced `_setupLogging()` Method
36
- - Added event listener for `show-window` events
37
- - Automatically opens browser when event is emitted
38
- - Respects CI mode (prints view-only URL instead of opening browser)
39
-
40
- ### 2. Documentation Updates
41
-
42
- #### SDK README (`SDK_README.md`)
43
- - Updated `connect()` method documentation
44
- - Added `headless` parameter description
45
- - Added note about automatic browser rendering behavior
46
- - Provided examples for both headless and non-headless modes
47
-
48
- ### 3. Examples
49
-
50
- #### `examples/sdk-with-browser.js`
51
- - Demonstrates default behavior with browser rendering
52
- - Shows how to use the SDK with visual feedback
53
- - Includes detailed console output explaining what's happening
54
-
55
- #### `examples/sdk-headless.js`
56
- - Demonstrates headless mode for CI/CD environments
57
- - Shows how to disable browser rendering
58
- - Useful for automated testing scenarios
59
-
60
- ### 4. Tests
61
-
62
- #### `testdriver/acceptance-sdk/sandbox-render.test.mjs`
63
- - Verifies that the `show-window` event is emitted
64
- - Tests basic interaction with the rendered sandbox
65
- - Includes timeout handling for sandbox creation
66
-
67
- ## How It Works
68
-
69
- 1. **Connection Phase**
70
- - When `connect()` is called without `headless: true`
71
- - The debugger server is started on port 3000 (by default)
72
- - The sandbox is created/connected as usual
73
-
74
- 2. **Rendering Phase**
75
- - After successful connection, `_renderSandbox()` is called
76
- - It constructs the VNC URL: `http://{instance.ip}:{vncPort}/vnc_lite.html?token=V3b8wG9`
77
- - Creates data payload with resolution, URL, and token
78
- - Builds debugger URL: `{debuggerUrl}?data={encodedData}`
79
-
80
- 3. **Browser Opening**
81
- - The `show-window` event is emitted with the debugger URL
82
- - The event listener in `_setupLogging()` catches it
83
- - The `_openBrowser()` method is called
84
- - Default browser opens to the debugger interface
85
- - User can watch live test execution
86
-
87
- ## Usage Examples
88
-
89
- ### Default Behavior (Browser Opens)
90
-
91
- ```javascript
92
- const TestDriver = require('testdriverai');
93
-
94
- const client = new TestDriver(process.env.TD_API_KEY, {
95
- logging: true
96
- });
97
-
98
- await client.auth();
99
- await client.connect(); // Browser opens automatically
100
-
101
- await client.hoverText('Submit');
102
- await client.click();
103
- ```
104
-
105
- ### Headless Mode (No Browser)
106
-
107
- ```javascript
108
- const TestDriver = require('testdriverai');
109
-
110
- const client = new TestDriver(process.env.TD_API_KEY, {
111
- logging: true
112
- });
113
-
114
- await client.auth();
115
- await client.connect({ headless: true }); // No browser
116
-
117
- await client.hoverText('Submit');
118
- await client.click();
119
- ```
120
-
121
- ### CI/CD Mode
122
-
123
- When `CI` environment variable is set or `config.CI` is true, the SDK will:
124
- - Print the view-only URL instead of opening a browser
125
- - Allow monitoring without interrupting the test flow
126
-
127
- ## Benefits
128
-
129
- 1. **Visual Feedback**: Developers can watch tests execute in real-time
130
- 2. **Debugging**: Easier to understand test failures by seeing what's happening
131
- 3. **Consistency**: Matches the behavior of the CLI tool
132
- 4. **Flexibility**: Can be disabled for CI/CD with `headless: true`
133
- 5. **No Code Changes**: Existing SDK code continues to work (default behavior adds browser)
134
-
135
- ## Compatibility
136
-
137
- - Works on macOS, Linux, and Windows
138
- - Requires the `open` npm package (already a dependency)
139
- - Debugger server starts automatically when needed
140
- - Falls back gracefully if browser can't be opened (prints URL)
141
-
142
- ## Testing
143
-
144
- Run the test to verify functionality:
145
-
146
- ```bash
147
- TD_API_KEY=your_key npx vitest run testdriver/acceptance-sdk/sandbox-render.test.mjs
148
- ```
149
-
150
- Or try the examples:
151
-
152
- ```bash
153
- # With browser rendering
154
- TD_API_KEY=your_key node examples/sdk-with-browser.js
155
-
156
- # Headless mode
157
- TD_API_KEY=your_key node examples/sdk-headless.js
158
- ```
159
-
160
- ## Future Enhancements
161
-
162
- Potential improvements:
163
- - Allow custom debugger port configuration
164
- - Support for multiple concurrent sandbox windows
165
- - Option to disable debugger server entirely
166
- - Custom browser selection
167
- - Headless mode detection based on environment
@@ -1,474 +0,0 @@
1
- # TestDriver SDK Migration Guide
2
-
3
- ## New Element Finding API
4
-
5
- We've introduced a new, more flexible API for finding and interacting with elements. The new `find()` API provides better control and enables polling patterns for dynamic content.
6
-
7
- ## Quick Comparison
8
-
9
- ### Old API (Deprecated)
10
-
11
- ```javascript
12
- // Find and click text
13
- await client.hoverText("Sign In", "black button below password", "click");
14
-
15
- // Wait for text to appear
16
- await client.waitForText("Login button", 10000);
17
-
18
- // Find and click image
19
- await client.hoverImage("submit button icon", "click");
20
- ```
21
-
22
- ### New API (Recommended)
23
-
24
- ```javascript
25
- // Find and click text or image
26
- const element = await client
27
- .find("Sign In, black button below password")
28
- .find();
29
- await element.click();
30
-
31
- // Poll until element appears (replaces waitForText/waitForImage)
32
- let element = client.find("login button");
33
- while (!element.found()) {
34
- console.log("waiting for element to be found");
35
- element = await element.find();
36
- await new Promise((resolve) => setTimeout(resolve, 1000));
37
- }
38
- await element.click();
39
- ```
40
-
41
- ## Migration Examples
42
-
43
- ### Example 1: Simple Click
44
-
45
- **Before:**
46
-
47
- ```javascript
48
- await client.hoverText("Submit", "submit button", "click");
49
- ```
50
-
51
- **After:**
52
-
53
- ```javascript
54
- const submitBtn = await client.find("Submit button");
55
- await submitBtn.click();
56
- ```
57
-
58
- ### Example 2: Waiting for Elements
59
-
60
- **Before:**
61
-
62
- ```javascript
63
- await client.waitForText("Welcome", 10000);
64
- await client.hoverText("Welcome", null, "click");
65
- ```
66
-
67
- **After:**
68
-
69
- ```javascript
70
- let element;
71
- const maxAttempts = 10;
72
- let attempts = 0;
73
-
74
- while (!element?.found() && attempts < maxAttempts) {
75
- element = await client.find("Welcome");
76
- if (!element.found()) {
77
- await new Promise((resolve) => setTimeout(resolve, 1000));
78
- }
79
- attempts++;
80
- }
81
-
82
- if (element?.found()) {
83
- await element.click();
84
- }
85
- ```
86
-
87
- ### Example 3: Hover Actions
88
-
89
- **Before:**
90
-
91
- ```javascript
92
- await client.hoverText("Menu", null, "hover");
93
- ```
94
-
95
- **After:**
96
-
97
- ```javascript
98
- const menu = await client.find("Menu").find();
99
- await menu.hover();
100
- ```
101
-
102
- ### Example 4: Different Click Types
103
-
104
- **Before:**
105
-
106
- ```javascript
107
- await client.hoverText("File", null, "right-click");
108
- await client.hoverText("Save", null, "double-click");
109
- ```
110
-
111
- **After:**
112
-
113
- ```javascript
114
- const file = await client.find("File").find();
115
- await file.rightClick();
116
-
117
- const save = await client.find("Save").find();
118
- await save.doubleClick();
119
-
120
- // Or use the generic click() method
121
- await file.click("right-click");
122
- await save.click("double-click");
123
- ```
124
-
125
- ### Example 5: Conditional Logic
126
-
127
- **Before:**
128
-
129
- ```javascript
130
- try {
131
- await client.waitForText("Error message", 2000);
132
- // Handle error
133
- } catch (e) {
134
- // No error present
135
- }
136
- ```
137
-
138
- **After:**
139
-
140
- ```javascript
141
- const errorMsg = await client.find("Error message").find();
142
- if (errorMsg.found()) {
143
- // Handle error
144
- console.log("Error found at:", errorMsg.getCoordinates());
145
- } else {
146
- // No error present
147
- }
148
- ```
149
-
150
- ## New Element API Reference
151
-
152
- ### `client.find(description)`
153
-
154
- Creates an Element instance for finding and interacting with elements.
155
-
156
- **Parameters:**
157
-
158
- - `description` (string): Natural language description of the element
159
-
160
- **Returns:** `Element` instance
161
-
162
- **Example:**
163
-
164
- ```javascript
165
- const button = client.find("the sign in button");
166
- ```
167
-
168
- ### `element.find([newDescription])`
169
-
170
- Attempts to locate the element on screen.
171
-
172
- **Parameters:**
173
-
174
- - `newDescription` (optional string): New description to search for
175
-
176
- **Returns:** `Promise<Element>` - The same Element instance (for chaining)
177
-
178
- **Example:**
179
-
180
- ```javascript
181
- const element = await client.find("login button").find();
182
-
183
- // Or with a new description
184
- element = await element.find("sign in button");
185
- ```
186
-
187
- ### `element.found()`
188
-
189
- Check if the element was successfully located.
190
-
191
- **Returns:** `boolean` - true if element coordinates were found
192
-
193
- **Example:**
194
-
195
- ```javascript
196
- const element = await client.find("button").find();
197
- if (element.found()) {
198
- console.log("Element found!");
199
- }
200
- ```
201
-
202
- ### `element.click([action])`
203
-
204
- Click on the element.
205
-
206
- **Parameters:**
207
-
208
- - `action` (optional): Click action type - `'click'`, `'right-click'`, `'double-click'`
209
-
210
- **Returns:** `Promise<void>`
211
-
212
- **Example:**
213
-
214
- ```javascript
215
- await element.click();
216
- await element.click("right-click");
217
- ```
218
-
219
- ### `element.hover()`
220
-
221
- Hover over the element.
222
-
223
- **Returns:** `Promise<void>`
224
-
225
- **Example:**
226
-
227
- ```javascript
228
- await element.hover();
229
- ```
230
-
231
- ### `element.doubleClick()`
232
-
233
- Double-click on the element. Convenience method for `element.click('double-click')`.
234
-
235
- **Returns:** `Promise<void>`
236
-
237
- **Example:**
238
-
239
- ```javascript
240
- await element.doubleClick();
241
- ```
242
-
243
- ### `element.rightClick()`
244
-
245
- Right-click on the element. Convenience method for `element.click('right-click')`.
246
-
247
- **Returns:** `Promise<void>`
248
-
249
- **Example:**
250
-
251
- ```javascript
252
- await element.rightClick();
253
- ```
254
-
255
- ### `element.mouseDown()`
256
-
257
- Press mouse button down on this element (useful for drag operations).
258
-
259
- **Returns:** `Promise<void>`
260
-
261
- **Example:**
262
-
263
- ```javascript
264
- const source = await client.find("draggable item").find();
265
- await source.mouseDown();
266
- ```
267
-
268
- ### `element.mouseUp()`
269
-
270
- Release mouse button on this element (useful for drag operations).
271
-
272
- **Returns:** `Promise<void>`
273
-
274
- **Example:**
275
-
276
- ```javascript
277
- const target = await client.find("drop zone").find();
278
- await target.mouseUp();
279
- ```
280
-
281
- ### `element.getCoordinates()`
282
-
283
- Get the screen coordinates of the element.
284
-
285
- **Returns:** `{x, y, centerX, centerY}` or `null` if not found
286
-
287
- **Example:**
288
-
289
- ```javascript
290
- const coords = element.getCoordinates();
291
- if (coords) {
292
- console.log(`Element at: ${coords.x}, ${coords.y}`);
293
- }
294
- ```
295
-
296
- ### `element.getResponse()`
297
-
298
- Get the full API response data from the locate operation.
299
-
300
- **Returns:** `Object | null` - Full response containing all available data
301
-
302
- **Example:**
303
-
304
- ```javascript
305
- const response = element.getResponse();
306
- console.log("Full response:", response);
307
- ```
308
-
309
- ## Element Properties
310
-
311
- The Element class exposes many properties from the API response:
312
-
313
- ### Coordinate Properties
314
-
315
- - `element.x` - X coordinate (top-left corner)
316
- - `element.y` - Y coordinate (top-left corner)
317
- - `element.centerX` - X coordinate of element center
318
- - `element.centerY` - Y coordinate of element center
319
-
320
- ### Dimension Properties
321
-
322
- - `element.width` - Width of the element (if available)
323
- - `element.height` - Height of the element (if available)
324
- - `element.boundingBox` - Bounding box data (if available)
325
-
326
- ### Match Quality Properties
327
-
328
- - `element.confidence` - Confidence score of the match (0-1)
329
- - `element.screenshot` - Base64 encoded screenshot of the element
330
- - `element.text` - Text content of the element (if available)
331
- - `element.label` - Label/aria-label of the element (if available)
332
-
333
- ### Example Usage
334
-
335
- ```javascript
336
- const button = await client.find("login button");
337
-
338
- if (button.found()) {
339
- console.log("Position:", { x: button.x, y: button.y });
340
- console.log("Center:", { x: button.centerX, y: button.centerY });
341
- console.log("Size:", { width: button.width, height: button.height });
342
- console.log("Confidence:", button.confidence);
343
- console.log("Text:", button.text);
344
-
345
- // Save screenshot for debugging
346
- if (button.screenshot) {
347
- const fs = require("fs");
348
- fs.writeFileSync("button.png", Buffer.from(button.screenshot, "base64"));
349
- }
350
-
351
- // Conditional actions based on properties
352
- if (button.confidence > 0.8) {
353
- await button.click();
354
- }
355
- }
356
- ```
357
-
358
- For a complete example, see `examples/sdk-element-properties.js`.
359
-
360
- ## Common Patterns
361
-
362
- ### Pattern 1: Find and Click
363
-
364
- ```javascript
365
- const element = await client.find("description").find();
366
- if (element.found()) {
367
- await element.click();
368
- }
369
- ```
370
-
371
- ### Pattern 2: Polling with Timeout
372
-
373
- ```javascript
374
- const element = client.find("element description");
375
- const timeoutMs = 10000;
376
- const startTime = Date.now();
377
-
378
- while (!element.found() && Date.now() - startTime < timeoutMs) {
379
- element = await element.find();
380
- if (!element.found()) {
381
- await new Promise((resolve) => setTimeout(resolve, 500));
382
- }
383
- }
384
-
385
- if (!element.found()) {
386
- throw new Error("Element not found within timeout");
387
- }
388
- ```
389
-
390
- ### Pattern 3: Retry with Different Descriptions
391
-
392
- ```javascript
393
- let element = client.find("primary button");
394
- element = await element.find();
395
-
396
- if (!element.found()) {
397
- element = await element.find("submit button");
398
- }
399
-
400
- if (!element.found()) {
401
- element = await element.find("blue button on the right");
402
- }
403
-
404
- if (element.found()) {
405
- await element.click();
406
- }
407
- ```
408
-
409
- ### Pattern 4: Helper Function for Waiting
410
-
411
- ```javascript
412
- async function waitForElement(client, description, timeoutMs = 10000) {
413
- const element = client.find(description);
414
- const startTime = Date.now();
415
-
416
- while (!element.found() && Date.now() - startTime < timeoutMs) {
417
- await element.find();
418
- if (!element.found()) {
419
- await new Promise((resolve) => setTimeout(resolve, 500));
420
- }
421
- }
422
-
423
- if (!element.found()) {
424
- throw new Error(`Element "${description}" not found within ${timeoutMs}ms`);
425
- }
426
-
427
- return element;
428
- }
429
-
430
- // Usage
431
- const button = await waitForElement(client, "login button", 5000);
432
- await button.click();
433
- ```
434
-
435
- ## Deprecated Methods
436
-
437
- The following methods are now deprecated and will be removed in a future version:
438
-
439
- - ❌ `client.hoverText()` → ✅ Use `client.find().find()` + `element.click()`
440
- - ❌ `client.hoverImage()` → ✅ Use `client.find().find()` + `element.click()`
441
- - ❌ `client.waitForText()` → ✅ Use polling pattern with `client.find()`
442
- - ❌ `client.waitForImage()` → ✅ Use polling pattern with `client.find()`
443
- - ❌ `client.wait()` → ✅ Use element polling instead of arbitrary waits when possible
444
-
445
- ## Benefits of the New API
446
-
447
- 1. **More Explicit**: Clear separation between finding and interacting
448
- 2. **Better Error Handling**: Can check if element exists before interacting
449
- 3. **Flexible Polling**: Custom polling logic for dynamic content
450
- 4. **Unified Interface**: Same API for text and images
451
- 5. **More Control**: Access to element state and coordinates
452
- 6. **Composable**: Element instances can be stored and reused
453
-
454
- ## TypeScript Support
455
-
456
- The new API is fully typed:
457
-
458
- ```typescript
459
- import TestDriver, { Element } from "testdriverai";
460
-
461
- const client = new TestDriver(process.env.TD_API_KEY);
462
- await client.connect();
463
-
464
- const element: Element = await client.find("button").find();
465
- const found: boolean = element.found();
466
- const coords = element.getCoordinates(); // {x, y, centerX, centerY} | null
467
- ```
468
-
469
- ## Questions?
470
-
471
- For more examples, see:
472
-
473
- - `examples/sdk-find-example.js` - Comprehensive examples of the new API
474
- - `testdriver/acceptance-sdk/hover-text.test.mjs` - Updated test example