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,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! 🎨✨