testdriverai 7.1.0 → 7.1.2

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 (325) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/agent/index.js +18 -45
  4. package/agent/interface.js +13 -2
  5. package/agent/lib/commands.js +1 -1
  6. package/agent/lib/redraw.js +1 -1
  7. package/agent/lib/sandbox.js +30 -2
  8. package/agent/lib/valid-version.js +2 -2
  9. package/debugger/index.html +1 -1
  10. package/docs/docs.json +140 -131
  11. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  12. package/docs/v7/_drafts/agents.mdx +852 -0
  13. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  14. package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
  15. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  16. package/docs/v7/_drafts/error-handling.mdx +501 -0
  17. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  18. package/docs/v7/_drafts/init-command.mdx +95 -0
  19. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  20. package/docs/v7/_drafts/plugin-migration.mdx +222 -0
  21. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  22. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  23. package/docs/v7/_drafts/sdk-logging.mdx +222 -0
  24. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  25. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  26. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  27. package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
  28. package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
  29. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  30. package/docs/v7/api/client.mdx +1 -1
  31. package/docs/v7/api/dashcam.mdx +2 -2
  32. package/docs/v7/api/elements.mdx +143 -41
  33. package/docs/v7/api/find.mdx +258 -0
  34. package/docs/v7/api/type.mdx +51 -7
  35. package/docs/v7/features/ai-native.mdx +427 -0
  36. package/docs/v7/features/easy-to-write.mdx +351 -0
  37. package/docs/v7/features/enterprise.mdx +540 -0
  38. package/docs/v7/features/fast.mdx +424 -0
  39. package/docs/v7/features/observable.mdx +623 -0
  40. package/docs/v7/features/powerful.mdx +531 -0
  41. package/docs/v7/features/scalable.mdx +417 -0
  42. package/docs/v7/features/stable.mdx +514 -0
  43. package/docs/v7/getting-started/configuration.mdx +1 -1
  44. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  45. package/docs/v7/getting-started/installation.mdx +486 -0
  46. package/docs/v7/getting-started/quickstart.mdx +51 -5
  47. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  48. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  49. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  50. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  51. package/docs/v7/playwright.mdx +3 -3
  52. package/docs/v7/presets/chrome.mdx +16 -0
  53. package/docs/v7/presets/electron.mdx +18 -0
  54. package/docs/v7/presets/vscode.mdx +19 -0
  55. package/examples/run-tests-with-recording.sh +70 -0
  56. package/examples/screenshot-example.js +63 -0
  57. package/examples/sdk-awesome-logs-demo.js +177 -0
  58. package/examples/sdk-cache-thresholds.js +96 -0
  59. package/examples/sdk-element-properties.js +155 -0
  60. package/examples/sdk-simple-example.js +65 -0
  61. package/examples/test-recording-example.test.js +166 -0
  62. package/interfaces/cli/commands/init.js +358 -0
  63. package/interfaces/vitest-plugin.mjs +214 -10
  64. package/{src → lib}/core/Dashcam.js +41 -4
  65. package/{src → lib}/vitest/hooks.mjs +118 -100
  66. package/lib/vitest/setup.mjs +44 -0
  67. package/package.json +9 -10
  68. package/sdk.d.ts +15 -2
  69. package/sdk.js +72 -17
  70. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  71. package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
  72. package/test/manual/test-find-api.js +73 -0
  73. package/test/manual/test-init.sh +54 -0
  74. package/test/manual/test-prompt-cache.js +96 -0
  75. package/test/manual/test-provision-auth.mjs +22 -0
  76. package/test/manual/test-sandbox-render.js +28 -0
  77. package/test/manual/test-sdk-methods.js +15 -0
  78. package/test/manual/test-sdk-refactor.js +53 -0
  79. package/test/manual/test-stack-trace.mjs +57 -0
  80. package/test/testdriver/assert.test.mjs +41 -0
  81. package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
  82. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
  83. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
  84. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
  85. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
  86. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
  87. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
  88. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
  89. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
  90. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
  91. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
  92. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
  93. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
  94. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
  95. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
  96. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
  97. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
  98. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
  99. package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
  100. package/test/testdriver/setup/testHelpers.mjs +653 -0
  101. package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
  102. package/vitest.config.mjs +8 -59
  103. package/.github/dependabot.yml +0 -11
  104. package/.github/workflows/acceptance-linux.yml +0 -75
  105. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  106. package/.github/workflows/acceptance-tests.yml +0 -130
  107. package/.github/workflows/lint.yml +0 -27
  108. package/.github/workflows/publish-canary.yml +0 -40
  109. package/.github/workflows/publish-latest.yml +0 -61
  110. package/.github/workflows/test-install.yml +0 -29
  111. package/.vscode/extensions.json +0 -3
  112. package/.vscode/launch.json +0 -22
  113. package/.vscode/settings.json +0 -14
  114. package/AGENTS.md +0 -550
  115. package/CODEOWNERS +0 -2
  116. package/_testdriver/acceptance/assert.yaml +0 -7
  117. package/_testdriver/acceptance/dashcam.yaml +0 -9
  118. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  119. package/_testdriver/acceptance/embed.yaml +0 -9
  120. package/_testdriver/acceptance/exec-js.yaml +0 -29
  121. package/_testdriver/acceptance/exec-output.yaml +0 -43
  122. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  123. package/_testdriver/acceptance/focus-window.yaml +0 -16
  124. package/_testdriver/acceptance/hover-image.yaml +0 -18
  125. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  126. package/_testdriver/acceptance/hover-text.yaml +0 -14
  127. package/_testdriver/acceptance/if-else.yaml +0 -31
  128. package/_testdriver/acceptance/match-image.yaml +0 -15
  129. package/_testdriver/acceptance/press-keys.yaml +0 -35
  130. package/_testdriver/acceptance/prompt.yaml +0 -11
  131. package/_testdriver/acceptance/remember.yaml +0 -27
  132. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  133. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  134. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  135. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  136. package/_testdriver/acceptance/scroll.yaml +0 -33
  137. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  138. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  139. package/_testdriver/acceptance/type.yaml +0 -29
  140. package/_testdriver/behavior/failure.yaml +0 -7
  141. package/_testdriver/behavior/hover-text.yaml +0 -13
  142. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  143. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  144. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  145. package/_testdriver/behavior/secrets.yaml +0 -7
  146. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  147. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  148. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  149. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  150. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  151. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  152. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  153. package/_testdriver/edge-cases/success-test.yaml +0 -9
  154. package/_testdriver/examples/android/example.yaml +0 -12
  155. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  156. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  157. package/_testdriver/examples/android/readme.md +0 -7
  158. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  159. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  160. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  161. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  162. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  163. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  164. package/_testdriver/lifecycle/postrun.yaml +0 -8
  165. package/_testdriver/lifecycle/prerun.yaml +0 -15
  166. package/_testdriver/lifecycle/provision.yaml +0 -25
  167. package/docs/v7/guides/ci-cd/azure.mdx +0 -587
  168. package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
  169. package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
  170. package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
  171. package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
  172. package/docs/v7/guides/ci-cd/travis.mdx +0 -438
  173. package/scripts/view-test-results.mjs +0 -96
  174. package/src/vitest/extended.mjs +0 -108
  175. package/src/vitest/index.mjs +0 -64
  176. package/src/vitest/utils.mjs +0 -150
  177. package/styles/.vale-config/2-MDX.ini +0 -5
  178. package/styles/Microsoft/AMPM.yml +0 -9
  179. package/styles/Microsoft/Accessibility.yml +0 -30
  180. package/styles/Microsoft/Acronyms.yml +0 -64
  181. package/styles/Microsoft/Adverbs.yml +0 -272
  182. package/styles/Microsoft/Auto.yml +0 -11
  183. package/styles/Microsoft/Avoid.yml +0 -14
  184. package/styles/Microsoft/Contractions.yml +0 -50
  185. package/styles/Microsoft/Dashes.yml +0 -13
  186. package/styles/Microsoft/DateFormat.yml +0 -8
  187. package/styles/Microsoft/DateNumbers.yml +0 -40
  188. package/styles/Microsoft/DateOrder.yml +0 -8
  189. package/styles/Microsoft/Ellipses.yml +0 -9
  190. package/styles/Microsoft/FirstPerson.yml +0 -16
  191. package/styles/Microsoft/Foreign.yml +0 -13
  192. package/styles/Microsoft/Gender.yml +0 -8
  193. package/styles/Microsoft/GenderBias.yml +0 -42
  194. package/styles/Microsoft/GeneralURL.yml +0 -11
  195. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  196. package/styles/Microsoft/HeadingColons.yml +0 -8
  197. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  198. package/styles/Microsoft/Headings.yml +0 -28
  199. package/styles/Microsoft/Hyphens.yml +0 -14
  200. package/styles/Microsoft/Negative.yml +0 -13
  201. package/styles/Microsoft/Ordinal.yml +0 -13
  202. package/styles/Microsoft/OxfordComma.yml +0 -8
  203. package/styles/Microsoft/Passive.yml +0 -183
  204. package/styles/Microsoft/Percentages.yml +0 -7
  205. package/styles/Microsoft/Plurals.yml +0 -7
  206. package/styles/Microsoft/Quotes.yml +0 -7
  207. package/styles/Microsoft/RangeTime.yml +0 -13
  208. package/styles/Microsoft/Semicolon.yml +0 -8
  209. package/styles/Microsoft/SentenceLength.yml +0 -6
  210. package/styles/Microsoft/Spacing.yml +0 -8
  211. package/styles/Microsoft/Suspended.yml +0 -7
  212. package/styles/Microsoft/Terms.yml +0 -42
  213. package/styles/Microsoft/URLFormat.yml +0 -9
  214. package/styles/Microsoft/Units.yml +0 -16
  215. package/styles/Microsoft/Vocab.yml +0 -25
  216. package/styles/Microsoft/We.yml +0 -11
  217. package/styles/Microsoft/Wordiness.yml +0 -127
  218. package/styles/Microsoft/meta.json +0 -4
  219. package/styles/alex/Ablist.yml +0 -274
  220. package/styles/alex/Condescending.yml +0 -16
  221. package/styles/alex/Gendered.yml +0 -110
  222. package/styles/alex/LGBTQ.yml +0 -55
  223. package/styles/alex/OCD.yml +0 -10
  224. package/styles/alex/Press.yml +0 -12
  225. package/styles/alex/ProfanityLikely.yml +0 -1289
  226. package/styles/alex/ProfanityMaybe.yml +0 -282
  227. package/styles/alex/ProfanityUnlikely.yml +0 -251
  228. package/styles/alex/README.md +0 -27
  229. package/styles/alex/Race.yml +0 -85
  230. package/styles/alex/Suicide.yml +0 -26
  231. package/styles/alex/meta.json +0 -4
  232. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  233. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  234. package/styles/proselint/Airlinese.yml +0 -8
  235. package/styles/proselint/AnimalLabels.yml +0 -48
  236. package/styles/proselint/Annotations.yml +0 -9
  237. package/styles/proselint/Apologizing.yml +0 -8
  238. package/styles/proselint/Archaisms.yml +0 -52
  239. package/styles/proselint/But.yml +0 -8
  240. package/styles/proselint/Cliches.yml +0 -782
  241. package/styles/proselint/CorporateSpeak.yml +0 -30
  242. package/styles/proselint/Currency.yml +0 -5
  243. package/styles/proselint/Cursing.yml +0 -15
  244. package/styles/proselint/DateCase.yml +0 -7
  245. package/styles/proselint/DateMidnight.yml +0 -7
  246. package/styles/proselint/DateRedundancy.yml +0 -10
  247. package/styles/proselint/DateSpacing.yml +0 -7
  248. package/styles/proselint/DenizenLabels.yml +0 -52
  249. package/styles/proselint/Diacritical.yml +0 -95
  250. package/styles/proselint/GenderBias.yml +0 -45
  251. package/styles/proselint/GroupTerms.yml +0 -39
  252. package/styles/proselint/Hedging.yml +0 -8
  253. package/styles/proselint/Hyperbole.yml +0 -6
  254. package/styles/proselint/Jargon.yml +0 -11
  255. package/styles/proselint/LGBTOffensive.yml +0 -13
  256. package/styles/proselint/LGBTTerms.yml +0 -15
  257. package/styles/proselint/Malapropisms.yml +0 -8
  258. package/styles/proselint/Needless.yml +0 -358
  259. package/styles/proselint/Nonwords.yml +0 -38
  260. package/styles/proselint/Oxymorons.yml +0 -22
  261. package/styles/proselint/P-Value.yml +0 -6
  262. package/styles/proselint/RASSyndrome.yml +0 -30
  263. package/styles/proselint/README.md +0 -12
  264. package/styles/proselint/Skunked.yml +0 -13
  265. package/styles/proselint/Spelling.yml +0 -17
  266. package/styles/proselint/Typography.yml +0 -11
  267. package/styles/proselint/Uncomparables.yml +0 -50
  268. package/styles/proselint/Very.yml +0 -6
  269. package/styles/proselint/meta.json +0 -15
  270. package/styles/write-good/Cliches.yml +0 -702
  271. package/styles/write-good/E-Prime.yml +0 -32
  272. package/styles/write-good/Illusions.yml +0 -11
  273. package/styles/write-good/Passive.yml +0 -183
  274. package/styles/write-good/README.md +0 -27
  275. package/styles/write-good/So.yml +0 -5
  276. package/styles/write-good/ThereIs.yml +0 -6
  277. package/styles/write-good/TooWordy.yml +0 -221
  278. package/styles/write-good/Weasel.yml +0 -29
  279. package/styles/write-good/meta.json +0 -4
  280. package/test/dashcam.test.js +0 -137
  281. package/test/mcp-example-test.yaml +0 -27
  282. package/test/test_parser.js +0 -47
  283. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  284. package/testdriver/acceptance-sdk/README.md +0 -128
  285. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  286. package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
  287. package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
  288. package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
  289. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
  290. package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
  291. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  292. package/vale.ini +0 -18
  293. package/vitest.config.example.js +0 -19
  294. package/vitest.config.mjs.bak +0 -44
  295. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  296. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  297. /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
  298. /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
  299. /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
  300. /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
  301. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  302. /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
  303. /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
  304. /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
  305. /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
  306. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  307. /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
  308. /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
  309. /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
  310. /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
  311. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  312. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  313. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  314. /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
  315. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  316. /package/{src → lib}/core/index.d.ts +0 -0
  317. /package/{src → lib}/core/index.js +0 -0
  318. /package/{src → lib}/presets/index.mjs +0 -0
  319. /package/{src → lib}/vitest/hooks.d.ts +0 -0
  320. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +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}/chrome-extension.test.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  325. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Element Not Found Test", () => {
10
10
  it("should handle non-existent element gracefully without timing out", async (context) => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Exec JavaScript Test", () => {
10
10
  it("should fetch user data from API and enter email", async (context) => {
@@ -4,10 +4,10 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
- describe("Exec Output Test", () => {
10
- it.skipIf(process.env.TD_OS === "linux")(
9
+ describe.skipIf(process.env.TD_OS === "linux")("Exec Output Test", () => {
10
+ it(
11
11
  "should set date using PowerShell and navigate to calendar",
12
12
  async (context) => {
13
13
  const testdriver = TestDriver(context, { headless: true });
@@ -4,10 +4,10 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
- describe("Exec PowerShell Test", () => {
10
- it.skipIf(process.env.TD_OS === "linux")(
9
+ describe.skipIf(process.env.TD_OS === "linux")("Exec PowerShell Test", () => {
10
+ it(
11
11
  "should generate random email using PowerShell and enter it",
12
12
  async (context) => {
13
13
  const testdriver = TestDriver(context, { headless: true });
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Focus Window Test", () => {
10
10
  it.skipIf(process.env.TD_OS === "linux")(
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Formatted Logging Test", () => {
10
10
  it("should demonstrate formatted logs in dashcam replay", async (context) => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
  import { performLogin } from "./setup/testHelpers.mjs";
9
9
 
10
10
  describe("Hover Image Test", () => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
  import { performLogin } from "./setup/testHelpers.mjs";
9
9
 
10
10
  describe("Hover Text With Description Test", () => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Hover Text Test", () => {
10
10
  it("should click Sign In and verify error message", async (context) => {
@@ -6,7 +6,7 @@
6
6
  import path, { dirname } from "path";
7
7
  import { fileURLToPath } from "url";
8
8
  import { describe, expect, it } from "vitest";
9
- import { TestDriver } from "../../src/vitest/hooks.mjs";
9
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
10
10
  import { performLogin } from "./setup/testHelpers.mjs";
11
11
 
12
12
  // Get the directory of the current module
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Press Keys Test", () => {
10
10
  it("should create tabs and navigate using keyboard shortcuts", async (context) => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe.skip("Prompt Test", () => {
10
10
  it("should execute AI-driven prompts", async (context) => {
@@ -25,7 +25,7 @@ describe.skip("Prompt Test", () => {
25
25
  // This test is skipped as it requires explicit SDK implementation
26
26
  // You would need to implement these as explicit SDK calls
27
27
 
28
- await testdriver.ai("log in");
28
+ await testdriver.act("log in");
29
29
 
30
30
  const result = await testdriver.assert("the testdriver sandbox is visible");
31
31
  expect(result).toBeTruthy();
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Scroll Keyboard Test", () => {
10
10
  it("should navigate to webhamster.com and scroll with keyboard", async (context) => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
 
9
9
  describe("Scroll Until Image Test", () => {
10
10
  it("should scroll until brown colored house image appears", async (context) => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../../src/vitest/hooks.mjs";
7
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
8
8
  import { performLogin } from "./setup/testHelpers.mjs";
9
9
 
10
10
  describe("Scroll Until Text Test", () => {
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { describe, expect, it } from "vitest";
9
- import { TestDriver } from "../../src/vitest/hooks.mjs";
9
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
10
10
 
11
11
  describe("Scroll Test", () => {
12
12
  it("should navigate and scroll down the page", async (context) => {
@@ -1,23 +1,16 @@
1
1
  /**
2
- * Lifecycle Helpers for TestDriver Vitest Plugin
2
+ * Lifecycle Helpers
3
+ * Shared lifecycle hook functions (prerun, postrun)
3
4
  *
4
- * Provides reusable lifecycle hook functions for common test patterns.
5
- * These are thin wrappers around the Dashcam class.
5
+ * LEGACY: These helpers are thin wrappers around the new Dashcam class.
6
+ * For new code, prefer using the Dashcam class directly:
6
7
  *
7
- * @example
8
- * import { launchChrome, waitForPage } from 'testdriverai/vitest';
9
- *
10
- * test('my test', async (context) => {
11
- * const testdriver = TestDriver(context);
12
- * await testdriver.provision.chrome({ url: 'https://example.com' });
13
- *
14
- * // Or use manual lifecycle helpers
15
- * await launchChrome(testdriver, 'https://other-site.com');
16
- * await waitForPage(testdriver, 'Welcome');
17
- * });
8
+ * import { Dashcam } from 'testdriverai/core';
9
+ * const dashcam = new Dashcam(client);
10
+ * await dashcam.auth();
18
11
  */
19
12
 
20
- import Dashcam from '../core/Dashcam.js';
13
+ import Dashcam from '../../../lib/core/Dashcam.js';
21
14
 
22
15
  // Module-level cache to maintain Dashcam instance state across helper calls
23
16
  const dashcamInstances = new WeakMap();
@@ -38,16 +31,21 @@ function getDashcam(client, options = {}) {
38
31
 
39
32
  /**
40
33
  * Authenticate dashcam with API key
34
+ * @deprecated Use `new Dashcam(client)` and `dashcam.auth()` instead
41
35
  * @param {TestDriver} client - TestDriver client
42
- * @param {string} apiKey - Dashcam API key (default from environment)
36
+ * @param {string} apiKey - Dashcam API key (default: 4e93d8bf-3886-4d26-a144-116c4063522d)
43
37
  */
44
- export async function authDashcam(client, apiKey) {
38
+ export async function authDashcam(
39
+ client,
40
+ apiKey = "4e93d8bf-3886-4d26-a144-116c4063522d",
41
+ ) {
45
42
  const dashcam = getDashcam(client, { apiKey });
46
43
  await dashcam.auth();
47
44
  }
48
45
 
49
46
  /**
50
47
  * Add log file tracking to dashcam
48
+ * @deprecated Use `new Dashcam(client)` and `dashcam.addFileLog()` instead
51
49
  * @param {TestDriver} client - TestDriver client
52
50
  * @param {string} logName - Name for the log in dashcam (default: "TestDriver Log")
53
51
  */
@@ -58,11 +56,10 @@ export async function addDashcamLog(client, logName = "TestDriver Log") {
58
56
  : "/tmp/testdriver.log";
59
57
 
60
58
  // Create log file first
61
- const shell = client.os === "windows" ? "pwsh" : "sh";
62
59
  if (client.os === "windows") {
63
- await client.exec(shell, `New-Item -ItemType File -Path "${logPath}" -Force`, 10000, true);
60
+ await client.exec("pwsh", `New-Item -ItemType File -Path "${logPath}" -Force`, 10000, true);
64
61
  } else {
65
- await client.exec(shell, `touch ${logPath}`, 10000, true);
62
+ await client.exec("sh", `touch ${logPath}`, 10000, true);
66
63
  }
67
64
 
68
65
  await dashcam.addFileLog(logPath, logName);
@@ -70,6 +67,7 @@ export async function addDashcamLog(client, logName = "TestDriver Log") {
70
67
 
71
68
  /**
72
69
  * Start dashcam recording
70
+ * @deprecated Use `new Dashcam(client)` and `dashcam.start()` instead
73
71
  * @param {TestDriver} client - TestDriver client
74
72
  */
75
73
  export async function startDashcam(client) {
@@ -79,6 +77,7 @@ export async function startDashcam(client) {
79
77
 
80
78
  /**
81
79
  * Stop dashcam recording and retrieve URL
80
+ * @deprecated Use `new Dashcam(client)` and `dashcam.stop()` instead
82
81
  * @param {TestDriver} client - TestDriver client
83
82
  * @returns {Promise<string|null>} Dashcam URL if available
84
83
  */
@@ -98,76 +97,81 @@ export async function stopDashcam(client) {
98
97
  }
99
98
 
100
99
  /**
101
- * Launch Chrome browser
100
+ * Launch Chrome browser with guest mode
102
101
  * @param {TestDriver} client - TestDriver client
103
- * @param {string} url - URL to open
104
- * @param {object} options - Browser options
105
- * @param {boolean} options.guest - Launch in guest mode (default: true)
106
- * @param {boolean} options.maximized - Start maximized (default: true)
102
+ * @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
107
103
  */
108
- export async function launchChrome(client, url = "about:blank", options = {}) {
109
- const { guest = true, maximized = true } = options;
104
+ export async function launchChrome(
105
+ client,
106
+ url = "http://testdriver-sandbox.vercel.app/",
107
+ ) {
110
108
  const shell = client.os === "windows" ? "pwsh" : "sh";
111
-
112
- const guestFlag = guest ? "--guest" : "";
113
- const maxFlag = maximized ? "--start-maximized" : "";
114
109
 
115
110
  if (client.os === "windows") {
116
- const args = [maxFlag, guestFlag, `"${url}"`].filter(Boolean).join('", "');
117
111
  await client.exec(
118
112
  "pwsh",
119
- `Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "${args}"`,
113
+ `Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${url}"`,
120
114
  30000,
121
115
  );
122
116
  } else {
123
- const flags = [maxFlag, "--disable-fre", "--no-default-browser-check", "--no-first-run", guestFlag].filter(Boolean).join(" ");
124
117
  await client.exec(
125
118
  shell,
126
- `google-chrome ${flags} "${url}" >/dev/null 2>&1 &`,
119
+ `google-chrome --start-maximized --disable-fre --no-default-browser-check --no-first-run --guest "${url}" >/dev/null 2>&1 &`,
127
120
  30000,
128
121
  );
129
122
  }
130
123
  }
131
124
 
132
125
  /**
133
- * Launch Chrome for Testing browser
126
+ * Launch Chrome for Testing browser with guest mode
134
127
  * @param {TestDriver} client - TestDriver client
135
- * @param {string} url - URL to open
136
- * @param {object} options - Browser options
128
+ * @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
137
129
  */
138
- export async function launchChromeForTesting(client, url = "about:blank", options = {}) {
139
- const { guest = true, maximized = true } = options;
130
+ export async function launchChromeForTesting(
131
+ client,
132
+ url = "http://testdriver-sandbox.vercel.app/",
133
+ ) {
140
134
  const shell = client.os === "windows" ? "pwsh" : "sh";
141
-
142
- const guestFlag = guest ? "--guest" : "";
143
- const maxFlag = maximized ? "--start-maximized" : "";
144
135
 
145
136
  if (client.os === "windows") {
146
- // Fallback to regular Chrome on Windows
147
- await launchChrome(client, url, options);
137
+ // Windows Chrome for Testing path would need to be determined
138
+ // For now, fallback to regular Chrome on Windows
139
+ await client.exec(
140
+ "pwsh",
141
+ `Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${url}"`,
142
+ 30000,
143
+ );
148
144
  } else {
149
- const flags = [maxFlag, "--disable-fre", "--no-default-browser-check", "--no-first-run", guestFlag].filter(Boolean).join(" ");
150
145
  await client.exec(
151
146
  shell,
152
- `chrome-for-testing ${flags} "${url}" >/dev/null 2>&1 &`,
147
+ `chrome-for-testing --start-maximized --disable-fre --no-default-browser-check --no-first-run --guest "${url}" >/dev/null 2>&1 &`,
153
148
  30000,
154
149
  );
155
150
  }
156
151
  }
157
152
 
158
153
  /**
159
- * Launch Chrome with a Chrome extension loaded
154
+ * Launch Chrome for Testing with a Chrome extension loaded
160
155
  * @param {TestDriver} client - TestDriver client
161
- * @param {string} extensionId - Chrome Web Store extension ID
162
- * @param {string} url - URL to open
156
+ * @param {string} extensionId - Chrome Web Store extension ID (e.g., "cjpalhdlnbpafiamejdnhcphjbkeiagm" for uBlock Origin)
157
+ * @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
163
158
  * @example
164
159
  * // Launch with uBlock Origin extension
165
160
  * await launchChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm");
161
+ *
162
+ * // Launch with multiple extensions (comma-separated)
163
+ * await launchChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm,nngceckbapebfimnlniiiahkandclblb");
166
164
  */
167
- export async function launchChromeExtension(client, extensionId, url = "about:blank") {
165
+ export async function launchChromeExtension(
166
+ client,
167
+ extensionId,
168
+ url = "http://testdriver-sandbox.vercel.app/",
169
+ ) {
168
170
  const shell = client.os === "windows" ? "pwsh" : "sh";
169
171
 
170
172
  if (client.os === "windows") {
173
+ // Windows Chrome for Testing path would need to be determined
174
+ // For now, fallback to regular Chrome on Windows
171
175
  await client.exec(
172
176
  "pwsh",
173
177
  `Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--load-extension=${extensionId}", "${url}"`,
@@ -188,87 +192,68 @@ export async function launchChromeExtension(client, extensionId, url = "about:bl
188
192
  * @param {string} text - Text to wait for
189
193
  * @param {number} maxAttempts - Maximum number of attempts (default: 60)
190
194
  * @param {number} pollInterval - Interval between polls in ms (default: 5000)
191
- * @returns {Promise<boolean>} True if text was found
192
195
  */
193
- export async function waitForPage(client, text, maxAttempts = 60, pollInterval = 5000) {
196
+ export async function waitForPage(
197
+ client,
198
+ text,
199
+ maxAttempts = 60,
200
+ pollInterval = 5000,
201
+ ) {
194
202
  console.log("Waiting for page to load, looking for text:", text);
203
+ let element;
195
204
  for (let i = 0; i < maxAttempts; i++) {
196
- const element = await client.find(text);
197
- if (element.found()) {
198
- return true;
199
- }
205
+ element = await client.find(text);
206
+ if (element.found()) break;
200
207
  await new Promise((resolve) => setTimeout(resolve, pollInterval));
201
208
  }
202
- return false;
203
209
  }
204
210
 
205
211
  /**
206
- * Run standard prerun lifecycle hooks
207
- * Authenticates, starts dashcam, launches Chrome
212
+ * Run prerun lifecycle hooks
213
+ * Implements lifecycle/prerun.yaml functionality
208
214
  * @param {TestDriver} client - TestDriver client
209
- * @param {object} options - Options
210
- * @param {string} options.url - URL to open (default: sandbox)
211
- * @param {string} options.waitForText - Text to wait for after page load
212
215
  */
213
- export async function runPrerun(client, options = {}) {
214
- const {
215
- url = "http://testdriver-sandbox.vercel.app/",
216
- waitForText = "TestDriver.ai Sandbox"
217
- } = options;
218
-
216
+ export async function runPrerun(client) {
219
217
  await authDashcam(client);
220
218
  await addDashcamLog(client);
221
219
  await startDashcam(client);
222
- await launchChrome(client, url);
223
- if (waitForText) {
224
- await waitForPage(client, waitForText);
225
- }
220
+ await launchChrome(client);
221
+ await waitForPage(client, "TestDriver.ai Sandbox");
226
222
  }
227
223
 
228
224
  /**
229
- * Run prerun with Chrome for Testing
225
+ * Run prerun lifecycle hooks with Chrome for Testing
226
+ * Implements lifecycle/prerun.yaml functionality using Chrome for Testing
230
227
  * @param {TestDriver} client - TestDriver client
231
- * @param {object} options - Options
232
228
  */
233
- export async function runPrerunChromeForTesting(client, options = {}) {
234
- const {
235
- url = "http://testdriver-sandbox.vercel.app/",
236
- waitForText = "TestDriver.ai Sandbox"
237
- } = options;
238
-
229
+ export async function runPrerunChromeForTesting(client) {
239
230
  await authDashcam(client);
240
231
  await addDashcamLog(client);
241
232
  await startDashcam(client);
242
- await launchChromeForTesting(client, url);
243
- if (waitForText) {
244
- await waitForPage(client, waitForText);
245
- }
233
+ await launchChromeForTesting(client);
234
+ await waitForPage(client, "TestDriver.ai Sandbox");
246
235
  }
247
236
 
248
237
  /**
249
- * Run prerun with Chrome extension
238
+ * Run prerun lifecycle hooks with Chrome extension loaded
239
+ * Implements lifecycle/prerun.yaml functionality with a Chrome extension
250
240
  * @param {TestDriver} client - TestDriver client
251
- * @param {string} extensionId - Chrome extension ID
252
- * @param {object} options - Options
241
+ * @param {string} extensionId - Chrome Web Store extension ID to load
242
+ * @example
243
+ * // Launch with uBlock Origin extension
244
+ * await runPrerunChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm");
253
245
  */
254
- export async function runPrerunChromeExtension(client, extensionId, options = {}) {
255
- const {
256
- url = "http://testdriver-sandbox.vercel.app/",
257
- waitForText = "TestDriver.ai Sandbox"
258
- } = options;
259
-
246
+ export async function runPrerunChromeExtension(client, extensionId) {
260
247
  await authDashcam(client);
261
248
  await addDashcamLog(client);
262
249
  await startDashcam(client);
263
- await launchChromeExtension(client, extensionId, url);
264
- if (waitForText) {
265
- await waitForPage(client, waitForText);
266
- }
250
+ await launchChromeExtension(client, extensionId);
251
+ await waitForPage(client, "TestDriver.ai Sandbox");
267
252
  }
268
253
 
269
254
  /**
270
- * Run standard postrun lifecycle hooks
271
- * Stops dashcam and returns URL
255
+ * Run postrun lifecycle hooks
256
+ * Implements lifecycle/postrun.yaml functionality
272
257
  * @param {TestDriver} client - TestDriver client
273
258
  * @returns {Promise<string|null>} Dashcam URL if available
274
259
  */