@testdriverai/agent 7.8.0-test.38
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.
- package/.claude/settings.local.json +7 -0
- package/.env.example +4 -0
- package/.prettierignore +4 -0
- package/.prettierrc +1 -0
- package/CHANGELOG.md +953 -0
- package/README.md +81 -0
- package/agent/events.js +135 -0
- package/agent/index.js +2450 -0
- package/agent/interface.js +35 -0
- package/agent/lib/analytics.js +22 -0
- package/agent/lib/censorship.js +75 -0
- package/agent/lib/commander.js +246 -0
- package/agent/lib/commands.js +1684 -0
- package/agent/lib/config.js +60 -0
- package/agent/lib/generator.js +91 -0
- package/agent/lib/http.js +144 -0
- package/agent/lib/logger.js +56 -0
- package/agent/lib/outputs.js +29 -0
- package/agent/lib/parser.js +209 -0
- package/agent/lib/redraw.js +386 -0
- package/agent/lib/resources/cursor-2.png +0 -0
- package/agent/lib/sandbox.js +1104 -0
- package/agent/lib/sdk.js +633 -0
- package/agent/lib/session.js +25 -0
- package/agent/lib/source-mapper.js +342 -0
- package/agent/lib/subimage/index.js +77 -0
- package/agent/lib/subimage/opencv.js +69 -0
- package/agent/lib/system.js +204 -0
- package/agent/lib/theme.js +14 -0
- package/agent/lib/valid-version.js +21 -0
- package/agent/lib/validation.js +169 -0
- package/ai/.claude-plugin/plugin.json +9 -0
- package/ai/agents/testdriver.md +638 -0
- package/ai/skills/testdriver-ai/SKILL.md +204 -0
- package/ai/skills/testdriver-assert/SKILL.md +315 -0
- package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
- package/ai/skills/testdriver-cache/SKILL.md +221 -0
- package/ai/skills/testdriver-caching/SKILL.md +124 -0
- package/ai/skills/testdriver-captcha/SKILL.md +158 -0
- package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
- package/ai/skills/testdriver-click/SKILL.md +286 -0
- package/ai/skills/testdriver-client/SKILL.md +477 -0
- package/ai/skills/testdriver-cloud/SKILL.md +119 -0
- package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
- package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
- package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
- package/ai/skills/testdriver-device-config/SKILL.md +317 -0
- package/ai/skills/testdriver-double-click/SKILL.md +102 -0
- package/ai/skills/testdriver-elements/SKILL.md +605 -0
- package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
- package/ai/skills/testdriver-errors/SKILL.md +246 -0
- package/ai/skills/testdriver-events/SKILL.md +356 -0
- package/ai/skills/testdriver-examples/SKILL.md +7 -0
- package/ai/skills/testdriver-exec/SKILL.md +317 -0
- package/ai/skills/testdriver-find/SKILL.md +829 -0
- package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
- package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
- package/ai/skills/testdriver-hover/SKILL.md +278 -0
- package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
- package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
- package/ai/skills/testdriver-mcp/SKILL.md +7 -0
- package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
- package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
- package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
- package/ai/skills/testdriver-parse/SKILL.md +236 -0
- package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
- package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
- package/ai/skills/testdriver-provision/SKILL.md +331 -0
- package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
- package/ai/skills/testdriver-redraw/SKILL.md +214 -0
- package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
- package/ai/skills/testdriver-right-click/SKILL.md +123 -0
- package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
- package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
- package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
- package/ai/skills/testdriver-scroll/SKILL.md +335 -0
- package/ai/skills/testdriver-secrets/SKILL.md +115 -0
- package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
- package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
- package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
- package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
- package/ai/skills/testdriver-type/SKILL.md +357 -0
- package/ai/skills/testdriver-variables/SKILL.md +111 -0
- package/ai/skills/testdriver-wait/SKILL.md +50 -0
- package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
- package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
- package/bin/testdriverai.js +22 -0
- package/debugger/bg.png +0 -0
- package/debugger/icon.png +0 -0
- package/debugger/index.html +469 -0
- package/debugger/td.png +0 -0
- package/debugger/tray-buffered.png +0 -0
- package/debugger/tray.png +0 -0
- package/docs/GITHUB_COMMENTS.md +330 -0
- package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
- package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
- package/docs/TEST-GITHUB-COMMENTS.md +129 -0
- package/docs/_data/examples-manifest.json +177 -0
- package/docs/_data/examples-manifest.schema.json +41 -0
- package/docs/_scripts/extract-example-urls.js +165 -0
- package/docs/_scripts/generate-examples.js +560 -0
- package/docs/_scripts/generate-skills.js +154 -0
- package/docs/_scripts/link-replacer.js +164 -0
- package/docs/_scripts/upload-docs-to-openai.js +284 -0
- package/docs/changelog.mdx +161 -0
- package/docs/claude-mcp-plugin.mdx +160 -0
- package/docs/docs.json +442 -0
- package/docs/github-integration-setup.md +266 -0
- package/docs/guide/best-practices-polling.mdx +174 -0
- package/docs/images/content/account/newprojectsettings.png +0 -0
- package/docs/images/content/account/projectpage.png +0 -0
- package/docs/images/content/account/projectreplays.png +0 -0
- package/docs/images/content/account/team-manage.png +0 -0
- package/docs/images/content/account/teampage.png +0 -0
- package/docs/images/content/extension/cursor.svg +1 -0
- package/docs/images/content/extension/vscode.svg +57 -0
- package/docs/images/content/extension/windsurf.svg +3 -0
- package/docs/images/content/parse/output.png +0 -0
- package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
- package/docs/images/content/side-by-side.png +0 -0
- package/docs/images/content/vscode/ide-full.png +0 -0
- package/docs/images/content/vscode/running.png +0 -0
- package/docs/images/content/vscode/v7-chat.png +0 -0
- package/docs/images/content/vscode/v7-choose-agent.png +0 -0
- package/docs/images/content/vscode/v7-full.png +0 -0
- package/docs/images/content/vscode/v7-onboarding.png +0 -0
- package/docs/images/content/vscode/vscode-2-assert.png +0 -0
- package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
- package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
- package/docs/images/content/vscode/vscode-file-creation.png +0 -0
- package/docs/images/content/vscode/vscode-install.png +0 -0
- package/docs/images/content/vscode/vscode-overview.png +0 -0
- package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
- package/docs/images/content/vscode/vscode-stopchat.png +0 -0
- package/docs/images/content/vscode/vscode-stoptest.png +0 -0
- package/docs/images/content/vscode/vscode-tdservice.png +0 -0
- package/docs/images/content/vscode/vscode-test-output.png +0 -0
- package/docs/images/content/vscode/vscode-testhistory.png +0 -0
- package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
- package/docs/images/content/vscode/vscode-testpane.png +0 -0
- package/docs/images/template/dark.png +0 -0
- package/docs/images/template/icon.png +0 -0
- package/docs/images/template/light.png +0 -0
- package/docs/snippets/calendar-link.mdx +4 -0
- package/docs/snippets/gitignore-warning.mdx +7 -0
- package/docs/snippets/lifecycle-warning.mdx +6 -0
- package/docs/snippets/test-prereqs.mdx +12 -0
- package/docs/snippets/tests/assert-replay.mdx +7 -0
- package/docs/snippets/tests/assert-yaml.mdx +8 -0
- package/docs/snippets/tests/exec-js-replay.mdx +7 -0
- package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
- package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
- package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
- package/docs/snippets/tests/hover-image-replay.mdx +7 -0
- package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
- package/docs/snippets/tests/hover-text-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
- package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
- package/docs/snippets/tests/match-image-replay.mdx +7 -0
- package/docs/snippets/tests/match-image-yaml.mdx +17 -0
- package/docs/snippets/tests/press-keys-replay.mdx +7 -0
- package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
- package/docs/snippets/tests/remember-replay.mdx +7 -0
- package/docs/snippets/tests/remember-yaml.mdx +28 -0
- package/docs/snippets/tests/scroll-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
- package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
- package/docs/snippets/tests/scroll-yaml.mdx +30 -0
- package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
- package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
- package/docs/snippets/tests/type-replay.mdx +7 -0
- package/docs/snippets/tests/type-yaml.mdx +28 -0
- package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-replay.mdx +7 -0
- package/docs/snippets/tests/wait-yaml.mdx +13 -0
- package/docs/styles.css +65 -0
- package/docs/v6/account/dashboard.mdx +16 -0
- package/docs/v6/account/enterprise.mdx +110 -0
- package/docs/v6/account/pricing.mdx +33 -0
- package/docs/v6/account/projects.mdx +33 -0
- package/docs/v6/account/team.mdx +35 -0
- package/docs/v6/action/ami.mdx +109 -0
- package/docs/v6/action/performance.mdx +105 -0
- package/docs/v6/action/secrets.mdx +93 -0
- package/docs/v6/apps/chrome-extensions.mdx +48 -0
- package/docs/v6/apps/desktop-apps.mdx +93 -0
- package/docs/v6/apps/mobile-apps.mdx +26 -0
- package/docs/v6/apps/static-websites.mdx +54 -0
- package/docs/v6/apps/tauri-apps.mdx +361 -0
- package/docs/v6/bugs/jira.mdx +232 -0
- package/docs/v6/cli/overview.mdx +66 -0
- package/docs/v6/commands/assert.mdx +45 -0
- package/docs/v6/commands/exec.mdx +276 -0
- package/docs/v6/commands/focus-application.mdx +44 -0
- package/docs/v6/commands/hover-image.mdx +69 -0
- package/docs/v6/commands/hover-text.mdx +47 -0
- package/docs/v6/commands/if.mdx +53 -0
- package/docs/v6/commands/match-image.mdx +67 -0
- package/docs/v6/commands/press-keys.mdx +87 -0
- package/docs/v6/commands/remember.mdx +49 -0
- package/docs/v6/commands/run.mdx +44 -0
- package/docs/v6/commands/scroll-until-image.mdx +66 -0
- package/docs/v6/commands/scroll-until-text.mdx +60 -0
- package/docs/v6/commands/scroll.mdx +69 -0
- package/docs/v6/commands/type.mdx +45 -0
- package/docs/v6/commands/wait-for-image.mdx +54 -0
- package/docs/v6/commands/wait-for-text.mdx +48 -0
- package/docs/v6/commands/wait.mdx +45 -0
- package/docs/v6/exporting/junit.mdx +218 -0
- package/docs/v6/exporting/playwright.mdx +197 -0
- package/docs/v6/features/auto-healing.mdx +144 -0
- package/docs/v6/features/generation.mdx +116 -0
- package/docs/v6/features/parallel-testing.mdx +151 -0
- package/docs/v6/features/reusable-snippets.mdx +131 -0
- package/docs/v6/features/selectorless.mdx +80 -0
- package/docs/v6/features/visual-assertions.mdx +139 -0
- package/docs/v6/getting-started/ci.mdx +146 -0
- package/docs/v6/getting-started/cli.mdx +91 -0
- package/docs/v6/getting-started/editing.mdx +100 -0
- package/docs/v6/getting-started/playwright.mdx +342 -0
- package/docs/v6/getting-started/running.mdx +48 -0
- package/docs/v6/getting-started/self-hosting.mdx +408 -0
- package/docs/v6/getting-started/vscode.mdx +88 -0
- package/docs/v6/guide/assertions.mdx +189 -0
- package/docs/v6/guide/authentication.mdx +136 -0
- package/docs/v6/guide/code.mdx +65 -0
- package/docs/v6/guide/dashcam.mdx +118 -0
- package/docs/v6/guide/environment-variables.mdx +26 -0
- package/docs/v6/guide/lifecycle.mdx +242 -0
- package/docs/v6/guide/locating.mdx +141 -0
- package/docs/v6/guide/protips.mdx +43 -0
- package/docs/v6/guide/variables.mdx +143 -0
- package/docs/v6/guide/waiting.mdx +130 -0
- package/docs/v6/importing/csv.mdx +196 -0
- package/docs/v6/importing/gherkin.mdx +143 -0
- package/docs/v6/importing/jira.mdx +164 -0
- package/docs/v6/importing/testrail.mdx +162 -0
- package/docs/v6/integrations/electron.mdx +146 -0
- package/docs/v6/integrations/netlify.mdx +100 -0
- package/docs/v6/integrations/vercel.mdx +125 -0
- package/docs/v6/interactive/explore.mdx +99 -0
- package/docs/v6/interactive/run.mdx +52 -0
- package/docs/v6/interactive/save.mdx +63 -0
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v6/overview/faq.mdx +162 -0
- package/docs/v6/overview/performance.mdx +52 -0
- package/docs/v6/overview/quickstart.mdx +137 -0
- package/docs/v6/overview/what-is-testdriver.mdx +85 -0
- package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
- package/docs/v6/scenarios/cookie-banner.mdx +32 -0
- package/docs/v6/scenarios/file-upload.mdx +33 -0
- package/docs/v6/scenarios/form-filling.mdx +32 -0
- package/docs/v6/scenarios/log-in.mdx +75 -0
- package/docs/v6/scenarios/pdf-generation.mdx +25 -0
- package/docs/v6/scenarios/spell-check.mdx +22 -0
- package/docs/v6/security/action.mdx +84 -0
- package/docs/v6/security/agent.mdx +73 -0
- package/docs/v6/security/platform.mdx +77 -0
- package/docs/v6/tutorials/advanced-test.mdx +81 -0
- package/docs/v6/tutorials/basic-test.mdx +45 -0
- package/docs/v7/_drafts/agents.mdx +843 -0
- package/docs/v7/_drafts/architecture.mdx +399 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
- package/docs/v7/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +424 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/commands/assert.mdx +45 -0
- package/docs/v7/_drafts/commands/exec.mdx +276 -0
- package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
- package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
- package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
- package/docs/v7/_drafts/commands/if.mdx +53 -0
- package/docs/v7/_drafts/commands/match-image.mdx +67 -0
- package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
- package/docs/v7/_drafts/commands/remember.mdx +49 -0
- package/docs/v7/_drafts/commands/run.mdx +44 -0
- package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/_drafts/commands/scroll.mdx +69 -0
- package/docs/v7/_drafts/commands/type.mdx +45 -0
- package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
- package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
- package/docs/v7/_drafts/commands/wait.mdx +45 -0
- package/docs/v7/_drafts/configuration.mdx +378 -0
- package/docs/v7/_drafts/contributing.mdx +174 -0
- package/docs/v7/_drafts/core.mdx +458 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/installation.mdx +420 -0
- package/docs/v7/_drafts/migration.mdx +562 -0
- package/docs/v7/_drafts/observable.mdx +604 -0
- package/docs/v7/_drafts/playwright.mdx +342 -0
- package/docs/v7/_drafts/plugin-migration.mdx +220 -0
- package/docs/v7/_drafts/powerful.mdx +419 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/v7/_drafts/provision.mdx +390 -0
- package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
- package/docs/v7/_drafts/readme.mdx +135 -0
- package/docs/v7/_drafts/reports.mdx +414 -0
- package/docs/v7/_drafts/scalable.mdx +763 -0
- package/docs/v7/_drafts/screenshot.mdx +155 -0
- package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
- package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/_drafts/self-hosting.mdx +369 -0
- package/docs/v7/_drafts/test-recording.mdx +382 -0
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/_drafts/writing-tests.mdx +25 -0
- package/docs/v7/ai.mdx +205 -0
- package/docs/v7/assert.mdx +316 -0
- package/docs/v7/aws-setup.mdx +449 -0
- package/docs/v7/cache.mdx +223 -0
- package/docs/v7/caching.mdx +128 -0
- package/docs/v7/captcha.mdx +159 -0
- package/docs/v7/ci-cd.mdx +603 -0
- package/docs/v7/click.mdx +287 -0
- package/docs/v7/client.mdx +478 -0
- package/docs/v7/copilot/auto-healing.mdx +265 -0
- package/docs/v7/copilot/creating-tests.mdx +156 -0
- package/docs/v7/copilot/github.mdx +143 -0
- package/docs/v7/copilot/running-tests.mdx +149 -0
- package/docs/v7/copilot/setup.mdx +143 -0
- package/docs/v7/customizing-devices.mdx +319 -0
- package/docs/v7/dashcam.mdx +419 -0
- package/docs/v7/debugging-with-screenshots.mdx +402 -0
- package/docs/v7/device-config.mdx +317 -0
- package/docs/v7/double-click.mdx +102 -0
- package/docs/v7/elements.mdx +606 -0
- package/docs/v7/enterprise.mdx +9 -0
- package/docs/v7/errors.mdx +248 -0
- package/docs/v7/events.mdx +358 -0
- package/docs/v7/examples/ai.mdx +72 -0
- package/docs/v7/examples/assert.mdx +72 -0
- package/docs/v7/examples/captcha-api.mdx +92 -0
- package/docs/v7/examples/chrome-extension.mdx +132 -0
- package/docs/v7/examples/drag-and-drop.mdx +100 -0
- package/docs/v7/examples/element-not-found.mdx +67 -0
- package/docs/v7/examples/exec-output.mdx +85 -0
- package/docs/v7/examples/exec-pwsh.mdx +83 -0
- package/docs/v7/examples/focus-window.mdx +62 -0
- package/docs/v7/examples/hover-image.mdx +94 -0
- package/docs/v7/examples/hover-text.mdx +69 -0
- package/docs/v7/examples/installer.mdx +91 -0
- package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
- package/docs/v7/examples/match-image.mdx +96 -0
- package/docs/v7/examples/press-keys.mdx +92 -0
- package/docs/v7/examples/scroll-keyboard.mdx +79 -0
- package/docs/v7/examples/scroll-until-image.mdx +81 -0
- package/docs/v7/examples/scroll-until-text.mdx +109 -0
- package/docs/v7/examples/scroll.mdx +81 -0
- package/docs/v7/examples/type.mdx +92 -0
- package/docs/v7/examples/windows-installer.mdx +89 -0
- package/docs/v7/exec.mdx +318 -0
- package/docs/v7/find.mdx +830 -0
- package/docs/v7/focus-application.mdx +294 -0
- package/docs/v7/generating-tests.mdx +36 -0
- package/docs/v7/hosted.mdx +158 -0
- package/docs/v7/hover.mdx +279 -0
- package/docs/v7/locating-elements.mdx +71 -0
- package/docs/v7/making-assertions.mdx +32 -0
- package/docs/v7/mcp.mdx +9 -0
- package/docs/v7/mouse-down.mdx +161 -0
- package/docs/v7/mouse-up.mdx +164 -0
- package/docs/v7/parse.mdx +237 -0
- package/docs/v7/performing-actions.mdx +54 -0
- package/docs/v7/press-keys.mdx +349 -0
- package/docs/v7/provision.mdx +333 -0
- package/docs/v7/quickstart.mdx +173 -0
- package/docs/v7/redraw.mdx +216 -0
- package/docs/v7/reusable-code.mdx +249 -0
- package/docs/v7/right-click.mdx +123 -0
- package/docs/v7/running-tests.mdx +185 -0
- package/docs/v7/screenshot.mdx +249 -0
- package/docs/v7/screenshots.mdx +186 -0
- package/docs/v7/scroll.mdx +336 -0
- package/docs/v7/secrets.mdx +115 -0
- package/docs/v7/self-hosted.mdx +149 -0
- package/docs/v7/type.mdx +358 -0
- package/docs/v7/variables.mdx +111 -0
- package/docs/v7/wait.mdx +52 -0
- package/docs/v7/waiting-for-elements.mdx +90 -0
- package/docs/v7/what-is-testdriver.mdx +54 -0
- package/eslint.config.js +67 -0
- package/examples/ai.test.mjs +31 -0
- package/examples/assert.test.mjs +47 -0
- package/examples/chrome-extension.test.mjs +97 -0
- package/examples/config.mjs +5 -0
- package/examples/element-not-found.test.mjs +27 -0
- package/examples/exec-output.test.mjs +60 -0
- package/examples/exec-pwsh.test.mjs +58 -0
- package/examples/findall-coffee-icons.test.mjs +42 -0
- package/examples/focus-window.test.mjs +37 -0
- package/examples/formatted-logging.test.mjs +27 -0
- package/examples/hover-image.test.mjs +53 -0
- package/examples/hover-text-with-description.test.mjs +57 -0
- package/examples/hover-text.test.mjs +28 -0
- package/examples/installer.test.mjs +50 -0
- package/examples/launch-vscode-linux.test.mjs +55 -0
- package/examples/match-image.test.mjs +55 -0
- package/examples/parse.test.mjs +19 -0
- package/examples/press-keys.test.mjs +44 -0
- package/examples/prompt.test.mjs +34 -0
- package/examples/scroll-keyboard.test.mjs +38 -0
- package/examples/scroll-until-image.test.mjs +40 -0
- package/examples/scroll.test.mjs +42 -0
- package/examples/type.test.mjs +46 -0
- package/examples/windows-installer.test.mjs +54 -0
- package/index.js +2 -0
- package/interfaces/cli/commands/init.js +438 -0
- package/interfaces/cli/commands/setup.js +382 -0
- package/interfaces/cli/lib/base.js +285 -0
- package/interfaces/cli.js +20 -0
- package/interfaces/junit-reporter.js +290 -0
- package/interfaces/logger.js +388 -0
- package/interfaces/readline.js +234 -0
- package/interfaces/shared-test-state.mjs +64 -0
- package/interfaces/vitest-plugin.d.ts +115 -0
- package/interfaces/vitest-plugin.mjs +1698 -0
- package/lib/captcha/solver.js +358 -0
- package/lib/core/Dashcam.js +533 -0
- package/lib/core/index.d.ts +172 -0
- package/lib/core/index.js +12 -0
- package/lib/environments.json +18 -0
- package/lib/github-comment-formatter.js +263 -0
- package/lib/github-comment.mjs +452 -0
- package/lib/init-project.js +575 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/resolve-channel.js +46 -0
- package/lib/sentry.js +417 -0
- package/lib/vitest/hooks.d.ts +57 -0
- package/lib/vitest/hooks.mjs +674 -0
- package/lib/vitest/setup-aws.mjs +247 -0
- package/lib/vitest/setup-self-hosted.mjs +151 -0
- package/lib/vitest/setup.mjs +46 -0
- package/manual/captcha-api.test.mjs +51 -0
- package/manual/drag-and-drop.test.mjs +59 -0
- package/manual/flake-diffthreshold-001.test.mjs +9 -0
- package/manual/flake-diffthreshold-01.test.mjs +9 -0
- package/manual/flake-diffthreshold-05.test.mjs +9 -0
- package/manual/flake-noredraw-cache.test.mjs +9 -0
- package/manual/flake-noredraw-nocache.test.mjs +9 -0
- package/manual/flake-redraw-cache.test.mjs +9 -0
- package/manual/flake-redraw-nocache.test.mjs +9 -0
- package/manual/flake-rocket-match.test.mjs +30 -0
- package/manual/flake-shared.mjs +51 -0
- package/manual/no-provision.test.mjs +31 -0
- package/manual/packer-hover-image.test.mjs +176 -0
- package/manual/scroll-until-text.test.mjs +68 -0
- package/manual/test-init-command.js +223 -0
- package/mcp-server/README.md +322 -0
- package/mcp-server/dist/codegen.d.ts +9 -0
- package/mcp-server/dist/codegen.js +165 -0
- package/mcp-server/dist/mcp-app.html +114 -0
- package/mcp-server/dist/package.json +1 -0
- package/mcp-server/dist/provision-types.d.ts +290 -0
- package/mcp-server/dist/provision-types.js +174 -0
- package/mcp-server/dist/server.d.ts +6 -0
- package/mcp-server/dist/server.mjs +1925 -0
- package/mcp-server/dist/session.d.ts +85 -0
- package/mcp-server/dist/session.js +152 -0
- package/mcp-server/mcp-app.html +28 -0
- package/mcp-server/mcp-config.example.json +19 -0
- package/mcp-server/package-lock.json +4027 -0
- package/mcp-server/package.json +31 -0
- package/mcp-server/src/codegen.ts +189 -0
- package/mcp-server/src/mcp-app.css +360 -0
- package/mcp-server/src/mcp-app.ts +547 -0
- package/mcp-server/src/provision-types.ts +209 -0
- package/mcp-server/src/server.ts +2391 -0
- package/mcp-server/src/session.ts +194 -0
- package/mcp-server/tsconfig.json +16 -0
- package/mcp-server/vite.config.ts +23 -0
- package/package.json +158 -0
- package/schema.json +1046 -0
- package/scripts/generate-skills.js +94 -0
- package/sdk-log-formatter.js +1157 -0
- package/sdk.d.ts +1486 -0
- package/sdk.js +4336 -0
- package/setup/aws/cloudformation.yaml +463 -0
- package/setup/aws/disable-defender.sh +42 -0
- package/setup/aws/install-dev-runner.sh +79 -0
- package/setup/aws/spawn-runner.sh +289 -0
- package/test/captcha-solver.test.mjs +152 -0
- package/test/chrome-remote-debugging.test.mjs +66 -0
- package/test/duckduckgo/experiment.test.mjs +28 -0
- package/test/duckduckgo/setup.test.mjs +29 -0
- package/test/manual/debug-locate-response.js +82 -0
- package/test/manual/reconnect-provision.test.mjs +49 -0
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +97 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +29 -0
- package/test/manual/test-sdk-methods.js +15 -0
- package/test/manual/test-sdk-refactor.js +53 -0
- package/test/manual/test-stack-trace.mjs +57 -0
- package/test/manual/verify-element-api.js +89 -0
- package/test/manual/verify-types.js +0 -0
- package/test/manual-unawaited-promise.test.mjs +31 -0
- package/vitest.config.mjs +58 -0
- package/vitest.runner.config.mjs +33 -0
- package/vscode-extension/.vscodeignore +12 -0
- package/vscode-extension/README.md +94 -0
- package/vscode-extension/media/icon.png +0 -0
- package/vscode-extension/package-lock.json +4126 -0
- package/vscode-extension/package.json +86 -0
- package/vscode-extension/src/extension.ts +829 -0
- package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
- package/vscode-extension/tsconfig.json +16 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# Progressive Disclosure APIs
|
|
2
|
+
|
|
3
|
+
TestDriver v7 introduces **progressive disclosure** - three levels of API to match your experience and needs.
|
|
4
|
+
|
|
5
|
+
## Choose Your Level
|
|
6
|
+
|
|
7
|
+
### 🟢 Beginner: Provision API
|
|
8
|
+
|
|
9
|
+
**Best for:** Getting started, testing common apps (Chrome, VS Code, Electron)
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
import { provision } from 'testdriverai/presets';
|
|
13
|
+
|
|
14
|
+
test('my test', async (context) => {
|
|
15
|
+
const { testdriver } = await provision('chrome', {
|
|
16
|
+
url: 'https://example.com'
|
|
17
|
+
}, context);
|
|
18
|
+
|
|
19
|
+
await testdriver.find('Login').click();
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Why use this:**
|
|
24
|
+
- ✅ Zero configuration
|
|
25
|
+
- ✅ One line setup
|
|
26
|
+
- ✅ Automatic everything (launch, focus, cleanup, recording)
|
|
27
|
+
- ✅ Perfect for beginners
|
|
28
|
+
|
|
29
|
+
[Learn more →](./PROVISION.md)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### 🟡 Intermediate: Hooks API
|
|
34
|
+
|
|
35
|
+
**Best for:** Power users, custom workflows, manual lifecycle control
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
|
|
39
|
+
|
|
40
|
+
test('my test', async (context) => {
|
|
41
|
+
const client = useTestDriver(context, { os: 'linux' });
|
|
42
|
+
const dashcam = useDashcam(context, client, {
|
|
43
|
+
autoStart: true,
|
|
44
|
+
autoStop: true
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
await client.find('button').click();
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Why use this:**
|
|
52
|
+
- ✅ Automatic cleanup
|
|
53
|
+
- ✅ Flexible configuration
|
|
54
|
+
- ✅ Control over lifecycle
|
|
55
|
+
- ✅ Works with any application
|
|
56
|
+
|
|
57
|
+
[Learn more →](./HOOKS.md)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### 🔴 Advanced: Core Classes
|
|
62
|
+
|
|
63
|
+
**Best for:** Full control, non-Vitest frameworks, custom integrations
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
67
|
+
|
|
68
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
69
|
+
await client.auth();
|
|
70
|
+
await client.connect();
|
|
71
|
+
|
|
72
|
+
const dashcam = new Dashcam(client);
|
|
73
|
+
await dashcam.start();
|
|
74
|
+
|
|
75
|
+
// Your code
|
|
76
|
+
|
|
77
|
+
await dashcam.stop();
|
|
78
|
+
await client.disconnect();
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Why use this:**
|
|
82
|
+
- ✅ Complete manual control
|
|
83
|
+
- ✅ No framework dependencies
|
|
84
|
+
- ✅ Works anywhere
|
|
85
|
+
- ✅ Maximum flexibility
|
|
86
|
+
|
|
87
|
+
[Learn more →](./CORE.md)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Architecture
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
┌─────────────────────────────────────────────┐
|
|
95
|
+
│ 🟢 Provision API (Easiest) │
|
|
96
|
+
│ provision('chrome', options, context) │
|
|
97
|
+
└─────────────────┬───────────────────────────┘
|
|
98
|
+
│
|
|
99
|
+
┌─────────────────▼───────────────────────────┐
|
|
100
|
+
│ 🟡 Hooks API (Flexible) │
|
|
101
|
+
│ useTestDriver(), useDashcam() │
|
|
102
|
+
└─────────────────┬───────────────────────────┘
|
|
103
|
+
│
|
|
104
|
+
┌─────────────────▼───────────────────────────┐
|
|
105
|
+
│ 🔴 Core Classes (Full Control) │
|
|
106
|
+
│ new TestDriver(), new Dashcam() │
|
|
107
|
+
└─────────────────────────────────────────────┘
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Each level builds on the one below it. Choose the highest level that meets your needs.
|
|
111
|
+
|
|
112
|
+
## Quick Comparison
|
|
113
|
+
|
|
114
|
+
| Feature | Provision | Hooks | Core |
|
|
115
|
+
|---------|-----------|-------|------|
|
|
116
|
+
| Setup complexity | ⭐ 1 line | ⭐⭐ 2-3 lines | ⭐⭐⭐ 5+ lines |
|
|
117
|
+
| Cleanup | ✅ Automatic | ✅ Automatic | ❌ Manual |
|
|
118
|
+
| Framework requirement | Vitest | Vitest | None |
|
|
119
|
+
| Application support | Chrome, VS Code, Electron | Any | Any |
|
|
120
|
+
| Launch application | ✅ Automatic | ❌ Manual | ❌ Manual |
|
|
121
|
+
| Dashcam recording | ✅ Automatic | ⚡ Optional automatic | ❌ Manual |
|
|
122
|
+
| TypeScript support | ✅ Full | ✅ Full | ✅ Full |
|
|
123
|
+
| Customization | ⚡ Limited | ✅ High | ✅ Complete |
|
|
124
|
+
|
|
125
|
+
## When to Use Each
|
|
126
|
+
|
|
127
|
+
### Use Provision API when:
|
|
128
|
+
- ✅ Testing Chrome, VS Code, or Electron
|
|
129
|
+
- ✅ You're a beginner
|
|
130
|
+
- ✅ You want the simplest possible code
|
|
131
|
+
- ✅ You're okay with defaults
|
|
132
|
+
|
|
133
|
+
### Use Hooks API when:
|
|
134
|
+
- ✅ You need custom application launch
|
|
135
|
+
- ✅ You want automatic cleanup
|
|
136
|
+
- ✅ You're using Vitest
|
|
137
|
+
- ✅ You need fine-grained lifecycle control
|
|
138
|
+
|
|
139
|
+
### Use Core Classes when:
|
|
140
|
+
- ✅ Not using Vitest
|
|
141
|
+
- ✅ Integrating with other frameworks
|
|
142
|
+
- ✅ Building custom abstractions
|
|
143
|
+
- ✅ Debugging lifecycle issues
|
|
144
|
+
- ✅ Need complete manual control
|
|
145
|
+
|
|
146
|
+
## Examples
|
|
147
|
+
|
|
148
|
+
### Simple Chrome Test
|
|
149
|
+
|
|
150
|
+
**Provision (1 line):**
|
|
151
|
+
```javascript
|
|
152
|
+
const { testdriver } = await provision('chrome', { url }, context);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Hooks (3 lines):**
|
|
156
|
+
```javascript
|
|
157
|
+
const client = useTestDriver(context);
|
|
158
|
+
await client.exec('sh', 'google-chrome "https://..." &', 30000);
|
|
159
|
+
await client.focusApplication('Google Chrome');
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Core (6+ lines):**
|
|
163
|
+
```javascript
|
|
164
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
165
|
+
await client.auth();
|
|
166
|
+
await client.connect();
|
|
167
|
+
await client.exec('sh', 'google-chrome "https://..." &', 30000);
|
|
168
|
+
await client.focusApplication('Google Chrome');
|
|
169
|
+
// ... test code ...
|
|
170
|
+
await client.disconnect();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### With Dashcam Recording
|
|
174
|
+
|
|
175
|
+
**Provision (1 line):**
|
|
176
|
+
```javascript
|
|
177
|
+
const { testdriver, dashcam } = await provision('chrome', { url }, context);
|
|
178
|
+
// Recording automatic!
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Hooks (2 lines):**
|
|
182
|
+
```javascript
|
|
183
|
+
const client = useTestDriver(context);
|
|
184
|
+
const dashcam = useDashcam(context, client, { autoStart: true, autoStop: true });
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Core (7+ lines):**
|
|
188
|
+
```javascript
|
|
189
|
+
const client = new TestDriver(apiKey);
|
|
190
|
+
await client.auth();
|
|
191
|
+
await client.connect();
|
|
192
|
+
const dashcam = new Dashcam(client);
|
|
193
|
+
await dashcam.auth();
|
|
194
|
+
await dashcam.start();
|
|
195
|
+
// ... test code ...
|
|
196
|
+
await dashcam.stop();
|
|
197
|
+
await client.disconnect();
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Migration Path
|
|
201
|
+
|
|
202
|
+
Start simple, grow as needed:
|
|
203
|
+
|
|
204
|
+
1. **Start with Provision** - Get tests working quickly
|
|
205
|
+
2. **Move to Hooks** - When you need custom app launch
|
|
206
|
+
3. **Use Core** - Only if you need full control or non-Vitest
|
|
207
|
+
|
|
208
|
+
You can mix and match in the same project!
|
|
209
|
+
|
|
210
|
+
## Package Exports
|
|
211
|
+
|
|
212
|
+
All three APIs are available from the same package:
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
// Provision API
|
|
216
|
+
import { provision, chrome, vscode, electron } from 'testdriverai/presets';
|
|
217
|
+
|
|
218
|
+
// Hooks API
|
|
219
|
+
import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
|
|
220
|
+
|
|
221
|
+
// Core Classes
|
|
222
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## See Also
|
|
226
|
+
|
|
227
|
+
- [Provision API Reference](./PROVISION.md)
|
|
228
|
+
- [Hooks API Reference](./HOOKS.md)
|
|
229
|
+
- [Core Classes Reference](./CORE.md)
|
|
230
|
+
- [Migration Guide](../MIGRATION.md)
|
|
@@ -0,0 +1,200 @@
|
|
|
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
|