testdriverai 6.2.2 → 7.1.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 (300) 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/AGENTS.md +550 -0
  5. package/CODEOWNERS +0 -1
  6. package/README.md +126 -0
  7. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  8. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  9. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  10. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  11. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  12. package/_testdriver/lifecycle/prerun.yaml +15 -0
  13. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  14. package/agent/index.js +300 -85
  15. package/agent/interface.js +15 -0
  16. package/agent/lib/cache.js +142 -0
  17. package/agent/lib/commander.js +1 -39
  18. package/agent/lib/commands.js +910 -296
  19. package/agent/lib/redraw.js +129 -41
  20. package/agent/lib/sandbox.js +29 -6
  21. package/agent/lib/sdk.js +22 -0
  22. package/agent/lib/system.js +0 -3
  23. package/agent/lib/validation.js +1 -7
  24. package/debug-locate-response.js +82 -0
  25. package/debugger/index.html +15 -4
  26. package/docs/ARCHITECTURE.md +424 -0
  27. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  28. package/docs/MIGRATION.md +425 -0
  29. package/docs/PRESETS.md +210 -0
  30. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  31. package/docs/SDK_AWESOME_LOGS.md +468 -0
  32. package/docs/TEST_RECORDING.md +388 -0
  33. package/docs/docs.json +286 -152
  34. package/docs/guide/best-practices-polling.mdx +154 -0
  35. package/docs/sdk-browser-rendering.md +167 -0
  36. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  37. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  38. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  39. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  40. package/docs/v6/overview/comparison.mdx +101 -0
  41. package/docs/v7/README.md +135 -0
  42. package/docs/v7/api/ai.mdx +205 -0
  43. package/docs/v7/api/assert.mdx +285 -0
  44. package/docs/v7/api/assertions.mdx +403 -0
  45. package/docs/v7/api/click.mdx +287 -0
  46. package/docs/v7/api/client.mdx +322 -0
  47. package/docs/v7/api/dashcam.mdx +497 -0
  48. package/docs/v7/api/doubleClick.mdx +102 -0
  49. package/docs/v7/api/elements.mdx +479 -0
  50. package/docs/v7/api/exec.mdx +346 -0
  51. package/docs/v7/api/find.mdx +316 -0
  52. package/docs/v7/api/focusApplication.mdx +294 -0
  53. package/docs/v7/api/hover.mdx +279 -0
  54. package/docs/v7/api/mouseDown.mdx +161 -0
  55. package/docs/v7/api/mouseUp.mdx +164 -0
  56. package/docs/v7/api/pressKeys.mdx +349 -0
  57. package/docs/v7/api/rightClick.mdx +123 -0
  58. package/docs/v7/api/sandbox.mdx +404 -0
  59. package/docs/v7/api/scroll.mdx +300 -0
  60. package/docs/v7/api/type.mdx +314 -0
  61. package/docs/v7/commands/assert.mdx +45 -0
  62. package/docs/v7/commands/exec.mdx +282 -0
  63. package/docs/v7/commands/focus-application.mdx +44 -0
  64. package/docs/v7/commands/hover-image.mdx +69 -0
  65. package/docs/v7/commands/hover-text.mdx +47 -0
  66. package/docs/v7/commands/if.mdx +53 -0
  67. package/docs/v7/commands/match-image.mdx +67 -0
  68. package/docs/v7/commands/press-keys.mdx +87 -0
  69. package/docs/v7/commands/remember.mdx +49 -0
  70. package/docs/v7/commands/run.mdx +44 -0
  71. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  72. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  73. package/docs/v7/commands/scroll.mdx +69 -0
  74. package/docs/v7/commands/type.mdx +45 -0
  75. package/docs/v7/commands/wait-for-image.mdx +54 -0
  76. package/docs/v7/commands/wait-for-text.mdx +48 -0
  77. package/docs/v7/commands/wait.mdx +45 -0
  78. package/docs/v7/getting-started/configuration.mdx +380 -0
  79. package/docs/v7/getting-started/quickstart.mdx +332 -0
  80. package/docs/v7/guides/best-practices.mdx +486 -0
  81. package/docs/v7/guides/caching-ai.mdx +215 -0
  82. package/docs/v7/guides/caching-selectors.mdx +292 -0
  83. package/docs/v7/guides/caching.mdx +366 -0
  84. package/docs/v7/guides/ci-cd/azure.mdx +587 -0
  85. package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
  86. package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
  87. package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
  88. package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
  89. package/docs/v7/guides/ci-cd/travis.mdx +438 -0
  90. package/docs/v7/guides/debugging.mdx +349 -0
  91. package/docs/v7/guides/faq.mdx +393 -0
  92. package/docs/v7/guides/migration.mdx +562 -0
  93. package/docs/v7/guides/performance.mdx +517 -0
  94. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  95. package/docs/v7/guides/troubleshooting.mdx +526 -0
  96. package/docs/v7/guides/vitest-plugin.mdx +477 -0
  97. package/docs/v7/guides/vitest.mdx +535 -0
  98. package/docs/v7/platforms/linux.mdx +308 -0
  99. package/docs/v7/platforms/macos.mdx +433 -0
  100. package/docs/v7/platforms/windows.mdx +430 -0
  101. package/docs/v7/playwright.mdx +342 -0
  102. package/docs/v7/presets/chrome-extension.mdx +223 -0
  103. package/docs/v7/presets/chrome.mdx +287 -0
  104. package/docs/v7/presets/electron.mdx +435 -0
  105. package/docs/v7/presets/vscode.mdx +398 -0
  106. package/docs/v7/presets/webapp.mdx +396 -0
  107. package/docs/v7/progressive-apis/CORE.md +459 -0
  108. package/docs/v7/progressive-apis/HOOKS.md +360 -0
  109. package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
  110. package/docs/v7/progressive-apis/PROVISION.md +266 -0
  111. package/eslint.config.js +19 -1
  112. package/interfaces/cli/lib/base.js +10 -4
  113. package/interfaces/logger.js +2 -1
  114. package/interfaces/shared-test-state.mjs +69 -0
  115. package/interfaces/vitest-plugin.mjs +830 -0
  116. package/package.json +29 -5
  117. package/schema.json +8 -29
  118. package/scripts/view-test-results.mjs +96 -0
  119. package/sdk-log-formatter.js +714 -0
  120. package/sdk.d.ts +1028 -0
  121. package/sdk.js +2567 -0
  122. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  123. package/setup/aws/cloudformation.yaml +9 -2
  124. package/src/core/Dashcam.js +469 -0
  125. package/src/core/index.d.ts +150 -0
  126. package/src/core/index.js +12 -0
  127. package/src/presets/index.mjs +331 -0
  128. package/src/vitest/extended.mjs +108 -0
  129. package/src/vitest/hooks.d.ts +119 -0
  130. package/src/vitest/hooks.mjs +298 -0
  131. package/src/vitest/index.mjs +64 -0
  132. package/src/vitest/lifecycle.mjs +277 -0
  133. package/src/vitest/utils.mjs +150 -0
  134. package/test/dashcam.test.js +137 -0
  135. package/test/mcp-example-test.yaml +27 -0
  136. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  137. package/testdriver/acceptance-sdk/README.md +128 -0
  138. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  139. package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
  140. package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
  141. package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
  142. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
  143. package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
  144. package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
  145. package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
  146. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
  147. package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
  148. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
  149. package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
  150. package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
  151. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
  152. package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
  153. package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
  154. package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
  155. package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
  156. package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
  157. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
  158. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
  159. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
  160. package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
  161. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  162. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
  163. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  164. package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
  165. package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
  166. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  167. package/testdriver/acceptance-sdk/type.test.mjs +45 -0
  168. package/verify-element-api.js +89 -0
  169. package/verify-types.js +0 -0
  170. package/vitest.config.example.js +19 -0
  171. package/vitest.config.mjs +66 -0
  172. package/vitest.config.mjs.bak +44 -0
  173. package/.github/workflows/acceptance-v6.yml +0 -169
  174. package/.vscode/mcp.json +0 -9
  175. package/docs/overview/comparison.mdx +0 -82
  176. package/testdriver/lifecycle/prerun.yaml +0 -17
  177. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  178. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  179. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  180. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  181. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  182. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  183. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  184. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  185. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  186. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  187. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  188. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  189. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  190. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  191. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  192. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  193. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  194. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  195. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  196. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  197. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  198. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  199. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  200. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  201. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  202. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  203. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  204. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  205. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  206. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  207. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  208. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  209. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  210. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  211. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  212. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  213. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  214. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  215. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  216. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  217. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  218. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  219. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  220. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  221. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  222. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  223. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  224. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  225. /package/docs/{account → v6/account}/projects.mdx +0 -0
  226. /package/docs/{account → v6/account}/team.mdx +0 -0
  227. /package/docs/{action → v6/action}/ami.mdx +0 -0
  228. /package/docs/{action → v6/action}/performance.mdx +0 -0
  229. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  230. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  231. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  232. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  233. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  234. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  235. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  236. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  237. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  238. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  239. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  240. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  241. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  242. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  243. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  244. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  245. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  246. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  247. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  248. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  249. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  250. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  251. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  252. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  253. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  254. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  255. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  256. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  257. /package/docs/{features → v6/features}/generation.mdx +0 -0
  258. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  259. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  260. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  261. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  262. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  263. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  264. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  265. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  266. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  267. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  268. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  269. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  270. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  271. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  272. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  273. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  274. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  275. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  276. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  277. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  278. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  279. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  280. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  281. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  282. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  283. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  284. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  285. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  286. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  287. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  288. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  289. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  290. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  291. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  292. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  293. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  294. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  295. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  296. /package/docs/{security → v6/security}/action.mdx +0 -0
  297. /package/docs/{security → v6/security}/agent.mdx +0 -0
  298. /package/docs/{security → v6/security}/platform.mdx +0 -0
  299. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  300. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
@@ -0,0 +1,215 @@
1
+ # Quick Start: TestDriver Test Recording
2
+
3
+ ## What You Get
4
+
5
+ - 📊 Track all test runs in the TestDriver dashboard
6
+ - 🎥 Link dashcam screen recordings to specific tests
7
+ - 🔄 Integrate with CI/CD (GitHub Actions, GitLab, etc.)
8
+ - 🐛 View exact replay of failed tests
9
+ - 📈 Track test performance and flakiness over time
10
+
11
+ ## Setup (5 minutes)
12
+
13
+ ### 1. Add Vitest Plugin
14
+
15
+ ```javascript
16
+ // vitest.config.mjs
17
+ import { defineConfig } from 'vitest/config';
18
+ import testDriverPlugin from './interfaces/vitest-plugin.mjs';
19
+
20
+ export default defineConfig({
21
+ plugins: [
22
+ testDriverPlugin({
23
+ apiKey: process.env.TD_API_KEY,
24
+ apiRoot: process.env.TD_API_ROOT || 'https://testdriver-api.onrender.com',
25
+ }),
26
+ ],
27
+ });
28
+ ```
29
+
30
+ ### 2. Set API Key
31
+
32
+ ```bash
33
+ export TD_API_KEY="your-api-key-here"
34
+ ```
35
+
36
+ Get your API key from: https://app.testdriver.ai/settings/api-keys
37
+
38
+ ### 3. Run Tests
39
+
40
+ ```bash
41
+ npx vitest run
42
+ ```
43
+
44
+ That's it! Your tests are now being recorded. View results at:
45
+ https://app.testdriver.ai/dashboard/test-runs
46
+
47
+ ## With Dashcam (Optional)
48
+
49
+ To link screen recordings with tests, simply register the dashcam URL after your test completes:
50
+
51
+ ```javascript
52
+ import { test } from 'vitest';
53
+ import TestDriver from '@testdriverai/sdk';
54
+
55
+ test('my test', async () => {
56
+ const client = await TestDriver({ apiKey: 'your-api-key' });
57
+
58
+ // Run your test...
59
+ await client.get('https://example.com');
60
+
61
+ // Get dashcam URL and register it
62
+ const dashcamUrl = await client.dashcam.publish();
63
+
64
+ // Register with the plugin - it will automatically associate with this test
65
+ if (globalThis.__testdriverPlugin) {
66
+ globalThis.__testdriverPlugin.registerDashcamUrl(
67
+ 'my-test-id', // Or use task.id in Vitest context
68
+ dashcamUrl,
69
+ client.os
70
+ );
71
+ }
72
+
73
+ await client.disconnect();
74
+ });
75
+ ```
76
+
77
+ The plugin automatically tracks all dashcam URLs in memory (no temp files needed!) and associates them with test results.
78
+
79
+ ## CI/CD Integration
80
+
81
+ ### GitHub Actions
82
+
83
+ ```yaml
84
+ # .github/workflows/test.yml
85
+ name: Tests
86
+ on: [push]
87
+ jobs:
88
+ test:
89
+ runs-on: windows-latest
90
+ steps:
91
+ - uses: actions/checkout@v3
92
+ - run: npm install
93
+ - run: npx vitest run
94
+ env:
95
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
96
+ ```
97
+
98
+ ### GitLab CI
99
+
100
+ ```yaml
101
+ # .gitlab-ci.yml
102
+ test:
103
+ script:
104
+ - npm install
105
+ - npx vitest run
106
+ variables:
107
+ TD_API_KEY: $CI_JOB_TOKEN
108
+ ```
109
+
110
+ The reporter automatically detects CI environment and records:
111
+ - Git repo, branch, commit
112
+ - CI provider and run URL
113
+ - Test results and timing
114
+
115
+ ## What Gets Recorded
116
+
117
+ ### Test Run
118
+ - Suite name and platform
119
+ - Total/passed/failed counts
120
+ - Duration
121
+ - CI/CD metadata
122
+ - Git commit info
123
+
124
+ ### Each Test
125
+ - Test name and file
126
+ - Pass/fail status
127
+ - Error messages (if failed)
128
+ - Duration
129
+ - Dashcam replay link (if available)
130
+
131
+ ## View Results
132
+
133
+ Dashboard shows:
134
+ - All test runs with filters
135
+ - Drill down to individual tests
136
+ - Embedded dashcam replay player
137
+ - Link to CI/CD runs
138
+ - Test history and trends
139
+
140
+ ## SDK Methods
141
+
142
+ Use in your test code:
143
+
144
+ ```javascript
145
+ // Create test run
146
+ const testRun = await client.createTestRun({
147
+ runId: 'unique-id',
148
+ suiteName: 'My Tests',
149
+ platform: 'windows'
150
+ });
151
+
152
+ // Record test result
153
+ await client.recordTestCase({
154
+ runId: 'unique-id',
155
+ testName: 'my test',
156
+ status: 'passed',
157
+ replayUrl: 'https://app.dashcam.io/replay/abc'
158
+ });
159
+
160
+ // Complete run
161
+ await client.completeTestRun({
162
+ runId: 'unique-id',
163
+ status: 'passed'
164
+ });
165
+ ```
166
+
167
+ ## Troubleshooting
168
+
169
+ **Reporter not recording?**
170
+ - Check `TD_API_KEY` is set
171
+ - Verify network connectivity to TestDriver API
172
+ - Look for reporter logs in test output
173
+
174
+ **No dashcam link?**
175
+ - Ensure dashcam publishes and outputs replay URL
176
+ - Check test logs for replay URL output
177
+ - Manually set `DASHCAM_REPLAY_URL` if needed
178
+
179
+ **CI metadata missing?**
180
+ - CI environment variables must be available
181
+ - Supported: GitHub Actions, GitLab CI, CircleCI, Travis, Jenkins
182
+
183
+ ## Files Created
184
+
185
+ **API (Backend)**
186
+ - `api/models/TdTestRun.js` - Test run model
187
+ - `api/models/TdTestCase.js` - Test case model
188
+ - `api/models/TdSandbox.js` - Sandbox tracking model
189
+ - `api/controllers/testdriver/testdriver-test-run-create.js` - Create test run endpoint
190
+ - `api/controllers/testdriver/testdriver-test-run-complete.js` - Complete test run endpoint
191
+ - `api/controllers/testdriver/testdriver-test-case-create.js` - Record test case endpoint
192
+
193
+ **CLI/SDK**
194
+ - `cli/interfaces/vitest-plugin.mjs` - Vitest plugin for test recording
195
+ - `cli/sdk.js` - Added createTestRun(), recordTestCase(), completeTestRun() methods
196
+
197
+ **Documentation**
198
+ - `cli/docs/TEST_RECORDING.md` - Complete guide
199
+ - `cli/docs/ARCHITECTURE.md` - Technical architecture
200
+ - `cli/vitest.config.example.js` - Example config
201
+ - `cli/examples/test-recording-example.test.js` - Example test
202
+ - `cli/examples/run-tests-with-recording.sh` - Example script
203
+
204
+ ## Next Steps
205
+
206
+ 1. **Try it out**: Run `npx vitest run` and check the dashboard
207
+ 2. **Add dashcam**: Record your tests with screen capture
208
+ 3. **Set up CI/CD**: Add to your pipeline for continuous tracking
209
+ 4. **Build dashboard UI**: Create Vue components to visualize test runs (next phase)
210
+
211
+ ## Support
212
+
213
+ - Documentation: https://docs.testdriver.ai
214
+ - Dashboard: https://app.testdriver.ai
215
+ - API Reference: /cli/docs/TEST_RECORDING.md
@@ -0,0 +1,468 @@
1
+ # TestDriver SDK - AWESOME Logs 🎨
2
+
3
+ Beautiful, emoji-rich logging with incredible DX that makes your test output a joy to read!
4
+
5
+ ## Features
6
+
7
+ ✨ **Rich Emojis & UTF-8** - Full emoji support now that dashcam supports UTF-8!
8
+ 🎨 **Color-Coded Actions** - Different colors for different action types
9
+ ⚡ **Performance Indicators** - Color-coded duration times (green < 100ms, yellow < 500ms, red > 500ms)
10
+ 📊 **Progress Tracking** - Beautiful progress bars for multi-step operations
11
+ 🔍 **Cache Visualization** - Clear indication of cache hits/misses
12
+ 📍 **Coordinate Display** - See exactly where elements are found
13
+ ⏱️ **Timing Information** - Elapsed time from test start on every log
14
+ 📦 **Beautiful Headers** - Box-drawn section headers for organization
15
+
16
+ ## Log Types
17
+
18
+ ### 🔍 Element Finding
19
+
20
+ ```javascript
21
+ const element = await client.find("submit button");
22
+ ```
23
+
24
+ **Output:**
25
+ ```
26
+ [2.34s] 🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
27
+ ```
28
+
29
+ Features:
30
+ - Green checkmark for successful finds
31
+ - Coordinates with pin emoji
32
+ - Duration with color coding
33
+ - Cache status with lightning bolt
34
+
35
+ ### 👆 User Actions
36
+
37
+ ```javascript
38
+ await element.click();
39
+ await element.hover();
40
+ await client.type("hello world");
41
+ ```
42
+
43
+ **Output:**
44
+ ```
45
+ [2.51s] 👆 Click "submit button"
46
+ [2.67s] 👉 Hover "menu item"
47
+ [2.89s] ⌨️ Type → hello world
48
+ ```
49
+
50
+ Action emojis:
51
+ - 👆 Click
52
+ - 👆👆 Double-click
53
+ - 🖱️ Right-click
54
+ - 👉 Hover
55
+ - ⌨️ Type
56
+ - 🎹 Press Keys
57
+ - 📜 Scroll
58
+
59
+ ### ✅ Assertions
60
+
61
+ ```javascript
62
+ await client.assert("page title is Example Domain");
63
+ ```
64
+
65
+ **Output:**
66
+ ```
67
+ [3.12s] ✅ Assert "page title is Example Domain" · ✓ PASSED · ⏱️ 45ms
68
+ [3.45s] ❌ Assert "login form visible" · ✗ FAILED · ⏱️ 1234ms
69
+ ```
70
+
71
+ Color-coded results:
72
+ - ✅ Green for PASSED
73
+ - ❌ Red for FAILED
74
+ - Performance-based duration coloring
75
+
76
+ ### ⚡ Cache Performance
77
+
78
+ The SDK automatically logs cache performance:
79
+
80
+ **Cache HIT:**
81
+ ```
82
+ ⚡ Cache HIT · 98.5% similar · image strategy
83
+ ```
84
+
85
+ **Cache MISS:**
86
+ ```
87
+ 💤 Cache MISS · text strategy
88
+ ```
89
+
90
+ ### 🔌 Connection Status
91
+
92
+ ```javascript
93
+ await client.connect();
94
+ await client.disconnect();
95
+ ```
96
+
97
+ **Output:**
98
+ ```
99
+ 🔌 Connected · Sandbox: i-0a1b2c3d4e5f6 · OS: windows
100
+ 🔌 Disconnected
101
+ ```
102
+
103
+ ### 📸 Screenshots
104
+
105
+ ```javascript
106
+ await client.screenshot();
107
+ ```
108
+
109
+ **Output:**
110
+ ```
111
+ [5.67s] 📸 Screenshot · /tmp/testdriver-debug/screenshot-123.png · 245 KB
112
+ ```
113
+
114
+ ### 🚨 Errors
115
+
116
+ Errors are beautifully formatted with context:
117
+
118
+ ```
119
+ [8.90s] ❌ Element not found → Timeout after 5000ms
120
+ ```
121
+
122
+ ### 📈 Progress Tracking
123
+
124
+ For multi-step operations:
125
+
126
+ ```
127
+ Progress ████████████████████ 100% 5/5 · Processing complete
128
+ ```
129
+
130
+ ### 📊 Test Summary
131
+
132
+ At the end of your test suite:
133
+
134
+ ```
135
+ ────────────────────────────────────────────────────────────
136
+ ✓ 12 passed │ ✗ 2 failed │ ⊘ 1 skipped │ 15 total │ ⏱️ 45.23s
137
+ ────────────────────────────────────────────────────────────
138
+ ```
139
+
140
+ ### 📦 Section Headers
141
+
142
+ Organize your test output with beautiful headers:
143
+
144
+ ```
145
+ ╭────────────────────────────────────────────────────────────╮
146
+ │ ✨ User Authentication Flow │
147
+ ╰────────────────────────────────────────────────────────────╯
148
+ ```
149
+
150
+ ## Configuration
151
+
152
+ ### Enable/Disable Logging
153
+
154
+ ```javascript
155
+ const client = new TestDriver(apiKey, {
156
+ logging: true, // Enable logging (default)
157
+ });
158
+
159
+ // Or disable later
160
+ client.setLogging(false);
161
+ ```
162
+
163
+ ### Emojis vs Simple Symbols
164
+
165
+ The formatter automatically uses emojis when available. If you need to disable emojis:
166
+
167
+ ```javascript
168
+ const { formatter } = require('testdriverai/sdk-log-formatter');
169
+ formatter.useEmojis = false; // Falls back to simple Unicode symbols
170
+ ```
171
+
172
+ ### Test Context Integration
173
+
174
+ Integrate with Vitest or other test frameworks:
175
+
176
+ ```javascript
177
+ import { describe, it, beforeEach } from 'vitest';
178
+
179
+ describe('Login Tests', () => {
180
+ let client;
181
+
182
+ beforeEach(() => {
183
+ client = new TestDriver(process.env.TD_API_KEY);
184
+
185
+ // Set test context for better logging
186
+ client.setTestContext({
187
+ file: 'login.test.js',
188
+ test: 'should log in successfully',
189
+ startTime: Date.now()
190
+ });
191
+ });
192
+
193
+ it('should log in successfully', async () => {
194
+ // All logs will now include elapsed time from test start
195
+ await client.connect();
196
+ // ...test code...
197
+ });
198
+ });
199
+ ```
200
+
201
+ ## Examples
202
+
203
+ ### Basic Usage
204
+
205
+ ```javascript
206
+ const TestDriver = require('testdriverai');
207
+
208
+ const client = new TestDriver(process.env.TD_API_KEY, {
209
+ logging: true,
210
+ });
211
+
212
+ await client.connect();
213
+
214
+ // Find and click - logs automatically
215
+ const button = await client.find('submit button');
216
+ await button.click();
217
+
218
+ await client.disconnect();
219
+ ```
220
+
221
+ **Output:**
222
+ ```
223
+ 🔌 Connected · Sandbox: i-0a1b2c3d · OS: windows
224
+ 🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
225
+ 👆 Click "submit button"
226
+ 🔌 Disconnected
227
+ ```
228
+
229
+ ### Manual Formatting
230
+
231
+ You can also use the formatter directly for custom logs:
232
+
233
+ ```javascript
234
+ const { formatter } = require('testdriverai/sdk-log-formatter');
235
+
236
+ // Format custom messages
237
+ console.log(formatter.formatHeader('My Test Suite', '🧪'));
238
+ console.log(formatter.formatAction('custom action', 'my element'));
239
+ console.log(formatter.formatProgress(3, 10, 'Processing...'));
240
+ console.log(formatter.formatDivider());
241
+ ```
242
+
243
+ ### Performance Monitoring
244
+
245
+ Duration colors help you spot slow operations:
246
+
247
+ - **🟢 Green** (< 100ms): Fast, optimal
248
+ - **🟡 Yellow** (100-500ms): Acceptable
249
+ - **🔴 Red** (> 500ms): Slow, may need optimization
250
+
251
+ Example output:
252
+ ```
253
+ ⏱️ 45ms ← Green (fast)
254
+ ⏱️ 234ms ← Yellow (acceptable)
255
+ ⏱️ 1.2s ← Red (slow)
256
+ ```
257
+
258
+ ### Cache Monitoring
259
+
260
+ Track cache effectiveness in real-time:
261
+
262
+ ```javascript
263
+ // Enable cache debugging
264
+ process.env.VERBOSE = 'true';
265
+
266
+ // Now you'll see detailed cache info
267
+ const element = await client.find('button');
268
+ ```
269
+
270
+ **Output:**
271
+ ```
272
+ 🔍 find() threshold: 0.05 (cache ENABLED)
273
+ 🔍 Found "button" · 📍 (500, 300) · ⏱️ 89ms · ⚡ cached
274
+
275
+ Element Found:
276
+ Description: button
277
+ Coordinates: (500, 300)
278
+ Duration: 89ms
279
+ Cache Hit: ✅ YES
280
+ Cache Strategy: image
281
+ Similarity: 98.50%
282
+ Cache Age: 2s (created: 2024-11-18T15:30:45.123Z)
283
+ Pixel Diff: 1.23%
284
+ ```
285
+
286
+ ## Advanced Features
287
+
288
+ ### Test Lifecycle Tracking
289
+
290
+ ```javascript
291
+ const { formatter } = require('testdriverai/sdk-log-formatter');
292
+
293
+ // Test start
294
+ console.log(formatter.formatTestStart('Login Flow'));
295
+
296
+ // ... test code ...
297
+
298
+ // Test end
299
+ console.log(formatter.formatTestEnd('Login Flow', true, 2345));
300
+ ```
301
+
302
+ **Output:**
303
+ ```
304
+ ▶️ Running: Login Flow
305
+
306
+ ✅ PASSED Login Flow · 2.35s
307
+ ```
308
+
309
+ ### Multi-Step Workflows
310
+
311
+ ```javascript
312
+ const steps = [
313
+ 'Navigate to login',
314
+ 'Enter credentials',
315
+ 'Submit form',
316
+ 'Verify dashboard',
317
+ 'Logout'
318
+ ];
319
+
320
+ for (let i = 0; i < steps.length; i++) {
321
+ console.log(formatter.formatProgress(i + 1, steps.length, steps[i]));
322
+ // ... perform step ...
323
+ }
324
+ ```
325
+
326
+ **Output:**
327
+ ```
328
+ Progress ████░░░░░░░░░░░░░░░░ 20% 1/5 · Navigate to login
329
+ Progress ████████░░░░░░░░░░░░ 40% 2/5 · Enter credentials
330
+ Progress ████████████░░░░░░░░ 60% 3/5 · Submit form
331
+ Progress ████████████████░░░░ 80% 4/5 · Verify dashboard
332
+ Progress ████████████████████ 100% 5/5 · Logout
333
+ ```
334
+
335
+ ### Error Reporting
336
+
337
+ ```javascript
338
+ try {
339
+ await client.find('non-existent element');
340
+ } catch (error) {
341
+ console.log(formatter.formatError('Element search failed', error));
342
+ }
343
+ ```
344
+
345
+ **Output:**
346
+ ```
347
+ ❌ Element search failed → Element "non-existent element" not found.
348
+
349
+ === Debug Information ===
350
+ Element searched for: "non-existent element"
351
+ Cache threshold: 0.05 (95.0% similarity required)
352
+ Cache: MISS
353
+ Similarity score: 45.23%
354
+ Current screenshot: /tmp/testdriver-debug/screenshot-1234.png
355
+ ```
356
+
357
+ ## Tips for Great Logs
358
+
359
+ 1. **Use descriptive element descriptions** - They appear in the logs!
360
+ ```javascript
361
+ // ✅ Good
362
+ await client.find('blue submit button in login form');
363
+
364
+ // ❌ Less helpful
365
+ await client.find('button');
366
+ ```
367
+
368
+ 2. **Leverage test context** - Set it once, get timestamps on all logs
369
+ ```javascript
370
+ client.setTestContext({
371
+ test: 'User Login',
372
+ startTime: Date.now()
373
+ });
374
+ ```
375
+
376
+ 3. **Monitor cache performance** - Use VERBOSE mode during development
377
+ ```bash
378
+ VERBOSE=true node my-test.js
379
+ ```
380
+
381
+ 4. **Organize with headers** - Make long test output scannable
382
+ ```javascript
383
+ console.log(formatter.formatHeader('Setup Phase', '⚙️'));
384
+ // ... setup code ...
385
+
386
+ console.log(formatter.formatHeader('Test Execution', '🧪'));
387
+ // ... test code ...
388
+ ```
389
+
390
+ 5. **Track progress** - Show users what's happening in long-running tests
391
+ ```javascript
392
+ for (let i = 0; i < items.length; i++) {
393
+ console.log(formatter.formatProgress(i + 1, items.length));
394
+ // ... process item ...
395
+ }
396
+ ```
397
+
398
+ ## Demo
399
+
400
+ Run the comprehensive demo to see all logging features:
401
+
402
+ ```bash
403
+ TD_API_KEY=your_key node examples/sdk-awesome-logs-demo.js
404
+ ```
405
+
406
+ Or check out the cache thresholds example:
407
+
408
+ ```bash
409
+ TD_API_KEY=your_key VERBOSE=true node examples/sdk-cache-thresholds.js
410
+ ```
411
+
412
+ ## Color Reference
413
+
414
+ The logging system uses consistent color coding:
415
+
416
+ - **🔵 Blue**: Info, navigation, system messages
417
+ - **🟢 Green**: Success, passed assertions, fast operations
418
+ - **🟡 Yellow**: Warnings, caching, acceptable performance
419
+ - **🔴 Red**: Errors, failures, slow operations
420
+ - **🟣 Magenta**: Finding/searching operations
421
+ - **🔵 Cyan**: User actions, interactive elements
422
+ - **⚪ Gray**: Debug info, metadata, timestamps
423
+
424
+ ## Emoji Reference
425
+
426
+ ### Actions
427
+ - 👆 Click / Tap
428
+ - 👉 Hover / Point
429
+ - ⌨️ Type / Keyboard input
430
+ - 🎹 Press keys
431
+ - 📜 Scroll
432
+ - 🖱️ Right-click
433
+ - ✊ Drag
434
+
435
+ ### Status
436
+ - ✅ Success / Passed
437
+ - ❌ Error / Failed
438
+ - ⚠️ Warning
439
+ - ℹ️ Info
440
+ - 🔧 Debug
441
+
442
+ ### Operations
443
+ - 🔍 Find / Search
444
+ - 🔎 Find all
445
+ - 📸 Screenshot
446
+ - 🧠 Remember (AI)
447
+ - 🎯 Focus
448
+ - ⚡ Cache hit
449
+ - 💤 Cache miss
450
+
451
+ ### System
452
+ - 🔌 Connect / Disconnect
453
+ - 🚀 Launch / Start
454
+ - 🏁 Finish / End
455
+ - ⏳ Waiting / Loading
456
+ - ⏱️ Duration / Time
457
+ - 📍 Location / Coordinates
458
+ - 📊 Statistics / Summary
459
+ - 📈 Progress
460
+
461
+ ### Organizational
462
+ - ✨ Header / Title
463
+ - 📦 Section / Group
464
+ - ▶️ Running / Active
465
+ - 🎉 Complete / Success
466
+ - 🚨 Alert / Critical
467
+
468
+ Enjoy your AWESOME logs! 🎨✨