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/context-store.ts
DELETED
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import dedent from "dedent";
|
|
4
|
-
import {
|
|
5
|
-
PROJECT_DIR,
|
|
6
|
-
CONTEXT_CODE_SUBDIR,
|
|
7
|
-
CONTEXT_REQUIREMENTS_SUBDIR,
|
|
8
|
-
MANUAL_TESTS_SUBDIR,
|
|
9
|
-
contextManifestPath,
|
|
10
|
-
ensureProjectDirGuards,
|
|
11
|
-
} from "./project-dir.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Workspace context: extra resources attached to a workspace so the agent can
|
|
15
|
-
* consult them — symlinked local folders and shallow-cloned git repos (both
|
|
16
|
-
* directly under `.testeiya/<name>`, named after the source) and documents
|
|
17
|
-
* (under `.testeiya/requirements/` and `.testeiya/docs/`). The manifest
|
|
18
|
-
* (`.testeiya/context.json`) records what the user added via the UI;
|
|
19
|
-
* `listContext` folds in anything else found in the legacy `.testeiya/code/`
|
|
20
|
-
* dir (e.g. put there by the agent itself), so the system prompt and the chat
|
|
21
|
-
* status bar always reflect the real folder contents.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/** Extra doc dir the agent writes on its own (see the system prompt's context structure). */
|
|
25
|
-
const CONTEXT_DOCS_SUBDIR = "docs";
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The predefined `.testeiya` context structure — mirrors the system prompt's
|
|
29
|
-
* <context-workspace> section. Only these are surfaced as status-bar sections;
|
|
30
|
-
* anything else inside `.testeiya` (uploads, skills, ad-hoc agent dirs) is
|
|
31
|
-
* plumbing, not context. User-added entries (linked folders, cloned repos)
|
|
32
|
-
* live directly under `.testeiya/<name>` and must never shadow these names.
|
|
33
|
-
*/
|
|
34
|
-
export const CONTEXT_SECTION_DIRS = [
|
|
35
|
-
MANUAL_TESTS_SUBDIR,
|
|
36
|
-
CONTEXT_CODE_SUBDIR,
|
|
37
|
-
CONTEXT_REQUIREMENTS_SUBDIR,
|
|
38
|
-
CONTEXT_DOCS_SUBDIR,
|
|
39
|
-
"auto-tests",
|
|
40
|
-
"exploratory",
|
|
41
|
-
];
|
|
42
|
-
|
|
43
|
-
/** The non-empty predefined context folders, one status-bar section each. */
|
|
44
|
-
export function listContextFolders(cwd: string): ContextFolder[] {
|
|
45
|
-
const folders: ContextFolder[] = [];
|
|
46
|
-
for (const name of CONTEXT_SECTION_DIRS) {
|
|
47
|
-
const count = readdirSafe(path.join(cwd, PROJECT_DIR, name)).filter(
|
|
48
|
-
(e) => !e.name.startsWith(".")
|
|
49
|
-
).length;
|
|
50
|
-
if (count === 0) continue;
|
|
51
|
-
folders.push({ name, path: `${PROJECT_DIR}/${name}`, count });
|
|
52
|
-
}
|
|
53
|
-
return folders;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Every context entry: the manifest plus items discovered on disk. */
|
|
57
|
-
export function listContext(cwd: string): ContextEntry[] {
|
|
58
|
-
const manifest = loadContextEntries(cwd);
|
|
59
|
-
const known = new Set(manifest.map((e) => e.path));
|
|
60
|
-
const discovered: ContextEntry[] = [];
|
|
61
|
-
discoverDirs(cwd, CONTEXT_CODE_SUBDIR, known, discovered);
|
|
62
|
-
discoverFiles(cwd, CONTEXT_REQUIREMENTS_SUBDIR, known, discovered);
|
|
63
|
-
discoverFiles(cwd, CONTEXT_DOCS_SUBDIR, known, discovered);
|
|
64
|
-
return [...manifest, ...discovered];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function loadContextEntries(cwd: string): ContextEntry[] {
|
|
68
|
-
let raw: { entries?: ContextEntry[] };
|
|
69
|
-
try {
|
|
70
|
-
raw = JSON.parse(fs.readFileSync(contextManifestPath(cwd), "utf8"));
|
|
71
|
-
} catch {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
const entries = Array.isArray(raw.entries) ? raw.entries : [];
|
|
75
|
-
return entries.filter((e) => e?.path && exists(path.join(cwd, e.path)));
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export function saveContextEntries(cwd: string, entries: ContextEntry[]): void {
|
|
79
|
-
const dir = path.join(cwd, PROJECT_DIR);
|
|
80
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
81
|
-
ensureProjectDirGuards(cwd);
|
|
82
|
-
fs.writeFileSync(
|
|
83
|
-
contextManifestPath(cwd),
|
|
84
|
-
JSON.stringify({ entries, updatedAt: new Date().toISOString() }, null, 2)
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Change marker for the workspace context: the manifest mtime plus the set of
|
|
90
|
-
* non-empty predefined folders (so a mid-session pull that seeds
|
|
91
|
-
* `manual-tests` also registers as a change). "" when nothing exists.
|
|
92
|
-
*/
|
|
93
|
-
export function contextStamp(cwd: string): string {
|
|
94
|
-
let mtime = 0;
|
|
95
|
-
try {
|
|
96
|
-
mtime = fs.statSync(contextManifestPath(cwd)).mtimeMs;
|
|
97
|
-
} catch {
|
|
98
|
-
// no manifest yet
|
|
99
|
-
}
|
|
100
|
-
const names = listContextFolders(cwd).map((f) => f.name);
|
|
101
|
-
return `${mtime}|${names.join(",")}`;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** System-prompt section describing the workspace context; "" when none. */
|
|
105
|
-
export function contextPromptSection(
|
|
106
|
-
entries: ContextEntry[],
|
|
107
|
-
folders: ContextFolder[] = []
|
|
108
|
-
): string {
|
|
109
|
-
if (entries.length === 0 && folders.length === 0) return "";
|
|
110
|
-
return dedent`
|
|
111
|
-
<workspace-context>
|
|
112
|
-
This workspace has context attached — the user (or you, earlier) put it there for a purpose. Consult it before answering, and prefer it over assumptions about the project.
|
|
113
|
-
|
|
114
|
-
${contextLines(entries, folders)}
|
|
115
|
-
|
|
116
|
-
ALL of it lives under the hidden \`${PROJECT_DIR}/\` dir: file-search tools skip hidden dirs by default, so search it explicitly (pass hidden:true, or prefix the path with \`${PROJECT_DIR}/\`). Linked folders and cloned repositories are reference material: read them, never modify them. A linked folder is a symlink — wildcard searches do not descend into it; search it with its own path prefix (e.g. \`${PROJECT_DIR}/<name>/\`). Documents under \`${PROJECT_DIR}/requirements\` and \`${PROJECT_DIR}/docs\` are specs and plans — use them when writing or reviewing tests.
|
|
117
|
-
</workspace-context>
|
|
118
|
-
`;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/** Per-prompt notice when the context changed mid-session; appended to the next prompt. */
|
|
122
|
-
export function contextUpdateNotice(
|
|
123
|
-
entries: ContextEntry[],
|
|
124
|
-
folders: ContextFolder[] = []
|
|
125
|
-
): string {
|
|
126
|
-
if (entries.length === 0 && folders.length === 0) {
|
|
127
|
-
return dedent`
|
|
128
|
-
<workspace-context-update>
|
|
129
|
-
All extra workspace context was removed. Do not rely on it anymore.
|
|
130
|
-
</workspace-context-update>
|
|
131
|
-
`;
|
|
132
|
-
}
|
|
133
|
-
return dedent`
|
|
134
|
-
<workspace-context-update>
|
|
135
|
-
The workspace context just changed. It now contains:
|
|
136
|
-
|
|
137
|
-
${contextLines(entries, folders)}
|
|
138
|
-
|
|
139
|
-
This was done for a purpose — take it into account for this and future requests. Remember \`${PROJECT_DIR}/\` is hidden: search it with hidden:true or an explicit path prefix.
|
|
140
|
-
</workspace-context-update>
|
|
141
|
-
`;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function contextLines(entries: ContextEntry[], folders: ContextFolder[]): string {
|
|
145
|
-
const lines: string[] = [];
|
|
146
|
-
const covered = new Set(entries.map((e) => parentDir(e.path)));
|
|
147
|
-
for (const f of folders) {
|
|
148
|
-
if (covered.has(f.path)) continue;
|
|
149
|
-
lines.push(`- \`${f.path}/\` — ${folderPurpose(f.name)}`);
|
|
150
|
-
}
|
|
151
|
-
for (const e of entries) lines.push(`- ${describeEntry(e)}`);
|
|
152
|
-
return lines.join("\n");
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function folderPurpose(name: string): string {
|
|
156
|
-
if (name === "manual-tests") {
|
|
157
|
-
return "the project's manual test suites pulled from Testomat.io (*.test.md — THE manual tests of this project)";
|
|
158
|
-
}
|
|
159
|
-
if (name === "code") return "reference code added as context";
|
|
160
|
-
if (name === "requirements") return "requirements and specs";
|
|
161
|
-
if (name === "docs") return "test planning and strategy documents";
|
|
162
|
-
if (name === "auto-tests") return "automated test references";
|
|
163
|
-
return "exploratory testing setup";
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function parentDir(rel: string): string {
|
|
167
|
-
const idx = rel.lastIndexOf("/");
|
|
168
|
-
if (idx < 0) return "";
|
|
169
|
-
return rel.slice(0, idx);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function describeEntry(e: ContextEntry): string {
|
|
173
|
-
const date = e.addedAt?.split("T")[0] ?? "";
|
|
174
|
-
let from = "";
|
|
175
|
-
if (e.origin && e.origin !== e.name) from = ` from ${e.origin}`;
|
|
176
|
-
if (e.kind === "repo") return `\`${e.path}\` — git repository${from} (${date})`;
|
|
177
|
-
if (e.kind === "folder") return `\`${e.path}\` — local folder${from} (${date})`;
|
|
178
|
-
return `\`${e.path}\` — document${from} (${date})`;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Top-level dirs in `.testeiya/code` not in the manifest: `folder` entries, or
|
|
182
|
-
// `repo` when they carry their own `.git` (a clone made by the agent).
|
|
183
|
-
function discoverDirs(
|
|
184
|
-
cwd: string,
|
|
185
|
-
subdir: string,
|
|
186
|
-
known: Set<string>,
|
|
187
|
-
out: ContextEntry[]
|
|
188
|
-
): void {
|
|
189
|
-
for (const entry of readdirSafe(path.join(cwd, PROJECT_DIR, subdir))) {
|
|
190
|
-
if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
|
|
191
|
-
const rel = `${PROJECT_DIR}/${subdir}/${entry.name}`;
|
|
192
|
-
if (known.has(rel)) continue;
|
|
193
|
-
let kind: ContextKind = "folder";
|
|
194
|
-
if (!entry.isSymbolicLink() && fs.existsSync(path.join(cwd, rel, ".git"))) kind = "repo";
|
|
195
|
-
out.push(discoveredEntry(cwd, kind, entry.name, rel));
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
function discoverFiles(
|
|
200
|
-
cwd: string,
|
|
201
|
-
subdir: string,
|
|
202
|
-
known: Set<string>,
|
|
203
|
-
out: ContextEntry[]
|
|
204
|
-
): void {
|
|
205
|
-
for (const entry of readdirSafe(path.join(cwd, PROJECT_DIR, subdir))) {
|
|
206
|
-
if (!entry.isFile() || entry.name.startsWith(".")) continue;
|
|
207
|
-
const rel = `${PROJECT_DIR}/${subdir}/${entry.name}`;
|
|
208
|
-
if (known.has(rel)) continue;
|
|
209
|
-
out.push(discoveredEntry(cwd, "file", entry.name, rel));
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function discoveredEntry(
|
|
214
|
-
cwd: string,
|
|
215
|
-
kind: ContextKind,
|
|
216
|
-
name: string,
|
|
217
|
-
rel: string
|
|
218
|
-
): ContextEntry {
|
|
219
|
-
let addedAt = "";
|
|
220
|
-
try {
|
|
221
|
-
addedAt = fs.lstatSync(path.join(cwd, rel)).mtime.toISOString();
|
|
222
|
-
} catch {
|
|
223
|
-
// keep empty — the entry is still listable
|
|
224
|
-
}
|
|
225
|
-
return { id: `fs:${rel}`, kind, name, path: rel, origin: "", addedAt };
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function readdirSafe(dir: string): fs.Dirent[] {
|
|
229
|
-
try {
|
|
230
|
-
return fs.readdirSync(dir, { withFileTypes: true });
|
|
231
|
-
} catch {
|
|
232
|
-
return [];
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
function exists(p: string): boolean {
|
|
237
|
-
try {
|
|
238
|
-
fs.lstatSync(p);
|
|
239
|
-
return true;
|
|
240
|
-
} catch {
|
|
241
|
-
return false;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export type ContextKind = "folder" | "repo" | "file";
|
|
246
|
-
|
|
247
|
-
/** A top-level `.testeiya` folder shown as a status-bar section. */
|
|
248
|
-
export interface ContextFolder {
|
|
249
|
-
name: string;
|
|
250
|
-
/** Relative to cwd (`.testeiya/<name>`). */
|
|
251
|
-
path: string;
|
|
252
|
-
/** Direct children (files + dirs, dot entries excluded). */
|
|
253
|
-
count: number;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
export interface ContextEntry {
|
|
257
|
-
id: string;
|
|
258
|
-
kind: ContextKind;
|
|
259
|
-
name: string;
|
|
260
|
-
/** Location inside the workspace, relative to cwd (always under `.testeiya/`). */
|
|
261
|
-
path: string;
|
|
262
|
-
/** Where it came from: an absolute local path, a git URL, or the uploaded filename. */
|
|
263
|
-
origin: string;
|
|
264
|
-
addedAt: string;
|
|
265
|
-
}
|
package/src/debug-bus.ts
DELETED
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
import { appendFileSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { log, type WideEvent } from "evlog";
|
|
5
|
-
import { readMemoryLogs } from "evlog/memory";
|
|
6
|
-
|
|
7
|
-
/*
|
|
8
|
-
* Server-side instrumentation for the sidebar Debug panel, built on the evlog
|
|
9
|
-
* pipeline that `file-log.ts` initializes. The real outbound calls to the
|
|
10
|
-
* Testomat.io API server happen here in the Bun process (the v2 proxy,
|
|
11
|
-
* attachment upload, transcription) — the browser only ever sees the
|
|
12
|
-
* same-origin `/api/testomatio/*` proxy hop. `loggedServerFetch` (and
|
|
13
|
-
* `publish` for the `ai` / `check-tests` channels) emits one evlog wide event
|
|
14
|
-
* per call; the shared drain fans it out to the NDJSON app log, the in-memory
|
|
15
|
-
* ring buffer (`evlog/memory` — the snapshot's source), and `panelDrain`
|
|
16
|
-
* below, which maps panel-facing channels onto the `DebugEntry` wire shapes
|
|
17
|
-
* the `/api/debug/stream` SSE feed and the client panel already speak.
|
|
18
|
-
*
|
|
19
|
-
* While debug mode is on — the panel is open (an SSE subscriber is connected)
|
|
20
|
-
* or `TESTEIYA_DEBUG=1` is set — each request + response is also appended to
|
|
21
|
-
* `cli/log/testomatio.http` (gitignored) as a re-runnable `.http` block
|
|
22
|
-
* (VS Code REST Client / JetBrains), with the response captured as trailing
|
|
23
|
-
* comments so the agent can verify the REST API. The file includes the
|
|
24
|
-
* `Authorization` header so requests actually replay; that token never reaches
|
|
25
|
-
* the panel or the SSE feed.
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
const MAX_BODY = 16000;
|
|
29
|
-
const FILE_RESPONSE_MAX = 6000;
|
|
30
|
-
const LOG_DIR = fileURLToPath(new URL("../log", import.meta.url));
|
|
31
|
-
const REPLAY_FILE = join(LOG_DIR, "testomatio.http");
|
|
32
|
-
|
|
33
|
-
let panelSeq = 0;
|
|
34
|
-
let dirReady = false;
|
|
35
|
-
let latestReportKey: string | null = null;
|
|
36
|
-
const clientReports = new Map<string, ClientReport>();
|
|
37
|
-
const subscribers = new Set<(entry: DebugEntry) => void>();
|
|
38
|
-
|
|
39
|
-
export async function loggedServerFetch(
|
|
40
|
-
url: string,
|
|
41
|
-
init: RequestInit,
|
|
42
|
-
requestBody?: string | null
|
|
43
|
-
): Promise<{ res: Response; text: string }> {
|
|
44
|
-
const method = (init.method ?? "GET").toUpperCase();
|
|
45
|
-
const started = Date.now();
|
|
46
|
-
try {
|
|
47
|
-
const res = await fetch(url, init);
|
|
48
|
-
const text = await res.text();
|
|
49
|
-
record(
|
|
50
|
-
{
|
|
51
|
-
method,
|
|
52
|
-
url,
|
|
53
|
-
requestBody: requestBody ?? null,
|
|
54
|
-
status: res.status,
|
|
55
|
-
ok: res.ok,
|
|
56
|
-
responseBody: text,
|
|
57
|
-
error: null,
|
|
58
|
-
durationMs: Date.now() - started,
|
|
59
|
-
},
|
|
60
|
-
init.headers
|
|
61
|
-
);
|
|
62
|
-
return { res, text };
|
|
63
|
-
} catch (e) {
|
|
64
|
-
if ((e as { name?: string })?.name === "AbortError") throw e;
|
|
65
|
-
record(
|
|
66
|
-
{
|
|
67
|
-
method,
|
|
68
|
-
url,
|
|
69
|
-
requestBody: requestBody ?? null,
|
|
70
|
-
status: null,
|
|
71
|
-
ok: false,
|
|
72
|
-
responseBody: null,
|
|
73
|
-
error: e instanceof Error ? e.message : String(e),
|
|
74
|
-
durationMs: Date.now() - started,
|
|
75
|
-
},
|
|
76
|
-
init.headers
|
|
77
|
-
);
|
|
78
|
-
throw e;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Record a `check-tests` subprocess run (pull/push) as a Debug-panel event so its
|
|
84
|
-
* outcome + full output are visible alongside requests — the same feed the panel
|
|
85
|
-
* already renders, so an exit-1 sync stops being a silent "[check-tests] exited 1".
|
|
86
|
-
*/
|
|
87
|
-
export function publishCheckTests(run: {
|
|
88
|
-
action: string;
|
|
89
|
-
dir: string;
|
|
90
|
-
code: number | null;
|
|
91
|
-
output: string;
|
|
92
|
-
durationMs: number;
|
|
93
|
-
}): void {
|
|
94
|
-
publish({
|
|
95
|
-
kind: "event",
|
|
96
|
-
channel: "check-tests",
|
|
97
|
-
name: `check-tests ${run.action}`,
|
|
98
|
-
summary: `${run.code === 0 ? "ok" : `exit ${run.code}`} · ${run.dir} · ${run.durationMs}ms`,
|
|
99
|
-
ok: run.code === 0,
|
|
100
|
-
detail: truncate(run.output),
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export function subscribeDebug(cb: (entry: DebugEntry) => void): () => void {
|
|
105
|
-
subscribers.add(cb);
|
|
106
|
-
return () => {
|
|
107
|
-
subscribers.delete(cb);
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function recentDebugEntries(): DebugEntry[] {
|
|
112
|
-
return readMemoryLogs()
|
|
113
|
-
.map(toPanelEntry)
|
|
114
|
-
.filter((entry): entry is DebugEntry => !!entry);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/*
|
|
118
|
-
* Latest client debug report per session — the browser's unified activity log
|
|
119
|
-
* (`api` + `agent` + `console` channels) plus a MobX store snapshot, pushed via
|
|
120
|
-
* `POST /api/debug/report`. Keyed by session so a snapshot request can pick the
|
|
121
|
-
* matching one; `latestReportKey` is the fallback when no session is given.
|
|
122
|
-
*/
|
|
123
|
-
export function recordClientReport(report: ClientReport): void {
|
|
124
|
-
const key = report.sessionId || "default";
|
|
125
|
-
clientReports.set(key, report);
|
|
126
|
-
latestReportKey = key;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function buildSnapshot(sessionId?: string | null): DebugSnapshot {
|
|
130
|
-
const events = readMemoryLogs();
|
|
131
|
-
const entries = events.map(toPanelEntry);
|
|
132
|
-
return {
|
|
133
|
-
generatedAt: new Date().toISOString(),
|
|
134
|
-
server: {
|
|
135
|
-
requests: entries.filter((e): e is ServerRequestEntry => !!e && e.kind === "request"),
|
|
136
|
-
ai: entries.filter((e): e is AiEventEntry => !!e && e.kind === "ai"),
|
|
137
|
-
checkTests: entries.filter((e): e is ProcessEventEntry => !!e && e.kind === "event"),
|
|
138
|
-
console: events.filter((e) => e.tag === "console").map(toConsoleEntry),
|
|
139
|
-
api: events.filter((e) => e.channel === "api"),
|
|
140
|
-
prompts: events.filter((e) => e.channel === "prompt"),
|
|
141
|
-
},
|
|
142
|
-
client: getClientReport(sessionId),
|
|
143
|
-
langfuseHint: "bun run debug:trace session:<agent-conversation-id>",
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export function clientLayout(
|
|
148
|
-
sessionId?: string | null
|
|
149
|
-
): { layout: unknown; reportedAt: string | null; url: string | null } | null {
|
|
150
|
-
const report = getClientReport(sessionId);
|
|
151
|
-
if (!report) return null;
|
|
152
|
-
let url: string | null = null;
|
|
153
|
-
const meta = report.meta as { url?: unknown } | null;
|
|
154
|
-
if (meta && typeof meta.url === "string") url = meta.url;
|
|
155
|
-
return { layout: report.layout ?? null, reportedAt: report.reportedAt, url };
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/*
|
|
159
|
-
* Generic sink for any non-request debug entry (currently the `ai` channel —
|
|
160
|
-
* pi-coding-agent LLM interactions; see `ai-debug.ts`). Emits an evlog wide
|
|
161
|
-
* event, which the shared drain routes to the file/memory sinks and back into
|
|
162
|
-
* `panelDrain` for the live SSE feed.
|
|
163
|
-
*/
|
|
164
|
-
export function publish(entry: WithoutMeta<DebugEntry>): void {
|
|
165
|
-
const { kind: _, ...fields } = entry;
|
|
166
|
-
if (entry.ok) {
|
|
167
|
-
log.info(fields);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
log.error(fields);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Drain hook wired into the evlog pipeline by `file-log.ts`: maps panel-facing
|
|
175
|
-
* wide events onto the `DebugEntry` wire shapes and pushes them to the live
|
|
176
|
-
* SSE subscribers. Non-panel channels (`api`, `prompt`, `console`) stay in the
|
|
177
|
-
* file/memory sinks only.
|
|
178
|
-
*/
|
|
179
|
-
export function panelDrain(event: WideEvent): void {
|
|
180
|
-
const entry = toPanelEntry(event);
|
|
181
|
-
if (!entry) return;
|
|
182
|
-
for (const cb of subscribers) cb(entry);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
function getClientReport(sessionId?: string | null): ClientReport | null {
|
|
186
|
-
if (sessionId && clientReports.has(sessionId)) return clientReports.get(sessionId)!;
|
|
187
|
-
if (latestReportKey) return clientReports.get(latestReportKey) ?? null;
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
function toPanelEntry(event: WideEvent): DebugEntry | null {
|
|
192
|
-
const e = event as Record<string, any>;
|
|
193
|
-
const channel = e.channel;
|
|
194
|
-
if (channel !== "testomatio" && channel !== "ai" && channel !== "check-tests") return null;
|
|
195
|
-
if (!e._panelId) {
|
|
196
|
-
panelSeq += 1;
|
|
197
|
-
e._panelId = panelSeq;
|
|
198
|
-
}
|
|
199
|
-
const id = e._panelId as number;
|
|
200
|
-
const ts = Date.parse(e.timestamp) || Date.now();
|
|
201
|
-
if (channel === "testomatio") {
|
|
202
|
-
return {
|
|
203
|
-
kind: "request",
|
|
204
|
-
channel: "testomatio",
|
|
205
|
-
id,
|
|
206
|
-
ts,
|
|
207
|
-
method: e.method,
|
|
208
|
-
url: e.url,
|
|
209
|
-
requestBody: e.requestBody ?? null,
|
|
210
|
-
status: e.status ?? null,
|
|
211
|
-
ok: !!e.ok,
|
|
212
|
-
responseBody: e.responseBody ?? null,
|
|
213
|
-
error: e.error ?? null,
|
|
214
|
-
durationMs: e.durationMs ?? 0,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
if (channel === "ai") {
|
|
218
|
-
return {
|
|
219
|
-
kind: "ai",
|
|
220
|
-
channel: "ai",
|
|
221
|
-
id,
|
|
222
|
-
ts,
|
|
223
|
-
name: e.name,
|
|
224
|
-
summary: e.summary ?? null,
|
|
225
|
-
ok: !!e.ok,
|
|
226
|
-
model: e.model ?? null,
|
|
227
|
-
durationMs: e.durationMs ?? null,
|
|
228
|
-
tokens: e.tokens ?? null,
|
|
229
|
-
detail: e.detail ?? null,
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
return {
|
|
233
|
-
kind: "event",
|
|
234
|
-
channel: "check-tests",
|
|
235
|
-
id,
|
|
236
|
-
ts,
|
|
237
|
-
name: e.name,
|
|
238
|
-
summary: e.summary ?? null,
|
|
239
|
-
ok: !!e.ok,
|
|
240
|
-
detail: e.detail ?? null,
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
function toConsoleEntry(event: WideEvent): ServerConsoleEntry {
|
|
245
|
-
let level: ServerConsoleEntry["level"] = "log";
|
|
246
|
-
if (event.level === "warn") level = "warn";
|
|
247
|
-
if (event.level === "error") level = "error";
|
|
248
|
-
return {
|
|
249
|
-
level,
|
|
250
|
-
ts: Date.parse(event.timestamp) || 0,
|
|
251
|
-
text: String((event as Record<string, unknown>).message ?? ""),
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
function record(partial: RequestData, headers?: HeadersInit): void {
|
|
256
|
-
const outcome = partial.error ?? partial.status ?? "—";
|
|
257
|
-
console.log(
|
|
258
|
-
`[testomatio→] ${partial.method} ${partial.url} → ${outcome} (${partial.durationMs}ms)`
|
|
259
|
-
);
|
|
260
|
-
const event = {
|
|
261
|
-
channel: "testomatio",
|
|
262
|
-
...partial,
|
|
263
|
-
requestBody: truncate(partial.requestBody),
|
|
264
|
-
responseBody: truncate(partial.responseBody),
|
|
265
|
-
};
|
|
266
|
-
if (partial.ok) log.info(event);
|
|
267
|
-
else log.error(event);
|
|
268
|
-
writeReplayFile(partial, headers);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
function writeReplayFile(data: RequestData, headers?: HeadersInit): void {
|
|
272
|
-
if (subscribers.size === 0 && process.env.TESTEIYA_DEBUG !== "1") return;
|
|
273
|
-
try {
|
|
274
|
-
if (!dirReady) {
|
|
275
|
-
mkdirSync(LOG_DIR, { recursive: true });
|
|
276
|
-
dirReady = true;
|
|
277
|
-
}
|
|
278
|
-
appendFileSync(REPLAY_FILE, formatHttp(data, headers));
|
|
279
|
-
} catch {}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
function formatHttp(data: RequestData, headers?: HeadersInit): string {
|
|
283
|
-
const ts = new Date().toISOString();
|
|
284
|
-
const resource = data.url.replace(/\?.*$/, "").split("/").pop() || data.url;
|
|
285
|
-
const outcome = data.error ? `ERR ${data.error}` : data.status;
|
|
286
|
-
const lines = [
|
|
287
|
-
`### ${data.method} ${resource} — ${ts} → ${outcome} (${data.durationMs}ms)`,
|
|
288
|
-
`${data.method} ${data.url}`,
|
|
289
|
-
];
|
|
290
|
-
for (const [key, value] of headerEntries(headers)) lines.push(`${key}: ${value}`);
|
|
291
|
-
if (data.requestBody && data.requestBody.startsWith("[multipart]")) {
|
|
292
|
-
lines.push(`# ${data.requestBody} (binary body not captured)`);
|
|
293
|
-
}
|
|
294
|
-
if (data.requestBody && !data.requestBody.startsWith("[multipart]")) {
|
|
295
|
-
lines.push("", data.requestBody);
|
|
296
|
-
}
|
|
297
|
-
lines.push("", ...responseComment(data), "", "");
|
|
298
|
-
return lines.join("\n");
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
function responseComment(data: RequestData): string[] {
|
|
302
|
-
if (data.error) return [`# ── error: ${data.error} ──`];
|
|
303
|
-
const head = `# ── response ${data.status} (${data.durationMs}ms) ──`;
|
|
304
|
-
if (!data.responseBody) return [head];
|
|
305
|
-
let body = data.responseBody;
|
|
306
|
-
if (body.length > FILE_RESPONSE_MAX) {
|
|
307
|
-
body = `${body.slice(0, FILE_RESPONSE_MAX)}… (truncated)`;
|
|
308
|
-
}
|
|
309
|
-
return [head, ...body.split("\n").map((line) => `# ${line}`)];
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
function headerEntries(headers?: HeadersInit): [string, string][] {
|
|
313
|
-
if (!headers) return [];
|
|
314
|
-
if (headers instanceof Headers) return [...headers.entries()];
|
|
315
|
-
if (Array.isArray(headers)) return headers as [string, string][];
|
|
316
|
-
return Object.entries(headers);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
function truncate(value: string | null): string | null {
|
|
320
|
-
if (!value) return value;
|
|
321
|
-
if (value.length <= MAX_BODY) return value;
|
|
322
|
-
return `${value.slice(0, MAX_BODY)}… (+${value.length - MAX_BODY} more chars)`;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
type RequestData = Omit<ServerRequestEntry, "id" | "ts" | "kind" | "channel">;
|
|
326
|
-
|
|
327
|
-
// Distributes over the union so each member keeps its own keys (a plain
|
|
328
|
-
// `Omit<A | B, K>` collapses to only the keys common to A and B).
|
|
329
|
-
type WithoutMeta<T> = T extends unknown ? Omit<T, "id" | "ts"> : never;
|
|
330
|
-
|
|
331
|
-
export interface ServerRequestEntry {
|
|
332
|
-
kind: "request";
|
|
333
|
-
channel: "testomatio";
|
|
334
|
-
id: number;
|
|
335
|
-
ts: number;
|
|
336
|
-
method: string;
|
|
337
|
-
url: string;
|
|
338
|
-
requestBody: string | null;
|
|
339
|
-
status: number | null;
|
|
340
|
-
ok: boolean;
|
|
341
|
-
responseBody: string | null;
|
|
342
|
-
error: string | null;
|
|
343
|
-
durationMs: number;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Mirrors `AiLogEntry` in `lib/debug/external-log.ts` so entries ride the SSE
|
|
347
|
-
// feed straight into the panel's `record()`.
|
|
348
|
-
export interface AiEventEntry {
|
|
349
|
-
kind: "ai";
|
|
350
|
-
channel: "ai";
|
|
351
|
-
id: number;
|
|
352
|
-
ts: number;
|
|
353
|
-
name: string;
|
|
354
|
-
summary: string | null;
|
|
355
|
-
ok: boolean;
|
|
356
|
-
model: string | null;
|
|
357
|
-
durationMs: number | null;
|
|
358
|
-
tokens: { input: number; output: number; total: number } | null;
|
|
359
|
-
detail: string | null;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// A `check-tests` subprocess run, shaped to match the client's `EventLogEntry`
|
|
363
|
-
// so it rides the SSE feed straight into the panel's event rows.
|
|
364
|
-
export interface ProcessEventEntry {
|
|
365
|
-
kind: "event";
|
|
366
|
-
channel: "check-tests";
|
|
367
|
-
id: number;
|
|
368
|
-
ts: number;
|
|
369
|
-
name: string;
|
|
370
|
-
summary: string | null;
|
|
371
|
-
ok: boolean;
|
|
372
|
-
detail: string | null;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
export type DebugEntry = ServerRequestEntry | AiEventEntry | ProcessEventEntry;
|
|
376
|
-
|
|
377
|
-
export interface ServerConsoleEntry {
|
|
378
|
-
level: "log" | "warn" | "error";
|
|
379
|
-
ts: number;
|
|
380
|
-
text: string;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
export interface ClientReport {
|
|
384
|
-
sessionId: string | null;
|
|
385
|
-
reason: string;
|
|
386
|
-
reportedAt: string;
|
|
387
|
-
entries: unknown[];
|
|
388
|
-
store: unknown;
|
|
389
|
-
meta: unknown;
|
|
390
|
-
layout?: unknown;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
export interface DebugSnapshot {
|
|
394
|
-
generatedAt: string;
|
|
395
|
-
server: {
|
|
396
|
-
requests: ServerRequestEntry[];
|
|
397
|
-
ai: AiEventEntry[];
|
|
398
|
-
checkTests: ProcessEventEntry[];
|
|
399
|
-
console: ServerConsoleEntry[];
|
|
400
|
-
api: WideEvent[];
|
|
401
|
-
prompts: WideEvent[];
|
|
402
|
-
};
|
|
403
|
-
client: ClientReport | null;
|
|
404
|
-
langfuseHint: string;
|
|
405
|
-
}
|