testeiya 0.2.1 → 0.3.1-0.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 (404) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +309 -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 +207 -0
  20. package/dist/src/args.js.map +1 -0
  21. package/dist/src/cli.js +114 -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 +93 -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 +194 -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 +295 -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 +88 -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} +43 -36
  73. package/skills/skills.yaml +34 -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/qa-process/qa-explain-behavior/SKILL.md +111 -0
  79. package/skills/testomatio/qa-process/qa-explain-behavior/references/answer-shapes.md +116 -0
  80. package/skills/testomatio/qa-process/qa-explain-behavior/references/examples.md +157 -0
  81. package/skills/testomatio/qa-process/qa-lead-strategy-advisor/SKILL.md +91 -0
  82. package/skills/testomatio/qa-process/qa-lead-strategy-advisor/references/output-format.md +71 -0
  83. package/skills/testomatio/qa-process/testing-workflow/SKILL.md +227 -0
  84. package/skills/testomatio/test-automation/qa-data-seeder/SKILL.md +83 -0
  85. package/skills/testomatio/test-automation/run-tests-with-testomatio-reporter/SKILL.md +5 -3
  86. package/skills/testomatio/test-automation/setup-change-aware-pr-testing/SKILL.md +190 -0
  87. package/skills/testomatio/test-automation/setup-ci-automation/SKILL.md +76 -0
  88. package/skills/testomatio/test-management/qa-split-testing-levels-pyramid/SKILL.md +55 -0
  89. package/skills/testomatio/test-management/qa-sprint-report-by-testomatio/SKILL.md +220 -0
  90. package/skills/testomatio/test-management/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +126 -0
  91. package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +1 -1
  92. package/skills/testomatio/test-management/qa-thinking/SKILL.md +25 -25
  93. package/skills/testomatio/test-management/testomatio-mcp/SKILL.md +14 -1
  94. package/skills/testomatio/test-management/testomatio-mcp/references/MCP_SETUP.md +8 -0
  95. package/assets/testeiya-logo-dark.svg +0 -16
  96. package/assets/testeiya-logo.svg +0 -15
  97. package/models.catalog.json +0 -6963
  98. package/skills/playwright-best-practices-skill/LICENSE.md +0 -7
  99. package/skills/playwright-best-practices-skill/README.md +0 -147
  100. package/skills/testeiya/README.md +0 -29
  101. package/skills/testeiya/answer-formatting/SKILL.md +0 -30
  102. package/skills/testeiya/check-cucumber/SKILL.md +0 -200
  103. package/skills/testeiya/check-tests/SKILL.md +0 -260
  104. package/skills/testeiya/manual-run-assistant/SKILL.md +0 -61
  105. package/skills/testeiya/testomatio-docs/INDEX.md +0 -175
  106. package/skills/testeiya/testomatio-docs/SKILL.md +0 -102
  107. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-agents.md +0 -144
  108. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-powered-features.md +0 -531
  109. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-requirements.md +0 -437
  110. package/skills/testeiya/testomatio-docs/docs/advanced/api-access/index.md +0 -191
  111. package/skills/testeiya/testomatio-docs/docs/advanced/branches-folder/index.md +0 -277
  112. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-demos.mdx +0 -39
  113. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-on-suite-and-test-level.md +0 -122
  114. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/what-is-bulk-edit.md +0 -170
  115. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/branches.md +0 -53
  116. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/index.mdx +0 -98
  117. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/jira-issue.md +0 -151
  118. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/runs-and-reports.md +0 -377
  119. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/work-in-jira.md +0 -267
  120. package/skills/testeiya/testomatio-docs/docs/advanced/living-doc/index.md +0 -138
  121. package/skills/testeiya/testomatio-docs/docs/advanced/milestones/index.md +0 -220
  122. package/skills/testeiya/testomatio-docs/docs/advanced/shortcuts/index.md +0 -48
  123. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/labels-and-custom-fields.md +0 -201
  124. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags-or-labels.md +0 -94
  125. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags.md +0 -243
  126. package/skills/testeiya/testomatio-docs/docs/advanced/test-artifacts/index.md +0 -135
  127. package/skills/testeiya/testomatio-docs/docs/advanced/tql/index.md +0 -394
  128. package/skills/testeiya/testomatio-docs/docs/getting-started/index.md +0 -290
  129. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/azure.md +0 -96
  130. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bamboo.md +0 -94
  131. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bitbucket.md +0 -106
  132. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/circle.md +0 -115
  133. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/github.md +0 -120
  134. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/gitlab.md +0 -88
  135. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/index.mdx +0 -151
  136. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/jenkins.md +0 -121
  137. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/teamcity.md +0 -96
  138. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/azure.md +0 -31
  139. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/clickup.md +0 -54
  140. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/confluence.md +0 -34
  141. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/github.md +0 -31
  142. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/gitlab.md +0 -93
  143. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/index.md +0 -131
  144. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/jira.md +0 -164
  145. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/linear.md +0 -29
  146. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/shortcut.md +0 -67
  147. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/youtrack.md +0 -94
  148. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/azure-devops.md +0 -53
  149. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/email.md +0 -71
  150. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/jira.md +0 -52
  151. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/ms-teams.md +0 -60
  152. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/rules.md +0 -267
  153. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/slack.md +0 -82
  154. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/telegram.md +0 -73
  155. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/index.mdx +0 -207
  156. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/okta.md +0 -204
  157. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/azure.md +0 -95
  158. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/google.md +0 -75
  159. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/index.mdx +0 -33
  160. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/okta.md +0 -108
  161. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/saml.md +0 -66
  162. package/skills/testeiya/testomatio-docs/docs/legal/compliance/gdpr.md +0 -95
  163. package/skills/testeiya/testomatio-docs/docs/legal/compliance/index.mdx +0 -94
  164. package/skills/testeiya/testomatio-docs/docs/legal/compliance/privacy.md +0 -26
  165. package/skills/testeiya/testomatio-docs/docs/legal/compliance/terms.md +0 -32
  166. package/skills/testeiya/testomatio-docs/docs/legal/security/index.mdx +0 -242
  167. package/skills/testeiya/testomatio-docs/docs/legal/security/jira.md +0 -140
  168. package/skills/testeiya/testomatio-docs/docs/legal/security/subprocessors.md +0 -76
  169. package/skills/testeiya/testomatio-docs/docs/management/company/administration.md +0 -363
  170. package/skills/testeiya/testomatio-docs/docs/management/company/audit-log.md +0 -41
  171. package/skills/testeiya/testomatio-docs/docs/management/company/plan-features-comparison.md +0 -240
  172. package/skills/testeiya/testomatio-docs/docs/management/company/subscriptions.md +0 -326
  173. package/skills/testeiya/testomatio-docs/docs/management/company/trials.md +0 -75
  174. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/accountant.md +0 -49
  175. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/index.mdx +0 -285
  176. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/read-only-user.md +0 -67
  177. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/teams.md +0 -138
  178. package/skills/testeiya/testomatio-docs/docs/management/project/settings.md +0 -87
  179. package/skills/testeiya/testomatio-docs/docs/management/project/templates.md +0 -546
  180. package/skills/testeiya/testomatio-docs/docs/project/analytics/index.md +0 -326
  181. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/classical-tests-markdown-format.md +0 -386
  182. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/download-manual-tests-as-files.md +0 -378
  183. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-obsidian.md +0 -112
  184. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-spreadsheet.md +0 -127
  185. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/auto-import.md +0 -63
  186. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Allure-TestOps.md +0 -49
  187. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-QTest.md +0 -41
  188. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Qase.md +0 -39
  189. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Zephyr.md +0 -37
  190. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-csv-xlsx.md +0 -117
  191. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-cucumber.md +0 -93
  192. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-qmetry.md +0 -44
  193. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-source-code.md +0 -117
  194. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testcaselabs.md +0 -44
  195. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testmo.md +0 -47
  196. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testrail.md +0 -82
  197. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-xray.md +0 -55
  198. package/skills/testeiya/testomatio-docs/docs/project/plans/index.md +0 -334
  199. package/skills/testeiya/testomatio-docs/docs/project/pulse/index.md +0 -104
  200. package/skills/testeiya/testomatio-docs/docs/project/runs/archive-runs-and-groups.md +0 -176
  201. package/skills/testeiya/testomatio-docs/docs/project/runs/custom-statuses.md +0 -195
  202. package/skills/testeiya/testomatio-docs/docs/project/runs/environments.md +0 -203
  203. package/skills/testeiya/testomatio-docs/docs/project/runs/managing-runs.md +0 -455
  204. package/skills/testeiya/testomatio-docs/docs/project/runs/merge-strategies.md +0 -137
  205. package/skills/testeiya/testomatio-docs/docs/project/runs/reports.md +0 -329
  206. package/skills/testeiya/testomatio-docs/docs/project/runs/rungroups.md +0 -342
  207. package/skills/testeiya/testomatio-docs/docs/project/runs/running-automated-tests.md +0 -256
  208. package/skills/testeiya/testomatio-docs/docs/project/runs/running-manual-and-automated-tests.md +0 -331
  209. package/skills/testeiya/testomatio-docs/docs/project/runs/running-tests-manually.md +0 -633
  210. package/skills/testeiya/testomatio-docs/docs/project/runs/temporary-tests-notes.md +0 -223
  211. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/snippets.md +0 -68
  212. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/steps.md +0 -181
  213. package/skills/testeiya/testomatio-docs/docs/project/tests/bdd-test-case-editor.md +0 -98
  214. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-test-case-editor.md +0 -354
  215. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-vs-bdd.md +0 -169
  216. package/skills/testeiya/testomatio-docs/docs/project/tests/copy-and-move-your-tests.md +0 -156
  217. package/skills/testeiya/testomatio-docs/docs/project/tests/other-features-for-test-case-design.md +0 -412
  218. package/skills/testeiya/testomatio-docs/docs/project/tests/test-case-creation-and-editing.md +0 -527
  219. package/skills/testeiya/testomatio-docs/docs/support/index.md +0 -75
  220. package/skills/testeiya/testomatio-docs/docs/test-reporting/artifacts.md +0 -388
  221. package/skills/testeiya/testomatio-docs/docs/test-reporting/cli.md +0 -215
  222. package/skills/testeiya/testomatio-docs/docs/test-reporting/configuration.md +0 -247
  223. package/skills/testeiya/testomatio-docs/docs/test-reporting/frameworks.md +0 -490
  224. package/skills/testeiya/testomatio-docs/docs/test-reporting/functions.md +0 -144
  225. package/skills/testeiya/testomatio-docs/docs/test-reporting/index.mdx +0 -48
  226. package/skills/testeiya/testomatio-docs/docs/test-reporting/junit.md +0 -248
  227. package/skills/testeiya/testomatio-docs/docs/test-reporting/logger.md +0 -138
  228. package/skills/testeiya/testomatio-docs/docs/test-reporting/php.md +0 -77
  229. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/bitbucket.md +0 -72
  230. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/csv.md +0 -23
  231. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/debug.md +0 -18
  232. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/github.md +0 -63
  233. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/gitlab.md +0 -29
  234. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/html.md +0 -80
  235. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/index.mdx +0 -57
  236. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/testomatio.md +0 -331
  237. package/skills/testeiya/testomatio-docs/docs/test-reporting/python.md +0 -229
  238. package/skills/testeiya/testomatio-docs/docs/test-reporting/workflows.md +0 -325
  239. package/skills/testeiya/testomatio-docs/docs/tutorials/Interacting-via-API.md +0 -159
  240. package/skills/testeiya/testomatio-docs/docs/tutorials/Manual-Testing-Classic.md +0 -164
  241. package/skills/testeiya/testomatio-docs/docs/tutorials/Set-Up-Read-Only-Access.md +0 -85
  242. package/skills/testeiya/testomatio-docs/docs/tutorials/Using-AI-in-Testing.md +0 -163
  243. package/skills/testeiya/testomatio-docs/docs/tutorials/Working-with-Jira.md +0 -125
  244. package/skills/testeiya/testomatio-docs/docs/tutorials/java.md +0 -478
  245. package/skills/testeiya/testomatio-docs/docs/tutorials/playwright.md +0 -207
  246. package/skills/testeiya/testomatio-docs/docs/tutorials/webdriver.md +0 -218
  247. package/skills/testeiya/testomatio-docs/docs.lock.json +0 -6
  248. package/skills/testeiya/testomatio-reporter/SKILL.md +0 -307
  249. package/skills/testomatio/test-automation/setup-pr-testing/SKILL.md +0 -199
  250. package/skills.yaml +0 -21
  251. package/src/ai-debug.ts +0 -188
  252. package/src/api/agent-get.ts +0 -22
  253. package/src/api/agent-start.ts +0 -384
  254. package/src/api/client-log.ts +0 -29
  255. package/src/api/context.ts +0 -332
  256. package/src/api/debug-layout.ts +0 -47
  257. package/src/api/debug-report.ts +0 -29
  258. package/src/api/debug-snapshot.ts +0 -30
  259. package/src/api/debug-stream.ts +0 -52
  260. package/src/api/files-delete.ts +0 -184
  261. package/src/api/files-read.ts +0 -41
  262. package/src/api/files-rename.ts +0 -99
  263. package/src/api/files-tree.ts +0 -292
  264. package/src/api/files-write.ts +0 -41
  265. package/src/api/mcp.ts +0 -603
  266. package/src/api/memory.ts +0 -69
  267. package/src/api/open-external.ts +0 -39
  268. package/src/api/playwright-cli.ts +0 -606
  269. package/src/api/providers.ts +0 -457
  270. package/src/api/read-env-token.ts +0 -33
  271. package/src/api/sessions.ts +0 -79
  272. package/src/api/settings.ts +0 -120
  273. package/src/api/skills.ts +0 -58
  274. package/src/api/testomatio-attachment.ts +0 -89
  275. package/src/api/testomatio-auth.ts +0 -284
  276. package/src/api/testomatio-proxy.ts +0 -197
  277. package/src/api/testomatio-run-stats.ts +0 -81
  278. package/src/api/testomatio-target.ts +0 -225
  279. package/src/api/testomatio-transcription.ts +0 -82
  280. package/src/api/workspace-search.ts +0 -96
  281. package/src/api/workspace-sync.ts +0 -151
  282. package/src/api/workspace.ts +0 -165
  283. package/src/app-server.ts +0 -556
  284. package/src/bridge.ts +0 -251
  285. package/src/check-tests.ts +0 -156
  286. package/src/cli.ts +0 -17
  287. package/src/commands.ts +0 -244
  288. package/src/config.ts +0 -183
  289. package/src/connection.ts +0 -658
  290. package/src/context-store.ts +0 -265
  291. package/src/debug-bus.ts +0 -405
  292. package/src/extensions/tool-gate.ts +0 -220
  293. package/src/extensions/webui/ask-channel.ts +0 -52
  294. package/src/extensions/webui/index.ts +0 -184
  295. package/src/extensions/webui/tools/ask-question.ts +0 -88
  296. package/src/extensions/webui/tools/query-result.ts +0 -79
  297. package/src/extensions/webui/tools/render-chart.ts +0 -53
  298. package/src/extensions/webui/tools/render-item.ts +0 -61
  299. package/src/extensions/webui/tools/render-list.ts +0 -170
  300. package/src/extensions/webui/tools/render-result.ts +0 -85
  301. package/src/extensions/webui/tools/render-tree.ts +0 -71
  302. package/src/extensions/webui/tools/ui-widget.ts +0 -54
  303. package/src/extensions/webui/tools/widget-result.ts +0 -13
  304. package/src/extensions/webui/widget-channel.ts +0 -50
  305. package/src/file-log.ts +0 -196
  306. package/src/git-tracked.ts +0 -68
  307. package/src/gitignore.ts +0 -53
  308. package/src/json-store.ts +0 -43
  309. package/src/load-env.ts +0 -70
  310. package/src/loader-style.ts +0 -96
  311. package/src/main.ts +0 -140
  312. package/src/mcp-catalog.ts +0 -96
  313. package/src/models-catalog.ts +0 -72
  314. package/src/permissions.ts +0 -120
  315. package/src/project-dir.ts +0 -189
  316. package/src/project-info.ts +0 -108
  317. package/src/prompt/app-ui.ts +0 -59
  318. package/src/prompt/browser.ts +0 -27
  319. package/src/prompt/index.ts +0 -62
  320. package/src/prompt/tools.ts +0 -27
  321. package/src/server-info.ts +0 -62
  322. package/src/session-factory.ts +0 -442
  323. package/src/session-store.ts +0 -115
  324. package/src/shell-env.ts +0 -45
  325. package/src/skills.ts +0 -163
  326. package/src/sync-snapshot.ts +0 -140
  327. package/src/telemetry.ts +0 -239
  328. package/src/testomatio-auth.ts +0 -299
  329. package/src/testomatio.ts +0 -98
  330. package/src/theme.ts +0 -30
  331. package/src/user-env.ts +0 -94
  332. package/src/welcome.ts +0 -194
  333. package/src/workspace/safe-path.ts +0 -85
  334. package/src/workspace/test-md.ts +0 -70
  335. package/src/workspace-model.ts +0 -440
  336. package/testeiya.config.json +0 -14
  337. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/authentication-flows.md +0 -0
  338. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/authentication.md +0 -0
  339. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/clock-mocking.md +0 -0
  340. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/mobile-testing.md +0 -0
  341. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/multi-context.md +0 -0
  342. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/multi-user.md +0 -0
  343. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/network-advanced.md +0 -0
  344. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/advanced/third-party.md +0 -0
  345. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/architecture/pom-vs-fixtures.md +0 -0
  346. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/architecture/test-architecture.md +0 -0
  347. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/architecture/when-to-mock.md +0 -0
  348. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/browser-apis.md +0 -0
  349. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/iframes.md +0 -0
  350. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/service-workers.md +0 -0
  351. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/browser-apis/websockets.md +0 -0
  352. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/annotations.md +0 -0
  353. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/assertions-waiting.md +0 -0
  354. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/configuration.md +0 -0
  355. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/fixtures-hooks.md +0 -0
  356. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/global-setup.md +0 -0
  357. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/locators.md +0 -0
  358. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/page-object-model.md +0 -0
  359. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/projects-dependencies.md +0 -0
  360. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/test-data.md +0 -0
  361. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/test-suite-structure.md +0 -0
  362. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/core/test-tags.md +0 -0
  363. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/console-errors.md +0 -0
  364. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/debugging.md +0 -0
  365. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/error-testing.md +0 -0
  366. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/debugging/flaky-tests.md +0 -0
  367. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/angular.md +0 -0
  368. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/nextjs.md +0 -0
  369. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/react.md +0 -0
  370. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/frameworks/vue.md +0 -0
  371. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/ci-cd.md +0 -0
  372. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/docker.md +0 -0
  373. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/github-actions.md +0 -0
  374. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/gitlab.md +0 -0
  375. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/other-providers.md +0 -0
  376. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/parallel-sharding.md +0 -0
  377. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/performance.md +0 -0
  378. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/reporting.md +0 -0
  379. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/infrastructure-ci-cd/test-coverage.md +0 -0
  380. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/accessibility.md +0 -0
  381. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/api-testing.md +0 -0
  382. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/browser-extensions.md +0 -0
  383. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/canvas-webgl.md +0 -0
  384. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/component-testing.md +0 -0
  385. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/drag-drop.md +0 -0
  386. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/electron.md +0 -0
  387. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/file-operations.md +0 -0
  388. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/file-upload-download.md +0 -0
  389. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/forms-validation.md +0 -0
  390. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/graphql-testing.md +0 -0
  391. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/i18n.md +0 -0
  392. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/performance-testing.md +0 -0
  393. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/security-testing.md +0 -0
  394. /package/skills/{playwright-best-practices-skill → playwright/playwright-best-practices}/testing-patterns/visual-regression.md +0 -0
  395. /package/skills/{playwright-cli → playwright/playwright-cli}/SKILL.md +0 -0
  396. /package/skills/{playwright-cli → playwright/playwright-cli}/references/element-attributes.md +0 -0
  397. /package/skills/{playwright-cli → playwright/playwright-cli}/references/playwright-tests.md +0 -0
  398. /package/skills/{playwright-cli → playwright/playwright-cli}/references/request-mocking.md +0 -0
  399. /package/skills/{playwright-cli → playwright/playwright-cli}/references/running-code.md +0 -0
  400. /package/skills/{playwright-cli → playwright/playwright-cli}/references/session-management.md +0 -0
  401. /package/skills/{playwright-cli → playwright/playwright-cli}/references/storage-state.md +0 -0
  402. /package/skills/{playwright-cli → playwright/playwright-cli}/references/test-generation.md +0 -0
  403. /package/skills/{playwright-cli → playwright/playwright-cli}/references/tracing.md +0 -0
  404. /package/skills/{playwright-cli → playwright/playwright-cli}/references/video-recording.md +0 -0
package/src/user-env.ts DELETED
@@ -1,94 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { HOME_DIR, PROJECT_DIR } from "./project-dir.js";
4
- import { parseEnv } from "./load-env.js";
5
-
6
- /**
7
- * User-managed environment variables, edited as raw `KEY=value` text in the
8
- * Settings UI. Two scopes:
9
- *
10
- * - **Global** — `~/.testeiya/.env`, shared by every workspace. The same file
11
- * `load-env.ts` loads at startup (so a provider key like OPENROUTER_API_KEY
12
- * resolves) and the one `shell-env.ts` overlays onto every agent bash
13
- * command. Saving applies the vars to the live process; the keys are also
14
- * tracked here so the shell overlay knows which vars to inject.
15
- * - **Project** — `<cwd>/.testeiya/.env`, one per workspace. Never applied to
16
- * the server process (sessions with other workspaces must not see it);
17
- * `shell-env.ts` overlays it per session on top of the global vars, so a
18
- * project value wins over a global one with the same name. The `.testeiya`
19
- * dir is self-gitignored so the secrets stay out of the repo.
20
- */
21
-
22
- const ENV_PATH = join(HOME_DIR, ".env");
23
-
24
- // Always surfaced as empty slots in the textarea so the user has a place to
25
- // paste the common LLM provider keys, even when the file holds other vars.
26
- const DEFAULT_KEYS = ["OPENAI_API_KEY", "OPENROUTER_API_KEY"];
27
-
28
- let cachedKeys: string[] | null = null;
29
-
30
- export function readUserEnvText(): string {
31
- const raw = readEnvFile();
32
- const base = (raw?.trim() ? raw : "").replace(/\n+$/, "");
33
- const present = new Set(Object.keys(parseEnv(base)));
34
- const missing = DEFAULT_KEYS.filter((key) => !present.has(key)).map(
35
- (key) => `${key}=`,
36
- );
37
- const lines = base ? [base, ...missing] : missing;
38
- return `${lines.join("\n")}\n`;
39
- }
40
-
41
- export function saveUserEnvText(text: string): string[] {
42
- const previous = parseEnv(readEnvFile() ?? "");
43
- const next = parseEnv(text);
44
- const normalized = text.endsWith("\n") ? text : `${text}\n`;
45
- mkdirSync(HOME_DIR, { recursive: true });
46
- writeFileSync(ENV_PATH, normalized, { mode: 0o600 });
47
- for (const key of Object.keys(previous)) {
48
- if (!(key in next)) delete process.env[key];
49
- }
50
- for (const [key, value] of Object.entries(next)) {
51
- if (value) process.env[key] = value;
52
- else delete process.env[key];
53
- }
54
- cachedKeys = Object.keys(next);
55
- return cachedKeys;
56
- }
57
-
58
- export function userEnvKeys(): string[] {
59
- if (cachedKeys) return cachedKeys;
60
- cachedKeys = Object.keys(parseEnv(readEnvFile() ?? ""));
61
- return cachedKeys;
62
- }
63
-
64
- export function readProjectEnvText(cwd: string): string {
65
- const raw = readEnvFile(projectEnvPath(cwd));
66
- if (!raw?.trim()) return "";
67
- return raw.endsWith("\n") ? raw : `${raw}\n`;
68
- }
69
-
70
- export function saveProjectEnvText(cwd: string, text: string): void {
71
- const dir = join(cwd, PROJECT_DIR);
72
- mkdirSync(dir, { recursive: true });
73
- const gitignore = join(dir, ".gitignore");
74
- if (!existsSync(gitignore)) writeFileSync(gitignore, "*\n", "utf8");
75
- const normalized = text.endsWith("\n") ? text : `${text}\n`;
76
- writeFileSync(projectEnvPath(cwd), normalized, { mode: 0o600 });
77
- }
78
-
79
- export function projectEnvVars(cwd: string): Record<string, string> {
80
- return parseEnv(readEnvFile(projectEnvPath(cwd)) ?? "");
81
- }
82
-
83
- function projectEnvPath(cwd: string): string {
84
- return join(cwd, PROJECT_DIR, ".env");
85
- }
86
-
87
- function readEnvFile(path = ENV_PATH): string | null {
88
- if (!existsSync(path)) return null;
89
- try {
90
- return readFileSync(path, "utf8");
91
- } catch {
92
- return null;
93
- }
94
- }
package/src/welcome.ts DELETED
@@ -1,194 +0,0 @@
1
- import { type Component, padding, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
2
-
3
- const BRIGHT = "\x1b[38;2;158;102;255m"; // #9e66ff — brand light violet
4
- const SHADOW = "\x1b[38;2;46;16;101m"; // #2e1065 — deep violet
5
- const PALE = "\x1b[38;2;221;214;254m"; // #ddd6fe — pale violet
6
-
7
- // Top-to-bottom gradient: brightest at the first row, darkening downward.
8
- const GRAD_TOP = [196, 181, 253]; // #c4b5fd light violet
9
- const GRAD_BOT = [109, 40, 217]; // #6d28d9 deep violet
10
-
11
- function gradientFg(row: number, rows: number): string {
12
- const t = rows <= 1 ? 0 : row / (rows - 1);
13
- const r = Math.round(GRAD_TOP[0] + (GRAD_BOT[0] - GRAD_TOP[0]) * t);
14
- const g = Math.round(GRAD_TOP[1] + (GRAD_BOT[1] - GRAD_TOP[1]) * t);
15
- const b = Math.round(GRAD_TOP[2] + (GRAD_BOT[2] - GRAD_TOP[2]) * t);
16
- return `\x1b[38;2;${r};${g};${b}m`;
17
- }
18
- const DIM = "\x1b[38;2;107;114;128m";
19
- const RESET = "\x1b[0m";
20
-
21
- // 5-line block-letter "TESTEIYA".
22
- const WORDMARK_LINES = [
23
- "████████ ███████ ███████ ████████ ███████ ██████ ██ ██ █████",
24
- " ██ ██ ██ ██ ██ ██ ██ ██ ██ ██",
25
- " ██ █████ ███████ ██ █████ ██ ████ ███████",
26
- " ██ ██ ██ ██ ██ ██ ██ ██ ██",
27
- " ██ ███████ ███████ ██ ███████ ██████ ██ ██ ██",
28
- ];
29
-
30
- const SHADOW_DX = 1;
31
- const SHADOW_DY = 1;
32
- const FG_BLOCK = "█";
33
- const SH_BLOCK = "█";
34
-
35
- // Programmatic drop shadow: clones the wordmark offset (dx, dy) in dark green,
36
- // foreground bright green on top. Returns rendered ANSI lines + visible width.
37
- function buildShadowedWordmark(): { lines: string[]; width: number } {
38
- const srcW = WORDMARK_LINES.reduce((m, l) => Math.max(m, l.length), 0);
39
- const padded = WORDMARK_LINES.map(l => l.padEnd(srcW, " "));
40
- const totalRows = padded.length + SHADOW_DY;
41
- const totalCols = srcW + SHADOW_DX;
42
-
43
- const lines: string[] = [];
44
- for (let r = 0; r < totalRows; r++) {
45
- let out = "";
46
- for (let c = 0; c < totalCols; c++) {
47
- const fg = padded[r]?.[c] ?? " ";
48
- const sr = r - SHADOW_DY;
49
- const sc = c - SHADOW_DX;
50
- const sh = sr >= 0 && sc >= 0 ? (padded[sr]?.[sc] ?? " ") : " ";
51
- if (fg === FG_BLOCK) out += `${gradientFg(r, padded.length)}${FG_BLOCK}${RESET}`;
52
- else if (sh === FG_BLOCK) out += `${SHADOW}${SH_BLOCK}${RESET}`;
53
- else out += " ";
54
- }
55
- lines.push(out);
56
- }
57
- return { lines, width: totalCols };
58
- }
59
-
60
- const SHADOWED = buildShadowedWordmark();
61
- const WORDMARK_WIDTH = SHADOWED.width;
62
-
63
- // The Testeiya logo mark (violet circle + white check) as a 12×12 pixel bitmap.
64
- // L = light violet #9e66ff, P = deep violet #7e33ff, W = white #f5f3ff, . = transparent.
65
- const LOGO_PIXELS = [
66
- "....LLLP....",
67
- "..LLLLLPPPWW",
68
- ".LLLLLLPPWW.",
69
- ".LLLLLLPWWP.",
70
- "LLLLLLLWWPPP",
71
- "LWWLLLWWPPPP",
72
- "LLWWLWWPPPPP",
73
- "LLLWWWLPPPPP",
74
- ".LLWWLLPPPP.",
75
- ".LLLLLLPPPP.",
76
- "..LLLLLPPP..",
77
- "....LLLP....",
78
- ];
79
-
80
- const LOGO_FG: Record<string, string> = {
81
- L: "\x1b[38;2;158;102;255m",
82
- P: "\x1b[38;2;126;51;255m",
83
- W: "\x1b[38;2;245;243;255m",
84
- };
85
-
86
- const LOGO_BG: Record<string, string> = {
87
- L: "\x1b[48;2;158;102;255m",
88
- P: "\x1b[48;2;126;51;255m",
89
- W: "\x1b[48;2;245;243;255m",
90
- };
91
-
92
- // Renders the bitmap with half-blocks: each character cell stacks two pixel
93
- // rows (▀ fg = top pixel, bg = bottom pixel), so the 12×12 logo takes 6 lines.
94
- function buildLogo(): { lines: string[]; width: number } {
95
- const lines: string[] = [];
96
- for (let r = 0; r < LOGO_PIXELS.length; r += 2) {
97
- const top = LOGO_PIXELS[r];
98
- const bot = LOGO_PIXELS[r + 1] ?? "";
99
- let out = "";
100
- for (let c = 0; c < top.length; c++) {
101
- const t = top[c] ?? ".";
102
- const b = bot[c] ?? ".";
103
- if (t === "." && b === ".") {
104
- out += " ";
105
- } else if (b === ".") {
106
- out += `${LOGO_FG[t]}▀${RESET}`;
107
- } else if (t === ".") {
108
- out += `${LOGO_FG[b]}▄${RESET}`;
109
- } else if (t === b) {
110
- out += `${LOGO_FG[t]}█${RESET}`;
111
- } else {
112
- out += `${LOGO_FG[t]}${LOGO_BG[b]}▀${RESET}`;
113
- }
114
- }
115
- lines.push(out);
116
- }
117
- return { lines, width: LOGO_PIXELS[0].length };
118
- }
119
-
120
- const LOGO = buildLogo();
121
- const LOGO_GAP = 1;
122
-
123
- const COMPACT_MARK = "▰ TESTEIYA ▰";
124
-
125
- export class TesteiyaWelcome implements Component {
126
- constructor(
127
- private readonly version: string,
128
- private modelName: string,
129
- private providerName: string,
130
- private skills: string[] = [],
131
- ) {}
132
-
133
- invalidate(): void {}
134
-
135
- setModel(modelName: string, providerName: string): void {
136
- this.modelName = modelName;
137
- this.providerName = providerName;
138
- }
139
-
140
- setLspServers(_servers: unknown[]): void {}
141
-
142
- render(termWidth: number): string[] {
143
- const width = Math.min(80, termWidth);
144
- if (width < 20) return [];
145
-
146
- const lines: string[] = [""];
147
-
148
- const combinedWidth = LOGO.width + LOGO_GAP + WORDMARK_WIDTH;
149
- if (width >= combinedWidth) {
150
- const leftPad = padding(Math.floor((width - combinedWidth) / 2));
151
- for (let i = 0; i < SHADOWED.lines.length; i++) {
152
- const logoRow = LOGO.lines[i] ?? padding(LOGO.width);
153
- lines.push(this.#fit(`${leftPad}${logoRow}${padding(LOGO_GAP)}${SHADOWED.lines[i]}`, width));
154
- }
155
- } else if (width >= WORDMARK_WIDTH + 2) {
156
- const leftPad = padding(Math.floor((width - WORDMARK_WIDTH) / 2));
157
- for (const row of SHADOWED.lines) {
158
- lines.push(this.#fit(`${leftPad}${row}`, width));
159
- }
160
- } else {
161
- lines.push(this.#center(`${BRIGHT}${COMPACT_MARK}${RESET}`, width));
162
- }
163
-
164
- lines.push("");
165
- lines.push(this.#center(`${PALE}AI Testing Agent${RESET} ${DIM}·${RESET} ${PALE}Testomat.io${RESET}`, width));
166
- lines.push("");
167
-
168
- lines.push(this.#center(`${DIM}${this.modelName} via ${this.providerName}${RESET}`, width));
169
-
170
- if (this.skills.length > 0) {
171
- const skillList = this.skills.slice(0, 6).join(`${DIM} · ${RESET}`);
172
- lines.push(this.#center(`${DIM}skills:${RESET} ${skillList}`, width));
173
- }
174
-
175
- lines.push("");
176
- lines.push(this.#center(`${DIM}/model switch · /project switch · /skills list · /help${RESET}`, width));
177
- lines.push("");
178
-
179
- return lines;
180
- }
181
-
182
- #fit(str: string, width: number): string {
183
- const w = visibleWidth(str);
184
- if (w > width) return truncateToWidth(str, width);
185
- return str + padding(width - w);
186
- }
187
-
188
- #center(str: string, width: number): string {
189
- const w = visibleWidth(str);
190
- if (w >= width) return truncateToWidth(str, width);
191
- const left = Math.floor((width - w) / 2);
192
- return padding(left) + str + padding(width - w - left);
193
- }
194
- }
@@ -1,85 +0,0 @@
1
- import path from "node:path";
2
- import fs from "node:fs";
3
-
4
- /**
5
- * Resolve a user-supplied relative path against the session's `cwd` and
6
- * verify it doesn't escape the workspace. Returns the absolute path on
7
- * success, `null` if the path is outside the workspace.
8
- *
9
- * Containment is checked both lexically (cheap, rejects `..` and the
10
- * `/work` vs `/work-evil` prefix false positive) and via `realpath` (a symlink
11
- * inside the workspace must not point out). On success the *lexical* path is
12
- * returned — only the containment decision uses realpath — so callers read and
13
- * write the path the user named and the no-symlink case is unchanged.
14
- */
15
- export function safeResolve(cwd: string, relPath: string): string | null {
16
- const normalizedCwd = path.resolve(cwd);
17
- const abs = path.resolve(normalizedCwd, relPath || ".");
18
-
19
- if (abs !== normalizedCwd && !abs.startsWith(normalizedCwd + path.sep)) {
20
- return null;
21
- }
22
-
23
- let realCwd: string;
24
- try {
25
- realCwd = fs.realpathSync(normalizedCwd);
26
- } catch {
27
- return null;
28
- }
29
- const realTarget = realpathExistingPrefix(abs);
30
- if (realTarget !== realCwd && !realTarget.startsWith(realCwd + path.sep)) {
31
- return null;
32
- }
33
- return abs;
34
- }
35
-
36
- /**
37
- * Like `safeResolve` but without the realpath escape check: containment is
38
- * lexical only, so paths that traverse a workspace symlink (a linked context
39
- * dir under `.testeiya/`) resolve to their real target. For read-only
40
- * endpoints — the link is workspace content the user placed deliberately, and
41
- * reading through it is the point. Still rejects `..` escapes.
42
- */
43
- export function safeResolveThroughLinks(cwd: string, relPath: string): string | null {
44
- const normalizedCwd = path.resolve(cwd);
45
- const abs = path.resolve(normalizedCwd, relPath || ".");
46
- if (abs !== normalizedCwd && !abs.startsWith(normalizedCwd + path.sep)) return null;
47
- return abs;
48
- }
49
-
50
- /**
51
- * When `relPath` names a symlink that lives inside the workspace (its parent
52
- * dir realpaths into the workspace — not a link found inside another linked
53
- * dir), return its absolute path; else null. Callers use this to operate on
54
- * the link itself (unlink) without ever touching what it points at.
55
- */
56
- export function workspaceSymlink(cwd: string, relPath: string): string | null {
57
- const normalizedCwd = path.resolve(cwd);
58
- const abs = safeResolveThroughLinks(cwd, relPath);
59
- if (!abs || abs === normalizedCwd) return null;
60
- try {
61
- if (!fs.lstatSync(abs).isSymbolicLink()) return null;
62
- const realCwd = fs.realpathSync(normalizedCwd);
63
- const parentReal = fs.realpathSync(path.dirname(abs));
64
- if (parentReal === realCwd || parentReal.startsWith(realCwd + path.sep)) return abs;
65
- } catch {
66
- // dangling parent or race — treat as not a workspace symlink
67
- }
68
- return null;
69
- }
70
-
71
- // Realpath the deepest existing ancestor of `p`, so a not-yet-created write
72
- // target resolves through any symlinked parent dirs without requiring the leaf
73
- // to exist.
74
- function realpathExistingPrefix(p: string): string {
75
- let current = p;
76
- for (;;) {
77
- try {
78
- return fs.realpathSync(current);
79
- } catch {
80
- const parent = path.dirname(current);
81
- if (parent === current) return current;
82
- current = parent;
83
- }
84
- }
85
- }
@@ -1,70 +0,0 @@
1
- // Parsing helpers for `*.test.md` files — the check-tests markdown format where a
2
- // file is a suite (`<!-- suite\nid: @S… -->`) and each test is a `<!-- test\nid:
3
- // @T… -->` block above a `#`/`##` heading. Shared by the delete + rename endpoints.
4
-
5
- export const TEST_MD_RE = /\.test\.md$/i;
6
-
7
- const SUITE_ID_RE = /@S([\w\d]{8})/;
8
- const SUITE_EMOJI_RE = /<!--\s*suite\b(?:(?!-->)[\s\S])*?emoji:[ \t]*(\S+)/;
9
- const TEST_ID_RE = /@T([\w\d]{8})/;
10
- const TEST_MARKER_RE = /^<!--\s*test\b/;
11
- const ANY_MARKER_RE = /^<!--\s*(test|suite)\b/;
12
- const HEADING_RE = /^#{1,2}\s+(.+?)\s*$/;
13
-
14
- /** The suite id (`@S…`, prefix stripped) from a file's `<!-- suite` block. */
15
- export function suiteId(content: string): string | null {
16
- const match = SUITE_ID_RE.exec(content);
17
- if (!match) return null;
18
- return match[1];
19
- }
20
-
21
- /** The `emoji:` value from a file's first `<!-- suite` block (null when absent/empty). */
22
- export function suiteEmoji(content: string): string | null {
23
- const match = SUITE_EMOJI_RE.exec(content);
24
- if (!match) return null;
25
- return match[1];
26
- }
27
-
28
- /** Line range of the test whose heading equals `anchor`, marker line through the
29
- * line before the next `<!-- test`/`<!-- suite` marker (or EOF). */
30
- export function findTestBlock(
31
- lines: string[],
32
- anchor: string
33
- ): { start: number; end: number } | null {
34
- for (let i = 0; i < lines.length; i++) {
35
- if (!TEST_MARKER_RE.test(lines[i])) continue;
36
- if (blockTitle(lines, i) !== anchor) continue;
37
- let end = lines.length - 1;
38
- for (let j = i + 1; j < lines.length; j++) {
39
- if (!ANY_MARKER_RE.test(lines[j])) continue;
40
- end = j - 1;
41
- break;
42
- }
43
- return { start: i, end };
44
- }
45
- return null;
46
- }
47
-
48
- /** The test id (`@T…`, prefix stripped) inside a block. */
49
- export function blockTestId(lines: string[], block: { start: number; end: number }): string | null {
50
- const match = TEST_ID_RE.exec(lines.slice(block.start, block.end + 1).join("\n"));
51
- if (!match) return null;
52
- return match[1];
53
- }
54
-
55
- /** Index of the block's first `#`/`##` heading line, or -1. */
56
- export function blockHeadingLine(lines: string[], block: { start: number; end: number }): number {
57
- for (let j = block.start + 1; j <= block.end; j++) {
58
- if (HEADING_RE.test(lines[j])) return j;
59
- }
60
- return -1;
61
- }
62
-
63
- function blockTitle(lines: string[], markerLine: number): string | null {
64
- for (let j = markerLine + 1; j < lines.length; j++) {
65
- if (ANY_MARKER_RE.test(lines[j])) return null;
66
- const match = HEADING_RE.exec(lines[j]);
67
- if (match) return match[1];
68
- }
69
- return null;
70
- }