testdriverai 7.2.64 → 7.2.69
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/agent/index.js +4 -3
- package/agent/interface.js +11 -251
- package/agent/lib/debugger-server.js +2 -1
- package/agent/lib/logger.js +56 -0
- package/agent/lib/sandbox.js +6 -7
- package/ai/agents/test-writer.md +457 -0
- package/{docs/v7/ai.mdx → ai/skills/testdriver:ai/SKILL.md} +3 -5
- package/{docs/v7/assert.mdx → ai/skills/testdriver:assert/SKILL.md} +3 -4
- package/{docs/v7/aws-setup.mdx → ai/skills/testdriver:aws-setup/SKILL.md} +3 -4
- package/{docs/v7/caching.mdx → ai/skills/testdriver:caching/SKILL.md} +3 -7
- package/{docs/v7/captcha.mdx → ai/skills/testdriver:captcha/SKILL.md} +4 -5
- package/{docs/v7/ci-cd.mdx → ai/skills/testdriver:ci-cd/SKILL.md} +3 -4
- package/{docs/v7/click.mdx → ai/skills/testdriver:click/SKILL.md} +3 -4
- package/{docs/v7/client.mdx → ai/skills/testdriver:client/SKILL.md} +11 -5
- package/{docs/v7/cloud.mdx → ai/skills/testdriver:cloud/SKILL.md} +3 -4
- package/{docs/v7/customizing-devices.mdx → ai/skills/testdriver:customizing-devices/SKILL.md} +36 -26
- package/{docs/v7/dashcam.mdx → ai/skills/testdriver:dashcam/SKILL.md} +3 -4
- package/{docs/v7/device-config.mdx → ai/skills/testdriver:device-config/SKILL.md} +3 -3
- package/{docs/v7/double-click.mdx → ai/skills/testdriver:double-click/SKILL.md} +3 -3
- package/{docs/v7/elements.mdx → ai/skills/testdriver:elements/SKILL.md} +3 -4
- package/{docs/v7/enterprise.mdx → ai/skills/testdriver:enterprise/SKILL.md} +3 -5
- package/ai/skills/testdriver:examples/SKILL.md +7 -0
- package/{docs/v7/exec.mdx → ai/skills/testdriver:exec/SKILL.md} +3 -4
- package/{docs/v7/find.mdx → ai/skills/testdriver:find/SKILL.md} +81 -4
- package/{docs/v7/focus-application.mdx → ai/skills/testdriver:focus-application/SKILL.md} +3 -4
- package/{docs/v7/generating-tests.mdx → ai/skills/testdriver:generating-tests/SKILL.md} +3 -3
- package/{docs/v7/hover.mdx → ai/skills/testdriver:hover/SKILL.md} +3 -4
- package/{docs/v7/locating-elements.mdx → ai/skills/testdriver:locating-elements/SKILL.md} +3 -3
- package/{docs/v7/making-assertions.mdx → ai/skills/testdriver:making-assertions/SKILL.md} +3 -3
- package/ai/skills/testdriver:mcp-workflow/SKILL.md +410 -0
- package/{docs/v7/mouse-down.mdx → ai/skills/testdriver:mouse-down/SKILL.md} +3 -3
- package/{docs/v7/mouse-up.mdx → ai/skills/testdriver:mouse-up/SKILL.md} +3 -3
- package/{docs/v7/performing-actions.mdx → ai/skills/testdriver:performing-actions/SKILL.md} +3 -3
- package/{docs/v7/press-keys.mdx → ai/skills/testdriver:press-keys/SKILL.md} +3 -4
- package/{docs/v7/quickstart.mdx → ai/skills/testdriver:quickstart/SKILL.md} +3 -4
- package/{docs/v7/reusable-code.mdx → ai/skills/testdriver:reusable-code/SKILL.md} +3 -3
- package/{docs/v7/right-click.mdx → ai/skills/testdriver:right-click/SKILL.md} +3 -3
- package/{docs/v7/running-tests.mdx → ai/skills/testdriver:running-tests/SKILL.md} +3 -3
- package/{docs/v7/screenshot.mdx → ai/skills/testdriver:screenshot/SKILL.md} +3 -4
- package/{docs/v7/scroll.mdx → ai/skills/testdriver:scroll/SKILL.md} +3 -4
- package/{docs/v7/secrets.mdx → ai/skills/testdriver:secrets/SKILL.md} +3 -3
- package/{docs/v7/self-hosted.mdx → ai/skills/testdriver:self-hosted/SKILL.md} +3 -4
- package/ai/skills/testdriver:testdriver/SKILL.md +31 -0
- package/{docs/v7/type.mdx → ai/skills/testdriver:type/SKILL.md} +3 -4
- package/{docs/v7/variables.mdx → ai/skills/testdriver:variables/SKILL.md} +3 -3
- package/{docs/v7/waiting-for-elements.mdx → ai/skills/testdriver:waiting-for-elements/SKILL.md} +3 -3
- package/{docs/v7/what-is-testdriver.mdx → ai/skills/testdriver:what-is-testdriver/SKILL.md} +3 -3
- package/interfaces/cli/commands/init.js +278 -1
- package/interfaces/cli/commands/setup.js +382 -0
- package/interfaces/vitest-plugin.mjs +190 -122
- package/lib/sentry.js +4 -3
- package/lib/vitest/hooks.mjs +70 -16
- 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/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.js +1441 -0
- package/mcp-server/dist/session.d.ts +85 -0
- package/mcp-server/dist/session.js +152 -0
- package/package.json +30 -9
- package/sdk.d.ts +29 -2
- package/sdk.js +1 -0
- package/.env.example +0 -4
- package/.github/workflows/acceptance-linux-scheduled.yaml +0 -45
- package/.github/workflows/acceptance-windows-scheduled.yaml +0 -54
- package/.github/workflows/acceptance.yaml +0 -87
- package/.github/workflows/publish.yaml +0 -68
- package/.github/workflows/test-init.yml +0 -145
- package/.github/workflows/testdriver.yml +0 -170
- package/.github/workflows/windows-self-hosted.yaml +0 -82
- package/.prettierignore +0 -4
- package/.prettierrc +0 -1
- package/CHANGELOG.md +0 -34
- package/agents.md +0 -455
- package/debugger/bg.png +0 -0
- package/debugger/icon.png +0 -0
- package/debugger/index.html +0 -797
- package/debugger/td.png +0 -0
- package/debugger/tray-buffered.png +0 -0
- package/debugger/tray.png +0 -0
- package/docs/GITHUB_COMMENTS.md +0 -330
- package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +0 -167
- package/docs/QUICK-START-GITHUB-COMMENTS.md +0 -84
- package/docs/TEST-GITHUB-COMMENTS.md +0 -129
- package/docs/_scripts/link-replacer.js +0 -164
- package/docs/_scripts/upload-docs-to-openai.js +0 -284
- package/docs/docs.json +0 -393
- package/docs/github-integration-setup.md +0 -266
- package/docs/guide/best-practices-polling.mdx +0 -154
- 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 +0 -1
- package/docs/images/content/extension/vscode.svg +0 -57
- package/docs/images/content/extension/windsurf.svg +0 -3
- 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/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 +0 -4
- package/docs/snippets/gitignore-warning.mdx +0 -7
- package/docs/snippets/lifecycle-warning.mdx +0 -6
- package/docs/snippets/test-prereqs.mdx +0 -12
- package/docs/snippets/tests/assert-replay.mdx +0 -7
- package/docs/snippets/tests/assert-yaml.mdx +0 -8
- package/docs/snippets/tests/exec-js-replay.mdx +0 -7
- package/docs/snippets/tests/exec-js-yaml.mdx +0 -32
- package/docs/snippets/tests/exec-shell-replay.mdx +0 -7
- package/docs/snippets/tests/exec-shell-yaml.mdx +0 -15
- package/docs/snippets/tests/hover-image-replay.mdx +0 -7
- package/docs/snippets/tests/hover-image-yaml.mdx +0 -17
- package/docs/snippets/tests/hover-text-replay.mdx +0 -7
- package/docs/snippets/tests/hover-text-with-description-replay.mdx +0 -7
- package/docs/snippets/tests/hover-text-with-description-yaml.mdx +0 -24
- package/docs/snippets/tests/hover-text-yaml.mdx +0 -14
- package/docs/snippets/tests/match-image-replay.mdx +0 -7
- package/docs/snippets/tests/match-image-yaml.mdx +0 -17
- package/docs/snippets/tests/press-keys-replay.mdx +0 -7
- package/docs/snippets/tests/press-keys-yaml.mdx +0 -36
- package/docs/snippets/tests/remember-replay.mdx +0 -7
- package/docs/snippets/tests/remember-yaml.mdx +0 -28
- package/docs/snippets/tests/scroll-replay.mdx +0 -7
- package/docs/snippets/tests/scroll-until-image-replay.mdx +0 -7
- package/docs/snippets/tests/scroll-until-image-yaml.mdx +0 -14
- package/docs/snippets/tests/scroll-until-text-replay.mdx +0 -7
- package/docs/snippets/tests/scroll-until-text-yaml.mdx +0 -17
- package/docs/snippets/tests/scroll-yaml.mdx +0 -30
- package/docs/snippets/tests/type-repeated-replay.mdx +0 -7
- package/docs/snippets/tests/type-repeated-yaml.mdx +0 -22
- package/docs/snippets/tests/type-replay.mdx +0 -7
- package/docs/snippets/tests/type-yaml.mdx +0 -28
- package/docs/snippets/tests/wait-for-image-replay.mdx +0 -7
- package/docs/snippets/tests/wait-for-image-yaml.mdx +0 -18
- package/docs/snippets/tests/wait-for-text-replay.mdx +0 -7
- package/docs/snippets/tests/wait-for-text-yaml.mdx +0 -18
- package/docs/snippets/tests/wait-replay.mdx +0 -7
- package/docs/snippets/tests/wait-yaml.mdx +0 -13
- package/docs/styles.css +0 -65
- package/docs/v6/account/dashboard.mdx +0 -16
- package/docs/v6/account/enterprise.mdx +0 -110
- package/docs/v6/account/pricing.mdx +0 -33
- package/docs/v6/account/projects.mdx +0 -33
- package/docs/v6/account/team.mdx +0 -35
- package/docs/v6/action/ami.mdx +0 -109
- package/docs/v6/action/performance.mdx +0 -105
- package/docs/v6/action/secrets.mdx +0 -93
- package/docs/v6/apps/chrome-extensions.mdx +0 -48
- package/docs/v6/apps/desktop-apps.mdx +0 -93
- package/docs/v6/apps/mobile-apps.mdx +0 -26
- package/docs/v6/apps/static-websites.mdx +0 -54
- package/docs/v6/apps/tauri-apps.mdx +0 -361
- package/docs/v6/bugs/jira.mdx +0 -232
- package/docs/v6/cli/overview.mdx +0 -66
- package/docs/v6/commands/assert.mdx +0 -45
- package/docs/v6/commands/exec.mdx +0 -282
- package/docs/v6/commands/focus-application.mdx +0 -44
- package/docs/v6/commands/hover-image.mdx +0 -69
- package/docs/v6/commands/hover-text.mdx +0 -47
- package/docs/v6/commands/if.mdx +0 -53
- package/docs/v6/commands/match-image.mdx +0 -67
- package/docs/v6/commands/press-keys.mdx +0 -87
- package/docs/v6/commands/remember.mdx +0 -49
- package/docs/v6/commands/run.mdx +0 -44
- package/docs/v6/commands/scroll-until-image.mdx +0 -66
- package/docs/v6/commands/scroll-until-text.mdx +0 -60
- package/docs/v6/commands/scroll.mdx +0 -69
- package/docs/v6/commands/type.mdx +0 -45
- package/docs/v6/commands/wait-for-image.mdx +0 -54
- package/docs/v6/commands/wait-for-text.mdx +0 -48
- package/docs/v6/commands/wait.mdx +0 -45
- package/docs/v6/exporting/junit.mdx +0 -218
- package/docs/v6/exporting/playwright.mdx +0 -197
- package/docs/v6/features/auto-healing.mdx +0 -144
- package/docs/v6/features/generation.mdx +0 -116
- package/docs/v6/features/parallel-testing.mdx +0 -151
- package/docs/v6/features/reusable-snippets.mdx +0 -131
- package/docs/v6/features/selectorless.mdx +0 -80
- package/docs/v6/features/visual-assertions.mdx +0 -139
- package/docs/v6/getting-started/ci.mdx +0 -146
- package/docs/v6/getting-started/cli.mdx +0 -91
- package/docs/v6/getting-started/editing.mdx +0 -100
- package/docs/v6/getting-started/playwright.mdx +0 -342
- package/docs/v6/getting-started/running.mdx +0 -48
- package/docs/v6/getting-started/self-hosting.mdx +0 -408
- package/docs/v6/getting-started/vscode.mdx +0 -89
- package/docs/v6/guide/assertions.mdx +0 -189
- package/docs/v6/guide/authentication.mdx +0 -136
- package/docs/v6/guide/code.mdx +0 -65
- package/docs/v6/guide/dashcam.mdx +0 -118
- package/docs/v6/guide/environment-variables.mdx +0 -26
- package/docs/v6/guide/lifecycle.mdx +0 -242
- package/docs/v6/guide/locating.mdx +0 -141
- package/docs/v6/guide/protips.mdx +0 -43
- package/docs/v6/guide/variables.mdx +0 -143
- package/docs/v6/guide/waiting.mdx +0 -130
- package/docs/v6/importing/csv.mdx +0 -196
- package/docs/v6/importing/gherkin.mdx +0 -143
- package/docs/v6/importing/jira.mdx +0 -164
- package/docs/v6/importing/testrail.mdx +0 -162
- package/docs/v6/integrations/electron.mdx +0 -146
- package/docs/v6/integrations/netlify.mdx +0 -100
- package/docs/v6/integrations/vercel.mdx +0 -125
- package/docs/v6/interactive/explore.mdx +0 -99
- package/docs/v6/interactive/run.mdx +0 -52
- package/docs/v6/interactive/save.mdx +0 -63
- package/docs/v6/overview/comparison.mdx +0 -101
- package/docs/v6/overview/faq.mdx +0 -162
- package/docs/v6/overview/performance.mdx +0 -52
- package/docs/v6/overview/quickstart.mdx +0 -137
- package/docs/v6/overview/what-is-testdriver.mdx +0 -85
- package/docs/v6/scenarios/ai-chatbot.mdx +0 -28
- package/docs/v6/scenarios/cookie-banner.mdx +0 -32
- package/docs/v6/scenarios/file-upload.mdx +0 -33
- package/docs/v6/scenarios/form-filling.mdx +0 -32
- package/docs/v6/scenarios/log-in.mdx +0 -75
- package/docs/v6/scenarios/pdf-generation.mdx +0 -25
- package/docs/v6/scenarios/spell-check.mdx +0 -22
- package/docs/v6/security/action.mdx +0 -84
- package/docs/v6/security/agent.mdx +0 -73
- package/docs/v6/security/platform.mdx +0 -77
- package/docs/v6/tutorials/advanced-test.mdx +0 -81
- package/docs/v6/tutorials/basic-test.mdx +0 -45
- package/docs/v7/_drafts/agents.mdx +0 -852
- package/docs/v7/_drafts/architecture.mdx +0 -399
- package/docs/v7/_drafts/auto-cache-key.mdx +0 -167
- package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +0 -100
- package/docs/v7/_drafts/best-practices.mdx +0 -486
- package/docs/v7/_drafts/caching-ai.mdx +0 -215
- package/docs/v7/_drafts/caching-selectors.mdx +0 -424
- package/docs/v7/_drafts/caching.mdx +0 -366
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +0 -425
- package/docs/v7/_drafts/commands/assert.mdx +0 -45
- package/docs/v7/_drafts/commands/exec.mdx +0 -282
- package/docs/v7/_drafts/commands/focus-application.mdx +0 -44
- package/docs/v7/_drafts/commands/hover-image.mdx +0 -69
- package/docs/v7/_drafts/commands/hover-text.mdx +0 -47
- package/docs/v7/_drafts/commands/if.mdx +0 -53
- package/docs/v7/_drafts/commands/match-image.mdx +0 -67
- package/docs/v7/_drafts/commands/press-keys.mdx +0 -87
- package/docs/v7/_drafts/commands/remember.mdx +0 -49
- package/docs/v7/_drafts/commands/run.mdx +0 -44
- package/docs/v7/_drafts/commands/scroll-until-image.mdx +0 -66
- package/docs/v7/_drafts/commands/scroll-until-text.mdx +0 -60
- package/docs/v7/_drafts/commands/scroll.mdx +0 -69
- package/docs/v7/_drafts/commands/type.mdx +0 -45
- package/docs/v7/_drafts/commands/wait-for-image.mdx +0 -54
- package/docs/v7/_drafts/commands/wait-for-text.mdx +0 -48
- package/docs/v7/_drafts/commands/wait.mdx +0 -45
- package/docs/v7/_drafts/configuration.mdx +0 -378
- package/docs/v7/_drafts/contributing.mdx +0 -174
- package/docs/v7/_drafts/core.mdx +0 -458
- package/docs/v7/_drafts/dashcam-title-feature.mdx +0 -89
- package/docs/v7/_drafts/debugging.mdx +0 -349
- package/docs/v7/_drafts/error-handling.mdx +0 -501
- package/docs/v7/_drafts/faq.mdx +0 -393
- package/docs/v7/_drafts/hooks.mdx +0 -360
- package/docs/v7/_drafts/init-command.mdx +0 -95
- package/docs/v7/_drafts/installation.mdx +0 -420
- package/docs/v7/_drafts/migration.mdx +0 -562
- package/docs/v7/_drafts/observable.mdx +0 -604
- package/docs/v7/_drafts/playwright.mdx +0 -342
- package/docs/v7/_drafts/plugin-migration.mdx +0 -220
- package/docs/v7/_drafts/powerful.mdx +0 -419
- package/docs/v7/_drafts/presets.mdx +0 -210
- package/docs/v7/_drafts/progressive-disclosure.mdx +0 -230
- package/docs/v7/_drafts/prompt-cache.mdx +0 -200
- package/docs/v7/_drafts/provision.mdx +0 -390
- package/docs/v7/_drafts/quick-start-test-recording.mdx +0 -214
- package/docs/v7/_drafts/readme.mdx +0 -135
- package/docs/v7/_drafts/reports.mdx +0 -414
- package/docs/v7/_drafts/scalable.mdx +0 -754
- package/docs/v7/_drafts/screenshot.mdx +0 -155
- package/docs/v7/_drafts/sdk-awesome-logs.mdx +0 -468
- package/docs/v7/_drafts/sdk-browser-rendering.mdx +0 -167
- package/docs/v7/_drafts/sdk-migration.mdx +0 -474
- package/docs/v7/_drafts/sdk-v7-complete.mdx +0 -345
- package/docs/v7/_drafts/self-hosting.mdx +0 -369
- package/docs/v7/_drafts/test-recording.mdx +0 -382
- package/docs/v7/_drafts/troubleshooting.mdx +0 -526
- package/docs/v7/_drafts/vitest-plugin.mdx +0 -477
- package/docs/v7/_drafts/vitest.mdx +0 -535
- package/docs/v7/_drafts/writing-tests.mdx +0 -25
- package/docs/v7/examples.mdx +0 -5
- package/eslint.config.js +0 -67
- package/examples/ai.test.mjs +0 -30
- package/examples/assert.test.mjs +0 -46
- package/examples/captcha-api.test.mjs +0 -50
- package/examples/chrome-extension.test.mjs +0 -94
- package/examples/drag-and-drop.test.mjs +0 -58
- package/examples/element-not-found.test.mjs +0 -26
- package/examples/exec-output.test.mjs +0 -59
- package/examples/exec-pwsh.test.mjs +0 -57
- package/examples/focus-window.test.mjs +0 -36
- package/examples/formatted-logging.test.mjs +0 -26
- package/examples/hover-image.test.mjs +0 -52
- package/examples/hover-text-with-description.test.mjs +0 -56
- package/examples/hover-text.test.mjs +0 -27
- package/examples/installer.test.mjs +0 -49
- package/examples/launch-vscode-linux.test.mjs +0 -54
- package/examples/match-image.test.mjs +0 -54
- package/examples/no-provision.test.mjs +0 -23
- package/examples/press-keys.test.mjs +0 -50
- package/examples/prompt.test.mjs +0 -33
- package/examples/scroll-keyboard.test.mjs +0 -37
- package/examples/scroll-until-image.test.mjs +0 -39
- package/examples/scroll-until-text.test.mjs +0 -67
- package/examples/scroll.test.mjs +0 -41
- package/examples/type.test.mjs +0 -45
- package/examples/windows-installer.test.mjs +0 -53
- package/interfaces/cli/commands/edit.js +0 -3
- package/interfaces/cli/commands/generate.js +0 -3
- package/interfaces/cli/commands/run.js +0 -3
- package/interfaces/cli/utils/factory.js +0 -71
- package/jsconfig.json +0 -26
- package/manual/test-init-command.js +0 -223
- package/sdk-log-formatter.js +0 -930
- package/setup/aws/cloudformation.yaml +0 -470
- package/setup/aws/spawn-runner.sh +0 -190
- package/test/api-resilience.test.mjs +0 -0
- package/test/captcha-solver.test.mjs +0 -70
- package/test/chrome-remote-debugging.test.mjs +0 -66
- package/test/manual/debug-locate-response.js +0 -82
- package/test/manual/reconnect-provision.test.mjs +0 -49
- package/test/manual/test-console-logs.test.mjs +0 -42
- package/test/manual/test-find-api.js +0 -73
- package/test/manual/test-init.sh +0 -54
- package/test/manual/test-prompt-cache.js +0 -96
- package/test/manual/test-provision-auth.mjs +0 -22
- package/test/manual/test-sandbox-render.js +0 -28
- package/test/manual/test-sdk-methods.js +0 -15
- package/test/manual/test-sdk-refactor.js +0 -53
- package/test/manual/test-stack-trace.mjs +0 -57
- package/test/manual/verify-element-api.js +0 -89
- package/test/manual/verify-types.js +0 -0
- package/test/manual-unawaited-promise.test.mjs +0 -31
- package/testdriver-plugin/skills/actions/SKILL.md +0 -93
- package/testdriver-plugin/skills/assertions/SKILL.md +0 -77
- package/testdriver-plugin/skills/caching/SKILL.md +0 -66
- package/testdriver-plugin/skills/creating-tests/SKILL.md +0 -104
- package/testdriver-plugin/skills/finding-elements/SKILL.md +0 -77
- package/testdriver-plugin/skills/github-actions/SKILL.md +0 -100
- package/testdriver-plugin/skills/running-tests/SKILL.md +0 -77
- package/testdriver-plugin/skills/secrets/SKILL.md +0 -87
- package/testdriver-plugin/skills/self-hosting/SKILL.md +0 -89
- package/testdriver-plugin/skills/setup/SKILL.md +0 -76
- package/testdriver-plugin/skills/variables/SKILL.md +0 -88
- package/testdriver-plugin/skills/waiting/SKILL.md +0 -72
- package/vitest.config.mjs +0 -29
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session state management for TestDriver MCP Server
|
|
3
|
+
* Tracks sandbox sessions for MCP server
|
|
4
|
+
*/
|
|
5
|
+
export interface SessionState {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
sandboxId: string | null;
|
|
8
|
+
status: "initializing" | "active" | "expired" | "error";
|
|
9
|
+
os: "linux" | "windows";
|
|
10
|
+
resolution: string;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
keepAlive: number;
|
|
14
|
+
testFile: string | null;
|
|
15
|
+
lastScreenshot: string | null;
|
|
16
|
+
errorMessage?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Session Manager - handles session state for MCP server
|
|
20
|
+
*/
|
|
21
|
+
export declare class SessionManager {
|
|
22
|
+
private sessions;
|
|
23
|
+
private currentSessionId;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new session
|
|
26
|
+
*/
|
|
27
|
+
createSession(options: {
|
|
28
|
+
sandboxId?: string;
|
|
29
|
+
os?: "linux" | "windows";
|
|
30
|
+
resolution?: string;
|
|
31
|
+
keepAlive?: number;
|
|
32
|
+
testFile?: string;
|
|
33
|
+
}): SessionState;
|
|
34
|
+
/**
|
|
35
|
+
* Get the current active session
|
|
36
|
+
*/
|
|
37
|
+
getCurrentSession(): SessionState | null;
|
|
38
|
+
/**
|
|
39
|
+
* Get a session by ID
|
|
40
|
+
*/
|
|
41
|
+
getSession(sessionId: string): SessionState | null;
|
|
42
|
+
/**
|
|
43
|
+
* Update session state
|
|
44
|
+
*/
|
|
45
|
+
updateSession(sessionId: string, updates: Partial<SessionState>): SessionState | null;
|
|
46
|
+
/**
|
|
47
|
+
* Mark session as active with sandbox ID
|
|
48
|
+
*/
|
|
49
|
+
activateSession(sessionId: string, sandboxId: string): SessionState | null;
|
|
50
|
+
/**
|
|
51
|
+
* Extend session expiry time by adding additional milliseconds
|
|
52
|
+
*/
|
|
53
|
+
extendSession(sessionId: string, additionalMs: number): SessionState | null;
|
|
54
|
+
/**
|
|
55
|
+
* Refresh session expiry to reset the keepAlive timer from now
|
|
56
|
+
* Called on each command to keep session alive during active use
|
|
57
|
+
*/
|
|
58
|
+
refreshSession(sessionId: string): SessionState | null;
|
|
59
|
+
/**
|
|
60
|
+
* Check if session is still valid
|
|
61
|
+
*/
|
|
62
|
+
isSessionValid(sessionId: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get time remaining until session expires
|
|
65
|
+
*/
|
|
66
|
+
getTimeRemaining(sessionId: string): number;
|
|
67
|
+
/**
|
|
68
|
+
* Mark session as expired/ended
|
|
69
|
+
*/
|
|
70
|
+
endSession(sessionId: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Delete a session
|
|
73
|
+
*/
|
|
74
|
+
deleteSession(sessionId: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Get session summary for status reporting
|
|
77
|
+
*/
|
|
78
|
+
getSessionSummary(sessionId: string): {
|
|
79
|
+
sessionId: string;
|
|
80
|
+
status: string;
|
|
81
|
+
sandboxId: string | null;
|
|
82
|
+
timeRemaining: number;
|
|
83
|
+
} | null;
|
|
84
|
+
}
|
|
85
|
+
export declare const sessionManager: SessionManager;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session state management for TestDriver MCP Server
|
|
3
|
+
* Tracks sandbox sessions for MCP server
|
|
4
|
+
*/
|
|
5
|
+
// Generate unique session ID
|
|
6
|
+
function generateSessionId() {
|
|
7
|
+
return `td-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Session Manager - handles session state for MCP server
|
|
11
|
+
*/
|
|
12
|
+
export class SessionManager {
|
|
13
|
+
sessions = new Map();
|
|
14
|
+
currentSessionId = null;
|
|
15
|
+
/**
|
|
16
|
+
* Create a new session
|
|
17
|
+
*/
|
|
18
|
+
createSession(options) {
|
|
19
|
+
const sessionId = generateSessionId();
|
|
20
|
+
const keepAlive = options.keepAlive ?? 300000; // Default 5 minutes
|
|
21
|
+
const session = {
|
|
22
|
+
sessionId,
|
|
23
|
+
sandboxId: options.sandboxId ?? null,
|
|
24
|
+
status: "initializing",
|
|
25
|
+
os: options.os ?? "linux",
|
|
26
|
+
resolution: options.resolution ?? "1366x768",
|
|
27
|
+
createdAt: Date.now(),
|
|
28
|
+
expiresAt: Date.now() + keepAlive,
|
|
29
|
+
keepAlive,
|
|
30
|
+
testFile: options.testFile ?? null,
|
|
31
|
+
lastScreenshot: null,
|
|
32
|
+
};
|
|
33
|
+
this.sessions.set(sessionId, session);
|
|
34
|
+
this.currentSessionId = sessionId;
|
|
35
|
+
return session;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the current active session
|
|
39
|
+
*/
|
|
40
|
+
getCurrentSession() {
|
|
41
|
+
if (!this.currentSessionId)
|
|
42
|
+
return null;
|
|
43
|
+
return this.sessions.get(this.currentSessionId) ?? null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get a session by ID
|
|
47
|
+
*/
|
|
48
|
+
getSession(sessionId) {
|
|
49
|
+
return this.sessions.get(sessionId) ?? null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update session state
|
|
53
|
+
*/
|
|
54
|
+
updateSession(sessionId, updates) {
|
|
55
|
+
const session = this.sessions.get(sessionId);
|
|
56
|
+
if (!session)
|
|
57
|
+
return null;
|
|
58
|
+
const updated = { ...session, ...updates };
|
|
59
|
+
this.sessions.set(sessionId, updated);
|
|
60
|
+
return updated;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Mark session as active with sandbox ID
|
|
64
|
+
*/
|
|
65
|
+
activateSession(sessionId, sandboxId) {
|
|
66
|
+
return this.updateSession(sessionId, {
|
|
67
|
+
sandboxId,
|
|
68
|
+
status: "active",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extend session expiry time by adding additional milliseconds
|
|
73
|
+
*/
|
|
74
|
+
extendSession(sessionId, additionalMs) {
|
|
75
|
+
const session = this.sessions.get(sessionId);
|
|
76
|
+
if (!session)
|
|
77
|
+
return null;
|
|
78
|
+
return this.updateSession(sessionId, {
|
|
79
|
+
expiresAt: session.expiresAt + additionalMs,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Refresh session expiry to reset the keepAlive timer from now
|
|
84
|
+
* Called on each command to keep session alive during active use
|
|
85
|
+
*/
|
|
86
|
+
refreshSession(sessionId) {
|
|
87
|
+
const session = this.sessions.get(sessionId);
|
|
88
|
+
if (!session)
|
|
89
|
+
return null;
|
|
90
|
+
return this.updateSession(sessionId, {
|
|
91
|
+
expiresAt: Date.now() + session.keepAlive,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if session is still valid
|
|
96
|
+
*/
|
|
97
|
+
isSessionValid(sessionId) {
|
|
98
|
+
const session = this.sessions.get(sessionId);
|
|
99
|
+
if (!session)
|
|
100
|
+
return false;
|
|
101
|
+
if (session.status === "expired" || session.status === "error")
|
|
102
|
+
return false;
|
|
103
|
+
if (Date.now() > session.expiresAt) {
|
|
104
|
+
this.updateSession(sessionId, { status: "expired" });
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get time remaining until session expires
|
|
111
|
+
*/
|
|
112
|
+
getTimeRemaining(sessionId) {
|
|
113
|
+
const session = this.sessions.get(sessionId);
|
|
114
|
+
if (!session)
|
|
115
|
+
return 0;
|
|
116
|
+
return Math.max(0, session.expiresAt - Date.now());
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Mark session as expired/ended
|
|
120
|
+
*/
|
|
121
|
+
endSession(sessionId) {
|
|
122
|
+
this.updateSession(sessionId, { status: "expired" });
|
|
123
|
+
if (this.currentSessionId === sessionId) {
|
|
124
|
+
this.currentSessionId = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Delete a session
|
|
129
|
+
*/
|
|
130
|
+
deleteSession(sessionId) {
|
|
131
|
+
if (this.currentSessionId === sessionId) {
|
|
132
|
+
this.currentSessionId = null;
|
|
133
|
+
}
|
|
134
|
+
return this.sessions.delete(sessionId);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get session summary for status reporting
|
|
138
|
+
*/
|
|
139
|
+
getSessionSummary(sessionId) {
|
|
140
|
+
const session = this.sessions.get(sessionId);
|
|
141
|
+
if (!session)
|
|
142
|
+
return null;
|
|
143
|
+
return {
|
|
144
|
+
sessionId: session.sessionId,
|
|
145
|
+
status: session.status,
|
|
146
|
+
sandboxId: session.sandboxId,
|
|
147
|
+
timeRemaining: this.getTimeRemaining(sessionId),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Singleton instance
|
|
152
|
+
export const sessionManager = new SessionManager();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testdriverai",
|
|
3
|
-
"version": "7.2.
|
|
3
|
+
"version": "7.2.69",
|
|
4
4
|
"description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
|
|
5
5
|
"main": "sdk.js",
|
|
6
6
|
"types": "sdk.d.ts",
|
|
@@ -30,16 +30,18 @@
|
|
|
30
30
|
"./presets": "./lib/presets/index.mjs"
|
|
31
31
|
},
|
|
32
32
|
"bin": {
|
|
33
|
-
"testdriverai": "bin/testdriverai.js"
|
|
33
|
+
"testdriverai": "bin/testdriverai.js",
|
|
34
|
+
"testdriverai-mcp": "mcp-server/dist/server.js"
|
|
34
35
|
},
|
|
35
36
|
"scripts": {
|
|
36
37
|
"start": "node bin/testdriverai.js",
|
|
37
38
|
"dev": "DEV=true node bin/testdriverai.js",
|
|
38
39
|
"debug": "DEV=true VERBOSE=true node bin/testdriverai.js",
|
|
39
|
-
"docs": "cd docs && npx mint@latest dev",
|
|
40
|
+
"docs": "npm run docs:skills && cd docs && npx mint@latest dev",
|
|
40
41
|
"docs:dev": "cd docs && npx mint dev",
|
|
41
|
-
"docs:build": "cd docs && npx mint@latest build",
|
|
42
|
+
"docs:build": "npm run docs:skills && cd docs && npx mint@latest build",
|
|
42
43
|
"docs:links": "node docs/_scripts/link-replacer.js",
|
|
44
|
+
"docs:skills": "node docs/_scripts/generate-skills.js",
|
|
43
45
|
"bundle": "node build.mjs",
|
|
44
46
|
"test": "mocha test/*",
|
|
45
47
|
"test:sdk": "vitest run",
|
|
@@ -58,11 +60,15 @@
|
|
|
58
60
|
"test-assert": "node index.js run --path=testdriver/acceptance/assert.yaml",
|
|
59
61
|
"generate-report": "junit-viewer --results=out.xml --save=report.html",
|
|
60
62
|
"serve-report": "npx http-server . -p 8080 -o report.html",
|
|
61
|
-
"report": "npm run generate-report && npm run serve-report"
|
|
63
|
+
"report": "npm run generate-report && npm run serve-report",
|
|
64
|
+
"generate:skills": "node scripts/generate-skills.js",
|
|
65
|
+
"prepack": "cd mcp-server && npm ci && npm run build"
|
|
62
66
|
},
|
|
63
67
|
"author": "",
|
|
64
68
|
"license": "ISC",
|
|
65
69
|
"dependencies": {
|
|
70
|
+
"@modelcontextprotocol/ext-apps": "^1.0.0",
|
|
71
|
+
"@modelcontextprotocol/sdk": "^1.24.0",
|
|
66
72
|
"@npmcli/redact": "^3.2.2",
|
|
67
73
|
"@oclif/core": "^4.5.0",
|
|
68
74
|
"@oclif/plugin-commands": "^4.1.28",
|
|
@@ -96,7 +102,8 @@
|
|
|
96
102
|
"tmp": "^0.2.3",
|
|
97
103
|
"winston": "^3.13.0",
|
|
98
104
|
"winston-transport": "^4.9.0",
|
|
99
|
-
"ws": "^8.18.1"
|
|
105
|
+
"ws": "^8.18.1",
|
|
106
|
+
"zod": "^3.24.0"
|
|
100
107
|
},
|
|
101
108
|
"overrides": {
|
|
102
109
|
"glob": "^11.0.1",
|
|
@@ -124,7 +131,8 @@
|
|
|
124
131
|
"mocha": "^10.8.2",
|
|
125
132
|
"node-addon-api": "^8.0.0",
|
|
126
133
|
"prettier": "3.3.3",
|
|
127
|
-
"
|
|
134
|
+
"testdriverai": "^7.2.60",
|
|
135
|
+
"vitest": "^4.0.18"
|
|
128
136
|
},
|
|
129
137
|
"optionalDependencies": {
|
|
130
138
|
"@esbuild/linux-x64": "^0.21.5"
|
|
@@ -137,6 +145,19 @@
|
|
|
137
145
|
"@oclif/plugin-*"
|
|
138
146
|
],
|
|
139
147
|
"topicSeparator": " ",
|
|
140
|
-
"default": "
|
|
141
|
-
}
|
|
148
|
+
"default": "init"
|
|
149
|
+
},
|
|
150
|
+
"files": [
|
|
151
|
+
"agent/",
|
|
152
|
+
"bin/",
|
|
153
|
+
"ai/skills/",
|
|
154
|
+
"ai/agents/",
|
|
155
|
+
"interfaces/",
|
|
156
|
+
"lib/",
|
|
157
|
+
"mcp-server/dist/",
|
|
158
|
+
"sdk.js",
|
|
159
|
+
"sdk.d.ts",
|
|
160
|
+
"index.js",
|
|
161
|
+
"schema.json"
|
|
162
|
+
]
|
|
142
163
|
}
|
package/sdk.d.ts
CHANGED
|
@@ -14,6 +14,13 @@ export type ScrollDirection = "up" | "down" | "left" | "right";
|
|
|
14
14
|
export type ScrollMethod = "keyboard" | "mouse";
|
|
15
15
|
export type TextMatchMethod = "ai" | "turbo";
|
|
16
16
|
export type ExecLanguage = "js" | "pwsh" | "sh";
|
|
17
|
+
/**
|
|
18
|
+
* Preview mode for live test visualization
|
|
19
|
+
* - "browser": Opens debugger in default browser (default)
|
|
20
|
+
* - "ide": Opens preview in IDE panel (VSCode, Cursor, etc.)
|
|
21
|
+
* - "none": Headless mode, no visual preview
|
|
22
|
+
*/
|
|
23
|
+
export type PreviewMode = "browser" | "ide" | "none";
|
|
17
24
|
export type KeyboardKey =
|
|
18
25
|
| "\t"
|
|
19
26
|
| "\n"
|
|
@@ -232,7 +239,17 @@ export interface TestDriverOptions {
|
|
|
232
239
|
};
|
|
233
240
|
/** Force creation of a new sandbox (default: true) */
|
|
234
241
|
newSandbox?: boolean;
|
|
235
|
-
/**
|
|
242
|
+
/**
|
|
243
|
+
* Preview mode for live test visualization (default: "browser")
|
|
244
|
+
* - "browser": Opens debugger in default browser
|
|
245
|
+
* - "ide": Opens preview in IDE panel (VSCode, Cursor, etc.)
|
|
246
|
+
* - "none": Headless mode, no visual preview
|
|
247
|
+
*/
|
|
248
|
+
preview?: PreviewMode;
|
|
249
|
+
/**
|
|
250
|
+
* @deprecated Use `preview: "none"` instead. Run in headless mode (default: false)
|
|
251
|
+
* For backward compatibility: headless: true maps to preview: "none"
|
|
252
|
+
*/
|
|
236
253
|
headless?: boolean;
|
|
237
254
|
/** Direct IP address to connect to a running sandbox instance */
|
|
238
255
|
ip?: string;
|
|
@@ -280,7 +297,17 @@ export interface ConnectOptions {
|
|
|
280
297
|
sandboxInstance?: string;
|
|
281
298
|
/** Operating system for the sandbox (default: 'linux') */
|
|
282
299
|
os?: "windows" | "linux";
|
|
283
|
-
/**
|
|
300
|
+
/**
|
|
301
|
+
* Preview mode for live test visualization (default: "browser")
|
|
302
|
+
* - "browser": Opens debugger in default browser
|
|
303
|
+
* - "ide": Opens preview in IDE panel (VSCode, Cursor, etc.)
|
|
304
|
+
* - "none": Headless mode, no visual preview
|
|
305
|
+
*/
|
|
306
|
+
preview?: PreviewMode;
|
|
307
|
+
/**
|
|
308
|
+
* @deprecated Use `preview: "none"` instead. Run in headless mode (default: false)
|
|
309
|
+
* For backward compatibility: headless: true maps to preview: "none"
|
|
310
|
+
*/
|
|
284
311
|
headless?: boolean;
|
|
285
312
|
/** Reuse recent connection if available (default: true) */
|
|
286
313
|
reuseConnection?: boolean;
|
package/sdk.js
CHANGED
|
@@ -3,6 +3,7 @@ const path = require("path");
|
|
|
3
3
|
const os = require("os");
|
|
4
4
|
const crypto = require("crypto");
|
|
5
5
|
const { formatter } = require("./sdk-log-formatter");
|
|
6
|
+
const logger = require("./agent/lib/logger");
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Get the file path of the caller (the file that called TestDriver)
|
package/.env.example
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
name: Scheduled Acceptance Tests (Linux)
|
|
2
|
-
|
|
3
|
-
permissions:
|
|
4
|
-
id-token: write
|
|
5
|
-
contents: read
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
# Every 6 hours
|
|
10
|
-
- cron: "0 */6 * * *"
|
|
11
|
-
workflow_dispatch: # Allow manual trigger
|
|
12
|
-
|
|
13
|
-
jobs:
|
|
14
|
-
test-linux:
|
|
15
|
-
runs-on: ubuntu-latest
|
|
16
|
-
|
|
17
|
-
steps:
|
|
18
|
-
- uses: actions/checkout@v4
|
|
19
|
-
|
|
20
|
-
- name: Setup Node.js
|
|
21
|
-
uses: actions/setup-node@v4
|
|
22
|
-
with:
|
|
23
|
-
node-version: "20"
|
|
24
|
-
cache: "npm"
|
|
25
|
-
|
|
26
|
-
- name: Install dependencies
|
|
27
|
-
run: npm ci
|
|
28
|
-
|
|
29
|
-
- name: Install Sentry CLI
|
|
30
|
-
run: npm install -g @sentry/cli
|
|
31
|
-
|
|
32
|
-
- name: Run Linux tests with Sentry Cron monitoring
|
|
33
|
-
run: |
|
|
34
|
-
sentry-cli monitors run testdriver-linux-acceptance -- npx vitest run examples/*.test.mjs
|
|
35
|
-
env:
|
|
36
|
-
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
|
37
|
-
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
38
|
-
TD_OS: linux
|
|
39
|
-
TWOCAPTCHA_API_KEY: ${{ secrets.TWOCAPTCHA_API_KEY }}
|
|
40
|
-
|
|
41
|
-
- name: Upload test results to Sentry Prevent
|
|
42
|
-
if: ${{ !cancelled() }}
|
|
43
|
-
uses: getsentry/prevent-action@v0
|
|
44
|
-
with:
|
|
45
|
-
token: ${{ secrets.SENTRY_PREVENT_TOKEN }}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
name: Scheduled Acceptance Tests (Windows)
|
|
2
|
-
|
|
3
|
-
permissions:
|
|
4
|
-
id-token: write
|
|
5
|
-
contents: read
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
# Every day at midnight UTC
|
|
10
|
-
- cron: "0 0 * * *"
|
|
11
|
-
workflow_dispatch: # Allow manual trigger
|
|
12
|
-
|
|
13
|
-
jobs:
|
|
14
|
-
test-windows:
|
|
15
|
-
uses: ./.github/workflows/windows-self-hosted.yaml
|
|
16
|
-
secrets:
|
|
17
|
-
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
18
|
-
TWOCAPTCHA_API_KEY: ${{ secrets.TWOCAPTCHA_API_KEY }}
|
|
19
|
-
TD_WEBSITE: ${{ secrets.TD_WEBSITE }}
|
|
20
|
-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
21
|
-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
22
|
-
|
|
23
|
-
sentry-and-publish:
|
|
24
|
-
needs: test-windows
|
|
25
|
-
runs-on: ubuntu-latest
|
|
26
|
-
if: always()
|
|
27
|
-
|
|
28
|
-
steps:
|
|
29
|
-
- name: Install Sentry CLI
|
|
30
|
-
run: npm install -g @sentry/cli
|
|
31
|
-
|
|
32
|
-
- name: Report to Sentry Cron
|
|
33
|
-
run: |
|
|
34
|
-
sentry-cli monitors run testdriver-windows-acceptance -- echo "Windows tests completed"
|
|
35
|
-
env:
|
|
36
|
-
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
|
37
|
-
|
|
38
|
-
- name: Download test results
|
|
39
|
-
uses: actions/download-artifact@v4
|
|
40
|
-
with:
|
|
41
|
-
name: test-results-windows
|
|
42
|
-
|
|
43
|
-
- name: Upload test results to Sentry Prevent
|
|
44
|
-
if: ${{ !cancelled() }}
|
|
45
|
-
uses: getsentry/prevent-action@v0
|
|
46
|
-
with:
|
|
47
|
-
token: ${{ secrets.SENTRY_PREVENT_TOKEN }}
|
|
48
|
-
|
|
49
|
-
- name: Publish Test Results
|
|
50
|
-
uses: EnricoMi/publish-unit-test-result-action@v2
|
|
51
|
-
if: always()
|
|
52
|
-
with:
|
|
53
|
-
files: test-report.junit.xml
|
|
54
|
-
check_name: Test Results (Windows Scheduled)
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
name: Acceptance Tests
|
|
2
|
-
permissions:
|
|
3
|
-
id-token: write
|
|
4
|
-
contents: write
|
|
5
|
-
pull-requests: write
|
|
6
|
-
checks: write
|
|
7
|
-
on:
|
|
8
|
-
pull_request:
|
|
9
|
-
branches: [main]
|
|
10
|
-
|
|
11
|
-
concurrency:
|
|
12
|
-
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
13
|
-
cancel-in-progress: true
|
|
14
|
-
|
|
15
|
-
jobs:
|
|
16
|
-
test-linux:
|
|
17
|
-
runs-on: ubuntu-latest
|
|
18
|
-
|
|
19
|
-
steps:
|
|
20
|
-
- uses: actions/checkout@v4
|
|
21
|
-
|
|
22
|
-
- name: Setup Node.js
|
|
23
|
-
uses: actions/setup-node@v4
|
|
24
|
-
with:
|
|
25
|
-
node-version: "20"
|
|
26
|
-
cache: "npm"
|
|
27
|
-
|
|
28
|
-
- name: Install dependencies
|
|
29
|
-
run: npm ci
|
|
30
|
-
|
|
31
|
-
- name: Run Linux tests
|
|
32
|
-
run: npx vitest run examples/*.test.mjs
|
|
33
|
-
env:
|
|
34
|
-
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
35
|
-
TWOCAPTCHA_API_KEY: ${{ secrets.TWOCAPTCHA_API_KEY }}
|
|
36
|
-
TD_OS: linux
|
|
37
|
-
|
|
38
|
-
- name: Upload test results to Sentry Prevent
|
|
39
|
-
if: ${{ !cancelled() }}
|
|
40
|
-
uses: getsentry/prevent-action@v0
|
|
41
|
-
with:
|
|
42
|
-
token: ${{ secrets.SENTRY_PREVENT_TOKEN }}
|
|
43
|
-
|
|
44
|
-
- name: Publish Test Results
|
|
45
|
-
uses: EnricoMi/publish-unit-test-result-action@v2
|
|
46
|
-
if: always()
|
|
47
|
-
with:
|
|
48
|
-
files: test-report.junit.xml
|
|
49
|
-
comment_mode: always
|
|
50
|
-
check_name: Test Results (Linux)
|
|
51
|
-
|
|
52
|
-
test-windows:
|
|
53
|
-
if: contains(github.event.pull_request.labels.*.name, 'test-windows')
|
|
54
|
-
uses: ./.github/workflows/windows-self-hosted.yaml
|
|
55
|
-
with:
|
|
56
|
-
test_pattern: "examples/*.test.mjs"
|
|
57
|
-
secrets:
|
|
58
|
-
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
59
|
-
TWOCAPTCHA_API_KEY: ${{ secrets.TWOCAPTCHA_API_KEY }}
|
|
60
|
-
TD_WEBSITE: ${{ secrets.TD_WEBSITE }}
|
|
61
|
-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
62
|
-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
63
|
-
|
|
64
|
-
publish-windows-results:
|
|
65
|
-
needs: test-windows
|
|
66
|
-
runs-on: ubuntu-latest
|
|
67
|
-
if: always() && contains(github.event.pull_request.labels.*.name, 'test-windows')
|
|
68
|
-
|
|
69
|
-
steps:
|
|
70
|
-
- name: Download test results
|
|
71
|
-
uses: actions/download-artifact@v4
|
|
72
|
-
with:
|
|
73
|
-
name: test-results-windows
|
|
74
|
-
|
|
75
|
-
- name: Upload test results to Sentry Prevent
|
|
76
|
-
if: ${{ !cancelled() }}
|
|
77
|
-
uses: getsentry/prevent-action@v0
|
|
78
|
-
with:
|
|
79
|
-
token: ${{ secrets.SENTRY_PREVENT_TOKEN }}
|
|
80
|
-
|
|
81
|
-
- name: Publish Test Results
|
|
82
|
-
uses: EnricoMi/publish-unit-test-result-action@v2
|
|
83
|
-
if: always()
|
|
84
|
-
with:
|
|
85
|
-
files: test-report.junit.xml
|
|
86
|
-
comment_mode: always
|
|
87
|
-
check_name: Test Results (Windows)
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
name: Publish
|
|
2
|
-
permissions:
|
|
3
|
-
contents: write
|
|
4
|
-
id-token: write # Required for OIDC
|
|
5
|
-
on:
|
|
6
|
-
push:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
publish:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v4
|
|
15
|
-
with:
|
|
16
|
-
fetch-depth: 0
|
|
17
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
|
18
|
-
|
|
19
|
-
- name: Setup Node.js
|
|
20
|
-
uses: actions/setup-node@v4
|
|
21
|
-
with:
|
|
22
|
-
node-version: "20"
|
|
23
|
-
registry-url: "https://registry.npmjs.org/"
|
|
24
|
-
|
|
25
|
-
- name: Configure Git
|
|
26
|
-
run: |
|
|
27
|
-
git config user.name "github-actions[bot]"
|
|
28
|
-
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
29
|
-
|
|
30
|
-
- name: Install dependencies
|
|
31
|
-
run: npm ci
|
|
32
|
-
|
|
33
|
-
- name: Bump version (patch)
|
|
34
|
-
run: npm version patch --no-git-tag-version
|
|
35
|
-
|
|
36
|
-
- name: Generate Changelog
|
|
37
|
-
run: |
|
|
38
|
-
npx conventional-changelog-cli -p angular -i CHANGELOG.md -s
|
|
39
|
-
git add CHANGELOG.md
|
|
40
|
-
|
|
41
|
-
- name: Commit and push version bump
|
|
42
|
-
run: |
|
|
43
|
-
git add package.json package-lock.json
|
|
44
|
-
VERSION=$(node -p "require('./package.json').version")
|
|
45
|
-
git commit -m "chore(release): ${VERSION}"
|
|
46
|
-
git tag "v${VERSION}"
|
|
47
|
-
git push origin main
|
|
48
|
-
git push origin "v${VERSION}"
|
|
49
|
-
echo "VERSION=${VERSION}" >> $GITHUB_ENV
|
|
50
|
-
|
|
51
|
-
- name: Create GitHub Release
|
|
52
|
-
uses: softprops/action-gh-release@v1
|
|
53
|
-
with:
|
|
54
|
-
tag_name: v${{ env.VERSION }}
|
|
55
|
-
generate_release_notes: true
|
|
56
|
-
prerelease: false
|
|
57
|
-
|
|
58
|
-
- name: Debug NPM Token
|
|
59
|
-
run: |
|
|
60
|
-
echo "NPM_TOKEN is set: ${{ secrets.NPM_TOKEN != '' }}"
|
|
61
|
-
echo "NPM_TOKEN first 4 chars: ${NPM_TOKEN:0:4}..."
|
|
62
|
-
env:
|
|
63
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
64
|
-
|
|
65
|
-
- name: Publish to npm
|
|
66
|
-
run: npm publish --tag beta
|
|
67
|
-
env:
|
|
68
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|