testdriverai 7.2.64 → 7.2.65
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/package.json +29 -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
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
const path = require("path");
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Script to replace command references in Mintlify docs with proper links
|
|
8
|
-
*
|
|
9
|
-
* This script finds instances of command names like `hover-text`, `wait-for-text`, etc.
|
|
10
|
-
* and replaces them with proper Mintlify links to their documentation pages.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
// Get all command files from the commands directory
|
|
14
|
-
function getCommandNames() {
|
|
15
|
-
const commandsDir = path.join(__dirname, "../", "commands");
|
|
16
|
-
|
|
17
|
-
if (!fs.existsSync(commandsDir)) {
|
|
18
|
-
console.error("Commands directory not found:", commandsDir);
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const files = fs.readdirSync(commandsDir);
|
|
23
|
-
const commands = files
|
|
24
|
-
.filter((file) => file.endsWith(".mdx"))
|
|
25
|
-
.map((file) => file.replace(".mdx", ""));
|
|
26
|
-
|
|
27
|
-
console.log("Found commands:", commands);
|
|
28
|
-
return commands;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Process a single file
|
|
32
|
-
function processFile(filePath, commands) {
|
|
33
|
-
const content = fs.readFileSync(filePath, "utf-8");
|
|
34
|
-
let modified = content;
|
|
35
|
-
let changes = 0;
|
|
36
|
-
|
|
37
|
-
commands.forEach((command) => {
|
|
38
|
-
// Create regex pattern to match `command-name` but not already linked commands
|
|
39
|
-
// This pattern looks for backtick-wrapped command names that are NOT:
|
|
40
|
-
// 1. Already inside a link: [` or preceded by ]( or ](/
|
|
41
|
-
// 2. Part of an existing link structure
|
|
42
|
-
const pattern = new RegExp(
|
|
43
|
-
`(?<!\\[)\`(${command.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")})\`(?!\\]\\(|\\)\\]|\\]\\(/commands/)`,
|
|
44
|
-
"g",
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
const replacement = `[\`$1\`](/commands/$1)`;
|
|
48
|
-
const newContent = modified.replace(pattern, replacement);
|
|
49
|
-
|
|
50
|
-
if (newContent !== modified) {
|
|
51
|
-
const matchCount = (modified.match(pattern) || []).length;
|
|
52
|
-
console.log(` - Replaced ${matchCount} instances of \`${command}\``);
|
|
53
|
-
changes += matchCount;
|
|
54
|
-
modified = newContent;
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
return { content: modified, changes };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Process all .mdx files in a directory recursively
|
|
62
|
-
function processDirectory(dirPath, commands, exclude = []) {
|
|
63
|
-
const items = fs.readdirSync(dirPath);
|
|
64
|
-
let totalChanges = 0;
|
|
65
|
-
|
|
66
|
-
items.forEach((item) => {
|
|
67
|
-
const itemPath = path.join(dirPath, item);
|
|
68
|
-
const relativePath = path.relative(process.cwd(), itemPath);
|
|
69
|
-
|
|
70
|
-
// Skip excluded directories
|
|
71
|
-
if (exclude.some((ex) => relativePath.includes(ex))) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const stat = fs.statSync(itemPath);
|
|
76
|
-
|
|
77
|
-
if (stat.isDirectory()) {
|
|
78
|
-
totalChanges += processDirectory(itemPath, commands, exclude);
|
|
79
|
-
} else if (item.endsWith(".mdx")) {
|
|
80
|
-
console.log(`Processing: ${relativePath}`);
|
|
81
|
-
const result = processFile(itemPath, commands);
|
|
82
|
-
|
|
83
|
-
if (result.changes > 0) {
|
|
84
|
-
fs.writeFileSync(itemPath, result.content, "utf-8");
|
|
85
|
-
console.log(` ✅ Updated with ${result.changes} changes`);
|
|
86
|
-
totalChanges += result.changes;
|
|
87
|
-
} else {
|
|
88
|
-
console.log(` ⏭️ No changes needed`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
return totalChanges;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Main function
|
|
97
|
-
function main() {
|
|
98
|
-
console.log("🚀 Starting TestDriver AI docs link replacer...\n");
|
|
99
|
-
|
|
100
|
-
// Get command names from the commands directory
|
|
101
|
-
const commands = getCommandNames();
|
|
102
|
-
|
|
103
|
-
if (commands.length === 0) {
|
|
104
|
-
console.log("No commands found. Exiting.");
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
console.log(`\n📝 Processing documentation files...\n`);
|
|
109
|
-
|
|
110
|
-
// Process all .mdx files in the docs directory, excluding the commands directory itself
|
|
111
|
-
const docsDir = path.join(__dirname, "../");
|
|
112
|
-
const exclude = ["commands"]; // Don't modify the command docs themselves
|
|
113
|
-
|
|
114
|
-
const totalChanges = processDirectory(docsDir, commands, exclude);
|
|
115
|
-
|
|
116
|
-
console.log(`\n✨ Complete! Made ${totalChanges} total replacements.`);
|
|
117
|
-
|
|
118
|
-
if (totalChanges > 0) {
|
|
119
|
-
console.log("\n📋 Summary:");
|
|
120
|
-
console.log(
|
|
121
|
-
"- Command references like `hover-text` have been replaced with [`hover-text`](/commands/hover-text)",
|
|
122
|
-
);
|
|
123
|
-
console.log("- Only changed files that needed updates");
|
|
124
|
-
console.log(
|
|
125
|
-
"- Excluded the /commands directory to avoid self-referencing issues",
|
|
126
|
-
);
|
|
127
|
-
console.log("\nYou may want to review the changes before committing.");
|
|
128
|
-
} else {
|
|
129
|
-
console.log("\n🎉 All files are already properly linked!");
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Handle command line arguments
|
|
134
|
-
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
135
|
-
console.log(`
|
|
136
|
-
TestDriver AI Documentation Link Replacer
|
|
137
|
-
|
|
138
|
-
Usage: node link-replacer.js [options]
|
|
139
|
-
|
|
140
|
-
Options:
|
|
141
|
-
--help, -h Show this help message
|
|
142
|
-
--dry-run Show what would be changed without making actual changes (TODO)
|
|
143
|
-
|
|
144
|
-
Description:
|
|
145
|
-
This script finds command references like \`hover-text\` in your Mintlify
|
|
146
|
-
documentation and replaces them with proper links to the command reference
|
|
147
|
-
pages like [\`hover-text\`](/commands/hover-text).
|
|
148
|
-
|
|
149
|
-
The script:
|
|
150
|
-
- Scans all .mdx files in the /docs directory
|
|
151
|
-
- Excludes the /commands directory to avoid self-references
|
|
152
|
-
- Only replaces \`command-name\` patterns that aren't already linked
|
|
153
|
-
- Preserves existing links and formatting
|
|
154
|
-
`);
|
|
155
|
-
process.exit(0);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Run the script
|
|
159
|
-
try {
|
|
160
|
-
main();
|
|
161
|
-
} catch (error) {
|
|
162
|
-
console.error("❌ Error:", error.message);
|
|
163
|
-
process.exit(1);
|
|
164
|
-
}
|
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require("fs");
|
|
4
|
-
const path = require("path");
|
|
5
|
-
const OpenAI = require("openai");
|
|
6
|
-
const { glob } = require("glob");
|
|
7
|
-
|
|
8
|
-
// Configuration
|
|
9
|
-
const DOCS_DIR = path.join(__dirname, "docs");
|
|
10
|
-
const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
|
|
11
|
-
const VECTOR_STORE_NAME = "testdriverai-docs";
|
|
12
|
-
|
|
13
|
-
if (!OPENAI_API_KEY) {
|
|
14
|
-
console.error("Error: OPENAI_API_KEY environment variable is required");
|
|
15
|
-
process.exit(1);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Initialize OpenAI client
|
|
19
|
-
const openai = new OpenAI({
|
|
20
|
-
apiKey: OPENAI_API_KEY,
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Parse MDX file to extract frontmatter and content
|
|
25
|
-
*/
|
|
26
|
-
function parseMdxFile(filePath) {
|
|
27
|
-
const content = fs.readFileSync(filePath, "utf8");
|
|
28
|
-
|
|
29
|
-
// Extract frontmatter
|
|
30
|
-
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
31
|
-
|
|
32
|
-
if (!frontmatterMatch) {
|
|
33
|
-
return {
|
|
34
|
-
metadata: {},
|
|
35
|
-
content: content,
|
|
36
|
-
title: path.basename(filePath, ".mdx"),
|
|
37
|
-
filePath: path.relative(DOCS_DIR, filePath),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const frontmatter = frontmatterMatch[1];
|
|
42
|
-
const mainContent = frontmatterMatch[2];
|
|
43
|
-
|
|
44
|
-
// Parse frontmatter (simple YAML-like parsing)
|
|
45
|
-
const metadata = {};
|
|
46
|
-
frontmatter.split("\n").forEach((line) => {
|
|
47
|
-
const match = line.match(/^([^:]+):\s*"?([^"]*)"?$/);
|
|
48
|
-
if (match) {
|
|
49
|
-
metadata[match[1].trim()] = match[2].trim();
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
metadata,
|
|
55
|
-
content: mainContent,
|
|
56
|
-
title: metadata.title || path.basename(filePath, ".mdx"),
|
|
57
|
-
filePath: path.relative(DOCS_DIR, filePath),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Get all MDX files in the docs directory
|
|
63
|
-
*/
|
|
64
|
-
async function getAllMdxFiles() {
|
|
65
|
-
const pattern = path.join(DOCS_DIR, "**/*.mdx");
|
|
66
|
-
const files = await glob(pattern);
|
|
67
|
-
return files;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Create a vector store
|
|
72
|
-
*/
|
|
73
|
-
async function createVectorStore() {
|
|
74
|
-
try {
|
|
75
|
-
const vectorStore = await openai.vectorStores.create({
|
|
76
|
-
name: VECTOR_STORE_NAME,
|
|
77
|
-
expires_after: {
|
|
78
|
-
anchor: "last_active_at",
|
|
79
|
-
days: 365,
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
console.log(`✅ Created vector store: ${vectorStore.id}`);
|
|
84
|
-
return vectorStore;
|
|
85
|
-
} catch (error) {
|
|
86
|
-
console.error("Error creating vector store:", error);
|
|
87
|
-
throw error;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Upload a single file to the vector store
|
|
93
|
-
*/
|
|
94
|
-
async function uploadSingleFile(vectorStoreId, file) {
|
|
95
|
-
try {
|
|
96
|
-
console.log(`📁 Processing: ${file.filePath}`);
|
|
97
|
-
|
|
98
|
-
// Create a temporary file with processed content
|
|
99
|
-
const tempFilePath = `/tmp/testdriverai-${Date.now()}-${Math.random()}-${path.basename(file.filePath)}.txt`;
|
|
100
|
-
|
|
101
|
-
// Format the content for better vector search
|
|
102
|
-
const formattedContent = `Title: ${file.title}
|
|
103
|
-
File: ${file.filePath}
|
|
104
|
-
${file.metadata.description ? `Description: ${file.metadata.description}` : ""}
|
|
105
|
-
${file.metadata.sidebarTitle ? `Sidebar Title: ${file.metadata.sidebarTitle}` : ""}
|
|
106
|
-
|
|
107
|
-
${file.content}`;
|
|
108
|
-
|
|
109
|
-
fs.writeFileSync(tempFilePath, formattedContent);
|
|
110
|
-
|
|
111
|
-
// Upload to OpenAI and add to vector store
|
|
112
|
-
const vectorStoreFile = await openai.vectorStores.files.createAndPoll(
|
|
113
|
-
vectorStoreId,
|
|
114
|
-
{
|
|
115
|
-
file_id: (
|
|
116
|
-
await openai.files.create({
|
|
117
|
-
file: fs.createReadStream(tempFilePath),
|
|
118
|
-
purpose: "assistants",
|
|
119
|
-
})
|
|
120
|
-
).id,
|
|
121
|
-
},
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
// Clean up temp file
|
|
125
|
-
fs.unlinkSync(tempFilePath);
|
|
126
|
-
|
|
127
|
-
console.log(`✅ Uploaded: ${file.title} (${vectorStoreFile.id})`);
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
vectorStoreFileId: vectorStoreFile.id,
|
|
131
|
-
originalPath: file.filePath,
|
|
132
|
-
title: file.title,
|
|
133
|
-
};
|
|
134
|
-
} catch (error) {
|
|
135
|
-
console.error(`❌ Error uploading ${file.filePath}:`, error);
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Upload files to the vector store in parallel
|
|
142
|
-
*/
|
|
143
|
-
async function uploadFilesToVectorStore(vectorStoreId, files) {
|
|
144
|
-
console.log(`📤 Uploading ${files.length} files in parallel...`);
|
|
145
|
-
|
|
146
|
-
// Process files in parallel with a concurrency limit
|
|
147
|
-
const BATCH_SIZE = 10; // Process 10 files at a time to avoid overwhelming the API
|
|
148
|
-
const uploadedFiles = [];
|
|
149
|
-
|
|
150
|
-
for (let i = 0; i < files.length; i += BATCH_SIZE) {
|
|
151
|
-
const batch = files.slice(i, i + BATCH_SIZE);
|
|
152
|
-
console.log(
|
|
153
|
-
`Processing batch ${Math.floor(i / BATCH_SIZE) + 1}/${Math.ceil(files.length / BATCH_SIZE)} (${batch.length} files)`,
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
const batchPromises = batch.map((file) =>
|
|
157
|
-
uploadSingleFile(vectorStoreId, file),
|
|
158
|
-
);
|
|
159
|
-
const batchResults = await Promise.all(batchPromises);
|
|
160
|
-
|
|
161
|
-
// Filter out failed uploads (null results)
|
|
162
|
-
const successfulUploads = batchResults.filter((result) => result !== null);
|
|
163
|
-
uploadedFiles.push(...successfulUploads);
|
|
164
|
-
|
|
165
|
-
console.log(
|
|
166
|
-
`✅ Batch complete: ${successfulUploads.length}/${batch.length} files uploaded successfully`,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return uploadedFiles;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Wait for vector store to be ready
|
|
175
|
-
*/
|
|
176
|
-
async function waitForVectorStoreReady(vectorStoreId) {
|
|
177
|
-
console.log("⏳ Waiting for vector store to process files...");
|
|
178
|
-
|
|
179
|
-
let attempts = 0;
|
|
180
|
-
const maxAttempts = 30;
|
|
181
|
-
|
|
182
|
-
while (attempts < maxAttempts) {
|
|
183
|
-
try {
|
|
184
|
-
const vectorStore = await openai.vectorStores.retrieve(vectorStoreId);
|
|
185
|
-
|
|
186
|
-
if (vectorStore.status === "completed") {
|
|
187
|
-
console.log("✅ Vector store is ready!");
|
|
188
|
-
return vectorStore;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (vectorStore.status === "failed") {
|
|
192
|
-
throw new Error("Vector store processing failed");
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
console.log(
|
|
196
|
-
`⏳ Status: ${vectorStore.status}, Files: ${vectorStore.file_counts.completed}/${vectorStore.file_counts.total}`,
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
200
|
-
attempts++;
|
|
201
|
-
} catch (error) {
|
|
202
|
-
console.error("Error checking vector store status:", error);
|
|
203
|
-
attempts++;
|
|
204
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
throw new Error("Timeout waiting for vector store to be ready");
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Main function
|
|
213
|
-
*/
|
|
214
|
-
async function main() {
|
|
215
|
-
try {
|
|
216
|
-
console.log(
|
|
217
|
-
"🚀 Starting TestDriver.ai docs upload to OpenAI Vector Store...\n",
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
// Get all MDX files
|
|
221
|
-
console.log("📂 Finding MDX files...");
|
|
222
|
-
const mdxFilePaths = await getAllMdxFiles();
|
|
223
|
-
console.log(`Found ${mdxFilePaths.length} MDX files\n`);
|
|
224
|
-
|
|
225
|
-
// Parse all MDX files
|
|
226
|
-
console.log("📝 Parsing MDX files...");
|
|
227
|
-
const parsedFiles = mdxFilePaths.map((filePath) => parseMdxFile(filePath));
|
|
228
|
-
console.log(`Parsed ${parsedFiles.length} files\n`);
|
|
229
|
-
|
|
230
|
-
// Create vector store
|
|
231
|
-
console.log("🗂️ Creating vector store...");
|
|
232
|
-
const vectorStore = await createVectorStore();
|
|
233
|
-
console.log("");
|
|
234
|
-
|
|
235
|
-
// Upload files to vector store
|
|
236
|
-
console.log("📤 Uploading files to OpenAI Vector Store...");
|
|
237
|
-
const uploadedFiles = await uploadFilesToVectorStore(
|
|
238
|
-
vectorStore.id,
|
|
239
|
-
parsedFiles,
|
|
240
|
-
);
|
|
241
|
-
console.log("");
|
|
242
|
-
|
|
243
|
-
// Wait for processing
|
|
244
|
-
await waitForVectorStoreReady(vectorStore.id);
|
|
245
|
-
|
|
246
|
-
console.log("\n🎉 Upload complete!");
|
|
247
|
-
console.log(`Vector Store ID: ${vectorStore.id}`);
|
|
248
|
-
console.log(`Files uploaded: ${uploadedFiles.length}`);
|
|
249
|
-
console.log(
|
|
250
|
-
"\nYou can now use this vector store ID in your OpenAI Assistant or for retrieval.",
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
// Save results to file
|
|
254
|
-
const results = {
|
|
255
|
-
vectorStoreId: vectorStore.id,
|
|
256
|
-
uploadedFiles: uploadedFiles,
|
|
257
|
-
timestamp: new Date().toISOString(),
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
fs.writeFileSync(
|
|
261
|
-
path.join(__dirname, "openai-vector-store-results.json"),
|
|
262
|
-
JSON.stringify(results, null, 2),
|
|
263
|
-
);
|
|
264
|
-
|
|
265
|
-
console.log("\n📄 Results saved to openai-vector-store-results.json");
|
|
266
|
-
} catch (error) {
|
|
267
|
-
console.error("\n❌ Error:", error);
|
|
268
|
-
process.exit(1);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Run the script
|
|
273
|
-
if (require.main === module) {
|
|
274
|
-
main();
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
module.exports = {
|
|
278
|
-
main,
|
|
279
|
-
parseMdxFile,
|
|
280
|
-
getAllMdxFiles,
|
|
281
|
-
createVectorStore,
|
|
282
|
-
uploadSingleFile,
|
|
283
|
-
uploadFilesToVectorStore,
|
|
284
|
-
};
|