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/api/files-read.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import { getSession } from "../session-store.js";
|
|
3
|
-
import { safeResolveThroughLinks } from "../workspace/safe-path.js";
|
|
4
|
-
|
|
5
|
-
const MAX_BYTES = 2 * 1024 * 1024; // 2 MB
|
|
6
|
-
|
|
7
|
-
export async function filesRead(request: Request): Promise<Response> {
|
|
8
|
-
const url = new URL(request.url);
|
|
9
|
-
const sessionId = url.searchParams.get("session");
|
|
10
|
-
const relPath = url.searchParams.get("path");
|
|
11
|
-
if (!sessionId || !relPath) {
|
|
12
|
-
return Response.json({ error: "session and path required" }, { status: 400 });
|
|
13
|
-
}
|
|
14
|
-
const session = getSession(sessionId);
|
|
15
|
-
if (!session) return Response.json({ error: "Session not found" }, { status: 404 });
|
|
16
|
-
|
|
17
|
-
const abs = safeResolveThroughLinks(session.cwd, relPath);
|
|
18
|
-
if (!abs) {
|
|
19
|
-
return Response.json({ error: "path outside workspace" }, { status: 400 });
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
let stat: fs.Stats;
|
|
23
|
-
try {
|
|
24
|
-
stat = fs.statSync(abs);
|
|
25
|
-
} catch {
|
|
26
|
-
return Response.json({ error: "file not found" }, { status: 404 });
|
|
27
|
-
}
|
|
28
|
-
if (!stat.isFile()) {
|
|
29
|
-
return Response.json({ error: "not a file" }, { status: 400 });
|
|
30
|
-
}
|
|
31
|
-
if (stat.size > MAX_BYTES) {
|
|
32
|
-
return Response.json({ error: "file too large" }, { status: 413 });
|
|
33
|
-
}
|
|
34
|
-
const content = fs.readFileSync(abs, "utf8");
|
|
35
|
-
return Response.json({
|
|
36
|
-
content,
|
|
37
|
-
path: relPath,
|
|
38
|
-
size: stat.size,
|
|
39
|
-
mtime: stat.mtimeMs,
|
|
40
|
-
});
|
|
41
|
-
}
|
package/src/api/files-rename.ts
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// POST /api/files/rename { session, path, anchor?, newName }
|
|
2
|
-
//
|
|
3
|
-
// anchor present → rewrite the test's heading and PUT its new title (@T)
|
|
4
|
-
// path is a file/folder → rename the entry on disk (filenames have no remote
|
|
5
|
-
// counterpart, so these are local-only)
|
|
6
|
-
//
|
|
7
|
-
// A test rename syncs to Testomat.io when the test has an id and a project is
|
|
8
|
-
// linked; the remote PUT runs first and must succeed, else nothing changes.
|
|
9
|
-
|
|
10
|
-
import fs from "node:fs";
|
|
11
|
-
import path from "node:path";
|
|
12
|
-
import { getSession } from "../session-store.js";
|
|
13
|
-
import { safeResolve } from "../workspace/safe-path.js";
|
|
14
|
-
import { findTestBlock, blockTestId, blockHeadingLine } from "../workspace/test-md.js";
|
|
15
|
-
import { resolveProjectTarget, updateTestomatioResource } from "./testomatio-target.js";
|
|
16
|
-
|
|
17
|
-
export async function filesRename(request: Request): Promise<Response> {
|
|
18
|
-
let body: { session?: string; path?: string; anchor?: string; newName?: string };
|
|
19
|
-
try {
|
|
20
|
-
body = await request.json();
|
|
21
|
-
} catch {
|
|
22
|
-
return Response.json({ error: "invalid JSON body" }, { status: 400 });
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const sessionId = body.session;
|
|
26
|
-
const relPath = body.path;
|
|
27
|
-
const newName = body.newName?.trim();
|
|
28
|
-
if (!sessionId || !relPath || !newName) {
|
|
29
|
-
return Response.json({ error: "session, path and newName required" }, { status: 400 });
|
|
30
|
-
}
|
|
31
|
-
const session = getSession(sessionId);
|
|
32
|
-
if (!session) return Response.json({ error: "Session not found" }, { status: 404 });
|
|
33
|
-
|
|
34
|
-
const cwd = path.resolve(session.cwd);
|
|
35
|
-
const abs = safeResolve(cwd, relPath);
|
|
36
|
-
if (!abs) return Response.json({ error: "path outside workspace" }, { status: 400 });
|
|
37
|
-
if (abs === cwd) {
|
|
38
|
-
return Response.json({ error: "cannot rename the workspace root" }, { status: 400 });
|
|
39
|
-
}
|
|
40
|
-
if (!fs.existsSync(abs)) {
|
|
41
|
-
return Response.json({ error: "path not found" }, { status: 404 });
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (body.anchor) return renameTest(session, cwd, abs, relPath, body.anchor, newName);
|
|
45
|
-
return renameEntry(cwd, abs, relPath, newName);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async function renameTest(
|
|
49
|
-
session: Parameters<typeof resolveProjectTarget>[0],
|
|
50
|
-
cwd: string,
|
|
51
|
-
abs: string,
|
|
52
|
-
relPath: string,
|
|
53
|
-
anchor: string,
|
|
54
|
-
newTitle: string
|
|
55
|
-
): Promise<Response> {
|
|
56
|
-
const lines = fs.readFileSync(abs, "utf8").split("\n");
|
|
57
|
-
const block = findTestBlock(lines, anchor);
|
|
58
|
-
if (!block) {
|
|
59
|
-
return Response.json({ error: `test "${anchor}" not found in file` }, { status: 404 });
|
|
60
|
-
}
|
|
61
|
-
const headingLine = blockHeadingLine(lines, block);
|
|
62
|
-
if (headingLine < 0) {
|
|
63
|
-
return Response.json({ error: "test heading not found" }, { status: 404 });
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const id = blockTestId(lines, block);
|
|
67
|
-
if (id) {
|
|
68
|
-
const target = await resolveProjectTarget(session, cwd);
|
|
69
|
-
if (target) {
|
|
70
|
-
const ok = await updateTestomatioResource(target, "tests", id, { title: newTitle });
|
|
71
|
-
if (!ok) {
|
|
72
|
-
return Response.json(
|
|
73
|
-
{ error: `Failed to rename test ${id} on Testomat.io` },
|
|
74
|
-
{ status: 502 }
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const prefix = /^(#{1,2}\s+)/.exec(lines[headingLine])?.[1] ?? "# ";
|
|
81
|
-
lines[headingLine] = `${prefix}${newTitle}`;
|
|
82
|
-
fs.writeFileSync(abs, lines.join("\n"), "utf8");
|
|
83
|
-
return Response.json({ ok: true, path: relPath, title: newTitle });
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function renameEntry(cwd: string, abs: string, relPath: string, newName: string): Response {
|
|
87
|
-
if (newName.includes("/") || newName.includes("\\") || newName === "." || newName === "..") {
|
|
88
|
-
return Response.json({ error: "name can't contain slashes" }, { status: 400 });
|
|
89
|
-
}
|
|
90
|
-
const slash = relPath.lastIndexOf("/");
|
|
91
|
-
const newRel = slash >= 0 ? `${relPath.slice(0, slash + 1)}${newName}` : newName;
|
|
92
|
-
const newAbs = safeResolve(cwd, newRel);
|
|
93
|
-
if (!newAbs) return Response.json({ error: "path outside workspace" }, { status: 400 });
|
|
94
|
-
if (fs.existsSync(newAbs)) {
|
|
95
|
-
return Response.json({ error: `"${newName}" already exists` }, { status: 409 });
|
|
96
|
-
}
|
|
97
|
-
fs.renameSync(abs, newAbs);
|
|
98
|
-
return Response.json({ ok: true, path: newRel });
|
|
99
|
-
}
|
package/src/api/files-tree.ts
DELETED
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { getSession } from "../session-store.js";
|
|
4
|
-
import {
|
|
5
|
-
describeWorkspace,
|
|
6
|
-
VENDOR_DIRS,
|
|
7
|
-
TEST_MD_RE,
|
|
8
|
-
isAutomatedTestFile,
|
|
9
|
-
isTestConfigFile,
|
|
10
|
-
type WorkspaceInfo,
|
|
11
|
-
type WorkspaceType,
|
|
12
|
-
type WorkspaceTypeEntry,
|
|
13
|
-
} from "../workspace-model.js";
|
|
14
|
-
import { computeChangedFiles, ensureSyncBaseline, type FileStatus } from "../sync-snapshot.js";
|
|
15
|
-
import { loadGitignore, type GitignoreChain } from "../gitignore.js";
|
|
16
|
-
import { PROJECT_DIR, LEGACY_PROJECT_DIR } from "../project-dir.js";
|
|
17
|
-
import { gitCommittedFiles, gitChangedFiles, gitBranch } from "../git-tracked.js";
|
|
18
|
-
import { suiteId, suiteEmoji } from "../workspace/test-md.js";
|
|
19
|
-
|
|
20
|
-
const MAX_DEPTH = 8;
|
|
21
|
-
// Budget for *filesystem* entries (dirs + files). Test nodes parsed from inside
|
|
22
|
-
// a suite file are free — the file is already read for its suite id, and they
|
|
23
|
-
// must not starve sibling folders out of the tree (a 2800-test project would
|
|
24
|
-
// otherwise truncate the repo's own dirs).
|
|
25
|
-
const MAX_NODES = 10000;
|
|
26
|
-
|
|
27
|
-
export async function filesTree(request: Request): Promise<Response> {
|
|
28
|
-
const url = new URL(request.url);
|
|
29
|
-
const sessionId = url.searchParams.get("session");
|
|
30
|
-
if (!sessionId) {
|
|
31
|
-
return Response.json({ error: "session required" }, { status: 400 });
|
|
32
|
-
}
|
|
33
|
-
const session = getSession(sessionId);
|
|
34
|
-
if (!session) {
|
|
35
|
-
return Response.json({ error: "Session not found" }, { status: 404 });
|
|
36
|
-
}
|
|
37
|
-
const cwd = path.resolve(session.cwd);
|
|
38
|
-
if (!fs.existsSync(cwd)) {
|
|
39
|
-
return Response.json({ error: "Workspace missing" }, { status: 410 });
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const info = describeWorkspace(cwd);
|
|
43
|
-
const active = pickType(info, url.searchParams.get("type"));
|
|
44
|
-
// The dir the active view focuses on, absolute. Everything inside it is shown;
|
|
45
|
-
// manual manual-tests dir is null when nothing is loaded (then only `*.test.md`).
|
|
46
|
-
let focusAbs: string | null = null;
|
|
47
|
-
if (active.type === "manual" && info.manualTestsDir !== null) {
|
|
48
|
-
focusAbs = path.resolve(cwd, info.manualTestsDir);
|
|
49
|
-
} else if (active.dir) {
|
|
50
|
-
focusAbs = path.resolve(cwd, active.dir);
|
|
51
|
-
}
|
|
52
|
-
// Only the Files view folds in the whole gitignored `.testeiya` dir so "show
|
|
53
|
-
// all" really shows everything — the pulled manual tests, user-added context
|
|
54
|
-
// (code/, requirements/, …) and the config files. The Code view stays the
|
|
55
|
-
// source repo; the Manual view stays tests-only.
|
|
56
|
-
let configAbs: string | null = null;
|
|
57
|
-
if (active.type === "files" && !active.dir) {
|
|
58
|
-
configAbs = path.resolve(cwd, PROJECT_DIR);
|
|
59
|
-
}
|
|
60
|
-
const view: TreeView = {
|
|
61
|
-
type: active.type,
|
|
62
|
-
focusAbs,
|
|
63
|
-
configAbs,
|
|
64
|
-
branchOnly: !!active.dir && active.type !== "manual",
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
ensureSyncBaseline(cwd);
|
|
68
|
-
// Manual tests flag files un-synced since the last Testomat.io pull/push; code
|
|
69
|
-
// files flag what changed since the last git commit. The manual view keeps the
|
|
70
|
-
// sync baseline only; other views add git status, with sync markers (the folded
|
|
71
|
-
// manual-tests) winning where both apply.
|
|
72
|
-
const syncChanged = computeChangedFiles(cwd);
|
|
73
|
-
const gitChanged = view.type === "manual" ? {} : gitChangedFiles(cwd);
|
|
74
|
-
const changed = { ...gitChanged, ...syncChanged };
|
|
75
|
-
const committed = gitCommittedFiles(cwd);
|
|
76
|
-
const state = { count: 0 };
|
|
77
|
-
const nodes = readDir(cwd, "", 0, state, view, changed, committed, loadGitignore(cwd));
|
|
78
|
-
return Response.json({
|
|
79
|
-
cwd,
|
|
80
|
-
branch: gitBranch(cwd),
|
|
81
|
-
nodes,
|
|
82
|
-
truncated: state.count >= MAX_NODES,
|
|
83
|
-
changedCount: Object.keys(changed).length,
|
|
84
|
-
activeType: active.type,
|
|
85
|
-
...info,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function readDir(
|
|
90
|
-
absDir: string,
|
|
91
|
-
relDir: string,
|
|
92
|
-
depth: number,
|
|
93
|
-
state: { count: number },
|
|
94
|
-
view: TreeView,
|
|
95
|
-
changed: Record<string, FileStatus>,
|
|
96
|
-
committed: Set<string>,
|
|
97
|
-
ig: GitignoreChain
|
|
98
|
-
): TreeNode[] {
|
|
99
|
-
if (depth > MAX_DEPTH || state.count >= MAX_NODES) return [];
|
|
100
|
-
let entries: fs.Dirent[];
|
|
101
|
-
try {
|
|
102
|
-
entries = fs.readdirSync(absDir, { withFileTypes: true });
|
|
103
|
-
} catch {
|
|
104
|
-
return [];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const configTop = relDir.split("/")[0];
|
|
108
|
-
const inConfigDir = configTop === PROJECT_DIR || configTop === LEGACY_PROJECT_DIR;
|
|
109
|
-
const folders: TreeNode[] = [];
|
|
110
|
-
const files: TreeNode[] = [];
|
|
111
|
-
for (const entry of entries) {
|
|
112
|
-
if (state.count >= MAX_NODES) break;
|
|
113
|
-
if (VENDOR_DIRS.has(entry.name)) continue;
|
|
114
|
-
const childAbs = path.join(absDir, entry.name);
|
|
115
|
-
const childRel = relDir ? `${relDir}/${entry.name}` : entry.name;
|
|
116
|
-
// Resolve symlinks (linked context folders under `.testeiya/`) so they
|
|
117
|
-
// render as the dir/file they point at; dangling links are dropped.
|
|
118
|
-
let isDir = entry.isDirectory();
|
|
119
|
-
let isFile = entry.isFile();
|
|
120
|
-
if (entry.isSymbolicLink()) {
|
|
121
|
-
try {
|
|
122
|
-
const target = fs.statSync(childAbs);
|
|
123
|
-
isDir = target.isDirectory();
|
|
124
|
-
isFile = target.isFile();
|
|
125
|
-
} catch {
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
// A browse-all view surfaces both the view's focus and the whole `.testeiya`
|
|
130
|
-
// dir, so `leads`/`inside` fold in `configAbs` too.
|
|
131
|
-
const leads =
|
|
132
|
-
(!!view.focusAbs && isAncestorOrEqual(childAbs, view.focusAbs)) ||
|
|
133
|
-
(!!view.configAbs && isAncestorOrEqual(childAbs, view.configAbs));
|
|
134
|
-
const inside = isInsideFocus(childAbs, view.focusAbs) || isInsideFocus(childAbs, view.configAbs);
|
|
135
|
-
|
|
136
|
-
// Hide git-ignored paths (e.g. a Rails `storage/` blob cache), except the
|
|
137
|
-
// surfaced `.testeiya` cache the browse-all view deliberately folds in.
|
|
138
|
-
if (!leads && !inside && ig.ignores(childRel)) continue;
|
|
139
|
-
|
|
140
|
-
if (isDir) {
|
|
141
|
-
// Hide only the internal config dir (`.testeiya`/`.omp`) unless it leads
|
|
142
|
-
// to a surfaced dir (e.g. `.testeiya/manual-tests`). Other non-git-ignored
|
|
143
|
-
// dot folders (`.github`, `.circleci`, …) are valuable and render normally.
|
|
144
|
-
// Inside the config dir, keep only the branch heading to a surfaced dir so
|
|
145
|
-
// `mcp.json`-style siblings stay out. A subdir view (`branchOnly`) prunes the rest.
|
|
146
|
-
if ((entry.name === PROJECT_DIR || entry.name === LEGACY_PROJECT_DIR) && !leads) continue;
|
|
147
|
-
if (inConfigDir && !leads && !inside) continue;
|
|
148
|
-
if (view.branchOnly && !leads && !inside) continue;
|
|
149
|
-
state.count++;
|
|
150
|
-
const children = readDir(childAbs, childRel, depth + 1, state, view, changed, committed, ig.descend(childRel));
|
|
151
|
-
// Prune folders outside the focus dir whose files were all filtered out,
|
|
152
|
-
// so a manual view over `.testeiya/manual-tests` doesn't render empty
|
|
153
|
-
// `src/`/`tests/` repo folders. Folders inside the focus dir always show.
|
|
154
|
-
if (children.length === 0 && !inside) continue;
|
|
155
|
-
folders.push({ name: entry.name, kind: "folder", path: childRel, children });
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
if (!isFile || entry.name.startsWith(".")) continue;
|
|
159
|
-
// Inside the config dir (`.testeiya`), only show files that live inside a
|
|
160
|
-
// surfaced dir — keep `mcp.json`/`testeiya.json` siblings out of every view.
|
|
161
|
-
if (inConfigDir && !inside) continue;
|
|
162
|
-
// Files inside a surfaced dir always show. Outside it: nothing in a subdir
|
|
163
|
-
// view, only `*.test.md` in a manual view, automated tests + the framework
|
|
164
|
-
// config in an automated view, everything in a code/files view.
|
|
165
|
-
if (!inside) {
|
|
166
|
-
if (view.branchOnly) continue;
|
|
167
|
-
if (view.type === "manual" && !TEST_MD_RE.test(entry.name)) continue;
|
|
168
|
-
if (
|
|
169
|
-
view.type === "automated" &&
|
|
170
|
-
!isAutomatedTestFile(entry.name) &&
|
|
171
|
-
!isTestConfigFile(entry.name)
|
|
172
|
-
) {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
state.count++;
|
|
177
|
-
const file: TreeNode = { name: entry.name, kind: "file", path: childRel };
|
|
178
|
-
if (changed[childRel]) file.status = changed[childRel];
|
|
179
|
-
if (committed.has(childRel)) file.committed = true;
|
|
180
|
-
// Expand `*.test.md` into its tests (one per `<!-- test` marker) so the
|
|
181
|
-
// sidebar tree can drill into each test and scroll to it in the editor. The
|
|
182
|
-
// suite id (when present) lets the UI pull/push this one suite. A pulled
|
|
183
|
-
// suite mixes manual and automated tests; `testType` distinguishes them.
|
|
184
|
-
if (TEST_MD_RE.test(entry.name)) {
|
|
185
|
-
const suite = readSuite(childAbs);
|
|
186
|
-
if (suite.id) file.suiteId = suite.id;
|
|
187
|
-
if (suite.emoji) file.emoji = suite.emoji;
|
|
188
|
-
const tests: TreeNode[] = [];
|
|
189
|
-
for (const test of suite.tests) {
|
|
190
|
-
tests.push({
|
|
191
|
-
name: test.title,
|
|
192
|
-
kind: "test",
|
|
193
|
-
path: childRel,
|
|
194
|
-
anchor: test.title,
|
|
195
|
-
testType: test.type,
|
|
196
|
-
suiteId: suite.id ?? undefined,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
if (tests.length > 0) file.children = tests;
|
|
200
|
-
}
|
|
201
|
-
files.push(file);
|
|
202
|
-
}
|
|
203
|
-
folders.sort((a, b) => a.name.localeCompare(b.name));
|
|
204
|
-
files.sort((a, b) => a.name.localeCompare(b.name));
|
|
205
|
-
return [...folders, ...files];
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/** Resolve the active view: an explicit `?type=`, else manual, else the first. */
|
|
209
|
-
function pickType(info: WorkspaceInfo, param: string | null): WorkspaceTypeEntry {
|
|
210
|
-
const fromParam = info.types.find((t) => t.type === param);
|
|
211
|
-
if (fromParam) return fromParam;
|
|
212
|
-
const manual = info.types.find((t) => t.type === "manual");
|
|
213
|
-
if (manual) return manual;
|
|
214
|
-
return info.types[0];
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/** True when `ancestor` is `target` or a parent directory of it. */
|
|
218
|
-
function isAncestorOrEqual(ancestor: string, target: string): boolean {
|
|
219
|
-
if (ancestor === target) return true;
|
|
220
|
-
return target.startsWith(ancestor + path.sep);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/** True when `p` is the focus dir or a path within it. */
|
|
224
|
-
function isInsideFocus(p: string, focusAbs: string | null): boolean {
|
|
225
|
-
if (!focusAbs) return false;
|
|
226
|
-
return isAncestorOrEqual(focusAbs, p);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/** The suite id (`@S…`) and each test (title + state) of a `*.test.md` in a single read. */
|
|
230
|
-
function readSuite(absFile: string): Suite {
|
|
231
|
-
let content: string;
|
|
232
|
-
try {
|
|
233
|
-
content = fs.readFileSync(absFile, "utf8");
|
|
234
|
-
} catch {
|
|
235
|
-
return { id: null, emoji: null, tests: [] };
|
|
236
|
-
}
|
|
237
|
-
const id = suiteId(content);
|
|
238
|
-
const emoji = suiteEmoji(content);
|
|
239
|
-
const tests: SuiteTest[] = [];
|
|
240
|
-
let armed = false;
|
|
241
|
-
let type: TestState = "manual";
|
|
242
|
-
for (const line of content.split("\n")) {
|
|
243
|
-
if (/^<!--\s*test\b/.test(line)) {
|
|
244
|
-
armed = true;
|
|
245
|
-
type = "manual";
|
|
246
|
-
continue;
|
|
247
|
-
}
|
|
248
|
-
if (!armed) continue;
|
|
249
|
-
if (/^type:\s*automated\s*$/.test(line)) {
|
|
250
|
-
type = "automated";
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
const match = /^#{1,2}\s+(.+?)\s*$/.exec(line);
|
|
254
|
-
if (!match) continue;
|
|
255
|
-
tests.push({ title: match[1], type });
|
|
256
|
-
armed = false;
|
|
257
|
-
}
|
|
258
|
-
return { id: id ? `@S${id}` : null, emoji, tests };
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
type TestState = "manual" | "automated";
|
|
262
|
-
|
|
263
|
-
interface SuiteTest {
|
|
264
|
-
title: string;
|
|
265
|
-
type: TestState;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
interface Suite {
|
|
269
|
-
id: string | null;
|
|
270
|
-
emoji: string | null;
|
|
271
|
-
tests: SuiteTest[];
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
interface TreeNode {
|
|
275
|
-
name: string;
|
|
276
|
-
kind: "folder" | "file" | "test";
|
|
277
|
-
path: string; // relative to session.cwd
|
|
278
|
-
anchor?: string;
|
|
279
|
-
testType?: TestState; // the `type:` of a test block — drives the Manual/Automated split
|
|
280
|
-
suiteId?: string; // `@S…` when the file/test belongs to a pushed suite
|
|
281
|
-
emoji?: string; // suite icon from the `<!-- suite` block's `emoji:` field
|
|
282
|
-
status?: FileStatus; // "created" | "changed" since the last Testomat.io sync
|
|
283
|
-
committed?: boolean; // tracked by git and unmodified — safely restorable
|
|
284
|
-
children?: TreeNode[];
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
interface TreeView {
|
|
288
|
-
type: WorkspaceType;
|
|
289
|
-
focusAbs: string | null;
|
|
290
|
-
configAbs: string | null;
|
|
291
|
-
branchOnly: boolean;
|
|
292
|
-
}
|
package/src/api/files-write.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { getSession } from "../session-store.js";
|
|
4
|
-
import { safeResolve } from "../workspace/safe-path.js";
|
|
5
|
-
|
|
6
|
-
const MAX_BYTES = 2 * 1024 * 1024; // 2 MB
|
|
7
|
-
|
|
8
|
-
export async function filesWrite(request: Request): Promise<Response> {
|
|
9
|
-
const url = new URL(request.url);
|
|
10
|
-
const sessionId = url.searchParams.get("session");
|
|
11
|
-
const relPath = url.searchParams.get("path");
|
|
12
|
-
if (!sessionId || !relPath) {
|
|
13
|
-
return Response.json({ error: "session and path required" }, { status: 400 });
|
|
14
|
-
}
|
|
15
|
-
const session = getSession(sessionId);
|
|
16
|
-
if (!session) return Response.json({ error: "Session not found" }, { status: 404 });
|
|
17
|
-
|
|
18
|
-
let body: { content?: string };
|
|
19
|
-
try {
|
|
20
|
-
body = await request.json();
|
|
21
|
-
} catch {
|
|
22
|
-
return Response.json({ error: "invalid JSON body" }, { status: 400 });
|
|
23
|
-
}
|
|
24
|
-
const content = body.content;
|
|
25
|
-
if (typeof content !== "string") {
|
|
26
|
-
return Response.json({ error: "content must be a string" }, { status: 400 });
|
|
27
|
-
}
|
|
28
|
-
if (content.length > MAX_BYTES) {
|
|
29
|
-
return Response.json({ error: "content too large" }, { status: 413 });
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const abs = safeResolve(session.cwd, relPath);
|
|
33
|
-
if (!abs) {
|
|
34
|
-
return Response.json({ error: "path outside workspace" }, { status: 400 });
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
38
|
-
fs.writeFileSync(abs, content, "utf8");
|
|
39
|
-
const stat = fs.statSync(abs);
|
|
40
|
-
return Response.json({ ok: true, path: relPath, size: stat.size, mtime: stat.mtimeMs });
|
|
41
|
-
}
|