testdriverai 7.3.2 → 7.3.4

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 (359) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.github/workflows/acceptance-linux-scheduled.yaml +45 -0
  4. package/.github/workflows/acceptance-windows-scheduled.yaml +54 -0
  5. package/.github/workflows/acceptance.yaml +106 -0
  6. package/.github/workflows/publish.yaml +75 -0
  7. package/.github/workflows/test-init.yml +157 -0
  8. package/.github/workflows/testdriver.yml +170 -0
  9. package/.github/workflows/windows-self-hosted.yaml +82 -0
  10. package/.prettierignore +4 -0
  11. package/.prettierrc +1 -0
  12. package/CHANGELOG.md +162 -0
  13. package/SKILLs.md +17 -0
  14. package/ai/.claude-plugin/plugin.json +9 -0
  15. package/docs/GITHUB_COMMENTS.md +330 -0
  16. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  17. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  18. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  19. package/docs/_scripts/generate-skills.js +149 -0
  20. package/docs/_scripts/link-replacer.js +164 -0
  21. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  22. package/docs/claude-mcp-plugin.mdx +160 -0
  23. package/docs/docs.json +394 -0
  24. package/docs/github-integration-setup.md +266 -0
  25. package/docs/guide/best-practices-polling.mdx +154 -0
  26. package/docs/images/content/account/newprojectsettings.png +0 -0
  27. package/docs/images/content/account/projectpage.png +0 -0
  28. package/docs/images/content/account/projectreplays.png +0 -0
  29. package/docs/images/content/account/team-manage.png +0 -0
  30. package/docs/images/content/account/teampage.png +0 -0
  31. package/docs/images/content/extension/cursor.svg +1 -0
  32. package/docs/images/content/extension/vscode.svg +57 -0
  33. package/docs/images/content/extension/windsurf.svg +3 -0
  34. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  35. package/docs/images/content/side-by-side.png +0 -0
  36. package/docs/images/content/vscode/ide-full.png +0 -0
  37. package/docs/images/content/vscode/running.png +0 -0
  38. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  39. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  40. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  41. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  42. package/docs/images/content/vscode/vscode-install.png +0 -0
  43. package/docs/images/content/vscode/vscode-overview.png +0 -0
  44. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  45. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  46. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  47. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  48. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  49. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  50. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  51. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  52. package/docs/images/template/dark.png +0 -0
  53. package/docs/images/template/icon.png +0 -0
  54. package/docs/images/template/light.png +0 -0
  55. package/docs/snippets/calendar-link.mdx +4 -0
  56. package/docs/snippets/gitignore-warning.mdx +7 -0
  57. package/docs/snippets/lifecycle-warning.mdx +6 -0
  58. package/docs/snippets/test-prereqs.mdx +12 -0
  59. package/docs/snippets/tests/assert-replay.mdx +7 -0
  60. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  61. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  62. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  63. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  64. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  65. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  66. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  67. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  68. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  69. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  70. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  71. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  72. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  73. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  74. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  75. package/docs/snippets/tests/remember-replay.mdx +7 -0
  76. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  77. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  78. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  79. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  80. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  81. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  82. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  83. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  84. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  85. package/docs/snippets/tests/type-replay.mdx +7 -0
  86. package/docs/snippets/tests/type-yaml.mdx +28 -0
  87. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  88. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  89. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  90. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  91. package/docs/snippets/tests/wait-replay.mdx +7 -0
  92. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  93. package/docs/styles.css +65 -0
  94. package/docs/v6/account/dashboard.mdx +16 -0
  95. package/docs/v6/account/enterprise.mdx +110 -0
  96. package/docs/v6/account/pricing.mdx +33 -0
  97. package/docs/v6/account/projects.mdx +33 -0
  98. package/docs/v6/account/team.mdx +35 -0
  99. package/docs/v6/action/ami.mdx +109 -0
  100. package/docs/v6/action/performance.mdx +105 -0
  101. package/docs/v6/action/secrets.mdx +93 -0
  102. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  103. package/docs/v6/apps/desktop-apps.mdx +93 -0
  104. package/docs/v6/apps/mobile-apps.mdx +26 -0
  105. package/docs/v6/apps/static-websites.mdx +54 -0
  106. package/docs/v6/apps/tauri-apps.mdx +361 -0
  107. package/docs/v6/bugs/jira.mdx +232 -0
  108. package/docs/v6/cli/overview.mdx +66 -0
  109. package/docs/v6/commands/assert.mdx +45 -0
  110. package/docs/v6/commands/exec.mdx +282 -0
  111. package/docs/v6/commands/focus-application.mdx +44 -0
  112. package/docs/v6/commands/hover-image.mdx +69 -0
  113. package/docs/v6/commands/hover-text.mdx +47 -0
  114. package/docs/v6/commands/if.mdx +53 -0
  115. package/docs/v6/commands/match-image.mdx +67 -0
  116. package/docs/v6/commands/press-keys.mdx +87 -0
  117. package/docs/v6/commands/remember.mdx +49 -0
  118. package/docs/v6/commands/run.mdx +44 -0
  119. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  120. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  121. package/docs/v6/commands/scroll.mdx +69 -0
  122. package/docs/v6/commands/type.mdx +45 -0
  123. package/docs/v6/commands/wait-for-image.mdx +54 -0
  124. package/docs/v6/commands/wait-for-text.mdx +48 -0
  125. package/docs/v6/commands/wait.mdx +45 -0
  126. package/docs/v6/exporting/junit.mdx +218 -0
  127. package/docs/v6/exporting/playwright.mdx +197 -0
  128. package/docs/v6/features/auto-healing.mdx +144 -0
  129. package/docs/v6/features/generation.mdx +116 -0
  130. package/docs/v6/features/parallel-testing.mdx +151 -0
  131. package/docs/v6/features/reusable-snippets.mdx +131 -0
  132. package/docs/v6/features/selectorless.mdx +80 -0
  133. package/docs/v6/features/visual-assertions.mdx +139 -0
  134. package/docs/v6/getting-started/ci.mdx +146 -0
  135. package/docs/v6/getting-started/cli.mdx +91 -0
  136. package/docs/v6/getting-started/editing.mdx +100 -0
  137. package/docs/v6/getting-started/playwright.mdx +342 -0
  138. package/docs/v6/getting-started/running.mdx +48 -0
  139. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  140. package/docs/v6/getting-started/vscode.mdx +88 -0
  141. package/docs/v6/guide/assertions.mdx +189 -0
  142. package/docs/v6/guide/authentication.mdx +136 -0
  143. package/docs/v6/guide/code.mdx +65 -0
  144. package/docs/v6/guide/dashcam.mdx +118 -0
  145. package/docs/v6/guide/environment-variables.mdx +26 -0
  146. package/docs/v6/guide/lifecycle.mdx +242 -0
  147. package/docs/v6/guide/locating.mdx +141 -0
  148. package/docs/v6/guide/protips.mdx +43 -0
  149. package/docs/v6/guide/variables.mdx +143 -0
  150. package/docs/v6/guide/waiting.mdx +130 -0
  151. package/docs/v6/importing/csv.mdx +196 -0
  152. package/docs/v6/importing/gherkin.mdx +143 -0
  153. package/docs/v6/importing/jira.mdx +164 -0
  154. package/docs/v6/importing/testrail.mdx +162 -0
  155. package/docs/v6/integrations/electron.mdx +146 -0
  156. package/docs/v6/integrations/netlify.mdx +100 -0
  157. package/docs/v6/integrations/vercel.mdx +125 -0
  158. package/docs/v6/interactive/explore.mdx +99 -0
  159. package/docs/v6/interactive/run.mdx +52 -0
  160. package/docs/v6/interactive/save.mdx +63 -0
  161. package/docs/v6/overview/comparison.mdx +101 -0
  162. package/docs/v6/overview/faq.mdx +162 -0
  163. package/docs/v6/overview/performance.mdx +52 -0
  164. package/docs/v6/overview/quickstart.mdx +137 -0
  165. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  166. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  167. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  168. package/docs/v6/scenarios/file-upload.mdx +33 -0
  169. package/docs/v6/scenarios/form-filling.mdx +32 -0
  170. package/docs/v6/scenarios/log-in.mdx +75 -0
  171. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  172. package/docs/v6/scenarios/spell-check.mdx +22 -0
  173. package/docs/v6/security/action.mdx +84 -0
  174. package/docs/v6/security/agent.mdx +73 -0
  175. package/docs/v6/security/platform.mdx +77 -0
  176. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  177. package/docs/v6/tutorials/basic-test.mdx +45 -0
  178. package/docs/v7/_drafts/agents.mdx +852 -0
  179. package/docs/v7/_drafts/architecture.mdx +399 -0
  180. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  181. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  182. package/docs/v7/_drafts/best-practices.mdx +486 -0
  183. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  184. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  185. package/docs/v7/_drafts/caching.mdx +366 -0
  186. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  187. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  188. package/docs/v7/_drafts/commands/exec.mdx +282 -0
  189. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  190. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  191. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  192. package/docs/v7/_drafts/commands/if.mdx +53 -0
  193. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  194. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  195. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  196. package/docs/v7/_drafts/commands/run.mdx +44 -0
  197. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  198. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  199. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  200. package/docs/v7/_drafts/commands/type.mdx +45 -0
  201. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  202. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  203. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  204. package/docs/v7/_drafts/configuration.mdx +378 -0
  205. package/docs/v7/_drafts/contributing.mdx +174 -0
  206. package/docs/v7/_drafts/core.mdx +458 -0
  207. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  208. package/docs/v7/_drafts/debugging.mdx +349 -0
  209. package/docs/v7/_drafts/error-handling.mdx +501 -0
  210. package/docs/v7/_drafts/faq.mdx +393 -0
  211. package/docs/v7/_drafts/hooks.mdx +360 -0
  212. package/docs/v7/_drafts/init-command.mdx +95 -0
  213. package/docs/v7/_drafts/installation.mdx +420 -0
  214. package/docs/v7/_drafts/migration.mdx +562 -0
  215. package/docs/v7/_drafts/observable.mdx +604 -0
  216. package/docs/v7/_drafts/playwright.mdx +342 -0
  217. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  218. package/docs/v7/_drafts/powerful.mdx +419 -0
  219. package/docs/v7/_drafts/presets.mdx +210 -0
  220. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  221. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  222. package/docs/v7/_drafts/provision.mdx +390 -0
  223. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  224. package/docs/v7/_drafts/readme.mdx +135 -0
  225. package/docs/v7/_drafts/reports.mdx +414 -0
  226. package/docs/v7/_drafts/scalable.mdx +754 -0
  227. package/docs/v7/_drafts/screenshot.mdx +155 -0
  228. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  229. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  230. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  231. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  232. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  233. package/docs/v7/_drafts/test-recording.mdx +382 -0
  234. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  235. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  236. package/docs/v7/_drafts/vitest.mdx +535 -0
  237. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  238. package/{ai/skills/testdriver:ai/SKILL.md → docs/v7/ai.mdx} +4 -3
  239. package/{ai/skills/testdriver:assert/SKILL.md → docs/v7/assert.mdx} +4 -3
  240. package/{ai/skills/testdriver:aws-setup/SKILL.md → docs/v7/aws-setup.mdx} +4 -3
  241. package/{ai/skills/testdriver:caching/SKILL.md → docs/v7/caching.mdx} +7 -3
  242. package/{ai/skills/testdriver:captcha/SKILL.md → docs/v7/captcha.mdx} +4 -3
  243. package/{ai/skills/testdriver:ci-cd/SKILL.md → docs/v7/ci-cd.mdx} +4 -3
  244. package/{ai/skills/testdriver:click/SKILL.md → docs/v7/click.mdx} +4 -3
  245. package/{ai/skills/testdriver:client/SKILL.md → docs/v7/client.mdx} +8 -3
  246. package/{ai/skills/testdriver:cloud/SKILL.md → docs/v7/cloud.mdx} +4 -3
  247. package/{ai/skills/testdriver:customizing-devices/SKILL.md → docs/v7/customizing-devices.mdx} +3 -3
  248. package/{ai/skills/testdriver:dashcam/SKILL.md → docs/v7/dashcam.mdx} +4 -3
  249. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  250. package/{ai/skills/testdriver:device-config/SKILL.md → docs/v7/device-config.mdx} +3 -3
  251. package/{ai/skills/testdriver:double-click/SKILL.md → docs/v7/double-click.mdx} +3 -3
  252. package/{ai/skills/testdriver:elements/SKILL.md → docs/v7/elements.mdx} +4 -3
  253. package/{ai/skills/testdriver:enterprise/SKILL.md → docs/v7/enterprise.mdx} +5 -3
  254. package/docs/v7/examples.mdx +5 -0
  255. package/{ai/skills/testdriver:exec/SKILL.md → docs/v7/exec.mdx} +4 -3
  256. package/{ai/skills/testdriver:find/SKILL.md → docs/v7/find.mdx} +4 -3
  257. package/{ai/skills/testdriver:focus-application/SKILL.md → docs/v7/focus-application.mdx} +4 -3
  258. package/{ai/skills/testdriver:generating-tests/SKILL.md → docs/v7/generating-tests.mdx} +3 -3
  259. package/{ai/skills/testdriver:hover/SKILL.md → docs/v7/hover.mdx} +4 -3
  260. package/{ai/skills/testdriver:locating-elements/SKILL.md → docs/v7/locating-elements.mdx} +3 -3
  261. package/{ai/skills/testdriver:making-assertions/SKILL.md → docs/v7/making-assertions.mdx} +3 -3
  262. package/{ai/skills/testdriver:mouse-down/SKILL.md → docs/v7/mouse-down.mdx} +3 -3
  263. package/{ai/skills/testdriver:mouse-up/SKILL.md → docs/v7/mouse-up.mdx} +3 -3
  264. package/docs/v7/ocr.mdx +236 -0
  265. package/{ai/skills/testdriver:performing-actions/SKILL.md → docs/v7/performing-actions.mdx} +3 -3
  266. package/{ai/skills/testdriver:press-keys/SKILL.md → docs/v7/press-keys.mdx} +4 -3
  267. package/{ai/skills/testdriver:quickstart/SKILL.md → docs/v7/quickstart.mdx} +6 -20
  268. package/{ai/skills/testdriver:reusable-code/SKILL.md → docs/v7/reusable-code.mdx} +3 -3
  269. package/{ai/skills/testdriver:right-click/SKILL.md → docs/v7/right-click.mdx} +3 -3
  270. package/{ai/skills/testdriver:running-tests/SKILL.md → docs/v7/running-tests.mdx} +7 -3
  271. package/{ai/skills/testdriver:screenshot/SKILL.md → docs/v7/screenshot.mdx} +88 -6
  272. package/{ai/skills/testdriver:scroll/SKILL.md → docs/v7/scroll.mdx} +40 -3
  273. package/{ai/skills/testdriver:secrets/SKILL.md → docs/v7/secrets.mdx} +3 -3
  274. package/{ai/skills/testdriver:self-hosted/SKILL.md → docs/v7/self-hosted.mdx} +4 -3
  275. package/{ai/skills/testdriver:type/SKILL.md → docs/v7/type.mdx} +4 -3
  276. package/{ai/skills/testdriver:variables/SKILL.md → docs/v7/variables.mdx} +3 -3
  277. package/{ai/skills/testdriver:waiting-for-elements/SKILL.md → docs/v7/waiting-for-elements.mdx} +3 -3
  278. package/{ai/skills/testdriver:what-is-testdriver/SKILL.md → docs/v7/what-is-testdriver.mdx} +3 -3
  279. package/eslint.config.js +67 -0
  280. package/examples/ai.test.mjs +30 -0
  281. package/examples/assert.test.mjs +47 -0
  282. package/examples/captcha-api.test.mjs +50 -0
  283. package/examples/chrome-extension.test.mjs +94 -0
  284. package/examples/drag-and-drop.test.mjs +58 -0
  285. package/examples/element-not-found.test.mjs +26 -0
  286. package/examples/exec-output.test.mjs +59 -0
  287. package/examples/exec-pwsh.test.mjs +57 -0
  288. package/examples/focus-window.test.mjs +36 -0
  289. package/examples/formatted-logging.test.mjs +26 -0
  290. package/examples/hover-image.test.mjs +52 -0
  291. package/examples/hover-text-with-description.test.mjs +56 -0
  292. package/examples/hover-text.test.mjs +27 -0
  293. package/examples/installer.test.mjs +49 -0
  294. package/examples/launch-vscode-linux.test.mjs +54 -0
  295. package/examples/match-image.test.mjs +54 -0
  296. package/examples/no-provision.test.mjs +23 -0
  297. package/examples/press-keys.test.mjs +50 -0
  298. package/examples/prompt.test.mjs +33 -0
  299. package/examples/scroll-keyboard.test.mjs +37 -0
  300. package/examples/scroll-until-image.test.mjs +39 -0
  301. package/examples/scroll-until-text.test.mjs +67 -0
  302. package/examples/scroll.test.mjs +41 -0
  303. package/examples/type.test.mjs +45 -0
  304. package/examples/windows-installer.test.mjs +53 -0
  305. package/jsconfig.json +26 -0
  306. package/manual/test-init-command.js +223 -0
  307. package/mcp-server/README.md +312 -0
  308. package/mcp-server/mcp-app.html +28 -0
  309. package/mcp-server/mcp-config.example.json +19 -0
  310. package/mcp-server/package-lock.json +4018 -0
  311. package/mcp-server/package.json +29 -0
  312. package/mcp-server/src/codegen.ts +189 -0
  313. package/mcp-server/src/mcp-app.css +360 -0
  314. package/mcp-server/src/mcp-app.ts +547 -0
  315. package/mcp-server/src/provision-types.ts +209 -0
  316. package/mcp-server/src/server.ts +2313 -0
  317. package/mcp-server/src/session.ts +194 -0
  318. package/mcp-server/tsconfig.json +16 -0
  319. package/mcp-server/vite.config.ts +23 -0
  320. package/package.json +2 -17
  321. package/scripts/generate-skills.js +94 -0
  322. package/setup/aws/cloudformation.yaml +470 -0
  323. package/setup/aws/spawn-runner.sh +190 -0
  324. package/test/api-resilience.test.mjs +0 -0
  325. package/test/captcha-solver.test.mjs +152 -0
  326. package/test/chrome-remote-debugging.test.mjs +66 -0
  327. package/test/duckduckgo/experiment.test.mjs +28 -0
  328. package/test/duckduckgo/setup.test.mjs +29 -0
  329. package/test/manual/debug-locate-response.js +82 -0
  330. package/test/manual/reconnect-provision.test.mjs +49 -0
  331. package/test/manual/test-console-logs.test.mjs +42 -0
  332. package/test/manual/test-find-api.js +73 -0
  333. package/test/manual/test-init.sh +54 -0
  334. package/test/manual/test-prompt-cache.js +97 -0
  335. package/test/manual/test-provision-auth.mjs +22 -0
  336. package/test/manual/test-sandbox-render.js +29 -0
  337. package/test/manual/test-sdk-methods.js +15 -0
  338. package/test/manual/test-sdk-refactor.js +53 -0
  339. package/test/manual/test-stack-trace.mjs +57 -0
  340. package/test/manual/verify-element-api.js +89 -0
  341. package/test/manual/verify-types.js +0 -0
  342. package/test/manual-unawaited-promise.test.mjs +31 -0
  343. package/test-ide-preview.mjs +17 -0
  344. package/tests/airbnb-booking.test.mjs +39 -0
  345. package/tests/airbnb-search.test.mjs +43 -0
  346. package/tests/example.test.js +33 -0
  347. package/tests/login.js +28 -0
  348. package/vitest.config.mjs +24 -0
  349. package/vscode-extension/.vscodeignore +12 -0
  350. package/vscode-extension/README.md +94 -0
  351. package/vscode-extension/media/icon.png +0 -0
  352. package/vscode-extension/package-lock.json +4126 -0
  353. package/vscode-extension/package.json +86 -0
  354. package/vscode-extension/src/extension.ts +829 -0
  355. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  356. package/vscode-extension/tsconfig.json +16 -0
  357. package/ai/skills/testdriver:examples/SKILL.md +0 -7
  358. package/ai/skills/testdriver:mcp-workflow/SKILL.md +0 -410
  359. package/ai/skills/testdriver:testdriver/SKILL.md +0 -523
package/docs/docs.json ADDED
@@ -0,0 +1,394 @@
1
+ {
2
+ "$schema": "https://mintlify.com/docs.json",
3
+ "theme": "aspen",
4
+ "name": "TestDriver",
5
+ "colors": {
6
+ "primary": "#b3d334",
7
+ "light": "#b3d334",
8
+ "dark": "#152a65"
9
+ },
10
+ "appearance": {
11
+ "default": "dark"
12
+ },
13
+ "favicon": "/images/template/icon.png",
14
+ "navigation": {
15
+ "versions": [
16
+ {
17
+ "version": "v7",
18
+ "groups": [
19
+ {
20
+ "group": "Overview",
21
+ "pages": [
22
+ "/v7/quickstart",
23
+ "/v7/what-is-testdriver",
24
+ "/v7/examples",
25
+ {
26
+ "group": "Plans & Pricing",
27
+ "icon": "server",
28
+ "pages": [
29
+ "/v7/cloud",
30
+ "/v7/self-hosted",
31
+ "/v7/enterprise"
32
+ ]
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ "group": "Creating Tests",
38
+ "pages": [
39
+ "/v7/generating-tests",
40
+ "/v7/device-config",
41
+ "/v7/locating-elements",
42
+ "/v7/waiting-for-elements",
43
+ "/v7/performing-actions",
44
+ "/v7/making-assertions"
45
+ ]
46
+ },
47
+ {
48
+ "group": "Running Tests",
49
+ "pages": [
50
+ "/v7/running-tests",
51
+ "/v7/caching",
52
+ "/v7/ci-cd"
53
+ ]
54
+ },
55
+ {
56
+ "group": "Scaling",
57
+ "pages": [
58
+ "/v7/variables",
59
+ "/v7/secrets",
60
+ "/v7/reusable-code",
61
+ {
62
+ "group": "Self-Hosting Setup",
63
+ "icon": "server",
64
+ "pages": [
65
+ "/v7/aws-setup"
66
+ ]
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ "group": "Actions",
72
+ "pages": [
73
+ "/v7/ai",
74
+ "/v7/assert",
75
+ "/v7/captcha",
76
+ "/v7/click",
77
+ "/v7/double-click",
78
+ "/v7/exec",
79
+ "/v7/find",
80
+ "/v7/focus-application",
81
+ "/v7/hover",
82
+ "/v7/mouse-down",
83
+ "/v7/mouse-up",
84
+ "/v7/ocr",
85
+ "/v7/press-keys",
86
+ "/v7/right-click",
87
+ "/v7/screenshot",
88
+ "/v7/type",
89
+ "/v7/scroll"
90
+ ]
91
+ },
92
+ {
93
+ "group": "SDK",
94
+ "pages":
95
+ [
96
+ "/v7/elements",
97
+ "/v7/client",
98
+ "/v7/dashcam"
99
+
100
+ ]
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "version": "v6",
106
+ "groups": [
107
+ {
108
+ "group": "Overview",
109
+ "pages": [
110
+ "/v6/overview/what-is-testdriver",
111
+ {
112
+ "group": "Concepts",
113
+ "icon": "book",
114
+ "pages": [
115
+ "/v6/features/selectorless",
116
+ "/v6/overview/comparison",
117
+ "/v6/overview/performance",
118
+ "/v6/overview/faq"
119
+ ]
120
+ },
121
+ "/v6/account/enterprise"
122
+ ]
123
+ },
124
+ {
125
+ "group": "Get Started",
126
+ "pages": [
127
+ "/v6/overview/quickstart",
128
+ {
129
+ "group": "CLI",
130
+ "icon": "terminal",
131
+ "pages": [
132
+ "/v6/cli/overview",
133
+ {
134
+ "group": "Commands",
135
+ "icon": "command",
136
+ "pages": [
137
+ "/v6/interactive/explore",
138
+ "/v6/interactive/run",
139
+ "/v6/interactive/save"
140
+ ]
141
+ }
142
+ ]
143
+ },
144
+ "/v6/getting-started/self-hosting",
145
+ "/v6/getting-started/playwright",
146
+ "/v6/getting-started/vscode"
147
+ ]
148
+ },
149
+ {
150
+ "group": "Examples",
151
+ "pages": [
152
+ {
153
+ "group": "Apps",
154
+ "icon": "laptop",
155
+ "pages": [
156
+ "/v6/apps/static-websites",
157
+ "/v6/apps/desktop-apps",
158
+ "/v6/apps/chrome-extensions",
159
+ "/v6/apps/mobile-apps",
160
+ "/v6/apps/tauri-apps"
161
+ ]
162
+ },
163
+ {
164
+ "group": "Scenarios",
165
+ "icon": "computer-mouse",
166
+ "pages": [
167
+ "/v6/scenarios/ai-chatbot",
168
+ "/v6/scenarios/cookie-banner",
169
+ "/v6/scenarios/file-upload",
170
+ "/v6/scenarios/form-filling",
171
+ "/v6/scenarios/log-in",
172
+ "/v6/scenarios/pdf-generation",
173
+ "/v6/scenarios/spell-check"
174
+ ]
175
+ },
176
+ {
177
+ "group": "Build Systems",
178
+ "icon": "helmet-safety",
179
+ "pages": [
180
+ "/v6/integrations/electron",
181
+ "/v6/integrations/netlify",
182
+ "/v6/integrations/vercel"
183
+ ]
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ "group": "Guide",
189
+ "pages": [
190
+ {
191
+ "group": "Configuration",
192
+ "icon": "desktop",
193
+ "pages": [
194
+ "/v6/guide/authentication",
195
+ "/v6/guide/variables",
196
+ "/v6/guide/lifecycle",
197
+ "/v6/guide/dashcam",
198
+ "/v6/guide/environment-variables",
199
+ "/v6/action/ami"
200
+ ]
201
+ },
202
+ {
203
+ "group": "Writing",
204
+ "icon": "pencil",
205
+ "pages": [
206
+ "/v6/features/generation",
207
+ "/v6/guide/locating",
208
+ "/v6/guide/waiting",
209
+ "/v6/guide/assertions",
210
+ "/v6/guide/code",
211
+ "/v6/features/reusable-snippets",
212
+ "/v6/guide/protips"
213
+ ]
214
+ },
215
+ {
216
+ "group": "Importing",
217
+ "icon": "file-import",
218
+ "pages": [
219
+ "/v6/importing/csv",
220
+ "/v6/importing/gherkin",
221
+ "/v6/importing/jira",
222
+ "/v6/importing/testrail"
223
+ ]
224
+ },
225
+ {
226
+ "group": "Running",
227
+ "icon": "play",
228
+ "pages": [
229
+ "/v6/getting-started/running",
230
+ "/v6/getting-started/ci",
231
+ "/v6/features/parallel-testing",
232
+ "/v6/action/performance",
233
+ "/v6/action/secrets"
234
+ ]
235
+ },
236
+ {
237
+ "group": "Maintaining",
238
+ "icon": "wrench",
239
+ "pages": ["/v6/getting-started/editing", "/v6/features/auto-healing"]
240
+ },
241
+ {
242
+ "group": "Reporting",
243
+ "icon": "chart-simple",
244
+ "pages": ["/v6/exporting/junit", "/v6/bugs/jira"]
245
+ }
246
+ ]
247
+ },
248
+ {
249
+ "group": "Reference",
250
+ "pages": [
251
+ {
252
+ "group": "YAML",
253
+ "icon": "file-code",
254
+ "pages": [
255
+ "/v6/commands/assert",
256
+ "/v6/commands/exec",
257
+ "/v6/commands/focus-application",
258
+ "/v6/commands/hover-image",
259
+ "/v6/commands/hover-text",
260
+ "/v6/commands/if",
261
+ "/v6/commands/match-image",
262
+ "/v6/commands/press-keys",
263
+ "/v6/commands/remember",
264
+ "/v6/commands/run",
265
+ "/v6/commands/scroll",
266
+ "/v6/commands/scroll-until-image",
267
+ "/v6/commands/scroll-until-text",
268
+ "/v6/commands/type",
269
+ "/v6/commands/wait",
270
+ "/v6/commands/wait-for-image",
271
+ "/v6/commands/wait-for-text"
272
+ ]
273
+ }
274
+ ]
275
+ }
276
+ ]
277
+ }
278
+ ]
279
+ },
280
+ "logo": {
281
+ "light": "/images/template/light.png",
282
+ "dark": "/images/template/dark.png",
283
+ "href": "https://testdriver.ai"
284
+ },
285
+ "navbar": {
286
+ "links": [
287
+ {
288
+ "label": "Discord",
289
+ "icon": "discord",
290
+ "href": "https://discord.com/invite/cWDFW8DzPm"
291
+ },
292
+ {
293
+ "label": "Book a Demo",
294
+ "href": "http://testdriver.ai/demo",
295
+ "icon": "calendar"
296
+ },
297
+ {
298
+ "icon": "gauge-high",
299
+ "label": "Dashboard",
300
+ "href": "https://console.testdriver.ai"
301
+ }
302
+ ]
303
+ },
304
+ "footer": {
305
+ "socials": {
306
+ "x": "https://x.com/testdriverai",
307
+ "github": "https://github.com/testdriverai",
308
+ "discord": "https://discord.com/invite/cWDFW8DzPm",
309
+ "youtube": "https://www.youtube.com/@testdriverai"
310
+ }
311
+ },
312
+ "redirects": [
313
+ {
314
+ "source": "/guides/github-actions",
315
+ "destination": "/v6/action/setup"
316
+ },
317
+ {
318
+ "source": "/reference/test-steps",
319
+ "destination": "/v6/features/selectorless"
320
+ },
321
+ {
322
+ "source": "/guides/debugging-test-runs",
323
+ "destination": "/v6/getting-started/editing"
324
+ },
325
+ {
326
+ "source": "/overview/:slug*",
327
+ "destination": "/v6/overview/:slug*"
328
+ },
329
+ {
330
+ "source": "/features/:slug*",
331
+ "destination": "/v6/features/:slug*"
332
+ },
333
+ {
334
+ "source": "/getting-started/:slug*",
335
+ "destination": "/v6/getting-started/:slug*"
336
+ },
337
+ {
338
+ "source": "/cli/:slug*",
339
+ "destination": "/v6/cli/:slug*"
340
+ },
341
+ {
342
+ "source": "/interactive/:slug*",
343
+ "destination": "/v6/interactive/:slug*"
344
+ },
345
+ {
346
+ "source": "/guide/:slug*",
347
+ "destination": "/v6/guide/:slug*"
348
+ },
349
+ {
350
+ "source": "/action/:slug*",
351
+ "destination": "/v6/action/:slug*"
352
+ },
353
+ {
354
+ "source": "/account/:slug*",
355
+ "destination": "/v6/account/:slug*"
356
+ },
357
+ {
358
+ "source": "/apps/:slug*",
359
+ "destination": "/v6/apps/:slug*"
360
+ },
361
+ {
362
+ "source": "/scenarios/:slug*",
363
+ "destination": "/v6/scenarios/:slug*"
364
+ },
365
+ {
366
+ "source": "/integrations/:slug*",
367
+ "destination": "/v6/integrations/:slug*"
368
+ },
369
+ {
370
+ "source": "/importing/:slug*",
371
+ "destination": "/v6/importing/:slug*"
372
+ },
373
+ {
374
+ "source": "/exporting/:slug*",
375
+ "destination": "/v6/exporting/:slug*"
376
+ },
377
+ {
378
+ "source": "/bugs/:slug*",
379
+ "destination": "/v6/bugs/:slug*"
380
+ },
381
+ {
382
+ "source": "/commands/:slug*",
383
+ "destination": "/v6/commands/:slug*"
384
+ }
385
+ ],
386
+ "integrations": {
387
+ "segment": {
388
+ "key": "oh4PK60u4Qvm2DKIjxfhxd0KCdRbQsQE"
389
+ },
390
+ "posthog": {
391
+ "apiKey": "phc_ovOQ2HFpqFwPVqaxE5plJmI9buPMsz024FB2iajItqn"
392
+ }
393
+ }
394
+ }
@@ -0,0 +1,266 @@
1
+ # GitHub Integration Setup
2
+
3
+ TestDriver automatically posts beautiful test result comments to GitHub Pull Requests, including:
4
+ - ✅ Test results summary with pass/fail counts
5
+ - 🎥 Dashcam GIF replays embedded directly in comments
6
+ - 📊 Detailed test statistics and duration
7
+ - 🔴 Exception details with stack traces
8
+ - 📋 Links to full test runs
9
+
10
+ This guide explains how to configure GitHub authentication so TestDriver can post these comments.
11
+
12
+ ## How It Works
13
+
14
+ TestDriver's Vitest plugin automatically detects GitHub context and posts comments when tests complete. Here's what it needs:
15
+
16
+ ### Required Environment Variables
17
+
18
+ 1. **GITHUB_TOKEN** or **GH_TOKEN** - GitHub Personal Access Token for authentication
19
+ 2. **GITHUB_REPOSITORY** - Repository in `owner/repo` format (auto-detected in GitHub Actions)
20
+ 3. **GITHUB_PR_NUMBER** - Pull Request number (auto-detected in GitHub Actions)
21
+ 4. **GITHUB_SHA** - Commit SHA (optional, auto-detected in GitHub Actions)
22
+
23
+ ### Auto-Detection in GitHub Actions
24
+
25
+ When running in GitHub Actions, most variables are automatically available:
26
+ - `GITHUB_REPOSITORY` - Set automatically
27
+ - `GITHUB_SHA` - Set automatically
28
+ - `GITHUB_REF` - Used to detect PR number
29
+ - Pull request info extracted from event data
30
+
31
+ You only need to configure the token permissions!
32
+
33
+ ### Method 1: GitHub Actions (Recommended)
34
+
35
+ GitHub Actions provides automatic authentication. TestDriver will detect the context automatically.
36
+
37
+ **Required Permissions:**
38
+
39
+ In your workflow file, use the built-in `GITHUB_TOKEN` with write permissions:
40
+
41
+ ```yaml
42
+ name: TestDriver Tests
43
+
44
+ on:
45
+ pull_request:
46
+ types: [opened, synchronize]
47
+
48
+ jobs:
49
+ test:
50
+ runs-on: ubuntu-latest
51
+ permissions:
52
+ contents: read
53
+ pull-requests: write # Required to post comments
54
+
55
+ steps:
56
+ - uses: actions/checkout@v4
57
+
58
+ - name: Setup Node.js
59
+ uses: actions/setup-node@v4
60
+ with:
61
+ node-version: '20'
62
+
63
+ - name: Install dependencies
64
+ run: npm ci
65
+
66
+ - name: Run TestDriver tests
67
+ env:
68
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
69
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Automatically provided
70
+ run: vitest run
71
+ ```
72
+
73
+ **What happens automatically:**
74
+ - `GITHUB_TOKEN`: Provided by GitHub Actions
75
+ - `GITHUB_REPOSITORY`: Automatically set (e.g., `testdriverai/testdriverai`)
76
+ - `GITHUB_REF`: Automatically set (e.g., `refs/pull/123/merge`)
77
+ - PR number: Extracted automatically from `GITHUB_REF` or event data
78
+
79
+ ### Method 2: Manual Setup (Local or Other CI)
80
+
81
+ For local development or other CI systems, set these environment variables:
82
+
83
+ ```bash
84
+ # .env or export in your shell
85
+ GITHUB_TOKEN=ghp_your_personal_access_token_here
86
+ GITHUB_PR_NUMBER=123
87
+ # GITHUB_REPOSITORY is auto-detected from git if not set
88
+ ```
89
+
90
+ **Creating a Personal Access Token:**
91
+
92
+ 1. Go to [GitHub Settings → Developer settings → Personal access tokens](https://github.com/settings/tokens)
93
+ 2. Click "Generate new token" → "Generate new token (classic)"
94
+ 3. Give it a descriptive name (e.g., "TestDriver CI")
95
+ 4. Select scopes:
96
+ - ✅ `repo` (Full control of private repositories)
97
+ - Or just ✅ `public_repo` (for public repositories only)
98
+ 5. Click "Generate token"
99
+ 6. Copy the token immediately (you won't see it again!)
100
+ 7. Store it securely:
101
+ - **In GitHub Actions**: Add as repository secret (`Settings → Secrets and variables → Actions → New repository secret`)
102
+ - **Locally**: Add to `.env` file (and add `.env` to `.gitignore`!)
103
+
104
+ ### Method 3: Other CI Systems
105
+
106
+ #### CircleCI
107
+ ```yaml
108
+ environment:
109
+ GITHUB_TOKEN: $GITHUB_TOKEN
110
+ GITHUB_REPOSITORY: $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME
111
+ GITHUB_PR_NUMBER: $CIRCLE_PR_NUMBER
112
+ ```
113
+
114
+ #### GitLab CI
115
+ ```yaml
116
+ variables:
117
+ GITHUB_TOKEN: $GITHUB_TOKEN
118
+ GITHUB_REPOSITORY: "your-org/your-repo"
119
+ GITHUB_PR_NUMBER: $CI_MERGE_REQUEST_IID
120
+ ```
121
+
122
+ #### Jenkins
123
+ ```groovy
124
+ environment {
125
+ GITHUB_TOKEN = credentials('github-token')
126
+ GITHUB_REPOSITORY = "${env.GITHUB_ORG}/${env.GITHUB_REPO}"
127
+ GITHUB_PR_NUMBER = "${env.CHANGE_ID}"
128
+ }
129
+ ```
130
+
131
+ ## Environment Variables Reference
132
+
133
+ | Variable | Priority | Description | Example | Source |
134
+ |----------|----------|-------------|---------|--------|
135
+ | `GITHUB_TOKEN` | 1 | GitHub personal access token | `ghp_abc...` | Auto-provided in GitHub Actions |
136
+ | `GH_TOKEN` | 2 | Alternative GitHub token | `ghp_xyz...` | Manual setup |
137
+ | `GITHUB_REPOSITORY` | - | Repository in `owner/repo` format | `testdriverai/testdriverai` | Auto-set in GitHub Actions |
138
+ | `GITHUB_PR_NUMBER` | - | Pull request number | `123` | Must be set manually or by CI |
139
+ | `GITHUB_SHA` | - | Commit SHA | `abc1234def...` | Auto-set in GitHub Actions |
140
+ | `TESTDRIVER_SKIP_GITHUB_COMMENT` | - | Disable comment posting | `true` | Set to skip comments |
141
+
142
+ **Note**: Git repository info (owner/repo, branch, commit) is auto-detected from your local `.git` directory if not provided via environment variables.
143
+
144
+ ## Disabling GitHub Comments
145
+
146
+ To disable GitHub comments:
147
+
148
+ ```bash
149
+ # Method 1: Set environment variable
150
+ TESTDRIVER_SKIP_GITHUB_COMMENT=true npm run test
151
+
152
+ # Method 2: Remove/unset the GitHub token
153
+ unset GITHUB_TOKEN
154
+ unset GH_TOKEN
155
+ ```
156
+
157
+ In GitHub Actions workflow:
158
+ ```yaml
159
+ - name: Run tests without GitHub comments
160
+ env:
161
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
162
+ TESTDRIVER_SKIP_GITHUB_COMMENT: true
163
+ run: vitest run
164
+ ```
165
+
166
+ ## Troubleshooting
167
+
168
+ ### "GitHub token not found, skipping comment posting"
169
+
170
+ Check that the token is set:
171
+ ```bash
172
+ echo $GITHUB_TOKEN # or GH_TOKEN
173
+ ```
174
+
175
+ ### "Neither PR number nor commit SHA found"
176
+
177
+ Set the PR number:
178
+ ```bash
179
+ export GITHUB_PR_NUMBER=123
180
+ ```
181
+
182
+ Or ensure `GITHUB_SHA` is set (auto-set in GitHub Actions).
183
+
184
+ ### "Repository info not available"
185
+
186
+ The plugin auto-detects repo info from your `.git` directory. If that fails, set:
187
+ ```bash
188
+ export GITHUB_REPOSITORY=owner/repo
189
+ ```
190
+
191
+ ### "Resource not accessible by integration"
192
+
193
+ Your token doesn't have `pull-requests: write` permission. Check:
194
+ - GitHub Actions: Add `permissions.pull-requests: write` to workflow
195
+ - Personal token: Ensure it has `repo` or `public_repo` scope
196
+
197
+ ### "Not Found" or "403 Forbidden"
198
+
199
+ - Token doesn't have access to the repository
200
+ - Repository name format is incorrect (must be `owner/repo`)
201
+ - PR number is invalid
202
+
203
+ ### Comments not appearing
204
+
205
+ - Check that tests are running in the context of a pull request
206
+ - Verify the token has write access
207
+ - Look for error messages in the test output
208
+ - Run with `DEBUG=testdriver:github` for verbose logging
209
+
210
+ ## Security Best Practices
211
+
212
+ 1. **Never commit tokens** to git repositories
213
+ 2. **Use GitHub Actions secrets** for CI/CD
214
+ 3. **Use fine-grained tokens** with minimum required permissions
215
+ 4. **Rotate tokens regularly** (at least every 90 days)
216
+ 5. **Revoke tokens** immediately if compromised
217
+ 6. **Use organization secrets** for shared tokens across repos
218
+
219
+ ## Example Comment Output
220
+
221
+ When properly configured, TestDriver will post comments like:
222
+
223
+ ```markdown
224
+ # 🟢 TestDriver Test Results
225
+
226
+ **Status:** ✅ PASSED
227
+ **Duration:** 45.23s
228
+ **Platform:** linux
229
+ **Branch:** `feature/new-login`
230
+ **Commit:** `abc1234`
231
+
232
+ ## 📊 Test Summary
233
+
234
+ Total: 3
235
+ Passed: 3 ✅
236
+ Failed: 0 ❌
237
+ Skipped: 0 ⏭️
238
+
239
+ ### [📋 View Full Test Run](https://app.testdriver.ai/runs/...)
240
+
241
+ ## 📝 Test Results
242
+
243
+ | Status | Test | File | Duration | Replay |
244
+ |--------|------|------|----------|--------|
245
+ | ✅ | should log in successfully | `login.test.mjs` | 12.34s | [🎥 View](https://app.testdriver.ai/replay/...) |
246
+ | ✅ | should navigate to dashboard | `navigation.test.mjs` | 8.91s | [🎥 View](https://app.testdriver.ai/replay/...) |
247
+
248
+ ## 🎥 Dashcam Replays
249
+
250
+ ### should log in successfully
251
+
252
+ [![Login test](https://app.testdriver.ai/api/replay/.../gif)](https://app.testdriver.ai/replay/...)
253
+
254
+ [🎬 View Full Replay](https://app.testdriver.ai/replay/...)
255
+
256
+ ---
257
+ <sub>Generated by [TestDriver](https://testdriver.ai) • Run ID: `run_abc123`</sub>
258
+ ```
259
+
260
+ The GIF replays are automatically embedded so reviewers can see what happened without leaving GitHub!
261
+
262
+ ## Getting Help
263
+
264
+ - 📚 [Full Documentation](https://docs.testdriver.ai)
265
+ - 💬 [Discord Community](https://discord.gg/testdriver)
266
+ - 🐛 [Report Issues](https://github.com/testdriverai/testdriverai/issues)