testdriverai 6.2.2 → 7.0.0

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 (264) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/MIGRATION.md +389 -0
  5. package/PLUGIN_MIGRATION.md +222 -0
  6. package/PROMPT_CACHE.md +200 -0
  7. package/SDK_LOGGING.md +222 -0
  8. package/SDK_MIGRATION.md +474 -0
  9. package/SDK_README.md +1122 -0
  10. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  11. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  12. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  13. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  14. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  15. package/_testdriver/lifecycle/prerun.yaml +15 -0
  16. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  17. package/agent/index.js +258 -68
  18. package/agent/interface.js +15 -0
  19. package/agent/lib/cache.js +142 -0
  20. package/agent/lib/commander.js +1 -39
  21. package/agent/lib/commands.js +143 -188
  22. package/agent/lib/redraw.js +6 -3
  23. package/agent/lib/sandbox.js +19 -5
  24. package/agent/lib/sdk.js +1 -0
  25. package/agent/lib/system.js +0 -3
  26. package/agent/lib/validation.js +1 -7
  27. package/debug-locate-response.js +82 -0
  28. package/debug-screenshot-1763401388589.png +0 -0
  29. package/debugger/index.html +15 -4
  30. package/docs/ARCHITECTURE.md +424 -0
  31. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  32. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  33. package/docs/SDK_AWESOME_LOGS.md +468 -0
  34. package/docs/TEST_RECORDING.md +388 -0
  35. package/docs/docs.json +232 -152
  36. package/docs/sdk-browser-rendering.md +167 -0
  37. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  38. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  39. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  40. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  41. package/docs/v6/overview/comparison.mdx +101 -0
  42. package/docs/v7/README.md +135 -0
  43. package/docs/v7/api/ai.mdx +205 -0
  44. package/docs/v7/api/assert.mdx +285 -0
  45. package/docs/v7/api/assertions.mdx +403 -0
  46. package/docs/v7/api/click.mdx +287 -0
  47. package/docs/v7/api/client.mdx +322 -0
  48. package/docs/v7/api/elements.mdx +479 -0
  49. package/docs/v7/api/exec.mdx +346 -0
  50. package/docs/v7/api/find.mdx +316 -0
  51. package/docs/v7/api/focusApplication.mdx +294 -0
  52. package/docs/v7/api/hover.mdx +279 -0
  53. package/docs/v7/api/pressKeys.mdx +349 -0
  54. package/docs/v7/api/sandbox.mdx +404 -0
  55. package/docs/v7/api/scroll.mdx +300 -0
  56. package/docs/v7/api/type.mdx +314 -0
  57. package/docs/v7/commands/assert.mdx +45 -0
  58. package/docs/v7/commands/exec.mdx +282 -0
  59. package/docs/v7/commands/focus-application.mdx +44 -0
  60. package/docs/v7/commands/hover-image.mdx +69 -0
  61. package/docs/v7/commands/hover-text.mdx +47 -0
  62. package/docs/v7/commands/if.mdx +53 -0
  63. package/docs/v7/commands/match-image.mdx +67 -0
  64. package/docs/v7/commands/press-keys.mdx +87 -0
  65. package/docs/v7/commands/remember.mdx +49 -0
  66. package/docs/v7/commands/run.mdx +44 -0
  67. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  68. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  69. package/docs/v7/commands/scroll.mdx +69 -0
  70. package/docs/v7/commands/type.mdx +45 -0
  71. package/docs/v7/commands/wait-for-image.mdx +54 -0
  72. package/docs/v7/commands/wait-for-text.mdx +48 -0
  73. package/docs/v7/commands/wait.mdx +45 -0
  74. package/docs/v7/getting-started/quickstart.mdx +199 -0
  75. package/docs/v7/guides/migration.mdx +562 -0
  76. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  77. package/docs/v7/playwright.mdx +342 -0
  78. package/eslint.config.js +19 -1
  79. package/examples/run-tests-with-recording.sh +70 -0
  80. package/examples/screenshot-example.js +63 -0
  81. package/examples/sdk-awesome-logs-demo.js +177 -0
  82. package/examples/sdk-cache-thresholds.js +96 -0
  83. package/examples/sdk-element-properties.js +155 -0
  84. package/examples/sdk-simple-example.js +65 -0
  85. package/examples/test-recording-example.test.js +166 -0
  86. package/interfaces/cli/lib/base.js +10 -4
  87. package/interfaces/logger.js +2 -1
  88. package/interfaces/shared-test-state.mjs +69 -0
  89. package/interfaces/vitest-plugin.mjs +744 -0
  90. package/mcp-server/AI_GUIDELINES.md +57 -0
  91. package/package.json +18 -5
  92. package/schema.json +8 -29
  93. package/scripts/view-test-results.mjs +96 -0
  94. package/sdk-log-formatter.js +714 -0
  95. package/sdk.d.ts +735 -0
  96. package/sdk.js +1906 -0
  97. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  98. package/setup/aws/cloudformation.yaml +9 -2
  99. package/test/mcp-example-test.yaml +27 -0
  100. package/test-find-api.js +73 -0
  101. package/test-prompt-cache.js +96 -0
  102. package/test-sandbox-render.js +28 -0
  103. package/test-sdk-methods.js +15 -0
  104. package/test-sdk-refactor.js +53 -0
  105. package/test-stack-trace.mjs +57 -0
  106. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  107. package/testdriver/acceptance-sdk/README.md +128 -0
  108. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  109. package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
  110. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
  111. package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
  112. package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
  113. package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
  114. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
  115. package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
  116. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
  117. package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
  118. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
  119. package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
  120. package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
  121. package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
  122. package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
  123. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
  124. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
  125. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
  126. package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
  127. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  128. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
  129. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
  130. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  131. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  132. package/testdriver/acceptance-sdk/type.test.mjs +84 -0
  133. package/verify-element-api.js +89 -0
  134. package/verify-types.js +0 -0
  135. package/vitest.config.example.js +19 -0
  136. package/vitest.config.mjs +65 -0
  137. package/vitest.config.mjs.bak +44 -0
  138. package/.github/workflows/acceptance-v6.yml +0 -169
  139. package/docs/overview/comparison.mdx +0 -82
  140. package/testdriver/lifecycle/prerun.yaml +0 -17
  141. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  142. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  143. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  144. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  145. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  146. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  147. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  148. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  149. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  150. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  151. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  152. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  153. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  154. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  155. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  156. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  157. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  158. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  159. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  160. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  161. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  162. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  163. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  164. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  165. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  166. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  167. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  168. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  169. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  170. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  171. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  172. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  173. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  174. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  175. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  176. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  177. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  178. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  179. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  180. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  181. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  182. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  183. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  184. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  185. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  186. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  187. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  188. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  189. /package/docs/{account → v6/account}/projects.mdx +0 -0
  190. /package/docs/{account → v6/account}/team.mdx +0 -0
  191. /package/docs/{action → v6/action}/ami.mdx +0 -0
  192. /package/docs/{action → v6/action}/performance.mdx +0 -0
  193. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  194. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  195. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  196. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  197. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  198. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  199. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  200. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  201. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  202. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  203. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  204. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  205. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  206. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  207. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  208. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  209. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  210. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  211. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  212. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  213. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  214. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  215. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  216. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  217. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  218. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  219. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  220. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  221. /package/docs/{features → v6/features}/generation.mdx +0 -0
  222. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  223. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  224. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  225. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  226. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  227. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  228. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  229. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  230. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  231. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  232. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  233. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  234. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  235. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  236. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  237. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  238. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  239. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  240. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  241. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  242. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  243. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  244. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  245. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  246. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  247. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  248. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  249. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  250. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  251. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  252. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  253. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  254. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  255. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  256. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  257. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  258. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  259. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  260. /package/docs/{security → v6/security}/action.mdx +0 -0
  261. /package/docs/{security → v6/security}/agent.mdx +0 -0
  262. /package/docs/{security → v6/security}/platform.mdx +0 -0
  263. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  264. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
@@ -0,0 +1,57 @@
1
+ # TestDriver MCP Server - AI Agent Guidelines
2
+
3
+ ## Essential Workflow
4
+
5
+ 1. **Always connect first**: Call `testdriver_connect` before any other operations
6
+ 2. **Verify with screenshots**: Screenshots are automatically captured after actions - review them to confirm success
7
+ 3. **Wait before interacting**: Use `waitForText` or `waitForImage` before clicking/typing to ensure elements are ready
8
+ 4. **Assert expectations**: After critical actions, use `assert` to verify the expected outcome
9
+ 5. **Share debugger URL**: After connecting, share the debugger URL with users so they can watch in real-time
10
+
11
+ ## Common Patterns
12
+
13
+ ### Login Flow
14
+
15
+ ```
16
+ 1. connect() - start sandbox
17
+ 2. getScreenshot() - see initial state
18
+ 3. hoverText("Username") - click username field
19
+ 4. type("user@example.com") - enter username
20
+ 5. hoverText("Password") - click password field
21
+ 6. type("password123") - enter password
22
+ 7. hoverText("Login") - click login button
23
+ 8. waitForText("Welcome") - wait for success
24
+ 9. assert("the user is logged in") - verify outcome
25
+ 10. getScreenshot() - capture final state
26
+ ```
27
+
28
+ ### Form Testing
29
+
30
+ ```
31
+ 1. Always wait for form elements before interacting
32
+ 2. Take screenshots before and after form submission
33
+ 3. Assert success/error messages appear
34
+ 4. Use remember() to capture dynamic values (order IDs, timestamps, etc.)
35
+ ```
36
+
37
+ ## Best Practices
38
+
39
+ - **Be patient**: Always wait for elements before clicking
40
+ - **Be specific**: Use descriptive text in hoverText/assert (e.g., "the blue Submit button" not just "Submit")
41
+ - **Verify everything**: Check screenshots to ensure actions succeeded
42
+ - **Handle errors**: If an action fails, take a screenshot to diagnose
43
+ - **Save tests**: Use `createTestFromActions` to save successful workflows
44
+
45
+ ## Common Mistakes to Avoid
46
+
47
+ ❌ Don't click elements that may not have loaded yet
48
+ ✅ Do use `waitForText` first
49
+
50
+ ❌ Don't assume actions succeeded without verification
51
+ ✅ Do check screenshots and use assertions
52
+
53
+ ❌ Don't chain many actions without pauses
54
+ ✅ Do add small waits between rapid actions
55
+
56
+ ❌ Don't forget to share the debugger URL
57
+ ✅ Do tell users where to watch the live VM screen
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "testdriverai",
3
- "version": "6.2.2",
3
+ "version": "7.0.0",
4
4
  "description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
5
- "main": "index.js",
5
+ "main": "sdk.js",
6
6
  "bin": {
7
7
  "testdriverai": "bin/testdriverai.js"
8
8
  },
@@ -10,12 +10,22 @@
10
10
  "start": "node bin/testdriverai.js",
11
11
  "dev": "DEV=true node bin/testdriverai.js",
12
12
  "debug": "DEV=true VERBOSE=true node bin/testdriverai.js",
13
- "docs": "node docs/_scripts/link-replacer.js && cd docs && npx mint@latest dev",
13
+ "docs": "cd docs && npx mint@latest dev",
14
14
  "docs:dev": "cd docs && npx mint dev",
15
- "docs:build": "node docs/_scripts/link-replacer.js && cd docs && npx mint@latest build",
15
+ "docs:build": "cd docs && npx mint@latest build",
16
16
  "docs:links": "node docs/_scripts/link-replacer.js",
17
17
  "bundle": "node build.mjs",
18
18
  "test": "mocha test/*",
19
+ "test:sdk": "vitest run",
20
+ "test:sdk:windows": "TEST_PLATFORM=windows vitest run",
21
+ "test:sdk:mac": "TEST_PLATFORM=mac vitest run",
22
+ "test:sdk:linux": "TEST_PLATFORM=linux vitest run",
23
+ "test:sdk:watch": "vitest",
24
+ "test:sdk:ui": "vitest --ui",
25
+ "test:sdk:coverage": "vitest run --coverage",
26
+ "test:sdk:single": "vitest run --reporter=verbose",
27
+ "test:sdk:report": "open test-results/index.html",
28
+ "test:sdk:results": "node scripts/view-test-results.mjs",
19
29
  "docs-lint": "cd docs && vale **/*.mdx",
20
30
  "docs-upload": "node upload-docs-to-openai.js",
21
31
  "runall": "dotenv testdriverai run --config testdriver.config.yaml --path './testdriver/*.testdriver.yaml'",
@@ -54,6 +64,7 @@
54
64
  "remark-parse": "^11.0.0",
55
65
  "sanitize-filename": "^1.6.3",
56
66
  "strip-ansi": "^6.0.1",
67
+ "terminal-image": "^4.1.0",
57
68
  "tmp": "^0.2.3",
58
69
  "winston": "^3.13.0",
59
70
  "winston-transport": "^4.9.0",
@@ -65,6 +76,7 @@
65
76
  },
66
77
  "devDependencies": {
67
78
  "@eslint/js": "^9.10.0",
79
+ "@vitest/ui": "^4.0.8",
68
80
  "chai": "^5.1.2",
69
81
  "esbuild": "0.20.2",
70
82
  "esbuild-plugin-fileloc": "^0.0.6",
@@ -75,7 +87,8 @@
75
87
  "mint": "^4.2.67",
76
88
  "mocha": "^10.8.2",
77
89
  "node-addon-api": "^8.0.0",
78
- "prettier": "3.3.3"
90
+ "prettier": "3.3.3",
91
+ "vitest": "^4.0.8"
79
92
  },
80
93
  "optionalDependencies": {
81
94
  "@esbuild/linux-x64": "^0.21.5"
package/schema.json CHANGED
@@ -301,13 +301,6 @@
301
301
  },
302
302
  "amount": {
303
303
  "type": "integer"
304
- },
305
- "method": {
306
- "type": "string",
307
- "enum": [
308
- "keyboard",
309
- "mouse"
310
- ]
311
304
  }
312
305
  }
313
306
  },
@@ -353,8 +346,8 @@
353
346
  "right-click",
354
347
  "double-click",
355
348
  "hover",
356
- "drag-start",
357
- "drag-end"
349
+ "mouseDown",
350
+ "mouseUp"
358
351
  ]
359
352
  }
360
353
  }
@@ -405,8 +398,8 @@
405
398
  "right-click",
406
399
  "double-click",
407
400
  "hover",
408
- "drag-start",
409
- "drag-end"
401
+ "mouseDown",
402
+ "mouseUp"
410
403
  ]
411
404
  },
412
405
  "method": {
@@ -443,8 +436,8 @@
443
436
  "right-click",
444
437
  "double-click",
445
438
  "hover",
446
- "drag-start",
447
- "drag-end"
439
+ "mouseDown",
440
+ "mouseUp"
448
441
  ]
449
442
  }
450
443
  }
@@ -471,8 +464,8 @@
471
464
  "right-click",
472
465
  "double-click",
473
466
  "hover",
474
- "drag-start",
475
- "drag-end"
467
+ "mouseDown",
468
+ "mouseUp"
476
469
  ]
477
470
  },
478
471
  "invert": {
@@ -558,13 +551,6 @@
558
551
  "distance": {
559
552
  "type": "integer"
560
553
  },
561
- "method": {
562
- "type": "string",
563
- "enum": [
564
- "keyboard",
565
- "mouse"
566
- ]
567
- },
568
554
  "invert": {
569
555
  "type": "boolean"
570
556
  }
@@ -598,13 +584,6 @@
598
584
  },
599
585
  "distance": {
600
586
  "type": "integer"
601
- },
602
- "method" : {
603
- "type": "string",
604
- "enum": [
605
- "keyboard",
606
- "mouse"
607
- ]
608
587
  },
609
588
  "invert": {
610
589
  "type": "boolean"
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * TestDriver SDK Test Results Viewer
5
+ * Displays a formatted summary of test results from the JSON output
6
+ */
7
+
8
+ import fs from "fs";
9
+ import path from "path";
10
+
11
+ const RESULTS_PATH = "test-results/results.json";
12
+
13
+ function formatDuration(ms) {
14
+ if (ms < 1000) return `${ms}ms`;
15
+ return `${(ms / 1000).toFixed(2)}s`;
16
+ }
17
+
18
+ function displayResults() {
19
+ if (!fs.existsSync(RESULTS_PATH)) {
20
+ console.error("❌ No test results found. Run tests first:");
21
+ console.error(" npm run test:sdk");
22
+ process.exit(1);
23
+ }
24
+
25
+ const results = JSON.parse(fs.readFileSync(RESULTS_PATH, "utf8"));
26
+
27
+ const total = results.numTotalTests || 0;
28
+ const passed = results.numPassedTests || 0;
29
+ const failed = results.numFailedTests || 0;
30
+ const skipped = results.numPendingTests || 0;
31
+ const duration = results.testResults?.reduce(
32
+ (sum, file) => sum + (file.endTime - file.startTime),
33
+ 0,
34
+ );
35
+
36
+ console.log("\n🧪 TestDriver SDK Test Results");
37
+ console.log("═".repeat(50));
38
+ console.log(`✅ Passed: ${passed}/${total}`);
39
+ console.log(`❌ Failed: ${failed}/${total}`);
40
+ console.log(`⏭️ Skipped: ${skipped}/${total}`);
41
+ console.log(`⏱️ Duration: ${formatDuration(duration)}`);
42
+ console.log("═".repeat(50));
43
+
44
+ if (failed > 0) {
45
+ console.log("\n❌ Failed Tests:\n");
46
+ results.testResults?.forEach((file) => {
47
+ const failedTests =
48
+ file.assertionResults?.filter((test) => test.status === "failed") || [];
49
+
50
+ if (failedTests.length > 0) {
51
+ console.log(`📁 ${path.relative(process.cwd(), file.name)}`);
52
+ failedTests.forEach((test) => {
53
+ console.log(` ❌ ${test.title}`);
54
+ console.log(` Duration: ${formatDuration(test.duration)}`);
55
+ if (test.failureMessages?.length > 0) {
56
+ console.log("\n Error:");
57
+ test.failureMessages.forEach((msg) => {
58
+ // Truncate very long error messages
59
+ const truncated =
60
+ msg.length > 500 ? msg.substring(0, 500) + "..." : msg;
61
+ console.log(
62
+ " " + truncated.split("\n").join("\n ") + "\n",
63
+ );
64
+ });
65
+ }
66
+ });
67
+ console.log();
68
+ }
69
+ });
70
+ }
71
+
72
+ if (passed > 0) {
73
+ console.log("✅ Passed Tests:\n");
74
+ results.testResults?.forEach((file) => {
75
+ const passedTests =
76
+ file.assertionResults?.filter((test) => test.status === "passed") || [];
77
+
78
+ if (passedTests.length > 0) {
79
+ console.log(`📁 ${path.relative(process.cwd(), file.name)}`);
80
+ passedTests.forEach((test) => {
81
+ console.log(` ✅ ${test.title} (${formatDuration(test.duration)})`);
82
+ });
83
+ console.log();
84
+ }
85
+ });
86
+ }
87
+
88
+ console.log("\n📊 View detailed HTML report:");
89
+ console.log(" npm run test:sdk:report");
90
+ console.log(" or open: test-results/index.html\n");
91
+
92
+ // Exit with error code if tests failed
93
+ process.exit(failed > 0 ? 1 : 0);
94
+ }
95
+
96
+ displayResults();