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,62 +0,0 @@
1
- import { getSystemPrompt } from "./system-prompt.js";
2
- import {
3
- testomatioTms,
4
- testomatioConnection,
5
- testomatioNotConnected,
6
- projectSettings,
7
- } from "./testomatio.js";
8
- import { appUiGuidance } from "./app-ui.js";
9
- import { browserControl } from "./browser.js";
10
- import {
11
- contextPromptSection,
12
- type ContextEntry,
13
- type ContextFolder,
14
- } from "../context-store.js";
15
- import type { TestomatioProjectInfo } from "../project-info.js";
16
-
17
- export function buildSystemPrompt(options?: SystemPromptOptions): string {
18
- // The base prompt (role, workspace, tools, goals) comes first — it defines who
19
- // the agent is. Specialized rules layer on after it, dynamic context goes last.
20
- const parts: string[] = [getSystemPrompt(options?.cwd)];
21
-
22
- const tokenSlugs = options?.tokens ? Object.keys(options.tokens) : [];
23
- // The TUI passes no `connection`, so it keeps the managed-tokens gating.
24
- const tokenAvailable = options?.connection?.tokenAvailable ?? tokenSlugs.length > 0;
25
- if (tokenSlugs.length > 0) parts.push(testomatioTms);
26
- if (options?.mode === "web") parts.push(appUiGuidance);
27
- if (options?.browser) parts.push(browserControl);
28
-
29
- if (options?.promptContext) {
30
- parts.push(`## Project Test Context\n\n${options.promptContext}`);
31
- }
32
- if (options?.contextEntries?.length || options?.contextFolders?.length) {
33
- parts.push(
34
- contextPromptSection(options.contextEntries ?? [], options.contextFolders ?? [])
35
- );
36
- }
37
- if (options?.projectInfo) {
38
- parts.push(projectSettings(options.projectInfo));
39
- }
40
- if (tokenAvailable || tokenSlugs.length > 0) {
41
- parts.push(testomatioConnection(tokenSlugs, options?.backendUrl, options?.connection));
42
- } else if (options?.mode === "web") {
43
- parts.push(testomatioNotConnected());
44
- }
45
-
46
- return parts.join("\n\n");
47
- }
48
-
49
- export interface SystemPromptOptions {
50
- cwd?: string;
51
- promptContext?: string;
52
- backendUrl?: string;
53
- tokens?: Record<string, string>;
54
- connection?: { tokenAvailable?: boolean; projectId?: string; title?: string };
55
- mode?: "tui" | "web";
56
- browser?: boolean;
57
- projectInfo?: TestomatioProjectInfo | null;
58
- /** User-added context (linked folders, cloned repos, uploaded docs). */
59
- contextEntries?: ContextEntry[];
60
- /** Non-empty predefined `.testeiya` context folders (manual-tests, code, …). */
61
- contextFolders?: ContextFolder[];
62
- }
@@ -1,62 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { HOME_DIR } from "./project-dir.js";
4
-
5
- /*
6
- * Publishes where the running app-server is reachable so an out-of-band tool
7
- * (the `testeiya-debug` skill, `scripts/debug-snapshot.ts`) can find it — the
8
- * desktop app binds a random free port (`port: 0`) that is otherwise written
9
- * nowhere. `writeServerInfo` is called once the port is known; the file is
10
- * best-effort removed on exit. Only the latest instance is recorded.
11
- */
12
-
13
- export const SERVER_INFO_FILE = join(HOME_DIR, "server.json");
14
-
15
- export function writeServerInfo(info: ServerInfo): void {
16
- try {
17
- if (!existsSync(HOME_DIR)) mkdirSync(HOME_DIR, { recursive: true });
18
- writeFileSync(SERVER_INFO_FILE, JSON.stringify(info, null, 2));
19
- } catch {}
20
- for (const signal of ["exit", "SIGINT", "SIGTERM"] as const) {
21
- process.once(signal, clearServerInfo);
22
- }
23
- }
24
-
25
- export function readServerInfo(): ServerInfo | null {
26
- let info: ServerInfo;
27
- try {
28
- if (!existsSync(SERVER_INFO_FILE)) return null;
29
- info = JSON.parse(readFileSync(SERVER_INFO_FILE, "utf8")) as ServerInfo;
30
- } catch {
31
- return null;
32
- }
33
- // A server killed with SIGKILL (or a crash) never runs the exit cleanup, so a
34
- // stale file can point at a dead port. Ignore it unless its pid is alive.
35
- if (!isProcessAlive(info.pid)) return null;
36
- return info;
37
- }
38
-
39
- function isProcessAlive(pid: number): boolean {
40
- if (!pid) return false;
41
- try {
42
- process.kill(pid, 0);
43
- return true;
44
- } catch (err) {
45
- return (err as { code?: string })?.code === "EPERM";
46
- }
47
- }
48
-
49
- function clearServerInfo(): void {
50
- try {
51
- rmSync(SERVER_INFO_FILE, { force: true });
52
- } catch {}
53
- }
54
-
55
- export interface ServerInfo {
56
- port: number;
57
- pid: number;
58
- url: string;
59
- mode: string;
60
- startedAt: string;
61
- logFile?: string | null;
62
- }
@@ -1,442 +0,0 @@
1
- import { join } from "node:path";
2
- import { mkdirSync } from "node:fs";
3
-
4
- import {
5
- createAgentSession,
6
- AuthStorage,
7
- ModelRegistry,
8
- Settings,
9
- SessionManager,
10
- } from "@oh-my-pi/pi-coding-agent";
11
- import type { ExtensionFactory } from "@oh-my-pi/pi-coding-agent";
12
- import { hasPlaywrightCli, loadBundledSkills, loadCustomSkills, dedupeSkillsByName } from "./skills.js";
13
- import { SOURCE_PATHS } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
14
- import { DEFAULT_MODEL_PER_PROVIDER } from "@oh-my-pi/pi-ai";
15
- import { PROJECT_DIR, HOME_DIR, ensureProjectDirGuards } from "./project-dir.js";
16
-
17
- // Rebrand the SDK's project-level config dir from `.omp` to `.testeiya`.
18
- // The SDK has no supported override for this (PI_CONFIG_DIR only affects the
19
- // user-level config root; `SOURCE_PATHS.native.projectDir` is a static const
20
- // with no env/option hook). This is a deliberate in-process monkey patch:
21
- // - `SOURCE_PATHS` is a plain object (`as const` is TS-only, not frozen),
22
- // - the builtin discovery provider holds a *live reference* via
23
- // `const PATHS = SOURCE_PATHS.native` and reads `.projectDir` at call time,
24
- // - so mutating it once at module load (before any createAgentSession() runs)
25
- // redirects MCP/skills/rules/AGENTS discovery to `<cwd>/.testeiya/*`.
26
- // No node_modules edits; survives reinstalls. If an SDK upgrade changes these
27
- // internals, the MCP-connectivity check in our session smoke test is the guard.
28
- if (SOURCE_PATHS.native.projectDir !== PROJECT_DIR) {
29
- (SOURCE_PATHS.native as { projectDir: string }).projectDir = PROJECT_DIR;
30
- }
31
-
32
- // Companion monkey patch: overlay the live TESTOMATIO* env vars onto the SDK's
33
- // (frozen-after-first-use) shell env so agent bash commands always run with the
34
- // current session's Testomat.io credentials. See shell-env.ts.
35
- import "./shell-env.js";
36
-
37
- // Every discovery provider that loads MCP configs from another tool
38
- // (Cursor, Claude, VSCode, etc.) or from arbitrary project-root files.
39
- // We keep only `builtin` — it reads our per-session `<cwd>/.testeiya/mcp.json`.
40
- const OTHER_MCP_PROVIDERS = [
41
- "mcp-json",
42
- "cursor",
43
- "claude",
44
- "claude-plugins",
45
- "codex",
46
- "gemini",
47
- "opencode",
48
- "vscode",
49
- "windsurf",
50
- ];
51
-
52
- // The SDK's bash tool runs on the brush shell, where a heredoc inside $(...)
53
- // intermittently fails with a bogus "syntax error near token" — and
54
- // `playwright-cli run-code` snippets have no Node globals. Both failures are
55
- // cryptic and cost the model several retries; intercept them with an
56
- // actionable message instead. Replaces the SDK's default rules (cat/grep/find
57
- // redirects), which we don't want.
58
- const BASH_GUARD_RULES = [
59
- {
60
- pattern: "\\$\\((?!\\()[^)\\n]*<<",
61
- tool: "write",
62
- message:
63
- "Heredocs inside $(...) command substitution are unreliable in this shell. " +
64
- "Write the script to a file with the write tool and run it, or use a " +
65
- "single-line node -e / node -p. Top-level heredocs (not inside $(...)) work fine.",
66
- },
67
- {
68
- pattern: "playwright-cli\\s+run-code[\\s\\S]*process\\.env",
69
- tool: "bash",
70
- message:
71
- "playwright-cli run-code executes in a browser sandbox — process.env and " +
72
- "other Node globals are not available there. Read the values in bash first " +
73
- "and interpolate them into the snippet.",
74
- },
75
- ];
76
-
77
- import { loadConfig, type TesteiyaConfig } from "./config.js";
78
- import { listContext, listContextFolders } from "./context-store.js";
79
- import { resolveProjectInfo } from "./project-info.js";
80
- import { buildSystemPrompt } from "./prompt/index.js";
81
- import { createPermissionExtension } from "./permissions.js";
82
- import type { AskChannel } from "./extensions/webui/ask-channel.js";
83
- import type { WidgetCommandChannel } from "./extensions/webui/widget-channel.js";
84
- import { createCommandsExtension, type CommandsRuntime } from "./commands.js";
85
- import { createToolGateExtension, type ToolGateRuntime } from "./extensions/tool-gate.js";
86
- import { createTelemetryExtension, isTelemetryEnabled } from "./telemetry.js";
87
-
88
- /** Derive API key env var name from provider name (e.g., "openrouter" -> "OPENROUTER_API_KEY") */
89
- function getApiKeyEnvVar(providerName: string): string {
90
- return `${providerName.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_API_KEY`;
91
- }
92
-
93
- export interface SessionOptions {
94
- cwd?: string;
95
- projectIds?: string[];
96
- promptContext?: string;
97
- backendUrl?: string;
98
- tokens?: Record<string, string>;
99
- /**
100
- * How this workspace's Testomat.io credentials were resolved (connection.ts):
101
- * whether a token is exported to the shell env, and the linked project's
102
- * id/title when known. Drives the system-prompt guidance for sessions that
103
- * have no managed `tokens` (linked folders, `.env`, mcp.json).
104
- */
105
- connection?: { tokenAvailable?: boolean; projectId?: string; title?: string };
106
- /** The session's Testomat.io projects (from the session store), when managed. */
107
- projects?: { slug: string; title: string; status: "ok" | "error" }[];
108
- /**
109
- * Which frontend is driving this session.
110
- * - "tui" → activates Pi's built-in `ask` tool via `hasUI: true`; no
111
- * web-UI tools are registered.
112
- * - "web" → loads the `webui` extension (render_list / render_tree /
113
- * render_item / ask_question + tool_result UI notices) and
114
- * leaves `hasUI` off so the built-in `ask` isn't created.
115
- * Default: "tui".
116
- */
117
- mode?: "tui" | "web";
118
- /**
119
- * Resume an existing SDK conversation transcript (by its `SessionManager` id)
120
- * so new turns append to that file with full prior context. When omitted, a
121
- * fresh conversation is created.
122
- */
123
- resumeConversationId?: string;
124
- /**
125
- * The user deliberately opened this workspace (folder picker,
126
- * `TESTEIYA_WORKSPACE`, or the terminal CLI cwd), so the agent gets full
127
- * read/write/bash access instead of the default read-only gating.
128
- */
129
- trusted?: boolean;
130
- [key: string]: unknown;
131
- }
132
-
133
- export async function createTesteiyaSession(options?: SessionOptions) {
134
- const config = loadConfig();
135
- const cwd = options?.cwd ?? process.cwd();
136
- const agentDir = HOME_DIR;
137
-
138
- mkdirSync(agentDir, { recursive: true });
139
-
140
- const settings = await Settings.init({ cwd, agentDir });
141
- const existing = new Set((settings.get("disabledProviders") ?? []) as string[]);
142
- for (const id of OTHER_MCP_PROVIDERS) existing.add(id);
143
- settings.set("disabledProviders", Array.from(existing));
144
-
145
- // Per-project autonomous memory: the SDK extracts durable signal from this
146
- // workspace's past session transcripts, consolidates it under
147
- // `~/.testeiya/memories/state/--<cwd>--/`, and auto-injects a summary into the
148
- // system prompt of future sessions for the same `cwd`. On by default; the user
149
- // toggles it in Settings (persisted to config.json). Our sessions are persisted
150
- // and run at taskDepth 0, so this flag is all that gates activation.
151
- settings.set("memories.enabled", config.memoryEnabled);
152
-
153
- settings.set("bashInterceptor.enabled", true);
154
- settings.set("bashInterceptor.patterns", BASH_GUARD_RULES);
155
-
156
- // Resolve the active model via the SDK's ModelRegistry. The provider + model
157
- // are chosen in the Providers & Models UI and persisted to
158
- // ~/.testeiya/config.json; for dev/CI we still honor the provider's env var
159
- // (e.g. OPENROUTER_API_KEY). The registry knows each provider's real
160
- // transport (anthropic-messages, openai-codex-responses, google-gemini-cli,
161
- // openai-completions, …) and discovers models live — so we no longer hardcode
162
- // a single provider/api here.
163
- const providerName = config.provider.name;
164
- const apiKeyEnvVar = getApiKeyEnvVar(providerName);
165
-
166
- const authStorage = await AuthStorage.create(join(agentDir, "auth.json"));
167
- // `create()` doesn't load persisted credentials into memory — reload so a
168
- // signed-in subscription / saved API key is actually visible (otherwise only
169
- // env-var keys resolve).
170
- await authStorage.reload();
171
- const envKey = process.env[apiKeyEnvVar];
172
- if (envKey) {
173
- authStorage.setRuntimeApiKey(providerName, envKey);
174
- }
175
-
176
- const modelRegistry = new ModelRegistry(authStorage);
177
-
178
- // Resolution: (1) bundled lookup, (2) after live discovery, (3) the provider's
179
- // SDK default model, (4) legacy custom OpenAI-compatible provider via baseUrl.
180
- let model =
181
- modelRegistry.find(providerName, config.provider.model) ?? undefined;
182
- if (!model) {
183
- try {
184
- await modelRegistry.refreshProvider(providerName, "online-if-uncached");
185
- } catch {
186
- // Discovery is best-effort; fall through to the remaining strategies.
187
- }
188
- model =
189
- modelRegistry.find(providerName, config.provider.model) ?? undefined;
190
- }
191
- if (!model) {
192
- const fallbackId = (
193
- DEFAULT_MODEL_PER_PROVIDER as Record<string, string>
194
- )[providerName];
195
- if (fallbackId) {
196
- model = modelRegistry.find(providerName, fallbackId) ?? undefined;
197
- }
198
- }
199
- const isKnownProvider =
200
- providerName in (DEFAULT_MODEL_PER_PROVIDER as Record<string, unknown>);
201
- if (!model && config.provider.baseUrl && !isKnownProvider) {
202
- // Back-compat: a custom OpenAI-compatible provider defined purely via
203
- // config.baseUrl (not one the SDK ships). Guarded to known providers so a
204
- // stale baseUrl can't mis-register e.g. openai-codex as openai-completions.
205
- const apiKey = await authStorage.getApiKey(providerName);
206
- if (apiKey) {
207
- modelRegistry.registerProvider(providerName, {
208
- baseUrl: config.provider.baseUrl,
209
- api: "openai-completions",
210
- apiKey,
211
- models: [
212
- {
213
- id: config.provider.model,
214
- name: config.provider.model,
215
- reasoning: false,
216
- input: ["text"] as ("text" | "image")[],
217
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
218
- contextWindow: config.provider.contextWindow,
219
- maxTokens: config.provider.maxTokens,
220
- },
221
- ],
222
- });
223
- model =
224
- modelRegistry.find(providerName, config.provider.model) ?? undefined;
225
- }
226
- }
227
- if (!model) {
228
- throw new Error(
229
- `Could not resolve model "${config.provider.model}" for provider ` +
230
- `"${providerName}". Pick a model in the Providers & Models dialog.`
231
- );
232
- }
233
-
234
- // Pre-flight credential check so we surface a clean "add a key / sign in"
235
- // message instead of failing on the first prompt. Keyless providers (ollama,
236
- // lm-studio, …) return the SDK's no-auth sentinel, so they pass.
237
- const credential = await modelRegistry.getApiKeyForProvider(providerName);
238
- if (!credential) {
239
- throw new Error(
240
- `Missing API key for "${providerName}". Open the Providers & Models ` +
241
- `dialog and add your ${providerName} API key or sign in, or set the ` +
242
- `${apiKeyEnvVar} environment variable.`
243
- );
244
- }
245
-
246
- // The linked project's settings (framework, labels, tags, CI profiles, …) —
247
- // the `.testeiya/project-info.json` cache written on project select, refreshed
248
- // here when stale and credentials resolve. Best-effort: null just omits the
249
- // prompt section.
250
- const projectInfo = await resolveProjectInfo(cwd, {
251
- tokens: options?.tokens,
252
- backendUrl: options?.backendUrl,
253
- projects: options?.projects ?? [],
254
- });
255
-
256
- // Backfill the `.gitignore`/`.ignore` guard pair for workspaces whose
257
- // `.testeiya` predates the `.ignore` search whitelist.
258
- ensureProjectDirGuards(cwd);
259
-
260
- // Gate the browser-automation guidance on whether the @playwright/cli tool is
261
- // actually installed (the playwright-cli skill itself is vendored from GitHub).
262
- const systemPrompt = buildSystemPrompt({
263
- cwd,
264
- promptContext: options?.promptContext,
265
- tokens: options?.tokens,
266
- backendUrl: options?.backendUrl,
267
- connection: options?.connection,
268
- mode: options?.mode,
269
- browser: hasPlaywrightCli(),
270
- projectInfo,
271
- contextEntries: listContext(cwd),
272
- contextFolders: listContextFolders(cwd),
273
- });
274
-
275
- // Load skills: the prebuilt skills vendored from GitHub into cli/skills
276
- // (Testomat.io, CodeceptJS, Playwright) + the user's custom skills (global
277
- // ~/.testeiya/skills and this workspace's .testeiya/skills). Deduped by name
278
- // so a custom skill can override a bundled one and the SDK never receives two
279
- // skills of one name.
280
- const skills = dedupeSkillsByName([
281
- ...loadBundledSkills(),
282
- ...loadCustomSkills(cwd),
283
- ]);
284
-
285
- const mode = options?.mode ?? "tui";
286
-
287
- // The commands extension needs the MCP manager (created below with the
288
- // session) to live-connect servers from /connect — pass a mutable runtime
289
- // and fill it in after createAgentSession returns.
290
- const commandsRuntime: CommandsRuntime = { cwd };
291
- const toolGateRuntime: ToolGateRuntime = {};
292
- const extensions: ExtensionFactory[] = [
293
- createPermissionExtension(config, cwd, options?.trusted) as ExtensionFactory,
294
- createCommandsExtension(commandsRuntime),
295
- createToolGateExtension(toolGateRuntime, config.toolGate),
296
- ];
297
- let askChannel: AskChannel | undefined;
298
- let widgetChannel: WidgetCommandChannel | undefined;
299
- if (mode === "web") {
300
- const { createWebUIExtension, AskChannel, WidgetCommandChannel } = await import(
301
- "./extensions/webui/index.js"
302
- );
303
- askChannel = new AskChannel();
304
- widgetChannel = new WidgetCommandChannel();
305
- extensions.push(createWebUIExtension(askChannel, widgetChannel));
306
- }
307
-
308
- if (isTelemetryEnabled()) {
309
- extensions.push(
310
- createTelemetryExtension({
311
- cwd,
312
- mode,
313
- modelId: model.id,
314
- provider: model.provider,
315
- projectIds: options?.projectIds,
316
- }),
317
- );
318
- }
319
-
320
- // Own the SessionManager so we control the conversation id (returned to the
321
- // UI) and can resume a chosen transcript. Same default dir the SDK would pick.
322
- const sessionDir = SessionManager.getDefaultSessionDir(cwd, agentDir);
323
- const sessionManager = await resolveSessionManager(
324
- cwd,
325
- sessionDir,
326
- options?.resumeConversationId,
327
- );
328
-
329
- // Create session
330
- const result = await createAgentSession({
331
- cwd,
332
- agentDir,
333
- settings,
334
- model,
335
- sessionManager,
336
- // Cast to the SDK's ThinkingLevel: its non-"off" members are nominal
337
- // `const enum Effort` values, but the runtime strings are identical to our
338
- // config union, so this is safe (and self-maintaining via Parameters<>).
339
- thinkingLevel: config.thinkingLevel as NonNullable<
340
- Parameters<typeof createAgentSession>[0]
341
- >["thinkingLevel"],
342
- authStorage,
343
- modelRegistry,
344
- systemPrompt,
345
- skills,
346
- extensions,
347
- hasUI: mode === "tui",
348
- disableExtensionDiscovery: true,
349
- enableMCP: true,
350
- enableLsp: false,
351
- // Intentionally no `toolNames` filter — pi-coding-agent treats it as a
352
- // whitelist and would hide all discovered MCP tools. We rely on MCP server
353
- // configs in `<cwd>/.testeiya/mcp.json` and the permission extension to gate
354
- // dangerous calls instead.
355
- });
356
-
357
- commandsRuntime.mcpManager = result.mcpManager;
358
- toolGateRuntime.mcpManager = result.mcpManager;
359
- initExtensionRunner(result.session);
360
-
361
- return {
362
- ...result,
363
- model,
364
- config,
365
- agentDir,
366
- params: options,
367
- askChannel,
368
- widgetChannel,
369
- conversationId: sessionManager.getSessionId(),
370
- };
371
- }
372
-
373
- async function resolveSessionManager(
374
- cwd: string,
375
- sessionDir: string,
376
- resumeConversationId?: string,
377
- ): Promise<SessionManager> {
378
- if (!resumeConversationId) return SessionManager.create(cwd, sessionDir);
379
- const infos = await SessionManager.list(cwd, sessionDir);
380
- const match = infos.find((i) => i.id === resumeConversationId);
381
- if (!match) return SessionManager.create(cwd, sessionDir);
382
- return SessionManager.open(match.path, sessionDir);
383
- }
384
-
385
- // The SDK wires extension runtime *actions* (setActiveTools, sendMessage, …)
386
- // only from its own mode controllers (print/interactive/rpc). Testeiya drives
387
- // the session directly, so without this call every action method throws
388
- // ExtensionRuntimeNotInitializedError forever. Mirrors print-mode.ts.
389
- function initExtensionRunner(sessionValue: unknown): void {
390
- const session = sessionValue as any;
391
- const runner = session?.extensionRunner;
392
- if (!runner) return;
393
- runner.initialize(
394
- {
395
- sendMessage: (message: unknown, options: unknown) => {
396
- session.sendCustomMessage(message, options).catch((e: any) => {
397
- console.warn("[ext] sendMessage failed:", e?.message ?? e);
398
- });
399
- },
400
- sendUserMessage: (content: unknown, options: unknown) => {
401
- session.sendUserMessage(content, options).catch((e: any) => {
402
- console.warn("[ext] sendUserMessage failed:", e?.message ?? e);
403
- });
404
- },
405
- appendEntry: (customType: string, data: unknown) =>
406
- session.sessionManager.appendCustomEntry(customType, data),
407
- setLabel: (targetId: string, label: unknown) =>
408
- session.sessionManager.appendLabelChange(targetId, label),
409
- getActiveTools: () => session.getActiveToolNames(),
410
- getAllTools: () => session.getAllToolNames(),
411
- setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
412
- getCommands: () => [],
413
- setModel: async (model: unknown) => {
414
- const key = await session.modelRegistry.getApiKey(model);
415
- if (!key) return false;
416
- await session.setModel(model);
417
- return true;
418
- },
419
- getThinkingLevel: () => session.thinkingLevel,
420
- setThinkingLevel: (level: unknown) => session.setThinkingLevel(level),
421
- },
422
- {
423
- getModel: () => session.model,
424
- getSearchDb: () => session.searchDb,
425
- isIdle: () => !session.isStreaming,
426
- abort: () => session.abort(),
427
- hasPendingMessages: () => session.queuedMessageCount > 0,
428
- shutdown: () => {},
429
- getContextUsage: () => session.getContextUsage(),
430
- getSystemPrompt: () => session.systemPrompt,
431
- compact: async (instructionsOrOptions: unknown) => {
432
- const instructions =
433
- typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
434
- const options =
435
- instructionsOrOptions && typeof instructionsOrOptions === "object"
436
- ? instructionsOrOptions
437
- : undefined;
438
- await session.compact(instructions, options);
439
- },
440
- }
441
- );
442
- }
@@ -1,115 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import os from "node:os";
4
- import { HOME_DIR } from "./project-dir.js";
5
-
6
- const SESSIONS_FILE = path.join(HOME_DIR, "sessions.json");
7
- const MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
8
-
9
- export interface StoredSession {
10
- sessionId: string;
11
- cwd: string;
12
- promptContext: string;
13
- backendUrl?: string;
14
- tokens?: Record<string, string>;
15
- /** The user explicitly opened this folder, so the agent may write to it. */
16
- trusted?: boolean;
17
- projects: {
18
- slug: string;
19
- title: string;
20
- status: "ok" | "error";
21
- fileCount?: number;
22
- error?: string;
23
- }[];
24
- createdAt: number;
25
- }
26
-
27
- // The server is single-process, so the parsed array lives in module memory and
28
- // each exported mutation is one synchronous read→modify→write with no `await`
29
- // between — that makes it an atomic critical section. If you ever add an `await`
30
- // inside a mutation, reintroduce serialization (an in-process async mutex).
31
- let cache: StoredSession[] | null = null;
32
-
33
- function readAll(): StoredSession[] {
34
- if (cache) return cache;
35
- try {
36
- cache = JSON.parse(fs.readFileSync(SESSIONS_FILE, "utf-8"));
37
- } catch {
38
- cache = [];
39
- }
40
- return cache!;
41
- }
42
-
43
- function writeAll(sessions: StoredSession[]): void {
44
- cache = sessions;
45
- const dir = path.dirname(SESSIONS_FILE);
46
- if (!fs.existsSync(dir)) {
47
- fs.mkdirSync(dir, { recursive: true });
48
- }
49
- const tmp = `${SESSIONS_FILE}.${process.pid}.tmp`;
50
- // 0600 — holds plaintext project API tokens; rename preserves the mode.
51
- fs.writeFileSync(tmp, JSON.stringify(sessions, null, 2), { mode: 0o600 });
52
- fs.renameSync(tmp, SESSIONS_FILE);
53
- }
54
-
55
- export function createSession(
56
- data: Omit<StoredSession, "createdAt">
57
- ): StoredSession {
58
- const session: StoredSession = { ...data, createdAt: Date.now() };
59
- const sessions = pruneExpired(readAll());
60
- sessions.push(session);
61
- writeAll(sessions);
62
- return session;
63
- }
64
-
65
- export function getSession(sessionId: string): StoredSession | null {
66
- const sessions = readAll();
67
- return sessions.find((s) => s.sessionId === sessionId) ?? null;
68
- }
69
-
70
- /** Most-recent live session rooted at `cwd`, if any (used to reuse a workspace). */
71
- export function getSessionByCwd(cwd: string): StoredSession | null {
72
- cleanExpiredSessions();
73
- const sessions = readAll();
74
- const match = sessions.filter((s) => s.cwd === cwd);
75
- if (match.length === 0) return null;
76
- return match.reduce((a, b) => (b.createdAt > a.createdAt ? b : a));
77
- }
78
-
79
- export function deleteSession(sessionId: string): void {
80
- const sessions = readAll();
81
- writeAll(sessions.filter((s) => s.sessionId !== sessionId));
82
- }
83
-
84
- export function cleanExpiredSessions(maxAgeMs = MAX_AGE_MS): void {
85
- const sessions = readAll();
86
- const alive = pruneExpired(sessions, maxAgeMs);
87
- if (alive.length !== sessions.length) writeAll(alive);
88
- }
89
-
90
- // Returns the still-alive sessions, deleting on disk ONLY Testeiya's own
91
- // ephemeral temp workspaces. Persistent per-project dirs (~/.testeiya/workspaces)
92
- // and folders the user opened are NOT ours to remove — wiping them on a 24h TTL
93
- // would destroy data.
94
- function pruneExpired(
95
- sessions: StoredSession[],
96
- maxAgeMs = MAX_AGE_MS
97
- ): StoredSession[] {
98
- const now = Date.now();
99
- const alive: StoredSession[] = [];
100
- const tmpRoot = os.tmpdir() + path.sep;
101
- for (const session of sessions) {
102
- if (now - session.createdAt <= maxAgeMs) {
103
- alive.push(session);
104
- continue;
105
- }
106
- if (session.cwd.startsWith(tmpRoot)) {
107
- try {
108
- fs.rmSync(session.cwd, { recursive: true, force: true });
109
- } catch {
110
- // ignore cleanup errors
111
- }
112
- }
113
- }
114
- return alive;
115
- }