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