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,535 +0,0 @@
1
- ---
2
- title: "Using TestDriver with Vitest"
3
- sidebarTitle: "Vitest Integration"
4
- description: "Complete guide to integrating TestDriver with Vitest"
5
- icon: "flask-vial"
6
- ---
7
-
8
- ## Overview
9
-
10
- TestDriver integrates seamlessly with Vitest, providing three levels of API complexity to match your needs. From simple preset functions to full manual control, choose the approach that works best for your project.
11
-
12
- ## Quick Start
13
-
14
- ### 1. Install TestDriver
15
-
16
- ```bash
17
- npm install --save-dev testdriverai
18
- ```
19
-
20
- ### 2. Create Vitest Config
21
-
22
- ```javascript vitest.config.mjs
23
- import { defineConfig } from 'vitest/config';
24
-
25
- export default defineConfig({
26
- test: {
27
- // Optional: Configure test timeout
28
- testTimeout: 120000,
29
- hookTimeout: 120000,
30
- },
31
- });
32
- ```
33
-
34
- ### 3. Write Your First Test
35
-
36
- ```javascript example.test.js
37
- import { test } from 'vitest';
38
- import { chrome } from 'testdriverai/presets';
39
-
40
- test('my first test', async (context) => {
41
- const { testdriver } = await chrome(context, {
42
- url: 'https://example.com'
43
- });
44
-
45
- await testdriver.find('More information link').click();
46
- await testdriver.assert('IANA information page is visible');
47
- });
48
- ```
49
-
50
- ### 4. Run Your Tests
51
-
52
- ```bash
53
- npx vitest
54
- ```
55
-
56
- That's it! TestDriver automatically handles all setup and teardown.
57
-
58
- ## Three Levels of Integration
59
-
60
- <CardGroup cols={3}>
61
- <Card title="Provision API" icon="rocket" href="/v7/progressive-apis/PROVISION">
62
- **Easiest** - One-line setup
63
- ```javascript
64
- const { testdriver } = await provision('chrome', { url }, context);
65
- ```
66
- </Card>
67
-
68
- <Card title="Hooks API" icon="link" href="/v7/progressive-apis/HOOKS">
69
- **Flexible** - More control
70
- ```javascript
71
- const client = useTestDriver(context);
72
- const dashcam = useDashcam(context, client);
73
- ```
74
- </Card>
75
-
76
- <Card title="Core Classes" icon="code" href="/v7/progressive-apis/CORE">
77
- **Full Control** - Manual everything
78
- ```javascript
79
- const client = new TestDriver(apiKey);
80
- await client.connect();
81
- ```
82
- </Card>
83
- </CardGroup>
84
-
85
- ## Complete Examples
86
-
87
- ### Web Application Testing
88
-
89
- ```javascript login.test.js
90
- import { describe, test, expect } from 'vitest';
91
- import { chrome } from 'testdriverai/presets';
92
-
93
- describe('User Login', () => {
94
- test('successful login flow', async (context) => {
95
- const { testdriver, dashcam } = await chrome(context, {
96
- url: 'https://myapp.com/login',
97
- maximized: true
98
- });
99
-
100
- // Fill login form
101
- await testdriver.find('email input').type('user@example.com');
102
- await testdriver.find('password input').type('password123');
103
- await testdriver.find('Login button').click();
104
-
105
- // Verify dashboard loads
106
- const result = await testdriver.assert('Welcome message is visible');
107
- expect(result).toBeTruthy();
108
-
109
- // Dashcam automatically saves replay URL
110
- console.log('Replay:', dashcam.url);
111
- });
112
-
113
- test('invalid credentials error', async (context) => {
114
- const { testdriver } = await chrome(context, {
115
- url: 'https://myapp.com/login'
116
- });
117
-
118
- await testdriver.find('email input').type('wrong@example.com');
119
- await testdriver.find('password input').type('wrongpass');
120
- await testdriver.find('Login button').click();
121
-
122
- await testdriver.assert('Invalid credentials error appears');
123
- });
124
- });
125
- ```
126
-
127
- ### VS Code Extension Testing
128
-
129
- ```javascript extension.test.js
130
- import { test } from 'vitest';
131
- import { vscode } from 'testdriverai/presets';
132
-
133
- test('create new python file', async (context) => {
134
- const { vscode } = await vscode(context, {
135
- workspace: '/tmp/test-project',
136
- extensions: ['ms-python.python']
137
- });
138
-
139
- // Open command palette
140
- await vscode.pressKeys(['cmd', 'shift', 'p']);
141
-
142
- // Create new Python file
143
- await vscode.type('Python: Create New File');
144
- await vscode.pressKeys(['enter']);
145
-
146
- // Verify file created
147
- await vscode.assert('Untitled Python file is open');
148
- });
149
- ```
150
-
151
- ### Electron App Testing
152
-
153
- ```javascript electron-app.test.js
154
- import { test } from 'vitest';
155
- import { electron } from 'testdriverai/presets';
156
-
157
- test('file menu operations', async (context) => {
158
- const { app } = await electron(context, {
159
- appPath: './dist/my-app',
160
- args: ['--enable-logging']
161
- });
162
-
163
- await app.find('File menu').click();
164
- await app.find('New Document').click();
165
-
166
- await app.assert('New document window opens');
167
- });
168
- ```
169
-
170
- ### Using Multiple Presets
171
-
172
- ```javascript multi-app.test.js
173
- import { test } from 'vitest';
174
- import { chrome, vscode } from 'testdriverai/presets';
175
-
176
- test('test chrome and vscode together', async (context) => {
177
- // Both share the same Vitest context for cleanup
178
- const browser = await chrome(context, {
179
- url: 'https://example.com'
180
- });
181
-
182
- const editor = await vscode(context, {
183
- workspace: '/tmp/project'
184
- });
185
-
186
- // Use both in the same test
187
- await browser.testdriver.find('link').click();
188
- await editor.vscode.find('File').click();
189
- });
190
- ```
191
-
192
- ## Test Lifecycle
193
-
194
- TestDriver automatically manages the entire test lifecycle:
195
-
196
- ```javascript
197
- test('lifecycle example', async (context) => {
198
- // 1. Setup happens automatically when you call preset
199
- const { testdriver, dashcam } = await chrome(context, { url });
200
-
201
- // 2. Your test code runs
202
- await testdriver.find('button').click();
203
-
204
- // 3. Teardown happens automatically after test completes
205
- // - Dashcam stops and saves replay URL
206
- // - TestDriver disconnects from sandbox
207
- // - All resources are cleaned up
208
- });
209
- ```
210
-
211
- ### Automatic Cleanup
212
-
213
- Even if your test fails or throws an error, cleanup still happens:
214
-
215
- ```javascript
216
- test('error handling', async (context) => {
217
- const { testdriver } = await chrome(context, { url });
218
-
219
- try {
220
- await testdriver.find('non-existent element').click();
221
- } catch (error) {
222
- // Cleanup STILL happens automatically via Vitest hooks
223
- console.error('Test failed:', error);
224
- throw error;
225
- }
226
- // No need for finally block or manual cleanup
227
- });
228
- ```
229
-
230
- ## Configuration
231
-
232
- ### Environment Variables
233
-
234
- Create a `.env` file in your project root:
235
-
236
- ```bash .env
237
- TD_API_KEY=your-api-key-here
238
- TD_API_ROOT=https://testdriver-api.onrender.com
239
- ```
240
-
241
- TestDriver automatically reads these when initializing.
242
-
243
- ### Vitest Config Options
244
-
245
- ```javascript vitest.config.mjs
246
- import { defineConfig } from 'vitest/config';
247
-
248
- export default defineConfig({
249
- test: {
250
- // Recommended: Increase timeouts for UI testing
251
- testTimeout: 120000, // 2 minutes per test
252
- hookTimeout: 120000, // 2 minutes for setup/teardown
253
-
254
- // Optional: Run tests sequentially for resource-intensive tests
255
- threads: false,
256
-
257
- // Optional: Limit concurrent tests
258
- maxConcurrency: 3,
259
-
260
- // Optional: Enable file watching
261
- watch: false,
262
- },
263
- });
264
- ```
265
-
266
- ### Per-Test Configuration
267
-
268
- Override defaults for specific tests:
269
-
270
- ```javascript
271
- test('long running test', async (context) => {
272
- const { testdriver } = await chrome(context, {
273
- url: 'https://slow-app.com',
274
- dashcam: false, // Disable recording for faster execution
275
- maximized: false,
276
- });
277
-
278
- // Your test code
279
- }, { timeout: 180000 }); // 3-minute timeout for this test only
280
- ```
281
-
282
- ## Running Tests
283
-
284
- ### Basic Commands
285
-
286
- ```bash
287
- # Run all tests
288
- npx vitest
289
-
290
- # Run specific file
291
- npx vitest login.test.js
292
-
293
- # Run in watch mode
294
- npx vitest --watch
295
-
296
- # Run with coverage
297
- npx vitest --coverage
298
-
299
- # Run tests matching pattern
300
- npx vitest --grep "login"
301
- ```
302
-
303
- ### CI/CD Integration
304
-
305
- ```yaml .github/workflows/test.yml
306
- name: TestDriver Tests
307
-
308
- on: [push, pull_request]
309
-
310
- jobs:
311
- test:
312
- runs-on: ubuntu-latest
313
- steps:
314
- - uses: actions/checkout@v3
315
-
316
- - name: Setup Node.js
317
- uses: actions/setup-node@v3
318
- with:
319
- node-version: '18'
320
-
321
- - name: Install dependencies
322
- run: npm install
323
-
324
- - name: Run tests
325
- env:
326
- TD_API_KEY: ${{ secrets.TD_API_KEY }}
327
- run: npx vitest --run
328
- ```
329
-
330
- ## Advanced Patterns
331
-
332
- ### Shared Setup with beforeEach
333
-
334
- ```javascript
335
- import { describe, test, beforeEach } from 'vitest';
336
- import { chrome } from 'testdriverai/presets';
337
-
338
- describe('Dashboard Tests', () => {
339
- let testdriver;
340
-
341
- beforeEach(async (context) => {
342
- // Setup runs before each test
343
- const result = await chrome(context, {
344
- url: 'https://myapp.com'
345
- });
346
- testdriver = result.testdriver;
347
-
348
- // Shared login
349
- await testdriver.find('email').type('user@example.com');
350
- await testdriver.find('password').type('password');
351
- await testdriver.find('Login').click();
352
- });
353
-
354
- test('view profile', async () => {
355
- await testdriver.find('Profile link').click();
356
- await testdriver.assert('Profile page loads');
357
- });
358
-
359
- test('view settings', async () => {
360
- await testdriver.find('Settings link').click();
361
- await testdriver.assert('Settings page loads');
362
- });
363
- });
364
- ```
365
-
366
- ### Parameterized Tests
367
-
368
- ```javascript
369
- import { test } from 'vitest';
370
- import { chrome } from 'testdriverai/presets';
371
-
372
- const testCases = [
373
- { browser: 'chrome', os: 'linux' },
374
- { browser: 'chrome', os: 'windows' },
375
- { browser: 'chrome', os: 'mac' },
376
- ];
377
-
378
- testCases.forEach(({ browser, os }) => {
379
- test(`login on ${os}`, async (context) => {
380
- const { testdriver } = await chrome(context, {
381
- url: 'https://myapp.com',
382
- os
383
- });
384
-
385
- await testdriver.find('Login').click();
386
- await testdriver.assert('Login successful');
387
- });
388
- });
389
- ```
390
-
391
- ### Custom Helpers
392
-
393
- ```javascript helpers.js
394
- import { chrome } from 'testdriverai/presets';
395
-
396
- export async function loginAsUser(context, email, password) {
397
- const { testdriver } = await chrome(context, {
398
- url: 'https://myapp.com/login'
399
- });
400
-
401
- await testdriver.find('email input').type(email);
402
- await testdriver.find('password input').type(password);
403
- await testdriver.find('Login button').click();
404
-
405
- return testdriver;
406
- }
407
- ```
408
-
409
- ```javascript test.js
410
- import { test } from 'vitest';
411
- import { loginAsUser } from './helpers.js';
412
-
413
- test('logged in user can view dashboard', async (context) => {
414
- const testdriver = await loginAsUser(context, 'user@example.com', 'pass123');
415
-
416
- await testdriver.find('Dashboard link').click();
417
- await testdriver.assert('Dashboard is visible');
418
- });
419
- ```
420
-
421
- ## Best Practices
422
-
423
- ### 1. Use Descriptive Test Names
424
-
425
- ```javascript
426
- // ✅ Good
427
- test('user can login with valid credentials and view dashboard', async (context) => {
428
-
429
- // ❌ Bad
430
- test('test1', async (context) => {
431
- ```
432
-
433
- ### 2. Enable Dashcam for Debugging
434
-
435
- ```javascript
436
- test('complex interaction', async (context) => {
437
- const { testdriver, dashcam } = await chrome(context, {
438
- url: 'https://myapp.com',
439
- dashcam: true // Always enable for debugging
440
- });
441
-
442
- // If test fails, check dashcam.url for replay
443
- });
444
- ```
445
-
446
- ### 3. Use Assertions Liberally
447
-
448
- ```javascript
449
- test('multi-step flow', async (context) => {
450
- const { testdriver } = await chrome(context, { url });
451
-
452
- await testdriver.find('Step 1').click();
453
- await testdriver.assert('Step 1 completed'); // Verify each step
454
-
455
- await testdriver.find('Step 2').click();
456
- await testdriver.assert('Step 2 completed');
457
- });
458
- ```
459
-
460
- ### 4. Keep Tests Focused
461
-
462
- ```javascript
463
- // ✅ Good - One test per scenario
464
- test('user can login', async (context) => { /* ... */ });
465
- test('user can logout', async (context) => { /* ... */ });
466
-
467
- // ❌ Bad - Testing too many things
468
- test('user can login and logout and change settings and...', async (context) => { /* ... */ });
469
- ```
470
-
471
- ### 5. Use Environment Variables for Secrets
472
-
473
- ```javascript
474
- // ✅ Good
475
- await testdriver.find('password').type(process.env.TEST_PASSWORD);
476
-
477
- // ❌ Bad
478
- await testdriver.find('password').type('hardcoded-password');
479
- ```
480
-
481
- ## Troubleshooting
482
-
483
- ### Tests Timeout
484
-
485
- Increase timeout in vitest.config.mjs:
486
-
487
- ```javascript
488
- export default defineConfig({
489
- test: {
490
- testTimeout: 180000, // 3 minutes
491
- },
492
- });
493
- ```
494
-
495
- ### Cleanup Not Working
496
-
497
- Make sure you're passing the `context` parameter:
498
-
499
- ```javascript
500
- // ✅ Correct
501
- test('my test', async (context) => {
502
- await chrome(context, { url });
503
- });
504
-
505
- // ❌ Wrong - cleanup won't work
506
- test('my test', async () => {
507
- await chrome({}, { url });
508
- });
509
- ```
510
-
511
- ### Dashcam URL Not Available
512
-
513
- Ensure Dashcam is enabled and check for errors:
514
-
515
- ```javascript
516
- const { testdriver, dashcam } = await chrome(context, {
517
- url: 'https://example.com',
518
- dashcam: true
519
- });
520
-
521
- if (dashcam) {
522
- console.log('Replay URL:', dashcam.url);
523
- } else {
524
- console.error('Dashcam not initialized');
525
- }
526
- ```
527
-
528
- ## See Also
529
-
530
- - [Provision API](/v7/progressive-apis/PROVISION) - One-line setup for common apps
531
- - [Hooks API](/v7/progressive-apis/HOOKS) - Flexible lifecycle control
532
- - [Chrome Preset](/v7/presets/chrome) - Browser testing
533
- - [VS Code Preset](/v7/presets/vscode) - Extension testing
534
- - [Electron Preset](/v7/presets/electron) - Desktop app testing
535
- - [Vitest Plugin](/v7/guides/vitest-plugin) - Test recording and reporting
@@ -1,25 +0,0 @@
1
- ---
2
- title: "Writing Tests"
3
- description: "Learn how to write effective TestDriver tests with natural language"
4
- icon: "pencil"
5
- ---
6
-
7
- Learn how to write effective TestDriver tests. This section covers everything from generating tests with AI to making assertions.
8
-
9
- <CardGroup cols={2}>
10
- <Card title="Generating Tests" icon="wand-magic-sparkles" href="./generating-tests">
11
- Use AI coding agents and exploration mode to generate tests
12
- </Card>
13
- <Card title="Locating Elements" icon="crosshairs" href="./locating-elements">
14
- Find UI elements using natural language descriptions
15
- </Card>
16
- <Card title="Waiting for Elements" icon="clock" href="./waiting-for-elements">
17
- Handle async operations and prevent flaky tests
18
- </Card>
19
- <Card title="Performing Actions" icon="computer-mouse" href="./performing-actions">
20
- Click, type, hover, scroll and more
21
- </Card>
22
- <Card title="Making Assertions" icon="check-double" href="./making-assertions">
23
- Verify application state with AI-powered assertions
24
- </Card>
25
- </CardGroup>
@@ -1,5 +0,0 @@
1
- ---
2
- title: "Examples"
3
- url: "https://github.com/testdriverai/testdriverai/tree/main/examples"
4
- icon: 'code'
5
- ---
package/eslint.config.js DELETED
@@ -1,67 +0,0 @@
1
- const globals = require("globals");
2
- const pluginJs = require("@eslint/js");
3
-
4
- module.exports = [
5
- pluginJs.configs.recommended,
6
- {
7
- // Base config for all JavaScript files - provides Node.js globals
8
- languageOptions: {
9
- sourceType: "commonjs",
10
- globals: {
11
- ...globals.node,
12
- },
13
- },
14
- },
15
- {
16
- // Specific config for interface and agent files - adds browser globals
17
- files: ["./interfaces/**/*.js", "./agent/**/*.js"],
18
- languageOptions: {
19
- sourceType: "commonjs",
20
- globals: {
21
- ...globals.browser,
22
- ...globals.node,
23
- },
24
- },
25
- },
26
- {
27
- // Specific config for test files - adds Jest and Mocha globals
28
- files: ["test/**/*.js"],
29
- languageOptions: {
30
- sourceType: "commonjs",
31
- globals: {
32
- ...globals.node,
33
- ...globals.jest,
34
- ...globals.mocha,
35
- },
36
- },
37
- },
38
- {
39
- // Config for ES Module files (.mjs) - used in SDK tests
40
- files: ["**/*.mjs"],
41
- languageOptions: {
42
- sourceType: "module",
43
- ecmaVersion: 2022,
44
- globals: {
45
- ...globals.node,
46
- },
47
- },
48
- rules: {
49
- // Warn about floating promises (unawaited async calls)
50
- // This catches missing `await` on async methods like click(), assert(), etc.
51
- // Note: For TypeScript projects, use @typescript-eslint/no-floating-promises instead
52
- "require-await": "warn",
53
- },
54
- },
55
- {
56
- // this needs to be it's own object for some reason
57
- // https://github.com/eslint/eslint/issues/17400
58
- ignores: [
59
- "agent/lib/subimage/**",
60
- "node_modules/**",
61
- ".git",
62
- "test-results/**",
63
- "examples/test-recording-example.test.js",
64
- "vitest.config.example.js",
65
- ],
66
- },
67
- ];
@@ -1,30 +0,0 @@
1
- /**
2
- * TestDriver SDK - AI Test (Vitest)
3
- * Tests the AI exploratory loop (ai) functionality
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe("AI Test", () => {
10
- it("should use ai to search for testdriver on Google", async (context) => {
11
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
12
-
13
- // provision.chrome() automatically calls ready() and starts dashcam
14
- await testdriver.provision.chrome({
15
- url: 'https://duckduckgo.com',
16
- });
17
-
18
- // Use ai to search for testdriver
19
- let aiRes = await testdriver.ai("click on the empty search box, type 'testdriver', and hit enter.");
20
-
21
- console.log("AI response:", aiRes);
22
-
23
- // Assert the search results are displayed
24
- const result = await testdriver.assert(
25
- "search results for testdriver are visible",
26
- );
27
-
28
- expect(result).toBeTruthy();
29
- });
30
- });
@@ -1,46 +0,0 @@
1
- /**
2
- * TestDriver SDK - Assert Test (Vitest)
3
- * Converted from: testdriver/acceptance/assert.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe("Assert Test", () => {
10
- it("should assert the testdriver login page shows", async (context) => {
11
- const testdriver = TestDriver(context, {
12
- ip: context.ip || process.env.TD_IP,
13
- });
14
-
15
- // provision.chrome() automatically calls ready() and starts dashcam
16
- await testdriver.provision.chrome({
17
- url: 'http://testdriver-sandbox.vercel.app/login',
18
- });
19
-
20
- // Take a screenshot
21
- await testdriver.screenshot();
22
-
23
- // Assert the TestDriver.ai Sandbox login page is displayed
24
- const result = await testdriver.assert(
25
- "the TestDriver.ai Sandbox login page is displayed",
26
- );
27
-
28
- expect(result).toBeTruthy();
29
- });
30
- // it("should assert the testdriver login page shows 2", async (context) => {
31
- // const testdriver = TestDriver(context);
32
-
33
- // // provision.chrome() automatically calls ready() and starts dashcam
34
- // await testdriver.provision.chrome({
35
- // url: 'http://testdriver-sandbox.vercel.app/login',
36
- // });
37
-
38
- // // Assert the TestDriver.ai Sandbox login page is displayed
39
- // const result = await testdriver.assert(
40
- // "the TestDriver.ai Sandbox login page is displayed",
41
- // );
42
-
43
- // expect(result).toBeTruthy();
44
- // });
45
- });
46
-