@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,164 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ /**
7
+ * Script to replace command references in Mintlify docs with proper links
8
+ *
9
+ * This script finds instances of command names like `hover-text`, `wait-for-text`, etc.
10
+ * and replaces them with proper Mintlify links to their documentation pages.
11
+ */
12
+
13
+ // Get all command files from the commands directory
14
+ function getCommandNames() {
15
+ const commandsDir = path.join(__dirname, "../", "commands");
16
+
17
+ if (!fs.existsSync(commandsDir)) {
18
+ console.error("Commands directory not found:", commandsDir);
19
+ process.exit(1);
20
+ }
21
+
22
+ const files = fs.readdirSync(commandsDir);
23
+ const commands = files
24
+ .filter((file) => file.endsWith(".mdx"))
25
+ .map((file) => file.replace(".mdx", ""));
26
+
27
+ console.log("Found commands:", commands);
28
+ return commands;
29
+ }
30
+
31
+ // Process a single file
32
+ function processFile(filePath, commands) {
33
+ const content = fs.readFileSync(filePath, "utf-8");
34
+ let modified = content;
35
+ let changes = 0;
36
+
37
+ commands.forEach((command) => {
38
+ // Create regex pattern to match `command-name` but not already linked commands
39
+ // This pattern looks for backtick-wrapped command names that are NOT:
40
+ // 1. Already inside a link: [` or preceded by ]( or ](/
41
+ // 2. Part of an existing link structure
42
+ const pattern = new RegExp(
43
+ `(?<!\\[)\`(${command.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")})\`(?!\\]\\(|\\)\\]|\\]\\(/commands/)`,
44
+ "g",
45
+ );
46
+
47
+ const replacement = `[\`$1\`](/commands/$1)`;
48
+ const newContent = modified.replace(pattern, replacement);
49
+
50
+ if (newContent !== modified) {
51
+ const matchCount = (modified.match(pattern) || []).length;
52
+ console.log(` - Replaced ${matchCount} instances of \`${command}\``);
53
+ changes += matchCount;
54
+ modified = newContent;
55
+ }
56
+ });
57
+
58
+ return { content: modified, changes };
59
+ }
60
+
61
+ // Process all .mdx files in a directory recursively
62
+ function processDirectory(dirPath, commands, exclude = []) {
63
+ const items = fs.readdirSync(dirPath);
64
+ let totalChanges = 0;
65
+
66
+ items.forEach((item) => {
67
+ const itemPath = path.join(dirPath, item);
68
+ const relativePath = path.relative(process.cwd(), itemPath);
69
+
70
+ // Skip excluded directories
71
+ if (exclude.some((ex) => relativePath.includes(ex))) {
72
+ return;
73
+ }
74
+
75
+ const stat = fs.statSync(itemPath);
76
+
77
+ if (stat.isDirectory()) {
78
+ totalChanges += processDirectory(itemPath, commands, exclude);
79
+ } else if (item.endsWith(".mdx")) {
80
+ console.log(`Processing: ${relativePath}`);
81
+ const result = processFile(itemPath, commands);
82
+
83
+ if (result.changes > 0) {
84
+ fs.writeFileSync(itemPath, result.content, "utf-8");
85
+ console.log(` ✅ Updated with ${result.changes} changes`);
86
+ totalChanges += result.changes;
87
+ } else {
88
+ console.log(` ⏭️ No changes needed`);
89
+ }
90
+ }
91
+ });
92
+
93
+ return totalChanges;
94
+ }
95
+
96
+ // Main function
97
+ function main() {
98
+ console.log("🚀 Starting TestDriver AI docs link replacer...\n");
99
+
100
+ // Get command names from the commands directory
101
+ const commands = getCommandNames();
102
+
103
+ if (commands.length === 0) {
104
+ console.log("No commands found. Exiting.");
105
+ return;
106
+ }
107
+
108
+ console.log(`\n📝 Processing documentation files...\n`);
109
+
110
+ // Process all .mdx files in the docs directory, excluding the commands directory itself
111
+ const docsDir = path.join(__dirname, "../");
112
+ const exclude = ["commands"]; // Don't modify the command docs themselves
113
+
114
+ const totalChanges = processDirectory(docsDir, commands, exclude);
115
+
116
+ console.log(`\n✨ Complete! Made ${totalChanges} total replacements.`);
117
+
118
+ if (totalChanges > 0) {
119
+ console.log("\n📋 Summary:");
120
+ console.log(
121
+ "- Command references like `hover-text` have been replaced with [`hover-text`](/commands/hover-text)",
122
+ );
123
+ console.log("- Only changed files that needed updates");
124
+ console.log(
125
+ "- Excluded the /commands directory to avoid self-referencing issues",
126
+ );
127
+ console.log("\nYou may want to review the changes before committing.");
128
+ } else {
129
+ console.log("\n🎉 All files are already properly linked!");
130
+ }
131
+ }
132
+
133
+ // Handle command line arguments
134
+ if (process.argv.includes("--help") || process.argv.includes("-h")) {
135
+ console.log(`
136
+ TestDriver AI Documentation Link Replacer
137
+
138
+ Usage: node link-replacer.js [options]
139
+
140
+ Options:
141
+ --help, -h Show this help message
142
+ --dry-run Show what would be changed without making actual changes (TODO)
143
+
144
+ Description:
145
+ This script finds command references like \`hover-text\` in your Mintlify
146
+ documentation and replaces them with proper links to the command reference
147
+ pages like [\`hover-text\`](/commands/hover-text).
148
+
149
+ The script:
150
+ - Scans all .mdx files in the /docs directory
151
+ - Excludes the /commands directory to avoid self-references
152
+ - Only replaces \`command-name\` patterns that aren't already linked
153
+ - Preserves existing links and formatting
154
+ `);
155
+ process.exit(0);
156
+ }
157
+
158
+ // Run the script
159
+ try {
160
+ main();
161
+ } catch (error) {
162
+ console.error("❌ Error:", error.message);
163
+ process.exit(1);
164
+ }
@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const OpenAI = require("openai");
6
+ const { glob } = require("glob");
7
+
8
+ // Configuration
9
+ const DOCS_DIR = path.join(__dirname, "docs");
10
+ const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
11
+ const VECTOR_STORE_NAME = "testdriverai-docs";
12
+
13
+ if (!OPENAI_API_KEY) {
14
+ console.error("Error: OPENAI_API_KEY environment variable is required");
15
+ process.exit(1);
16
+ }
17
+
18
+ // Initialize OpenAI client
19
+ const openai = new OpenAI({
20
+ apiKey: OPENAI_API_KEY,
21
+ });
22
+
23
+ /**
24
+ * Parse MDX file to extract frontmatter and content
25
+ */
26
+ function parseMdxFile(filePath) {
27
+ const content = fs.readFileSync(filePath, "utf8");
28
+
29
+ // Extract frontmatter
30
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
31
+
32
+ if (!frontmatterMatch) {
33
+ return {
34
+ metadata: {},
35
+ content: content,
36
+ title: path.basename(filePath, ".mdx"),
37
+ filePath: path.relative(DOCS_DIR, filePath),
38
+ };
39
+ }
40
+
41
+ const frontmatter = frontmatterMatch[1];
42
+ const mainContent = frontmatterMatch[2];
43
+
44
+ // Parse frontmatter (simple YAML-like parsing)
45
+ const metadata = {};
46
+ frontmatter.split("\n").forEach((line) => {
47
+ const match = line.match(/^([^:]+):\s*"?([^"]*)"?$/);
48
+ if (match) {
49
+ metadata[match[1].trim()] = match[2].trim();
50
+ }
51
+ });
52
+
53
+ return {
54
+ metadata,
55
+ content: mainContent,
56
+ title: metadata.title || path.basename(filePath, ".mdx"),
57
+ filePath: path.relative(DOCS_DIR, filePath),
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Get all MDX files in the docs directory
63
+ */
64
+ async function getAllMdxFiles() {
65
+ const pattern = path.join(DOCS_DIR, "**/*.mdx");
66
+ const files = await glob(pattern);
67
+ return files;
68
+ }
69
+
70
+ /**
71
+ * Create a vector store
72
+ */
73
+ async function createVectorStore() {
74
+ try {
75
+ const vectorStore = await openai.vectorStores.create({
76
+ name: VECTOR_STORE_NAME,
77
+ expires_after: {
78
+ anchor: "last_active_at",
79
+ days: 365,
80
+ },
81
+ });
82
+
83
+ console.log(`✅ Created vector store: ${vectorStore.id}`);
84
+ return vectorStore;
85
+ } catch (error) {
86
+ console.error("Error creating vector store:", error);
87
+ throw error;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Upload a single file to the vector store
93
+ */
94
+ async function uploadSingleFile(vectorStoreId, file) {
95
+ try {
96
+ console.log(`📁 Processing: ${file.filePath}`);
97
+
98
+ // Create a temporary file with processed content
99
+ const tempFilePath = `/tmp/testdriverai-${Date.now()}-${Math.random()}-${path.basename(file.filePath)}.txt`;
100
+
101
+ // Format the content for better vector search
102
+ const formattedContent = `Title: ${file.title}
103
+ File: ${file.filePath}
104
+ ${file.metadata.description ? `Description: ${file.metadata.description}` : ""}
105
+ ${file.metadata.sidebarTitle ? `Sidebar Title: ${file.metadata.sidebarTitle}` : ""}
106
+
107
+ ${file.content}`;
108
+
109
+ fs.writeFileSync(tempFilePath, formattedContent);
110
+
111
+ // Upload to OpenAI and add to vector store
112
+ const vectorStoreFile = await openai.vectorStores.files.createAndPoll(
113
+ vectorStoreId,
114
+ {
115
+ file_id: (
116
+ await openai.files.create({
117
+ file: fs.createReadStream(tempFilePath),
118
+ purpose: "assistants",
119
+ })
120
+ ).id,
121
+ },
122
+ );
123
+
124
+ // Clean up temp file
125
+ fs.unlinkSync(tempFilePath);
126
+
127
+ console.log(`✅ Uploaded: ${file.title} (${vectorStoreFile.id})`);
128
+
129
+ return {
130
+ vectorStoreFileId: vectorStoreFile.id,
131
+ originalPath: file.filePath,
132
+ title: file.title,
133
+ };
134
+ } catch (error) {
135
+ console.error(`❌ Error uploading ${file.filePath}:`, error);
136
+ return null;
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Upload files to the vector store in parallel
142
+ */
143
+ async function uploadFilesToVectorStore(vectorStoreId, files) {
144
+ console.log(`📤 Uploading ${files.length} files in parallel...`);
145
+
146
+ // Process files in parallel with a concurrency limit
147
+ const BATCH_SIZE = 10; // Process 10 files at a time to avoid overwhelming the API
148
+ const uploadedFiles = [];
149
+
150
+ for (let i = 0; i < files.length; i += BATCH_SIZE) {
151
+ const batch = files.slice(i, i + BATCH_SIZE);
152
+ console.log(
153
+ `Processing batch ${Math.floor(i / BATCH_SIZE) + 1}/${Math.ceil(files.length / BATCH_SIZE)} (${batch.length} files)`,
154
+ );
155
+
156
+ const batchPromises = batch.map((file) =>
157
+ uploadSingleFile(vectorStoreId, file),
158
+ );
159
+ const batchResults = await Promise.all(batchPromises);
160
+
161
+ // Filter out failed uploads (null results)
162
+ const successfulUploads = batchResults.filter((result) => result !== null);
163
+ uploadedFiles.push(...successfulUploads);
164
+
165
+ console.log(
166
+ `✅ Batch complete: ${successfulUploads.length}/${batch.length} files uploaded successfully`,
167
+ );
168
+ }
169
+
170
+ return uploadedFiles;
171
+ }
172
+
173
+ /**
174
+ * Wait for vector store to be ready
175
+ */
176
+ async function waitForVectorStoreReady(vectorStoreId) {
177
+ console.log("⏳ Waiting for vector store to process files...");
178
+
179
+ let attempts = 0;
180
+ const maxAttempts = 30;
181
+
182
+ while (attempts < maxAttempts) {
183
+ try {
184
+ const vectorStore = await openai.vectorStores.retrieve(vectorStoreId);
185
+
186
+ if (vectorStore.status === "completed") {
187
+ console.log("✅ Vector store is ready!");
188
+ return vectorStore;
189
+ }
190
+
191
+ if (vectorStore.status === "failed") {
192
+ throw new Error("Vector store processing failed");
193
+ }
194
+
195
+ console.log(
196
+ `⏳ Status: ${vectorStore.status}, Files: ${vectorStore.file_counts.completed}/${vectorStore.file_counts.total}`,
197
+ );
198
+
199
+ await new Promise((resolve) => setTimeout(resolve, 2000));
200
+ attempts++;
201
+ } catch (error) {
202
+ console.error("Error checking vector store status:", error);
203
+ attempts++;
204
+ await new Promise((resolve) => setTimeout(resolve, 2000));
205
+ }
206
+ }
207
+
208
+ throw new Error("Timeout waiting for vector store to be ready");
209
+ }
210
+
211
+ /**
212
+ * Main function
213
+ */
214
+ async function main() {
215
+ try {
216
+ console.log(
217
+ "🚀 Starting TestDriver.ai docs upload to OpenAI Vector Store...\n",
218
+ );
219
+
220
+ // Get all MDX files
221
+ console.log("📂 Finding MDX files...");
222
+ const mdxFilePaths = await getAllMdxFiles();
223
+ console.log(`Found ${mdxFilePaths.length} MDX files\n`);
224
+
225
+ // Parse all MDX files
226
+ console.log("📝 Parsing MDX files...");
227
+ const parsedFiles = mdxFilePaths.map((filePath) => parseMdxFile(filePath));
228
+ console.log(`Parsed ${parsedFiles.length} files\n`);
229
+
230
+ // Create vector store
231
+ console.log("🗂️ Creating vector store...");
232
+ const vectorStore = await createVectorStore();
233
+ console.log("");
234
+
235
+ // Upload files to vector store
236
+ console.log("📤 Uploading files to OpenAI Vector Store...");
237
+ const uploadedFiles = await uploadFilesToVectorStore(
238
+ vectorStore.id,
239
+ parsedFiles,
240
+ );
241
+ console.log("");
242
+
243
+ // Wait for processing
244
+ await waitForVectorStoreReady(vectorStore.id);
245
+
246
+ console.log("\n🎉 Upload complete!");
247
+ console.log(`Vector Store ID: ${vectorStore.id}`);
248
+ console.log(`Files uploaded: ${uploadedFiles.length}`);
249
+ console.log(
250
+ "\nYou can now use this vector store ID in your OpenAI Assistant or for retrieval.",
251
+ );
252
+
253
+ // Save results to file
254
+ const results = {
255
+ vectorStoreId: vectorStore.id,
256
+ uploadedFiles: uploadedFiles,
257
+ timestamp: new Date().toISOString(),
258
+ };
259
+
260
+ fs.writeFileSync(
261
+ path.join(__dirname, "openai-vector-store-results.json"),
262
+ JSON.stringify(results, null, 2),
263
+ );
264
+
265
+ console.log("\n📄 Results saved to openai-vector-store-results.json");
266
+ } catch (error) {
267
+ console.error("\n❌ Error:", error);
268
+ process.exit(1);
269
+ }
270
+ }
271
+
272
+ // Run the script
273
+ if (require.main === module) {
274
+ main();
275
+ }
276
+
277
+ module.exports = {
278
+ main,
279
+ parseMdxFile,
280
+ getAllMdxFiles,
281
+ createVectorStore,
282
+ uploadSingleFile,
283
+ uploadFilesToVectorStore,
284
+ };
@@ -0,0 +1,161 @@
1
+ ---
2
+ title: "Changelog"
3
+ description: "Product updates and announcements"
4
+ rss: true
5
+ icon: "code-compare"
6
+ ---
7
+
8
+ <Update label="v7.8.0-test.22" description="March 2026" tags={["test"]}>
9
+
10
+ Releases test.11 through test.22 include version bumps and internal CI improvements across all packages. No new user-facing changes — see [v7.8.0-test.10](#v780-test10) for the latest updates in this release stream.
11
+
12
+ </Update>
13
+
14
+ <Update label="v7.8.0-test.10" description="March 2026" tags={["test"]}>
15
+
16
+ 🔧 Improvements
17
+
18
+ - **Parallel test concurrency** — Concurrency limits are now enforced with atomic slot tracking, eliminating a race condition where multiple tests launching at the same time could all bypass the limit. If you hit your concurrency cap, the SDK waits and retries automatically.
19
+ - **Dashboard access for all plans** — Test recordings and metrics on the [dashboard](https://console.testdriver.ai) are now visible to all users, including those on the Free plan.
20
+ - **Sandbox message throttling** — High-frequency interactions no longer risk hitting connection limits. The SDK automatically paces outgoing messages during fast command sequences.
21
+ - **Windows Dashcam stability** — Web log tracking on Windows sandboxes now handles errors gracefully instead of failing the test.
22
+
23
+ </Update>
24
+
25
+ <Update label="v7.8.0-test.9" description="March 2026" tags={["test"]}>
26
+
27
+ 🔧 Improvements
28
+
29
+ - **Stable release promotion** — Fixed an issue where promoting a test or canary release to stable could be incorrectly skipped. Stable releases now proceed reliably regardless of the prior pre-release channel.
30
+ - **Example docs sync** — Example documentation now updates more reliably, continuing even when individual example tests fail so that passing examples still get refreshed.
31
+
32
+ </Update>
33
+
34
+ <Update label="v7.8.0-test.8" description="March 2026" tags={["test"]}>
35
+
36
+ 🔧 Improvements
37
+
38
+ - **VS Code environment switching** — The TestDriver VS Code extension now includes a status bar indicator and a new **TestDriver: Switch Environment** command. You can switch between stable, canary, and test environments directly from VS Code, and your MCP server configuration updates automatically.
39
+ - **Plan rename: Starter → Pro** — The "Starter" plan has been renamed to **Pro**. No changes to pricing or features — just a clearer name. The "Self-Hosted" tier is now labeled **Enterprise**.
40
+ - **SDK network resilience** — API requests now automatically retry on transient server errors (500, 502, 503, 504) with exponential backoff, reducing flaky test failures caused by brief infrastructure hiccups.
41
+ - **Pricing page refresh** — The [hosted plans page](/v7/hosted) now shows plan cards with included minutes, concurrency limits, and pricing at a glance.
42
+
43
+ 📚 Docs updates
44
+
45
+ - **Quickstart redesign** — The [quickstart](/v7/quickstart) now has tabbed setup paths for CLI, GitHub Copilot, and manual installation.
46
+ - **Deployment section** — "Cloud" is now [Hosted](/v7/hosted) and the previous Enterprise page has been consolidated into [Self-Hosted](/v7/self-hosted), which covers both standard and air-gapped deployments.
47
+
48
+ </Update>
49
+
50
+ <Update label="v7.8.0-test.7" description="March 2026" tags={["test"]}>
51
+ This release includes all changes from v7.8.0-test.6 with version bumps across all packages. No additional user-facing changes.
52
+ </Update>
53
+
54
+ <Update label="v7.8.0-test.6" description="March 2026" tags={["test"]}>
55
+
56
+ 🔧 Improvements
57
+
58
+ - **Sandbox spawning reliability** — Sandbox creation now uses a 3-minute timeout to handle slow infrastructure, then immediately switches to a 60-second orphan timeout for fast cleanup. This reduces sandbox creation failures during high-traffic periods.
59
+ - **Command deadline timeouts** — Sandbox commands now enforce a hard deadline that terminates execution if the connection drops mid-command, preventing tests from hanging indefinitely.
60
+ - **Real-time channel cleanup** — Fixed a compatibility issue with the real-time messaging layer that could cause channel cleanup to fail during shutdown.
61
+ - **Dashboard timestamp tooltips** — Extended UTC date tooltips to the test history sidebar. Hovering over any relative timestamp (e.g., "5 minutes ago") across the [dashboard](https://console.testdriver.ai) now shows the full UTC date and time.
62
+
63
+ </Update>
64
+
65
+ <Update label="v7.8.0-test.4" description="March 2026" tags={["test"]}>
66
+
67
+ ✨ New features
68
+
69
+ - **[GitHub Copilot integration](/v7/copilot/setup)** — Use TestDriver directly from GitHub Copilot in VS Code. The new MCP server lets Copilot launch sandboxes, interact with elements, and run assertions through natural language. Includes guides for [creating tests](/v7/copilot/creating-tests), [running tests](/v7/copilot/running-tests), [GitHub Actions integration](/v7/copilot/github), and [auto-healing](/v7/copilot/auto-healing).
70
+
71
+ 🔧 Improvements
72
+
73
+ - **Sandbox reliability** — Linux sandboxes now use a longer creation timeout to handle slow infrastructure, then immediately switch to a short orphan timeout for fast cleanup of disconnected sessions.
74
+ - **Command execution timeouts** — Sandbox commands now have deadline timeouts that prevent hangs if the connection drops mid-execution.
75
+ - **Real-time connection stability** — Updated the real-time messaging layer for better compatibility and more reliable channel cleanup during shutdown.
76
+ - **Dashboard date display** — Hovering over relative timestamps (e.g., "5 minutes ago") now shows the full UTC date and time.
77
+
78
+ </Update>
79
+
80
+ <Update label="v7.8.0-canary.5" description="March 2026" tags={["canary"]}>
81
+ This release includes all changes from v7.8.0-canary.4 with version bumps.
82
+
83
+ ✨ New features
84
+
85
+ - **[Cache API](/v7/cache)** — Speed up repeated test runs with screenshot-based caching. The system compares screenshots to cached results and reuses element positions when the screen hasn't changed, reducing AI calls.
86
+ - **[Custom error classes](/v7/errors)** — New `ElementNotFoundError` and `AIError` classes with rich debugging info including screenshot paths, pixel diffs, and detailed messages.
87
+ - **[Events system](/v7/events)** — Listen to SDK lifecycle events with wildcard support via `testdriver.emitter`. Uses colon-delimited namespaces (e.g., `command:start`, `log:*`).
88
+ - **[Provision API](/v7/provision)** — Launch browsers, desktop apps, VS Code, and Chrome extensions in your sandbox before tests run. Access via `testdriver.provision.*`.
89
+ - **[Redraw detection](/v7/redraw)** — Wait for screens to stabilize after interactions using two-phase detection with pixel comparison and z-score analysis.
90
+ - **[Screenshots API](/v7/screenshots)** — Capture screenshots manually with `testdriver.screenshot()` or automatically before/after every command.
91
+
92
+ 📚 New examples
93
+
94
+ - [Exec output](/v7/examples/exec-output) — Capture and use output from PowerShell commands
95
+ - [Exec PowerShell](/v7/examples/exec-pwsh) — Generate dynamic data with PowerShell
96
+ - [Focus window](/v7/examples/focus-window) — Switch focus between application windows
97
+
98
+ 🔧 Improvements
99
+
100
+ - Improved console URL mapping for canary and test environments
101
+ - Enhanced Ably channel cleanup for better resource management
102
+ - Updated release workflow with improved changelog generation
103
+ </Update>
104
+
105
+ <Update label="v7.5.26" description="March 2026" tags={["stable"]}>
106
+ 🚀 Stable release
107
+
108
+ This release promotes v7.5.25 to stable with deployment channel improvements.
109
+
110
+ ✨ Features
111
+
112
+ - **Deployment channels** — SDK now supports stable and canary release channels. Stable releases use the `latest` npm tag, while canary releases use the `canary` tag. Install canary with `npm install testdriverai@canary`.
113
+
114
+ 🔧 Improvements
115
+
116
+ - Improved cache hit debugging and logging
117
+ - Enhanced element location reliability
118
+ - Better error handling during test execution
119
+
120
+ 🐛 Bug fixes
121
+
122
+ - Fixed restart behavior during auto-updates
123
+ - Fixed console URL routing for various environments
124
+
125
+ <Note>
126
+ This release includes changes from v7.5.17 through v7.5.25.
127
+ </Note>
128
+ </Update>
129
+
130
+ <Update label="v7.5.25" description="March 2026" tags={["stable"]}>
131
+ 🐛 Bug fixes
132
+
133
+ - Fixed restart update behavior
134
+ </Update>
135
+
136
+ <Update label="v7.5.24" description="March 2026" tags={["stable"]}>
137
+ 🔧 Improvements
138
+
139
+ - Disabled auto-update restart to improve CI stability
140
+ </Update>
141
+
142
+ <Update label="v7.5.22" description="March 2026" tags={["stable"]}>
143
+ 🔧 Improvements
144
+
145
+ - Added markdown-to-HTML rendering for marketing content
146
+ </Update>
147
+
148
+ <Update label="v7.5.19" description="March 2026" tags={["stable"]}>
149
+ 🔧 Improvements
150
+
151
+ - Enhanced debugging output for cache hits
152
+ - Improved element location reliability
153
+ </Update>
154
+
155
+ <Update label="v7.5.17" description="March 2026" tags={["stable"]}>
156
+ 🔧 Improvements
157
+
158
+ - Improved codespace scaling and development environment setup
159
+ - Updated VS Code extension version
160
+ </Update>
161
+