testdriverai 7.2.64 → 7.2.69

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 (369) hide show
  1. package/agent/index.js +4 -3
  2. package/agent/interface.js +11 -251
  3. package/agent/lib/debugger-server.js +2 -1
  4. package/agent/lib/logger.js +56 -0
  5. package/agent/lib/sandbox.js +6 -7
  6. package/ai/agents/test-writer.md +457 -0
  7. package/{docs/v7/ai.mdx → ai/skills/testdriver:ai/SKILL.md} +3 -5
  8. package/{docs/v7/assert.mdx → ai/skills/testdriver:assert/SKILL.md} +3 -4
  9. package/{docs/v7/aws-setup.mdx → ai/skills/testdriver:aws-setup/SKILL.md} +3 -4
  10. package/{docs/v7/caching.mdx → ai/skills/testdriver:caching/SKILL.md} +3 -7
  11. package/{docs/v7/captcha.mdx → ai/skills/testdriver:captcha/SKILL.md} +4 -5
  12. package/{docs/v7/ci-cd.mdx → ai/skills/testdriver:ci-cd/SKILL.md} +3 -4
  13. package/{docs/v7/click.mdx → ai/skills/testdriver:click/SKILL.md} +3 -4
  14. package/{docs/v7/client.mdx → ai/skills/testdriver:client/SKILL.md} +11 -5
  15. package/{docs/v7/cloud.mdx → ai/skills/testdriver:cloud/SKILL.md} +3 -4
  16. package/{docs/v7/customizing-devices.mdx → ai/skills/testdriver:customizing-devices/SKILL.md} +36 -26
  17. package/{docs/v7/dashcam.mdx → ai/skills/testdriver:dashcam/SKILL.md} +3 -4
  18. package/{docs/v7/device-config.mdx → ai/skills/testdriver:device-config/SKILL.md} +3 -3
  19. package/{docs/v7/double-click.mdx → ai/skills/testdriver:double-click/SKILL.md} +3 -3
  20. package/{docs/v7/elements.mdx → ai/skills/testdriver:elements/SKILL.md} +3 -4
  21. package/{docs/v7/enterprise.mdx → ai/skills/testdriver:enterprise/SKILL.md} +3 -5
  22. package/ai/skills/testdriver:examples/SKILL.md +7 -0
  23. package/{docs/v7/exec.mdx → ai/skills/testdriver:exec/SKILL.md} +3 -4
  24. package/{docs/v7/find.mdx → ai/skills/testdriver:find/SKILL.md} +81 -4
  25. package/{docs/v7/focus-application.mdx → ai/skills/testdriver:focus-application/SKILL.md} +3 -4
  26. package/{docs/v7/generating-tests.mdx → ai/skills/testdriver:generating-tests/SKILL.md} +3 -3
  27. package/{docs/v7/hover.mdx → ai/skills/testdriver:hover/SKILL.md} +3 -4
  28. package/{docs/v7/locating-elements.mdx → ai/skills/testdriver:locating-elements/SKILL.md} +3 -3
  29. package/{docs/v7/making-assertions.mdx → ai/skills/testdriver:making-assertions/SKILL.md} +3 -3
  30. package/ai/skills/testdriver:mcp-workflow/SKILL.md +410 -0
  31. package/{docs/v7/mouse-down.mdx → ai/skills/testdriver:mouse-down/SKILL.md} +3 -3
  32. package/{docs/v7/mouse-up.mdx → ai/skills/testdriver:mouse-up/SKILL.md} +3 -3
  33. package/{docs/v7/performing-actions.mdx → ai/skills/testdriver:performing-actions/SKILL.md} +3 -3
  34. package/{docs/v7/press-keys.mdx → ai/skills/testdriver:press-keys/SKILL.md} +3 -4
  35. package/{docs/v7/quickstart.mdx → ai/skills/testdriver:quickstart/SKILL.md} +3 -4
  36. package/{docs/v7/reusable-code.mdx → ai/skills/testdriver:reusable-code/SKILL.md} +3 -3
  37. package/{docs/v7/right-click.mdx → ai/skills/testdriver:right-click/SKILL.md} +3 -3
  38. package/{docs/v7/running-tests.mdx → ai/skills/testdriver:running-tests/SKILL.md} +3 -3
  39. package/{docs/v7/screenshot.mdx → ai/skills/testdriver:screenshot/SKILL.md} +3 -4
  40. package/{docs/v7/scroll.mdx → ai/skills/testdriver:scroll/SKILL.md} +3 -4
  41. package/{docs/v7/secrets.mdx → ai/skills/testdriver:secrets/SKILL.md} +3 -3
  42. package/{docs/v7/self-hosted.mdx → ai/skills/testdriver:self-hosted/SKILL.md} +3 -4
  43. package/ai/skills/testdriver:testdriver/SKILL.md +31 -0
  44. package/{docs/v7/type.mdx → ai/skills/testdriver:type/SKILL.md} +3 -4
  45. package/{docs/v7/variables.mdx → ai/skills/testdriver:variables/SKILL.md} +3 -3
  46. package/{docs/v7/waiting-for-elements.mdx → ai/skills/testdriver:waiting-for-elements/SKILL.md} +3 -3
  47. package/{docs/v7/what-is-testdriver.mdx → ai/skills/testdriver:what-is-testdriver/SKILL.md} +3 -3
  48. package/interfaces/cli/commands/init.js +278 -1
  49. package/interfaces/cli/commands/setup.js +382 -0
  50. package/interfaces/vitest-plugin.mjs +190 -122
  51. package/lib/sentry.js +4 -3
  52. package/lib/vitest/hooks.mjs +70 -16
  53. package/mcp-server/dist/codegen.d.ts +9 -0
  54. package/mcp-server/dist/codegen.js +165 -0
  55. package/mcp-server/dist/mcp-app.html +114 -0
  56. package/mcp-server/dist/provision-types.d.ts +290 -0
  57. package/mcp-server/dist/provision-types.js +174 -0
  58. package/mcp-server/dist/server.d.ts +6 -0
  59. package/mcp-server/dist/server.js +1441 -0
  60. package/mcp-server/dist/session.d.ts +85 -0
  61. package/mcp-server/dist/session.js +152 -0
  62. package/package.json +30 -9
  63. package/sdk.d.ts +29 -2
  64. package/sdk.js +1 -0
  65. package/.env.example +0 -4
  66. package/.github/workflows/acceptance-linux-scheduled.yaml +0 -45
  67. package/.github/workflows/acceptance-windows-scheduled.yaml +0 -54
  68. package/.github/workflows/acceptance.yaml +0 -87
  69. package/.github/workflows/publish.yaml +0 -68
  70. package/.github/workflows/test-init.yml +0 -145
  71. package/.github/workflows/testdriver.yml +0 -170
  72. package/.github/workflows/windows-self-hosted.yaml +0 -82
  73. package/.prettierignore +0 -4
  74. package/.prettierrc +0 -1
  75. package/CHANGELOG.md +0 -34
  76. package/agents.md +0 -455
  77. package/debugger/bg.png +0 -0
  78. package/debugger/icon.png +0 -0
  79. package/debugger/index.html +0 -797
  80. package/debugger/td.png +0 -0
  81. package/debugger/tray-buffered.png +0 -0
  82. package/debugger/tray.png +0 -0
  83. package/docs/GITHUB_COMMENTS.md +0 -330
  84. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +0 -167
  85. package/docs/QUICK-START-GITHUB-COMMENTS.md +0 -84
  86. package/docs/TEST-GITHUB-COMMENTS.md +0 -129
  87. package/docs/_scripts/link-replacer.js +0 -164
  88. package/docs/_scripts/upload-docs-to-openai.js +0 -284
  89. package/docs/docs.json +0 -393
  90. package/docs/github-integration-setup.md +0 -266
  91. package/docs/guide/best-practices-polling.mdx +0 -154
  92. package/docs/images/content/account/newprojectsettings.png +0 -0
  93. package/docs/images/content/account/projectpage.png +0 -0
  94. package/docs/images/content/account/projectreplays.png +0 -0
  95. package/docs/images/content/account/team-manage.png +0 -0
  96. package/docs/images/content/account/teampage.png +0 -0
  97. package/docs/images/content/extension/cursor.svg +0 -1
  98. package/docs/images/content/extension/vscode.svg +0 -57
  99. package/docs/images/content/extension/windsurf.svg +0 -3
  100. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  101. package/docs/images/content/side-by-side.png +0 -0
  102. package/docs/images/content/vscode/ide-full.png +0 -0
  103. package/docs/images/content/vscode/running.png +0 -0
  104. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  105. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  106. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  107. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  108. package/docs/images/content/vscode/vscode-install.png +0 -0
  109. package/docs/images/content/vscode/vscode-overview.png +0 -0
  110. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  111. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  112. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  113. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  114. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  115. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  116. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  117. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  118. package/docs/images/template/dark.png +0 -0
  119. package/docs/images/template/icon.png +0 -0
  120. package/docs/images/template/light.png +0 -0
  121. package/docs/snippets/calendar-link.mdx +0 -4
  122. package/docs/snippets/gitignore-warning.mdx +0 -7
  123. package/docs/snippets/lifecycle-warning.mdx +0 -6
  124. package/docs/snippets/test-prereqs.mdx +0 -12
  125. package/docs/snippets/tests/assert-replay.mdx +0 -7
  126. package/docs/snippets/tests/assert-yaml.mdx +0 -8
  127. package/docs/snippets/tests/exec-js-replay.mdx +0 -7
  128. package/docs/snippets/tests/exec-js-yaml.mdx +0 -32
  129. package/docs/snippets/tests/exec-shell-replay.mdx +0 -7
  130. package/docs/snippets/tests/exec-shell-yaml.mdx +0 -15
  131. package/docs/snippets/tests/hover-image-replay.mdx +0 -7
  132. package/docs/snippets/tests/hover-image-yaml.mdx +0 -17
  133. package/docs/snippets/tests/hover-text-replay.mdx +0 -7
  134. package/docs/snippets/tests/hover-text-with-description-replay.mdx +0 -7
  135. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +0 -24
  136. package/docs/snippets/tests/hover-text-yaml.mdx +0 -14
  137. package/docs/snippets/tests/match-image-replay.mdx +0 -7
  138. package/docs/snippets/tests/match-image-yaml.mdx +0 -17
  139. package/docs/snippets/tests/press-keys-replay.mdx +0 -7
  140. package/docs/snippets/tests/press-keys-yaml.mdx +0 -36
  141. package/docs/snippets/tests/remember-replay.mdx +0 -7
  142. package/docs/snippets/tests/remember-yaml.mdx +0 -28
  143. package/docs/snippets/tests/scroll-replay.mdx +0 -7
  144. package/docs/snippets/tests/scroll-until-image-replay.mdx +0 -7
  145. package/docs/snippets/tests/scroll-until-image-yaml.mdx +0 -14
  146. package/docs/snippets/tests/scroll-until-text-replay.mdx +0 -7
  147. package/docs/snippets/tests/scroll-until-text-yaml.mdx +0 -17
  148. package/docs/snippets/tests/scroll-yaml.mdx +0 -30
  149. package/docs/snippets/tests/type-repeated-replay.mdx +0 -7
  150. package/docs/snippets/tests/type-repeated-yaml.mdx +0 -22
  151. package/docs/snippets/tests/type-replay.mdx +0 -7
  152. package/docs/snippets/tests/type-yaml.mdx +0 -28
  153. package/docs/snippets/tests/wait-for-image-replay.mdx +0 -7
  154. package/docs/snippets/tests/wait-for-image-yaml.mdx +0 -18
  155. package/docs/snippets/tests/wait-for-text-replay.mdx +0 -7
  156. package/docs/snippets/tests/wait-for-text-yaml.mdx +0 -18
  157. package/docs/snippets/tests/wait-replay.mdx +0 -7
  158. package/docs/snippets/tests/wait-yaml.mdx +0 -13
  159. package/docs/styles.css +0 -65
  160. package/docs/v6/account/dashboard.mdx +0 -16
  161. package/docs/v6/account/enterprise.mdx +0 -110
  162. package/docs/v6/account/pricing.mdx +0 -33
  163. package/docs/v6/account/projects.mdx +0 -33
  164. package/docs/v6/account/team.mdx +0 -35
  165. package/docs/v6/action/ami.mdx +0 -109
  166. package/docs/v6/action/performance.mdx +0 -105
  167. package/docs/v6/action/secrets.mdx +0 -93
  168. package/docs/v6/apps/chrome-extensions.mdx +0 -48
  169. package/docs/v6/apps/desktop-apps.mdx +0 -93
  170. package/docs/v6/apps/mobile-apps.mdx +0 -26
  171. package/docs/v6/apps/static-websites.mdx +0 -54
  172. package/docs/v6/apps/tauri-apps.mdx +0 -361
  173. package/docs/v6/bugs/jira.mdx +0 -232
  174. package/docs/v6/cli/overview.mdx +0 -66
  175. package/docs/v6/commands/assert.mdx +0 -45
  176. package/docs/v6/commands/exec.mdx +0 -282
  177. package/docs/v6/commands/focus-application.mdx +0 -44
  178. package/docs/v6/commands/hover-image.mdx +0 -69
  179. package/docs/v6/commands/hover-text.mdx +0 -47
  180. package/docs/v6/commands/if.mdx +0 -53
  181. package/docs/v6/commands/match-image.mdx +0 -67
  182. package/docs/v6/commands/press-keys.mdx +0 -87
  183. package/docs/v6/commands/remember.mdx +0 -49
  184. package/docs/v6/commands/run.mdx +0 -44
  185. package/docs/v6/commands/scroll-until-image.mdx +0 -66
  186. package/docs/v6/commands/scroll-until-text.mdx +0 -60
  187. package/docs/v6/commands/scroll.mdx +0 -69
  188. package/docs/v6/commands/type.mdx +0 -45
  189. package/docs/v6/commands/wait-for-image.mdx +0 -54
  190. package/docs/v6/commands/wait-for-text.mdx +0 -48
  191. package/docs/v6/commands/wait.mdx +0 -45
  192. package/docs/v6/exporting/junit.mdx +0 -218
  193. package/docs/v6/exporting/playwright.mdx +0 -197
  194. package/docs/v6/features/auto-healing.mdx +0 -144
  195. package/docs/v6/features/generation.mdx +0 -116
  196. package/docs/v6/features/parallel-testing.mdx +0 -151
  197. package/docs/v6/features/reusable-snippets.mdx +0 -131
  198. package/docs/v6/features/selectorless.mdx +0 -80
  199. package/docs/v6/features/visual-assertions.mdx +0 -139
  200. package/docs/v6/getting-started/ci.mdx +0 -146
  201. package/docs/v6/getting-started/cli.mdx +0 -91
  202. package/docs/v6/getting-started/editing.mdx +0 -100
  203. package/docs/v6/getting-started/playwright.mdx +0 -342
  204. package/docs/v6/getting-started/running.mdx +0 -48
  205. package/docs/v6/getting-started/self-hosting.mdx +0 -408
  206. package/docs/v6/getting-started/vscode.mdx +0 -89
  207. package/docs/v6/guide/assertions.mdx +0 -189
  208. package/docs/v6/guide/authentication.mdx +0 -136
  209. package/docs/v6/guide/code.mdx +0 -65
  210. package/docs/v6/guide/dashcam.mdx +0 -118
  211. package/docs/v6/guide/environment-variables.mdx +0 -26
  212. package/docs/v6/guide/lifecycle.mdx +0 -242
  213. package/docs/v6/guide/locating.mdx +0 -141
  214. package/docs/v6/guide/protips.mdx +0 -43
  215. package/docs/v6/guide/variables.mdx +0 -143
  216. package/docs/v6/guide/waiting.mdx +0 -130
  217. package/docs/v6/importing/csv.mdx +0 -196
  218. package/docs/v6/importing/gherkin.mdx +0 -143
  219. package/docs/v6/importing/jira.mdx +0 -164
  220. package/docs/v6/importing/testrail.mdx +0 -162
  221. package/docs/v6/integrations/electron.mdx +0 -146
  222. package/docs/v6/integrations/netlify.mdx +0 -100
  223. package/docs/v6/integrations/vercel.mdx +0 -125
  224. package/docs/v6/interactive/explore.mdx +0 -99
  225. package/docs/v6/interactive/run.mdx +0 -52
  226. package/docs/v6/interactive/save.mdx +0 -63
  227. package/docs/v6/overview/comparison.mdx +0 -101
  228. package/docs/v6/overview/faq.mdx +0 -162
  229. package/docs/v6/overview/performance.mdx +0 -52
  230. package/docs/v6/overview/quickstart.mdx +0 -137
  231. package/docs/v6/overview/what-is-testdriver.mdx +0 -85
  232. package/docs/v6/scenarios/ai-chatbot.mdx +0 -28
  233. package/docs/v6/scenarios/cookie-banner.mdx +0 -32
  234. package/docs/v6/scenarios/file-upload.mdx +0 -33
  235. package/docs/v6/scenarios/form-filling.mdx +0 -32
  236. package/docs/v6/scenarios/log-in.mdx +0 -75
  237. package/docs/v6/scenarios/pdf-generation.mdx +0 -25
  238. package/docs/v6/scenarios/spell-check.mdx +0 -22
  239. package/docs/v6/security/action.mdx +0 -84
  240. package/docs/v6/security/agent.mdx +0 -73
  241. package/docs/v6/security/platform.mdx +0 -77
  242. package/docs/v6/tutorials/advanced-test.mdx +0 -81
  243. package/docs/v6/tutorials/basic-test.mdx +0 -45
  244. package/docs/v7/_drafts/agents.mdx +0 -852
  245. package/docs/v7/_drafts/architecture.mdx +0 -399
  246. package/docs/v7/_drafts/auto-cache-key.mdx +0 -167
  247. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +0 -100
  248. package/docs/v7/_drafts/best-practices.mdx +0 -486
  249. package/docs/v7/_drafts/caching-ai.mdx +0 -215
  250. package/docs/v7/_drafts/caching-selectors.mdx +0 -424
  251. package/docs/v7/_drafts/caching.mdx +0 -366
  252. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +0 -425
  253. package/docs/v7/_drafts/commands/assert.mdx +0 -45
  254. package/docs/v7/_drafts/commands/exec.mdx +0 -282
  255. package/docs/v7/_drafts/commands/focus-application.mdx +0 -44
  256. package/docs/v7/_drafts/commands/hover-image.mdx +0 -69
  257. package/docs/v7/_drafts/commands/hover-text.mdx +0 -47
  258. package/docs/v7/_drafts/commands/if.mdx +0 -53
  259. package/docs/v7/_drafts/commands/match-image.mdx +0 -67
  260. package/docs/v7/_drafts/commands/press-keys.mdx +0 -87
  261. package/docs/v7/_drafts/commands/remember.mdx +0 -49
  262. package/docs/v7/_drafts/commands/run.mdx +0 -44
  263. package/docs/v7/_drafts/commands/scroll-until-image.mdx +0 -66
  264. package/docs/v7/_drafts/commands/scroll-until-text.mdx +0 -60
  265. package/docs/v7/_drafts/commands/scroll.mdx +0 -69
  266. package/docs/v7/_drafts/commands/type.mdx +0 -45
  267. package/docs/v7/_drafts/commands/wait-for-image.mdx +0 -54
  268. package/docs/v7/_drafts/commands/wait-for-text.mdx +0 -48
  269. package/docs/v7/_drafts/commands/wait.mdx +0 -45
  270. package/docs/v7/_drafts/configuration.mdx +0 -378
  271. package/docs/v7/_drafts/contributing.mdx +0 -174
  272. package/docs/v7/_drafts/core.mdx +0 -458
  273. package/docs/v7/_drafts/dashcam-title-feature.mdx +0 -89
  274. package/docs/v7/_drafts/debugging.mdx +0 -349
  275. package/docs/v7/_drafts/error-handling.mdx +0 -501
  276. package/docs/v7/_drafts/faq.mdx +0 -393
  277. package/docs/v7/_drafts/hooks.mdx +0 -360
  278. package/docs/v7/_drafts/init-command.mdx +0 -95
  279. package/docs/v7/_drafts/installation.mdx +0 -420
  280. package/docs/v7/_drafts/migration.mdx +0 -562
  281. package/docs/v7/_drafts/observable.mdx +0 -604
  282. package/docs/v7/_drafts/playwright.mdx +0 -342
  283. package/docs/v7/_drafts/plugin-migration.mdx +0 -220
  284. package/docs/v7/_drafts/powerful.mdx +0 -419
  285. package/docs/v7/_drafts/presets.mdx +0 -210
  286. package/docs/v7/_drafts/progressive-disclosure.mdx +0 -230
  287. package/docs/v7/_drafts/prompt-cache.mdx +0 -200
  288. package/docs/v7/_drafts/provision.mdx +0 -390
  289. package/docs/v7/_drafts/quick-start-test-recording.mdx +0 -214
  290. package/docs/v7/_drafts/readme.mdx +0 -135
  291. package/docs/v7/_drafts/reports.mdx +0 -414
  292. package/docs/v7/_drafts/scalable.mdx +0 -754
  293. package/docs/v7/_drafts/screenshot.mdx +0 -155
  294. package/docs/v7/_drafts/sdk-awesome-logs.mdx +0 -468
  295. package/docs/v7/_drafts/sdk-browser-rendering.mdx +0 -167
  296. package/docs/v7/_drafts/sdk-migration.mdx +0 -474
  297. package/docs/v7/_drafts/sdk-v7-complete.mdx +0 -345
  298. package/docs/v7/_drafts/self-hosting.mdx +0 -369
  299. package/docs/v7/_drafts/test-recording.mdx +0 -382
  300. package/docs/v7/_drafts/troubleshooting.mdx +0 -526
  301. package/docs/v7/_drafts/vitest-plugin.mdx +0 -477
  302. package/docs/v7/_drafts/vitest.mdx +0 -535
  303. package/docs/v7/_drafts/writing-tests.mdx +0 -25
  304. package/docs/v7/examples.mdx +0 -5
  305. package/eslint.config.js +0 -67
  306. package/examples/ai.test.mjs +0 -30
  307. package/examples/assert.test.mjs +0 -46
  308. package/examples/captcha-api.test.mjs +0 -50
  309. package/examples/chrome-extension.test.mjs +0 -94
  310. package/examples/drag-and-drop.test.mjs +0 -58
  311. package/examples/element-not-found.test.mjs +0 -26
  312. package/examples/exec-output.test.mjs +0 -59
  313. package/examples/exec-pwsh.test.mjs +0 -57
  314. package/examples/focus-window.test.mjs +0 -36
  315. package/examples/formatted-logging.test.mjs +0 -26
  316. package/examples/hover-image.test.mjs +0 -52
  317. package/examples/hover-text-with-description.test.mjs +0 -56
  318. package/examples/hover-text.test.mjs +0 -27
  319. package/examples/installer.test.mjs +0 -49
  320. package/examples/launch-vscode-linux.test.mjs +0 -54
  321. package/examples/match-image.test.mjs +0 -54
  322. package/examples/no-provision.test.mjs +0 -23
  323. package/examples/press-keys.test.mjs +0 -50
  324. package/examples/prompt.test.mjs +0 -33
  325. package/examples/scroll-keyboard.test.mjs +0 -37
  326. package/examples/scroll-until-image.test.mjs +0 -39
  327. package/examples/scroll-until-text.test.mjs +0 -67
  328. package/examples/scroll.test.mjs +0 -41
  329. package/examples/type.test.mjs +0 -45
  330. package/examples/windows-installer.test.mjs +0 -53
  331. package/interfaces/cli/commands/edit.js +0 -3
  332. package/interfaces/cli/commands/generate.js +0 -3
  333. package/interfaces/cli/commands/run.js +0 -3
  334. package/interfaces/cli/utils/factory.js +0 -71
  335. package/jsconfig.json +0 -26
  336. package/manual/test-init-command.js +0 -223
  337. package/sdk-log-formatter.js +0 -930
  338. package/setup/aws/cloudformation.yaml +0 -470
  339. package/setup/aws/spawn-runner.sh +0 -190
  340. package/test/api-resilience.test.mjs +0 -0
  341. package/test/captcha-solver.test.mjs +0 -70
  342. package/test/chrome-remote-debugging.test.mjs +0 -66
  343. package/test/manual/debug-locate-response.js +0 -82
  344. package/test/manual/reconnect-provision.test.mjs +0 -49
  345. package/test/manual/test-console-logs.test.mjs +0 -42
  346. package/test/manual/test-find-api.js +0 -73
  347. package/test/manual/test-init.sh +0 -54
  348. package/test/manual/test-prompt-cache.js +0 -96
  349. package/test/manual/test-provision-auth.mjs +0 -22
  350. package/test/manual/test-sandbox-render.js +0 -28
  351. package/test/manual/test-sdk-methods.js +0 -15
  352. package/test/manual/test-sdk-refactor.js +0 -53
  353. package/test/manual/test-stack-trace.mjs +0 -57
  354. package/test/manual/verify-element-api.js +0 -89
  355. package/test/manual/verify-types.js +0 -0
  356. package/test/manual-unawaited-promise.test.mjs +0 -31
  357. package/testdriver-plugin/skills/actions/SKILL.md +0 -93
  358. package/testdriver-plugin/skills/assertions/SKILL.md +0 -77
  359. package/testdriver-plugin/skills/caching/SKILL.md +0 -66
  360. package/testdriver-plugin/skills/creating-tests/SKILL.md +0 -104
  361. package/testdriver-plugin/skills/finding-elements/SKILL.md +0 -77
  362. package/testdriver-plugin/skills/github-actions/SKILL.md +0 -100
  363. package/testdriver-plugin/skills/running-tests/SKILL.md +0 -77
  364. package/testdriver-plugin/skills/secrets/SKILL.md +0 -87
  365. package/testdriver-plugin/skills/self-hosting/SKILL.md +0 -89
  366. package/testdriver-plugin/skills/setup/SKILL.md +0 -76
  367. package/testdriver-plugin/skills/variables/SKILL.md +0 -88
  368. package/testdriver-plugin/skills/waiting/SKILL.md +0 -72
  369. package/vitest.config.mjs +0 -29
package/agent/index.js CHANGED
@@ -36,6 +36,7 @@ const { createOutputs } = require("./lib/outputs.js");
36
36
  const isValidVersion = require("./lib/valid-version.js");
37
37
  const { events, createEmitter } = require("./events.js");
38
38
  const { createDebuggerProcess } = require("./lib/debugger.js");
39
+ const logger = require("./lib/logger.js");
39
40
  let debuggerProcess = null; // single debugger process for all instances. otherwise they'll fight over ports. this should be in `web` anyway
40
41
  let debuggerStarted = false;
41
42
 
@@ -987,9 +988,9 @@ commands:
987
988
  const generateDir = path.join(this.workingDir, "testdriver", "generate");
988
989
  if (!fs.existsSync(generateDir)) {
989
990
  fs.mkdirSync(generateDir);
990
- console.log("Created generate directory:", generateDir);
991
+ logger.log("Created generate directory:", generateDir);
991
992
  } else {
992
- console.log("Generate directory already exists:", generateDir);
993
+ logger.log("Generate directory already exists:", generateDir);
993
994
  }
994
995
 
995
996
  let list = testPrompt.steps;
@@ -2016,7 +2017,7 @@ ${regression}
2016
2017
  "/vnc_lite.html?token=V3b8wG9";
2017
2018
  } else {
2018
2019
  // If we don't have URL or IP, we can't render
2019
- console.warn("renderSandbox: Missing URL and IP in instance", instance);
2020
+ logger.warn("renderSandbox: Missing URL and IP in instance", instance);
2020
2021
  return;
2021
2022
  }
2022
2023
 
@@ -1,6 +1,4 @@
1
- const path = require("path");
2
1
  const { Args, Flags } = require("@oclif/core");
3
- const { events } = require("./events.js");
4
2
 
5
3
  /**
6
4
  * Creates command definitions using oclif format as the single source of truth
@@ -8,265 +6,27 @@ const { events } = require("./events.js");
8
6
  * @returns {Object} Command definitions object in oclif format
9
7
  */
10
8
  function createCommandDefinitions(agent) {
11
- const normalizeFilePath = (file) => {
12
- if (!file) {
13
- file = "testdriver/testdriver.yaml";
14
- }
15
-
16
- file = path.join(agent.workingDir, file);
17
- if (!file.endsWith(".yaml") && !file.endsWith(".yml")) {
18
- file += ".yaml";
19
- }
20
-
21
- return file;
22
- };
23
-
24
9
  return {
25
- run: {
26
- description: "Run a test file",
27
- args: {
28
- file: Args.string({
29
- description: "Test file to run",
30
- default: "testdriver/testdriver.yaml",
31
- required: false,
32
- }),
33
- },
34
- flags: {
35
- heal: Flags.boolean({
36
- description: "Enable automatic error recovery mode",
37
- default: false,
38
- }),
39
- write: Flags.boolean({
40
- description: "Save AI modifications to the test file",
41
- default: false,
42
- }),
43
- headless: Flags.boolean({
44
- description: "Run in headless mode (no GUI)",
45
- default: false,
46
- }),
47
- new: Flags.boolean({
48
- description:
49
- "Create a new sandbox instead of reconnecting to an existing one",
50
- default: false,
51
- }),
52
- "sandbox-ami": Flags.string({
53
- description: "Specify AMI ID for sandbox instance (e.g., ami-1234)",
54
- }),
55
- "sandbox-instance": Flags.string({
56
- description: "Specify EC2 instance type for sandbox (e.g., i3.metal)",
57
- }),
58
- ip: Flags.string({
59
- description:
60
- "Connect directly to a sandbox at the specified IP address",
61
- }),
62
- summary: Flags.string({
63
- description: "Specify output file for summarize results",
64
- }),
65
- junit: Flags.string({
66
- description: "Generate JUnit XML test report to specified file",
67
- default: false,
68
- }),
69
- os: Flags.string({
70
- description: "Operating system for the sandbox (windows or linux)",
71
- options: ["windows", "linux"],
72
- default: "linux",
73
- }),
74
- },
75
- handler: async (args, flags) => {
76
- // Use --path flag if provided, otherwise fall back to args.file
77
- const file = normalizeFilePath(args.file);
78
- const testStartTime = Date.now();
79
-
80
- try {
81
- await agent.runLifecycle("prerun");
82
- // When run() is called through run.js CLI command, shouldExit should be true
83
- const shouldExit = agent.cliArgs?.command === "run";
84
- await agent.run(file, flags.write, shouldExit);
85
-
86
- const testEndTime = Date.now();
87
- const testDuration = testEndTime - testStartTime;
88
-
89
- // Emit test success event for the entire test execution
90
- agent.emitter.emit(events.test.success, {
91
- filePath: file,
92
- duration: testDuration,
93
- timestamp: testEndTime,
94
- });
95
- } catch (error) {
96
- const testEndTime = Date.now();
97
- const testDuration = testEndTime - testStartTime;
98
-
99
- // Emit test error event for the entire test execution
100
- agent.emitter.emit(events.test.error, {
101
- filePath: file,
102
- error: error.message,
103
- duration: testDuration,
104
- timestamp: testEndTime,
105
- });
106
-
107
- throw error; // Re-throw to maintain existing error handling
108
- }
109
- },
110
- },
111
-
112
- edit: {
113
- description: "Edit a test file interactively",
114
- args: {
115
- file: Args.string({
116
- description: "Test file to edit",
117
- default: "testdriver/testdriver.yaml",
118
- required: false,
119
- }),
120
- },
121
- flags: {
122
- heal: Flags.boolean({
123
- description: "Enable automatic error recovery mode",
124
- default: false,
125
- }),
126
- headless: Flags.boolean({
127
- description: "Run in headless mode",
128
- default: false,
129
- }),
130
- new: Flags.boolean({
131
- description:
132
- "Create a new sandbox instead of reconnecting to an existing one",
133
- default: false,
134
- }),
135
- "sandbox-ami": Flags.string({
136
- description: "Specify AMI ID for sandbox instance (e.g., ami-1234)",
137
- }),
138
- "sandbox-instance": Flags.string({
139
- description: "Specify EC2 instance type for sandbox (e.g., i3.metal)",
140
- }),
141
- ip: Flags.string({
142
- description:
143
- "Connect directly to a sandbox at the specified IP address",
144
- }),
145
- summary: Flags.string({
146
- description: "Specify output file for summarize results",
147
- }),
148
- os: Flags.string({
149
- description: "Operating system for the sandbox (windows or linux)",
150
- options: ["windows", "linux"],
151
- default: "windows",
152
- }),
153
- },
154
- handler: async () => {
155
- // Edit mode is handled by the CLI interface via factory.js
156
- // This handler should not be called directly
157
- throw new Error("Edit mode should be handled by CLI interface");
158
- },
159
- },
160
-
161
- // Interactive commands that can be used within edit mode
162
- explore: {
163
- description: "Explore and interact with the current environment",
164
- args: {
165
- prompt: Args.string({
166
- description: "What you want to explore or do",
167
- required: false,
168
- }),
169
- },
170
- flags: {},
171
- handler: async (args) => {
172
- await agent.exploratoryLoop(args.prompt || "", false, true, true);
173
- },
174
- },
175
-
176
- save: {
177
- description: "Save the current test script",
178
- args: {
179
- filename: Args.string({
180
- description: "Optional filename to save to",
181
- required: false,
182
- }),
183
- },
184
- flags: {},
185
- handler: async (args) => {
186
- await agent.save(args.filename);
187
- },
188
- },
189
-
190
- exit: {
191
- description: "Exit the TestDriver agent",
192
- args: {},
193
- flags: {},
194
- handler: async () => {
195
- await agent.exit(false);
196
- },
197
- },
198
-
199
- help: {
200
- description: "Show help information",
201
- args: {},
202
- flags: {},
203
- handler: async () => {
204
- agent.showHelp();
205
- },
206
- },
207
-
208
- version: {
209
- description: "Show version information",
10
+ init: {
11
+ description: "Initialize a new TestDriver project with Vitest SDK examples",
210
12
  args: {},
211
13
  flags: {},
212
14
  handler: async () => {
213
- const packageJson = require("../package.json");
214
- console.log(`TestDriver.ai v${packageJson.version}`);
215
- },
216
- },
217
-
218
- generate: {
219
- description: "Generate test files based on current screen state",
220
- args: {
221
- prompt: Args.string({
222
- description: "Multi-line text prompt describing what to generate",
223
- required: false,
224
- }),
225
- },
226
- flags: {
227
- count: Flags.integer({
228
- description: "Number of test files to generate",
229
- default: 3,
230
- }),
231
- headless: Flags.boolean({
232
- description: "Run in headless mode (no GUI)",
233
- default: false,
234
- }),
235
- new: Flags.boolean({
236
- description:
237
- "Create a new sandbox instead of reconnecting to an existing one",
238
- default: false,
239
- }),
240
- "sandbox-ami": Flags.string({
241
- description: "Specify AMI ID for sandbox instance (e.g., ami-1234)",
242
- }),
243
- "sandbox-instance": Flags.string({
244
- description: "Specify EC2 instance type for sandbox (e.g., i3.metal)",
245
- }),
246
- ip: Flags.string({
247
- description:
248
- "Connect directly to a sandbox at the specified IP address",
249
- }),
250
- os: Flags.string({
251
- description: "Operating system for the sandbox (windows or linux)",
252
- options: ["windows", "linux"],
253
- default: "linux",
254
- }),
255
- },
256
- handler: async (args, flags) => {
257
- // Call generate with the count and prompt
258
- await agent.generate(flags.count || 3, args.prompt);
15
+ // This handler is special - it doesn't need an agent instance
16
+ // It just scaffolds files, so it will be handled by the CLI command
17
+ throw new Error("Init mode should be handled by CLI interface");
259
18
  },
260
19
  },
261
20
 
262
- init: {
263
- description: "Initialize a new TestDriver project with Vitest SDK examples",
21
+ "setup": {
22
+ description:
23
+ "Set up TestDriver skills, agents, and MCP server for Claude Code",
264
24
  args: {},
265
25
  flags: {},
266
26
  handler: async () => {
267
- // This handler is special - it doesn't need an agent instance
268
- // It just scaffolds files, so it will be handled by the CLI command
269
- throw new Error("Init mode should be handled by CLI interface");
27
+ throw new Error(
28
+ "setup should be handled by CLI interface",
29
+ );
270
30
  },
271
31
  },
272
32
  };
@@ -3,6 +3,7 @@ const http = require("http");
3
3
  const path = require("path");
4
4
  const fs = require("fs");
5
5
  const { eventsArray } = require("../events.js");
6
+ const logger = require("./logger");
6
7
 
7
8
  let server = null;
8
9
  let wss = null;
@@ -131,7 +132,7 @@ function stopDebugger() {
131
132
  }
132
133
 
133
134
  clients.clear();
134
- console.log("Debugger server stopped");
135
+ logger.log("Debugger server stopped");
135
136
  }
136
137
 
137
138
  module.exports = {
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Logger utility for TestDriver
3
+ *
4
+ * By default, outputs to stdout (console.log).
5
+ * When TD_STDIO=stderr is set, outputs to stderr (console.error).
6
+ * This is necessary for MCP servers which use stdout exclusively for JSON-RPC.
7
+ */
8
+
9
+ const useStderr = process.env.TD_STDIO === 'stderr';
10
+
11
+ /**
12
+ * Log a message - uses stdout by default, stderr if TD_STDIO=stderr
13
+ * @param {...any} args - Arguments to log
14
+ */
15
+ function log(...args) {
16
+ if (useStderr) {
17
+ console.error(...args);
18
+ } else {
19
+ console.log(...args);
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Log an error - always uses stderr
25
+ * @param {...any} args - Arguments to log
26
+ */
27
+ function error(...args) {
28
+ console.error(...args);
29
+ }
30
+
31
+ /**
32
+ * Log a warning - uses stdout by default, stderr if TD_STDIO=stderr
33
+ * @param {...any} args - Arguments to log
34
+ */
35
+ function warn(...args) {
36
+ if (useStderr) {
37
+ console.error(...args);
38
+ } else {
39
+ console.warn(...args);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Check if logger is configured to use stderr
45
+ * @returns {boolean}
46
+ */
47
+ function isStderrMode() {
48
+ return useStderr;
49
+ }
50
+
51
+ module.exports = {
52
+ log,
53
+ error,
54
+ warn,
55
+ isStderrMode,
56
+ };
@@ -1,6 +1,7 @@
1
1
  const WebSocket = require("ws");
2
2
  const crypto = require("crypto");
3
3
  const { events } = require("../events");
4
+ const logger = require("./logger");
4
5
 
5
6
  /**
6
7
  * Generate Sentry trace headers for distributed tracing
@@ -142,11 +143,9 @@ const createSandbox = (emitter, analytics, sessionInstance) => {
142
143
  // Log and store the Sentry trace ID for debugging
143
144
  if (reply.traceId) {
144
145
  this.traceId = reply.traceId;
145
- console.log("");
146
- console.log(`🔗 View Trace:`);
147
- console.log(
148
- `https://testdriver.sentry.io/explore/traces/trace/${reply.traceId}`,
149
- );
146
+ logger.log('');
147
+ logger.log(`🔗 View Trace:`);
148
+ logger.log(`https://testdriver.sentry.io/explore/traces/trace/${reply.traceId}`);
150
149
  }
151
150
 
152
151
  emitter.emit(events.sandbox.authenticated, { traceId: reply.traceId });
@@ -239,8 +238,8 @@ const createSandbox = (emitter, analytics, sessionInstance) => {
239
238
  });
240
239
 
241
240
  this.socket.on("error", (err) => {
242
- console.log("Socket Error");
243
- err && console.log(err);
241
+ logger.log("Socket Error");
242
+ err && logger.log(err);
244
243
  clearInterval(this.heartbeat);
245
244
  emitter.emit(events.error.sandbox, err);
246
245
  this.apiSocketConnected = false;