@testdriverai/agent 7.8.0-canary.10

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 (528) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc +1 -0
  5. package/CHANGELOG.md +953 -0
  6. package/README.md +81 -0
  7. package/agent/events.js +135 -0
  8. package/agent/index.js +2450 -0
  9. package/agent/interface.js +35 -0
  10. package/agent/lib/analytics.js +22 -0
  11. package/agent/lib/censorship.js +75 -0
  12. package/agent/lib/commander.js +246 -0
  13. package/agent/lib/commands.js +1684 -0
  14. package/agent/lib/config.js +60 -0
  15. package/agent/lib/generator.js +91 -0
  16. package/agent/lib/http.js +144 -0
  17. package/agent/lib/logger.js +56 -0
  18. package/agent/lib/outputs.js +29 -0
  19. package/agent/lib/parser.js +209 -0
  20. package/agent/lib/redraw.js +386 -0
  21. package/agent/lib/resources/cursor-2.png +0 -0
  22. package/agent/lib/sandbox.js +1104 -0
  23. package/agent/lib/sdk.js +633 -0
  24. package/agent/lib/session.js +25 -0
  25. package/agent/lib/source-mapper.js +342 -0
  26. package/agent/lib/subimage/index.js +77 -0
  27. package/agent/lib/subimage/opencv.js +69 -0
  28. package/agent/lib/system.js +204 -0
  29. package/agent/lib/theme.js +14 -0
  30. package/agent/lib/valid-version.js +21 -0
  31. package/agent/lib/validation.js +169 -0
  32. package/ai/.claude-plugin/plugin.json +9 -0
  33. package/ai/agents/testdriver.md +638 -0
  34. package/ai/skills/testdriver-ai/SKILL.md +204 -0
  35. package/ai/skills/testdriver-assert/SKILL.md +315 -0
  36. package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
  37. package/ai/skills/testdriver-cache/SKILL.md +221 -0
  38. package/ai/skills/testdriver-caching/SKILL.md +124 -0
  39. package/ai/skills/testdriver-captcha/SKILL.md +158 -0
  40. package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
  41. package/ai/skills/testdriver-click/SKILL.md +286 -0
  42. package/ai/skills/testdriver-client/SKILL.md +477 -0
  43. package/ai/skills/testdriver-cloud/SKILL.md +119 -0
  44. package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
  45. package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
  46. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
  47. package/ai/skills/testdriver-device-config/SKILL.md +317 -0
  48. package/ai/skills/testdriver-double-click/SKILL.md +102 -0
  49. package/ai/skills/testdriver-elements/SKILL.md +605 -0
  50. package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
  51. package/ai/skills/testdriver-errors/SKILL.md +246 -0
  52. package/ai/skills/testdriver-events/SKILL.md +356 -0
  53. package/ai/skills/testdriver-examples/SKILL.md +7 -0
  54. package/ai/skills/testdriver-exec/SKILL.md +317 -0
  55. package/ai/skills/testdriver-find/SKILL.md +829 -0
  56. package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
  57. package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
  58. package/ai/skills/testdriver-hover/SKILL.md +278 -0
  59. package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
  60. package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
  61. package/ai/skills/testdriver-mcp/SKILL.md +7 -0
  62. package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
  63. package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
  64. package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
  65. package/ai/skills/testdriver-parse/SKILL.md +236 -0
  66. package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
  67. package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
  68. package/ai/skills/testdriver-provision/SKILL.md +331 -0
  69. package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
  70. package/ai/skills/testdriver-redraw/SKILL.md +214 -0
  71. package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
  72. package/ai/skills/testdriver-right-click/SKILL.md +123 -0
  73. package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
  74. package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
  75. package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
  76. package/ai/skills/testdriver-scroll/SKILL.md +335 -0
  77. package/ai/skills/testdriver-secrets/SKILL.md +115 -0
  78. package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
  79. package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
  80. package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
  81. package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
  82. package/ai/skills/testdriver-type/SKILL.md +357 -0
  83. package/ai/skills/testdriver-variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver-wait/SKILL.md +50 -0
  85. package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
  86. package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
  87. package/bin/testdriverai.js +22 -0
  88. package/debugger/bg.png +0 -0
  89. package/debugger/icon.png +0 -0
  90. package/debugger/index.html +469 -0
  91. package/debugger/td.png +0 -0
  92. package/debugger/tray-buffered.png +0 -0
  93. package/debugger/tray.png +0 -0
  94. package/docs/GITHUB_COMMENTS.md +330 -0
  95. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  96. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  97. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  98. package/docs/_data/examples-manifest.json +177 -0
  99. package/docs/_data/examples-manifest.schema.json +41 -0
  100. package/docs/_scripts/extract-example-urls.js +165 -0
  101. package/docs/_scripts/generate-examples.js +560 -0
  102. package/docs/_scripts/generate-skills.js +154 -0
  103. package/docs/_scripts/link-replacer.js +164 -0
  104. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  105. package/docs/changelog.mdx +161 -0
  106. package/docs/claude-mcp-plugin.mdx +160 -0
  107. package/docs/docs.json +442 -0
  108. package/docs/github-integration-setup.md +266 -0
  109. package/docs/guide/best-practices-polling.mdx +174 -0
  110. package/docs/images/content/account/newprojectsettings.png +0 -0
  111. package/docs/images/content/account/projectpage.png +0 -0
  112. package/docs/images/content/account/projectreplays.png +0 -0
  113. package/docs/images/content/account/team-manage.png +0 -0
  114. package/docs/images/content/account/teampage.png +0 -0
  115. package/docs/images/content/extension/cursor.svg +1 -0
  116. package/docs/images/content/extension/vscode.svg +57 -0
  117. package/docs/images/content/extension/windsurf.svg +3 -0
  118. package/docs/images/content/parse/output.png +0 -0
  119. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  120. package/docs/images/content/side-by-side.png +0 -0
  121. package/docs/images/content/vscode/ide-full.png +0 -0
  122. package/docs/images/content/vscode/running.png +0 -0
  123. package/docs/images/content/vscode/v7-chat.png +0 -0
  124. package/docs/images/content/vscode/v7-choose-agent.png +0 -0
  125. package/docs/images/content/vscode/v7-full.png +0 -0
  126. package/docs/images/content/vscode/v7-onboarding.png +0 -0
  127. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  128. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  129. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  130. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  131. package/docs/images/content/vscode/vscode-install.png +0 -0
  132. package/docs/images/content/vscode/vscode-overview.png +0 -0
  133. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  134. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  135. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  136. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  137. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  138. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  139. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  140. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  141. package/docs/images/template/dark.png +0 -0
  142. package/docs/images/template/icon.png +0 -0
  143. package/docs/images/template/light.png +0 -0
  144. package/docs/snippets/calendar-link.mdx +4 -0
  145. package/docs/snippets/gitignore-warning.mdx +7 -0
  146. package/docs/snippets/lifecycle-warning.mdx +6 -0
  147. package/docs/snippets/test-prereqs.mdx +12 -0
  148. package/docs/snippets/tests/assert-replay.mdx +7 -0
  149. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  150. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  151. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  152. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  153. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  154. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  155. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  156. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  157. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  158. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  159. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  160. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  161. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  162. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  163. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  164. package/docs/snippets/tests/remember-replay.mdx +7 -0
  165. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  166. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  167. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  168. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  169. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  170. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  171. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  172. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  173. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  174. package/docs/snippets/tests/type-replay.mdx +7 -0
  175. package/docs/snippets/tests/type-yaml.mdx +28 -0
  176. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  177. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  178. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  179. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  180. package/docs/snippets/tests/wait-replay.mdx +7 -0
  181. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  182. package/docs/styles.css +65 -0
  183. package/docs/v6/account/dashboard.mdx +16 -0
  184. package/docs/v6/account/enterprise.mdx +110 -0
  185. package/docs/v6/account/pricing.mdx +33 -0
  186. package/docs/v6/account/projects.mdx +33 -0
  187. package/docs/v6/account/team.mdx +35 -0
  188. package/docs/v6/action/ami.mdx +109 -0
  189. package/docs/v6/action/performance.mdx +105 -0
  190. package/docs/v6/action/secrets.mdx +93 -0
  191. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  192. package/docs/v6/apps/desktop-apps.mdx +93 -0
  193. package/docs/v6/apps/mobile-apps.mdx +26 -0
  194. package/docs/v6/apps/static-websites.mdx +54 -0
  195. package/docs/v6/apps/tauri-apps.mdx +361 -0
  196. package/docs/v6/bugs/jira.mdx +232 -0
  197. package/docs/v6/cli/overview.mdx +66 -0
  198. package/docs/v6/commands/assert.mdx +45 -0
  199. package/docs/v6/commands/exec.mdx +276 -0
  200. package/docs/v6/commands/focus-application.mdx +44 -0
  201. package/docs/v6/commands/hover-image.mdx +69 -0
  202. package/docs/v6/commands/hover-text.mdx +47 -0
  203. package/docs/v6/commands/if.mdx +53 -0
  204. package/docs/v6/commands/match-image.mdx +67 -0
  205. package/docs/v6/commands/press-keys.mdx +87 -0
  206. package/docs/v6/commands/remember.mdx +49 -0
  207. package/docs/v6/commands/run.mdx +44 -0
  208. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  209. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  210. package/docs/v6/commands/scroll.mdx +69 -0
  211. package/docs/v6/commands/type.mdx +45 -0
  212. package/docs/v6/commands/wait-for-image.mdx +54 -0
  213. package/docs/v6/commands/wait-for-text.mdx +48 -0
  214. package/docs/v6/commands/wait.mdx +45 -0
  215. package/docs/v6/exporting/junit.mdx +218 -0
  216. package/docs/v6/exporting/playwright.mdx +197 -0
  217. package/docs/v6/features/auto-healing.mdx +144 -0
  218. package/docs/v6/features/generation.mdx +116 -0
  219. package/docs/v6/features/parallel-testing.mdx +151 -0
  220. package/docs/v6/features/reusable-snippets.mdx +131 -0
  221. package/docs/v6/features/selectorless.mdx +80 -0
  222. package/docs/v6/features/visual-assertions.mdx +139 -0
  223. package/docs/v6/getting-started/ci.mdx +146 -0
  224. package/docs/v6/getting-started/cli.mdx +91 -0
  225. package/docs/v6/getting-started/editing.mdx +100 -0
  226. package/docs/v6/getting-started/playwright.mdx +342 -0
  227. package/docs/v6/getting-started/running.mdx +48 -0
  228. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  229. package/docs/v6/getting-started/vscode.mdx +88 -0
  230. package/docs/v6/guide/assertions.mdx +189 -0
  231. package/docs/v6/guide/authentication.mdx +136 -0
  232. package/docs/v6/guide/code.mdx +65 -0
  233. package/docs/v6/guide/dashcam.mdx +118 -0
  234. package/docs/v6/guide/environment-variables.mdx +26 -0
  235. package/docs/v6/guide/lifecycle.mdx +242 -0
  236. package/docs/v6/guide/locating.mdx +141 -0
  237. package/docs/v6/guide/protips.mdx +43 -0
  238. package/docs/v6/guide/variables.mdx +143 -0
  239. package/docs/v6/guide/waiting.mdx +130 -0
  240. package/docs/v6/importing/csv.mdx +196 -0
  241. package/docs/v6/importing/gherkin.mdx +143 -0
  242. package/docs/v6/importing/jira.mdx +164 -0
  243. package/docs/v6/importing/testrail.mdx +162 -0
  244. package/docs/v6/integrations/electron.mdx +146 -0
  245. package/docs/v6/integrations/netlify.mdx +100 -0
  246. package/docs/v6/integrations/vercel.mdx +125 -0
  247. package/docs/v6/interactive/explore.mdx +99 -0
  248. package/docs/v6/interactive/run.mdx +52 -0
  249. package/docs/v6/interactive/save.mdx +63 -0
  250. package/docs/v6/overview/comparison.mdx +101 -0
  251. package/docs/v6/overview/faq.mdx +162 -0
  252. package/docs/v6/overview/performance.mdx +52 -0
  253. package/docs/v6/overview/quickstart.mdx +137 -0
  254. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  255. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  256. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  257. package/docs/v6/scenarios/file-upload.mdx +33 -0
  258. package/docs/v6/scenarios/form-filling.mdx +32 -0
  259. package/docs/v6/scenarios/log-in.mdx +75 -0
  260. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  261. package/docs/v6/scenarios/spell-check.mdx +22 -0
  262. package/docs/v6/security/action.mdx +84 -0
  263. package/docs/v6/security/agent.mdx +73 -0
  264. package/docs/v6/security/platform.mdx +77 -0
  265. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  266. package/docs/v6/tutorials/basic-test.mdx +45 -0
  267. package/docs/v7/_drafts/agents.mdx +843 -0
  268. package/docs/v7/_drafts/architecture.mdx +399 -0
  269. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  270. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  271. package/docs/v7/_drafts/best-practices.mdx +486 -0
  272. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  273. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  274. package/docs/v7/_drafts/caching.mdx +366 -0
  275. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  276. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  277. package/docs/v7/_drafts/commands/exec.mdx +276 -0
  278. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  279. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  280. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  281. package/docs/v7/_drafts/commands/if.mdx +53 -0
  282. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  283. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  284. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  285. package/docs/v7/_drafts/commands/run.mdx +44 -0
  286. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  287. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  288. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  289. package/docs/v7/_drafts/commands/type.mdx +45 -0
  290. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  291. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  292. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  293. package/docs/v7/_drafts/configuration.mdx +378 -0
  294. package/docs/v7/_drafts/contributing.mdx +174 -0
  295. package/docs/v7/_drafts/core.mdx +458 -0
  296. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  297. package/docs/v7/_drafts/debugging.mdx +349 -0
  298. package/docs/v7/_drafts/error-handling.mdx +501 -0
  299. package/docs/v7/_drafts/faq.mdx +393 -0
  300. package/docs/v7/_drafts/hooks.mdx +360 -0
  301. package/docs/v7/_drafts/init-command.mdx +95 -0
  302. package/docs/v7/_drafts/installation.mdx +420 -0
  303. package/docs/v7/_drafts/migration.mdx +562 -0
  304. package/docs/v7/_drafts/observable.mdx +604 -0
  305. package/docs/v7/_drafts/playwright.mdx +342 -0
  306. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  307. package/docs/v7/_drafts/powerful.mdx +419 -0
  308. package/docs/v7/_drafts/presets.mdx +210 -0
  309. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  310. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  311. package/docs/v7/_drafts/provision.mdx +390 -0
  312. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  313. package/docs/v7/_drafts/readme.mdx +135 -0
  314. package/docs/v7/_drafts/reports.mdx +414 -0
  315. package/docs/v7/_drafts/scalable.mdx +763 -0
  316. package/docs/v7/_drafts/screenshot.mdx +155 -0
  317. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  318. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  319. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  320. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  321. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  322. package/docs/v7/_drafts/test-recording.mdx +382 -0
  323. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  324. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  325. package/docs/v7/_drafts/vitest.mdx +535 -0
  326. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  327. package/docs/v7/ai.mdx +205 -0
  328. package/docs/v7/assert.mdx +316 -0
  329. package/docs/v7/aws-setup.mdx +449 -0
  330. package/docs/v7/cache.mdx +223 -0
  331. package/docs/v7/caching.mdx +128 -0
  332. package/docs/v7/captcha.mdx +159 -0
  333. package/docs/v7/ci-cd.mdx +603 -0
  334. package/docs/v7/click.mdx +287 -0
  335. package/docs/v7/client.mdx +478 -0
  336. package/docs/v7/copilot/auto-healing.mdx +265 -0
  337. package/docs/v7/copilot/creating-tests.mdx +156 -0
  338. package/docs/v7/copilot/github.mdx +143 -0
  339. package/docs/v7/copilot/running-tests.mdx +149 -0
  340. package/docs/v7/copilot/setup.mdx +143 -0
  341. package/docs/v7/customizing-devices.mdx +319 -0
  342. package/docs/v7/dashcam.mdx +419 -0
  343. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  344. package/docs/v7/device-config.mdx +317 -0
  345. package/docs/v7/double-click.mdx +102 -0
  346. package/docs/v7/elements.mdx +606 -0
  347. package/docs/v7/enterprise.mdx +9 -0
  348. package/docs/v7/errors.mdx +248 -0
  349. package/docs/v7/events.mdx +358 -0
  350. package/docs/v7/examples/ai.mdx +72 -0
  351. package/docs/v7/examples/assert.mdx +72 -0
  352. package/docs/v7/examples/captcha-api.mdx +92 -0
  353. package/docs/v7/examples/chrome-extension.mdx +132 -0
  354. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  355. package/docs/v7/examples/element-not-found.mdx +67 -0
  356. package/docs/v7/examples/exec-output.mdx +85 -0
  357. package/docs/v7/examples/exec-pwsh.mdx +83 -0
  358. package/docs/v7/examples/focus-window.mdx +62 -0
  359. package/docs/v7/examples/hover-image.mdx +94 -0
  360. package/docs/v7/examples/hover-text.mdx +69 -0
  361. package/docs/v7/examples/installer.mdx +91 -0
  362. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  363. package/docs/v7/examples/match-image.mdx +96 -0
  364. package/docs/v7/examples/press-keys.mdx +92 -0
  365. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  366. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  367. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  368. package/docs/v7/examples/scroll.mdx +81 -0
  369. package/docs/v7/examples/type.mdx +92 -0
  370. package/docs/v7/examples/windows-installer.mdx +89 -0
  371. package/docs/v7/exec.mdx +318 -0
  372. package/docs/v7/find.mdx +830 -0
  373. package/docs/v7/focus-application.mdx +294 -0
  374. package/docs/v7/generating-tests.mdx +36 -0
  375. package/docs/v7/hosted.mdx +158 -0
  376. package/docs/v7/hover.mdx +279 -0
  377. package/docs/v7/locating-elements.mdx +71 -0
  378. package/docs/v7/making-assertions.mdx +32 -0
  379. package/docs/v7/mcp.mdx +9 -0
  380. package/docs/v7/mouse-down.mdx +161 -0
  381. package/docs/v7/mouse-up.mdx +164 -0
  382. package/docs/v7/parse.mdx +237 -0
  383. package/docs/v7/performing-actions.mdx +54 -0
  384. package/docs/v7/press-keys.mdx +349 -0
  385. package/docs/v7/provision.mdx +333 -0
  386. package/docs/v7/quickstart.mdx +173 -0
  387. package/docs/v7/redraw.mdx +216 -0
  388. package/docs/v7/reusable-code.mdx +249 -0
  389. package/docs/v7/right-click.mdx +123 -0
  390. package/docs/v7/running-tests.mdx +185 -0
  391. package/docs/v7/screenshot.mdx +249 -0
  392. package/docs/v7/screenshots.mdx +186 -0
  393. package/docs/v7/scroll.mdx +336 -0
  394. package/docs/v7/secrets.mdx +115 -0
  395. package/docs/v7/self-hosted.mdx +149 -0
  396. package/docs/v7/type.mdx +358 -0
  397. package/docs/v7/variables.mdx +111 -0
  398. package/docs/v7/wait.mdx +52 -0
  399. package/docs/v7/waiting-for-elements.mdx +90 -0
  400. package/docs/v7/what-is-testdriver.mdx +54 -0
  401. package/eslint.config.js +67 -0
  402. package/examples/ai.test.mjs +31 -0
  403. package/examples/assert.test.mjs +47 -0
  404. package/examples/chrome-extension.test.mjs +97 -0
  405. package/examples/config.mjs +5 -0
  406. package/examples/element-not-found.test.mjs +27 -0
  407. package/examples/exec-output.test.mjs +60 -0
  408. package/examples/exec-pwsh.test.mjs +58 -0
  409. package/examples/findall-coffee-icons.test.mjs +42 -0
  410. package/examples/focus-window.test.mjs +37 -0
  411. package/examples/formatted-logging.test.mjs +27 -0
  412. package/examples/hover-image.test.mjs +53 -0
  413. package/examples/hover-text-with-description.test.mjs +57 -0
  414. package/examples/hover-text.test.mjs +28 -0
  415. package/examples/installer.test.mjs +50 -0
  416. package/examples/launch-vscode-linux.test.mjs +55 -0
  417. package/examples/match-image.test.mjs +55 -0
  418. package/examples/parse.test.mjs +19 -0
  419. package/examples/press-keys.test.mjs +44 -0
  420. package/examples/prompt.test.mjs +34 -0
  421. package/examples/scroll-keyboard.test.mjs +38 -0
  422. package/examples/scroll-until-image.test.mjs +40 -0
  423. package/examples/scroll.test.mjs +42 -0
  424. package/examples/type.test.mjs +46 -0
  425. package/examples/windows-installer.test.mjs +54 -0
  426. package/index.js +2 -0
  427. package/interfaces/cli/commands/init.js +438 -0
  428. package/interfaces/cli/commands/setup.js +382 -0
  429. package/interfaces/cli/lib/base.js +285 -0
  430. package/interfaces/cli.js +20 -0
  431. package/interfaces/junit-reporter.js +290 -0
  432. package/interfaces/logger.js +388 -0
  433. package/interfaces/readline.js +234 -0
  434. package/interfaces/shared-test-state.mjs +64 -0
  435. package/interfaces/vitest-plugin.d.ts +115 -0
  436. package/interfaces/vitest-plugin.mjs +1698 -0
  437. package/lib/captcha/solver.js +358 -0
  438. package/lib/core/Dashcam.js +533 -0
  439. package/lib/core/index.d.ts +172 -0
  440. package/lib/core/index.js +12 -0
  441. package/lib/environments.json +18 -0
  442. package/lib/github-comment-formatter.js +263 -0
  443. package/lib/github-comment.mjs +452 -0
  444. package/lib/init-project.js +575 -0
  445. package/lib/presets/index.mjs +331 -0
  446. package/lib/resolve-channel.js +46 -0
  447. package/lib/sentry.js +417 -0
  448. package/lib/vitest/hooks.d.ts +57 -0
  449. package/lib/vitest/hooks.mjs +674 -0
  450. package/lib/vitest/setup-aws.mjs +247 -0
  451. package/lib/vitest/setup-self-hosted.mjs +151 -0
  452. package/lib/vitest/setup.mjs +46 -0
  453. package/manual/captcha-api.test.mjs +51 -0
  454. package/manual/drag-and-drop.test.mjs +59 -0
  455. package/manual/flake-diffthreshold-001.test.mjs +9 -0
  456. package/manual/flake-diffthreshold-01.test.mjs +9 -0
  457. package/manual/flake-diffthreshold-05.test.mjs +9 -0
  458. package/manual/flake-noredraw-cache.test.mjs +9 -0
  459. package/manual/flake-noredraw-nocache.test.mjs +9 -0
  460. package/manual/flake-redraw-cache.test.mjs +9 -0
  461. package/manual/flake-redraw-nocache.test.mjs +9 -0
  462. package/manual/flake-rocket-match.test.mjs +30 -0
  463. package/manual/flake-shared.mjs +51 -0
  464. package/manual/no-provision.test.mjs +31 -0
  465. package/manual/packer-hover-image.test.mjs +176 -0
  466. package/manual/scroll-until-text.test.mjs +68 -0
  467. package/manual/test-init-command.js +223 -0
  468. package/mcp-server/README.md +322 -0
  469. package/mcp-server/dist/codegen.d.ts +9 -0
  470. package/mcp-server/dist/codegen.js +165 -0
  471. package/mcp-server/dist/mcp-app.html +114 -0
  472. package/mcp-server/dist/package.json +1 -0
  473. package/mcp-server/dist/provision-types.d.ts +290 -0
  474. package/mcp-server/dist/provision-types.js +174 -0
  475. package/mcp-server/dist/server.d.ts +6 -0
  476. package/mcp-server/dist/server.mjs +1925 -0
  477. package/mcp-server/dist/session.d.ts +85 -0
  478. package/mcp-server/dist/session.js +152 -0
  479. package/mcp-server/mcp-app.html +28 -0
  480. package/mcp-server/mcp-config.example.json +19 -0
  481. package/mcp-server/package-lock.json +4027 -0
  482. package/mcp-server/package.json +31 -0
  483. package/mcp-server/src/codegen.ts +189 -0
  484. package/mcp-server/src/mcp-app.css +360 -0
  485. package/mcp-server/src/mcp-app.ts +547 -0
  486. package/mcp-server/src/provision-types.ts +209 -0
  487. package/mcp-server/src/server.ts +2391 -0
  488. package/mcp-server/src/session.ts +194 -0
  489. package/mcp-server/tsconfig.json +16 -0
  490. package/mcp-server/vite.config.ts +23 -0
  491. package/package.json +158 -0
  492. package/schema.json +1046 -0
  493. package/scripts/generate-skills.js +94 -0
  494. package/sdk-log-formatter.js +1157 -0
  495. package/sdk.d.ts +1486 -0
  496. package/sdk.js +4336 -0
  497. package/setup/aws/cloudformation.yaml +463 -0
  498. package/setup/aws/disable-defender.sh +42 -0
  499. package/setup/aws/install-dev-runner.sh +79 -0
  500. package/setup/aws/spawn-runner.sh +289 -0
  501. package/test/captcha-solver.test.mjs +152 -0
  502. package/test/chrome-remote-debugging.test.mjs +66 -0
  503. package/test/duckduckgo/experiment.test.mjs +28 -0
  504. package/test/duckduckgo/setup.test.mjs +29 -0
  505. package/test/manual/debug-locate-response.js +82 -0
  506. package/test/manual/reconnect-provision.test.mjs +49 -0
  507. package/test/manual/test-console-logs.test.mjs +42 -0
  508. package/test/manual/test-find-api.js +73 -0
  509. package/test/manual/test-init.sh +54 -0
  510. package/test/manual/test-prompt-cache.js +97 -0
  511. package/test/manual/test-provision-auth.mjs +22 -0
  512. package/test/manual/test-sandbox-render.js +29 -0
  513. package/test/manual/test-sdk-methods.js +15 -0
  514. package/test/manual/test-sdk-refactor.js +53 -0
  515. package/test/manual/test-stack-trace.mjs +57 -0
  516. package/test/manual/verify-element-api.js +89 -0
  517. package/test/manual/verify-types.js +0 -0
  518. package/test/manual-unawaited-promise.test.mjs +31 -0
  519. package/vitest.config.mjs +58 -0
  520. package/vitest.runner.config.mjs +33 -0
  521. package/vscode-extension/.vscodeignore +12 -0
  522. package/vscode-extension/README.md +94 -0
  523. package/vscode-extension/media/icon.png +0 -0
  524. package/vscode-extension/package-lock.json +4126 -0
  525. package/vscode-extension/package.json +86 -0
  526. package/vscode-extension/src/extension.ts +829 -0
  527. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  528. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,477 @@
1
+ ---
2
+ name: testdriver:client
3
+ description: Initialize and configure the TestDriver SDK client
4
+ ---
5
+ <!-- Generated from client.mdx. DO NOT EDIT. -->
6
+
7
+ ## Overview
8
+
9
+ The `TestDriver` client is the main entry point for the SDK. It handles authentication, sandbox connection, and provides access to all testing methods.
10
+
11
+ ## Constructor
12
+
13
+ ```javascript
14
+ const testdriver = new TestDriver(apiKey, options)
15
+ ```
16
+
17
+ ### Parameters
18
+
19
+ <ParamField path="apiKey" type="string" required>
20
+ Your TestDriver API key from the [dashboard](https://console.testdriver.ai/team)
21
+ </ParamField>
22
+
23
+ <ParamField path="options" type="object">
24
+ Configuration options for the client
25
+
26
+ <Expandable title="properties">
27
+ <ParamField path="os" type="string" default="linux">
28
+ Operating system for the sandbox: `'windows'` or `'linux'`
29
+ </ParamField>
30
+
31
+ <ParamField path="resolution" type="string" default="1366x768">
32
+ Screen resolution for the sandbox (e.g., `'1920x1080'`, `'1366x768'`)
33
+ </ParamField>
34
+
35
+ <ParamField path="apiRoot" type="string">
36
+ API endpoint URL (typically only changed for self-hosted deployments)
37
+ </ParamField>
38
+
39
+ <ParamField path="analytics" type="boolean" default="true">
40
+ Enable or disable usage analytics
41
+ </ParamField>
42
+
43
+ <ParamField path="logging" type="boolean" default="true">
44
+ Enable or disable console logging
45
+ </ParamField>
46
+
47
+ <ParamField path="autoScreenshots" type="boolean" default="true">
48
+ Automatically capture screenshots before and after each command. Screenshots are saved to `.testdriver/screenshots/<test>/` with descriptive filenames that include the line number and action name. Format: `<seq>-<action>-<phase>-L<line>-<description>.png`
49
+ </ParamField>
50
+
51
+ <ParamField path="newSandbox" type="boolean" default="true">
52
+ Force creation of a new sandbox instead of reusing an existing one
53
+ </ParamField>
54
+
55
+ <ParamField path="reconnect" type="boolean" default="false">
56
+ Reconnect to the last used sandbox instead of creating a new one. When `true`, provision methods (`chrome`, `vscode`, `installer`, etc.) will be skipped since the application is already running. Throws error if no previous sandbox exists.
57
+ </ParamField>
58
+
59
+ <ParamField path="keepAlive" type="number" default="60000">
60
+ Keep sandbox alive for the specified number of milliseconds after disconnect. Set to `0` to terminate immediately on disconnect. Useful for debugging or reconnecting to the same sandbox.
61
+ </ParamField>
62
+
63
+ <ParamField path="preview" type="string" default="browser">
64
+ Preview mode for live test visualization:
65
+ - `"browser"` — Opens debugger in default browser (default)
66
+ - `"ide"` — Opens preview in IDE panel (VSCode, Cursor - requires TestDriver extension)
67
+ - `"none"` — Headless mode, no visual preview
68
+ </ParamField>
69
+
70
+ <ParamField path="headless" type="boolean" default="false">
71
+ **Deprecated**: Use `preview: "none"` instead. Run in headless mode without opening the debugger.
72
+ </ParamField>
73
+
74
+ <ParamField path="debugOnFailure" type="boolean" default="false">
75
+ Keep the sandbox alive when a test fails so you can reconnect and debug interactively. The sandbox ID is printed to the console.
76
+ </ParamField>
77
+
78
+ <ParamField path="ip" type="string">
79
+ Direct IP address to connect to a running sandbox instance (for self-hosted deployments)
80
+ </ParamField>
81
+
82
+ <ParamField path="sandboxAmi" type="string">
83
+ Custom AMI ID for the sandbox instance (AWS deployments, e.g., `'ami-1234'`)
84
+ </ParamField>
85
+
86
+ <ParamField path="sandboxInstance" type="string">
87
+ EC2 instance type for the sandbox (AWS deployments, e.g., `'i3.metal'`)
88
+ </ParamField>
89
+
90
+ <ParamField path="cache" type="boolean | object" default="true">
91
+ Enable or disable element caching, or provide advanced threshold configuration.
92
+
93
+ <Expandable title="advanced config">
94
+ <ParamField path="enabled" type="boolean" default="true">
95
+ Enable or disable caching
96
+ </ParamField>
97
+
98
+ <ParamField path="thresholds" type="object">
99
+ Fine-tune cache matching
100
+
101
+ <Expandable title="properties">
102
+ <ParamField path="find" type="object">
103
+ Thresholds for `find()` operations
104
+
105
+ <Expandable title="properties">
106
+ <ParamField path="screen" type="number" default="0.05">
107
+ Pixel diff threshold for screen comparison (0-1). `0.05` = 5% diff allowed.
108
+ </ParamField>
109
+
110
+ <ParamField path="element" type="number" default="0.8">
111
+ OpenCV template match threshold for element matching (0-1). `0.8` = 80% correlation.
112
+ </ParamField>
113
+ </Expandable>
114
+ </ParamField>
115
+
116
+ <ParamField path="assert" type="number" default="0.05">
117
+ Pixel diff threshold for `assert()` operations (0-1). `0.05` = 5% diff allowed.
118
+ </ParamField>
119
+ </Expandable>
120
+ </ParamField>
121
+ </Expandable>
122
+ </ParamField>
123
+
124
+ <ParamField path="cacheKey" type="string">
125
+ Cache key for element finding operations. If provided, enables caching tied to this key.
126
+ </ParamField>
127
+
128
+ <ParamField path="dashcam" type="boolean" default="true">
129
+ Enable or disable Dashcam video recording
130
+ </ParamField>
131
+
132
+ <ParamField path="redraw" type="boolean | object" default="true">
133
+ Enable or disable screen-change (redraw) detection, or provide advanced configuration.
134
+
135
+ <Expandable title="advanced config">
136
+ <ParamField path="enabled" type="boolean" default="true">
137
+ Enable or disable redraw detection
138
+ </ParamField>
139
+
140
+ <ParamField path="thresholds" type="object">
141
+ Threshold configuration
142
+
143
+ <Expandable title="properties">
144
+ <ParamField path="screen" type="number | false" default="0.05">
145
+ Pixel diff threshold (0-1). Set to `false` to disable screen redraw detection.
146
+ </ParamField>
147
+
148
+ <ParamField path="network" type="boolean" default="false">
149
+ Enable or disable network activity monitoring
150
+ </ParamField>
151
+ </Expandable>
152
+ </ParamField>
153
+ </Expandable>
154
+ </ParamField>
155
+
156
+ <ParamField path="environment" type="object">
157
+ Additional environment variables to pass to the sandbox
158
+ </ParamField>
159
+
160
+ <ParamField path="ai" type="object">
161
+ Global AI sampling configuration. Controls how the AI model generates responses for `find()` verification and `assert()` calls. Can be overridden per call.
162
+
163
+ <Expandable title="properties">
164
+ <ParamField path="temperature" type="number">
165
+ Controls randomness in AI responses. `0` = deterministic (best for verification), higher values = more creative. Default: `0` for find verification, model default for assert.
166
+ </ParamField>
167
+
168
+ <ParamField path="top" type="object">
169
+ Nucleus and top-k sampling parameters
170
+
171
+ <Expandable title="properties">
172
+ <ParamField path="p" type="number">
173
+ Top-P (nucleus sampling). Limits token choices to the smallest set whose cumulative probability exceeds P. Lower values = more focused responses. Range: 0-1.
174
+ </ParamField>
175
+
176
+ <ParamField path="k" type="number">
177
+ Top-K sampling. Limits token choices to the top K most likely tokens. `1` = always pick the most likely token. `0` = disabled (consider all tokens).
178
+ </ParamField>
179
+ </Expandable>
180
+ </ParamField>
181
+ </Expandable>
182
+ </ParamField>
183
+ </Expandable>
184
+ </ParamField>
185
+
186
+ ### Example
187
+
188
+ ```javascript
189
+ import TestDriver from 'testdriverai';
190
+
191
+ // API key is automatically loaded from TD_API_KEY in .env
192
+ const testdriver = new TestDriver({
193
+ os: 'windows',
194
+ resolution: '1920x1080',
195
+ logging: true,
196
+ analytics: true
197
+ });
198
+
199
+ // With AI config for stricter verification
200
+ const testdriver = new TestDriver({
201
+ ai: { temperature: 0, top: { p: 0.9, k: 40 } }
202
+ });
203
+
204
+ // Or pass API key explicitly
205
+ const testdriver = new TestDriver('your-api-key', {
206
+ os: 'windows'
207
+ });
208
+ ```
209
+
210
+ ## Authentication
211
+
212
+ ### auth()
213
+
214
+ Authenticate with the TestDriver API.
215
+
216
+ ```javascript
217
+ await testdriver.auth()
218
+ ```
219
+
220
+ **Returns:** `Promise<string>` - Authentication token
221
+
222
+ **Example:**
223
+ ```javascript
224
+ await testdriver.auth();
225
+ ```
226
+
227
+ <Note>
228
+ You must call `auth()` before `connect()`. Most examples call both sequentially.
229
+ </Note>
230
+
231
+ ## Connection Management
232
+
233
+ ### connect()
234
+
235
+ Connect to a sandbox environment. This creates or reconnects to a virtual machine where your tests will run.
236
+
237
+ ```javascript
238
+ await testdriver.connect(options)
239
+ ```
240
+
241
+ #### Parameters
242
+
243
+ <ParamField path="options" type="object">
244
+ Connection options
245
+
246
+ <Expandable title="properties">
247
+ <ParamField path="newSandbox" type="boolean" default="false">
248
+ Force creation of a new sandbox instead of reusing an existing one
249
+ </ParamField>
250
+
251
+ <ParamField path="sandboxId" type="string">
252
+ Existing sandbox ID to reconnect to
253
+ </ParamField>
254
+
255
+ <ParamField path="ip" type="string">
256
+ Direct IP address to connect to (for self-hosted sandboxes)
257
+ </ParamField>
258
+
259
+ <ParamField path="sandboxAmi" type="string">
260
+ AMI to use for the sandbox (AWS deployments)
261
+ </ParamField>
262
+
263
+ <ParamField path="sandboxInstance" type="string">
264
+ Instance type for the sandbox (AWS deployments)
265
+ </ParamField>
266
+
267
+ <ParamField path="preview" type="string" default="browser">
268
+ Preview mode for live test visualization:
269
+ - `"browser"` - Opens debugger in default browser (default)
270
+ - `"ide"` - Opens preview in IDE panel (VSCode, Cursor - requires TestDriver extension)
271
+ - `"none"` - Headless mode, no visual preview
272
+ </ParamField>
273
+
274
+ <ParamField path="headless" type="boolean" default="false">
275
+ **Deprecated**: Use `preview: "none"` instead. Run in headless mode without opening the debugger.
276
+ </ParamField>
277
+ </Expandable>
278
+ </ParamField>
279
+
280
+ **Returns:** `Promise&lt;Object&gt;` - Sandbox instance details including `instanceId`, `ip`, `vncPort`, etc.
281
+
282
+ #### Examples
283
+
284
+ **Basic connection:**
285
+ ```javascript
286
+ await testdriver.connect();
287
+ ```
288
+
289
+ **Reconnect to existing sandbox:**
290
+ ```javascript
291
+ const instance = await testdriver.connect({
292
+ sandboxId: 'existing-sandbox-id-123'
293
+ });
294
+ ```
295
+
296
+ **Self-hosted sandbox:**
297
+ ```javascript
298
+ await testdriver.connect({
299
+ ip: '192.168.1.100'
300
+ });
301
+ ```
302
+
303
+ ### disconnect()
304
+
305
+ Disconnect from the sandbox and clean up resources.
306
+
307
+ ```javascript
308
+ await testdriver.disconnect()
309
+ ```
310
+
311
+ **Returns:** `Promise<void>`
312
+
313
+ **Example:**
314
+ ```javascript
315
+ afterAll(async () => {
316
+ await testdriver.disconnect();
317
+ });
318
+ ```
319
+
320
+ ## Instance Information
321
+
322
+ ### getInstance()
323
+
324
+ Get the current sandbox instance details.
325
+
326
+ ```javascript
327
+ const instance = testdriver.getInstance()
328
+ ```
329
+
330
+ **Returns:** `Object | null` - Sandbox instance information
331
+
332
+ **Example:**
333
+ ```javascript
334
+ const instance = testdriver.getInstance();
335
+ console.log('Instance ID:', instance.instanceId);
336
+ console.log('IP Address:', instance.ip);
337
+ ```
338
+
339
+ ### getSessionId()
340
+
341
+ Get the current session ID for tracking and debugging.
342
+
343
+ ```javascript
344
+ const sessionId = testdriver.getSessionId()
345
+ ```
346
+
347
+ **Returns:** `string | null` - Session ID
348
+
349
+ **Example:**
350
+ ```javascript
351
+ const sessionId = testdriver.getSessionId();
352
+ console.log('Session:', sessionId);
353
+ ```
354
+
355
+ ## Logging & Events
356
+
357
+ ### setLogging()
358
+
359
+ Enable or disable console logging at runtime.
360
+
361
+ ```javascript
362
+ testdriver.setLogging(enabled)
363
+ ```
364
+
365
+ **Parameters:**
366
+ - `enabled` (boolean) - Whether to enable logging
367
+
368
+ **Example:**
369
+ ```javascript
370
+ // Disable logging for cleanup operations
371
+ testdriver.setLogging(false);
372
+ await testdriver.disconnect();
373
+ testdriver.setLogging(true);
374
+ ```
375
+
376
+ ### getEmitter()
377
+
378
+ Get the event emitter for custom event handling.
379
+
380
+ ```javascript
381
+ const emitter = testdriver.getEmitter()
382
+ ```
383
+
384
+ **Returns:** `EventEmitter2` - Event emitter instance
385
+
386
+ **Example:**
387
+ ```javascript
388
+ const emitter = testdriver.getEmitter();
389
+
390
+ emitter.on('command:start', (data) => {
391
+ console.log('Command started:', data);
392
+ });
393
+
394
+ emitter.on('command:success', (data) => {
395
+ console.log('Command succeeded:', data);
396
+ });
397
+
398
+ emitter.on('command:error', (error) => {
399
+ console.error('Command failed:', error);
400
+ });
401
+ ```
402
+
403
+ ## Complete Example
404
+
405
+ ```javascript
406
+ import { beforeAll, afterAll, describe, it } from 'vitest';
407
+ import TestDriver from 'testdriverai';
408
+
409
+ describe('My Test Suite', () => {
410
+ let testdriver;
411
+
412
+ beforeAll(async () => {
413
+ // Initialize client - API key loaded automatically from .env
414
+ testdriver = new TestDriver({
415
+ os: 'windows',
416
+ resolution: '1366x768',
417
+ logging: true
418
+ });
419
+
420
+ // Set up event listeners
421
+ const emitter = testdriver.getEmitter();
422
+ emitter.on('log:info', (msg) => console.log('[INFO]', msg));
423
+
424
+ // Authenticate and connect
425
+ await testdriver.auth();
426
+ const instance = await testdriver.connect();
427
+
428
+ console.log('Connected to sandbox:', instance.instanceId);
429
+ });
430
+
431
+ afterAll(async () => {
432
+ await testdriver.disconnect();
433
+ });
434
+
435
+ it('runs a test', async () => {
436
+ // Your test code here
437
+ });
438
+ });
439
+ ```
440
+
441
+ ## Best Practices
442
+
443
+ <AccordionGroup>
444
+ <Accordion title="Reuse sandboxes across tests">
445
+ Use `beforeAll`/`afterAll` to create one sandbox per test suite rather than per test. This significantly reduces execution time.
446
+ </Accordion>
447
+
448
+ <Accordion title="Handle connection errors gracefully">
449
+ Wrap `connect()` in a try-catch block to handle network issues or quota limits:
450
+
451
+ ```javascript
452
+ try {
453
+ await testdriver.connect();
454
+ } catch (error) {
455
+ console.error('Failed to connect:', error.message);
456
+ throw error;
457
+ }
458
+ ```
459
+ </Accordion>
460
+
461
+ <Accordion title="Always disconnect">
462
+ Use `afterAll` or try-finally blocks to ensure `disconnect()` is called even if tests fail. This prevents orphaned sandboxes.
463
+ </Accordion>
464
+
465
+ <Accordion title="Use environment variables for API keys">
466
+ Never hardcode API keys. The SDK automatically loads `TD_API_KEY` from your `.env` file:
467
+
468
+ ```bash .env
469
+ TD_API_KEY=your_api_key_here
470
+ ```
471
+
472
+ ```javascript
473
+ // API key is loaded automatically - no need to pass it!
474
+ const testdriver = new TestDriver();
475
+ ```
476
+ </Accordion>
477
+ </AccordionGroup>
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: testdriver:cloud
3
+ description: The fastest way to get started with TestDriver. Just set your API key and start testing.
4
+ ---
5
+ <!-- Generated from cloud.mdx. DO NOT EDIT. -->
6
+
7
+ Cloud pricing is based on **device-seconds**: the amount of time your tests run on **our infrastructure**.
8
+
9
+ - **Zero Setup** — Start testing immediately. No DevOps required.
10
+ - **Free Tier** — Get started with a limited preview at no cost.
11
+ - **Pay As You Go** — Only pay for the device-seconds you use.
12
+
13
+ ## Get Started
14
+ Cloud is the default when you follow the Quickstart guide.
15
+ <Card
16
+ title="Try the Quickstart"
17
+ icon="play"
18
+ href="/v7/quickstart"
19
+ >
20
+ Set your API key and start testing in minutes.
21
+ </Card>
22
+
23
+ ## Parallel Testing Limits
24
+
25
+ Your account has a set number of **license slots** that determine how many devices can run simultaneously. You can view your available slots in the [TestDriver Dashboard](https://console.testdriver.ai).
26
+
27
+ <Info>
28
+ **When is a slot in use?** A license slot is occupied when a test client is connected. As soon as your device is destroyed the slot becomes available immediately.
29
+ </Info>
30
+
31
+ ## Avoiding Slot Conflicts
32
+
33
+ To prevent tests from failing due to exceeding your license slot limit, we recommend two key configurations:
34
+
35
+ <AccordionGroup>
36
+ <Accordion title="Set Maximum Concurrency in Vitest">
37
+ Limit concurrent tests to match your available license slots:
38
+
39
+ ```javascript vitest.config.mjs
40
+ import { defineConfig } from 'vitest/config';
41
+ import { TestDriver } from 'testdriverai/vitest';
42
+
43
+ export default defineConfig({
44
+ test: {
45
+ testTimeout: 900000,
46
+ hookTimeout: 900000,
47
+ maxConcurrency: 5, // Set to your license slot limit
48
+ reporters: ['default', TestDriver()],
49
+ setupFiles: ['testdriverai/vitest/setup'],
50
+ },
51
+ });
52
+ ```
53
+
54
+ <Tip>
55
+ Check your slot count at [console.testdriver.ai](https://console.testdriver.ai) and set `maxConcurrency` to that number or lower.
56
+ </Tip>
57
+ </Accordion>
58
+
59
+ <Accordion title="Use GitHub Concurrency Keys">
60
+ Prevent multiple workflow runs from competing for the same slots by using [GitHub's concurrency controls](https://docs.github.com/actions/writing-workflows/choosing-what-your-workflow-does/control-the-concurrency-of-workflows-and-jobs):
61
+
62
+ ```yaml .github/workflows/test.yml
63
+ name: Tests
64
+
65
+ on:
66
+ push:
67
+ branches: [main]
68
+ pull_request:
69
+
70
+ # Prevent concurrent runs from competing for license slots
71
+ concurrency:
72
+ group: ${{ github.workflow }}-${{ github.ref }}
73
+ cancel-in-progress: true
74
+
75
+ jobs:
76
+ test:
77
+ runs-on: ubuntu-latest
78
+ steps:
79
+ - uses: actions/checkout@v4
80
+
81
+ - name: Setup Node.js
82
+ uses: actions/setup-node@v4
83
+ with:
84
+ node-version: '20'
85
+
86
+ - name: Install dependencies
87
+ run: npm install
88
+
89
+ - name: Run tests
90
+ run: vitest run
91
+ env:
92
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
93
+ ```
94
+
95
+ The `concurrency` block ensures:
96
+ - Only one workflow run per branch runs at a time
97
+ - New pushes cancel in-progress runs on the same branch
98
+ - Different branches/PRs can run in parallel (up to your slot limit)
99
+ </Accordion>
100
+ </AccordionGroup>
101
+
102
+ ## When to Consider Self-Hosted
103
+
104
+ Cloud is perfect for getting started and for teams that want zero infrastructure management. However, you might consider [Self-Hosted](/v7/self-hosted) if you:
105
+
106
+ - Want to escape per-second billing with a flat license fee
107
+ - Require greater concurrency than offered in Cloud plans
108
+ - Need full control over your infrastructure and privacy
109
+ - Want to use your own AI API keys
110
+ - Require custom hardware configurations
111
+ - Have high test volumes that make self-hosting more economical
112
+
113
+ <Card
114
+ title="Explore Self-Hosted"
115
+ icon="server"
116
+ href="/v7/self-hosted"
117
+ >
118
+ Learn about self-hosting for unlimited test execution at a flat rate.
119
+ </Card>