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.
Files changed (414) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -213
  3. package/dist/prompt/context.js +79 -0
  4. package/dist/prompt/context.js.map +1 -0
  5. package/dist/prompt/index.js +56 -0
  6. package/dist/prompt/index.js.map +1 -0
  7. package/dist/prompt/print.js +22 -0
  8. package/dist/prompt/print.js.map +1 -0
  9. package/dist/prompt/project-info.js +2 -0
  10. package/dist/prompt/project-info.js.map +1 -0
  11. package/{src/prompt/system-prompt.ts → dist/prompt/system-prompt.js} +24 -21
  12. package/dist/prompt/system-prompt.js.map +1 -0
  13. package/dist/prompt/testomatio.js +264 -0
  14. package/dist/prompt/testomatio.js.map +1 -0
  15. package/dist/prompt/tools.js +49 -0
  16. package/dist/prompt/tools.js.map +1 -0
  17. package/dist/prompt/vocab.js +8 -0
  18. package/dist/prompt/vocab.js.map +1 -0
  19. package/dist/src/args.js +72 -0
  20. package/dist/src/args.js.map +1 -0
  21. package/dist/src/cli.js +61 -0
  22. package/dist/src/cli.js.map +1 -0
  23. package/dist/src/env.js +69 -0
  24. package/dist/src/env.js.map +1 -0
  25. package/dist/src/mcp-extension.js +9 -0
  26. package/dist/src/mcp-extension.js.map +1 -0
  27. package/dist/src/mcp.js +139 -0
  28. package/dist/src/mcp.js.map +1 -0
  29. package/dist/src/model.js +66 -0
  30. package/dist/src/model.js.map +1 -0
  31. package/dist/src/result.js +41 -0
  32. package/dist/src/result.js.map +1 -0
  33. package/dist/src/run.js +199 -0
  34. package/dist/src/run.js.map +1 -0
  35. package/dist/src/session.js +77 -0
  36. package/dist/src/session.js.map +1 -0
  37. package/dist/vendor/mcp.js +14801 -0
  38. package/mcp-tools.json +2967 -0
  39. package/package.json +29 -42
  40. package/prompt/context.ts +101 -0
  41. package/prompt/index.ts +93 -0
  42. package/prompt/print.ts +23 -0
  43. package/prompt/project-info.ts +30 -0
  44. package/prompt/system-prompt.ts +173 -0
  45. package/{src/prompt → prompt}/testomatio.ts +119 -8
  46. package/{src/prompt → prompt}/tools.ts +30 -8
  47. package/prompt/vocab.ts +7 -0
  48. package/{skills.lock.json → skills/skills.lock.json} +11 -7
  49. package/skills/skills.yaml +34 -0
  50. package/assets/testeiya-logo-dark.svg +0 -16
  51. package/assets/testeiya-logo.svg +0 -15
  52. package/models.catalog.json +0 -6963
  53. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -120
  54. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -158
  55. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -91
  56. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -158
  57. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -90
  58. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -234
  59. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -110
  60. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -306
  61. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -352
  62. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -472
  63. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -350
  64. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -81
  65. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -206
  66. package/skills/playwright-best-practices-skill/LICENSE.md +0 -7
  67. package/skills/playwright-best-practices-skill/README.md +0 -147
  68. package/skills/playwright-best-practices-skill/SKILL.md +0 -303
  69. package/skills/playwright-best-practices-skill/advanced/authentication-flows.md +0 -360
  70. package/skills/playwright-best-practices-skill/advanced/authentication.md +0 -871
  71. package/skills/playwright-best-practices-skill/advanced/clock-mocking.md +0 -364
  72. package/skills/playwright-best-practices-skill/advanced/mobile-testing.md +0 -409
  73. package/skills/playwright-best-practices-skill/advanced/multi-context.md +0 -288
  74. package/skills/playwright-best-practices-skill/advanced/multi-user.md +0 -393
  75. package/skills/playwright-best-practices-skill/advanced/network-advanced.md +0 -452
  76. package/skills/playwright-best-practices-skill/advanced/third-party.md +0 -464
  77. package/skills/playwright-best-practices-skill/architecture/pom-vs-fixtures.md +0 -363
  78. package/skills/playwright-best-practices-skill/architecture/test-architecture.md +0 -369
  79. package/skills/playwright-best-practices-skill/architecture/when-to-mock.md +0 -383
  80. package/skills/playwright-best-practices-skill/browser-apis/browser-apis.md +0 -391
  81. package/skills/playwright-best-practices-skill/browser-apis/iframes.md +0 -403
  82. package/skills/playwright-best-practices-skill/browser-apis/service-workers.md +0 -504
  83. package/skills/playwright-best-practices-skill/browser-apis/websockets.md +0 -403
  84. package/skills/playwright-best-practices-skill/core/annotations.md +0 -424
  85. package/skills/playwright-best-practices-skill/core/assertions-waiting.md +0 -361
  86. package/skills/playwright-best-practices-skill/core/configuration.md +0 -452
  87. package/skills/playwright-best-practices-skill/core/fixtures-hooks.md +0 -417
  88. package/skills/playwright-best-practices-skill/core/global-setup.md +0 -434
  89. package/skills/playwright-best-practices-skill/core/locators.md +0 -242
  90. package/skills/playwright-best-practices-skill/core/page-object-model.md +0 -315
  91. package/skills/playwright-best-practices-skill/core/projects-dependencies.md +0 -453
  92. package/skills/playwright-best-practices-skill/core/test-data.md +0 -492
  93. package/skills/playwright-best-practices-skill/core/test-suite-structure.md +0 -361
  94. package/skills/playwright-best-practices-skill/core/test-tags.md +0 -298
  95. package/skills/playwright-best-practices-skill/debugging/console-errors.md +0 -420
  96. package/skills/playwright-best-practices-skill/debugging/debugging.md +0 -504
  97. package/skills/playwright-best-practices-skill/debugging/error-testing.md +0 -360
  98. package/skills/playwright-best-practices-skill/debugging/flaky-tests.md +0 -496
  99. package/skills/playwright-best-practices-skill/frameworks/angular.md +0 -530
  100. package/skills/playwright-best-practices-skill/frameworks/nextjs.md +0 -469
  101. package/skills/playwright-best-practices-skill/frameworks/react.md +0 -531
  102. package/skills/playwright-best-practices-skill/frameworks/vue.md +0 -574
  103. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/ci-cd.md +0 -468
  104. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/docker.md +0 -283
  105. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/github-actions.md +0 -546
  106. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/gitlab.md +0 -397
  107. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/other-providers.md +0 -521
  108. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/parallel-sharding.md +0 -371
  109. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/performance.md +0 -453
  110. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/reporting.md +0 -424
  111. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/test-coverage.md +0 -497
  112. package/skills/playwright-best-practices-skill/testing-patterns/accessibility.md +0 -359
  113. package/skills/playwright-best-practices-skill/testing-patterns/api-testing.md +0 -719
  114. package/skills/playwright-best-practices-skill/testing-patterns/browser-extensions.md +0 -506
  115. package/skills/playwright-best-practices-skill/testing-patterns/canvas-webgl.md +0 -493
  116. package/skills/playwright-best-practices-skill/testing-patterns/component-testing.md +0 -500
  117. package/skills/playwright-best-practices-skill/testing-patterns/drag-drop.md +0 -576
  118. package/skills/playwright-best-practices-skill/testing-patterns/electron.md +0 -509
  119. package/skills/playwright-best-practices-skill/testing-patterns/file-operations.md +0 -377
  120. package/skills/playwright-best-practices-skill/testing-patterns/file-upload-download.md +0 -562
  121. package/skills/playwright-best-practices-skill/testing-patterns/forms-validation.md +0 -561
  122. package/skills/playwright-best-practices-skill/testing-patterns/graphql-testing.md +0 -331
  123. package/skills/playwright-best-practices-skill/testing-patterns/i18n.md +0 -508
  124. package/skills/playwright-best-practices-skill/testing-patterns/performance-testing.md +0 -476
  125. package/skills/playwright-best-practices-skill/testing-patterns/security-testing.md +0 -430
  126. package/skills/playwright-best-practices-skill/testing-patterns/visual-regression.md +0 -634
  127. package/skills/playwright-cli/SKILL.md +0 -420
  128. package/skills/playwright-cli/references/element-attributes.md +0 -23
  129. package/skills/playwright-cli/references/playwright-tests.md +0 -39
  130. package/skills/playwright-cli/references/request-mocking.md +0 -87
  131. package/skills/playwright-cli/references/running-code.md +0 -241
  132. package/skills/playwright-cli/references/session-management.md +0 -225
  133. package/skills/playwright-cli/references/storage-state.md +0 -275
  134. package/skills/playwright-cli/references/test-generation.md +0 -433
  135. package/skills/playwright-cli/references/tracing.md +0 -139
  136. package/skills/playwright-cli/references/video-recording.md +0 -143
  137. package/skills/testeiya/README.md +0 -29
  138. package/skills/testeiya/answer-formatting/SKILL.md +0 -30
  139. package/skills/testeiya/check-cucumber/SKILL.md +0 -200
  140. package/skills/testeiya/check-tests/SKILL.md +0 -260
  141. package/skills/testeiya/manual-run-assistant/SKILL.md +0 -61
  142. package/skills/testeiya/testomatio-docs/INDEX.md +0 -175
  143. package/skills/testeiya/testomatio-docs/SKILL.md +0 -102
  144. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-agents.md +0 -144
  145. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-powered-features.md +0 -531
  146. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-requirements.md +0 -437
  147. package/skills/testeiya/testomatio-docs/docs/advanced/api-access/index.md +0 -191
  148. package/skills/testeiya/testomatio-docs/docs/advanced/branches-folder/index.md +0 -277
  149. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-demos.mdx +0 -39
  150. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-on-suite-and-test-level.md +0 -122
  151. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/what-is-bulk-edit.md +0 -170
  152. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/branches.md +0 -53
  153. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/index.mdx +0 -98
  154. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/jira-issue.md +0 -151
  155. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/runs-and-reports.md +0 -377
  156. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/work-in-jira.md +0 -267
  157. package/skills/testeiya/testomatio-docs/docs/advanced/living-doc/index.md +0 -138
  158. package/skills/testeiya/testomatio-docs/docs/advanced/milestones/index.md +0 -220
  159. package/skills/testeiya/testomatio-docs/docs/advanced/shortcuts/index.md +0 -48
  160. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/labels-and-custom-fields.md +0 -201
  161. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags-or-labels.md +0 -94
  162. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags.md +0 -243
  163. package/skills/testeiya/testomatio-docs/docs/advanced/test-artifacts/index.md +0 -135
  164. package/skills/testeiya/testomatio-docs/docs/advanced/tql/index.md +0 -394
  165. package/skills/testeiya/testomatio-docs/docs/getting-started/index.md +0 -290
  166. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/azure.md +0 -96
  167. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bamboo.md +0 -94
  168. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bitbucket.md +0 -106
  169. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/circle.md +0 -115
  170. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/github.md +0 -120
  171. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/gitlab.md +0 -88
  172. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/index.mdx +0 -151
  173. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/jenkins.md +0 -121
  174. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/teamcity.md +0 -96
  175. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/azure.md +0 -31
  176. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/clickup.md +0 -54
  177. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/confluence.md +0 -34
  178. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/github.md +0 -31
  179. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/gitlab.md +0 -93
  180. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/index.md +0 -131
  181. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/jira.md +0 -164
  182. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/linear.md +0 -29
  183. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/shortcut.md +0 -67
  184. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/youtrack.md +0 -94
  185. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/azure-devops.md +0 -53
  186. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/email.md +0 -71
  187. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/jira.md +0 -52
  188. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/ms-teams.md +0 -60
  189. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/rules.md +0 -267
  190. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/slack.md +0 -82
  191. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/telegram.md +0 -73
  192. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/index.mdx +0 -207
  193. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/okta.md +0 -204
  194. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/azure.md +0 -95
  195. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/google.md +0 -75
  196. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/index.mdx +0 -33
  197. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/okta.md +0 -108
  198. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/saml.md +0 -66
  199. package/skills/testeiya/testomatio-docs/docs/legal/compliance/gdpr.md +0 -95
  200. package/skills/testeiya/testomatio-docs/docs/legal/compliance/index.mdx +0 -94
  201. package/skills/testeiya/testomatio-docs/docs/legal/compliance/privacy.md +0 -26
  202. package/skills/testeiya/testomatio-docs/docs/legal/compliance/terms.md +0 -32
  203. package/skills/testeiya/testomatio-docs/docs/legal/security/index.mdx +0 -242
  204. package/skills/testeiya/testomatio-docs/docs/legal/security/jira.md +0 -140
  205. package/skills/testeiya/testomatio-docs/docs/legal/security/subprocessors.md +0 -76
  206. package/skills/testeiya/testomatio-docs/docs/management/company/administration.md +0 -363
  207. package/skills/testeiya/testomatio-docs/docs/management/company/audit-log.md +0 -41
  208. package/skills/testeiya/testomatio-docs/docs/management/company/plan-features-comparison.md +0 -240
  209. package/skills/testeiya/testomatio-docs/docs/management/company/subscriptions.md +0 -326
  210. package/skills/testeiya/testomatio-docs/docs/management/company/trials.md +0 -75
  211. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/accountant.md +0 -49
  212. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/index.mdx +0 -285
  213. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/read-only-user.md +0 -67
  214. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/teams.md +0 -138
  215. package/skills/testeiya/testomatio-docs/docs/management/project/settings.md +0 -87
  216. package/skills/testeiya/testomatio-docs/docs/management/project/templates.md +0 -546
  217. package/skills/testeiya/testomatio-docs/docs/project/analytics/index.md +0 -326
  218. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/classical-tests-markdown-format.md +0 -386
  219. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/download-manual-tests-as-files.md +0 -378
  220. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-obsidian.md +0 -112
  221. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-spreadsheet.md +0 -127
  222. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/auto-import.md +0 -63
  223. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Allure-TestOps.md +0 -49
  224. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-QTest.md +0 -41
  225. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Qase.md +0 -39
  226. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Zephyr.md +0 -37
  227. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-csv-xlsx.md +0 -117
  228. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-cucumber.md +0 -93
  229. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-qmetry.md +0 -44
  230. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-source-code.md +0 -117
  231. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testcaselabs.md +0 -44
  232. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testmo.md +0 -47
  233. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testrail.md +0 -82
  234. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-xray.md +0 -55
  235. package/skills/testeiya/testomatio-docs/docs/project/plans/index.md +0 -334
  236. package/skills/testeiya/testomatio-docs/docs/project/pulse/index.md +0 -104
  237. package/skills/testeiya/testomatio-docs/docs/project/runs/archive-runs-and-groups.md +0 -176
  238. package/skills/testeiya/testomatio-docs/docs/project/runs/custom-statuses.md +0 -195
  239. package/skills/testeiya/testomatio-docs/docs/project/runs/environments.md +0 -203
  240. package/skills/testeiya/testomatio-docs/docs/project/runs/managing-runs.md +0 -455
  241. package/skills/testeiya/testomatio-docs/docs/project/runs/merge-strategies.md +0 -137
  242. package/skills/testeiya/testomatio-docs/docs/project/runs/reports.md +0 -329
  243. package/skills/testeiya/testomatio-docs/docs/project/runs/rungroups.md +0 -342
  244. package/skills/testeiya/testomatio-docs/docs/project/runs/running-automated-tests.md +0 -256
  245. package/skills/testeiya/testomatio-docs/docs/project/runs/running-manual-and-automated-tests.md +0 -331
  246. package/skills/testeiya/testomatio-docs/docs/project/runs/running-tests-manually.md +0 -633
  247. package/skills/testeiya/testomatio-docs/docs/project/runs/temporary-tests-notes.md +0 -223
  248. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/snippets.md +0 -68
  249. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/steps.md +0 -181
  250. package/skills/testeiya/testomatio-docs/docs/project/tests/bdd-test-case-editor.md +0 -98
  251. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-test-case-editor.md +0 -354
  252. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-vs-bdd.md +0 -169
  253. package/skills/testeiya/testomatio-docs/docs/project/tests/copy-and-move-your-tests.md +0 -156
  254. package/skills/testeiya/testomatio-docs/docs/project/tests/other-features-for-test-case-design.md +0 -412
  255. package/skills/testeiya/testomatio-docs/docs/project/tests/test-case-creation-and-editing.md +0 -527
  256. package/skills/testeiya/testomatio-docs/docs/support/index.md +0 -75
  257. package/skills/testeiya/testomatio-docs/docs/test-reporting/artifacts.md +0 -388
  258. package/skills/testeiya/testomatio-docs/docs/test-reporting/cli.md +0 -215
  259. package/skills/testeiya/testomatio-docs/docs/test-reporting/configuration.md +0 -247
  260. package/skills/testeiya/testomatio-docs/docs/test-reporting/frameworks.md +0 -490
  261. package/skills/testeiya/testomatio-docs/docs/test-reporting/functions.md +0 -144
  262. package/skills/testeiya/testomatio-docs/docs/test-reporting/index.mdx +0 -48
  263. package/skills/testeiya/testomatio-docs/docs/test-reporting/junit.md +0 -248
  264. package/skills/testeiya/testomatio-docs/docs/test-reporting/logger.md +0 -138
  265. package/skills/testeiya/testomatio-docs/docs/test-reporting/php.md +0 -77
  266. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/bitbucket.md +0 -72
  267. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/csv.md +0 -23
  268. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/debug.md +0 -18
  269. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/github.md +0 -63
  270. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/gitlab.md +0 -29
  271. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/html.md +0 -80
  272. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/index.mdx +0 -57
  273. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/testomatio.md +0 -331
  274. package/skills/testeiya/testomatio-docs/docs/test-reporting/python.md +0 -229
  275. package/skills/testeiya/testomatio-docs/docs/test-reporting/workflows.md +0 -325
  276. package/skills/testeiya/testomatio-docs/docs/tutorials/Interacting-via-API.md +0 -159
  277. package/skills/testeiya/testomatio-docs/docs/tutorials/Manual-Testing-Classic.md +0 -164
  278. package/skills/testeiya/testomatio-docs/docs/tutorials/Set-Up-Read-Only-Access.md +0 -85
  279. package/skills/testeiya/testomatio-docs/docs/tutorials/Using-AI-in-Testing.md +0 -163
  280. package/skills/testeiya/testomatio-docs/docs/tutorials/Working-with-Jira.md +0 -125
  281. package/skills/testeiya/testomatio-docs/docs/tutorials/java.md +0 -478
  282. package/skills/testeiya/testomatio-docs/docs/tutorials/playwright.md +0 -207
  283. package/skills/testeiya/testomatio-docs/docs/tutorials/webdriver.md +0 -218
  284. package/skills/testeiya/testomatio-docs/docs.lock.json +0 -6
  285. package/skills/testeiya/testomatio-reporter/SKILL.md +0 -307
  286. package/skills/testomatio/explorbot/explorbot-fundamentals/SKILL.md +0 -88
  287. package/skills/testomatio/explorbot/explorbot-plan/SKILL.md +0 -95
  288. package/skills/testomatio/explorbot/explorbot-setup/SKILL.md +0 -334
  289. package/skills/testomatio/test-automation/automate-manual-test-cases/CLAUDE.md +0 -56
  290. package/skills/testomatio/test-automation/automate-manual-test-cases/SKILL.md +0 -242
  291. package/skills/testomatio/test-automation/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -182
  292. package/skills/testomatio/test-automation/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -22
  293. package/skills/testomatio/test-automation/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -90
  294. package/skills/testomatio/test-automation/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -53
  295. package/skills/testomatio/test-automation/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -52
  296. package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/SKILL.md +0 -107
  297. package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -113
  298. package/skills/testomatio/test-automation/qa-automation-test-consolidation/SKILL.md +0 -29
  299. package/skills/testomatio/test-automation/run-tests-with-testomatio-reporter/SKILL.md +0 -151
  300. package/skills/testomatio/test-automation/setup-pr-testing/SKILL.md +0 -199
  301. package/skills/testomatio/test-automation/testomat-allure-adapter/SKILL.md +0 -289
  302. package/skills/testomatio/test-management/detect-duplicate-test-cases/SKILL.md +0 -86
  303. package/skills/testomatio/test-management/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -54
  304. package/skills/testomatio/test-management/improve-test-cases/SKILL.md +0 -114
  305. package/skills/testomatio/test-management/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -66
  306. package/skills/testomatio/test-management/pull-request-diff-analyzer/SKILL.md +0 -141
  307. package/skills/testomatio/test-management/qa-e2e-tests-reporting/SKILL.md +0 -354
  308. package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -82
  309. package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -37
  310. package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -118
  311. package/skills/testomatio/test-management/qa-pr-requirements-analyzer/SKILL.md +0 -149
  312. package/skills/testomatio/test-management/qa-pr-requirements-analyzer/references/summary-example.md +0 -54
  313. package/skills/testomatio/test-management/qa-requirement-reviewer/SKILL.md +0 -126
  314. package/skills/testomatio/test-management/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -128
  315. package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +0 -174
  316. package/skills/testomatio/test-management/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -138
  317. package/skills/testomatio/test-management/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -65
  318. package/skills/testomatio/test-management/qa-test-code-coverage/scripts/check-coverage.mjs +0 -40
  319. package/skills/testomatio/test-management/qa-thinking/SKILL.md +0 -36
  320. package/skills/testomatio/test-management/qa-write-test-cases/SKILL.md +0 -267
  321. package/skills/testomatio/test-management/qa-write-test-cases/references/test-case-format.md +0 -387
  322. package/skills/testomatio/test-management/qa-write-test-cases/references/testomat-tms-guide.md +0 -72
  323. package/skills/testomatio/test-management/qa-write-test-cases/references/writing-rule.md +0 -159
  324. package/skills/testomatio/test-management/scan-automation-project/SKILL.md +0 -152
  325. package/skills/testomatio/test-management/sync-test-cases-with-tms/SKILL.md +0 -107
  326. package/skills/testomatio/test-management/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -140
  327. package/skills/testomatio/test-management/testomatio-mcp/SKILL.md +0 -182
  328. package/skills/testomatio/test-management/testomatio-mcp/references/MCP_SETUP.md +0 -169
  329. package/skills.yaml +0 -21
  330. package/src/ai-debug.ts +0 -188
  331. package/src/api/agent-get.ts +0 -22
  332. package/src/api/agent-start.ts +0 -384
  333. package/src/api/client-log.ts +0 -29
  334. package/src/api/context.ts +0 -332
  335. package/src/api/debug-layout.ts +0 -47
  336. package/src/api/debug-report.ts +0 -29
  337. package/src/api/debug-snapshot.ts +0 -30
  338. package/src/api/debug-stream.ts +0 -52
  339. package/src/api/files-delete.ts +0 -184
  340. package/src/api/files-read.ts +0 -41
  341. package/src/api/files-rename.ts +0 -99
  342. package/src/api/files-tree.ts +0 -292
  343. package/src/api/files-write.ts +0 -41
  344. package/src/api/mcp.ts +0 -603
  345. package/src/api/memory.ts +0 -69
  346. package/src/api/open-external.ts +0 -39
  347. package/src/api/playwright-cli.ts +0 -606
  348. package/src/api/providers.ts +0 -457
  349. package/src/api/read-env-token.ts +0 -33
  350. package/src/api/sessions.ts +0 -79
  351. package/src/api/settings.ts +0 -120
  352. package/src/api/skills.ts +0 -58
  353. package/src/api/testomatio-attachment.ts +0 -89
  354. package/src/api/testomatio-auth.ts +0 -284
  355. package/src/api/testomatio-proxy.ts +0 -197
  356. package/src/api/testomatio-run-stats.ts +0 -81
  357. package/src/api/testomatio-target.ts +0 -225
  358. package/src/api/testomatio-transcription.ts +0 -82
  359. package/src/api/workspace-search.ts +0 -96
  360. package/src/api/workspace-sync.ts +0 -151
  361. package/src/api/workspace.ts +0 -165
  362. package/src/app-server.ts +0 -556
  363. package/src/bridge.ts +0 -251
  364. package/src/check-tests.ts +0 -156
  365. package/src/cli.ts +0 -17
  366. package/src/commands.ts +0 -244
  367. package/src/config.ts +0 -183
  368. package/src/connection.ts +0 -658
  369. package/src/context-store.ts +0 -265
  370. package/src/debug-bus.ts +0 -405
  371. package/src/extensions/tool-gate.ts +0 -220
  372. package/src/extensions/webui/ask-channel.ts +0 -52
  373. package/src/extensions/webui/index.ts +0 -184
  374. package/src/extensions/webui/tools/ask-question.ts +0 -88
  375. package/src/extensions/webui/tools/query-result.ts +0 -79
  376. package/src/extensions/webui/tools/render-chart.ts +0 -53
  377. package/src/extensions/webui/tools/render-item.ts +0 -61
  378. package/src/extensions/webui/tools/render-list.ts +0 -170
  379. package/src/extensions/webui/tools/render-result.ts +0 -85
  380. package/src/extensions/webui/tools/render-tree.ts +0 -71
  381. package/src/extensions/webui/tools/ui-widget.ts +0 -54
  382. package/src/extensions/webui/tools/widget-result.ts +0 -13
  383. package/src/extensions/webui/widget-channel.ts +0 -50
  384. package/src/file-log.ts +0 -196
  385. package/src/git-tracked.ts +0 -68
  386. package/src/gitignore.ts +0 -53
  387. package/src/json-store.ts +0 -43
  388. package/src/load-env.ts +0 -70
  389. package/src/loader-style.ts +0 -96
  390. package/src/main.ts +0 -140
  391. package/src/mcp-catalog.ts +0 -96
  392. package/src/models-catalog.ts +0 -72
  393. package/src/permissions.ts +0 -120
  394. package/src/project-dir.ts +0 -189
  395. package/src/project-info.ts +0 -108
  396. package/src/prompt/app-ui.ts +0 -59
  397. package/src/prompt/browser.ts +0 -27
  398. package/src/prompt/index.ts +0 -62
  399. package/src/server-info.ts +0 -62
  400. package/src/session-factory.ts +0 -442
  401. package/src/session-store.ts +0 -115
  402. package/src/shell-env.ts +0 -45
  403. package/src/skills.ts +0 -163
  404. package/src/sync-snapshot.ts +0 -140
  405. package/src/telemetry.ts +0 -239
  406. package/src/testomatio-auth.ts +0 -299
  407. package/src/testomatio.ts +0 -98
  408. package/src/theme.ts +0 -30
  409. package/src/user-env.ts +0 -94
  410. package/src/welcome.ts +0 -194
  411. package/src/workspace/safe-path.ts +0 -85
  412. package/src/workspace/test-md.ts +0 -70
  413. package/src/workspace-model.ts +0 -440
  414. package/testeiya.config.json +0 -14
@@ -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
- }