@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,348 @@
1
+ ---
2
+ name: testdriver:press-keys
3
+ description: Press keyboard keys and shortcuts
4
+ ---
5
+ <!-- Generated from press-keys.mdx. DO NOT EDIT. -->
6
+
7
+ ## Overview
8
+
9
+ Press one or more keyboard keys simultaneously, useful for keyboard shortcuts, navigation, and special keys.
10
+
11
+ ## Syntax
12
+
13
+ ```javascript
14
+ await testdriver.pressKeys(keys)
15
+ ```
16
+
17
+ ## Parameters
18
+
19
+ <ParamField path="keys" type="Array&lt;string&gt;" required>
20
+ Array of keys to press simultaneously
21
+ </ParamField>
22
+
23
+ ## Returns
24
+
25
+ `Promise<void>`
26
+
27
+ ## Common Keys
28
+
29
+ ### Special Keys
30
+ - `'enter'`, `'tab'`, `'escape'`, `'backspace'`, `'delete'`
31
+ - `'space'`, `'up'`, `'down'`, `'left'`, `'right'`
32
+ - `'home'`, `'end'`, `'pageup'`, `'pagedown'`
33
+
34
+ ### Modifier Keys
35
+ - `'ctrl'`, `'alt'`, `'shift'`
36
+ - `'command'` (macOS), `'win'` (Windows)
37
+ - `'ctrlleft'`, `'ctrlright'`, `'shiftleft'`, `'shiftright'`
38
+
39
+ ### Function Keys
40
+ - `'f1'` through `'f24'`
41
+
42
+ ## Examples
43
+
44
+ ### Navigation
45
+
46
+ ```javascript
47
+ // Tab to next field
48
+ await testdriver.pressKeys(['tab']);
49
+
50
+ // Shift+Tab to previous field
51
+ await testdriver.pressKeys(['shift', 'tab']);
52
+
53
+ // Arrow keys
54
+ await testdriver.pressKeys(['down']);
55
+ await testdriver.pressKeys(['up']);
56
+ await testdriver.pressKeys(['left']);
57
+ await testdriver.pressKeys(['right']);
58
+
59
+ // Home/End
60
+ await testdriver.pressKeys(['home']); // Start of line
61
+ await testdriver.pressKeys(['end']); // End of line
62
+
63
+ // Page navigation
64
+ await testdriver.pressKeys(['pagedown']);
65
+ await testdriver.pressKeys(['pageup']);
66
+ ```
67
+
68
+ ### Keyboard Shortcuts
69
+
70
+ ```javascript
71
+ // Copy (Ctrl+C / Cmd+C)
72
+ await testdriver.pressKeys(['ctrl', 'c']);
73
+
74
+ // Paste (Ctrl+V / Cmd+V)
75
+ await testdriver.pressKeys(['ctrl', 'v']);
76
+
77
+ // Save (Ctrl+S)
78
+ await testdriver.pressKeys(['ctrl', 's']);
79
+
80
+ // Select All (Ctrl+A)
81
+ await testdriver.pressKeys(['ctrl', 'a']);
82
+
83
+ // Undo (Ctrl+Z)
84
+ await testdriver.pressKeys(['ctrl', 'z']);
85
+
86
+ // Redo (Ctrl+Y)
87
+ await testdriver.pressKeys(['ctrl', 'y']);
88
+
89
+ // Find (Ctrl+F)
90
+ await testdriver.pressKeys(['ctrl', 'f']);
91
+
92
+ // New tab (Ctrl+T)
93
+ await testdriver.pressKeys(['ctrl', 't']);
94
+
95
+ // Close tab (Ctrl+W)
96
+ await testdriver.pressKeys(['ctrl', 'w']);
97
+
98
+ // Refresh (F5 or Ctrl+R)
99
+ await testdriver.pressKeys(['f5']);
100
+ await testdriver.pressKeys(['ctrl', 'r']);
101
+ ```
102
+
103
+ ### System Shortcuts
104
+
105
+ ```javascript
106
+ // Alt+Tab (Windows - switch apps)
107
+ await testdriver.pressKeys(['alt', 'tab']);
108
+
109
+ // Alt+F4 (Windows - close window)
110
+ await testdriver.pressKeys(['alt', 'f4']);
111
+
112
+ // Win+D (Windows - show desktop)
113
+ await testdriver.pressKeys(['winleft', 'd']);
114
+
115
+ // Win+L (Windows - lock screen)
116
+ await testdriver.pressKeys(['winleft', 'l']);
117
+
118
+ // Cmd+Tab (macOS - switch apps)
119
+ await testdriver.pressKeys(['command', 'tab']);
120
+
121
+ // Cmd+Q (macOS - quit app)
122
+ await testdriver.pressKeys(['command', 'q']);
123
+ ```
124
+
125
+ ### Form Submission
126
+
127
+ ```javascript
128
+ // Submit form
129
+ await testdriver.pressKeys(['enter']);
130
+
131
+ // Cancel/Close
132
+ await testdriver.pressKeys(['escape']);
133
+
134
+ // Check checkbox
135
+ await testdriver.pressKeys(['space']);
136
+ ```
137
+
138
+ ### Text Editing
139
+
140
+ ```javascript
141
+ // Delete selected text
142
+ await testdriver.pressKeys(['delete']);
143
+
144
+ // Backspace
145
+ await testdriver.pressKeys(['backspace']);
146
+
147
+ // Select all and delete
148
+ await testdriver.pressKeys(['ctrl', 'a']);
149
+ await testdriver.pressKeys(['delete']);
150
+
151
+ // Cut text
152
+ await testdriver.pressKeys(['ctrl', 'x']);
153
+ ```
154
+
155
+ ## Best Practices
156
+
157
+ <Check>
158
+ **Wait after shortcuts**
159
+
160
+ Some keyboard shortcuts trigger animations or navigation:
161
+
162
+ ```javascript
163
+ await testdriver.pressKeys(['ctrl', 't']); // New tab
164
+ await new Promise(r => setTimeout(r, 500)); // Wait for tab
165
+ await testdriver.pressKeys(['ctrl', 'l']); // Focus URL bar
166
+ ```
167
+ </Check>
168
+
169
+ <Check>
170
+ **Use Tab for form navigation**
171
+
172
+ Tab is more reliable than clicking multiple fields:
173
+
174
+ ```javascript
175
+ const firstField = await testdriver.find('email input');
176
+ await firstField.click();
177
+ await testdriver.type('user@example.com');
178
+
179
+ await testdriver.pressKeys(['tab']);
180
+ await testdriver.type('password123');
181
+
182
+ await testdriver.pressKeys(['tab']);
183
+ await testdriver.pressKeys(['enter']); // Submit
184
+ ```
185
+ </Check>
186
+
187
+ <Warning>
188
+ **Platform-specific keys**
189
+
190
+ Use the appropriate modifier key for the platform:
191
+ - Windows/Linux: `'ctrl'`
192
+ - macOS: `'command'`
193
+
194
+ ```javascript
195
+ // For cross-platform, you might need to detect OS
196
+ const modKey = process.platform === 'darwin' ? 'command' : 'ctrl';
197
+ await testdriver.pressKeys([modKey, 'c']); // Copy
198
+ ```
199
+ </Warning>
200
+
201
+ ## Use Cases
202
+
203
+ <AccordionGroup>
204
+ <Accordion title="Form Navigation">
205
+ ```javascript
206
+ // Fill form using Tab
207
+ const firstField = await testdriver.find('name field');
208
+ await firstField.click();
209
+ await testdriver.type('John Doe');
210
+
211
+ await testdriver.pressKeys(['tab']);
212
+ await testdriver.type('john@example.com');
213
+
214
+ await testdriver.pressKeys(['tab']);
215
+ await testdriver.type('555-0123');
216
+
217
+ await testdriver.pressKeys(['tab']);
218
+ await testdriver.pressKeys(['enter']); // Submit
219
+ ```
220
+ </Accordion>
221
+
222
+ <Accordion title="Text Manipulation">
223
+ ```javascript
224
+ const textArea = await testdriver.find('comment textarea');
225
+ await textArea.click();
226
+
227
+ // Select all existing text
228
+ await testdriver.pressKeys(['ctrl', 'a']);
229
+
230
+ // Copy it
231
+ await testdriver.pressKeys(['ctrl', 'c']);
232
+
233
+ // Type new text
234
+ await testdriver.type('New comment');
235
+
236
+ // Undo if needed
237
+ await testdriver.pressKeys(['ctrl', 'z']);
238
+ ```
239
+ </Accordion>
240
+
241
+ <Accordion title="Browser Navigation">
242
+ ```javascript
243
+ // Open new tab
244
+ await testdriver.pressKeys(['ctrl', 't']);
245
+ await new Promise(r => setTimeout(r, 500));
246
+
247
+ // Focus address bar
248
+ await testdriver.pressKeys(['ctrl', 'l']);
249
+ await testdriver.type('https://example.com');
250
+ await testdriver.pressKeys(['enter']);
251
+
252
+ // Refresh page
253
+ await testdriver.pressKeys(['f5']);
254
+
255
+ // Close tab
256
+ await testdriver.pressKeys(['ctrl', 'w']);
257
+ ```
258
+ </Accordion>
259
+
260
+ <Accordion title="Application Shortcuts">
261
+ ```javascript
262
+ // Save document
263
+ await testdriver.pressKeys(['ctrl', 's']);
264
+
265
+ // Print
266
+ await testdriver.pressKeys(['ctrl', 'p']);
267
+
268
+ // Find in page
269
+ await testdriver.pressKeys(['ctrl', 'f']);
270
+ await testdriver.type('search term');
271
+ await testdriver.pressKeys(['escape']); // Close find
272
+ ```
273
+ </Accordion>
274
+ </AccordionGroup>
275
+
276
+ ## Complete Example
277
+
278
+ ```javascript
279
+ import { beforeAll, afterAll, describe, it } from 'vitest';
280
+ import TestDriver from 'testdriverai';
281
+
282
+ describe('Keyboard Navigation', () => {
283
+ let testdriver;
284
+
285
+ beforeAll(async () => {
286
+ client = new TestDriver(process.env.TD_API_KEY);
287
+ await testdriver.auth();
288
+ await testdriver.connect();
289
+ });
290
+
291
+ afterAll(async () => {
292
+ await testdriver.disconnect();
293
+ });
294
+
295
+ it('should navigate form with keyboard', async () => {
296
+ await testdriver.focusApplication('Google Chrome');
297
+
298
+ // Find first field
299
+ const emailField = await testdriver.find('email input');
300
+ await emailField.click();
301
+ await testdriver.type('user@example.com');
302
+
303
+ // Tab through fields
304
+ await testdriver.pressKeys(['tab']);
305
+ await testdriver.type('John');
306
+
307
+ await testdriver.pressKeys(['tab']);
308
+ await testdriver.type('Doe');
309
+
310
+ await testdriver.pressKeys(['tab']);
311
+ await testdriver.type('password123');
312
+
313
+ // Submit with Enter
314
+ await testdriver.pressKeys(['tab']);
315
+ await testdriver.pressKeys(['enter']);
316
+
317
+ await testdriver.assert('form submitted successfully');
318
+ });
319
+
320
+ it('should use keyboard shortcuts', async () => {
321
+ // Open new browser tab
322
+ await testdriver.pressKeys(['ctrl', 't']);
323
+ await new Promise(r => setTimeout(r, 500));
324
+
325
+ // Focus address bar
326
+ await testdriver.pressKeys(['ctrl', 'l']);
327
+ await testdriver.type('https://example.com');
328
+ await testdriver.pressKeys(['enter']);
329
+
330
+ await new Promise(r => setTimeout(r, 2000));
331
+
332
+ // Select all page content
333
+ await testdriver.pressKeys(['ctrl', 'a']);
334
+
335
+ // Copy
336
+ await testdriver.pressKeys(['ctrl', 'c']);
337
+
338
+ // Refresh page
339
+ await testdriver.pressKeys(['f5']);
340
+ });
341
+ });
342
+ ```
343
+
344
+ ## Related Methods
345
+
346
+ - [`type()`](/v7/type) - Type text
347
+ - [`click()`](/v7/click) - Click elements
348
+ - [`scroll()`](/v7/scroll) - Scroll pages
@@ -0,0 +1,331 @@
1
+ ---
2
+ name: testdriver:provision
3
+ description: Launch browsers, desktop apps, and extensions in your sandbox
4
+ ---
5
+ <!-- Generated from provision.mdx. DO NOT EDIT. -->
6
+
7
+ ## Overview
8
+
9
+ The Provision API sets up applications in your sandbox before tests run. It handles downloading, installing, and launching browsers, desktop apps, VS Code, Chrome extensions, and more.
10
+
11
+ Access provision methods via `testdriver.provision.*`:
12
+
13
+ ```javascript
14
+ await testdriver.provision.chrome({ url: 'https://example.com' });
15
+ ```
16
+
17
+ <Note>
18
+ When `reconnect: true` is set on the client, **all provision methods are skipped** since the application is assumed to already be running.
19
+ </Note>
20
+
21
+ ## Methods
22
+
23
+ ### chrome()
24
+
25
+ Launch Google Chrome with an optional URL.
26
+
27
+ ```javascript
28
+ await testdriver.provision.chrome(options?)
29
+ ```
30
+
31
+ <ParamField path="options" type="ProvisionChromeOptions">
32
+ <Expandable title="properties">
33
+ <ParamField path="url" type="string" default="http://testdriver-sandbox.vercel.app/">
34
+ URL to navigate to after launch.
35
+ </ParamField>
36
+
37
+ <ParamField path="maximized" type="boolean" default={true}>
38
+ Launch Chrome in maximized window mode.
39
+ </ParamField>
40
+
41
+ <ParamField path="guest" type="boolean" default={false}>
42
+ Launch Chrome in guest profile mode.
43
+ </ParamField>
44
+ </Expandable>
45
+ </ParamField>
46
+
47
+ ```javascript
48
+ // Basic
49
+ await testdriver.provision.chrome({ url: 'https://example.com' });
50
+
51
+ // With guest mode
52
+ await testdriver.provision.chrome({
53
+ url: 'https://example.com',
54
+ guest: true,
55
+ maximized: true,
56
+ });
57
+ ```
58
+
59
+ ### chromeExtension()
60
+
61
+ Install and launch a Chrome extension. You can install from a local unpacked directory or from the Chrome Web Store by extension ID.
62
+
63
+ ```javascript
64
+ await testdriver.provision.chromeExtension(options)
65
+ ```
66
+
67
+ <ParamField path="options" type="ProvisionChromeExtensionOptions" required>
68
+ One of `extensionPath` or `extensionId` is required.
69
+
70
+ <Expandable title="properties">
71
+ <ParamField path="extensionPath" type="string">
72
+ Local path to an unpacked extension directory. The extension files are uploaded to the sandbox.
73
+ </ParamField>
74
+
75
+ <ParamField path="extensionId" type="string">
76
+ Chrome Web Store extension ID to install.
77
+ </ParamField>
78
+
79
+ <ParamField path="maximized" type="boolean" default={true}>
80
+ Launch Chrome in maximized window mode.
81
+ </ParamField>
82
+ </Expandable>
83
+ </ParamField>
84
+
85
+ ```javascript
86
+ // From local directory
87
+ await testdriver.provision.chromeExtension({
88
+ extensionPath: './my-extension',
89
+ });
90
+
91
+ // From Chrome Web Store
92
+ await testdriver.provision.chromeExtension({
93
+ extensionId: 'abcdefghijklmnop',
94
+ });
95
+ ```
96
+
97
+ ### vscode()
98
+
99
+ Launch Visual Studio Code with an optional workspace and extensions.
100
+
101
+ ```javascript
102
+ await testdriver.provision.vscode(options?)
103
+ ```
104
+
105
+ <ParamField path="options" type="ProvisionVSCodeOptions">
106
+ <Expandable title="properties">
107
+ <ParamField path="workspace" type="string">
108
+ Path to a workspace folder or `.code-workspace` file to open.
109
+ </ParamField>
110
+
111
+ <ParamField path="extensions" type="string[]" default={[]}>
112
+ Array of VS Code extension IDs to install before launching.
113
+ </ParamField>
114
+ </Expandable>
115
+ </ParamField>
116
+
117
+ ```javascript
118
+ await testdriver.provision.vscode({
119
+ workspace: '/home/testdriver/project',
120
+ extensions: ['ms-python.python', 'esbenp.prettier-vscode'],
121
+ });
122
+ ```
123
+
124
+ ### installer()
125
+
126
+ Download and run an application installer. Supports `.msi`, `.exe`, `.deb`, `.rpm`, `.appimage`, `.sh`, `.dmg`, and `.pkg` formats.
127
+
128
+ ```javascript
129
+ await testdriver.provision.installer(options)
130
+ ```
131
+
132
+ <ParamField path="options" type="ProvisionInstallerOptions" required>
133
+ <Expandable title="properties">
134
+ <ParamField path="url" type="string" required>
135
+ Download URL for the installer.
136
+ </ParamField>
137
+
138
+ <ParamField path="filename" type="string">
139
+ Override the auto-detected filename from the URL.
140
+ </ParamField>
141
+
142
+ <ParamField path="appName" type="string">
143
+ Application name to focus after installation completes.
144
+ </ParamField>
145
+
146
+ <ParamField path="launch" type="boolean" default={true}>
147
+ Whether to focus/launch the app after installation.
148
+ </ParamField>
149
+ </Expandable>
150
+ </ParamField>
151
+
152
+ **Behavior:**
153
+ - Downloads the installer from the URL
154
+ - Auto-detects the install method based on file extension
155
+ - Runs the appropriate install command (e.g., `msiexec` for `.msi`, `dpkg` for `.deb`)
156
+ - Optionally focuses the installed application
157
+
158
+ ```javascript
159
+ // Windows MSI installer
160
+ await testdriver.provision.installer({
161
+ url: 'https://example.com/app-setup.msi',
162
+ appName: 'MyApp',
163
+ });
164
+
165
+ // Linux DEB package
166
+ await testdriver.provision.installer({
167
+ url: 'https://example.com/app.deb',
168
+ appName: 'MyApp',
169
+ launch: true,
170
+ });
171
+ ```
172
+
173
+ ### electron()
174
+
175
+ Launch an Electron application.
176
+
177
+ ```javascript
178
+ await testdriver.provision.electron(options)
179
+ ```
180
+
181
+ <ParamField path="options" type="ProvisionElectronOptions" required>
182
+ <Expandable title="properties">
183
+ <ParamField path="appPath" type="string" required>
184
+ Path to the Electron application directory or executable.
185
+ </ParamField>
186
+
187
+ <ParamField path="args" type="string[]" default={[]}>
188
+ Additional command-line arguments to pass to the Electron app.
189
+ </ParamField>
190
+ </Expandable>
191
+ </ParamField>
192
+
193
+ ```javascript
194
+ await testdriver.provision.electron({
195
+ appPath: '/home/testdriver/my-electron-app',
196
+ args: ['--no-sandbox'],
197
+ });
198
+ ```
199
+
200
+ ### dashcam()
201
+
202
+ Start Dashcam recording with custom options. Usually called automatically by other provision methods, but can be called directly for custom configurations.
203
+
204
+ ```javascript
205
+ await testdriver.provision.dashcam(options?)
206
+ ```
207
+
208
+ <ParamField path="options" type="ProvisionDashcamOptions">
209
+ <Expandable title="properties">
210
+ <ParamField path="logPath" type="string">
211
+ Path to the TestDriver log file. Defaults to `/tmp/testdriver.log` (Linux) or `C:\Users\testdriver\testdriver.log` (Windows).
212
+ </ParamField>
213
+
214
+ <ParamField path="logName" type="string" default="TestDriver Log">
215
+ Display name for the log file in the Dashcam replay.
216
+ </ParamField>
217
+
218
+ <ParamField path="webLogs" type="boolean" default={true}>
219
+ Enable web traffic log capture.
220
+ </ParamField>
221
+
222
+ <ParamField path="title" type="string">
223
+ Recording title for the Dashcam session.
224
+ </ParamField>
225
+ </Expandable>
226
+ </ParamField>
227
+
228
+ ```javascript
229
+ await testdriver.provision.dashcam({
230
+ title: 'Login Flow Test',
231
+ logPath: '/tmp/my-app.log',
232
+ logName: 'Application Log',
233
+ webLogs: true,
234
+ });
235
+ ```
236
+
237
+ ## Reconnect Behavior
238
+
239
+ When `reconnect: true` is set on the client, all provision methods are wrapped in a Proxy that intercepts calls and skips them silently. This is because when reconnecting to an existing sandbox, the applications are already running.
240
+
241
+ ```javascript
242
+ const testdriver = new TestDriver({
243
+ reconnect: true,
244
+ });
245
+
246
+ await testdriver.ready();
247
+
248
+ // These calls are silently skipped:
249
+ await testdriver.provision.chrome({ url: 'https://example.com' });
250
+ await testdriver.provision.dashcam();
251
+ ```
252
+
253
+ ## Types
254
+
255
+ ```typescript
256
+ interface ProvisionChromeOptions {
257
+ url?: string; // Default: "http://testdriver-sandbox.vercel.app/"
258
+ maximized?: boolean; // Default: true
259
+ guest?: boolean; // Default: false
260
+ }
261
+
262
+ interface ProvisionChromeExtensionOptions {
263
+ extensionPath?: string; // Local unpacked extension path
264
+ extensionId?: string; // Chrome Web Store ID
265
+ maximized?: boolean; // Default: true
266
+ }
267
+
268
+ interface ProvisionVSCodeOptions {
269
+ workspace?: string; // Workspace path
270
+ extensions?: string[]; // Extension IDs to install
271
+ }
272
+
273
+ interface ProvisionInstallerOptions {
274
+ url: string; // Download URL (required)
275
+ filename?: string; // Override filename
276
+ appName?: string; // App name to focus
277
+ launch?: boolean; // Default: true
278
+ }
279
+
280
+ interface ProvisionElectronOptions {
281
+ appPath: string; // Path to Electron app (required)
282
+ args?: string[]; // Additional args
283
+ }
284
+
285
+ interface ProvisionDashcamOptions {
286
+ logPath?: string; // Log file path
287
+ logName?: string; // Default: "TestDriver Log"
288
+ webLogs?: boolean; // Default: true
289
+ title?: string; // Recording title
290
+ }
291
+ ```
292
+
293
+ ## Complete Example
294
+
295
+ ```javascript
296
+ import { describe, it, beforeAll, afterAll } from 'vitest';
297
+ import TestDriver from 'testdriverai';
298
+
299
+ describe('Chrome Extension Test', () => {
300
+ let testdriver;
301
+
302
+ beforeAll(async () => {
303
+ testdriver = new TestDriver({
304
+ os: 'linux',
305
+ resolution: '1920x1080',
306
+ });
307
+
308
+ await testdriver.ready();
309
+
310
+ // Install extension and open Chrome
311
+ await testdriver.provision.chromeExtension({
312
+ extensionPath: './my-extension',
313
+ });
314
+
315
+ // Start Dashcam with custom logs
316
+ await testdriver.provision.dashcam({
317
+ title: 'Extension Test',
318
+ webLogs: true,
319
+ });
320
+ });
321
+
322
+ afterAll(async () => {
323
+ await testdriver.disconnect();
324
+ });
325
+
326
+ it('tests the extension popup', async () => {
327
+ await testdriver.find('extension icon').click();
328
+ await testdriver.find('popup content').click();
329
+ });
330
+ });
331
+ ```