testdriverai 6.2.1 → 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 +16 -5
  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,100 @@
1
+ # AWESOME Logs - Quick Reference 🎨
2
+
3
+ ## At a Glance
4
+
5
+ Your TestDriver SDK now has **beautiful, emoji-rich logs** with great DX!
6
+
7
+ ### What You'll See
8
+
9
+ ```
10
+ [2.34s] 🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
11
+ [2.51s] 👆 Click "submit button"
12
+ [2.67s] 👉 Hover "menu item"
13
+ [2.89s] ⌨️ Type → hello world
14
+ [3.12s] ✅ Assert "page title correct" · ✓ PASSED · ⏱️ 45ms
15
+ ```
16
+
17
+ ## Quick Emoji Guide
18
+
19
+ | Emoji | Meaning |
20
+ |-------|---------|
21
+ | 🔍 | Finding element |
22
+ | 👆 | Click |
23
+ | 👉 | Hover |
24
+ | ⌨️ | Type |
25
+ | 📜 | Scroll |
26
+ | ✅ | Success/Passed |
27
+ | ❌ | Error/Failed |
28
+ | ⚡ | Cache hit |
29
+ | 💤 | Cache miss |
30
+ | 📍 | Coordinates |
31
+ | ⏱️ | Duration |
32
+ | 🔌 | Connect/Disconnect |
33
+ | 📸 | Screenshot |
34
+
35
+ ## Performance Colors
36
+
37
+ Duration times are color-coded:
38
+
39
+ - **🟢 < 100ms** - Fast
40
+ - **🟡 100-500ms** - Acceptable
41
+ - **🔴 > 500ms** - Slow
42
+
43
+ ## Enable/Disable
44
+
45
+ ```javascript
46
+ // Enabled by default
47
+ const client = new TestDriver(apiKey, {
48
+ logging: true
49
+ });
50
+
51
+ // Disable if needed
52
+ client.setLogging(false);
53
+ ```
54
+
55
+ ## Debug Mode
56
+
57
+ For detailed cache information:
58
+
59
+ ```bash
60
+ VERBOSE=true node your-test.js
61
+ ```
62
+
63
+ You'll see:
64
+ - Cache strategy (image/text)
65
+ - Similarity scores
66
+ - Pixel diff percentages
67
+ - Cache age
68
+
69
+ ## Examples
70
+
71
+ Try these:
72
+
73
+ ```bash
74
+ # Simple example
75
+ TD_API_KEY=your_key node examples/sdk-simple-example.js
76
+
77
+ # Full demo
78
+ TD_API_KEY=your_key node examples/sdk-awesome-logs-demo.js
79
+
80
+ # Cache demo with debug info
81
+ TD_API_KEY=your_key VERBOSE=true node examples/sdk-cache-thresholds.js
82
+ ```
83
+
84
+ ## Custom Formatting
85
+
86
+ ```javascript
87
+ const { formatter } = require('testdriverai/sdk-log-formatter');
88
+
89
+ console.log(formatter.formatHeader('My Test', '🧪'));
90
+ console.log(formatter.formatAction('click', 'button'));
91
+ console.log(formatter.formatProgress(3, 10, 'Processing'));
92
+ ```
93
+
94
+ ## Full Documentation
95
+
96
+ See [SDK_AWESOME_LOGS.md](./SDK_AWESOME_LOGS.md) for complete documentation.
97
+
98
+ ---
99
+
100
+ **Enjoy your AWESOME logs! 🎨✨**
@@ -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