@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,390 @@
1
+ # Provision API
2
+
3
+ The `provision` object provides easy setup methods for common applications. These methods automatically handle TestDriver initialization, Dashcam recording, and application launching.
4
+
5
+ ## Quick Start
6
+
7
+ ```javascript
8
+ import { describe, it, expect } from 'vitest';
9
+ import { TestDriver } from 'testdriverai/lib/vitest/hooks.mjs';
10
+
11
+ describe('My Test Suite', () => {
12
+ it('should test Chrome browser', async (context) => {
13
+ const testdriver = TestDriver(context, ());
14
+
15
+ await testdriver.provision.chrome({
16
+ url: 'https://example.com'
17
+ });
18
+
19
+ await testdriver.find('Login button').click();
20
+ });
21
+ });
22
+ ```
23
+
24
+ ## Available Methods
25
+
26
+ - `provision.chrome()` - Launch Chrome browser with URL
27
+ - `provision.vscode()` - Launch VS Code with optional extensions
28
+ - `provision.installer()` - Download and install applications
29
+ - `provision.electron()` - Launch Electron applications
30
+ - `provision.dashcam()` - Initialize Dashcam recording with logging
31
+
32
+ ---
33
+
34
+ ## provision.chrome()
35
+
36
+ Launch Google Chrome with automatic Dashcam recording.
37
+
38
+ ```javascript
39
+ await testdriver.provision.chrome({
40
+ url: 'https://myapp.com',
41
+ maximized: true,
42
+ extensionPath: '/path/to/extension'
43
+ });
44
+ ```
45
+
46
+ **Options:**
47
+ | Option | Type | Default | Description |
48
+ |--------|------|---------|-------------|
49
+ | `url` | string | `'http://testdriver-sandbox.vercel.app/'` | URL to navigate to |
50
+ | `maximized` | boolean | `true` | Start browser maximized |
51
+ | `extensionPath` | string | - | Path to Chrome extension to load |
52
+
53
+ **Example:**
54
+
55
+ ```javascript
56
+ it('should login to my app', async (context) => {
57
+ const testdriver = TestDriver(context, ());
58
+
59
+ await testdriver.provision.chrome({
60
+ url: 'https://myapp.com/login'
61
+ });
62
+
63
+ await testdriver.find('email input').type('user@example.com');
64
+ await testdriver.find('password input').type('password123');
65
+ await testdriver.find('Login button').click();
66
+
67
+ const result = await testdriver.assert('Dashboard is visible');
68
+ expect(result).toBeTruthy();
69
+ });
70
+ ```
71
+
72
+ ---
73
+
74
+ ## provision.vscode()
75
+
76
+ Launch Visual Studio Code with optional extension installation. Automatically starts Dashcam recording.
77
+
78
+ ```javascript
79
+ await testdriver.provision.vscode({
80
+ workspace: '/path/to/project',
81
+ extensions: ['esbenp.prettier-vscode', 'ms-python.python']
82
+ });
83
+ ```
84
+
85
+ **Options:**
86
+ | Option | Type | Default | Description |
87
+ |--------|------|---------|-------------|
88
+ | `workspace` | string | - | Workspace/folder path to open |
89
+ | `extensions` | string[] | `[]` | VS Code extension IDs to install |
90
+
91
+ **Example - Basic Launch:**
92
+
93
+ ```javascript
94
+ it('should launch VS Code', async (context) => {
95
+ const testdriver = TestDriver(context, ());
96
+
97
+ await testdriver.provision.vscode();
98
+
99
+ const result = await testdriver.assert(
100
+ 'Visual Studio Code window is visible on screen'
101
+ );
102
+ expect(result).toBeTruthy();
103
+ });
104
+ ```
105
+
106
+ **Example - Install Extensions:**
107
+
108
+ ```javascript
109
+ it('should install and use a VS Code extension', async (context) => {
110
+ const testdriver = TestDriver(context, ());
111
+
112
+ // Launch VS Code with extensions installed
113
+ await testdriver.provision.vscode({
114
+ extensions: ['esbenp.prettier-vscode']
115
+ });
116
+
117
+ // Open the extensions panel
118
+ await testdriver.pressKeys(['ctrl', 'shift', 'x']);
119
+ await new Promise(resolve => setTimeout(resolve, 2000));
120
+
121
+ const result = await testdriver.assert(
122
+ 'Prettier extension is visible in the extensions panel'
123
+ );
124
+ expect(result).toBeTruthy();
125
+ });
126
+ ```
127
+
128
+ ---
129
+
130
+ ## provision.installer()
131
+
132
+ Download and install applications from a URL. Automatically detects file type and runs the appropriate install command.
133
+
134
+ ```javascript
135
+ const filePath = await testdriver.provision.installer({
136
+ url: 'https://example.com/app.deb',
137
+ appName: 'MyApp'
138
+ });
139
+ ```
140
+
141
+ **Options:**
142
+ | Option | Type | Default | Description |
143
+ |--------|------|---------|-------------|
144
+ | `url` | string | **required** | URL to download the installer from |
145
+ | `filename` | string | auto-detected | Filename to save as |
146
+ | `appName` | string | - | Application name to focus after install |
147
+ | `launch` | boolean | `true` | Whether to launch/focus the app after installation |
148
+
149
+ **Returns:** `Promise<string>` - Path to the downloaded file
150
+
151
+ **Supported File Types:**
152
+
153
+ | Platform | Extensions | Install Command |
154
+ |----------|------------|-----------------|
155
+ | Linux | `.deb` | `sudo dpkg -i && apt-get install -f -y` |
156
+ | Linux | `.rpm` | `sudo rpm -i` |
157
+ | Linux | `.appimage` | `chmod +x` |
158
+ | Linux | `.sh` | `chmod +x && execute` |
159
+ | Windows | `.msi` | `msiexec /i /quiet /norestart` |
160
+ | Windows | `.exe` | `Start-Process /S` |
161
+ | macOS | `.dmg` | `hdiutil attach && cp to /Applications` |
162
+ | macOS | `.pkg` | `installer -pkg -target /` |
163
+
164
+ **Example - Install .deb Package:**
165
+
166
+ ```javascript
167
+ it('should install a .deb package', async (context) => {
168
+ const testdriver = TestDriver(context, ());
169
+
170
+ const filePath = await testdriver.provision.installer({
171
+ url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb'
172
+ });
173
+
174
+ // Verify installation
175
+ await testdriver.exec('sh', 'bat --version', 10000);
176
+ });
177
+ ```
178
+
179
+ **Example - Download Only (No Auto-Launch):**
180
+
181
+ ```javascript
182
+ it('should download a script', async (context) => {
183
+ const testdriver = TestDriver(context, ());
184
+
185
+ const filePath = await testdriver.provision.installer({
186
+ url: 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh',
187
+ launch: false
188
+ });
189
+
190
+ // Run custom post-download commands
191
+ await testdriver.exec('sh', `source "${filePath}"`, 30000);
192
+ });
193
+ ```
194
+
195
+ **Example - Custom Post-Install:**
196
+
197
+ ```javascript
198
+ it('should run AppImage with custom flags', async (context) => {
199
+ const testdriver = TestDriver(context, ());
200
+
201
+ const filePath = await testdriver.provision.installer({
202
+ url: 'https://example.com/app.AppImage',
203
+ launch: false
204
+ });
205
+
206
+ // Run with custom arguments
207
+ await testdriver.exec('sh', `"${filePath}" --no-sandbox &`, 10000);
208
+
209
+ await new Promise(resolve => setTimeout(resolve, 5000));
210
+
211
+ const result = await testdriver.assert('App window is visible');
212
+ expect(result).toBeTruthy();
213
+ });
214
+ ```
215
+
216
+ ---
217
+
218
+ ## provision.electron()
219
+
220
+ Launch an Electron application.
221
+
222
+ ```javascript
223
+ await testdriver.provision.electron({
224
+ appPath: '/path/to/app',
225
+ args: ['--enable-logging']
226
+ });
227
+ ```
228
+
229
+ **Options:**
230
+ | Option | Type | Default | Description |
231
+ |--------|------|---------|-------------|
232
+ | `appPath` | string | **required** | Path to Electron application |
233
+ | `args` | string[] | `[]` | Additional command-line arguments |
234
+
235
+ **Example:**
236
+
237
+ ```javascript
238
+ it('should launch Electron app', async (context) => {
239
+ const testdriver = TestDriver(context, ());
240
+
241
+ await testdriver.provision.electron({
242
+ appPath: '/path/to/my-electron-app',
243
+ args: ['--enable-logging']
244
+ });
245
+
246
+ await testdriver.find('main window').click();
247
+ });
248
+ ```
249
+
250
+ ---
251
+
252
+ ## provision.dashcam()
253
+
254
+ Initialize Dashcam recording with logging. Use this when you want to start Dashcam recording without launching a specific application (e.g., for custom application launches or testing scenarios).
255
+
256
+ ```javascript
257
+ await testdriver.provision.dashcam({
258
+ logPath: '/tmp/myapp.log',
259
+ logName: 'My Application Log',
260
+ title: 'Custom Test Recording'
261
+ });
262
+ ```
263
+
264
+ **Options:**
265
+ | Option | Type | Default | Description |
266
+ |--------|------|---------|-------------|
267
+ | `logPath` | string | auto-generated | Path to log file to track |
268
+ | `logName` | string | `'TestDriver Log'` | Display name for the log |
269
+ | `webLogs` | boolean | `true` | Enable web log tracking |
270
+ | `title` | string | - | Custom title for the recording |
271
+
272
+ **Example - Basic Recording:**
273
+
274
+ ```javascript
275
+ it('should record a custom application test', async (context) => {
276
+ const testdriver = TestDriver(context, ());
277
+
278
+ // Start Dashcam recording
279
+ await testdriver.provision.dashcam();
280
+
281
+ // Launch your custom application
282
+ await testdriver.exec('sh', './my-custom-app.sh &', 10000);
283
+
284
+ // Interact with the application
285
+ await testdriver.find('main window').click();
286
+
287
+ const result = await testdriver.assert('Application is running');
288
+ expect(result).toBeTruthy();
289
+ });
290
+ ```
291
+
292
+ **Example - Custom Log File:**
293
+
294
+ ```javascript
295
+ it('should record with custom log file', async (context) => {
296
+ const testdriver = TestDriver(context, ());
297
+
298
+ // Start Dashcam with custom log tracking
299
+ await testdriver.provision.dashcam({
300
+ logPath: '/var/log/myapp/application.log',
301
+ logName: 'My App Logs',
302
+ title: 'Custom App Test'
303
+ });
304
+
305
+ // Your test code here
306
+ await testdriver.exec('sh', 'myapp --start', 30000);
307
+ });
308
+ ```
309
+
310
+ ---
311
+
312
+ ## How Provision Methods Work
313
+
314
+ When you call a provision method:
315
+
316
+ 1. **Waits for connection** - Calls `ready()` to ensure sandbox is connected
317
+ 2. **Sets up Dashcam** - Creates log file and adds to Dashcam monitoring
318
+ 3. **Starts recording** - Automatically starts Dashcam if not already recording
319
+ 4. **Launches application** - Opens the specified app with your configuration
320
+ 5. **Focuses window** - Ensures the app is ready for interaction
321
+
322
+ At test end:
323
+ - Dashcam automatically stops and saves replay URL
324
+ - TestDriver automatically disconnects
325
+ - All cleanup is handled for you
326
+
327
+ ## Complete Example
328
+
329
+ ```javascript
330
+ import { describe, it, expect } from 'vitest';
331
+ import { TestDriver } from 'testdriverai/lib/vitest/hooks.mjs';
332
+
333
+ describe('Application Testing', () => {
334
+ it('should test Chrome login flow', async (context) => {
335
+ const testdriver = TestDriver(context, ());
336
+
337
+ await testdriver.provision.chrome({
338
+ url: 'https://myapp.com/login'
339
+ });
340
+
341
+ await testdriver.find('email').type('user@example.com');
342
+ await testdriver.find('password').type('password123');
343
+ await testdriver.find('Login').click();
344
+
345
+ const result = await testdriver.assert('Welcome message is visible');
346
+ expect(result).toBeTruthy();
347
+ });
348
+
349
+ it('should test VS Code extension', async (context) => {
350
+ const testdriver = TestDriver(context, ());
351
+
352
+ await testdriver.provision.vscode({
353
+ extensions: ['ms-python.python']
354
+ });
355
+
356
+ await testdriver.pressKeys(['ctrl', 'shift', 'p']);
357
+ await testdriver.type('Python: Select Interpreter');
358
+ await testdriver.pressKeys(['enter']);
359
+
360
+ const result = await testdriver.assert('Python interpreter selector is visible');
361
+ expect(result).toBeTruthy();
362
+ });
363
+
364
+ it('should install and test CLI tool', async (context) => {
365
+ const testdriver = TestDriver(context, ());
366
+
367
+ await testdriver.provision.installer({
368
+ url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb'
369
+ });
370
+
371
+ // Verify the tool works
372
+ await testdriver.exec('sh', 'bat --help', 10000);
373
+ });
374
+ });
375
+ ```
376
+
377
+ ## Best Practices
378
+
379
+ 1. **Use clean environments** - Each test gets a fresh sandbox by default
380
+ 2. **Enable Dashcam** - Great for debugging test failures (enabled by default)
381
+ 3. **Check assertions** - Always verify the expected state after actions
382
+ 4. **Use appropriate provision method** - Match the method to your test target
383
+ 5. **Handle async properly** - All provision methods return Promises
384
+
385
+ ## See Also
386
+
387
+ - [Hooks API](./hooks.mdx) - TestDriver initialization
388
+ - [Find API](../api/find.mdx) - Element finding
389
+ - [Exec API](../api/exec.mdx) - Running shell commands
390
+ - [Assert API](../api/assert.mdx) - AI-powered assertions
@@ -0,0 +1,214 @@
1
+ # Quick Start: TestDriver Test Recording
2
+
3
+ ## What You Get
4
+
5
+ - 📊 Track all test runs in the TestDriver dashboard
6
+ - 🎥 Link dashcam screen recordings to specific tests
7
+ - 🔄 Integrate with CI/CD (GitHub Actions, GitLab, etc.)
8
+ - 🐛 View exact replay of failed tests
9
+ - 📈 Track test performance and flakiness over time
10
+
11
+ ## Setup (5 minutes)
12
+
13
+ ### 1. Add Vitest Plugin
14
+
15
+ ```javascript
16
+ // vitest.config.mjs
17
+ import { defineConfig } from 'vitest/config';
18
+ import testDriverPlugin from './interfaces/vitest-plugin.mjs';
19
+
20
+ export default defineConfig({
21
+ plugins: [
22
+ testDriverPlugin({
23
+ apiKey: process.env.TD_API_KEY,
24
+ apiRoot: process.env.TD_API_ROOT || 'https://api.testdriver.ai',
25
+ }),
26
+ ],
27
+ });
28
+ ```
29
+
30
+ ### 2. Set API Key
31
+
32
+ ```bash
33
+ export TD_API_KEY="your-api-key-here"
34
+ ```
35
+
36
+ Get your API key from: https://console.testdriver.ai/settings/api-keys
37
+
38
+ ### 3. Run Tests
39
+
40
+ ```bash
41
+ vitest run
42
+ ```
43
+
44
+ That's it! Your tests are now being recorded. View results at:
45
+ https://console.testdriver.ai/dashboard/test-runs
46
+
47
+ ## With Dashcam (Optional)
48
+
49
+ To link screen recordings with tests, simply register the dashcam URL after your test completes:
50
+
51
+ ```javascript
52
+ import { test } from 'vitest';
53
+ import TestDriver from '@testdriverai/sdk';
54
+
55
+ test('my test', async () => {
56
+ const client = await TestDriver({ apiKey: 'your-api-key' });
57
+
58
+ // Run your test...
59
+ await client.get('https://example.com');
60
+
61
+ // Get dashcam URL and register it
62
+ const dashcamUrl = await client.dashcam.publish();
63
+
64
+ // Register with the plugin - it will automatically associate with this test
65
+ if (globalThis.__testdriverPlugin) {
66
+ globalThis.__testdriverPlugin.registerDashcamUrl(
67
+ 'my-test-id', // Or use task.id in Vitest context
68
+ dashcamUrl,
69
+ client.os
70
+ );
71
+ }
72
+
73
+ await client.disconnect();
74
+ });
75
+ ```
76
+
77
+ The plugin automatically tracks all dashcam URLs in memory (no temp files needed!) and associates them with test results.
78
+
79
+ ## CI/CD Integration
80
+
81
+ ### GitHub Actions
82
+
83
+ ```yaml
84
+ # .github/workflows/test.yml
85
+ name: Tests
86
+ on: [push]
87
+ jobs:
88
+ test:
89
+ runs-on: windows-latest
90
+ steps:
91
+ - uses: actions/checkout@v3
92
+ - run: npm install
93
+ - run: vitest run
94
+ env:
95
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
96
+ ```
97
+
98
+ ### GitLab CI
99
+
100
+ ```yaml
101
+ # .gitlab-ci.yml
102
+ test:
103
+ script:
104
+ - npm install
105
+ - vitest run
106
+ variables:
107
+ TD_API_KEY: $CI_JOB_TOKEN
108
+ ```
109
+
110
+ The reporter automatically detects CI environment and records:
111
+ - Git repo, branch, commit
112
+ - CI provider and run URL
113
+ - Test results and timing
114
+
115
+ ## What Gets Recorded
116
+
117
+ ### Test Run
118
+ - Suite name and platform
119
+ - Total/passed/failed counts
120
+ - Duration
121
+ - CI/CD metadata
122
+ - Git commit info
123
+
124
+ ### Each Test
125
+ - Test name and file
126
+ - Pass/fail status
127
+ - Error messages (if failed)
128
+ - Duration
129
+ - Dashcam replay link (if available)
130
+
131
+ ## View Results
132
+
133
+ Dashboard shows:
134
+ - All test runs with filters
135
+ - Drill down to individual tests
136
+ - Embedded dashcam replay player
137
+ - Link to CI/CD runs
138
+ - Test history and trends
139
+
140
+ ## SDK Methods
141
+
142
+ Use in your test code:
143
+
144
+ ```javascript
145
+ // Create test run
146
+ const testRun = await client.createTestRun({
147
+ runId: 'unique-id',
148
+ suiteName: 'My Tests',
149
+ platform: 'windows'
150
+ });
151
+
152
+ // Record test result
153
+ await client.recordTestCase({
154
+ runId: 'unique-id',
155
+ testName: 'my test',
156
+ status: 'passed',
157
+ replayUrl: 'https://app.dashcam.io/replay/abc'
158
+ });
159
+
160
+ // Complete run
161
+ await client.completeTestRun({
162
+ runId: 'unique-id',
163
+ status: 'passed'
164
+ });
165
+ ```
166
+
167
+ ## Troubleshooting
168
+
169
+ **Reporter not recording?**
170
+ - Check `TD_API_KEY` is set
171
+ - Verify network connectivity to TestDriver API
172
+ - Look for reporter logs in test output
173
+
174
+ **No dashcam link?**
175
+ - Ensure dashcam publishes and outputs replay URL
176
+ - Check test logs for replay URL output
177
+ - Manually set `DASHCAM_REPLAY_URL` if needed
178
+
179
+ **CI metadata missing?**
180
+ - CI environment variables must be available
181
+ - Supported: GitHub Actions, GitLab CI, CircleCI, Travis, Jenkins
182
+
183
+ ## Files Created
184
+
185
+ **API (Backend)**
186
+ - `api/models/TdTestRun.js` - Test run model
187
+ - `api/models/TdTestCase.js` - Test case model
188
+ - `api/controllers/testdriver/testdriver-test-run-create.js` - Create test run endpoint
189
+ - `api/controllers/testdriver/testdriver-test-run-complete.js` - Complete test run endpoint
190
+ - `api/controllers/testdriver/testdriver-test-case-create.js` - Record test case endpoint
191
+
192
+ **CLI/SDK**
193
+ - `cli/interfaces/vitest-plugin.mjs` - Vitest plugin for test recording
194
+ - `cli/sdk.js` - Added createTestRun(), recordTestCase(), completeTestRun() methods
195
+
196
+ **Documentation**
197
+ - `cli/docs/TEST_RECORDING.md` - Complete guide
198
+ - `cli/docs/ARCHITECTURE.md` - Technical architecture
199
+ - `cli/vitest.config.example.js` - Example config
200
+ - `cli/examples/test-recording-example.test.js` - Example test
201
+ - `cli/examples/run-tests-with-recording.sh` - Example script
202
+
203
+ ## Next Steps
204
+
205
+ 1. **Try it out**: Run `vitest run` and check the dashboard
206
+ 2. **Add dashcam**: Record your tests with screen capture
207
+ 3. **Set up CI/CD**: Add to your pipeline for continuous tracking
208
+ 4. **Build dashboard UI**: Create Vue components to visualize test runs (next phase)
209
+
210
+ ## Support
211
+
212
+ - Documentation: https://docs.testdriver.ai
213
+ - Dashboard: https://console.testdriver.ai
214
+ - API Reference: /cli/docs/TEST_RECORDING.md