testeiya 0.2.1 → 0.3.9
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/LICENSE +21 -0
- package/README.md +41 -213
- package/dist/prompt/context.js +79 -0
- package/dist/prompt/context.js.map +1 -0
- package/dist/prompt/index.js +56 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/print.js +22 -0
- package/dist/prompt/print.js.map +1 -0
- package/dist/prompt/project-info.js +2 -0
- package/dist/prompt/project-info.js.map +1 -0
- package/{src/prompt/system-prompt.ts → dist/prompt/system-prompt.js} +24 -21
- package/dist/prompt/system-prompt.js.map +1 -0
- package/dist/prompt/testomatio.js +264 -0
- package/dist/prompt/testomatio.js.map +1 -0
- package/dist/prompt/tools.js +49 -0
- package/dist/prompt/tools.js.map +1 -0
- package/dist/prompt/vocab.js +8 -0
- package/dist/prompt/vocab.js.map +1 -0
- package/dist/src/args.js +72 -0
- package/dist/src/args.js.map +1 -0
- package/dist/src/cli.js +61 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/env.js +69 -0
- package/dist/src/env.js.map +1 -0
- package/dist/src/mcp-extension.js +9 -0
- package/dist/src/mcp-extension.js.map +1 -0
- package/dist/src/mcp.js +139 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/model.js +66 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/result.js +41 -0
- package/dist/src/result.js.map +1 -0
- package/dist/src/run.js +199 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/session.js +77 -0
- package/dist/src/session.js.map +1 -0
- package/dist/vendor/mcp.js +14801 -0
- package/mcp-tools.json +2967 -0
- package/package.json +29 -42
- package/prompt/context.ts +101 -0
- package/prompt/index.ts +93 -0
- package/prompt/print.ts +23 -0
- package/prompt/project-info.ts +30 -0
- package/prompt/system-prompt.ts +173 -0
- package/{src/prompt → prompt}/testomatio.ts +119 -8
- package/{src/prompt → prompt}/tools.ts +30 -8
- package/prompt/vocab.ts +7 -0
- package/{skills.lock.json → skills/skills.lock.json} +11 -7
- package/skills/skills.yaml +34 -0
- package/assets/testeiya-logo-dark.svg +0 -16
- package/assets/testeiya-logo.svg +0 -15
- package/models.catalog.json +0 -6963
- package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -120
- package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -158
- package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -91
- package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -158
- package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -90
- package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -234
- package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -110
- package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -306
- package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -352
- package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -472
- package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -350
- package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -81
- package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -206
- package/skills/playwright-best-practices-skill/LICENSE.md +0 -7
- package/skills/playwright-best-practices-skill/README.md +0 -147
- package/skills/playwright-best-practices-skill/SKILL.md +0 -303
- package/skills/playwright-best-practices-skill/advanced/authentication-flows.md +0 -360
- package/skills/playwright-best-practices-skill/advanced/authentication.md +0 -871
- package/skills/playwright-best-practices-skill/advanced/clock-mocking.md +0 -364
- package/skills/playwright-best-practices-skill/advanced/mobile-testing.md +0 -409
- package/skills/playwright-best-practices-skill/advanced/multi-context.md +0 -288
- package/skills/playwright-best-practices-skill/advanced/multi-user.md +0 -393
- package/skills/playwright-best-practices-skill/advanced/network-advanced.md +0 -452
- package/skills/playwright-best-practices-skill/advanced/third-party.md +0 -464
- package/skills/playwright-best-practices-skill/architecture/pom-vs-fixtures.md +0 -363
- package/skills/playwright-best-practices-skill/architecture/test-architecture.md +0 -369
- package/skills/playwright-best-practices-skill/architecture/when-to-mock.md +0 -383
- package/skills/playwright-best-practices-skill/browser-apis/browser-apis.md +0 -391
- package/skills/playwright-best-practices-skill/browser-apis/iframes.md +0 -403
- package/skills/playwright-best-practices-skill/browser-apis/service-workers.md +0 -504
- package/skills/playwright-best-practices-skill/browser-apis/websockets.md +0 -403
- package/skills/playwright-best-practices-skill/core/annotations.md +0 -424
- package/skills/playwright-best-practices-skill/core/assertions-waiting.md +0 -361
- package/skills/playwright-best-practices-skill/core/configuration.md +0 -452
- package/skills/playwright-best-practices-skill/core/fixtures-hooks.md +0 -417
- package/skills/playwright-best-practices-skill/core/global-setup.md +0 -434
- package/skills/playwright-best-practices-skill/core/locators.md +0 -242
- package/skills/playwright-best-practices-skill/core/page-object-model.md +0 -315
- package/skills/playwright-best-practices-skill/core/projects-dependencies.md +0 -453
- package/skills/playwright-best-practices-skill/core/test-data.md +0 -492
- package/skills/playwright-best-practices-skill/core/test-suite-structure.md +0 -361
- package/skills/playwright-best-practices-skill/core/test-tags.md +0 -298
- package/skills/playwright-best-practices-skill/debugging/console-errors.md +0 -420
- package/skills/playwright-best-practices-skill/debugging/debugging.md +0 -504
- package/skills/playwright-best-practices-skill/debugging/error-testing.md +0 -360
- package/skills/playwright-best-practices-skill/debugging/flaky-tests.md +0 -496
- package/skills/playwright-best-practices-skill/frameworks/angular.md +0 -530
- package/skills/playwright-best-practices-skill/frameworks/nextjs.md +0 -469
- package/skills/playwright-best-practices-skill/frameworks/react.md +0 -531
- package/skills/playwright-best-practices-skill/frameworks/vue.md +0 -574
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/ci-cd.md +0 -468
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/docker.md +0 -283
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/github-actions.md +0 -546
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/gitlab.md +0 -397
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/other-providers.md +0 -521
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/parallel-sharding.md +0 -371
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/performance.md +0 -453
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/reporting.md +0 -424
- package/skills/playwright-best-practices-skill/infrastructure-ci-cd/test-coverage.md +0 -497
- package/skills/playwright-best-practices-skill/testing-patterns/accessibility.md +0 -359
- package/skills/playwright-best-practices-skill/testing-patterns/api-testing.md +0 -719
- package/skills/playwright-best-practices-skill/testing-patterns/browser-extensions.md +0 -506
- package/skills/playwright-best-practices-skill/testing-patterns/canvas-webgl.md +0 -493
- package/skills/playwright-best-practices-skill/testing-patterns/component-testing.md +0 -500
- package/skills/playwright-best-practices-skill/testing-patterns/drag-drop.md +0 -576
- package/skills/playwright-best-practices-skill/testing-patterns/electron.md +0 -509
- package/skills/playwright-best-practices-skill/testing-patterns/file-operations.md +0 -377
- package/skills/playwright-best-practices-skill/testing-patterns/file-upload-download.md +0 -562
- package/skills/playwright-best-practices-skill/testing-patterns/forms-validation.md +0 -561
- package/skills/playwright-best-practices-skill/testing-patterns/graphql-testing.md +0 -331
- package/skills/playwright-best-practices-skill/testing-patterns/i18n.md +0 -508
- package/skills/playwright-best-practices-skill/testing-patterns/performance-testing.md +0 -476
- package/skills/playwright-best-practices-skill/testing-patterns/security-testing.md +0 -430
- package/skills/playwright-best-practices-skill/testing-patterns/visual-regression.md +0 -634
- package/skills/playwright-cli/SKILL.md +0 -420
- package/skills/playwright-cli/references/element-attributes.md +0 -23
- package/skills/playwright-cli/references/playwright-tests.md +0 -39
- package/skills/playwright-cli/references/request-mocking.md +0 -87
- package/skills/playwright-cli/references/running-code.md +0 -241
- package/skills/playwright-cli/references/session-management.md +0 -225
- package/skills/playwright-cli/references/storage-state.md +0 -275
- package/skills/playwright-cli/references/test-generation.md +0 -433
- package/skills/playwright-cli/references/tracing.md +0 -139
- package/skills/playwright-cli/references/video-recording.md +0 -143
- package/skills/testeiya/README.md +0 -29
- package/skills/testeiya/answer-formatting/SKILL.md +0 -30
- package/skills/testeiya/check-cucumber/SKILL.md +0 -200
- package/skills/testeiya/check-tests/SKILL.md +0 -260
- package/skills/testeiya/manual-run-assistant/SKILL.md +0 -61
- package/skills/testeiya/testomatio-docs/INDEX.md +0 -175
- package/skills/testeiya/testomatio-docs/SKILL.md +0 -102
- package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-agents.md +0 -144
- package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-powered-features.md +0 -531
- package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-requirements.md +0 -437
- package/skills/testeiya/testomatio-docs/docs/advanced/api-access/index.md +0 -191
- package/skills/testeiya/testomatio-docs/docs/advanced/branches-folder/index.md +0 -277
- package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-demos.mdx +0 -39
- package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-on-suite-and-test-level.md +0 -122
- package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/what-is-bulk-edit.md +0 -170
- package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/branches.md +0 -53
- package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/index.mdx +0 -98
- package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/jira-issue.md +0 -151
- package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/runs-and-reports.md +0 -377
- package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/work-in-jira.md +0 -267
- package/skills/testeiya/testomatio-docs/docs/advanced/living-doc/index.md +0 -138
- package/skills/testeiya/testomatio-docs/docs/advanced/milestones/index.md +0 -220
- package/skills/testeiya/testomatio-docs/docs/advanced/shortcuts/index.md +0 -48
- package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/labels-and-custom-fields.md +0 -201
- package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags-or-labels.md +0 -94
- package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags.md +0 -243
- package/skills/testeiya/testomatio-docs/docs/advanced/test-artifacts/index.md +0 -135
- package/skills/testeiya/testomatio-docs/docs/advanced/tql/index.md +0 -394
- package/skills/testeiya/testomatio-docs/docs/getting-started/index.md +0 -290
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/azure.md +0 -96
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bamboo.md +0 -94
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bitbucket.md +0 -106
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/circle.md +0 -115
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/github.md +0 -120
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/gitlab.md +0 -88
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/index.mdx +0 -151
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/jenkins.md +0 -121
- package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/teamcity.md +0 -96
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/azure.md +0 -31
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/clickup.md +0 -54
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/confluence.md +0 -34
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/github.md +0 -31
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/gitlab.md +0 -93
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/index.md +0 -131
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/jira.md +0 -164
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/linear.md +0 -29
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/shortcut.md +0 -67
- package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/youtrack.md +0 -94
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/azure-devops.md +0 -53
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/email.md +0 -71
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/jira.md +0 -52
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/ms-teams.md +0 -60
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/rules.md +0 -267
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/slack.md +0 -82
- package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/telegram.md +0 -73
- package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/index.mdx +0 -207
- package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/okta.md +0 -204
- package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/azure.md +0 -95
- package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/google.md +0 -75
- package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/index.mdx +0 -33
- package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/okta.md +0 -108
- package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/saml.md +0 -66
- package/skills/testeiya/testomatio-docs/docs/legal/compliance/gdpr.md +0 -95
- package/skills/testeiya/testomatio-docs/docs/legal/compliance/index.mdx +0 -94
- package/skills/testeiya/testomatio-docs/docs/legal/compliance/privacy.md +0 -26
- package/skills/testeiya/testomatio-docs/docs/legal/compliance/terms.md +0 -32
- package/skills/testeiya/testomatio-docs/docs/legal/security/index.mdx +0 -242
- package/skills/testeiya/testomatio-docs/docs/legal/security/jira.md +0 -140
- package/skills/testeiya/testomatio-docs/docs/legal/security/subprocessors.md +0 -76
- package/skills/testeiya/testomatio-docs/docs/management/company/administration.md +0 -363
- package/skills/testeiya/testomatio-docs/docs/management/company/audit-log.md +0 -41
- package/skills/testeiya/testomatio-docs/docs/management/company/plan-features-comparison.md +0 -240
- package/skills/testeiya/testomatio-docs/docs/management/company/subscriptions.md +0 -326
- package/skills/testeiya/testomatio-docs/docs/management/company/trials.md +0 -75
- package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/accountant.md +0 -49
- package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/index.mdx +0 -285
- package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/read-only-user.md +0 -67
- package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/teams.md +0 -138
- package/skills/testeiya/testomatio-docs/docs/management/project/settings.md +0 -87
- package/skills/testeiya/testomatio-docs/docs/management/project/templates.md +0 -546
- package/skills/testeiya/testomatio-docs/docs/project/analytics/index.md +0 -326
- package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/classical-tests-markdown-format.md +0 -386
- package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/download-manual-tests-as-files.md +0 -378
- package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-obsidian.md +0 -112
- package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-spreadsheet.md +0 -127
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/auto-import.md +0 -63
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Allure-TestOps.md +0 -49
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-QTest.md +0 -41
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Qase.md +0 -39
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Zephyr.md +0 -37
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-csv-xlsx.md +0 -117
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-cucumber.md +0 -93
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-qmetry.md +0 -44
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-source-code.md +0 -117
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testcaselabs.md +0 -44
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testmo.md +0 -47
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testrail.md +0 -82
- package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-xray.md +0 -55
- package/skills/testeiya/testomatio-docs/docs/project/plans/index.md +0 -334
- package/skills/testeiya/testomatio-docs/docs/project/pulse/index.md +0 -104
- package/skills/testeiya/testomatio-docs/docs/project/runs/archive-runs-and-groups.md +0 -176
- package/skills/testeiya/testomatio-docs/docs/project/runs/custom-statuses.md +0 -195
- package/skills/testeiya/testomatio-docs/docs/project/runs/environments.md +0 -203
- package/skills/testeiya/testomatio-docs/docs/project/runs/managing-runs.md +0 -455
- package/skills/testeiya/testomatio-docs/docs/project/runs/merge-strategies.md +0 -137
- package/skills/testeiya/testomatio-docs/docs/project/runs/reports.md +0 -329
- package/skills/testeiya/testomatio-docs/docs/project/runs/rungroups.md +0 -342
- package/skills/testeiya/testomatio-docs/docs/project/runs/running-automated-tests.md +0 -256
- package/skills/testeiya/testomatio-docs/docs/project/runs/running-manual-and-automated-tests.md +0 -331
- package/skills/testeiya/testomatio-docs/docs/project/runs/running-tests-manually.md +0 -633
- package/skills/testeiya/testomatio-docs/docs/project/runs/temporary-tests-notes.md +0 -223
- package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/snippets.md +0 -68
- package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/steps.md +0 -181
- package/skills/testeiya/testomatio-docs/docs/project/tests/bdd-test-case-editor.md +0 -98
- package/skills/testeiya/testomatio-docs/docs/project/tests/classical-test-case-editor.md +0 -354
- package/skills/testeiya/testomatio-docs/docs/project/tests/classical-vs-bdd.md +0 -169
- package/skills/testeiya/testomatio-docs/docs/project/tests/copy-and-move-your-tests.md +0 -156
- package/skills/testeiya/testomatio-docs/docs/project/tests/other-features-for-test-case-design.md +0 -412
- package/skills/testeiya/testomatio-docs/docs/project/tests/test-case-creation-and-editing.md +0 -527
- package/skills/testeiya/testomatio-docs/docs/support/index.md +0 -75
- package/skills/testeiya/testomatio-docs/docs/test-reporting/artifacts.md +0 -388
- package/skills/testeiya/testomatio-docs/docs/test-reporting/cli.md +0 -215
- package/skills/testeiya/testomatio-docs/docs/test-reporting/configuration.md +0 -247
- package/skills/testeiya/testomatio-docs/docs/test-reporting/frameworks.md +0 -490
- package/skills/testeiya/testomatio-docs/docs/test-reporting/functions.md +0 -144
- package/skills/testeiya/testomatio-docs/docs/test-reporting/index.mdx +0 -48
- package/skills/testeiya/testomatio-docs/docs/test-reporting/junit.md +0 -248
- package/skills/testeiya/testomatio-docs/docs/test-reporting/logger.md +0 -138
- package/skills/testeiya/testomatio-docs/docs/test-reporting/php.md +0 -77
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/bitbucket.md +0 -72
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/csv.md +0 -23
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/debug.md +0 -18
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/github.md +0 -63
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/gitlab.md +0 -29
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/html.md +0 -80
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/index.mdx +0 -57
- package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/testomatio.md +0 -331
- package/skills/testeiya/testomatio-docs/docs/test-reporting/python.md +0 -229
- package/skills/testeiya/testomatio-docs/docs/test-reporting/workflows.md +0 -325
- package/skills/testeiya/testomatio-docs/docs/tutorials/Interacting-via-API.md +0 -159
- package/skills/testeiya/testomatio-docs/docs/tutorials/Manual-Testing-Classic.md +0 -164
- package/skills/testeiya/testomatio-docs/docs/tutorials/Set-Up-Read-Only-Access.md +0 -85
- package/skills/testeiya/testomatio-docs/docs/tutorials/Using-AI-in-Testing.md +0 -163
- package/skills/testeiya/testomatio-docs/docs/tutorials/Working-with-Jira.md +0 -125
- package/skills/testeiya/testomatio-docs/docs/tutorials/java.md +0 -478
- package/skills/testeiya/testomatio-docs/docs/tutorials/playwright.md +0 -207
- package/skills/testeiya/testomatio-docs/docs/tutorials/webdriver.md +0 -218
- package/skills/testeiya/testomatio-docs/docs.lock.json +0 -6
- package/skills/testeiya/testomatio-reporter/SKILL.md +0 -307
- package/skills/testomatio/explorbot/explorbot-fundamentals/SKILL.md +0 -88
- package/skills/testomatio/explorbot/explorbot-plan/SKILL.md +0 -95
- package/skills/testomatio/explorbot/explorbot-setup/SKILL.md +0 -334
- package/skills/testomatio/test-automation/automate-manual-test-cases/CLAUDE.md +0 -56
- package/skills/testomatio/test-automation/automate-manual-test-cases/SKILL.md +0 -242
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -182
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -22
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -90
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -53
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -52
- package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/SKILL.md +0 -107
- package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -113
- package/skills/testomatio/test-automation/qa-automation-test-consolidation/SKILL.md +0 -29
- package/skills/testomatio/test-automation/run-tests-with-testomatio-reporter/SKILL.md +0 -151
- package/skills/testomatio/test-automation/setup-pr-testing/SKILL.md +0 -199
- package/skills/testomatio/test-automation/testomat-allure-adapter/SKILL.md +0 -289
- package/skills/testomatio/test-management/detect-duplicate-test-cases/SKILL.md +0 -86
- package/skills/testomatio/test-management/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -54
- package/skills/testomatio/test-management/improve-test-cases/SKILL.md +0 -114
- package/skills/testomatio/test-management/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -66
- package/skills/testomatio/test-management/pull-request-diff-analyzer/SKILL.md +0 -141
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/SKILL.md +0 -354
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -82
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -37
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -118
- package/skills/testomatio/test-management/qa-pr-requirements-analyzer/SKILL.md +0 -149
- package/skills/testomatio/test-management/qa-pr-requirements-analyzer/references/summary-example.md +0 -54
- package/skills/testomatio/test-management/qa-requirement-reviewer/SKILL.md +0 -126
- package/skills/testomatio/test-management/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -128
- package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +0 -174
- package/skills/testomatio/test-management/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -138
- package/skills/testomatio/test-management/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -65
- package/skills/testomatio/test-management/qa-test-code-coverage/scripts/check-coverage.mjs +0 -40
- package/skills/testomatio/test-management/qa-thinking/SKILL.md +0 -36
- package/skills/testomatio/test-management/qa-write-test-cases/SKILL.md +0 -267
- package/skills/testomatio/test-management/qa-write-test-cases/references/test-case-format.md +0 -387
- package/skills/testomatio/test-management/qa-write-test-cases/references/testomat-tms-guide.md +0 -72
- package/skills/testomatio/test-management/qa-write-test-cases/references/writing-rule.md +0 -159
- package/skills/testomatio/test-management/scan-automation-project/SKILL.md +0 -152
- package/skills/testomatio/test-management/sync-test-cases-with-tms/SKILL.md +0 -107
- package/skills/testomatio/test-management/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -140
- package/skills/testomatio/test-management/testomatio-mcp/SKILL.md +0 -182
- package/skills/testomatio/test-management/testomatio-mcp/references/MCP_SETUP.md +0 -169
- package/skills.yaml +0 -21
- package/src/ai-debug.ts +0 -188
- package/src/api/agent-get.ts +0 -22
- package/src/api/agent-start.ts +0 -384
- package/src/api/client-log.ts +0 -29
- package/src/api/context.ts +0 -332
- package/src/api/debug-layout.ts +0 -47
- package/src/api/debug-report.ts +0 -29
- package/src/api/debug-snapshot.ts +0 -30
- package/src/api/debug-stream.ts +0 -52
- package/src/api/files-delete.ts +0 -184
- package/src/api/files-read.ts +0 -41
- package/src/api/files-rename.ts +0 -99
- package/src/api/files-tree.ts +0 -292
- package/src/api/files-write.ts +0 -41
- package/src/api/mcp.ts +0 -603
- package/src/api/memory.ts +0 -69
- package/src/api/open-external.ts +0 -39
- package/src/api/playwright-cli.ts +0 -606
- package/src/api/providers.ts +0 -457
- package/src/api/read-env-token.ts +0 -33
- package/src/api/sessions.ts +0 -79
- package/src/api/settings.ts +0 -120
- package/src/api/skills.ts +0 -58
- package/src/api/testomatio-attachment.ts +0 -89
- package/src/api/testomatio-auth.ts +0 -284
- package/src/api/testomatio-proxy.ts +0 -197
- package/src/api/testomatio-run-stats.ts +0 -81
- package/src/api/testomatio-target.ts +0 -225
- package/src/api/testomatio-transcription.ts +0 -82
- package/src/api/workspace-search.ts +0 -96
- package/src/api/workspace-sync.ts +0 -151
- package/src/api/workspace.ts +0 -165
- package/src/app-server.ts +0 -556
- package/src/bridge.ts +0 -251
- package/src/check-tests.ts +0 -156
- package/src/cli.ts +0 -17
- package/src/commands.ts +0 -244
- package/src/config.ts +0 -183
- package/src/connection.ts +0 -658
- package/src/context-store.ts +0 -265
- package/src/debug-bus.ts +0 -405
- package/src/extensions/tool-gate.ts +0 -220
- package/src/extensions/webui/ask-channel.ts +0 -52
- package/src/extensions/webui/index.ts +0 -184
- package/src/extensions/webui/tools/ask-question.ts +0 -88
- package/src/extensions/webui/tools/query-result.ts +0 -79
- package/src/extensions/webui/tools/render-chart.ts +0 -53
- package/src/extensions/webui/tools/render-item.ts +0 -61
- package/src/extensions/webui/tools/render-list.ts +0 -170
- package/src/extensions/webui/tools/render-result.ts +0 -85
- package/src/extensions/webui/tools/render-tree.ts +0 -71
- package/src/extensions/webui/tools/ui-widget.ts +0 -54
- package/src/extensions/webui/tools/widget-result.ts +0 -13
- package/src/extensions/webui/widget-channel.ts +0 -50
- package/src/file-log.ts +0 -196
- package/src/git-tracked.ts +0 -68
- package/src/gitignore.ts +0 -53
- package/src/json-store.ts +0 -43
- package/src/load-env.ts +0 -70
- package/src/loader-style.ts +0 -96
- package/src/main.ts +0 -140
- package/src/mcp-catalog.ts +0 -96
- package/src/models-catalog.ts +0 -72
- package/src/permissions.ts +0 -120
- package/src/project-dir.ts +0 -189
- package/src/project-info.ts +0 -108
- package/src/prompt/app-ui.ts +0 -59
- package/src/prompt/browser.ts +0 -27
- package/src/prompt/index.ts +0 -62
- package/src/server-info.ts +0 -62
- package/src/session-factory.ts +0 -442
- package/src/session-store.ts +0 -115
- package/src/shell-env.ts +0 -45
- package/src/skills.ts +0 -163
- package/src/sync-snapshot.ts +0 -140
- package/src/telemetry.ts +0 -239
- package/src/testomatio-auth.ts +0 -299
- package/src/testomatio.ts +0 -98
- package/src/theme.ts +0 -30
- package/src/user-env.ts +0 -94
- package/src/welcome.ts +0 -194
- package/src/workspace/safe-path.ts +0 -85
- package/src/workspace/test-md.ts +0 -70
- package/src/workspace-model.ts +0 -440
- package/testeiya.config.json +0 -14
package/src/mcp-catalog.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Predefined MCP services Testeiya can install with one click.
|
|
3
|
-
*
|
|
4
|
-
* This is the backend source of truth for the *config* that gets written into a
|
|
5
|
-
* session's `mcp.all.json` / `mcp.json`. Display concerns (logos, blurbs) live
|
|
6
|
-
* on the frontend in `lib/mcp-services.ts`, keyed by the same `id`.
|
|
7
|
-
*
|
|
8
|
-
* All four predefined services are remote OAuth servers — the user clicks
|
|
9
|
-
* "Add" and the pi-coding-agent SDK runs the browser OAuth flow on first
|
|
10
|
-
* connect, so no API keys are collected. A service that *does* need a secret is
|
|
11
|
-
* modeled by adding a `secrets` array: the add flow collects each value and the
|
|
12
|
-
* backend stores it in the entry's `env` / `headers` (never returned to the UI).
|
|
13
|
-
*
|
|
14
|
-
* NOTE: the on-disk transport field the SDK reads is `type` (not `transport`);
|
|
15
|
-
* `api/mcp.ts` translates `transport` → `type` when serializing.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
export type McpTransport = "http" | "sse" | "stdio";
|
|
19
|
-
|
|
20
|
-
export interface CatalogSecret {
|
|
21
|
-
/** Env var the server config references (e.g. via `${NAME}`). */
|
|
22
|
-
env: string;
|
|
23
|
-
/** UI label shown above the input. */
|
|
24
|
-
label: string;
|
|
25
|
-
/** Optional input placeholder. */
|
|
26
|
-
placeholder?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface CatalogService {
|
|
30
|
-
/** Stable key; also used as the MCP server name written to disk. */
|
|
31
|
-
id: string;
|
|
32
|
-
/** Human-readable name. */
|
|
33
|
-
label: string;
|
|
34
|
-
transport: McpTransport;
|
|
35
|
-
// Remote transport (http / sse):
|
|
36
|
-
url?: string;
|
|
37
|
-
headers?: Record<string, string>;
|
|
38
|
-
// stdio transport:
|
|
39
|
-
command?: string;
|
|
40
|
-
args?: string[];
|
|
41
|
-
env?: Record<string, string>;
|
|
42
|
-
/** Authentication model. `oauth` → SDK runs a browser flow on first connect. */
|
|
43
|
-
auth?: "oauth" | "apikey" | "none";
|
|
44
|
-
/** Secret inputs to collect before installing (only for apikey/env servers). */
|
|
45
|
-
secrets?: CatalogSecret[];
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export const MCP_CATALOG: CatalogService[] = [
|
|
49
|
-
{
|
|
50
|
-
id: "linear",
|
|
51
|
-
label: "Linear",
|
|
52
|
-
transport: "http",
|
|
53
|
-
url: "https://mcp.linear.app/mcp",
|
|
54
|
-
auth: "oauth",
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
id: "atlassian",
|
|
58
|
-
label: "Jira",
|
|
59
|
-
transport: "sse",
|
|
60
|
-
url: "https://mcp.atlassian.com/v1/sse",
|
|
61
|
-
auth: "oauth",
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
id: "figma",
|
|
65
|
-
label: "Figma",
|
|
66
|
-
transport: "http",
|
|
67
|
-
url: "https://mcp.figma.com/mcp",
|
|
68
|
-
auth: "oauth",
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
id: "miro",
|
|
72
|
-
label: "Miro",
|
|
73
|
-
transport: "http",
|
|
74
|
-
url: "https://mcp.miro.com/",
|
|
75
|
-
auth: "oauth",
|
|
76
|
-
},
|
|
77
|
-
];
|
|
78
|
-
|
|
79
|
-
export function getCatalogService(id: string): CatalogService | undefined {
|
|
80
|
-
return MCP_CATALOG.find((s) => s.id === id);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** Public descriptors safe to expose to the UI (no secret *values*). */
|
|
84
|
-
export function catalogDescriptors() {
|
|
85
|
-
return MCP_CATALOG.map((s) => ({
|
|
86
|
-
id: s.id,
|
|
87
|
-
label: s.label,
|
|
88
|
-
transport: s.transport,
|
|
89
|
-
auth: s.auth ?? "none",
|
|
90
|
-
secrets: s.secrets?.map(({ env, label, placeholder }) => ({
|
|
91
|
-
env,
|
|
92
|
-
label,
|
|
93
|
-
placeholder,
|
|
94
|
-
})),
|
|
95
|
-
}));
|
|
96
|
-
}
|
package/src/models-catalog.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { getBundledModels, type GeneratedProvider } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import { resolveModelsCatalogPath } from "./project-dir.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The vendored models catalog (`cli/models.catalog.json`), produced by
|
|
7
|
-
* `bunosh collect:models` (re-run on every release). The SDK's bundled
|
|
8
|
-
* models.json is frozen at the SDK's publish date and its registry never
|
|
9
|
-
* removes entries, so stale models linger and unauthenticated providers only
|
|
10
|
-
* show the old list. The catalog fixes the *listing*: models the provider no
|
|
11
|
-
* longer serves are pruned, models newer than the SDK snapshot are added.
|
|
12
|
-
* Model *resolution* still goes through the SDK registry (live discovery in
|
|
13
|
-
* session-factory), so picking a catalog-only model works as long as the
|
|
14
|
-
* provider serves it.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
let cache: CatalogFile | null | undefined;
|
|
18
|
-
|
|
19
|
-
export function applyModelsCatalog(provider: string, models: ModelListing[]): ModelListing[] {
|
|
20
|
-
const catalog = catalogFor(provider);
|
|
21
|
-
if (!catalog) return models;
|
|
22
|
-
const bundledIds = new Set(
|
|
23
|
-
getBundledModels(provider as GeneratedProvider).map((m) => m.id)
|
|
24
|
-
);
|
|
25
|
-
return mergeModelsCatalog(models, bundledIds, catalog);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Pure merge: drop models that exist only in the SDK's stale bundled list and
|
|
30
|
-
* were pruned from the catalog (live-discovered ones are never bundled-only),
|
|
31
|
-
* then append catalog models the registry doesn't know yet.
|
|
32
|
-
*/
|
|
33
|
-
export function mergeModelsCatalog(
|
|
34
|
-
models: ModelListing[],
|
|
35
|
-
bundledIds: Set<string>,
|
|
36
|
-
catalog: Record<string, CatalogEntry>
|
|
37
|
-
): ModelListing[] {
|
|
38
|
-
const seen = new Set(models.map((m) => m.id));
|
|
39
|
-
const merged = models.filter((m) => catalog[m.id] || !bundledIds.has(m.id));
|
|
40
|
-
for (const [id, entry] of Object.entries(catalog)) {
|
|
41
|
-
if (seen.has(id)) continue;
|
|
42
|
-
merged.push({ id, name: entry.name || id });
|
|
43
|
-
}
|
|
44
|
-
return merged;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function catalogFor(provider: string): Record<string, CatalogEntry> | null {
|
|
48
|
-
if (cache === undefined) cache = readCatalogFile();
|
|
49
|
-
return cache?.providers?.[provider] ?? null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function readCatalogFile(): CatalogFile | null {
|
|
53
|
-
try {
|
|
54
|
-
return JSON.parse(readFileSync(resolveModelsCatalogPath(), "utf-8")) as CatalogFile;
|
|
55
|
-
} catch {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface ModelListing {
|
|
61
|
-
id: string;
|
|
62
|
-
name: string;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
interface CatalogEntry {
|
|
66
|
-
name?: string;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
interface CatalogFile {
|
|
70
|
-
collectedAt?: string;
|
|
71
|
-
providers?: Record<string, Record<string, CatalogEntry>>;
|
|
72
|
-
}
|
package/src/permissions.ts
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { sep } from "node:path";
|
|
2
|
-
import { WORKSPACES_DIR } from "./project-dir.js";
|
|
3
|
-
import type { TesteiyaConfig } from "./config.js";
|
|
4
|
-
|
|
5
|
-
type ExtensionFactory = (pi: any) => void;
|
|
6
|
-
|
|
7
|
-
const READ_TOOLS = ["read", "grep", "find", "ls"];
|
|
8
|
-
const WRITE_TOOLS = ["write", "edit"];
|
|
9
|
-
|
|
10
|
-
// Bash commands that are read-only and safe to auto-allow
|
|
11
|
-
const SAFE_BASH_PREFIXES = [
|
|
12
|
-
"cat ", "head ", "tail ", "less ", "more ",
|
|
13
|
-
"ls ", "ls\n", "ls",
|
|
14
|
-
"dir ", "tree ", "tree\n", "tree",
|
|
15
|
-
"find ", "grep ", "rg ", "ag ",
|
|
16
|
-
"wc ", "wc\n",
|
|
17
|
-
"file ", "stat ",
|
|
18
|
-
"pwd", "pwd\n",
|
|
19
|
-
"echo ", "printf ",
|
|
20
|
-
"git log", "git show", "git diff", "git status", "git branch", "git blame", "git rev-parse",
|
|
21
|
-
"git remote", "git tag", "git stash list",
|
|
22
|
-
"node -e", "node --eval", "npx tsc --noEmit",
|
|
23
|
-
"npm list", "npm ls", "npm view", "npm outdated",
|
|
24
|
-
"which ", "type ", "env", "printenv",
|
|
25
|
-
"date", "whoami", "hostname", "uname",
|
|
26
|
-
"jq ", "sed -n", "awk ",
|
|
27
|
-
"diff ", "cmp ",
|
|
28
|
-
"du ", "df ",
|
|
29
|
-
"curl -s", "curl --silent", "wget -q",
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
// Patterns that indicate destructive operations - always block
|
|
33
|
-
const DANGEROUS_PATTERNS = [
|
|
34
|
-
"rm ", "rm\n", "rmdir ",
|
|
35
|
-
"mv ", "cp ",
|
|
36
|
-
"> ", ">> ", "| tee ",
|
|
37
|
-
"chmod ", "chown ", "chgrp ",
|
|
38
|
-
"kill ", "pkill ",
|
|
39
|
-
"sudo ",
|
|
40
|
-
"git push", "git reset", "git checkout", "git clean", "git rebase",
|
|
41
|
-
"npm install", "npm uninstall", "npm update", "npm publish",
|
|
42
|
-
"mktemp", "mkdir ",
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
function isReadOnlyBash(command: string): boolean {
|
|
46
|
-
const trimmed = command.trim();
|
|
47
|
-
|
|
48
|
-
// Check dangerous patterns first
|
|
49
|
-
for (const pattern of DANGEROUS_PATTERNS) {
|
|
50
|
-
if (trimmed.includes(pattern)) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Check if starts with a safe prefix
|
|
56
|
-
for (const prefix of SAFE_BASH_PREFIXES) {
|
|
57
|
-
if (trimmed.startsWith(prefix)) {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Piped commands: check if first command is safe and none are dangerous
|
|
63
|
-
if (trimmed.includes("|")) {
|
|
64
|
-
const first = trimmed.split("|")[0].trim();
|
|
65
|
-
for (const prefix of SAFE_BASH_PREFIXES) {
|
|
66
|
-
if (first.startsWith(prefix)) {
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function createPermissionExtension(
|
|
76
|
-
config: TesteiyaConfig,
|
|
77
|
-
cwd: string,
|
|
78
|
-
trusted = false
|
|
79
|
-
): ExtensionFactory {
|
|
80
|
-
// Grant full access when the workspace is Testeiya-owned pulled markdown
|
|
81
|
-
// (~/.testeiya/workspaces/*) OR the user explicitly opened this folder (the
|
|
82
|
-
// folder picker, TESTEIYA_WORKSPACE, or the terminal CLI's own cwd). The
|
|
83
|
-
// read-only gating only guards folders the user did not deliberately choose.
|
|
84
|
-
const fullAccess = trusted || isManagedWorkspace(cwd);
|
|
85
|
-
return (pi) => {
|
|
86
|
-
pi.on("tool_call", async (event: any, _ctx: any) => {
|
|
87
|
-
if (fullAccess) {
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Read tools: always allow
|
|
92
|
-
if (READ_TOOLS.includes(event.toolName)) {
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Write/edit tools: block
|
|
97
|
-
if (config.permissions.blockWrites && WRITE_TOOLS.includes(event.toolName)) {
|
|
98
|
-
return { block: true, reason: "Write operations are blocked. Testeiya is in read-only mode." };
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Bash: allow read-only commands, block the rest
|
|
102
|
-
if (config.permissions.blockBash && event.toolName === "bash") {
|
|
103
|
-
const command = event.input?.command || "";
|
|
104
|
-
if (isReadOnlyBash(command)) {
|
|
105
|
-
return undefined;
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
block: true,
|
|
109
|
-
reason: `Bash command blocked (not in read-only allowlist): ${command.slice(0, 100)}`,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return undefined;
|
|
114
|
-
});
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function isManagedWorkspace(cwd: string): boolean {
|
|
119
|
-
return cwd === WORKSPACES_DIR || cwd.startsWith(WORKSPACES_DIR + sep);
|
|
120
|
-
}
|
package/src/project-dir.ts
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The per-project config directory name Testeiya uses inside a workspace.
|
|
7
|
-
*
|
|
8
|
-
* The pi-coding-agent SDK defaults this to `.omp`, but `session-factory.ts`
|
|
9
|
-
* monkey-patches `SOURCE_PATHS.native.projectDir` to this value so MCP / skills
|
|
10
|
-
* / rules discovery reads from `<cwd>/.testeiya/*`. Everything that *writes*
|
|
11
|
-
* MCP config (agent-start, the MCP settings API) must use the SAME directory or
|
|
12
|
-
* the agent won't see it. This constant is the single source of truth.
|
|
13
|
-
*/
|
|
14
|
-
export const PROJECT_DIR = ".testeiya";
|
|
15
|
-
|
|
16
|
-
/** Legacy directory used before the project dir was unified on `.testeiya`. */
|
|
17
|
-
export const LEGACY_PROJECT_DIR = ".omp";
|
|
18
|
-
|
|
19
|
-
/** Testeiya's global state directory in the user's home (`~/.testeiya`). */
|
|
20
|
-
export const HOME_DIR = join(homedir(), PROJECT_DIR);
|
|
21
|
-
|
|
22
|
-
/** Root of the managed per-project workspaces (`~/.testeiya/workspaces`). */
|
|
23
|
-
export const WORKSPACES_DIR = join(HOME_DIR, "workspaces");
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Where Testeiya caches pulled manual tests when overlaying them onto a folder
|
|
27
|
-
* that is *not* a manual-tests-only workspace (a user's code repo). Lives under
|
|
28
|
-
* the project dir so it is gitignored and never pollutes the tracked tree.
|
|
29
|
-
*/
|
|
30
|
-
export const MANUAL_TESTS_SUBDIR = "manual-tests";
|
|
31
|
-
|
|
32
|
-
/** Folder name that holds user-added custom skills. */
|
|
33
|
-
export const CUSTOM_SKILLS_SUBDIR = "skills";
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Where user-added context lands inside `.testeiya` (see context-store.ts):
|
|
37
|
-
* linked folders and cloned repos under `code/`, uploaded documents under
|
|
38
|
-
* `requirements/` — the same layout the system prompt teaches the agent.
|
|
39
|
-
*/
|
|
40
|
-
export const CONTEXT_CODE_SUBDIR = "code";
|
|
41
|
-
export const CONTEXT_REQUIREMENTS_SUBDIR = "requirements";
|
|
42
|
-
|
|
43
|
-
/** Manifest of user-added context entries (what, where from, when). */
|
|
44
|
-
export const CONTEXT_MANIFEST_FILE = "context.json";
|
|
45
|
-
|
|
46
|
-
/** Global custom-skills folder (`~/.testeiya/skills`), loaded for every session. */
|
|
47
|
-
export const CUSTOM_SKILLS_DIR = join(HOME_DIR, CUSTOM_SKILLS_SUBDIR);
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Folder name (shipped inside the CLI package / desktop bundle) that holds the
|
|
51
|
-
* skills tree organized by vendor: `<vendor>/<skill>/SKILL.md`, with an extra
|
|
52
|
-
* category level for marketplace repos (`<vendor>/<category>/<skill>/`).
|
|
53
|
-
* External vendors are written by `bunosh skills:update` from the `skills.yaml`
|
|
54
|
-
* manifest; folders it does not manage (e.g. `testeiya/`) are first-party
|
|
55
|
-
* skills authored in this repo.
|
|
56
|
-
*/
|
|
57
|
-
export const BUNDLED_SKILLS_SUBDIR = "skills";
|
|
58
|
-
|
|
59
|
-
/** The external-skills manifest file name (source of truth for `bunosh skills:update`). */
|
|
60
|
-
export const SKILLS_MANIFEST_FILE = "skills.yaml";
|
|
61
|
-
|
|
62
|
-
/** The vendored models catalog produced by `bunosh collect:models` (see models-catalog.ts). */
|
|
63
|
-
export const MODELS_CATALOG_FILE = "models.catalog.json";
|
|
64
|
-
|
|
65
|
-
/** Records which Testomat.io project a workspace represents (id + base URL). */
|
|
66
|
-
export const PROJECT_META_FILE = "testeiya.json";
|
|
67
|
-
|
|
68
|
-
/** Cached project configuration from `GET /api/v2/{id}/info` (see project-info.ts). */
|
|
69
|
-
export const PROJECT_INFO_FILE = "project-info.json";
|
|
70
|
-
|
|
71
|
-
/** Hashes of the manual-test files as of the last Testomat.io sync (pull/push). */
|
|
72
|
-
export const SYNC_SNAPSHOT_FILE = "sync-snapshot.json";
|
|
73
|
-
|
|
74
|
-
/** Absolute path to the gitignored manual-tests cache inside `cwd`. */
|
|
75
|
-
export function manualTestsCachePath(cwd: string): string {
|
|
76
|
-
return join(cwd, PROJECT_DIR, MANUAL_TESTS_SUBDIR);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** Absolute path to a workspace's per-project custom-skills folder. */
|
|
80
|
-
export function projectSkillsDir(cwd: string): string {
|
|
81
|
-
return join(cwd, PROJECT_DIR, CUSTOM_SKILLS_SUBDIR);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** Absolute path to the project-association metadata file inside `cwd`. */
|
|
85
|
-
export function projectMetaPath(cwd: string): string {
|
|
86
|
-
return join(cwd, PROJECT_DIR, PROJECT_META_FILE);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/** Absolute path to the cached project-configuration file inside `cwd`. */
|
|
90
|
-
export function projectInfoPath(cwd: string): string {
|
|
91
|
-
return join(cwd, PROJECT_DIR, PROJECT_INFO_FILE);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** Absolute path to the last-sync snapshot file inside `cwd`. */
|
|
95
|
-
export function syncSnapshotPath(cwd: string): string {
|
|
96
|
-
return join(cwd, PROJECT_DIR, SYNC_SNAPSHOT_FILE);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/** Absolute path to the user-added-context manifest inside `cwd`. */
|
|
100
|
-
export function contextManifestPath(cwd: string): string {
|
|
101
|
-
return join(cwd, PROJECT_DIR, CONTEXT_MANIFEST_FILE);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Guard files for the project dir, written idempotently whenever it exists:
|
|
106
|
-
* `.gitignore` (`*`) keeps the dir out of the user's repo history, while
|
|
107
|
-
* `.ignore` (`!*`) whitelists the contents back for the agent's search tools —
|
|
108
|
-
* their walker (ripgrep's ignore crate) honors gitignore, and a same-dir
|
|
109
|
-
* `.ignore` outranks the `.gitignore`, so pulled manual tests and added
|
|
110
|
-
* context stay searchable. Git never reads `.ignore`.
|
|
111
|
-
*
|
|
112
|
-
* The whitelist re-ignores `.git/` and `node_modules/` below it (later lines
|
|
113
|
-
* win), so cloned repos and installed tools inside the dir don't flood search
|
|
114
|
-
* results. The `.ignore` is content-synced — the dir is Testeiya's own, so a
|
|
115
|
-
* stale generation of the file is replaced, not preserved.
|
|
116
|
-
*
|
|
117
|
-
* The whitelist cannot help when the workspace's own `.gitignore` lists the
|
|
118
|
-
* project dir — the walker then skips it at the parent level and never reads
|
|
119
|
-
* the inner files. That entry is a workspace misconfiguration (redundant for
|
|
120
|
-
* git — the dir self-excludes) the system prompt forbids; the prompt's
|
|
121
|
-
* explicit-`.testeiya/`-prefix search rule still works there, because a
|
|
122
|
-
* search rooted inside the dir bypasses the parent-level skip.
|
|
123
|
-
*/
|
|
124
|
-
export function ensureProjectDirGuards(cwd: string): void {
|
|
125
|
-
const dir = join(cwd, PROJECT_DIR);
|
|
126
|
-
if (!existsSync(dir)) return;
|
|
127
|
-
const gitignore = join(dir, ".gitignore");
|
|
128
|
-
if (!existsSync(gitignore)) writeFileSync(gitignore, "*\n", "utf8");
|
|
129
|
-
const ignore = join(dir, ".ignore");
|
|
130
|
-
const ignoreContent = "!*\n.git/\nnode_modules/\n";
|
|
131
|
-
let current = "";
|
|
132
|
-
if (existsSync(ignore)) current = readFileSync(ignore, "utf8");
|
|
133
|
-
if (current !== ignoreContent) writeFileSync(ignore, ignoreContent, "utf8");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/** The home state dir used before the rename from "testclaw" to "testeiya". */
|
|
137
|
-
const LEGACY_HOME_DIR = join(homedir(), ".testclaw");
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* One-shot migration for the rename from "testclaw" to "testeiya": if the old
|
|
141
|
-
* `~/.testclaw` state dir exists and the new `~/.testeiya` does not, move it so
|
|
142
|
-
* existing sessions, auth tokens, provider keys, and pulled workspaces survive.
|
|
143
|
-
* Idempotent — a no-op once `~/.testeiya` exists; any failure is non-fatal.
|
|
144
|
-
*/
|
|
145
|
-
export function migrateLegacyHomeDir(): void {
|
|
146
|
-
if (existsSync(HOME_DIR)) return;
|
|
147
|
-
if (!existsSync(LEGACY_HOME_DIR)) return;
|
|
148
|
-
try {
|
|
149
|
-
renameSync(LEGACY_HOME_DIR, HOME_DIR);
|
|
150
|
-
} catch {
|
|
151
|
-
// ignore — a fresh ~/.testeiya is created on demand if the move fails
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Locate the bundled skills tree (`cli/skills/<vendor>/...`).
|
|
157
|
-
* Mirrors `resolveStaticDir()` in `src/bun/index.ts`: an env override, then the
|
|
158
|
-
* dev / npm-package layout (a sibling of `cli/src`), then the desktop-bundle
|
|
159
|
-
* layout where `electrobun.config` copies `cli/skills` to `skills` next to the
|
|
160
|
-
* bundled entry. Returns the last candidate as a best-effort fallback so a
|
|
161
|
-
* packaging mismatch is inspectable rather than crashing.
|
|
162
|
-
*/
|
|
163
|
-
export function resolveBundledSkillsDir(): string {
|
|
164
|
-
return probePath(BUNDLED_SKILLS_SUBDIR);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** Absolute path to the prebuilt-skills manifest (`skills.yaml`), same probe. */
|
|
168
|
-
export function resolveSkillsManifestPath(): string {
|
|
169
|
-
return probePath(SKILLS_MANIFEST_FILE);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** Absolute path to the vendored models catalog (`models.catalog.json`), same probe. */
|
|
173
|
-
export function resolveModelsCatalogPath(): string {
|
|
174
|
-
return probePath(MODELS_CATALOG_FILE);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function probePath(leaf: string): string {
|
|
178
|
-
const candidates: string[] = [];
|
|
179
|
-
if (leaf === BUNDLED_SKILLS_SUBDIR && process.env.TESTEIYA_SKILLS_DIR) {
|
|
180
|
-
candidates.push(process.env.TESTEIYA_SKILLS_DIR);
|
|
181
|
-
}
|
|
182
|
-
candidates.push(join(import.meta.dir, "..", leaf));
|
|
183
|
-
candidates.push(join(import.meta.dir, leaf));
|
|
184
|
-
candidates.push(join(import.meta.dir, "..", "..", leaf));
|
|
185
|
-
for (const candidate of candidates) {
|
|
186
|
-
if (existsSync(candidate)) return candidate;
|
|
187
|
-
}
|
|
188
|
-
return candidates[candidates.length - 1];
|
|
189
|
-
}
|
package/src/project-info.ts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
// Project configuration from `GET /api/v2/{project_id}/info` (framework,
|
|
2
|
-
// subscription, environments, labels, tags, feature flags, CI profiles).
|
|
3
|
-
//
|
|
4
|
-
// Fetched when a project is selected (agent-start) and cached in the
|
|
5
|
-
// workspace's `.testeiya/project-info.json`, so the session factory can inject
|
|
6
|
-
// a compact summary into the system prompt without a network round-trip. The
|
|
7
|
-
// full JSON stays agent-readable on disk — the prompt points at it instead of
|
|
8
|
-
// inlining every label/tag when the lists are long.
|
|
9
|
-
|
|
10
|
-
import fs from "node:fs";
|
|
11
|
-
import path from "node:path";
|
|
12
|
-
import { readJson, writeJson } from "./json-store.js";
|
|
13
|
-
import { loggedServerFetch } from "./debug-bus.js";
|
|
14
|
-
import { PROJECT_DIR, projectInfoPath } from "./project-dir.js";
|
|
15
|
-
import { resolveProjectTarget } from "./api/testomatio-target.js";
|
|
16
|
-
import type { StoredSession } from "./session-store.js";
|
|
17
|
-
|
|
18
|
-
const TTL_MS = 60 * 60 * 1000;
|
|
19
|
-
|
|
20
|
-
export async function fetchProjectInfo(
|
|
21
|
-
baseUrl: string,
|
|
22
|
-
slug: string,
|
|
23
|
-
token: string
|
|
24
|
-
): Promise<TestomatioProjectInfo | null> {
|
|
25
|
-
const url = new URL(
|
|
26
|
-
`/api/v2/${encodeURIComponent(slug)}/info`,
|
|
27
|
-
baseUrl.replace(/\/$/, "")
|
|
28
|
-
).toString();
|
|
29
|
-
try {
|
|
30
|
-
const { res, text } = await loggedServerFetch(
|
|
31
|
-
url,
|
|
32
|
-
{
|
|
33
|
-
headers: { Authorization: `Bearer ${token}`, Accept: "application/json" },
|
|
34
|
-
cache: "no-store",
|
|
35
|
-
signal: AbortSignal.timeout(10000),
|
|
36
|
-
},
|
|
37
|
-
null
|
|
38
|
-
);
|
|
39
|
-
if (!res.ok) return null;
|
|
40
|
-
const parsed = JSON.parse(text) as { data?: TestomatioProjectInfo };
|
|
41
|
-
return parsed.data ?? null;
|
|
42
|
-
} catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function readProjectInfo(cwd: string): StoredProjectInfo | null {
|
|
48
|
-
const raw = readJson<Partial<StoredProjectInfo>>(projectInfoPath(cwd), {});
|
|
49
|
-
if (!raw?.info?.project_id) return null;
|
|
50
|
-
return { fetchedAt: raw.fetchedAt ?? 0, info: raw.info };
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function writeProjectInfo(cwd: string, info: TestomatioProjectInfo): void {
|
|
54
|
-
writeJson(projectInfoPath(cwd), { fetchedAt: Date.now(), info });
|
|
55
|
-
// Keep the cache out of the user's repo history (same rule as writeProjectMeta).
|
|
56
|
-
fs.writeFileSync(path.join(cwd, PROJECT_DIR, ".gitignore"), "*\n", "utf8");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The workspace's project settings for the system prompt: the cached copy when
|
|
61
|
-
* fresh, else re-fetched via the session's resolvable credentials and re-cached.
|
|
62
|
-
* Falls back to the stale cache when no credentials resolve or the fetch fails.
|
|
63
|
-
* Multi-project sessions have no single settings set, so they resolve to null.
|
|
64
|
-
*/
|
|
65
|
-
export async function resolveProjectInfo(
|
|
66
|
-
cwd: string,
|
|
67
|
-
session: Pick<StoredSession, "tokens" | "backendUrl" | "projects">
|
|
68
|
-
): Promise<TestomatioProjectInfo | null> {
|
|
69
|
-
if ((session.projects?.length ?? 0) > 1) return null;
|
|
70
|
-
const cached = readProjectInfo(cwd);
|
|
71
|
-
if (cached && Date.now() - cached.fetchedAt < TTL_MS) return cached.info;
|
|
72
|
-
const target = await resolveProjectTarget(session, cwd);
|
|
73
|
-
if (!target) return cached?.info ?? null;
|
|
74
|
-
const info = await fetchProjectInfo(target.baseUrl, target.project, target.token);
|
|
75
|
-
if (!info) return cached?.info ?? null;
|
|
76
|
-
writeProjectInfo(cwd, info);
|
|
77
|
-
return info;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export interface TestomatioCiProfile {
|
|
81
|
-
profile_name: string;
|
|
82
|
-
service: string | null;
|
|
83
|
-
config: Record<string, unknown> | null;
|
|
84
|
-
pass_testomatio_key: boolean;
|
|
85
|
-
pass_testomatio_url: boolean;
|
|
86
|
-
pass_run_id: boolean;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export interface TestomatioProjectInfo {
|
|
90
|
-
title: string;
|
|
91
|
-
project_id: string;
|
|
92
|
-
framework: string | null;
|
|
93
|
-
language: string | null;
|
|
94
|
-
status: string | null;
|
|
95
|
-
repository_url: string | null;
|
|
96
|
-
artifacts_storage_enabled: boolean;
|
|
97
|
-
environments: string[];
|
|
98
|
-
labels: { title: string; slug: string }[];
|
|
99
|
-
tags: string[];
|
|
100
|
-
subscription: string | null;
|
|
101
|
-
features: string[];
|
|
102
|
-
ci_profiles: TestomatioCiProfile[];
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export interface StoredProjectInfo {
|
|
106
|
-
fetchedAt: number;
|
|
107
|
-
info: TestomatioProjectInfo;
|
|
108
|
-
}
|
package/src/prompt/app-ui.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import dedent from "dedent";
|
|
2
|
-
|
|
3
|
-
export const appUiGuidance = dedent`
|
|
4
|
-
# Testeiya app interface (UI tools)
|
|
5
|
-
|
|
6
|
-
You run inside the Testeiya chat app, which renders rich interactive cards.
|
|
7
|
-
|
|
8
|
-
**Data/analysis answers:** read \`skill://answer-formatting/SKILL.md\` first and follow it.
|
|
9
|
-
|
|
10
|
-
## Data-rendering tools
|
|
11
|
-
|
|
12
|
-
Each renders as a titled collapsible card — **always pass a \`title\`**.
|
|
13
|
-
|
|
14
|
-
| Tool | Use when | Data shape |
|
|
15
|
-
|---|---|---|
|
|
16
|
-
| \`render_result({call_id, title, columns?})\` | Showing a fetched \`*_list\`/\`*_search\` result — the \`call_id\` is in that result's UI notice. Renders EVERY row; \`columns\` picks fields in order; \`status\`/\`state\`/\`priority\` render as icons. | Just the call reference — no rows. |
|
|
17
|
-
| \`render_list({kind, data?, from?, transform?, title, columns?, summary?})\` | A derived or assembled list. Prefer \`from\` (call ids) + \`transform\` (pure JS fn source over those row arrays, returning the rows) — derives server-side, no re-typing rows. \`data\` for rows from elsewhere (e.g. parsed files). \`columns\` picks fields in order. | \`from\`+\`transform\`, or \`{data:[...], meta}\` / raw array. |
|
|
18
|
-
| \`render_item({kind, data, title, summary?})\` | One entity in detail — "show run X" — or right after you create/update one. Never paste an entity link instead. | Single entity object (a \`*_get\` / \`*_create\` / \`*_update\` result). |
|
|
19
|
-
| \`render_tree({nodes, title})\` | Nested suite/test hierarchy or the workspace tree. | Recursive \`nodes[]\` of \`{name, kind:'suite'|'test'|'folder'|'file', status?, children?}\`; \`status\` renders a colored mark. |
|
|
20
|
-
| \`render_chart({type, title, data, series?})\` | Any aggregate — counts, pass rate, distribution, trend, comparison. | \`type\`: bar/line/area/pie. \`data\`: \`[{name, value}]\` or per-series keys + \`series: [{key, label?}]\`. Status names auto-color green/red. |
|
|
21
|
-
|
|
22
|
-
**MCP \`*_list\` / \`*_search\` results are NOT shown to the user**, and large ones arrive as a **digest** — \`{call_id, total, fields, sample}\` — while the full rows stay cached server-side under that \`call_id\`. Show them with \`render_result\` (or \`render_list\` \`from\`+\`transform\`); compute counts/filters/grouping/joins with \`query_result({call_id, fn})\` — \`fn\` is pure JS over one row array per call id, written from the digest's \`fields\`/\`sample\`. Never re-type rows from a digest or paste them into your reply; \`title\` = filter + window ("Automated tests created since Jul 1 — 64").
|
|
23
|
-
|
|
24
|
-
**Do not repeat rendered data in your text reply** — a headline plus a few insight bullets is enough.
|
|
25
|
-
|
|
26
|
-
## Diagrams (inline fenced block)
|
|
27
|
-
|
|
28
|
-
The chat renders \`mermaid\` fenced blocks inline in your reply — flows, sequences, state machines, dependency graphs. Standard syntax:
|
|
29
|
-
|
|
30
|
-
\`\`\`\`
|
|
31
|
-
\`\`\`mermaid
|
|
32
|
-
flowchart TD
|
|
33
|
-
A[Login] --> B{Valid?}
|
|
34
|
-
B -->|Yes| C[Dashboard]
|
|
35
|
-
B -->|No| A
|
|
36
|
-
\`\`\`
|
|
37
|
-
\`\`\`\`
|
|
38
|
-
|
|
39
|
-
## Questions go through \`ask_question\`
|
|
40
|
-
|
|
41
|
-
**Any question to the user — menu, confirmation, disambiguation, pick-a-subset — is an \`ask_question\` call, never reply text ending in "?" or a list of options.** Options render as buttons; the call blocks and returns the pick. Exception: free-form answers (dates, arbitrary text) — ask in plain text.
|
|
42
|
-
|
|
43
|
-
- 1–8 options for single choice. Phrase each as the complete message the user would send, not "Option 1"; multi-line descriptions are fine.
|
|
44
|
-
- Confirmations: first option a "Yes, …", plus meaningful "No, …" variants.
|
|
45
|
-
- Don't restate the question or options in text; never write "Let me know…" / "Reply with 1, 2 or 3".
|
|
46
|
-
|
|
47
|
-
### Pick-a-subset → \`multiSelect: true\`
|
|
48
|
-
|
|
49
|
-
A list the user should choose from (proposed test cases, files to sync, runs to rerun) is a checklist, never a markdown list: \`ask_question({question, options, multiSelect: true, recommended})\`. One option per item, up to 50; \`recommended\` = 0-based indices pre-checked. You get the chosen labels back — act on only those. The checklist replaces the "Want me to generate these?" + numbered-list pattern.
|
|
50
|
-
|
|
51
|
-
## Controlling the open widget — \`ui_widget\`
|
|
52
|
-
|
|
53
|
-
When the user has a widget open, each turn carries an \`<active_widget>\` block with its id and legal actions. \`ui_widget({widget_id, action, params})\` runs them — the same controls as the user's buttons. No block → nothing to control.
|
|
54
|
-
|
|
55
|
-
- **\`get\` first:** returns the widget's full on-screen contents as JSON in one call without moving the user's view — use it before any \`mcp_*\` re-fetch for "explain what I'm looking at" asks.
|
|
56
|
-
- \`list({page})\` paginates toward \`meta.total\`; \`list({query})\` filters (\`=\`-prefixed TQL); \`open({id})\` opens an item — the user sees these happen.
|
|
57
|
-
- Actions flagged \`[destructive]\` change data — confirm with \`ask_question\` first.
|
|
58
|
-
- A \`render_item\` ack names the new card's \`widget_id\` — drive that card in the same turn (e.g. \`render_item(run)\` → \`ui_widget(start_manual_run)\`) instead of retrying the previous widget.
|
|
59
|
-
`;
|
package/src/prompt/browser.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import dedent from "dedent";
|
|
2
|
-
|
|
3
|
-
export const browserControl = dedent`
|
|
4
|
-
# Live browser testing
|
|
5
|
-
|
|
6
|
-
You can start and drive a real browser yourself via the **playwright-cli** skill (it runs the Playwright CLI through \`bash\`). When the user asks to "start a browser" or to test something in a browser, just do it — read the **playwright-cli** skill for the command set.
|
|
7
|
-
|
|
8
|
-
Use the browser to:
|
|
9
|
-
|
|
10
|
-
- **Investigate the target page before writing browser automation** — open the exact page/feature under test, walk the flow, and read the real selectors/texts/URLs from the live DOM. Automation written from reading code or manual docs alone is guesswork; verify against the running app first.
|
|
11
|
-
- **Execute manual \`*.test.md\` cases** live — perform each step and confirm the expected result before marking anything passed.
|
|
12
|
-
- **Assist the user passing manual runs** — follow the **manual-run-assistant** skill (environment prep, per-test handoff, analyzing captured signals into proposed notes).
|
|
13
|
-
- **Reproduce and investigate bugs**, capturing screenshots/snapshots as evidence.
|
|
14
|
-
- **Explore a running app** when the answer needs real behaviour rather than reading code.
|
|
15
|
-
|
|
16
|
-
## Opening a page for the user — never guess the target
|
|
17
|
-
|
|
18
|
-
When the user asks you to open a page (to pass a manual run, review a feature, reproduce a bug) and the exact target is not explicit in their request, **ask before navigating** (via \`ask_question\` when available, otherwise in text). For a manual run, "the corresponding page" means the page of the **application under test** that the run's tests cover — not the run's own page in Testomat.io; when that URL isn't stated, ask. This covers every part of the URL you would otherwise infer: the base URL / environment (production, staging, a local server from \`.env\`), the project or account, and the page path. Offer the candidates you discovered (config files, \`.env\`, project data) as options — opening a target inferred from repo fixtures lands the user on the wrong page.
|
|
19
|
-
|
|
20
|
-
## The browser window is shared with the user
|
|
21
|
-
|
|
22
|
-
The headed browser is a real window on the user's screen — they see it and can drive it themselves. When a step is better done by the user (entering credentials, judgment calls, stepping through manual test cases), offer that as an \`ask_question\` option, e.g. *"I'll do it myself — bring the browser to front"*. If chosen, raise the window with \`playwright-cli run-code 'async page => { await page.bringToFront(); }'\`, tell the user what to do, and continue once they report back.
|
|
23
|
-
|
|
24
|
-
## run-code executes in a browser sandbox, not Node
|
|
25
|
-
|
|
26
|
-
\`playwright-cli run-code\` snippets get the \`page\` object but no Node globals — \`process.env\` does not exist there. Read values in bash first and interpolate them into the snippet.
|
|
27
|
-
`;
|