@testdriverai/agent 7.8.0-test.38

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,463 @@
1
+ AWSTemplateFormatVersion: "2010-09-09"
2
+ Description: >-
3
+ Baseline artifacts (NO EC2 instance): Creates a dedicated VPC with public subnet, Security Group,
4
+ IAM Role/Profile, optional KeyPair, and an EC2 Launch Template so you can spawn many instances
5
+ programmatically. Writes handy IDs into SSM Parameter Store for easy lookup in scripts or automation.
6
+
7
+ Metadata:
8
+ AWS::CloudFormation::Interface:
9
+ ParameterGroups:
10
+ - Label:
11
+ default: "Notification Configuration"
12
+ Parameters:
13
+ - NotificationEmail
14
+ - Label:
15
+ default: "Project Configuration"
16
+ Parameters:
17
+ - ProjectTag
18
+ - Label:
19
+ default: "Network Configuration"
20
+ Parameters:
21
+ - AllowedIngressCidr
22
+ - Label:
23
+ default: "Instance Configuration"
24
+ Parameters:
25
+ - InstanceType
26
+ - Label:
27
+ default: "Key Pair Configuration"
28
+ Parameters:
29
+ - CreateKeyPair
30
+ - ExistingKeyName
31
+ ParameterLabels:
32
+ ProjectTag:
33
+ default: "Project Tag"
34
+ InstanceType:
35
+ default: "Instance Type"
36
+ AllowedIngressCidr:
37
+ default: "Allowed Ingress CIDR"
38
+ CreateKeyPair:
39
+ default: "Create New Key Pair"
40
+ ExistingKeyName:
41
+ default: "Existing Key Name (only required if 'Create New Key Pair' is 'no')"
42
+ NotificationEmail:
43
+ default: "Notification Email (optional)"
44
+
45
+ Rules:
46
+ ValidateKeyPairConfiguration:
47
+ RuleCondition: !Equals [!Ref CreateKeyPair, "no"]
48
+ Assertions:
49
+ - Assert: !Not [!Equals [!Ref ExistingKeyName, ""]]
50
+ AssertDescription: "ExistingKeyName must be provided when CreateKeyPair is 'no'"
51
+
52
+ Parameters:
53
+ NotificationEmail:
54
+ Type: String
55
+ Default: ""
56
+ Description: Email address to receive deployment completion notifications (optional)
57
+
58
+ ProjectTag:
59
+ Type: String
60
+ Default: testdriver
61
+
62
+ InstanceType:
63
+ Type: String
64
+ Default: c5.xlarge
65
+ AllowedValues:
66
+ - c5.xlarge
67
+ - c5.2xlarge
68
+ - c5.4xlarge
69
+ - c5.9xlarge
70
+ - c5.12xlarge
71
+ - c5.18xlarge
72
+ - c5.24xlarge
73
+ - c5.metal
74
+ - i3.metal
75
+ Description: Instance type - only c5.xlarge or larger, plus c5.metal and i3.metal allowed
76
+
77
+ AllowedIngressCidr:
78
+ Type: String
79
+ Default: 0.0.0.0/0
80
+ Description: CIDR allowed to access inbound ports (0.0.0.0/0 means "anyone", we recommend tightening this in production).
81
+
82
+ CreateKeyPair:
83
+ Type: String
84
+ AllowedValues: ["yes", "no"]
85
+ Default: "yes"
86
+ Description: Create a new key pair for instance access? (If 'no', you must provide an existing key name)
87
+ ExistingKeyName:
88
+ Type: String
89
+ Default: ""
90
+ Description: Name of existing EC2 Key Pair (only required when CreateKeyPair is 'no')
91
+
92
+ Conditions:
93
+ UseExistingKeyProvided: !Not [!Equals [!Ref ExistingKeyName, ""]]
94
+ CreateKey: !Equals [!Ref CreateKeyPair, "yes"]
95
+ SendNotification: !Not [!Equals [!Ref NotificationEmail, ""]]
96
+
97
+ Resources:
98
+ # VPC for TestDriver
99
+ TestDriverVpc:
100
+ Type: AWS::EC2::VPC
101
+ Properties:
102
+ CidrBlock: 10.0.0.0/16
103
+ EnableDnsHostnames: true
104
+ EnableDnsSupport: true
105
+ Tags:
106
+ - { Key: Name, Value: !Sub "${AWS::StackName}-vpc" }
107
+ - { Key: Project, Value: !Ref ProjectTag }
108
+
109
+ # Public subnet for EC2 instances
110
+ PublicSubnet:
111
+ Type: AWS::EC2::Subnet
112
+ Properties:
113
+ VpcId: !Ref TestDriverVpc
114
+ CidrBlock: 10.0.1.0/24
115
+ AvailabilityZone: !Select [0, !GetAZs ""]
116
+ MapPublicIpOnLaunch: true
117
+ Tags:
118
+ - { Key: Name, Value: !Sub "${AWS::StackName}-public-subnet" }
119
+ - { Key: Project, Value: !Ref ProjectTag }
120
+
121
+ # Internet Gateway
122
+ InternetGateway:
123
+ Type: AWS::EC2::InternetGateway
124
+ Properties:
125
+ Tags:
126
+ - { Key: Name, Value: !Sub "${AWS::StackName}-igw" }
127
+ - { Key: Project, Value: !Ref ProjectTag }
128
+
129
+ # Attach Internet Gateway to VPC
130
+ AttachGateway:
131
+ Type: AWS::EC2::VPCGatewayAttachment
132
+ Properties:
133
+ VpcId: !Ref TestDriverVpc
134
+ InternetGatewayId: !Ref InternetGateway
135
+
136
+ # Route table for public subnet
137
+ PublicRouteTable:
138
+ Type: AWS::EC2::RouteTable
139
+ Properties:
140
+ VpcId: !Ref TestDriverVpc
141
+ Tags:
142
+ - { Key: Name, Value: !Sub "${AWS::StackName}-public-rt" }
143
+ - { Key: Project, Value: !Ref ProjectTag }
144
+
145
+ # Route to Internet Gateway
146
+ PublicRoute:
147
+ Type: AWS::EC2::Route
148
+ DependsOn: AttachGateway
149
+ Properties:
150
+ RouteTableId: !Ref PublicRouteTable
151
+ DestinationCidrBlock: 0.0.0.0/0
152
+ GatewayId: !Ref InternetGateway
153
+
154
+ # Associate route table with public subnet
155
+ SubnetRouteTableAssociation:
156
+ Type: AWS::EC2::SubnetRouteTableAssociation
157
+ Properties:
158
+ SubnetId: !Ref PublicSubnet
159
+ RouteTableId: !Ref PublicRouteTable
160
+
161
+ SecurityGroup:
162
+ Type: AWS::EC2::SecurityGroup
163
+ Properties:
164
+ GroupDescription: SG for QA desktop testing (RDP/HTTPS/NGINX/VNC)
165
+ VpcId: !Ref TestDriverVpc
166
+ SecurityGroupIngress:
167
+ - {
168
+ IpProtocol: tcp,
169
+ FromPort: 5800,
170
+ ToPort: 5800,
171
+ CidrIp: !Ref AllowedIngressCidr,
172
+ Description: "WebVNC 5800",
173
+ }
174
+ - {
175
+ IpProtocol: tcp,
176
+ FromPort: 8443,
177
+ ToPort: 8443,
178
+ CidrIp: !Ref AllowedIngressCidr,
179
+ Description: "Custom 8443",
180
+ }
181
+ - {
182
+ IpProtocol: tcp,
183
+ FromPort: 8080,
184
+ ToPort: 8080,
185
+ CidrIp: !Ref AllowedIngressCidr,
186
+ Description: "NGINX 8080",
187
+ }
188
+ - {
189
+ IpProtocol: tcp,
190
+ FromPort: 80,
191
+ ToPort: 80,
192
+ CidrIp: !Ref AllowedIngressCidr,
193
+ Description: "HTTP 80",
194
+ }
195
+ - {
196
+ IpProtocol: tcp,
197
+ FromPort: 443,
198
+ ToPort: 443,
199
+ CidrIp: !Ref AllowedIngressCidr,
200
+ Description: "HTTPS 443",
201
+ }
202
+ - {
203
+ IpProtocol: tcp,
204
+ FromPort: 3389,
205
+ ToPort: 3389,
206
+ CidrIp: !Ref AllowedIngressCidr,
207
+ Description: "RDP 3389",
208
+ }
209
+ - {
210
+ IpProtocol: tcp,
211
+ FromPort: 5900,
212
+ ToPort: 5900,
213
+ CidrIp: !Ref AllowedIngressCidr,
214
+ Description: "TightVNC 5900",
215
+ }
216
+ - {
217
+ IpProtocol: tcp,
218
+ FromPort: 5901,
219
+ ToPort: 5901,
220
+ CidrIp: !Ref AllowedIngressCidr,
221
+ Description: "noVNC Websockify 5901",
222
+ }
223
+ - {
224
+ IpProtocol: tcp,
225
+ FromPort: 6080,
226
+ ToPort: 6080,
227
+ CidrIp: !Ref AllowedIngressCidr,
228
+ Description: "noVNC HTTP 6080",
229
+ }
230
+ SecurityGroupEgress:
231
+ - IpProtocol: -1
232
+ CidrIp: 0.0.0.0/0
233
+ Description: Allow all outbound
234
+ Tags:
235
+ - { Key: Project, Value: !Ref ProjectTag }
236
+
237
+ InstanceRole:
238
+ Type: AWS::IAM::Role
239
+ Properties:
240
+ AssumeRolePolicyDocument:
241
+ Version: "2012-10-17"
242
+ Statement:
243
+ - Effect: Allow
244
+ Principal: { Service: ec2.amazonaws.com }
245
+ Action: sts:AssumeRole
246
+ ManagedPolicyArns:
247
+ - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
248
+ Tags:
249
+ - { Key: Project, Value: !Ref ProjectTag }
250
+
251
+ InstanceProfile:
252
+ Type: AWS::IAM::InstanceProfile
253
+ Properties:
254
+ Roles: [!Ref InstanceRole]
255
+
256
+ KeyPair:
257
+ Type: AWS::EC2::KeyPair
258
+ Condition: CreateKey
259
+ Properties:
260
+ KeyName: !Sub "${AWS::StackName}-key"
261
+ KeyType: rsa
262
+
263
+ LaunchTemplate:
264
+ Type: AWS::EC2::LaunchTemplate
265
+ Properties:
266
+ LaunchTemplateName: !Sub "${AWS::StackName}-lt"
267
+ LaunchTemplateData:
268
+ InstanceType: !Ref InstanceType
269
+ IamInstanceProfile:
270
+ Name: !Ref InstanceProfile
271
+ # Lock SG + Subnet to the same VPC
272
+ NetworkInterfaces:
273
+ - DeviceIndex: 0
274
+ SubnetId: !Ref PublicSubnet
275
+ Groups: [!Ref SecurityGroup]
276
+ AssociatePublicIpAddress: true
277
+ KeyName: !If
278
+ - CreateKey
279
+ - !Ref KeyPair
280
+ - !If
281
+ - UseExistingKeyProvided
282
+ - !Ref ExistingKeyName
283
+ - !Ref AWS::NoValue
284
+ TagSpecifications:
285
+ - ResourceType: instance
286
+ Tags: [{ Key: Project, Value: !Ref ProjectTag }]
287
+ - ResourceType: volume
288
+ Tags: [{ Key: Project, Value: !Ref ProjectTag }]
289
+
290
+ # SNS Topic for deployment notifications
291
+ DeploymentNotificationTopic:
292
+ Type: AWS::SNS::Topic
293
+ Condition: SendNotification
294
+ Properties:
295
+ TopicName: !Sub "${AWS::StackName}-deployment-notifications"
296
+ DisplayName: !Sub "${AWS::StackName} Deployment Notifications"
297
+ Tags:
298
+ - { Key: Project, Value: !Ref ProjectTag }
299
+
300
+ # SNS Subscription for email notifications
301
+ EmailSubscription:
302
+ Type: AWS::SNS::Subscription
303
+ Condition: SendNotification
304
+ Properties:
305
+ Protocol: email
306
+ TopicArn: !Ref DeploymentNotificationTopic
307
+ Endpoint: !Ref NotificationEmail
308
+
309
+ # Custom resource to send completion notification
310
+ DeploymentCompleteNotification:
311
+ Type: AWS::CloudFormation::CustomResource
312
+ Condition: SendNotification
313
+ Properties:
314
+ ServiceToken: !GetAtt NotificationLambda.Arn
315
+ StackName: !Ref AWS::StackName
316
+ TopicArn: !Ref DeploymentNotificationTopic
317
+ DependsOn:
318
+ - SsmParamSg
319
+ - SsmParamIp
320
+ - SsmParamLt
321
+ - SsmParamLtLatest
322
+ - SsmParamVpc
323
+ - SsmParamSubnet
324
+
325
+ # Lambda function to send the notification
326
+ NotificationLambda:
327
+ Type: AWS::Lambda::Function
328
+ Condition: SendNotification
329
+ Properties:
330
+ FunctionName: !Sub "${AWS::StackName}-deployment-notifier"
331
+ Runtime: python3.11
332
+ Handler: index.lambda_handler
333
+ Role: !GetAtt NotificationLambdaRole.Arn
334
+ Code:
335
+ ZipFile: |
336
+ import boto3
337
+ import json
338
+ import cfnresponse
339
+
340
+ def lambda_handler(event, context):
341
+ try:
342
+ if event['RequestType'] == 'Create':
343
+ sns = boto3.client('sns')
344
+ stack_name = event['ResourceProperties']['StackName']
345
+ topic_arn = event['ResourceProperties']['TopicArn']
346
+
347
+ message = f"""
348
+ TestDriver Infrastructure Deployment Complete!
349
+
350
+ Stack Name: {stack_name}
351
+ Status: CREATE_COMPLETE
352
+
353
+ Your TestDriver infrastructure is now ready to use.
354
+ Check the CloudFormation outputs for resource IDs and configuration details.
355
+ """
356
+
357
+ sns.publish(
358
+ TopicArn=topic_arn,
359
+ Subject=f'TestDriver Stack {stack_name} - Deployment Complete',
360
+ Message=message
361
+ )
362
+
363
+ cfnresponse.send(event, context, cfnresponse.SUCCESS, {})
364
+ except Exception as e:
365
+ print(f"Error: {e}")
366
+ cfnresponse.send(event, context, cfnresponse.FAILED, {})
367
+ Tags:
368
+ - { Key: Project, Value: !Ref ProjectTag }
369
+
370
+ # IAM Role for the notification Lambda
371
+ NotificationLambdaRole:
372
+ Type: AWS::IAM::Role
373
+ Condition: SendNotification
374
+ Properties:
375
+ AssumeRolePolicyDocument:
376
+ Version: "2012-10-17"
377
+ Statement:
378
+ - Effect: Allow
379
+ Principal:
380
+ Service: lambda.amazonaws.com
381
+ Action: sts:AssumeRole
382
+ ManagedPolicyArns:
383
+ - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
384
+ Policies:
385
+ - PolicyName: SNSPublishPolicy
386
+ PolicyDocument:
387
+ Version: "2012-10-17"
388
+ Statement:
389
+ - Effect: Allow
390
+ Action:
391
+ - sns:Publish
392
+ Resource: !Ref DeploymentNotificationTopic
393
+ Tags:
394
+ - { Key: Project, Value: !Ref ProjectTag }
395
+
396
+ SsmParamSg:
397
+ Type: AWS::SSM::Parameter
398
+ Properties:
399
+ Name: !Sub "/testdriver/infra/${AWS::StackName}/security-group-id"
400
+ Type: String
401
+ Value: !Ref SecurityGroup
402
+
403
+ SsmParamIp:
404
+ Type: AWS::SSM::Parameter
405
+ Properties:
406
+ Name: !Sub "/testdriver/infra/${AWS::StackName}/instance-profile-name"
407
+ Type: String
408
+ Value: !Ref InstanceProfile
409
+
410
+ SsmParamLt:
411
+ Type: AWS::SSM::Parameter
412
+ Properties:
413
+ Name: !Sub "/testdriver/infra/${AWS::StackName}/launch-template-id"
414
+ Type: String
415
+ Value: !Ref LaunchTemplate
416
+
417
+ SsmParamLtLatest:
418
+ Type: AWS::SSM::Parameter
419
+ Properties:
420
+ Name: !Sub "/testdriver/infra/${AWS::StackName}/launch-template-latest-version"
421
+ Type: String
422
+ Value: !GetAtt LaunchTemplate.LatestVersionNumber
423
+
424
+ SsmParamVpc:
425
+ Type: AWS::SSM::Parameter
426
+ Properties:
427
+ Name: !Sub "/testdriver/infra/${AWS::StackName}/testdriver-vpc-id"
428
+ Type: String
429
+ Value: !Ref TestDriverVpc
430
+
431
+ SsmParamSubnet:
432
+ Type: AWS::SSM::Parameter
433
+ Properties:
434
+ Name: !Sub "/testdriver/infra/${AWS::StackName}/testdriver-public-subnet-id"
435
+ Type: String
436
+ Value: !Ref PublicSubnet
437
+
438
+ Outputs:
439
+ VpcId:
440
+ Value: !Ref TestDriverVpc
441
+ Description: VPC ID created for TestDriver
442
+ SubnetId:
443
+ Value: !Ref PublicSubnet
444
+ Description: Public subnet ID for TestDriver instances
445
+ SecurityGroupId:
446
+ Value: !Ref SecurityGroup
447
+ Description: Security Group for QA desktop testing
448
+ InstanceProfileName:
449
+ Value: !Ref InstanceProfile
450
+ Description: Instance Profile to attach to instances
451
+ LaunchTemplateId:
452
+ Value: !Ref LaunchTemplate
453
+ Description: EC2 Launch Template ID
454
+ LaunchTemplateLatestVersion:
455
+ Value: !GetAtt LaunchTemplate.LatestVersionNumber
456
+ Description: Latest Launch Template version
457
+ KeyPairSsmParam:
458
+ Condition: CreateKey
459
+ Value: !Sub "/ec2/keypair/${KeyPair.KeyPairId}"
460
+ Description: SSM parameter that stores the generated private key
461
+ SsmNamespaceUsed:
462
+ Value: !Sub "/testdriver/infra/${AWS::StackName}"
463
+ Description: Prefix where IDs are stored for discovery
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # --- Disable Windows Defender ---
5
+ # This script disables Windows Defender on a running AWS instance via SSM.
6
+ # Requires: AWS_REGION, INSTANCE_ID environment variables
7
+
8
+ : "${AWS_REGION:?Set AWS_REGION}"
9
+ : "${INSTANCE_ID:?Set INSTANCE_ID}"
10
+
11
+ echo "Disabling Windows Defender..."
12
+ DEFENDER_CMD=$(aws ssm send-command \
13
+ --region "$AWS_REGION" \
14
+ --instance-ids "$INSTANCE_ID" \
15
+ --document-name "AWS-RunPowerShellScript" \
16
+ --parameters 'commands=["Set-MpPreference -DisableRealtimeMonitoring $true", "Set-MpPreference -DisableIOAVProtection $true", "Set-MpPreference -DisableBehaviorMonitoring $true", "Set-MpPreference -DisableBlockAtFirstSeen $true", "Set-MpPreference -DisableScriptScanning $true", "Write-Output \"Windows Defender disabled successfully\""]' \
17
+ --output json)
18
+
19
+ DEFENDER_CMD_ID=$(jq -r '.Command.CommandId' <<<"$DEFENDER_CMD")
20
+ echo "Defender disable command ID: $DEFENDER_CMD_ID"
21
+
22
+ echo "Waiting for Defender disable command to complete..."
23
+ if aws ssm wait command-executed --region "$AWS_REGION" --command-id "$DEFENDER_CMD_ID" --instance-id "$INSTANCE_ID" 2>/dev/null; then
24
+ DEFENDER_STATUS=$(aws ssm get-command-invocation \
25
+ --region "$AWS_REGION" \
26
+ --command-id "$DEFENDER_CMD_ID" \
27
+ --instance-id "$INSTANCE_ID" \
28
+ --output json)
29
+ DEFENDER_OUTPUT=$(jq -r '.StandardOutputContent // ""' <<<"$DEFENDER_STATUS")
30
+ DEFENDER_ERROR=$(jq -r '.StandardErrorContent // ""' <<<"$DEFENDER_STATUS")
31
+ DEFENDER_CMD_STATUS=$(jq -r '.Status // ""' <<<"$DEFENDER_STATUS")
32
+
33
+ echo "Defender disable status: $DEFENDER_CMD_STATUS"
34
+ if [ -n "$DEFENDER_OUTPUT" ] && [ "$DEFENDER_OUTPUT" != "null" ]; then
35
+ echo "✓ $DEFENDER_OUTPUT"
36
+ fi
37
+ if [ -n "$DEFENDER_ERROR" ] && [ "$DEFENDER_ERROR" != "null" ]; then
38
+ echo "⚠ Defender stderr: $DEFENDER_ERROR"
39
+ fi
40
+ else
41
+ echo "⚠ Defender disable command may have timed out, continuing anyway..."
42
+ fi
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Usage: ./install-dev-runner.sh <instance-id>
5
+ INSTANCE_ID="${1:?Usage: $0 <instance-id>}"
6
+ AWS_REGION="${AWS_REGION:-us-east-2}"
7
+
8
+ RUNNER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../runner" && pwd)"
9
+
10
+ echo "Packing local runner..."
11
+ TMPDIR=$(mktemp -d)
12
+ pushd "$RUNNER_DIR" > /dev/null
13
+ npm pack --pack-destination "$TMPDIR" > /dev/null 2>&1
14
+ TARBALL=$(ls "$TMPDIR"/*.tgz)
15
+ popd > /dev/null
16
+ echo "Tarball: $TARBALL"
17
+
18
+ echo "Uploading to S3..."
19
+ S3_KEY="runner-dev/$(date +%s)-$(openssl rand -hex 4)/runner.tgz"
20
+ aws s3 cp "$TARBALL" "s3://v7-transfer/${S3_KEY}" --region "$AWS_REGION" > /dev/null
21
+ DOWNLOAD_URL=$(aws s3 presign "s3://v7-transfer/${S3_KEY}" --expires-in 900 --region "$AWS_REGION")
22
+ rm -rf "$TMPDIR"
23
+
24
+ echo "Creating SSM params file..."
25
+
26
+ # Write Python script to temp file to generate valid JSON
27
+ PYTHON_SCRIPT=$(mktemp --suffix=.py)
28
+ cat > "$PYTHON_SCRIPT" << 'PYEOF'
29
+ import json
30
+ import sys
31
+
32
+ url = sys.argv[1]
33
+
34
+ commands = [
35
+ "Write-Host '=== Stopping runner ==='",
36
+ "Stop-ScheduledTask -TaskName RunTestDriverAgent -ErrorAction SilentlyContinue",
37
+ "Stop-Process -Name node -Force -ErrorAction SilentlyContinue",
38
+ "Start-Sleep -Seconds 2",
39
+ "Set-Location 'C:\\testdriver\\sandbox-agent'",
40
+ "$tarball = 'C:\\Windows\\Temp\\runner-dev.tgz'",
41
+ f"Invoke-WebRequest -Uri '{url}' -OutFile $tarball",
42
+ "Write-Host 'Tarball size:'; (Get-Item $tarball).Length",
43
+ "Remove-Item -Path lib -Recurse -Force -ErrorAction SilentlyContinue",
44
+ "tar -xzf $tarball --strip-components=1 -C .",
45
+ "Get-Content 'package.json' | ConvertFrom-Json | Select-Object -ExpandProperty version",
46
+ "Write-Host '=== Starting runner ==='",
47
+ "Start-ScheduledTask -TaskName RunTestDriverAgent",
48
+ "Start-Sleep -Seconds 3",
49
+ "Get-Content 'C:\\testdriver\\log.txt' -Tail 20"
50
+ ]
51
+
52
+ params = {"commands": commands}
53
+ print(json.dumps(params))
54
+ PYEOF
55
+
56
+ python3 "$PYTHON_SCRIPT" "$DOWNLOAD_URL" > /tmp/ssm-install-params.json
57
+ rm "$PYTHON_SCRIPT"
58
+
59
+ echo "Sending SSM command..."
60
+ CMD_JSON=$(aws ssm send-command \
61
+ --region "$AWS_REGION" \
62
+ --instance-ids "$INSTANCE_ID" \
63
+ --document-name "AWS-RunPowerShellScript" \
64
+ --parameters "file:///tmp/ssm-install-params.json" \
65
+ --output json)
66
+
67
+ COMMAND_ID=$(echo "$CMD_JSON" | jq -r '.Command.CommandId')
68
+ echo "Command ID: $COMMAND_ID"
69
+
70
+ echo "Waiting for completion..."
71
+ aws ssm wait command-executed --region "$AWS_REGION" --command-id "$COMMAND_ID" --instance-id "$INSTANCE_ID" || true
72
+
73
+ echo "Getting output..."
74
+ aws ssm get-command-invocation \
75
+ --region "$AWS_REGION" \
76
+ --command-id "$COMMAND_ID" \
77
+ --instance-id "$INSTANCE_ID" \
78
+ --query 'StandardOutputContent' \
79
+ --output text