@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,399 @@
|
|
|
1
|
+
# TestDriver Test Recording Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This system provides comprehensive test execution tracking, linking test runs with dashcam screen recordings and CI/CD pipelines in the TestDriver dashboard.
|
|
6
|
+
|
|
7
|
+
## Architecture Diagram
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
11
|
+
โ Developer's Machine / CI โ
|
|
12
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
|
|
13
|
+
โ โ
|
|
14
|
+
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
|
|
15
|
+
โ โ Vitest โโโโโโโโโโถโ TD Vitest โ โ
|
|
16
|
+
โ โ Test Runner โ โ Plugin โ โ
|
|
17
|
+
โ โโโโโโโโโโโโโโโโ โโโโโโโโฌโโโโโโโโ โ
|
|
18
|
+
โ โ โ
|
|
19
|
+
โ โโโโโโโโโโโโโโโโ โ โ
|
|
20
|
+
โ โ Dashcam โ โ โ
|
|
21
|
+
โ โ Recording โ โ โ
|
|
22
|
+
โ โโโโโโโโฌโโโโโโโโ โ โ
|
|
23
|
+
โ โ โ โ
|
|
24
|
+
โ โ (records screen) โ (reports results) โ
|
|
25
|
+
โ โ โ โ
|
|
26
|
+
โโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
27
|
+
โ โ
|
|
28
|
+
โ โ
|
|
29
|
+
โผ โผ
|
|
30
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
31
|
+
โ TestDriver API Server โ
|
|
32
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
|
|
33
|
+
โ โ
|
|
34
|
+
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
|
|
35
|
+
โ โ Replay API โ โ Test Run API โ โ
|
|
36
|
+
โ โ (dashcam) โ โ (new) โ โ
|
|
37
|
+
โ โโโโโโโโฌโโโโโโโโ โโโโโโโโฌโโโโโโโโ โ
|
|
38
|
+
โ โ โ โ
|
|
39
|
+
โ โโโโโโโโโโฌโโโโโโโโโโโโโโโโ โ
|
|
40
|
+
โ โ โ
|
|
41
|
+
โ โผ โ
|
|
42
|
+
โ โโโโโโโโโโโโโโโโโโ โ
|
|
43
|
+
โ โ MongoDB โ โ
|
|
44
|
+
โ โ โ โ
|
|
45
|
+
โ โ โข TdTestRun โ โ
|
|
46
|
+
โ โ โข TdTestCase โ โ
|
|
47
|
+
โ โ โข Replay โ โ
|
|
48
|
+
โ โโโโโโโโโโโโโโโโโโ โ
|
|
49
|
+
โ โ
|
|
50
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
51
|
+
โ
|
|
52
|
+
โ
|
|
53
|
+
โผ
|
|
54
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
55
|
+
โ TestDriver Web Dashboard โ
|
|
56
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
|
|
57
|
+
โ โ
|
|
58
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
59
|
+
โ โ Test Runs View (NEW) โ โ
|
|
60
|
+
โ โ โ โ
|
|
61
|
+
โ โ โข List all test runs โ โ
|
|
62
|
+
โ โ โข Filter by status, date, CI โ โ
|
|
63
|
+
โ โ โข Show pass/fail statistics โ โ
|
|
64
|
+
โ โ โข Link to CI/CD runs โ โ
|
|
65
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
66
|
+
โ โ
|
|
67
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
68
|
+
โ โ Test Run Detail View (NEW) โ โ
|
|
69
|
+
โ โ โ โ
|
|
70
|
+
โ โ โข Test case list with status โ โ
|
|
71
|
+
โ โ โข Dashcam replay player (embedded) โ โ
|
|
72
|
+
โ โ โข Error messages and stack traces โ โ
|
|
73
|
+
โ โ โข Sandbox details โ โ
|
|
74
|
+
โ โ โข Git commit info โ โ
|
|
75
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
76
|
+
โ โ
|
|
77
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Data Models
|
|
81
|
+
|
|
82
|
+
### TdTestRun
|
|
83
|
+
Represents a complete test suite execution (e.g., `vitest run`).
|
|
84
|
+
|
|
85
|
+
**Key Fields:**
|
|
86
|
+
- `runId`: Unique identifier
|
|
87
|
+
- `suiteName`: Name of the test suite
|
|
88
|
+
- `status`: running | passed | failed | cancelled
|
|
89
|
+
- `totalTests`, `passedTests`, `failedTests`: Statistics
|
|
90
|
+
- `platform`: windows | mac | linux
|
|
91
|
+
- CI/CD metadata (provider, runId, url)
|
|
92
|
+
- Git metadata (repo, branch, commit)
|
|
93
|
+
- `dashcamSessionId`: Links to dashcam recordings
|
|
94
|
+
|
|
95
|
+
**Relationships:**
|
|
96
|
+
- `team`: Owner team
|
|
97
|
+
- `testCases`: Collection of TdTestCase
|
|
98
|
+
- `replays`: Associated Replay records
|
|
99
|
+
|
|
100
|
+
### TdTestCase
|
|
101
|
+
Represents an individual test within a test run.
|
|
102
|
+
|
|
103
|
+
**Key Fields:**
|
|
104
|
+
- `testName`: Test name from `test('...')`
|
|
105
|
+
- `testFile`: Path to test file
|
|
106
|
+
- `suiteName`: Describe block name
|
|
107
|
+
- `status`: passed | failed | skipped | pending
|
|
108
|
+
- `duration`: Test duration in ms
|
|
109
|
+
- `errorMessage`, `errorStack`: Failure details
|
|
110
|
+
- `replayUrl`: Direct link to dashcam replay
|
|
111
|
+
- `replayStartTime`, `replayEndTime`: Timestamps within replay
|
|
112
|
+
|
|
113
|
+
**Relationships:**
|
|
114
|
+
- `testRun`: Parent TdTestRun
|
|
115
|
+
- `replay`: Associated Replay recor
|
|
116
|
+
### Replay (Extended)
|
|
117
|
+
Existing model extended with test run associations.
|
|
118
|
+
|
|
119
|
+
**New Fields:**
|
|
120
|
+
- `tdTestRun`: Associated test run
|
|
121
|
+
- `tdTestCase`: Associated test case
|
|
122
|
+
|
|
123
|
+
## API Endpoints
|
|
124
|
+
|
|
125
|
+
### POST /api/v1/testdriver/test-run-create
|
|
126
|
+
Create a new test run.
|
|
127
|
+
|
|
128
|
+
**Auth:** Required (Bearer token)
|
|
129
|
+
|
|
130
|
+
**Request:**
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"runId": "vitest-1234567890-abc123",
|
|
134
|
+
"suiteName": "Integration Tests",
|
|
135
|
+
"platform": "windows",
|
|
136
|
+
"sandboxId": "sandbox-xyz",
|
|
137
|
+
"ciProvider": "GitHub Actions",
|
|
138
|
+
"ciRunId": "12345",
|
|
139
|
+
"repo": "myorg/myrepo",
|
|
140
|
+
"branch": "main",
|
|
141
|
+
"commit": "abc123def456"
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Response:**
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"data": {
|
|
149
|
+
"id": "...",
|
|
150
|
+
"runId": "vitest-1234567890-abc123",
|
|
151
|
+
"status": "running",
|
|
152
|
+
"startTime": 1700000000000
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### POST /api/v1/testdriver/test-run-complete
|
|
158
|
+
Mark a test run as complete.
|
|
159
|
+
|
|
160
|
+
**Auth:** Required
|
|
161
|
+
|
|
162
|
+
**Request:**
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"runId": "vitest-1234567890-abc123",
|
|
166
|
+
"status": "passed",
|
|
167
|
+
"totalTests": 25,
|
|
168
|
+
"passedTests": 24,
|
|
169
|
+
"failedTests": 1,
|
|
170
|
+
"skippedTests": 0
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### POST /api/v1/testdriver/test-case-create
|
|
175
|
+
Record a test case result (create or update).
|
|
176
|
+
|
|
177
|
+
**Auth:** Required
|
|
178
|
+
|
|
179
|
+
**Request:**
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"runId": "vitest-1234567890-abc123",
|
|
183
|
+
"testName": "should login successfully",
|
|
184
|
+
"testFile": "tests/auth/login.test.js",
|
|
185
|
+
"suiteName": "Authentication Tests",
|
|
186
|
+
"status": "passed",
|
|
187
|
+
"startTime": 1700000001000,
|
|
188
|
+
"endTime": 1700000002500,
|
|
189
|
+
"duration": 1500,
|
|
190
|
+
"replayUrl": "https://app.dashcam.io/replay/abc123"
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Components
|
|
195
|
+
|
|
196
|
+
### Vitest Plugin (`interfaces/vitest-plugin.mjs`)
|
|
197
|
+
Automatically integrates with Vitest test runs.
|
|
198
|
+
|
|
199
|
+
**Features:**
|
|
200
|
+
- Auto-detects CI/CD environment (GitHub Actions, GitLab, etc.)
|
|
201
|
+
- Extracts Git metadata from environment or git commands
|
|
202
|
+
- Creates test run at start
|
|
203
|
+
- Records each test case result
|
|
204
|
+
- Associates with dashcam session if `DASHCAM_SESSION_ID` is set
|
|
205
|
+
- Completes test run with statistics
|
|
206
|
+
- Uses plugin architecture for better global state management
|
|
207
|
+
|
|
208
|
+
**Usage:**
|
|
209
|
+
```javascript
|
|
210
|
+
// vitest.config.mjs
|
|
211
|
+
import testDriverPlugin from './interfaces/vitest-plugin.mjs';
|
|
212
|
+
|
|
213
|
+
export default {
|
|
214
|
+
plugins: [
|
|
215
|
+
testDriverPlugin({
|
|
216
|
+
apiKey: process.env.TD_API_KEY,
|
|
217
|
+
apiRoot: process.env.TD_API_ROOT || 'https://api.testdriver.ai',
|
|
218
|
+
}),
|
|
219
|
+
],
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### SDK Methods (`sdk.js`)
|
|
224
|
+
|
|
225
|
+
#### `client.createTestRun(options)`
|
|
226
|
+
Create a test run programmatically.
|
|
227
|
+
|
|
228
|
+
#### `client.recordTestCase(options)`
|
|
229
|
+
Record a test case result.
|
|
230
|
+
|
|
231
|
+
#### `client.completeTestRun(options)`
|
|
232
|
+
Mark test run as complete.
|
|
233
|
+
|
|
234
|
+
## Integration Flows
|
|
235
|
+
|
|
236
|
+
### Flow 1: Automated with Vitest Reporter
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
1. Developer runs: vitest run
|
|
240
|
+
2. Vitest starts, reporter initializes
|
|
241
|
+
3. Reporter creates TdTestRun
|
|
242
|
+
4. For each test:
|
|
243
|
+
- Vitest runs test
|
|
244
|
+
- Reporter records TdTestCase (passed/failed)
|
|
245
|
+
5. All tests complete
|
|
246
|
+
6. Reporter calls completeTestRun()
|
|
247
|
+
7. Results visible in dashboard
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Flow 2: With Dashcam Recording
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
1. Start dashcam: dashcam start
|
|
254
|
+
2. Set session ID: export DASHCAM_SESSION_ID=$(dashcam session-id)
|
|
255
|
+
3. Run tests: vitest run
|
|
256
|
+
4. Reporter creates test run with dashcamSessionId
|
|
257
|
+
5. Tests execute, dashcam records
|
|
258
|
+
6. Stop dashcam: dashcam stop
|
|
259
|
+
7. Publish: dashcam publish -p PROJECT_ID
|
|
260
|
+
8. Replay URL returned
|
|
261
|
+
9. Dashboard shows test results + replay link
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Flow 3: CI/CD Pipeline (GitHub Actions)
|
|
265
|
+
|
|
266
|
+
```yaml
|
|
267
|
+
jobs:
|
|
268
|
+
test:
|
|
269
|
+
runs-on: windows-latest
|
|
270
|
+
steps:
|
|
271
|
+
- uses: actions/checkout@v3
|
|
272
|
+
- run: npm install
|
|
273
|
+
- name: Start Dashcam
|
|
274
|
+
run: |
|
|
275
|
+
dashcam start
|
|
276
|
+
echo "DASHCAM_SESSION_ID=$(dashcam session-id)" >> $GITHUB_ENV
|
|
277
|
+
- name: Run Tests
|
|
278
|
+
env:
|
|
279
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
280
|
+
run: vitest run
|
|
281
|
+
- name: Publish Recording
|
|
282
|
+
if: always()
|
|
283
|
+
run: |
|
|
284
|
+
dashcam stop
|
|
285
|
+
dashcam publish -p ${{ secrets.DASHCAM_PROJECT_ID }}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Reporter auto-detects:
|
|
289
|
+
- GitHub repo, branch, commit
|
|
290
|
+
- Workflow run ID and URL
|
|
291
|
+
- Job ID
|
|
292
|
+
- Actor (who triggered)
|
|
293
|
+
|
|
294
|
+
## Dashcam Association Strategies
|
|
295
|
+
|
|
296
|
+
### Strategy 1: Session ID (Implemented)
|
|
297
|
+
- Set `DASHCAM_SESSION_ID` environment variable
|
|
298
|
+
- Reporter includes in test run creation
|
|
299
|
+
- Dashboard queries replays by session ID
|
|
300
|
+
- Shows all replays from that session
|
|
301
|
+
|
|
302
|
+
### Strategy 2: Explicit URL (Implemented)
|
|
303
|
+
- Dashcam publishes, returns URL
|
|
304
|
+
- Pass URL to `recordTestCase()`
|
|
305
|
+
- Direct 1:1 link between test and replay
|
|
306
|
+
|
|
307
|
+
### Strategy 3: Timestamp Matching (Future)
|
|
308
|
+
- Parse dashcam logs for replay timestamps
|
|
309
|
+
- Match test start/end times with replay markers
|
|
310
|
+
- Automatically associate without manual linking
|
|
311
|
+
- Allows seeking to exact test within long replay
|
|
312
|
+
|
|
313
|
+
### Strategy 4: Log Parsing (Future)
|
|
314
|
+
- Dashcam logs test names/files during recording
|
|
315
|
+
- Parse logs to extract test-to-timestamp mapping
|
|
316
|
+
- Generate replay URLs with timestamp seek parameters
|
|
317
|
+
- Example: `https://app.dashcam.io/replay/abc123?t=45000` (seek to 45s)
|
|
318
|
+
|
|
319
|
+
## Dashboard Views (To Be Built)
|
|
320
|
+
|
|
321
|
+
### Test Runs List
|
|
322
|
+
- Table of all test runs
|
|
323
|
+
- Columns: Suite Name, Status, Tests (passed/failed), Duration, Date, CI Link
|
|
324
|
+
- Filters: Status, Date range, CI provider, Platform
|
|
325
|
+
- Search: By suite name, repo, branch
|
|
326
|
+
|
|
327
|
+
### Test Run Detail
|
|
328
|
+
- Header: Suite name, status, duration, platform
|
|
329
|
+
- Statistics card: Total/passed/failed/skipped
|
|
330
|
+
- Test cases table: Name, Status, Duration, Replay link
|
|
331
|
+
- Sidebar: Git info, CI info, Sandbox details
|
|
332
|
+
- Dashcam replay player (embedded iframe)
|
|
333
|
+
- Click test case โ seek replay to that test's time range
|
|
334
|
+
|
|
335
|
+
### Sandbox Management
|
|
336
|
+
- List of active/terminated sandboxes
|
|
337
|
+
- Lifecycle timeline visualization
|
|
338
|
+
- Cost tracking (duration ร instance type)
|
|
339
|
+
- Associated test runs
|
|
340
|
+
|
|
341
|
+
## Environment Variables
|
|
342
|
+
|
|
343
|
+
| Variable | Required | Description |
|
|
344
|
+
|----------|----------|-------------|
|
|
345
|
+
| `TD_API_KEY` | Yes | TestDriver API key for authentication |
|
|
346
|
+
| `DASHCAM_SESSION_ID` | No | Links test run to dashcam session |
|
|
347
|
+
| `TD_SANDBOX_ID` | No | Sandbox ID if running in TestDriver sandbox |
|
|
348
|
+
| `GITHUB_ACTIONS` | Auto | Detected for GitHub Actions integration |
|
|
349
|
+
| `GITLAB_CI` | Auto | Detected for GitLab CI integration |
|
|
350
|
+
| `CIRCLECI` | Auto | Detected for CircleCI integration |
|
|
351
|
+
|
|
352
|
+
## Future Enhancements
|
|
353
|
+
|
|
354
|
+
1. **Real-time Test Streaming**
|
|
355
|
+
- WebSocket connection from reporter
|
|
356
|
+
- Live test progress in dashboard
|
|
357
|
+
- See tests pass/fail as they run
|
|
358
|
+
|
|
359
|
+
2. **Flaky Test Detection**
|
|
360
|
+
- Track test history across runs
|
|
361
|
+
- Identify tests that intermittently fail
|
|
362
|
+
- Suggest fixes based on error patterns
|
|
363
|
+
|
|
364
|
+
3. **Performance Regression Detection**
|
|
365
|
+
- Compare test durations across runs
|
|
366
|
+
- Alert on significant slowdowns
|
|
367
|
+
- Visualize performance trends
|
|
368
|
+
|
|
369
|
+
4. **Advanced Dashcam Integration**
|
|
370
|
+
- Automatic timestamp extraction from logs
|
|
371
|
+
- AI-powered test failure analysis from replays
|
|
372
|
+
- Highlight exact moment of failure in replay
|
|
373
|
+
|
|
374
|
+
5. **Multi-Framework Support**
|
|
375
|
+
- Jest reporter
|
|
376
|
+
- Mocha reporter
|
|
377
|
+
- Playwright reporter
|
|
378
|
+
- Cypress plugin
|
|
379
|
+
|
|
380
|
+
6. **Cost Analytics**
|
|
381
|
+
- Track sandbox costs per test run
|
|
382
|
+
- Optimize instance types
|
|
383
|
+
- Budget alerts
|
|
384
|
+
|
|
385
|
+
## Security Considerations
|
|
386
|
+
|
|
387
|
+
- API keys stored securely (environment variables)
|
|
388
|
+
- Bearer token authentication for all API calls
|
|
389
|
+
- Team-based access control (tests only visible to team members)
|
|
390
|
+
- Replay access control (dashcam's existing permissions)
|
|
391
|
+
- No sensitive data in test metadata (sanitize error messages)
|
|
392
|
+
|
|
393
|
+
## Performance Considerations
|
|
394
|
+
|
|
395
|
+
- Async test case recording (doesn't slow tests)
|
|
396
|
+
- Batch updates for large test suites
|
|
397
|
+
- Efficient database indexing (runId, testFile, status)
|
|
398
|
+
- Replay association is lazy (doesn't block test recording)
|
|
399
|
+
- Optional reporter (disable in local development)
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Auto-Generated Cache Keys from File Hash
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
When you create a TestDriver instance without providing an explicit `cacheKey`, the SDK will automatically generate one based on the SHA-256 hash of the calling file. This provides automatic cache invalidation when your test file changes, while enabling cache hits for identical test runs.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
1. **Stack Trace Analysis**: When `TestDriver()` is called, the SDK analyzes the call stack to find the caller file
|
|
10
|
+
2. **File Hashing**: The content of the caller file is hashed using SHA-256
|
|
11
|
+
3. **Cache Key Generation**: The first 16 characters of the hash are used as the cache key
|
|
12
|
+
4. **Automatic Updates**: When the test file is modified, the hash changes, automatically invalidating the cache
|
|
13
|
+
|
|
14
|
+
## Benefits
|
|
15
|
+
|
|
16
|
+
- โ
**No Manual Cache Management**: Cache keys are automatically generated and updated
|
|
17
|
+
- โ
**File-Scoped Caching**: All tests in the same file share the same cache
|
|
18
|
+
- โ
**Automatic Invalidation**: Cache is invalidated when the test file changes
|
|
19
|
+
- โ
**Explicit Override**: You can still provide a manual `cacheKey` if needed
|
|
20
|
+
|
|
21
|
+
## Usage Examples
|
|
22
|
+
|
|
23
|
+
### Automatic Cache Key (Recommended)
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
import { TestDriver } from 'testdriverai/vitest/hooks';
|
|
27
|
+
|
|
28
|
+
test('login test', async (context) => {
|
|
29
|
+
// No cacheKey provided - will be auto-generated from this file's hash
|
|
30
|
+
const testdriver = TestDriver(context, {
|
|
31
|
+
headless: true
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Cache key is automatically set based on this file
|
|
35
|
+
console.log(testdriver.options.cacheKey); // e.g., "4cae7be040f293b9"
|
|
36
|
+
|
|
37
|
+
const button = await testdriver.find('login button');
|
|
38
|
+
// Subsequent calls in this test file will use the same cache
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Explicit Cache Key (Override)
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
import { TestDriver } from 'testdriverai/vitest/hooks';
|
|
46
|
+
|
|
47
|
+
test('login test', async (context) => {
|
|
48
|
+
// Explicit cacheKey provided - auto-generation is skipped
|
|
49
|
+
const testdriver = TestDriver(context, {
|
|
50
|
+
headless: true,
|
|
51
|
+
cacheKey: 'my-custom-key-v1'
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
console.log(testdriver.options.cacheKey); // "my-custom-key-v1"
|
|
55
|
+
|
|
56
|
+
const button = await testdriver.find('login button');
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Cache Behavior
|
|
61
|
+
|
|
62
|
+
### With Auto-Generated Key
|
|
63
|
+
|
|
64
|
+
1. **First Run**: Creates cache entries with key = hash of test file
|
|
65
|
+
2. **Subsequent Runs** (file unchanged): Cache hits
|
|
66
|
+
3. **After File Modification**: New hash = new cache key = cache miss
|
|
67
|
+
|
|
68
|
+
### Cache Hit Example
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
// File: login.test.mjs (hash: 4cae7be040f293b9)
|
|
72
|
+
|
|
73
|
+
const testdriver = TestDriver(context);
|
|
74
|
+
// Auto-generated cacheKey: "4cae7be040f293b9"
|
|
75
|
+
|
|
76
|
+
const button1 = await testdriver.find('login button'); // Cache MISS (first time)
|
|
77
|
+
const button2 = await testdriver.find('login button'); // Cache HIT (same file, same test run)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
After modifying the file (adding a comment, changing test logic, etc.):
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
// File: login.test.mjs (hash: 7f3d9a2b1c5e8f6a) <- changed!
|
|
84
|
+
|
|
85
|
+
const testdriver = TestDriver(context);
|
|
86
|
+
// Auto-generated cacheKey: "7f3d9a2b1c5e8f6a" <- different from before
|
|
87
|
+
|
|
88
|
+
const button1 = await testdriver.find('login button'); // Cache MISS (new hash)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Debug Mode
|
|
92
|
+
|
|
93
|
+
To see the auto-generated cache key in debug logs:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Set environment variable
|
|
97
|
+
export TD_DEBUG=1
|
|
98
|
+
|
|
99
|
+
# Or in your test
|
|
100
|
+
process.env.TD_DEBUG = '1';
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
With debug mode enabled, you'll see:
|
|
104
|
+
```
|
|
105
|
+
๐ find() threshold: 0.05 (cache ENABLED, cacheKey: 4cae7be040f293b9 (auto-generated from file hash))
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Implementation Details
|
|
109
|
+
|
|
110
|
+
### Stack Trace Filtering
|
|
111
|
+
|
|
112
|
+
The auto-generation skips the following in the stack trace to find the actual test file:
|
|
113
|
+
- `sdk.js` (TestDriver SDK)
|
|
114
|
+
- `hooks.mjs` / `hooks.js` (Vitest hooks)
|
|
115
|
+
- `node_modules` (dependencies)
|
|
116
|
+
- `node:internal` (Node.js internals)
|
|
117
|
+
|
|
118
|
+
### File Path Handling
|
|
119
|
+
|
|
120
|
+
The implementation handles both:
|
|
121
|
+
- Regular file paths: `/Users/you/project/test.mjs`
|
|
122
|
+
- File URL format: `file:///Users/you/project/test.mjs`
|
|
123
|
+
|
|
124
|
+
### Hash Format
|
|
125
|
+
|
|
126
|
+
- Algorithm: SHA-256
|
|
127
|
+
- Output: First 16 hexadecimal characters (e.g., `4cae7be040f293b9`)
|
|
128
|
+
- Collision probability: Effectively zero for practical purposes
|
|
129
|
+
|
|
130
|
+
## When to Use Manual Cache Keys
|
|
131
|
+
|
|
132
|
+
Consider using manual `cacheKey` values when:
|
|
133
|
+
|
|
134
|
+
1. **Cross-File Caching**: You want to share cache across multiple test files
|
|
135
|
+
2. **Version-Based Caching**: You want explicit control over cache invalidation
|
|
136
|
+
3. **CI/CD Integration**: You want to tie caching to build numbers or git commits
|
|
137
|
+
|
|
138
|
+
Example:
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
const cacheKey = \`test-suite-\${process.env.GIT_COMMIT}\`;
|
|
142
|
+
const testdriver = TestDriver(context, { cacheKey });
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Migration from Manual Keys
|
|
146
|
+
|
|
147
|
+
If you currently use manual cache keys:
|
|
148
|
+
|
|
149
|
+
### Before
|
|
150
|
+
```javascript
|
|
151
|
+
const testdriver = TestDriver(context, {
|
|
152
|
+
cacheKey: 'login-test-v1'
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### After (automatic)
|
|
157
|
+
```javascript
|
|
158
|
+
// Just remove the cacheKey - it will be auto-generated!
|
|
159
|
+
const testdriver = TestDriver(context);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
The cache will automatically invalidate when the test file changes, which is usually the desired behavior.
|
|
163
|
+
|
|
164
|
+
## See Also
|
|
165
|
+
|
|
166
|
+
- [SDK_README.md](./SDK_README.md) - Cache configuration options
|
|
167
|
+
- [CACHE_ARCHITECTURE.md](../api/CACHE_ARCHITECTURE.md) - Cache system architecture
|
|
@@ -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! ๐จโจ**
|