testdriverai 7.0.0 → 7.1.1

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 (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -0,0 +1,425 @@
1
+ # Migration Guide: v6 → v7
2
+
3
+ This guide helps you migrate from the old TestDriver API (v6) to the new SDK architecture (v7).
4
+
5
+ ## Overview
6
+
7
+ v7 introduces a **progressive disclosure** pattern with three API levels:
8
+
9
+ 1. **Presets** (Beginner) - Zero config, instant setup
10
+ 2. **Hooks** (Intermediate) - Flexible lifecycle management
11
+ 3. **Core Classes** (Advanced) - Full manual control
12
+
13
+ You can mix and match these patterns based on your needs.
14
+
15
+ ## Quick Migration Examples
16
+
17
+ ### Before (v6) - Legacy Helpers
18
+
19
+ ```javascript
20
+ import { test } from 'vitest';
21
+ import { authDashcam, startDashcam, stopDashcam } from 'testdriverai';
22
+
23
+ test('my test', async ({ client }) => {
24
+ await authDashcam(client);
25
+ await startDashcam(client);
26
+
27
+ await client.find('Login button').click();
28
+
29
+ const url = await stopDashcam(client);
30
+ console.log('Replay:', url);
31
+ });
32
+ ```
33
+
34
+ ### After (v7) - Using Presets
35
+
36
+ ```javascript
37
+ import { test } from 'vitest';
38
+ import { chromePreset } from 'testdriverai/presets';
39
+
40
+ test('my test', async (context) => {
41
+ const { client } = await chromePreset(context, {
42
+ url: 'https://myapp.com'
43
+ });
44
+
45
+ // Dashcam already running, auto-stops at test end
46
+ await client.find('Login button').click();
47
+ });
48
+ ```
49
+
50
+ ### After (v7) - Using Hooks
51
+
52
+ ```javascript
53
+ import { test } from 'vitest';
54
+ import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
55
+
56
+ test('my test', async (context) => {
57
+ const client = useTestDriver(context, { os: 'linux' });
58
+ const dashcam = useDashcam(context, client, {
59
+ autoAuth: true,
60
+ autoStart: true,
61
+ autoStop: true
62
+ });
63
+
64
+ await client.find('Login button').click();
65
+ });
66
+ ```
67
+
68
+ ### After (v7) - Using Core Classes
69
+
70
+ ```javascript
71
+ import { test } from 'vitest';
72
+ import { TestDriver, Dashcam } from 'testdriverai/core';
73
+
74
+ test('my test', async (context) => {
75
+ const client = new TestDriver(process.env.TD_API_KEY, { os: 'linux' });
76
+ const dashcam = new Dashcam(client);
77
+
78
+ await client.auth();
79
+ await client.connect();
80
+
81
+ await dashcam.auth();
82
+ await dashcam.start();
83
+
84
+ await client.find('Login button').click();
85
+
86
+ const url = await dashcam.stop();
87
+ await client.disconnect();
88
+
89
+ console.log('Replay:', url);
90
+ });
91
+ ```
92
+
93
+ ## Package Exports
94
+
95
+ v7 introduces multiple entry points for different use cases:
96
+
97
+ ```javascript
98
+ // Main SDK (unchanged)
99
+ import TestDriver from 'testdriverai';
100
+
101
+ // Core classes
102
+ import { TestDriver, Dashcam } from 'testdriverai/core';
103
+
104
+ // Vitest hooks
105
+ import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
106
+
107
+ // Presets
108
+ import { chromePreset, vscodePreset } from 'testdriverai/presets';
109
+
110
+ // Vitest plugin (unchanged)
111
+ import testDriver from 'testdriverai/vitest';
112
+ ```
113
+
114
+ ## API Changes
115
+
116
+ ### Dashcam Lifecycle Helpers (DEPRECATED)
117
+
118
+ The following functions are **deprecated** but still work for backward compatibility:
119
+
120
+ ```javascript
121
+ // ❌ OLD (still works, but deprecated)
122
+ import {
123
+ authDashcam,
124
+ addDashcamLog,
125
+ startDashcam,
126
+ stopDashcam
127
+ } from 'testdriverai';
128
+
129
+ authDashcam(client);
130
+ startDashcam(client);
131
+ stopDashcam(client);
132
+ ```
133
+
134
+ **Migrate to:**
135
+
136
+ ```javascript
137
+ // ✅ NEW - Direct class usage
138
+ import { Dashcam } from 'testdriverai/core';
139
+
140
+ const dashcam = new Dashcam(client);
141
+ await dashcam.auth();
142
+ await dashcam.start();
143
+ const url = await dashcam.stop();
144
+ ```
145
+
146
+ Or even better:
147
+
148
+ ```javascript
149
+ // ✅ NEW - Using hooks
150
+ import { useDashcam } from 'testdriverai/vitest/hooks';
151
+
152
+ const dashcam = useDashcam(context, client, {
153
+ autoAuth: true,
154
+ autoStart: true,
155
+ autoStop: true
156
+ });
157
+ ```
158
+
159
+ ### TestDriver Client Creation
160
+
161
+ **No changes needed** - the main SDK API remains the same:
162
+
163
+ ```javascript
164
+ // Still works exactly the same
165
+ import TestDriver from 'testdriverai';
166
+ const client = new TestDriver(apiKey, { os: 'linux' });
167
+ ```
168
+
169
+ But you now have cleaner alternatives:
170
+
171
+ ```javascript
172
+ // Using hooks (auto-cleanup)
173
+ import { useTestDriver } from 'testdriverai/vitest/hooks';
174
+ const client = useTestDriver(context, { os: 'linux' });
175
+
176
+ // Using presets (zero config)
177
+ import { chromePreset } from 'testdriverai/presets';
178
+ const { browser } = await chromePreset(context, { url: 'https://example.com' });
179
+ ```
180
+
181
+ ## Migration Strategies
182
+
183
+ ### Strategy 1: Gradual Migration
184
+
185
+ Keep existing tests working, adopt new APIs for new tests:
186
+
187
+ ```javascript
188
+ // old-test.js - Leave as-is
189
+ import { authDashcam, startDashcam } from 'testdriverai';
190
+
191
+ // new-test.js - Use new APIs
192
+ import { chromePreset } from 'testdriverai/presets';
193
+ ```
194
+
195
+ The old helpers will continue to work indefinitely.
196
+
197
+ ### Strategy 2: Convert to Hooks
198
+
199
+ Replace lifecycle helpers with hooks for better lifecycle management:
200
+
201
+ **Before:**
202
+ ```javascript
203
+ import { authDashcam, startDashcam, stopDashcam } from 'testdriverai';
204
+
205
+ test('my test', async ({ client }) => {
206
+ await authDashcam(client);
207
+ await startDashcam(client);
208
+ // test code
209
+ await stopDashcam(client);
210
+ });
211
+ ```
212
+
213
+ **After:**
214
+ ```javascript
215
+ import { useDashcam } from 'testdriverai/vitest/hooks';
216
+
217
+ test('my test', async (context) => {
218
+ // Assuming client is already available via plugin or another hook
219
+ const dashcam = useDashcam(context, client, {
220
+ autoAuth: true,
221
+ autoStart: true,
222
+ autoStop: true
223
+ });
224
+ // test code
225
+ // Auto-stops at test end
226
+ });
227
+ ```
228
+
229
+ ### Strategy 3: Adopt Presets
230
+
231
+ For common scenarios (Chrome, VS Code, Electron), use presets:
232
+
233
+ **Before:**
234
+ ```javascript
235
+ test('chrome test', async ({ client }) => {
236
+ await authDashcam(client);
237
+ await startDashcam(client);
238
+
239
+ await client.exec('sh', 'google-chrome "https://example.com" &', 30000);
240
+ await client.focusApplication('Google Chrome');
241
+
242
+ await client.find('button').click();
243
+
244
+ await stopDashcam(client);
245
+ });
246
+ ```
247
+
248
+ **After:**
249
+ ```javascript
250
+ test('chrome test', async (context) => {
251
+ const { browser } = await chromePreset(context, {
252
+ url: 'https://example.com'
253
+ });
254
+
255
+ await browser.find('button').click();
256
+ // Dashcam auto-stops, cleanup automatic
257
+ });
258
+ ```
259
+
260
+ ## Benefits of Migration
261
+
262
+ ### Before Migration
263
+
264
+ - ❌ Manual lifecycle management (easy to forget cleanup)
265
+ - ❌ Lots of boilerplate for common scenarios
266
+ - ❌ No TypeScript support
267
+ - ❌ Helper functions scattered across codebase
268
+ - ❌ Tight coupling to plugin
269
+
270
+ ### After Migration
271
+
272
+ - ✅ Automatic lifecycle management (hooks)
273
+ - ✅ Zero boilerplate (presets)
274
+ - ✅ Full TypeScript definitions
275
+ - ✅ Organized, composable APIs
276
+ - ✅ Works with or without plugin
277
+
278
+ ## Common Patterns
279
+
280
+ ### Pattern 1: Chrome Testing
281
+
282
+ ```javascript
283
+ // OLD
284
+ test('chrome test', async ({ client }) => {
285
+ await client.exec('sh', 'google-chrome "https://example.com" &', 30000);
286
+ await client.focusApplication('Google Chrome');
287
+ await authDashcam(client);
288
+ await startDashcam(client);
289
+ // ... test code
290
+ await stopDashcam(client);
291
+ });
292
+
293
+ // NEW
294
+ import { chromePreset } from 'testdriverai/presets';
295
+
296
+ test('chrome test', async (context) => {
297
+ const { client } = await chromePreset(context, {
298
+ url: 'https://example.com'
299
+ });
300
+ // ... test code
301
+ });
302
+ ```
303
+
304
+ **Lines of code:** 7 → 2 (71% reduction)
305
+
306
+ ### Pattern 2: Manual Dashcam Control
307
+
308
+ ```javascript
309
+ // OLD
310
+ test('dashcam test', async ({ client }) => {
311
+ await authDashcam(client);
312
+ await startDashcam(client);
313
+ // ... test code
314
+ const url = await stopDashcam(client);
315
+ console.log(url);
316
+ });
317
+
318
+ // NEW
319
+ import { Dashcam } from 'testdriverai/core';
320
+
321
+ test('dashcam test', async (context) => {
322
+ const dashcam = new Dashcam(client);
323
+ await dashcam.auth();
324
+ await dashcam.start();
325
+ // ... test code
326
+ const url = await dashcam.stop();
327
+ console.log(url);
328
+ });
329
+ ```
330
+
331
+ ### Pattern 3: Custom Application Setup
332
+
333
+ ```javascript
334
+ // OLD
335
+ test('custom app', async ({ client }) => {
336
+ await authDashcam(client);
337
+ await startDashcam(client);
338
+ await client.exec('sh', 'myapp --arg1 --arg2 &', 30000);
339
+ await client.focusApplication('MyApp');
340
+ // ... test code
341
+ await stopDashcam(client);
342
+ });
343
+
344
+ // NEW - Create custom preset
345
+ import { createPreset } from 'testdriverai/presets';
346
+
347
+ const myAppPreset = createPreset({
348
+ name: 'My App',
349
+ defaults: { args: [] },
350
+ async setup(context, client, dashcam, options) {
351
+ const { args = [] } = options;
352
+ const argsStr = args.join(' ');
353
+ await client.exec('sh', `myapp ${argsStr} &`, 30000);
354
+ await client.focusApplication('MyApp');
355
+ return {}; // client is returned automatically
356
+ }
357
+ });
358
+
359
+ test('custom app', async (context) => {
360
+ const { client } = await myAppPreset(context, {
361
+ args: ['--arg1', '--arg2']
362
+ });
363
+ // ... test code
364
+ // Auto-cleanup
365
+ });
366
+ ```
367
+
368
+ **Reusable** - Use `myAppPreset` in all your tests!
369
+
370
+ ## TypeScript Support
371
+
372
+ v7 includes full TypeScript definitions:
373
+
374
+ ```typescript
375
+ import { test } from 'vitest';
376
+ import { chromePreset, ChromePresetOptions } from 'testdriverai/presets';
377
+ import { useTestDriver, UseDashcamOptions } from 'testdriverai/vitest/hooks';
378
+ import { Dashcam, DashcamOptions } from 'testdriverai/core';
379
+
380
+ // Full autocomplete and type checking!
381
+ test('typed test', async (context) => {
382
+ const { client } = await chromePreset(context, {
383
+ url: 'https://example.com',
384
+ maximized: true,
385
+ os: 'linux' // Type-safe: only 'linux' | 'mac' | 'windows'
386
+ });
387
+
388
+ await client.find('button').click();
389
+ });
390
+ ```
391
+
392
+ ## Breaking Changes
393
+
394
+ ### None! 🎉
395
+
396
+ v7 is **100% backward compatible**. All existing code continues to work.
397
+
398
+ The old lifecycle helpers (`authDashcam`, `startDashcam`, `stopDashcam`) are marked as deprecated but fully functional.
399
+
400
+ ## Deprecation Timeline
401
+
402
+ - **v7.0** - New APIs introduced, old helpers work (with deprecation warnings)
403
+ - **v7.x** - Old helpers continue to work
404
+ - **v8.0** - Old helpers removed (TBD, at least 6 months notice)
405
+
406
+ ## Getting Help
407
+
408
+ - 📖 **Hooks Documentation**: See `/docs/HOOKS.md`
409
+ - 📖 **Presets Documentation**: See `/docs/PRESETS.md`
410
+ - 💬 **Examples**: See `/testdriver/acceptance-sdk/*-example.test.mjs`
411
+ - 🐛 **Issues**: GitHub Issues
412
+
413
+ ## Summary
414
+
415
+ **Choose your level:**
416
+
417
+ | Level | Best For | Example |
418
+ |-------|----------|---------|
419
+ | **Presets** | Common apps (Chrome, VS Code) | `chromePreset(context, { url })` |
420
+ | **Hooks** | Custom lifecycle, power users | `useTestDriver(context, options)` |
421
+ | **Core** | Advanced control, debugging | `new Dashcam(client)` |
422
+
423
+ **Recommendation:** Start with presets for common scenarios, use hooks for custom needs, drop to core classes only when necessary.
424
+
425
+ Migration is **optional** - your existing code continues to work!