testdriverai 7.0.0 → 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 (112) hide show
  1. package/AGENTS.md +550 -0
  2. package/CODEOWNERS +0 -1
  3. package/README.md +126 -0
  4. package/agent/index.js +43 -18
  5. package/agent/lib/commands.js +794 -135
  6. package/agent/lib/redraw.js +124 -39
  7. package/agent/lib/sandbox.js +10 -1
  8. package/agent/lib/sdk.js +21 -0
  9. package/docs/MIGRATION.md +425 -0
  10. package/docs/PRESETS.md +210 -0
  11. package/docs/docs.json +91 -37
  12. package/docs/guide/best-practices-polling.mdx +154 -0
  13. package/docs/v7/api/dashcam.mdx +497 -0
  14. package/docs/v7/api/doubleClick.mdx +102 -0
  15. package/docs/v7/api/mouseDown.mdx +161 -0
  16. package/docs/v7/api/mouseUp.mdx +164 -0
  17. package/docs/v7/api/rightClick.mdx +123 -0
  18. package/docs/v7/getting-started/configuration.mdx +380 -0
  19. package/docs/v7/getting-started/quickstart.mdx +273 -140
  20. package/docs/v7/guides/best-practices.mdx +486 -0
  21. package/docs/v7/guides/caching-ai.mdx +215 -0
  22. package/docs/v7/guides/caching-selectors.mdx +292 -0
  23. package/docs/v7/guides/caching.mdx +366 -0
  24. package/docs/v7/guides/ci-cd/azure.mdx +587 -0
  25. package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
  26. package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
  27. package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
  28. package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
  29. package/docs/v7/guides/ci-cd/travis.mdx +438 -0
  30. package/docs/v7/guides/debugging.mdx +349 -0
  31. package/docs/v7/guides/faq.mdx +393 -0
  32. package/docs/v7/guides/performance.mdx +517 -0
  33. package/docs/v7/guides/troubleshooting.mdx +526 -0
  34. package/docs/v7/guides/vitest-plugin.mdx +477 -0
  35. package/docs/v7/guides/vitest.mdx +535 -0
  36. package/docs/v7/platforms/linux.mdx +308 -0
  37. package/docs/v7/platforms/macos.mdx +433 -0
  38. package/docs/v7/platforms/windows.mdx +430 -0
  39. package/docs/v7/presets/chrome-extension.mdx +223 -0
  40. package/docs/v7/presets/chrome.mdx +287 -0
  41. package/docs/v7/presets/electron.mdx +435 -0
  42. package/docs/v7/presets/vscode.mdx +398 -0
  43. package/docs/v7/presets/webapp.mdx +396 -0
  44. package/docs/v7/progressive-apis/CORE.md +459 -0
  45. package/docs/v7/progressive-apis/HOOKS.md +360 -0
  46. package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
  47. package/docs/v7/progressive-apis/PROVISION.md +266 -0
  48. package/interfaces/vitest-plugin.mjs +186 -100
  49. package/package.json +12 -1
  50. package/sdk.d.ts +335 -42
  51. package/sdk.js +756 -95
  52. package/src/core/Dashcam.js +469 -0
  53. package/src/core/index.d.ts +150 -0
  54. package/src/core/index.js +12 -0
  55. package/src/presets/index.mjs +331 -0
  56. package/src/vitest/extended.mjs +108 -0
  57. package/src/vitest/hooks.d.ts +119 -0
  58. package/src/vitest/hooks.mjs +298 -0
  59. package/src/vitest/index.mjs +64 -0
  60. package/src/vitest/lifecycle.mjs +277 -0
  61. package/src/vitest/utils.mjs +150 -0
  62. package/test/dashcam.test.js +137 -0
  63. package/testdriver/acceptance-sdk/assert.test.mjs +13 -31
  64. package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
  65. package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
  66. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +7 -19
  67. package/testdriver/acceptance-sdk/element-not-found.test.mjs +6 -19
  68. package/testdriver/acceptance-sdk/exec-js.test.mjs +6 -18
  69. package/testdriver/acceptance-sdk/exec-output.test.mjs +8 -20
  70. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +13 -25
  71. package/testdriver/acceptance-sdk/focus-window.test.mjs +8 -20
  72. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +5 -20
  73. package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
  74. package/testdriver/acceptance-sdk/hover-image.test.mjs +10 -19
  75. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +7 -19
  76. package/testdriver/acceptance-sdk/hover-text.test.mjs +5 -19
  77. package/testdriver/acceptance-sdk/match-image.test.mjs +7 -19
  78. package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
  79. package/testdriver/acceptance-sdk/press-keys.test.mjs +5 -19
  80. package/testdriver/acceptance-sdk/prompt.test.mjs +6 -18
  81. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +6 -20
  82. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +6 -18
  83. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +9 -23
  84. package/testdriver/acceptance-sdk/scroll.test.mjs +12 -21
  85. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +124 -352
  86. package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
  87. package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
  88. package/testdriver/acceptance-sdk/type.test.mjs +19 -58
  89. package/vitest.config.mjs +1 -0
  90. package/.vscode/mcp.json +0 -9
  91. package/MIGRATION.md +0 -389
  92. package/PLUGIN_MIGRATION.md +0 -222
  93. package/PROMPT_CACHE.md +0 -200
  94. package/SDK_LOGGING.md +0 -222
  95. package/SDK_MIGRATION.md +0 -474
  96. package/SDK_README.md +0 -1122
  97. package/debug-screenshot-1763401388589.png +0 -0
  98. package/examples/run-tests-with-recording.sh +0 -70
  99. package/examples/screenshot-example.js +0 -63
  100. package/examples/sdk-awesome-logs-demo.js +0 -177
  101. package/examples/sdk-cache-thresholds.js +0 -96
  102. package/examples/sdk-element-properties.js +0 -155
  103. package/examples/sdk-simple-example.js +0 -65
  104. package/examples/test-recording-example.test.js +0 -166
  105. package/mcp-server/AI_GUIDELINES.md +0 -57
  106. package/test-find-api.js +0 -73
  107. package/test-prompt-cache.js +0 -96
  108. package/test-sandbox-render.js +0 -28
  109. package/test-sdk-methods.js +0 -15
  110. package/test-sdk-refactor.js +0 -53
  111. package/test-stack-trace.mjs +0 -57
  112. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
package/PROMPT_CACHE.md DELETED
@@ -1,200 +0,0 @@
1
- # Prompt Cache System
2
-
3
- ## Overview
4
-
5
- The TestDriver SDK includes automatic caching of `.ai()` responses. When you use the SDK to execute natural language prompts, the YAML commands generated by the AI are cached locally to improve performance and reduce API calls.
6
-
7
- **Caching is enabled by default** and can be controlled per-call using the `cache` parameter.
8
-
9
- ## How It Works
10
-
11
- 1. **First Call**: When you call `.ai('click the submit button')` for the first time:
12
-
13
- - The SDK sends the prompt and screenshot to the API
14
- - The API returns YAML commands in markdown format
15
- - The response is cached to `.testdriver/.cache/{prompt-hash}.yaml`
16
-
17
- 2. **Subsequent Calls**: When you call `.ai('click the submit button')` again:
18
-
19
- - The SDK checks the cache first
20
- - If found, it uses the cached YAML instead of calling the API
21
- - You'll see `(using cached response)` in the output
22
-
23
- 3. **Disable Caching**: Pass `false` as the second parameter:
24
- - `.ai('click the submit button', false)` bypasses the cache
25
- - Forces a fresh API call and updates the cache
26
-
27
- ## Cache Location
28
-
29
- Cached responses are stored in:
30
-
31
- ```
32
- .testdriver/.cache/
33
- ```
34
-
35
- Files are named using a combination of:
36
-
37
- - Sanitized prompt (first 50 chars, alphanumeric only)
38
- - MD5 hash of the full prompt for uniqueness
39
-
40
- Example:
41
-
42
- ```
43
- .testdriver/.cache/click-the-submit-button-a1b2c3d4e5f6.yaml
44
- ```
45
-
46
- ## Benefits
47
-
48
- - **Faster execution**: No API call needed for repeated prompts
49
- - **Cost savings**: Reduces API usage for repeated operations
50
- - **Offline testing**: Can rerun tests without network access
51
- - **Deterministic tests**: Same prompt always produces same commands
52
-
53
- ## Disabling Cache
54
-
55
- To disable caching for a specific `.ai()` call, pass `false` as the second parameter:
56
-
57
- ```javascript
58
- // Force fresh API call, bypass cache
59
- await client.ai("click the submit button", false);
60
- ```
61
-
62
- Caching is **enabled by default** (equivalent to passing `true`):
63
-
64
- ```javascript
65
- // These are equivalent
66
- await client.ai("click the submit button");
67
- await client.ai("click the submit button", true);
68
- ```
69
-
70
- ## Clearing Cache
71
-
72
- To clear all cached prompts:
73
-
74
- ```bash
75
- rm -rf .testdriver/.cache/*.yaml
76
- ```
77
-
78
- Or programmatically:
79
-
80
- ```javascript
81
- const promptCache = require("testdriverai/agent/lib/cache.js");
82
- promptCache.clearCache();
83
- ```
84
-
85
- ## Usage Examples
86
-
87
- ### Basic Usage (Automatic Caching)
88
-
89
- ```javascript
90
- const TestDriver = require("testdriverai");
91
-
92
- const client = new TestDriver(process.env.TD_API_KEY);
93
- await client.connect();
94
-
95
- // First call - makes API request and caches
96
- await client.ai("click the login button");
97
-
98
- // Second call - uses cache (instant)
99
- await client.ai("click the login button");
100
-
101
- // Force fresh API call, bypass cache
102
- await client.ai("click the login button", false);
103
- ```
104
-
105
- ### Check Cache Status
106
-
107
- ```javascript
108
- const promptCache = require("testdriverai/agent/lib/cache.js");
109
-
110
- // Check if a prompt is cached
111
- if (promptCache.hasCache("click the login button")) {
112
- console.log("This prompt is cached");
113
- }
114
-
115
- // Get cache statistics
116
- const stats = promptCache.getCacheStats();
117
- console.log(`Cached prompts: ${stats.count}`);
118
- console.log(`Files: ${stats.files}`);
119
- ```
120
-
121
- ### Read Cached YAML
122
-
123
- ```javascript
124
- const promptCache = require("testdriverai/agent/lib/cache.js");
125
-
126
- const yaml = promptCache.readCache("click the login button");
127
- if (yaml) {
128
- console.log("Cached YAML:", yaml);
129
- }
130
- ```
131
-
132
- ### Manual Cache Control
133
-
134
- ```javascript
135
- const promptCache = require("testdriverai/agent/lib/cache.js");
136
-
137
- // Write to cache manually
138
- promptCache.writeCache("custom prompt", yamlContent);
139
-
140
- // Clear entire cache
141
- promptCache.clearCache();
142
-
143
- // Get cache path for a prompt
144
- const path = promptCache.getCachePath("my prompt");
145
- console.log(`Cache file: ${path}`);
146
- ```
147
-
148
- ## Important Notes
149
-
150
- 1. **Prompt Matching**: Cache keys are based on the exact prompt text (case-insensitive, trimmed)
151
-
152
- - `'Click the button'` and `'click the button'` will match
153
- - `'Click the button'` and `'Click the button '` will match (trailing space trimmed)
154
- - `'Click button'` and `'Click the button'` will NOT match
155
-
156
- 2. **No Screenshot Comparison**: The cache does NOT compare screenshots
157
-
158
- - Cached responses assume the UI state is similar
159
- - Use different prompts if the UI state has changed significantly
160
-
161
- 3. **Manual Cache Management**: The cache never expires automatically
162
-
163
- - Clear it periodically if needed
164
- - Delete specific files if a prompt's behavior should change
165
-
166
- 4. **Version Compatibility**: Cache files are plain YAML
167
- - Compatible across TestDriver versions
168
- - Safe to commit to version control (though not recommended)
169
-
170
- ## Testing
171
-
172
- Run the test suite to verify caching:
173
-
174
- ```bash
175
- node test-prompt-cache.js
176
- ```
177
-
178
- This will:
179
-
180
- - Make an initial `.ai()` call that caches the response
181
- - Make a second `.ai()` call that uses the cache
182
- - Show cache statistics and file locations
183
-
184
- ## Troubleshooting
185
-
186
- ### Cache not being used
187
-
188
- - Check that prompts match exactly (case-insensitive)
189
- - Verify `TD_NO_PROMPT_CACHE` is not set
190
- - Check `.testdriver/.cache/` directory exists and is writable
191
-
192
- ### Stale cache data
193
-
194
- - Clear the cache directory
195
- - Or delete specific cached prompt files
196
-
197
- ### Permission errors
198
-
199
- - Ensure `.testdriver/.cache/` is writable
200
- - Check file system permissions
package/SDK_LOGGING.md DELETED
@@ -1,222 +0,0 @@
1
- # TestDriver SDK - Formatted Logging for Dashcam
2
-
3
- The TestDriver SDK now includes clean, structured logging that makes logs easy to read when replayed in Dashcam.
4
-
5
- ## Features
6
-
7
- ✨ **Clean, structured formatting** with clear labels and timestamps
8
- ⏱️ **Timestamp tracking** showing elapsed time from test start
9
- 🎯 **Action-specific formatting** for find, click, type, hover, scroll, assert
10
- ⚡ **Cache indicators** showing when elements are found from cache
11
- 📊 **Test context integration** with Vitest test information
12
- 🎥 **Dashcam-optimized** - no emojis or ANSI codes, pure text format
13
-
14
- ## How It Works
15
-
16
- All logs sent through the `log:log` event are automatically formatted before being sent to Dashcam. This means when you replay your test in Dashcam, you'll see beautiful, easy-to-read logs with:
17
-
18
- - **Clear prefixes** like `[FIND]`, `[CLICK]`, `[ASSERT]` for different action types
19
- - **Highlighted information** for element descriptions and coordinates
20
- - **Elapsed timestamps** from test start like `[30.59s]`
21
- - **Cache hit indicators** showing performance optimizations with `(cached)`
22
- - **Duration information** for operations
23
-
24
- ## Usage
25
-
26
- ### Basic Setup
27
-
28
- The formatter is automatically integrated into the SDK. Just use the SDK normally:
29
-
30
- ```javascript
31
- import { afterAll, beforeAll, describe, it } from "vitest";
32
- import {
33
- createTestClient,
34
- setupTest,
35
- teardownTest,
36
- } from "./setup/testHelpers.mjs";
37
-
38
- describe("My Test", () => {
39
- let testdriver;
40
-
41
- beforeAll(async () => {
42
- testdriver = createTestClient();
43
- await setupTest(testdriver);
44
- });
45
-
46
- afterAll(async () => {
47
- await teardownTest(testdriver);
48
- });
49
-
50
- it("should have nice logs", async () => {
51
- // Logs are automatically formatted!
52
- const button = await testdriver.find("Submit button");
53
- await button.click();
54
- });
55
- });
56
- ```
57
-
58
- ### Enhanced Logging with Test Context
59
-
60
- For even better logging with timestamps, set the test context:
61
-
62
- ```javascript
63
- beforeAll(async () => {
64
- testdriver = createTestClient();
65
-
66
- // Set test context for enhanced logging
67
- testdriver.setTestContext({
68
- file: "my-test.spec.mjs",
69
- test: "My Test Suite",
70
- startTime: Date.now(),
71
- });
72
-
73
- await setupTest(testdriver);
74
- });
75
- ```
76
-
77
- This enables elapsed time display like `[30.59s]` in your logs.
78
-
79
- ## Log Format Examples
80
-
81
- ### Element Found
82
-
83
- ```
84
- [30.59s] [FIND] Found "Submit button" at (682, 478) 1597ms (cached)
85
- ```
86
-
87
- ### Click Action
88
-
89
- ```
90
- [35.43s] [CLICK] Click "Submit button"
91
- ```
92
-
93
- ### Hover Action
94
-
95
- ```
96
- [12.15s] [HOVER] Hover "Menu item"
97
- ```
98
-
99
- ### Type Action
100
-
101
- ```
102
- [8.32s] [TYPE] Type "user@example.com"
103
- ```
104
-
105
- ### Assertion
106
-
107
- ```
108
- [42.10s] [ASSERT] "form submission successful" PASSED
109
- ```
110
-
111
- ### Error
112
-
113
- ```
114
- [15.23s] [FAIL] Failed to save debug image - Error: ENOENT: no such file or directory
115
- ```
116
-
117
- ## Formatter API
118
-
119
- The formatter is available through the `sdk-log-formatter.js` module:
120
-
121
- ```javascript
122
- const { formatter } = require("./sdk-log-formatter");
123
-
124
- // Format different types of messages
125
- formatter.formatElementFound("Button", {
126
- x: 100,
127
- y: 200,
128
- duration: "1500ms",
129
- cacheHit: true,
130
- });
131
- formatter.formatAction("click", "Submit button");
132
- formatter.formatAssertion("form is visible", true);
133
- formatter.formatError("Connection failed", error);
134
- ```
135
-
136
- ### Available Methods
137
-
138
- - `formatElementFound(description, meta)` - Format element discovery
139
- - `formatAction(action, description, meta)` - Format user actions
140
- - `formatAssertion(assertion, passed, meta)` - Format test assertions
141
- - `formatError(message, error)` - Format error messages
142
- - `formatHeader(title)` - Create section headers
143
- - `formatSummary(stats)` - Format test summaries
144
- - `setTestContext(context)` - Update test context for timing
145
-
146
- ## Dashcam Compatibility
147
-
148
- The formatter is designed specifically for Dashcam replay compatibility:
149
-
150
- - **No emojis** - Uses text labels like `[FIND]`, `[CLICK]` instead of icons
151
- - **No ANSI colors** - Plain text formatting that displays correctly in all environments
152
- - **No special characters** - Simple ASCII characters only
153
- - **Clean structure** - Easy to read in logs without terminal formatting
154
-
155
- ## Integration with Dashcam
156
-
157
- When you run tests with Dashcam recording:
158
-
159
- 1. The SDK sends formatted logs to the `log:log` event
160
- 2. These logs are forwarded to the sandbox via `_forwardLogToSandbox()`
161
- 3. Dashcam captures and stores these logs with precise timestamps
162
- 4. When you replay in Dashcam, you see beautifully formatted logs synchronized with the video
163
-
164
- ### Example Workflow
165
-
166
- ```bash
167
- # Run tests with Dashcam
168
- npx vitest run testdriver/acceptance-sdk/formatted-logging.test.mjs
169
-
170
- # View the replay with formatted logs
171
- # Open the Dashcam URL from the test output
172
- ```
173
-
174
- ## Customization
175
-
176
- ### Custom Action Types
177
-
178
- Add custom action types to the formatter:
179
-
180
- ```javascript
181
- // In sdk-log-formatter.js, add to getPrefix():
182
- const prefixes = {
183
- // ...existing prefixes
184
- myAction: "[CUSTOM]",
185
- };
186
- ```
187
-
188
- ### Custom Message Formatting
189
-
190
- Override the `formatMessage` method for custom text highlighting:
191
-
192
- ```javascript
193
- formatMessage(type, message) {
194
- // Add custom highlighting
195
- message = message.replace(/\[custom\]/g, chalk.green('[custom]'));
196
- return super.formatMessage(type, message);
197
- }
198
- ```
199
-
200
- ## Examples
201
-
202
- See `testdriver/acceptance-sdk/formatted-logging.test.mjs` for a complete example.
203
-
204
- ## Benefits for Dashcam Replay
205
-
206
- - **Better debugging**: Quickly identify what happened at each step
207
- - **Professional appearance**: Share polished test recordings with stakeholders
208
- - **Faster analysis**: Labeled actions make it easy to scan logs
209
- - **Context awareness**: Timestamps help correlate logs with video timeline
210
- - **Performance insights**: Cache indicators show optimization opportunities
211
- - **Universal compatibility**: Works in any environment without terminal support
212
-
213
- ## Technical Details
214
-
215
- The formatter uses:
216
-
217
- - **Plain text formatting** for universal compatibility
218
- - **Event emitters** to intercept log events
219
- - **Base64 encoding** for safe transmission to sandbox
220
- - **Test context** from Vitest for timing information
221
-
222
- Logs are sent through the existing `log:log` event system, ensuring compatibility with all existing TestDriver infrastructure.