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,230 @@
1
+ # Progressive Disclosure APIs
2
+
3
+ TestDriver v7 introduces **progressive disclosure** - three levels of API to match your experience and needs.
4
+
5
+ ## Choose Your Level
6
+
7
+ ### 🟢 Beginner: Provision API
8
+
9
+ **Best for:** Getting started, testing common apps (Chrome, VS Code, Electron)
10
+
11
+ ```javascript
12
+ import { provision } from 'testdriverai/presets';
13
+
14
+ test('my test', async (context) => {
15
+ const { testdriver } = await provision('chrome', {
16
+ url: 'https://example.com'
17
+ }, context);
18
+
19
+ await testdriver.find('Login').click();
20
+ });
21
+ ```
22
+
23
+ **Why use this:**
24
+ - ✅ Zero configuration
25
+ - ✅ One line setup
26
+ - ✅ Automatic everything (launch, focus, cleanup, recording)
27
+ - ✅ Perfect for beginners
28
+
29
+ [Learn more →](./PROVISION.md)
30
+
31
+ ---
32
+
33
+ ### 🟡 Intermediate: Hooks API
34
+
35
+ **Best for:** Power users, custom workflows, manual lifecycle control
36
+
37
+ ```javascript
38
+ import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
39
+
40
+ test('my test', async (context) => {
41
+ const client = useTestDriver(context, { os: 'linux' });
42
+ const dashcam = useDashcam(context, client, {
43
+ autoStart: true,
44
+ autoStop: true
45
+ });
46
+
47
+ await client.find('button').click();
48
+ });
49
+ ```
50
+
51
+ **Why use this:**
52
+ - ✅ Automatic cleanup
53
+ - ✅ Flexible configuration
54
+ - ✅ Control over lifecycle
55
+ - ✅ Works with any application
56
+
57
+ [Learn more →](./HOOKS.md)
58
+
59
+ ---
60
+
61
+ ### 🔴 Advanced: Core Classes
62
+
63
+ **Best for:** Full control, non-Vitest frameworks, custom integrations
64
+
65
+ ```javascript
66
+ import { TestDriver, Dashcam } from 'testdriverai/core';
67
+
68
+ const client = new TestDriver(apiKey, { os: 'linux' });
69
+ await client.auth();
70
+ await client.connect();
71
+
72
+ const dashcam = new Dashcam(client);
73
+ await dashcam.start();
74
+
75
+ // Your code
76
+
77
+ await dashcam.stop();
78
+ await client.disconnect();
79
+ ```
80
+
81
+ **Why use this:**
82
+ - ✅ Complete manual control
83
+ - ✅ No framework dependencies
84
+ - ✅ Works anywhere
85
+ - ✅ Maximum flexibility
86
+
87
+ [Learn more →](./CORE.md)
88
+
89
+ ---
90
+
91
+ ## Architecture
92
+
93
+ ```
94
+ ┌─────────────────────────────────────────────┐
95
+ │ 🟢 Provision API (Easiest) │
96
+ │ provision('chrome', options, context) │
97
+ └─────────────────┬───────────────────────────┘
98
+
99
+ ┌─────────────────▼───────────────────────────┐
100
+ │ 🟡 Hooks API (Flexible) │
101
+ │ useTestDriver(), useDashcam() │
102
+ └─────────────────┬───────────────────────────┘
103
+
104
+ ┌─────────────────▼───────────────────────────┐
105
+ │ 🔴 Core Classes (Full Control) │
106
+ │ new TestDriver(), new Dashcam() │
107
+ └─────────────────────────────────────────────┘
108
+ ```
109
+
110
+ Each level builds on the one below it. Choose the highest level that meets your needs.
111
+
112
+ ## Quick Comparison
113
+
114
+ | Feature | Provision | Hooks | Core |
115
+ |---------|-----------|-------|------|
116
+ | Setup complexity | ⭐ 1 line | ⭐⭐ 2-3 lines | ⭐⭐⭐ 5+ lines |
117
+ | Cleanup | ✅ Automatic | ✅ Automatic | ❌ Manual |
118
+ | Framework requirement | Vitest | Vitest | None |
119
+ | Application support | Chrome, VS Code, Electron | Any | Any |
120
+ | Launch application | ✅ Automatic | ❌ Manual | ❌ Manual |
121
+ | Dashcam recording | ✅ Automatic | ⚡ Optional automatic | ❌ Manual |
122
+ | TypeScript support | ✅ Full | ✅ Full | ✅ Full |
123
+ | Customization | ⚡ Limited | ✅ High | ✅ Complete |
124
+
125
+ ## When to Use Each
126
+
127
+ ### Use Provision API when:
128
+ - ✅ Testing Chrome, VS Code, or Electron
129
+ - ✅ You're a beginner
130
+ - ✅ You want the simplest possible code
131
+ - ✅ You're okay with defaults
132
+
133
+ ### Use Hooks API when:
134
+ - ✅ You need custom application launch
135
+ - ✅ You want automatic cleanup
136
+ - ✅ You're using Vitest
137
+ - ✅ You need fine-grained lifecycle control
138
+
139
+ ### Use Core Classes when:
140
+ - ✅ Not using Vitest
141
+ - ✅ Integrating with other frameworks
142
+ - ✅ Building custom abstractions
143
+ - ✅ Debugging lifecycle issues
144
+ - ✅ Need complete manual control
145
+
146
+ ## Examples
147
+
148
+ ### Simple Chrome Test
149
+
150
+ **Provision (1 line):**
151
+ ```javascript
152
+ const { testdriver } = await provision('chrome', { url }, context);
153
+ ```
154
+
155
+ **Hooks (3 lines):**
156
+ ```javascript
157
+ const client = useTestDriver(context);
158
+ await client.exec('sh', 'google-chrome "https://..." &', 30000);
159
+ await client.focusApplication('Google Chrome');
160
+ ```
161
+
162
+ **Core (6+ lines):**
163
+ ```javascript
164
+ const client = new TestDriver(apiKey, { os: 'linux' });
165
+ await client.auth();
166
+ await client.connect();
167
+ await client.exec('sh', 'google-chrome "https://..." &', 30000);
168
+ await client.focusApplication('Google Chrome');
169
+ // ... test code ...
170
+ await client.disconnect();
171
+ ```
172
+
173
+ ### With Dashcam Recording
174
+
175
+ **Provision (1 line):**
176
+ ```javascript
177
+ const { testdriver, dashcam } = await provision('chrome', { url }, context);
178
+ // Recording automatic!
179
+ ```
180
+
181
+ **Hooks (2 lines):**
182
+ ```javascript
183
+ const client = useTestDriver(context);
184
+ const dashcam = useDashcam(context, client, { autoStart: true, autoStop: true });
185
+ ```
186
+
187
+ **Core (7+ lines):**
188
+ ```javascript
189
+ const client = new TestDriver(apiKey);
190
+ await client.auth();
191
+ await client.connect();
192
+ const dashcam = new Dashcam(client);
193
+ await dashcam.auth();
194
+ await dashcam.start();
195
+ // ... test code ...
196
+ await dashcam.stop();
197
+ await client.disconnect();
198
+ ```
199
+
200
+ ## Migration Path
201
+
202
+ Start simple, grow as needed:
203
+
204
+ 1. **Start with Provision** - Get tests working quickly
205
+ 2. **Move to Hooks** - When you need custom app launch
206
+ 3. **Use Core** - Only if you need full control or non-Vitest
207
+
208
+ You can mix and match in the same project!
209
+
210
+ ## Package Exports
211
+
212
+ All three APIs are available from the same package:
213
+
214
+ ```javascript
215
+ // Provision API
216
+ import { provision, chrome, vscode, electron } from 'testdriverai/presets';
217
+
218
+ // Hooks API
219
+ import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
220
+
221
+ // Core Classes
222
+ import { TestDriver, Dashcam } from 'testdriverai/core';
223
+ ```
224
+
225
+ ## See Also
226
+
227
+ - [Provision API Reference](./PROVISION.md)
228
+ - [Hooks API Reference](./HOOKS.md)
229
+ - [Core Classes Reference](./CORE.md)
230
+ - [Migration Guide](../MIGRATION.md)
@@ -0,0 +1,266 @@
1
+ # Provision API
2
+
3
+ The `provision()` function is the easiest way to set up TestDriver for common applications. It automatically handles TestDriver initialization, application launching, and Dashcam recording.
4
+
5
+ ## Quick Start
6
+
7
+ ```javascript
8
+ import { test } from 'vitest';
9
+ import { provision } from 'testdriverai/presets';
10
+
11
+ test('my test', async (context) => {
12
+ const { testdriver } = await provision('chrome', {
13
+ url: 'https://example.com'
14
+ }, context);
15
+
16
+ await testdriver.find('Login button').click();
17
+ });
18
+ ```
19
+
20
+ ## API
21
+
22
+ ```typescript
23
+ provision(appType, options, context)
24
+ ```
25
+
26
+ **Parameters:**
27
+ - `appType` - Application type: `'chrome'`, `'vscode'`, `'electron'`, or `'webapp'`
28
+ - `options` - Configuration options (varies by app type)
29
+ - `context` - Vitest test context (from your test function parameter)
30
+
31
+ **Returns:**
32
+ - `testdriver` - TestDriver instance ready to use
33
+ - `dashcam` - Dashcam instance (if enabled)
34
+ - Additional app-specific properties (like `vscode`, `app`)
35
+
36
+ ## Application Types
37
+
38
+ ### Chrome Browser
39
+
40
+ ```javascript
41
+ const { testdriver } = await provision('chrome', {
42
+ url: 'https://myapp.com',
43
+ maximized: true, // Start maximized (default: true)
44
+ guest: true, // Use guest mode (default: true)
45
+ dashcam: true, // Enable Dashcam (default: true)
46
+ os: 'linux' // Target OS (default: 'linux')
47
+ }, context);
48
+
49
+ await testdriver.find('username').type('user@example.com');
50
+ await testdriver.find('Login').click();
51
+ ```
52
+
53
+ **Options:**
54
+ - `url` - URL to navigate to (default: 'http://testdriver-sandbox.vercel.app/')
55
+ - `maximized` - Start browser maximized (default: `true`)
56
+ - `guest` - Use guest/incognito mode (default: `true`)
57
+ - `dashcam` - Enable Dashcam recording (default: `true`)
58
+ - `os` - Target OS: `'linux'`, `'mac'`, or `'windows'` (default: `'linux'`)
59
+
60
+ **Returns:**
61
+ - `testdriver` - TestDriver instance
62
+ - `dashcam` - Dashcam instance (if enabled)
63
+
64
+ ### VS Code
65
+
66
+ ```javascript
67
+ const { testdriver, vscode } = await provision('vscode', {
68
+ workspace: '/path/to/project',
69
+ extensions: ['ms-python.python'],
70
+ dashcam: true,
71
+ os: 'linux'
72
+ }, context);
73
+
74
+ await vscode.find('File menu').click();
75
+ await vscode.find('New File').click();
76
+ ```
77
+
78
+ **Options:**
79
+ - `workspace` - Workspace/folder path to open (optional)
80
+ - `extensions` - Array of extension IDs to install (optional)
81
+ - `dashcam` - Enable Dashcam recording (default: `true`)
82
+ - `os` - Target OS (default: `'linux'`)
83
+
84
+ **Returns:**
85
+ - `testdriver` - TestDriver instance
86
+ - `vscode` - Alias for testdriver (semantic clarity)
87
+ - `dashcam` - Dashcam instance (if enabled)
88
+
89
+ ### Electron
90
+
91
+ ```javascript
92
+ const { testdriver, app } = await provision('electron', {
93
+ appPath: '/path/to/app',
94
+ args: ['--enable-logging'],
95
+ dashcam: true,
96
+ os: 'linux'
97
+ }, context);
98
+
99
+ await app.find('main window').click();
100
+ ```
101
+
102
+ **Options:**
103
+ - `appPath` - Path to Electron application (required)
104
+ - `args` - Additional command-line arguments (optional)
105
+ - `dashcam` - Enable Dashcam recording (default: `true`)
106
+ - `os` - Target OS (default: `'linux'`)
107
+
108
+ **Returns:**
109
+ - `testdriver` - TestDriver instance
110
+ - `app` - Alias for testdriver (semantic clarity)
111
+ - `dashcam` - Dashcam instance (if enabled)
112
+
113
+ ### Web App
114
+
115
+ Generic wrapper for web applications (currently uses Chrome):
116
+
117
+ ```javascript
118
+ const { testdriver } = await provision('webapp', {
119
+ url: 'https://example.com',
120
+ browser: 'chrome' // Only 'chrome' supported currently
121
+ }, context);
122
+ ```
123
+
124
+ ## Complete Example
125
+
126
+ ```javascript
127
+ import { describe, it, expect } from 'vitest';
128
+ import { provision } from 'testdriverai/presets';
129
+
130
+ describe('Login Flow', () => {
131
+ it('should login successfully', async (context) => {
132
+ // Provision Chrome with your app
133
+ const { testdriver, dashcam } = await provision('chrome', {
134
+ url: 'https://myapp.com/login',
135
+ maximized: true
136
+ }, context);
137
+
138
+ // Interact with the application
139
+ await testdriver.find('email input').type('user@example.com');
140
+ await testdriver.find('password input').type('password123');
141
+ await testdriver.find('Login button').click();
142
+
143
+ // Verify results
144
+ const result = await testdriver.assert('Welcome message is visible');
145
+ expect(result).toBeTruthy();
146
+
147
+ // Dashcam automatically stops and saves replay at test end
148
+ // No cleanup needed - handled automatically!
149
+ });
150
+ });
151
+ ```
152
+
153
+ ## How It Works
154
+
155
+ When you call `provision()`:
156
+
157
+ 1. **Creates TestDriver client** - Initializes and connects to sandbox
158
+ 2. **Sets up Dashcam** - Authenticates and starts recording (if enabled)
159
+ 3. **Launches application** - Opens the specified app with your configuration
160
+ 4. **Focuses window** - Ensures the app is ready for interaction
161
+ 5. **Returns ready-to-use instances** - Everything is set up and ready
162
+
163
+ At test end:
164
+ - Dashcam automatically stops and saves replay URL
165
+ - TestDriver automatically disconnects
166
+ - All cleanup is handled for you
167
+
168
+ ## Automatic Lifecycle
169
+
170
+ The `provision()` function uses Vitest hooks under the hood to manage the entire lifecycle:
171
+
172
+ ```javascript
173
+ // ✅ This:
174
+ const { testdriver } = await provision('chrome', { url }, context);
175
+
176
+ // Is equivalent to manually doing:
177
+ const client = new TestDriver(apiKey, { os: 'linux' });
178
+ await client.auth();
179
+ await client.connect();
180
+
181
+ const dashcam = new Dashcam(client);
182
+ await dashcam.auth();
183
+ await dashcam.start();
184
+
185
+ await client.exec('sh', 'google-chrome --start-maximized --guest "https://example.com" &', 30000);
186
+ await client.focusApplication('Google Chrome');
187
+
188
+ // ... your test code ...
189
+
190
+ await dashcam.stop();
191
+ await client.disconnect();
192
+ ```
193
+
194
+ That's **15+ lines of boilerplate** reduced to **1 line**!
195
+
196
+ ## TypeScript Support
197
+
198
+ Full TypeScript definitions included:
199
+
200
+ ```typescript
201
+ import { provision } from 'testdriverai/presets';
202
+
203
+ test('typed test', async (context) => {
204
+ const { testdriver } = await provision('chrome', {
205
+ url: 'https://example.com',
206
+ maximized: true,
207
+ os: 'linux' // ✅ Type-safe: only 'linux' | 'mac' | 'windows'
208
+ }, context);
209
+
210
+ // ✅ Full autocomplete for testdriver methods
211
+ await testdriver.find('button').click();
212
+ });
213
+ ```
214
+
215
+ ## Direct Preset Functions
216
+
217
+ You can also use the individual preset functions directly:
218
+
219
+ ```javascript
220
+ import { chrome, vscode, electron } from 'testdriverai/presets';
221
+
222
+ // Same as provision('chrome', options, context)
223
+ const { testdriver } = await chrome(context, {
224
+ url: 'https://example.com'
225
+ });
226
+
227
+ // Same as provision('vscode', options, context)
228
+ const { vscode } = await vscode(context, {
229
+ workspace: '/path/to/project'
230
+ });
231
+ ```
232
+
233
+ These are available for when you prefer explicit function names.
234
+
235
+ ## Best Practices
236
+
237
+ 1. **Always pass context** - Required for automatic cleanup
238
+ 2. **Enable dashcam** - Great for debugging test failures
239
+ 3. **Use descriptive variables** - `testdriver`, `vscode`, `app` based on what you're testing
240
+ 4. **Leverage TypeScript** - Get autocomplete and type safety
241
+ 5. **Keep URLs in config** - Use environment variables for different environments
242
+
243
+ ## Error Handling
244
+
245
+ ```javascript
246
+ test('handles errors gracefully', async (context) => {
247
+ try {
248
+ const { testdriver } = await provision('chrome', {
249
+ url: 'https://example.com'
250
+ }, context);
251
+
252
+ await testdriver.find('button').click();
253
+ } catch (error) {
254
+ // Cleanup still happens automatically
255
+ console.error('Test failed:', error);
256
+ throw error; // Re-throw to mark test as failed
257
+ }
258
+ });
259
+ ```
260
+
261
+ ## See Also
262
+
263
+ - [Hooks API](./HOOKS.md) - For more control over lifecycle
264
+ - [Core Classes](./CORE.md) - For full manual control
265
+ - [Migration Guide](../MIGRATION.md) - Upgrading from v6
266
+ - [Examples](../../testdriver/acceptance-sdk/presets-example.test.mjs) - Working examples
@@ -33,7 +33,7 @@ export default defineConfig({
33
33
  export TD_API_KEY="your-api-key-here"
34
34
  ```
35
35
 
36
- Get your API key from: https://app.testdriver.ai/settings/api-keys
36
+ Get your API key from: https://console.testdriver.ai/settings/api-keys
37
37
 
38
38
  ### 3. Run Tests
39
39
 
@@ -42,7 +42,7 @@ npx vitest run
42
42
  ```
43
43
 
44
44
  That's it! Your tests are now being recorded. View results at:
45
- https://app.testdriver.ai/dashboard/test-runs
45
+ https://console.testdriver.ai/dashboard/test-runs
46
46
 
47
47
  ## With Dashcam (Optional)
48
48
 
@@ -211,5 +211,5 @@ await client.completeTestRun({
211
211
  ## Support
212
212
 
213
213
  - Documentation: https://docs.testdriver.ai
214
- - Dashboard: https://app.testdriver.ai
214
+ - Dashboard: https://console.testdriver.ai
215
215
  - API Reference: /cli/docs/TEST_RECORDING.md