@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,449 @@
1
+ ---
2
+ title: "AWS Setup Guide"
3
+ sidebarTitle: "AWS Setup Guide"
4
+ description: "Deploy TestDriver on your AWS infrastructure using CloudFormation"
5
+ icon: "aws"
6
+ ---
7
+
8
+ This guide walks you through setting up self-hosted TestDriver instances on AWS. By the end, you'll have fully automated test infrastructure that spawns and terminates instances on-demand.
9
+
10
+ ```mermaid
11
+ graph LR
12
+ A[Vitest Test] --> B[setup-aws hook]
13
+ B --> C[Spawns EC2]
14
+ C --> D[Runs Test]
15
+ D --> E[Terminates EC2]
16
+ ```
17
+
18
+ ## How It Works
19
+
20
+ TestDriver automatically manages AWS EC2 instances for your tests:
21
+
22
+ 1. **Deploy CloudFormation** — One-time infrastructure setup
23
+ 2. **Configure Vitest** — Add one line to your config
24
+ 3. **Run Tests** — Instances spawn automatically, run tests, and terminate
25
+
26
+ That's it! No manual instance management needed.
27
+
28
+ # Quickstart
29
+
30
+ <Steps>
31
+ <Step title="Deploy Infrastructure">
32
+ <Card
33
+ title="Launch CloudFormation Stack"
34
+ icon="aws"
35
+ href="https://console.aws.amazon.com/cloudformation/home#/stacks/create/review?templateURL=https://v7-cloudformation-template.s3.us-east-2.amazonaws.com/cloudformation.yaml"
36
+ horizontal
37
+ arrow
38
+ >
39
+ One-click AWS setup
40
+ </Card>
41
+ </Step>
42
+
43
+ <Step title="Add to Vitest Config">
44
+ ```javascript vitest.config.mjs
45
+ setupFiles: ['testdriverai/vitest/setup', 'testdriverai/vitest/setup-aws']
46
+ ```
47
+ </Step>
48
+
49
+ <Step title="Run Tests">
50
+ ```bash
51
+ TD_OS=windows AWS_REGION=us-east-2 \
52
+ AWS_LAUNCH_TEMPLATE_ID=lt-xxx AMI_ID=ami-xxx \
53
+ vitest run
54
+ ```
55
+ </Step>
56
+ </Steps>
57
+
58
+ ## Overview
59
+
60
+ The setup process is simple:
61
+
62
+ 1. **Deploy CloudFormation** — Creates VPC, security groups, IAM roles, and launch templates
63
+ 2. **Configure Vitest** — Add `setup-aws` to automatically manage instance lifecycle
64
+ 3. **Run Tests** — Set `TD_OS=windows` with AWS credentials and instances spawn/terminate automatically
65
+
66
+
67
+ ## Prerequisites
68
+
69
+ Before you begin, ensure you have:
70
+
71
+ - AWS account with CloudFormation permissions
72
+ - [AWS CLI](https://aws.amazon.com/cli/) installed and configured (`aws configure`)
73
+ - Access to the TestDriver AMI — [Contact us](http://testdriver.ai/demo) with your AWS region
74
+ - A GitHub repository for your tests
75
+
76
+ <Tip>
77
+ The TestDriver Golden Image AMI ID is `ami-0504bf50fad62f312`. Contact us to get access in your preferred AWS region.
78
+ </Tip>
79
+
80
+ ## Step 1: Deploy CloudFormation Stack
81
+
82
+ Our CloudFormation template creates all the AWS infrastructure you need:
83
+
84
+ - Dedicated VPC with public subnet
85
+ - Security group with required port access
86
+ - IAM roles and instance profiles
87
+ - EC2 launch template for instance creation
88
+
89
+ <Tabs>
90
+ <Tab title="GUI">
91
+ Click the button below to launch the CloudFormation stack in your AWS Console:
92
+
93
+ <Card
94
+ title="Launch Stack"
95
+ icon="aws"
96
+ href="https://console.aws.amazon.com/cloudformation/home#/stacks/create/review?templateURL=https://v7-cloudformation-template.s3.us-east-2.amazonaws.com/cloudformation.yaml"
97
+ horizontal
98
+ arrow
99
+ >
100
+ Deploy TestDriver infrastructure with one click
101
+ </Card>
102
+
103
+ Configure the stack parameters:
104
+ - **Stack name**: `testdriver-infrastructure` (or your preferred name)
105
+ - **ProjectTag**: `testdriver`
106
+ - **AllowedIngressCidr**: Your IP range (e.g., `203.0.113.0/24`)
107
+ - **InstanceType**: `c5.xlarge` (recommended)
108
+ - **CreateKeyPair**: `true`
109
+
110
+ <Warning>
111
+ **Security**: Replace `AllowedIngressCidr` with your specific IP ranges to restrict VPC access. Avoid using `0.0.0.0/0` in production.
112
+ </Warning>
113
+
114
+ ### Get Your Launch Template ID
115
+
116
+ After the stack creation completes, navigate to the **Outputs** tab to find your `LaunchTemplateId`:
117
+
118
+ ![Launch Template ID](/images/content/self-hosted/launchtemplateid.png)
119
+
120
+ <Tip>
121
+ **Save this ID** — you'll need it for spawning instances and CI configuration.
122
+ </Tip>
123
+ </Tab>
124
+ <Tab title="CLI">
125
+ Download the template from the [TestDriver CLI repository](https://github.com/testdriverai/testdriverai/blob/main/setup/aws/cloudformation.yaml), then deploy:
126
+
127
+ ```bash
128
+ aws cloudformation deploy \
129
+ --template-file setup/aws/cloudformation.yaml \
130
+ --stack-name testdriver-infrastructure \
131
+ --parameter-overrides \
132
+ ProjectTag=testdriver \
133
+ AllowedIngressCidr=0.0.0.0/0 \
134
+ InstanceType=c5.xlarge \
135
+ CreateKeyPair=true \
136
+ --capabilities CAPABILITY_IAM
137
+ ```
138
+
139
+ <Warning>
140
+ **Security**: Replace `AllowedIngressCidr=0.0.0.0/0` with your specific IP ranges to restrict VPC access.
141
+ </Warning>
142
+
143
+ ### Get Your Launch Template ID
144
+
145
+ After deployment completes, retrieve the launch template ID:
146
+
147
+ ```bash
148
+ aws cloudformation describe-stacks \
149
+ --stack-name testdriver-infrastructure \
150
+ --query 'Stacks[0].Outputs[?OutputKey==`LaunchTemplateId`].OutputValue' \
151
+ --output text
152
+ ```
153
+
154
+ <Tip>
155
+ **Save this ID** — you'll need it for spawning instances and CI configuration.
156
+ </Tip>
157
+ </Tab>
158
+ </Tabs>
159
+
160
+ ## Step 2: Configure Vitest
161
+
162
+ Add the AWS setup hook to your `vitest.config.mjs`:
163
+
164
+ ```javascript vitest.config.mjs
165
+ import { defineConfig } from 'vitest/config';
166
+ import { config } from 'dotenv';
167
+ import TestDriver from 'testdriverai/vitest';
168
+
169
+ config(); // Load .env file
170
+
171
+ export default defineConfig({
172
+ test: {
173
+ testTimeout: 900000,
174
+ hookTimeout: 900000,
175
+ maxConcurrency: 3,
176
+ reporters: [
177
+ 'default',
178
+ TestDriver(),
179
+ ['junit', { outputFile: 'test-report.junit.xml' }]
180
+ ],
181
+ setupFiles: ['testdriverai/vitest/setup', 'testdriverai/vitest/setup-aws'],
182
+ },
183
+ });
184
+ ```
185
+
186
+ <Note>
187
+ **That's it!** The `setup-aws` hook automatically spawns and terminates instances when `TD_OS=windows` is set. No manual instance management needed.
188
+ </Note>
189
+
190
+ ## Step 3: Write Your Tests
191
+
192
+ Tests should use `context.ip || process.env.TD_IP` for the IP configuration:
193
+
194
+ ```javascript
195
+ import { describe, it } from "vitest";
196
+ import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
197
+
198
+ describe("My Test", () => {
199
+ it("should run on self-hosted instance", async (context) => {
200
+ const testdriver = TestDriver(context, {
201
+ ip: context.ip || process.env.TD_IP,
202
+ });
203
+
204
+ await testdriver.provision.chrome({ url: "https://example.com" });
205
+ // ... your test steps
206
+ });
207
+ });
208
+ ```
209
+
210
+ <Note>
211
+ **How it works**: When `TD_OS=windows` with AWS credentials, `context.ip` is automatically set by the setup hook. When running without AWS setup (cloud-hosted), both are undefined and TestDriver uses the cloud. When `TD_IP` is provided manually, it takes precedence.
212
+ </Note>
213
+
214
+ ## Step 4: Run Tests
215
+
216
+ ### Locally
217
+
218
+ ```bash
219
+ TD_OS=windows \
220
+ AWS_REGION=us-east-2 \
221
+ AWS_LAUNCH_TEMPLATE_ID=lt-xxx \
222
+ AMI_ID=ami-0504bf50fad62f312 \
223
+ vitest run
224
+ ```
225
+
226
+ <Note>
227
+ Each test gets its own fresh EC2 instance that's automatically terminated after completion.
228
+ </Note>
229
+
230
+ ### In GitHub Actions
231
+
232
+ Automate testing with self-hosted instances in your CI/CD pipeline. TestDriver automatically spawns a fresh instance for each test, runs the test, and terminates the instance.
233
+
234
+ ```yaml .github/workflows/test.yml
235
+ name: TestDriver Self-Hosted Windows Tests
236
+
237
+ on:
238
+ push:
239
+ branches: [main]
240
+ pull_request:
241
+
242
+ jobs:
243
+ test:
244
+ runs-on: ubuntu-latest
245
+
246
+ steps:
247
+ - name: Checkout repository
248
+ uses: actions/checkout@v4
249
+
250
+ - name: Setup Node.js
251
+ uses: actions/setup-node@v4
252
+ with:
253
+ node-version: '20'
254
+ cache: 'npm'
255
+
256
+ - name: Install dependencies
257
+ run: npm ci
258
+
259
+ - name: Run Windows tests with self-hosted instances
260
+ run: npx vitest run examples/*.test.mjs
261
+ env:
262
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
263
+ TD_OS: windows
264
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
265
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
266
+ AWS_REGION: us-east-2
267
+ AWS_LAUNCH_TEMPLATE_ID: ${{ secrets.AWS_LAUNCH_TEMPLATE_ID }}
268
+ AMI_ID: ${{ secrets.AMI_ID }}
269
+
270
+ - name: Upload test results
271
+ if: always()
272
+ uses: actions/upload-artifact@v4
273
+ with:
274
+ name: test-results
275
+ path: test-report.junit.xml
276
+ ```
277
+
278
+ <Note>
279
+ **Automatic Instance Management**: Setting `TD_OS=windows` with AWS credentials enables automatic instance spawning. Each test gets its own fresh instance that's terminated after the test completes.
280
+ </Note>
281
+
282
+ ### Required GitHub Secrets
283
+
284
+ | Secret | Description | Example |
285
+ |--------|-------------|---------|
286
+ | `AWS_ACCESS_KEY_ID` | AWS access key | `AKIAIOSFODNN7EXAMPLE` |
287
+ | `AWS_SECRET_ACCESS_KEY` | AWS secret key | `wJalrXUtnFEMI/K7MDENG...` |
288
+ | `AWS_REGION` | AWS region | `us-east-2` |
289
+ | `AWS_LAUNCH_TEMPLATE_ID` | From CloudFormation output | `lt-07c53ce8349b958d1` |
290
+ | `AMI_ID` | TestDriver AMI ID | `ami-0504bf50fad62f312` |
291
+ | `TD_API_KEY` | Your TestDriver API key | From [console.testdriver.ai](https://console.testdriver.ai) |
292
+
293
+ <Tip>
294
+ Add these as **GitHub Repository Secrets** under Settings → Secrets and variables → Actions
295
+ </Tip>
296
+
297
+ ### Example Workflows
298
+
299
+ For complete production examples, see:
300
+ - **[Scheduled Tests](https://github.com/testdriverai/testdriverai/blob/main/.github/workflows/acceptance-windows-scheduled.yaml)** — Daily automated test runs
301
+ - **[Reusable Workflow](https://github.com/testdriverai/testdriverai/blob/main/.github/workflows/windows-self-hosted.yaml)** — Shared configuration for PR and scheduled tests
302
+
303
+ ## Advanced Usage
304
+
305
+ ### Using an Existing Instance
306
+
307
+ If you already have a running instance, you can skip automatic spawning by providing `TD_IP`:
308
+
309
+ ```bash
310
+ TD_OS=windows TD_IP=1.2.3.4 vitest run
311
+ ```
312
+
313
+ The `setup-aws` hook will detect `TD_IP` is already set and skip spawning a new instance.
314
+
315
+ ### Manual Instance Management
316
+
317
+ For advanced use cases, you can manually spawn instances using the [`spawn-runner.sh`](https://github.com/testdriverai/testdriverai/blob/main/setup/aws/spawn-runner.sh) script:
318
+
319
+ ```bash
320
+ AWS_REGION=us-east-2 \
321
+ AMI_ID=ami-0504bf50fad62f312 \
322
+ AWS_LAUNCH_TEMPLATE_ID=lt-xxx \
323
+ bash setup/aws/spawn-runner.sh
324
+ ```
325
+
326
+ Output:
327
+ ```
328
+ PUBLIC_IP=1.2.3.4
329
+ INSTANCE_ID=i-1234567890abcdef0
330
+ AWS_REGION=us-east-2
331
+ ```
332
+
333
+ Then manually terminate when done:
334
+
335
+ ```bash
336
+ aws ec2 terminate-instances \
337
+ --instance-ids i-1234567890abcdef0 \
338
+ --region us-east-2
339
+ ```
340
+
341
+ For complete production examples, see:
342
+ - **[Scheduled Tests](https://github.com/testdriverai/testdriverai/blob/main/.github/workflows/acceptance-windows-scheduled.yaml)** — Daily automated test runs
343
+ - **[Reusable Workflow](https://github.com/testdriverai/testdriverai/blob/main/.github/workflows/windows-self-hosted.yaml)** — Shared configuration for PR and scheduled tests
344
+
345
+ ### Connecting to an Instance
346
+
347
+ You can connect to running instances via:
348
+ - **RDP** — Use the public IP on port 3389
349
+ - **VNC** — Access via web browser at `http://<public-ip>:5900`
350
+ - **AWS Console** — Use EC2 Instance Connect or Session Manager
351
+
352
+ <Note>
353
+ Stopped instances retain their EBS volumes and can be restarted later. Terminated instances are permanently deleted. Always terminate instances when done to avoid storage costs.
354
+ </Note>
355
+
356
+ ## AMI Customization
357
+
358
+ The TestDriver Golden Image comes pre-configured with:
359
+
360
+ - Windows Server with desktop environment
361
+ - VNC + web server for remote access
362
+ - Python, Node.js, Git
363
+ - TestDriver agent and dependencies
364
+
365
+ ### Creating a Custom AMI
366
+
367
+ You can customize the AMI to include additional software or configurations:
368
+
369
+ <Steps>
370
+ <Step title="Connect via RDP">
371
+ Use the default credentials:
372
+ - **Username**: `testdriver`
373
+ - **Password**: `wwv9uJ0sqlulbN3`
374
+ </Step>
375
+
376
+ <Step title="Change the Password">
377
+ **Critical**: Run the password rotation script immediately:
378
+ ```powershell
379
+ C:\testdriver\RotateLocalPasswords.ps1
380
+ ```
381
+ Save the new password securely.
382
+ </Step>
383
+
384
+ <Step title="Install Your Software">
385
+ Install any additional dependencies, configure settings, or modify the environment as needed.
386
+ </Step>
387
+
388
+ <Step title="Create New AMI">
389
+ Use the AWS console or CLI to create an AMI from your modified instance. Update your workflow to use the new AMI ID.
390
+ </Step>
391
+ </Steps>
392
+
393
+ <Warning>
394
+ **Security**: Never use the default password in production. Always rotate passwords before creating custom AMIs.
395
+ </Warning>
396
+
397
+ ## Security Best Practices
398
+
399
+ ### Network Security
400
+
401
+ - **Restrict CIDR blocks** — Only allow access from known IP ranges
402
+ - **Use VPC endpoints** — For private AWS service communication
403
+ - **Enable VPC Flow Logs** — For network monitoring
404
+
405
+ ### AWS Authentication
406
+
407
+ Use OIDC instead of long-term credentials for GitHub Actions:
408
+
409
+ ```yaml
410
+ permissions:
411
+ id-token: write
412
+ contents: read
413
+
414
+ steps:
415
+ - name: Configure AWS credentials
416
+ uses: aws-actions/configure-aws-credentials@v4
417
+ with:
418
+ role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
419
+ aws-region: us-east-2
420
+ ```
421
+
422
+ See [GitHub's OIDC documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect) for setup instructions.
423
+
424
+ ### Instance Security
425
+
426
+ - **Terminate immediately** after tests complete
427
+ - **Monitor costs** with AWS billing alerts
428
+ - **Use least-privilege IAM roles**
429
+ - **Enable CloudTrail** for audit logging
430
+
431
+ ## Troubleshooting
432
+
433
+ ### Instance Not Responding
434
+
435
+ - **Check security groups** — Verify required ports are open (RDP 3389, VNC 5900, TestDriver ports)
436
+ - **Verify status checks** — Ensure instance has passed AWS status checks
437
+ - **Check AMI compatibility** — Some instance types don't support certain AMIs
438
+
439
+ ### Connection Timeouts
440
+
441
+ - Verify network connectivity from CI runner to instance
442
+ - Check VPC routing and internet gateway configuration
443
+ - Confirm instance is in the correct subnet
444
+
445
+ ### AWS CLI Errors
446
+
447
+ - Validate credentials and permissions
448
+ - Check service quotas and limits
449
+ - Verify region consistency across all resources
@@ -0,0 +1,223 @@
1
+ ---
2
+ title: "Cache"
3
+ sidebarTitle: "Cache"
4
+ description: "Speed up tests with screenshot-based caching"
5
+ icon: "bolt-lightning"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ The cache system speeds up repeated test runs by comparing screenshots to cached results. When the screen hasn't changed significantly, cached element positions are reused instead of making an AI call.
12
+
13
+ Cache works at two levels:
14
+ - **Screen cache** — pixel diff comparison between the current screenshot and the cached screenshot
15
+ - **Element cache** — OpenCV template matching to verify the cached element position is still correct
16
+
17
+ ## How It Works
18
+
19
+ 1. On `find()`, the SDK sends the current screenshot and cache metadata to the API
20
+ 2. The API compares the screenshot against previously cached results for the same `cacheKey`
21
+ 3. If the screen pixel diff is within the `screen` threshold AND the element template match exceeds the `element` threshold, the cached position is returned
22
+ 4. Otherwise, a new AI call is made and the result is cached
23
+
24
+ ```mermaid
25
+ flowchart LR
26
+ A[Screenshot + cacheKey] --> B{Screen Diff\n< threshold?}
27
+ B -- Yes --> C{Template\nMatch OK?}
28
+ C -- Yes --> D[Return cached position]
29
+ B -- No --> E[AI Call - fresh]
30
+ C -- No --> F[AI Call - fresh]
31
+ ```
32
+
33
+ ## Configuration
34
+
35
+ ### Constructor Options
36
+
37
+ ```javascript
38
+ const testdriver = new TestDriver({
39
+ cache: {
40
+ enabled: true,
41
+ thresholds: {
42
+ find: {
43
+ screen: 0.05, // 5% pixel diff allowed (default)
44
+ element: 0.8, // 80% OpenCV correlation required (default)
45
+ },
46
+ assert: 0.05, // 5% pixel diff for assertions (default)
47
+ },
48
+ },
49
+ cacheKey: 'my-custom-key', // overrides auto-generated key
50
+ });
51
+ ```
52
+
53
+ <ParamField path="cache" type="CacheConfig | false">
54
+ Cache configuration object, or `false` to disable entirely.
55
+
56
+ <Expandable title="properties">
57
+ <ParamField path="enabled" type="boolean" default={true}>
58
+ Enable or disable the cache system. Requires a valid `cacheKey` to actually activate.
59
+ </ParamField>
60
+
61
+ <ParamField path="thresholds" type="CacheThresholds">
62
+ Threshold configuration for different command types.
63
+
64
+ <Expandable title="properties">
65
+ <ParamField path="find" type="FindCacheThresholds">
66
+ Thresholds for `find()` and `findAll()`.
67
+
68
+ <Expandable title="properties">
69
+ <ParamField path="screen" type="number" default={0.05}>
70
+ Maximum pixel diff percentage allowed between the current screenshot and the cached screenshot. Lower values require a closer match. Range: `0` to `1`.
71
+ </ParamField>
72
+
73
+ <ParamField path="element" type="number" default={0.8}>
74
+ Minimum OpenCV template matching correlation required for the cached element crop. Higher values require a closer match. Range: `0` to `1`. Only used for `find()`, not `findAll()`.
75
+ </ParamField>
76
+ </Expandable>
77
+ </ParamField>
78
+
79
+ <ParamField path="assert" type="number" default={0.05}>
80
+ Maximum pixel diff allowed for assertion cache hits.
81
+ </ParamField>
82
+ </Expandable>
83
+ </ParamField>
84
+ </Expandable>
85
+ </ParamField>
86
+
87
+ <ParamField path="cacheKey" type="string">
88
+ Unique key for cache lookups. If not provided, an auto-generated key is created from a SHA-256 hash of the calling test file (first 16 hex characters). The cache key changes automatically when your test file changes, providing automatic cache invalidation.
89
+ </ParamField>
90
+
91
+ ### Disabling Cache
92
+
93
+ ```javascript
94
+ // Via constructor
95
+ const testdriver = new TestDriver({ cache: false });
96
+
97
+ // Via environment variable
98
+ // TD_NO_CACHE=true npx vitest run
99
+ ```
100
+
101
+ When cache is disabled, all thresholds are set to `-1` internally, causing the API to skip cache lookups.
102
+
103
+ ### Per-Command Overrides
104
+
105
+ Override cache thresholds for individual commands:
106
+
107
+ ```javascript
108
+ // Stricter screen matching for this specific find
109
+ const el = await testdriver.find('submit button', {
110
+ cache: {
111
+ thresholds: { screen: 0.01, element: 0.95 },
112
+ },
113
+ });
114
+
115
+ // Custom cache key for a specific assertion
116
+ await testdriver.assert('dashboard loaded', {
117
+ cache: { threshold: 0.01 },
118
+ cacheKey: 'dashboard-check',
119
+ });
120
+ ```
121
+
122
+ ## Threshold Priority
123
+
124
+ Thresholds are resolved in priority order (highest wins):
125
+
126
+ | Priority | Source | Example |
127
+ |----------|--------|---------|
128
+ | 1 (highest) | Per-command option | `find(desc, { cache: { thresholds: { screen: 0.1 } } })` |
129
+ | 2 | Legacy number argument | `find(desc, 0.1)` |
130
+ | 3 | Global constructor config | `new TestDriver({ cache: { thresholds: { find: { screen: 0.1 } } } })` |
131
+ | 4 (lowest) | Hard-coded defaults | `screen: 0.05`, `element: 0.8`, `assert: 0.05` |
132
+
133
+ ## Auto-Generated Cache Key
134
+
135
+ When you don't specify a `cacheKey`, the SDK automatically generates one:
136
+
137
+ 1. Walks the call stack to find your test file
138
+ 2. Reads the file content
139
+ 3. Computes a **SHA-256 hash** of the content
140
+ 4. Uses the **first 16 hex characters** as the cache key
141
+
142
+ This means:
143
+ - **Same test file** → same cache key → cache hits
144
+ - **Modified test file** → different hash → automatic cache invalidation
145
+ - **Different test files** → different keys → isolated caches
146
+
147
+ ```javascript
148
+ // Auto-generated cache key from test file hash
149
+ const testdriver = new TestDriver();
150
+ // cacheKey = "a3f2b1c4d5e6f7a8" (auto)
151
+
152
+ // Manual override
153
+ const testdriver = new TestDriver({ cacheKey: 'login-test-v2' });
154
+ ```
155
+
156
+ ## Template Matching (OpenCV)
157
+
158
+ Element cache validation uses OpenCV's normalized cross-correlation coefficient (`TM_CCOEFF_NORMED`) to verify that the cached element is still visible at the expected position.
159
+
160
+ **Algorithm:**
161
+ 1. Load the cached element crop (needle) and current screenshot (haystack)
162
+ 2. Run `cv.matchTemplate()` with `TM_CCOEFF_NORMED`
163
+ 3. Binary threshold at the configured element threshold
164
+ 4. Find contours to extract match positions
165
+ 5. Return matches with `{ x, y, width, height, centerX, centerY }`
166
+
167
+ **Scale factors tried:** `[1, 0.5, 2, 0.75, 1.25, 1.5]`
168
+ **Thresholds tried:** `[0.9, 0.8, 0.7]` (picks highest matching threshold)
169
+
170
+ This accounts for minor scaling differences between screenshots taken at different times or resolutions.
171
+
172
+ ## Cache Partitioning
173
+
174
+ Cache entries are partitioned by:
175
+ - **`cacheKey`** — identifies the test file
176
+ - **`os`** — operating system (linux, windows, darwin)
177
+ - **`resolution`** — screen resolution
178
+
179
+ This means cache from a Linux run won't be used for a Windows run, even with the same cache key.
180
+
181
+ ## Debugging Cache
182
+
183
+ API responses include cache metadata:
184
+
185
+ | Field | Description |
186
+ |---|---|
187
+ | `cacheHit` | `true` if cache was used |
188
+ | `similarity` | Pixel diff percentage between screenshots |
189
+ | `cacheSimilarity` | OpenCV template match score |
190
+
191
+ Use `getDebugInfo()` on an element to inspect cache results:
192
+
193
+ ```javascript
194
+ const el = await testdriver.find('submit button');
195
+ const debug = el.getDebugInfo();
196
+ console.log(debug);
197
+ // { cacheHit: true, similarity: 0.02, cacheSimilarity: 0.92, ... }
198
+ ```
199
+
200
+ ## Types
201
+
202
+ ```typescript
203
+ interface CacheConfig {
204
+ enabled?: boolean; // Default: true
205
+ thresholds?: CacheThresholds;
206
+ }
207
+
208
+ interface CacheThresholds {
209
+ find?: FindCacheThresholds;
210
+ assert?: number; // Default: 0.05
211
+ }
212
+
213
+ interface FindCacheThresholds {
214
+ screen?: number; // Default: 0.05
215
+ element?: number; // Default: 0.8
216
+ }
217
+
218
+ interface CacheDebugInfo {
219
+ cacheHit: boolean;
220
+ similarity: number;
221
+ cacheSimilarity: number;
222
+ }
223
+ ```