testeiya 0.2.1 → 0.3.1-5.1

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 (405) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -171
  3. package/dist/prompt/context.js +79 -0
  4. package/dist/prompt/context.js.map +1 -0
  5. package/dist/prompt/index.js +60 -0
  6. package/dist/prompt/index.js.map +1 -0
  7. package/dist/prompt/print.js +30 -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} +38 -25
  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 +70 -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 +224 -0
  20. package/dist/src/args.js.map +1 -0
  21. package/dist/src/cli.js +105 -0
  22. package/dist/src/cli.js.map +1 -0
  23. package/dist/src/doctor.js +171 -0
  24. package/dist/src/doctor.js.map +1 -0
  25. package/dist/src/env.js +103 -0
  26. package/dist/src/env.js.map +1 -0
  27. package/dist/src/mcp-extension.js +9 -0
  28. package/dist/src/mcp-extension.js.map +1 -0
  29. package/dist/src/mcp.js +139 -0
  30. package/dist/src/mcp.js.map +1 -0
  31. package/dist/src/model.js +71 -0
  32. package/dist/src/model.js.map +1 -0
  33. package/dist/src/models.js +38 -0
  34. package/dist/src/models.js.map +1 -0
  35. package/dist/src/output.js +216 -0
  36. package/dist/src/output.js.map +1 -0
  37. package/dist/src/result.js +41 -0
  38. package/dist/src/result.js.map +1 -0
  39. package/dist/src/run.js +313 -0
  40. package/dist/src/run.js.map +1 -0
  41. package/dist/src/session.js +98 -0
  42. package/dist/src/session.js.map +1 -0
  43. package/dist/src/sessions.js +72 -0
  44. package/dist/src/sessions.js.map +1 -0
  45. package/dist/src/skills.js +130 -0
  46. package/dist/src/skills.js.map +1 -0
  47. package/dist/vendor/mcp.js +14801 -0
  48. package/mcp-tools.json +2967 -0
  49. package/package.json +34 -43
  50. package/prompt/context.ts +101 -0
  51. package/prompt/index.ts +102 -0
  52. package/prompt/print.ts +32 -0
  53. package/prompt/project-info.ts +30 -0
  54. package/prompt/system-prompt.ts +187 -0
  55. package/{src/prompt → prompt}/testomatio.ts +120 -9
  56. package/prompt/tools.ts +72 -0
  57. package/prompt/vocab.ts +7 -0
  58. package/skills/codeceptjs/ci-fix-tests/SKILL.md +7 -8
  59. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +47 -64
  60. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +56 -47
  61. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +144 -106
  62. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +50 -57
  63. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +88 -196
  64. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +4 -5
  65. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +25 -36
  66. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +23 -36
  67. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +23 -36
  68. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +23 -35
  69. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +50 -53
  70. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +87 -191
  71. package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/SKILL.md +1 -1
  72. package/{skills.lock.json → skills/skills.lock.json} +45 -37
  73. package/skills/skills.yaml +35 -0
  74. package/skills/testomatio/explorbot/explorbot-fundamentals/SKILL.md +49 -61
  75. package/skills/testomatio/explorbot/explorbot-fundamentals/references/no-install.md +36 -0
  76. package/skills/testomatio/explorbot/explorbot-plan/SKILL.md +20 -7
  77. package/skills/testomatio/explorbot/explorbot-setup/SKILL.md +41 -289
  78. package/skills/testomatio/explorbot/prima/SKILL.md +87 -0
  79. package/skills/testomatio/qa-process/qa-explain-behavior/SKILL.md +111 -0
  80. package/skills/testomatio/qa-process/qa-explain-behavior/references/answer-shapes.md +116 -0
  81. package/skills/testomatio/qa-process/qa-explain-behavior/references/examples.md +157 -0
  82. package/skills/testomatio/qa-process/qa-lead-strategy-advisor/SKILL.md +91 -0
  83. package/skills/testomatio/qa-process/qa-lead-strategy-advisor/references/output-format.md +71 -0
  84. package/skills/testomatio/qa-process/testing-workflow/SKILL.md +227 -0
  85. package/skills/testomatio/test-automation/qa-data-seeder/SKILL.md +83 -0
  86. package/skills/testomatio/test-automation/run-tests-with-testomatio-reporter/SKILL.md +5 -3
  87. package/skills/testomatio/test-automation/setup-change-aware-pr-testing/SKILL.md +190 -0
  88. package/skills/testomatio/test-automation/setup-ci-automation/SKILL.md +76 -0
  89. package/skills/testomatio/test-management/qa-split-testing-levels-pyramid/SKILL.md +55 -0
  90. package/skills/testomatio/test-management/qa-sprint-report-by-testomatio/SKILL.md +220 -0
  91. package/skills/testomatio/test-management/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +126 -0
  92. package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +1 -1
  93. package/skills/testomatio/test-management/qa-thinking/SKILL.md +25 -25
  94. package/skills/testomatio/test-management/testomatio-mcp/SKILL.md +14 -1
  95. package/skills/testomatio/test-management/testomatio-mcp/references/MCP_SETUP.md +8 -0
  96. package/assets/testeiya-logo-dark.svg +0 -16
  97. package/assets/testeiya-logo.svg +0 -15
  98. package/models.catalog.json +0 -6963
  99. package/skills/playwright-best-practices-skill/LICENSE.md +0 -7
  100. package/skills/playwright-best-practices-skill/README.md +0 -147
  101. package/skills/testeiya/README.md +0 -29
  102. package/skills/testeiya/answer-formatting/SKILL.md +0 -30
  103. package/skills/testeiya/check-cucumber/SKILL.md +0 -200
  104. package/skills/testeiya/check-tests/SKILL.md +0 -260
  105. package/skills/testeiya/manual-run-assistant/SKILL.md +0 -61
  106. package/skills/testeiya/testomatio-docs/INDEX.md +0 -175
  107. package/skills/testeiya/testomatio-docs/SKILL.md +0 -102
  108. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-agents.md +0 -144
  109. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-powered-features.md +0 -531
  110. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-requirements.md +0 -437
  111. package/skills/testeiya/testomatio-docs/docs/advanced/api-access/index.md +0 -191
  112. package/skills/testeiya/testomatio-docs/docs/advanced/branches-folder/index.md +0 -277
  113. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-demos.mdx +0 -39
  114. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-on-suite-and-test-level.md +0 -122
  115. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/what-is-bulk-edit.md +0 -170
  116. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/branches.md +0 -53
  117. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/index.mdx +0 -98
  118. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/jira-issue.md +0 -151
  119. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/runs-and-reports.md +0 -377
  120. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/work-in-jira.md +0 -267
  121. package/skills/testeiya/testomatio-docs/docs/advanced/living-doc/index.md +0 -138
  122. package/skills/testeiya/testomatio-docs/docs/advanced/milestones/index.md +0 -220
  123. package/skills/testeiya/testomatio-docs/docs/advanced/shortcuts/index.md +0 -48
  124. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/labels-and-custom-fields.md +0 -201
  125. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags-or-labels.md +0 -94
  126. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags.md +0 -243
  127. package/skills/testeiya/testomatio-docs/docs/advanced/test-artifacts/index.md +0 -135
  128. package/skills/testeiya/testomatio-docs/docs/advanced/tql/index.md +0 -394
  129. package/skills/testeiya/testomatio-docs/docs/getting-started/index.md +0 -290
  130. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/azure.md +0 -96
  131. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bamboo.md +0 -94
  132. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bitbucket.md +0 -106
  133. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/circle.md +0 -115
  134. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/github.md +0 -120
  135. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/gitlab.md +0 -88
  136. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/index.mdx +0 -151
  137. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/jenkins.md +0 -121
  138. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/teamcity.md +0 -96
  139. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/azure.md +0 -31
  140. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/clickup.md +0 -54
  141. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/confluence.md +0 -34
  142. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/github.md +0 -31
  143. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/gitlab.md +0 -93
  144. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/index.md +0 -131
  145. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/jira.md +0 -164
  146. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/linear.md +0 -29
  147. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/shortcut.md +0 -67
  148. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/youtrack.md +0 -94
  149. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/azure-devops.md +0 -53
  150. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/email.md +0 -71
  151. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/jira.md +0 -52
  152. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/ms-teams.md +0 -60
  153. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/rules.md +0 -267
  154. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/slack.md +0 -82
  155. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/telegram.md +0 -73
  156. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/index.mdx +0 -207
  157. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/okta.md +0 -204
  158. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/azure.md +0 -95
  159. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/google.md +0 -75
  160. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/index.mdx +0 -33
  161. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/okta.md +0 -108
  162. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/saml.md +0 -66
  163. package/skills/testeiya/testomatio-docs/docs/legal/compliance/gdpr.md +0 -95
  164. package/skills/testeiya/testomatio-docs/docs/legal/compliance/index.mdx +0 -94
  165. package/skills/testeiya/testomatio-docs/docs/legal/compliance/privacy.md +0 -26
  166. package/skills/testeiya/testomatio-docs/docs/legal/compliance/terms.md +0 -32
  167. package/skills/testeiya/testomatio-docs/docs/legal/security/index.mdx +0 -242
  168. package/skills/testeiya/testomatio-docs/docs/legal/security/jira.md +0 -140
  169. package/skills/testeiya/testomatio-docs/docs/legal/security/subprocessors.md +0 -76
  170. package/skills/testeiya/testomatio-docs/docs/management/company/administration.md +0 -363
  171. package/skills/testeiya/testomatio-docs/docs/management/company/audit-log.md +0 -41
  172. package/skills/testeiya/testomatio-docs/docs/management/company/plan-features-comparison.md +0 -240
  173. package/skills/testeiya/testomatio-docs/docs/management/company/subscriptions.md +0 -326
  174. package/skills/testeiya/testomatio-docs/docs/management/company/trials.md +0 -75
  175. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/accountant.md +0 -49
  176. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/index.mdx +0 -285
  177. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/read-only-user.md +0 -67
  178. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/teams.md +0 -138
  179. package/skills/testeiya/testomatio-docs/docs/management/project/settings.md +0 -87
  180. package/skills/testeiya/testomatio-docs/docs/management/project/templates.md +0 -546
  181. package/skills/testeiya/testomatio-docs/docs/project/analytics/index.md +0 -326
  182. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/classical-tests-markdown-format.md +0 -386
  183. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/download-manual-tests-as-files.md +0 -378
  184. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-obsidian.md +0 -112
  185. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-spreadsheet.md +0 -127
  186. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/auto-import.md +0 -63
  187. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Allure-TestOps.md +0 -49
  188. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-QTest.md +0 -41
  189. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Qase.md +0 -39
  190. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Zephyr.md +0 -37
  191. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-csv-xlsx.md +0 -117
  192. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-cucumber.md +0 -93
  193. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-qmetry.md +0 -44
  194. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-source-code.md +0 -117
  195. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testcaselabs.md +0 -44
  196. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testmo.md +0 -47
  197. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testrail.md +0 -82
  198. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-xray.md +0 -55
  199. package/skills/testeiya/testomatio-docs/docs/project/plans/index.md +0 -334
  200. package/skills/testeiya/testomatio-docs/docs/project/pulse/index.md +0 -104
  201. package/skills/testeiya/testomatio-docs/docs/project/runs/archive-runs-and-groups.md +0 -176
  202. package/skills/testeiya/testomatio-docs/docs/project/runs/custom-statuses.md +0 -195
  203. package/skills/testeiya/testomatio-docs/docs/project/runs/environments.md +0 -203
  204. package/skills/testeiya/testomatio-docs/docs/project/runs/managing-runs.md +0 -455
  205. package/skills/testeiya/testomatio-docs/docs/project/runs/merge-strategies.md +0 -137
  206. package/skills/testeiya/testomatio-docs/docs/project/runs/reports.md +0 -329
  207. package/skills/testeiya/testomatio-docs/docs/project/runs/rungroups.md +0 -342
  208. package/skills/testeiya/testomatio-docs/docs/project/runs/running-automated-tests.md +0 -256
  209. package/skills/testeiya/testomatio-docs/docs/project/runs/running-manual-and-automated-tests.md +0 -331
  210. package/skills/testeiya/testomatio-docs/docs/project/runs/running-tests-manually.md +0 -633
  211. package/skills/testeiya/testomatio-docs/docs/project/runs/temporary-tests-notes.md +0 -223
  212. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/snippets.md +0 -68
  213. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/steps.md +0 -181
  214. package/skills/testeiya/testomatio-docs/docs/project/tests/bdd-test-case-editor.md +0 -98
  215. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-test-case-editor.md +0 -354
  216. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-vs-bdd.md +0 -169
  217. package/skills/testeiya/testomatio-docs/docs/project/tests/copy-and-move-your-tests.md +0 -156
  218. package/skills/testeiya/testomatio-docs/docs/project/tests/other-features-for-test-case-design.md +0 -412
  219. package/skills/testeiya/testomatio-docs/docs/project/tests/test-case-creation-and-editing.md +0 -527
  220. package/skills/testeiya/testomatio-docs/docs/support/index.md +0 -75
  221. package/skills/testeiya/testomatio-docs/docs/test-reporting/artifacts.md +0 -388
  222. package/skills/testeiya/testomatio-docs/docs/test-reporting/cli.md +0 -215
  223. package/skills/testeiya/testomatio-docs/docs/test-reporting/configuration.md +0 -247
  224. package/skills/testeiya/testomatio-docs/docs/test-reporting/frameworks.md +0 -490
  225. package/skills/testeiya/testomatio-docs/docs/test-reporting/functions.md +0 -144
  226. package/skills/testeiya/testomatio-docs/docs/test-reporting/index.mdx +0 -48
  227. package/skills/testeiya/testomatio-docs/docs/test-reporting/junit.md +0 -248
  228. package/skills/testeiya/testomatio-docs/docs/test-reporting/logger.md +0 -138
  229. package/skills/testeiya/testomatio-docs/docs/test-reporting/php.md +0 -77
  230. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/bitbucket.md +0 -72
  231. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/csv.md +0 -23
  232. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/debug.md +0 -18
  233. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/github.md +0 -63
  234. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/gitlab.md +0 -29
  235. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/html.md +0 -80
  236. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/index.mdx +0 -57
  237. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/testomatio.md +0 -331
  238. package/skills/testeiya/testomatio-docs/docs/test-reporting/python.md +0 -229
  239. package/skills/testeiya/testomatio-docs/docs/test-reporting/workflows.md +0 -325
  240. package/skills/testeiya/testomatio-docs/docs/tutorials/Interacting-via-API.md +0 -159
  241. package/skills/testeiya/testomatio-docs/docs/tutorials/Manual-Testing-Classic.md +0 -164
  242. package/skills/testeiya/testomatio-docs/docs/tutorials/Set-Up-Read-Only-Access.md +0 -85
  243. package/skills/testeiya/testomatio-docs/docs/tutorials/Using-AI-in-Testing.md +0 -163
  244. package/skills/testeiya/testomatio-docs/docs/tutorials/Working-with-Jira.md +0 -125
  245. package/skills/testeiya/testomatio-docs/docs/tutorials/java.md +0 -478
  246. package/skills/testeiya/testomatio-docs/docs/tutorials/playwright.md +0 -207
  247. package/skills/testeiya/testomatio-docs/docs/tutorials/webdriver.md +0 -218
  248. package/skills/testeiya/testomatio-docs/docs.lock.json +0 -6
  249. package/skills/testeiya/testomatio-reporter/SKILL.md +0 -307
  250. package/skills/testomatio/test-automation/setup-pr-testing/SKILL.md +0 -199
  251. package/skills.yaml +0 -21
  252. package/src/ai-debug.ts +0 -188
  253. package/src/api/agent-get.ts +0 -22
  254. package/src/api/agent-start.ts +0 -384
  255. package/src/api/client-log.ts +0 -29
  256. package/src/api/context.ts +0 -332
  257. package/src/api/debug-layout.ts +0 -47
  258. package/src/api/debug-report.ts +0 -29
  259. package/src/api/debug-snapshot.ts +0 -30
  260. package/src/api/debug-stream.ts +0 -52
  261. package/src/api/files-delete.ts +0 -184
  262. package/src/api/files-read.ts +0 -41
  263. package/src/api/files-rename.ts +0 -99
  264. package/src/api/files-tree.ts +0 -292
  265. package/src/api/files-write.ts +0 -41
  266. package/src/api/mcp.ts +0 -603
  267. package/src/api/memory.ts +0 -69
  268. package/src/api/open-external.ts +0 -39
  269. package/src/api/playwright-cli.ts +0 -606
  270. package/src/api/providers.ts +0 -457
  271. package/src/api/read-env-token.ts +0 -33
  272. package/src/api/sessions.ts +0 -79
  273. package/src/api/settings.ts +0 -120
  274. package/src/api/skills.ts +0 -58
  275. package/src/api/testomatio-attachment.ts +0 -89
  276. package/src/api/testomatio-auth.ts +0 -284
  277. package/src/api/testomatio-proxy.ts +0 -197
  278. package/src/api/testomatio-run-stats.ts +0 -81
  279. package/src/api/testomatio-target.ts +0 -225
  280. package/src/api/testomatio-transcription.ts +0 -82
  281. package/src/api/workspace-search.ts +0 -96
  282. package/src/api/workspace-sync.ts +0 -151
  283. package/src/api/workspace.ts +0 -165
  284. package/src/app-server.ts +0 -556
  285. package/src/bridge.ts +0 -251
  286. package/src/check-tests.ts +0 -156
  287. package/src/cli.ts +0 -17
  288. package/src/commands.ts +0 -244
  289. package/src/config.ts +0 -183
  290. package/src/connection.ts +0 -658
  291. package/src/context-store.ts +0 -265
  292. package/src/debug-bus.ts +0 -405
  293. package/src/extensions/tool-gate.ts +0 -220
  294. package/src/extensions/webui/ask-channel.ts +0 -52
  295. package/src/extensions/webui/index.ts +0 -184
  296. package/src/extensions/webui/tools/ask-question.ts +0 -88
  297. package/src/extensions/webui/tools/query-result.ts +0 -79
  298. package/src/extensions/webui/tools/render-chart.ts +0 -53
  299. package/src/extensions/webui/tools/render-item.ts +0 -61
  300. package/src/extensions/webui/tools/render-list.ts +0 -170
  301. package/src/extensions/webui/tools/render-result.ts +0 -85
  302. package/src/extensions/webui/tools/render-tree.ts +0 -71
  303. package/src/extensions/webui/tools/ui-widget.ts +0 -54
  304. package/src/extensions/webui/tools/widget-result.ts +0 -13
  305. package/src/extensions/webui/widget-channel.ts +0 -50
  306. package/src/file-log.ts +0 -196
  307. package/src/git-tracked.ts +0 -68
  308. package/src/gitignore.ts +0 -53
  309. package/src/json-store.ts +0 -43
  310. package/src/load-env.ts +0 -70
  311. package/src/loader-style.ts +0 -96
  312. package/src/main.ts +0 -140
  313. package/src/mcp-catalog.ts +0 -96
  314. package/src/models-catalog.ts +0 -72
  315. package/src/permissions.ts +0 -120
  316. package/src/project-dir.ts +0 -189
  317. package/src/project-info.ts +0 -108
  318. package/src/prompt/app-ui.ts +0 -59
  319. package/src/prompt/browser.ts +0 -27
  320. package/src/prompt/index.ts +0 -62
  321. package/src/prompt/tools.ts +0 -27
  322. package/src/server-info.ts +0 -62
  323. package/src/session-factory.ts +0 -442
  324. package/src/session-store.ts +0 -115
  325. package/src/shell-env.ts +0 -45
  326. package/src/skills.ts +0 -163
  327. package/src/sync-snapshot.ts +0 -140
  328. package/src/telemetry.ts +0 -239
  329. package/src/testomatio-auth.ts +0 -299
  330. package/src/testomatio.ts +0 -98
  331. package/src/theme.ts +0 -30
  332. package/src/user-env.ts +0 -94
  333. package/src/welcome.ts +0 -194
  334. package/src/workspace/safe-path.ts +0 -85
  335. package/src/workspace/test-md.ts +0 -70
  336. package/src/workspace-model.ts +0 -440
  337. package/testeiya.config.json +0 -14
  338. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/authentication-flows.md +0 -0
  339. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/authentication.md +0 -0
  340. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/clock-mocking.md +0 -0
  341. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/mobile-testing.md +0 -0
  342. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/multi-context.md +0 -0
  343. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/multi-user.md +0 -0
  344. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/network-advanced.md +0 -0
  345. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/third-party.md +0 -0
  346. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/architecture/pom-vs-fixtures.md +0 -0
  347. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/architecture/test-architecture.md +0 -0
  348. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/architecture/when-to-mock.md +0 -0
  349. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/browser-apis.md +0 -0
  350. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/iframes.md +0 -0
  351. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/service-workers.md +0 -0
  352. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/websockets.md +0 -0
  353. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/annotations.md +0 -0
  354. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/assertions-waiting.md +0 -0
  355. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/configuration.md +0 -0
  356. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/fixtures-hooks.md +0 -0
  357. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/global-setup.md +0 -0
  358. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/locators.md +0 -0
  359. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/page-object-model.md +0 -0
  360. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/projects-dependencies.md +0 -0
  361. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/test-data.md +0 -0
  362. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/test-suite-structure.md +0 -0
  363. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/test-tags.md +0 -0
  364. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/console-errors.md +0 -0
  365. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/debugging.md +0 -0
  366. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/error-testing.md +0 -0
  367. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/flaky-tests.md +0 -0
  368. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/angular.md +0 -0
  369. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/nextjs.md +0 -0
  370. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/react.md +0 -0
  371. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/vue.md +0 -0
  372. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/ci-cd.md +0 -0
  373. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/docker.md +0 -0
  374. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/github-actions.md +0 -0
  375. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/gitlab.md +0 -0
  376. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/other-providers.md +0 -0
  377. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/parallel-sharding.md +0 -0
  378. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/performance.md +0 -0
  379. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/reporting.md +0 -0
  380. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/test-coverage.md +0 -0
  381. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/accessibility.md +0 -0
  382. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/api-testing.md +0 -0
  383. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/browser-extensions.md +0 -0
  384. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/canvas-webgl.md +0 -0
  385. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/component-testing.md +0 -0
  386. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/drag-drop.md +0 -0
  387. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/electron.md +0 -0
  388. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/file-operations.md +0 -0
  389. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/file-upload-download.md +0 -0
  390. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/forms-validation.md +0 -0
  391. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/graphql-testing.md +0 -0
  392. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/i18n.md +0 -0
  393. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/performance-testing.md +0 -0
  394. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/security-testing.md +0 -0
  395. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/visual-regression.md +0 -0
  396. /package/skills/{playwright-cli → playwright/playwright-cli}/SKILL.md +0 -0
  397. /package/skills/{playwright-cli → playwright/playwright-cli}/references/element-attributes.md +0 -0
  398. /package/skills/{playwright-cli → playwright/playwright-cli}/references/playwright-tests.md +0 -0
  399. /package/skills/{playwright-cli → playwright/playwright-cli}/references/request-mocking.md +0 -0
  400. /package/skills/{playwright-cli → playwright/playwright-cli}/references/running-code.md +0 -0
  401. /package/skills/{playwright-cli → playwright/playwright-cli}/references/session-management.md +0 -0
  402. /package/skills/{playwright-cli → playwright/playwright-cli}/references/storage-state.md +0 -0
  403. /package/skills/{playwright-cli → playwright/playwright-cli}/references/test-generation.md +0 -0
  404. /package/skills/{playwright-cli → playwright/playwright-cli}/references/tracing.md +0 -0
  405. /package/skills/{playwright-cli → playwright/playwright-cli}/references/video-recording.md +0 -0
package/src/file-log.ts DELETED
@@ -1,196 +0,0 @@
1
- /**
2
- * Persistent, crash-durable structured app log under `~/.testeiya/logs/`.
3
- *
4
- * Shared by every runnable surface (desktop shell, web `serve:app`, the
5
- * `next dev` agent half, and the terminal CLI). `initFileLog(mode)` boots the
6
- * evlog pipeline once per process: every structured event (`log.*` and the
7
- * wide events emitted across `cli/src/`) fans out to an NDJSON file drain
8
- * (`<date>.jsonl`, 7 files kept), an in-memory ring buffer (the debug
9
- * snapshot's source), and the Debug-panel SSE drain in `debug-bus.ts`. evlog
10
- * runs `silent` — the terminal keeps the app's own `console.*` lines, and a
11
- * console tee forwards those (plus anything third-party deps print) into the
12
- * same file + memory sinks so a crash leaves a trace on disk. Deep per-session
13
- * detail (prompts, tool IO, generations) lives in Langfuse, not on disk.
14
- */
15
- import { mkdirSync, readdirSync, rmSync, statSync } from "node:fs";
16
- import { join } from "node:path";
17
- import { inspect } from "node:util";
18
- import { initLogger, log, type WideEvent } from "evlog";
19
- import { createFsDrain, writeToFs, type FsConfig } from "evlog/fs";
20
- import { createMemoryDrain, writeToMemory } from "evlog/memory";
21
- import { HOME_DIR } from "./project-dir.js";
22
- import { loadConfig } from "./config.js";
23
- import { panelDrain } from "./debug-bus.js";
24
-
25
- export const LOGS_DIR = join(HOME_DIR, "logs");
26
-
27
- const FS_LOG: FsConfig = { dir: LOGS_DIR, pretty: false, maxFiles: 7 };
28
- const MEMORY_LOG = { store: "default", maxEvents: 500 };
29
- const MAX_LOG_AGE_MS = 7 * 24 * 60 * 60 * 1000;
30
- const MAX_CONSOLE_TEXT = 16000;
31
- const LITERAL_ENV = ["PORT", "HOST", "TESTEIYA_WORKSPACE", "TESTOMATIO_URL", "TESTEIYA_DEBUG"];
32
- const PRESENCE_ENV = [
33
- "OPENROUTER_API_KEY",
34
- "TESTOMATIO",
35
- "TESTEIYA_AUTH_TOKEN",
36
- "LANGFUSE_PUBLIC_KEY",
37
- "LANGFUSE_SECRET_KEY",
38
- ];
39
-
40
- let initialized = false;
41
- let appMode = "app";
42
-
43
- export function initFileLog(mode: string): void {
44
- if (initialized) return;
45
- initialized = true;
46
- appMode = mode;
47
- try {
48
- mkdirSync(LOGS_DIR, { recursive: true });
49
- } catch {}
50
- pruneLegacyLogs();
51
- const fsDrain = createFsDrain(FS_LOG);
52
- const memoryDrain = createMemoryDrain(MEMORY_LOG);
53
- initLogger({
54
- env: { service: "testeiya", environment: mode },
55
- silent: true,
56
- redact: { builtins: ["jwt", "bearer"] },
57
- drain: (ctx) => {
58
- void fsDrain(ctx).catch(() => {});
59
- void memoryDrain(ctx).catch(() => {});
60
- try {
61
- panelDrain(ctx.event);
62
- } catch {}
63
- },
64
- });
65
- log.info({
66
- tag: "start",
67
- pid: process.pid,
68
- mode,
69
- runtime: runtimeVersion(),
70
- platform: `${process.platform}/${process.arch}`,
71
- cwd: process.cwd(),
72
- argv: process.argv.slice(2).join(" "),
73
- });
74
- patchConsole("log", "info");
75
- patchConsole("info", "info");
76
- patchConsole("warn", "warn");
77
- patchConsole("error", "error");
78
- patchConsole("debug", "debug");
79
- process.on("uncaughtException", (err) =>
80
- log.error({ tag: "error", message: `uncaughtException ${formatOne(err)}` })
81
- );
82
- process.on("unhandledRejection", (reason) =>
83
- log.error({ tag: "error", message: `unhandledRejection ${formatOne(reason)}` })
84
- );
85
- }
86
-
87
- export function appLogPath(): string | null {
88
- if (!initialized) return null;
89
- return join(LOGS_DIR, `${new Date().toISOString().slice(0, 10)}.jsonl`);
90
- }
91
-
92
- export function logStartupConfig(): void {
93
- if (!initialized) return;
94
- log.info({ tag: "config", config: loadConfig(), env: envSummary() });
95
- }
96
-
97
- function envSummary(): string {
98
- const parts: string[] = [];
99
- for (const key of LITERAL_ENV) {
100
- if (isSecretName(key)) {
101
- parts.push(`${key}=${presenceOf(key)}`);
102
- continue;
103
- }
104
- const value = process.env[key];
105
- if (!value) continue;
106
- parts.push(`${key}=${value}`);
107
- }
108
- for (const key of PRESENCE_ENV) {
109
- parts.push(`${key}=${presenceOf(key)}`);
110
- }
111
- return parts.join(" ");
112
- }
113
-
114
- function presenceOf(key: string): string {
115
- if (process.env[key]) return "set";
116
- return "unset";
117
- }
118
-
119
- function isSecretName(name: string): boolean {
120
- return /KEY|TOKEN|SECRET/i.test(name);
121
- }
122
-
123
- function pruneLegacyLogs(): void {
124
- let names: string[];
125
- try {
126
- names = readdirSync(LOGS_DIR);
127
- } catch {
128
- return;
129
- }
130
- const cutoff = Date.now() - MAX_LOG_AGE_MS;
131
- for (const name of names) {
132
- if (!/^(app|session)-.*\.log$/.test(name)) continue;
133
- let mtime = 0;
134
- try {
135
- mtime = statSync(join(LOGS_DIR, name)).mtimeMs;
136
- } catch {
137
- continue;
138
- }
139
- if (mtime >= cutoff) continue;
140
- try {
141
- rmSync(join(LOGS_DIR, name), { force: true });
142
- } catch {}
143
- }
144
- }
145
-
146
- /*
147
- * Tee every `console.*` call — the app's own terminal lines plus anything the
148
- * SDK or other deps print — into the file + memory sinks directly, bypassing
149
- * evlog's pipeline so the (still forwarded) original console output can't be
150
- * re-captured into a loop.
151
- */
152
- function patchConsole(
153
- method: "log" | "info" | "warn" | "error" | "debug",
154
- level: "info" | "warn" | "error" | "debug"
155
- ): void {
156
- const original = console[method].bind(console);
157
- console[method] = (...args: unknown[]) => {
158
- recordConsole(level, args);
159
- original(...args);
160
- };
161
- }
162
-
163
- function recordConsole(level: "info" | "warn" | "error" | "debug", args: unknown[]): void {
164
- const event: WideEvent = {
165
- timestamp: new Date().toISOString(),
166
- level,
167
- service: "testeiya",
168
- environment: appMode,
169
- tag: "console",
170
- message: truncate(formatArgs(args)),
171
- };
172
- void writeToFs(event, FS_LOG).catch(() => {});
173
- try {
174
- writeToMemory([event], MEMORY_LOG);
175
- } catch {}
176
- }
177
-
178
- function truncate(text: string): string {
179
- if (text.length <= MAX_CONSOLE_TEXT) return text;
180
- return `${text.slice(0, MAX_CONSOLE_TEXT)}… (+${text.length - MAX_CONSOLE_TEXT} more chars)`;
181
- }
182
-
183
- function formatArgs(args: unknown[]): string {
184
- return args.map(formatOne).join(" ");
185
- }
186
-
187
- function formatOne(value: unknown): string {
188
- if (typeof value === "string") return value;
189
- return inspect(value, { depth: 4, colors: false });
190
- }
191
-
192
- function runtimeVersion(): string {
193
- const bun = (globalThis as { Bun?: { version: string } }).Bun;
194
- if (bun) return `bun=${bun.version}`;
195
- return `node=${process.version}`;
196
- }
@@ -1,68 +0,0 @@
1
- // Which workspace files are safely recoverable from git — used so the UI can
2
- // delete a committed file without a confirmation prompt (it can be restored).
3
-
4
- import { spawnSync } from "node:child_process";
5
- import type { FileStatus } from "./sync-snapshot.js";
6
-
7
- /**
8
- * Set of `cwd`-relative paths that git tracks AND that are unmodified in the
9
- * working tree, so their current content is recoverable via `git restore`.
10
- * Paths match `git ls-files` (always cwd-relative, so they line up with the
11
- * file-tree's relative paths). Empty when `cwd` isn't a git work tree (a managed
12
- * `~/.testeiya/workspaces` dir) or git is unavailable, so callers fall back to
13
- * "not committed" and keep prompting.
14
- */
15
- export function gitCommittedFiles(cwd: string): Set<string> {
16
- const tracked = gitList(cwd, ["ls-files", "-z"]);
17
- if (!tracked) return new Set();
18
- const modified = new Set(gitList(cwd, ["ls-files", "-m", "-z"]) ?? []);
19
- return new Set(tracked.filter((rel) => !modified.has(rel)));
20
- }
21
-
22
- /**
23
- * Map of `cwd`-relative path → status from git's working-tree state, so the Code
24
- * view can flag new/edited files the same way manual tests flag un-synced ones:
25
- * untracked or staged-new files are "created" (green), modified tracked files are
26
- * "changed" (amber). Deletes are skipped (the file is gone from the tree).
27
- * Empty when `cwd` isn't a git work tree or git is unavailable.
28
- */
29
- export function gitChangedFiles(cwd: string): Record<string, FileStatus> {
30
- const res = spawnSync("git", ["status", "--porcelain=v1", "-z", "--no-renames", "--untracked-files=all"], {
31
- cwd,
32
- encoding: "utf8",
33
- maxBuffer: 64 * 1024 * 1024,
34
- });
35
- if (res.status !== 0 || typeof res.stdout !== "string") return {};
36
- const out: Record<string, FileStatus> = {};
37
- for (const record of res.stdout.split("\0")) {
38
- if (record.length < 4) continue;
39
- const code = record.slice(0, 2);
40
- const rel = record.slice(3);
41
- if (code[0] === "D" || code[1] === "D") continue;
42
- if (code === "??" || code[0] === "A") out[rel] = "created";
43
- else out[rel] = "changed";
44
- }
45
- return out;
46
- }
47
-
48
- // The checked-out branch of `cwd`'s git work tree, for the workspace status bar.
49
- // null when `cwd` isn't a git repo, git is unavailable, or HEAD is detached
50
- // (`--show-current` prints nothing) — the status bar then shows just the path.
51
- export function gitBranch(cwd: string): string | null {
52
- const res = spawnSync("git", ["branch", "--show-current"], {
53
- cwd,
54
- encoding: "utf8",
55
- });
56
- if (res.status !== 0 || typeof res.stdout !== "string") return null;
57
- return res.stdout.trim() || null;
58
- }
59
-
60
- function gitList(cwd: string, args: string[]): string[] | null {
61
- const res = spawnSync("git", args, {
62
- cwd,
63
- encoding: "utf8",
64
- maxBuffer: 64 * 1024 * 1024,
65
- });
66
- if (res.status !== 0 || typeof res.stdout !== "string") return null;
67
- return res.stdout.split("\0").filter(Boolean);
68
- }
package/src/gitignore.ts DELETED
@@ -1,53 +0,0 @@
1
- // Reads a workspace's `.gitignore` files so the file tree and the workspace
2
- // classifier can skip git-ignored paths (e.g. a Rails `storage/` blob cache).
3
- //
4
- // A chain accumulates one matcher per `.gitignore` found on the way down from
5
- // the root, each rooted at the dir it lives in. `descend` extends the chain
6
- // with a subdir's `.gitignore` as the walk enters it, so nested rules apply to
7
- // exactly the subtree they belong to. Paths passed to `ignores` are POSIX and
8
- // relative to the chain's root.
9
-
10
- import fs from "node:fs";
11
- import path from "node:path";
12
- import ignore, { type Ignore } from "ignore";
13
-
14
- export function loadGitignore(root: string): GitignoreChain {
15
- return chain(root, readMatchers(root, ""));
16
- }
17
-
18
- function chain(root: string, matchers: Matcher[]): GitignoreChain {
19
- return {
20
- ignores(relPosix) {
21
- for (const m of matchers) {
22
- const sub = m.base === "" ? relPosix : relPosix.slice(m.base.length + 1);
23
- if (m.ig.ignores(sub)) return true;
24
- }
25
- return false;
26
- },
27
- descend(dirRelPosix) {
28
- const extra = readMatchers(root, dirRelPosix);
29
- if (extra.length === 0) return this;
30
- return chain(root, [...matchers, ...extra]);
31
- },
32
- };
33
- }
34
-
35
- function readMatchers(root: string, baseRel: string): Matcher[] {
36
- let content: string;
37
- try {
38
- content = fs.readFileSync(path.join(root, baseRel, ".gitignore"), "utf8");
39
- } catch {
40
- return [];
41
- }
42
- return [{ base: baseRel, ig: ignore().add(content) }];
43
- }
44
-
45
- export interface GitignoreChain {
46
- ignores(relPosix: string): boolean;
47
- descend(dirRelPosix: string): GitignoreChain;
48
- }
49
-
50
- interface Matcher {
51
- base: string; // POSIX path of the .gitignore's dir, relative to root ("" = root)
52
- ig: Ignore;
53
- }
package/src/json-store.ts DELETED
@@ -1,43 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
-
4
- /**
5
- * Small JSON-on-disk helpers shared by the file-backed stores. Reads fall back
6
- * to a default on a missing/garbage file; writes are atomic (temp file + rename)
7
- * so a crash mid-write can't truncate the store. `mode` is preserved for
8
- * credential files that must stay `0o600`.
9
- */
10
-
11
- export function readJson<T>(file: string, fallback: T): T {
12
- try {
13
- return JSON.parse(fs.readFileSync(file, "utf8")) as T;
14
- } catch {
15
- return fallback;
16
- }
17
- }
18
-
19
- export function writeJson(file: string, value: unknown, opts?: { mode?: number }): void {
20
- const dir = path.dirname(file);
21
- fs.mkdirSync(dir, { recursive: true });
22
- const tmp = `${file}.${process.pid}.tmp`;
23
- const json = JSON.stringify(value, null, 2);
24
- if (opts?.mode) {
25
- fs.writeFileSync(tmp, json, { mode: opts.mode });
26
- } else {
27
- fs.writeFileSync(tmp, json);
28
- }
29
- fs.renameSync(tmp, file);
30
- // rename may not carry the mode on every platform, so set it explicitly.
31
- if (opts?.mode) fs.chmodSync(file, opts.mode);
32
- }
33
-
34
- export function updateJson<T extends Record<string, unknown>>(
35
- file: string,
36
- fallback: T,
37
- patch: (current: T) => T,
38
- opts?: { mode?: number }
39
- ): T {
40
- const next = patch(readJson<T>(file, fallback));
41
- writeJson(file, next, opts);
42
- return next;
43
- }
package/src/load-env.ts DELETED
@@ -1,70 +0,0 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { HOME_DIR } from "./project-dir.js";
3
- import { dirname, join } from "node:path";
4
-
5
- /**
6
- * Load `.env` files into process.env for the agent server.
7
- *
8
- * Bun only auto-loads `.env` from the process CWD, but the Electrobun app runs
9
- * with its CWD set to the bundle's bin dir — so the project's `.env` (which
10
- * holds OPENROUTER_API_KEY in dev) is never picked up. This loader fixes that:
11
- *
12
- * 1. `~/.testeiya/.env` — stable location that works for packaged apps
13
- * 2. walking up from this file — finds the repo's `.env` and `testeiya/.env`
14
- * in dev (the bundled code sits a few levels under the project root)
15
- *
16
- * Existing process.env values always win (exported vars / Bun's CWD autoload),
17
- * so this only *fills gaps*. In a packaged install there's usually no project
18
- * `.env` up the tree, so it's a harmless no-op and the user uses Settings.
19
- */
20
-
21
- export function parseEnv(content: string): Record<string, string> {
22
- const out: Record<string, string> = {};
23
- for (const raw of content.split(/\r?\n/)) {
24
- const line = raw.trim();
25
- if (!line || line.startsWith("#")) continue;
26
- const eq = line.indexOf("=");
27
- if (eq === -1) continue;
28
- const key = line.slice(0, eq).trim();
29
- let val = line.slice(eq + 1).trim();
30
- if (
31
- (val.startsWith('"') && val.endsWith('"')) ||
32
- (val.startsWith("'") && val.endsWith("'"))
33
- ) {
34
- val = val.slice(1, -1);
35
- }
36
- if (key) out[key] = val;
37
- }
38
- return out;
39
- }
40
-
41
- function loadFile(path: string): boolean {
42
- try {
43
- if (!existsSync(path)) return false;
44
- const vars = parseEnv(readFileSync(path, "utf8"));
45
- let applied = 0;
46
- for (const [k, v] of Object.entries(vars)) {
47
- if (process.env[k] === undefined) {
48
- process.env[k] = v;
49
- applied++;
50
- }
51
- }
52
- if (applied > 0) console.log(`[env] loaded ${applied} var(s) from ${path}`);
53
- return applied > 0;
54
- } catch {
55
- return false;
56
- }
57
- }
58
-
59
- export function loadEnvFiles(): void {
60
- loadFile(join(HOME_DIR, ".env"));
61
-
62
- let dir = import.meta.dir;
63
- for (let i = 0; i < 8; i++) {
64
- loadFile(join(dir, ".env"));
65
- loadFile(join(dir, "testeiya", ".env"));
66
- const parent = dirname(dir);
67
- if (parent === dir) break;
68
- dir = parent;
69
- }
70
- }
@@ -1,96 +0,0 @@
1
- // Testeiya branded loader: gradient shimmer + rotating QA-themed verbs.
2
- // Hooks an InteractiveMode instance — when its loadingAnimation appears,
3
- // we replace its messageColorFn with a violet shimmer and start cycling verbs.
4
-
5
- import { visibleWidth } from "@oh-my-pi/pi-tui";
6
-
7
- const PALETTE = [
8
- [0x6d, 0x28, 0xd9], // #6d28d9 deep violet
9
- [0x7c, 0x3a, 0xed],
10
- [0x8b, 0x5c, 0xf6], // #8b5cf6 brand primary
11
- [0xa7, 0x8b, 0xfa],
12
- [0xdd, 0xd6, 0xfe], // #ddd6fe pale violet
13
- [0xa7, 0x8b, 0xfa],
14
- [0x8b, 0x5c, 0xf6],
15
- [0x7c, 0x3a, 0xed],
16
- ];
17
-
18
- const RESET = "\x1b[0m";
19
-
20
- export const TESTEIYA_VERBS = [
21
- "Investigating",
22
- "Crawling tests",
23
- "Probing",
24
- "Asserting",
25
- "Tracing flows",
26
- "Locating selectors",
27
- "Inspecting steps",
28
- "Sniffing bugs",
29
- ];
30
-
31
- export function gradientShimmer(): (text: string) => string {
32
- let phase = 0;
33
- return (text: string): string => {
34
- phase = (phase + 1) % PALETTE.length;
35
- let out = "";
36
- let i = 0;
37
- for (const ch of text) {
38
- const [r, g, b] = PALETTE[(phase + i) % PALETTE.length];
39
- out += `\x1b[38;2;${r};${g};${b}m${ch}`;
40
- i++;
41
- }
42
- return out + RESET;
43
- };
44
- }
45
-
46
- interface Watchable {
47
- loadingAnimation?: { setMessage(m: string): void; messageColorFn?: (s: string) => string } | null;
48
- }
49
-
50
- export function attachBrandedLoader(interactive: Watchable, opts?: { rotateMs?: number; pollMs?: number }): () => void {
51
- const rotateMs = opts?.rotateMs ?? 2500;
52
- const pollMs = opts?.pollMs ?? 100;
53
-
54
- let lastLoader: unknown = null;
55
- let rotationTimer: NodeJS.Timeout | undefined;
56
- let verbIdx = 0;
57
-
58
- const stopRotation = () => {
59
- if (rotationTimer) {
60
- clearInterval(rotationTimer);
61
- rotationTimer = undefined;
62
- }
63
- };
64
-
65
- const watcher = setInterval(() => {
66
- const cur = interactive.loadingAnimation;
67
- if (cur && cur !== lastLoader) {
68
- lastLoader = cur;
69
- // Apply gradient color over message
70
- cur.messageColorFn = gradientShimmer();
71
- // Start with a fresh verb and rotate
72
- verbIdx = Math.floor(Math.random() * TESTEIYA_VERBS.length);
73
- cur.setMessage(TESTEIYA_VERBS[verbIdx]);
74
- stopRotation();
75
- rotationTimer = setInterval(() => {
76
- verbIdx = (verbIdx + 1) % TESTEIYA_VERBS.length;
77
- try {
78
- cur.setMessage(TESTEIYA_VERBS[verbIdx]);
79
- } catch {
80
- stopRotation();
81
- }
82
- }, rotateMs);
83
- } else if (!cur && lastLoader) {
84
- lastLoader = null;
85
- stopRotation();
86
- }
87
- }, pollMs);
88
-
89
- return () => {
90
- clearInterval(watcher);
91
- stopRotation();
92
- };
93
- }
94
-
95
- // Silence unused-import warning while keeping the helper available for future use.
96
- void visibleWidth;
package/src/main.ts DELETED
@@ -1,140 +0,0 @@
1
- import chalk from "chalk";
2
-
3
- import {
4
- InteractiveMode,
5
- initTheme,
6
- submitInteractiveInput,
7
- settings,
8
- } from "@oh-my-pi/pi-coding-agent";
9
-
10
- import { createTesteiyaSession } from "./session-factory.js";
11
- import { TesteiyaWelcome } from "./welcome.js";
12
- import { applyTesteiyaTheme } from "./theme.js";
13
- import { attachBrandedLoader } from "./loader-style.js";
14
- import { loadDotEnv, testomatioStatusLine } from "./testomatio.js";
15
- import { migrateLegacyHomeDir } from "./project-dir.js";
16
- import { restoreTestomatioAuth } from "./testomatio-auth.js";
17
- import { loadEnvFiles } from "./load-env.js";
18
- import { initTelemetry } from "./telemetry.js";
19
- import { initFileLog, logStartupConfig } from "./file-log.js";
20
-
21
- const VERSION = "0.2.0";
22
-
23
- export async function main(_args: string[]): Promise<void> {
24
- // Carry over an existing ~/.testclaw state dir to ~/.testeiya (rename), before
25
- // anything reads sessions/auth/config or the migrated ~/.testeiya/.env.
26
- migrateLegacyHomeDir();
27
-
28
- // Open the persistent file log (after the home-dir migration) so the terminal
29
- // agent's console + crashes are captured on disk like the other surfaces.
30
- initFileLog("tui");
31
-
32
- // Load .env BEFORE the session starts — the provider API key and the
33
- // TESTOMATIO token are read from process.env in createTesteiyaSession.
34
- loadDotEnv();
35
- // Also pick up ~/.testeiya/.env (gap-fill) so LANGFUSE_* keys resolve, then
36
- // start OpenTelemetry → Langfuse (no-op unless the keys are present).
37
- loadEnvFiles();
38
- initTelemetry();
39
- logStartupConfig();
40
-
41
- // Terminal dark/light detection is built into pi-tui's ProcessTerminal —
42
- // read interactive.ui.terminal.appearance / .onAppearanceChange() when needed.
43
-
44
- // Initialize theme early (InteractiveMode needs it at construction time)
45
- initTheme();
46
-
47
- // Testomat.io is optional at startup: the env var wins, else a stored
48
- // connection is restored silently. With neither, the agent starts
49
- // unconnected and the user links a project in-session via /connect.
50
- const envHasTestomatio = Boolean(process.env.TESTOMATIO?.trim());
51
- let sessionTokens: Record<string, string> | undefined;
52
- let sessionBackendUrl: string | undefined;
53
- if (envHasTestomatio) {
54
- console.log(chalk.dim(" ✓ Using TESTOMATIO from environment"));
55
- } else {
56
- const auth = await restoreTestomatioAuth({ baseUrl: process.env.TESTOMATIO_URL });
57
- if (auth) {
58
- process.env.TESTOMATIO = auth.project.apiKey;
59
- process.env.TESTOMATIO_URL = auth.baseUrl;
60
- process.env.TESTOMATIO_PROJECT_ID = auth.project.id;
61
- sessionTokens = { [auth.project.id]: auth.project.apiKey };
62
- sessionBackendUrl = auth.baseUrl;
63
- console.log(chalk.green(` ✓ Testomat.io: ${auth.project.title} (${auth.project.id})`));
64
- } else {
65
- console.log(chalk.dim(" ○ Testomat.io: not connected — use /connect to link a project"));
66
- }
67
- }
68
-
69
- let result;
70
- try {
71
- result = await createTesteiyaSession({
72
- mode: "tui",
73
- tokens: sessionTokens,
74
- backendUrl: sessionBackendUrl,
75
- trusted: true,
76
- });
77
- } catch (err: any) {
78
- console.error(chalk.red(`Error: ${err.message}`));
79
- process.exit(1);
80
- }
81
-
82
- const { session, setToolUIContext, mcpManager, model, config } = result;
83
-
84
- // Configure status line: model + context on left; tokens + time on right
85
- settings.set("statusLine.preset", "custom");
86
- settings.set("statusLine.leftSegments", ["model", "context_pct"]);
87
- settings.set("statusLine.rightSegments", ["token_in", "token_out", "time_spent"]);
88
-
89
- console.log(chalk.dim(` Model: ${model.provider}/${model.id}`));
90
-
91
- const tmtStatus = testomatioStatusLine(mcpManager);
92
- if (tmtStatus) console.log(chalk.green(` ✓ ${tmtStatus}`));
93
-
94
- const skills = session.skills || [];
95
- if (skills.length > 0) {
96
- console.log(chalk.dim(` Skills: ${skills.map((s: any) => s.name).join(", ")}`));
97
- }
98
-
99
- // Run InteractiveMode (full TUI)
100
- const interactive = new InteractiveMode(
101
- session,
102
- VERSION,
103
- undefined,
104
- setToolUIContext,
105
- undefined,
106
- mcpManager,
107
- );
108
-
109
- await interactive.init();
110
-
111
- // Replace default welcome with Testeiya welcome
112
- const skillNames = (session.skills || []).map((s: any) => s.name);
113
- const modelName = model.name ?? model.id;
114
- const providerName = model.provider ?? config.provider.name;
115
- const testeiyaWelcome = new TesteiyaWelcome(VERSION, modelName, providerName, skillNames);
116
-
117
- const ui = interactive.ui;
118
- for (let i = 0; i < ui.children.length; i++) {
119
- const child = ui.children[i];
120
- if (child && "setModel" in child && "setLspServers" in child) {
121
- ui.children[i] = testeiyaWelcome;
122
- break;
123
- }
124
- }
125
-
126
- applyTesteiyaTheme(interactive as any);
127
-
128
- // Branded loader: gradient shimmer + rotating QA verbs while the agent thinks.
129
- attachBrandedLoader(interactive as any);
130
-
131
- ui.requestRender(true);
132
-
133
- // Main input loop — wait for user input and submit to agent.
134
- // Slash commands are handled by the SDK + the extension we register in
135
- // session-factory.ts (see src/commands.ts).
136
- while (true) {
137
- const input = await interactive.getUserInput();
138
- await submitInteractiveInput(interactive, session, input);
139
- }
140
- }