testeiya 0.9.0 β†’ 0.10.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 (60) hide show
  1. package/PIPELINES.md +156 -19
  2. package/README.md +30 -14
  3. package/dist/prompt/pipeline-report.js +23 -0
  4. package/dist/prompt/pipeline-report.js.map +1 -0
  5. package/dist/prompt/report.js +1 -1
  6. package/dist/prompt/system-prompt.js +1 -1
  7. package/dist/prompt/system-prompt.js.map +1 -1
  8. package/dist/prompt/testomat.io.js +2 -2
  9. package/dist/prompt/testomat.io.js.map +1 -1
  10. package/dist/src/args.js +19 -1
  11. package/dist/src/args.js.map +1 -1
  12. package/dist/src/cli.js +4 -2
  13. package/dist/src/cli.js.map +1 -1
  14. package/dist/src/doctor.js +8 -10
  15. package/dist/src/doctor.js.map +1 -1
  16. package/dist/src/git.js +10 -0
  17. package/dist/src/git.js.map +1 -1
  18. package/dist/src/langfuse-extension.js +2 -0
  19. package/dist/src/langfuse-extension.js.map +1 -1
  20. package/dist/src/mcp.js +20 -90
  21. package/dist/src/mcp.js.map +1 -1
  22. package/dist/src/model.js +2 -0
  23. package/dist/src/model.js.map +1 -1
  24. package/dist/src/pipeline/command-stage.js +2 -2
  25. package/dist/src/pipeline/command-stage.js.map +1 -1
  26. package/dist/src/pipeline/log.js +5 -0
  27. package/dist/src/pipeline/log.js.map +1 -1
  28. package/dist/src/pipeline/overlay.js +217 -0
  29. package/dist/src/pipeline/overlay.js.map +1 -0
  30. package/dist/src/pipeline/pipeline-file.js +77 -7
  31. package/dist/src/pipeline/pipeline-file.js.map +1 -1
  32. package/dist/src/pipeline/pipeline.js +59 -36
  33. package/dist/src/pipeline/pipeline.js.map +1 -1
  34. package/dist/src/pipeline/stage.js +49 -13
  35. package/dist/src/pipeline/stage.js.map +1 -1
  36. package/dist/src/pipeline/state.js +3 -1
  37. package/dist/src/pipeline/state.js.map +1 -1
  38. package/dist/src/pipeline/summary-stage.js +99 -0
  39. package/dist/src/pipeline/summary-stage.js.map +1 -0
  40. package/dist/src/pipeline/task-stage.js +25 -10
  41. package/dist/src/pipeline/task-stage.js.map +1 -1
  42. package/dist/src/pipeline/variables.js +34 -2
  43. package/dist/src/pipeline/variables.js.map +1 -1
  44. package/dist/src/session.js +22 -15
  45. package/dist/src/session.js.map +1 -1
  46. package/package.json +6 -9
  47. package/pipelines/api-testing.yml +23 -9
  48. package/pipelines/issue-test-cases.yml +17 -17
  49. package/pipelines/pr-review.yml +27 -14
  50. package/pipelines/regression.yml +7 -3
  51. package/pipelines/web-testing.yml +14 -12
  52. package/prompt/pipeline-report.ts +23 -0
  53. package/prompt/report.ts +1 -1
  54. package/prompt/system-prompt.ts +1 -1
  55. package/prompt/testomat.io.ts +4 -4
  56. package/skills/skills.lock.json +1 -1
  57. package/dist/src/mcp-extension.js +0 -9
  58. package/dist/src/mcp-extension.js.map +0 -1
  59. package/dist/vendor/mcp.js +0 -14801
  60. package/mcp-tools.json +0 -1949
@@ -1,5 +1,6 @@
1
1
  name: pr-review
2
2
  description: Review a pull request, propose test cases for it, and sync them to Testomat.io.
3
+ target: pr
3
4
 
4
5
  gates:
5
6
  code-changed:
@@ -7,37 +8,49 @@ gates:
7
8
  min_files: 3
8
9
  ignore: ["**/*.md", "**/*.lock", "docs/**"]
9
10
  message: Fewer than 3 code files changed.
11
+ testcases-needed:
12
+ env: [CREATE_TESTCASES]
13
+ message: 'No test cases created. Enable test case creation via CREATE_TESTCASES env var'
10
14
  testomatio:
11
- env: [TESTOMATIO, TESTOMATIO_PROJECT_ID]
12
- message: No Testomat.io project. Set TESTOMATIO and TESTOMATIO_PROJECT_ID.
15
+ env: [TESTOMATIO]
16
+ message: No Testomat.io project. Set TESTOMATIO.
13
17
 
14
18
  when: [code-changed]
15
19
 
20
+ env:
21
+ # feature/add-login β†’ feature-add-login
22
+ TESTOMATIO_BRANCH: ${GIT_BRANCH | slugify}
23
+
24
+
16
25
  stages:
17
26
  - id: requirements
27
+ title: Requirements
28
+ emoji: πŸ“‹
18
29
  session: reviewer
19
- task: |
20
- Work out what this pull request is meant to do. /qa-pr-requirements-analyzer
21
- Write the acceptance criteria to criteria.md.
22
- outputs: [criteria.md]
30
+ task: Work out what this pull request is meant to do. /qa-pr-requirements-analyzer
23
31
 
24
32
  - id: review
33
+ title: Review
34
+ emoji: πŸ”
25
35
  session: reviewer
26
- task: |
27
- Review this pull request as a QA engineer against criteria.md. /qa-review-pr
28
- inputs: [criteria.md]
36
+ task: Review this pull request as a QA engineer against requirements.md. /qa-review-pr
37
+ inputs: [requirements.md]
29
38
 
30
39
  - id: test-cases
40
+ title: Test cases
41
+ emoji: πŸ“
31
42
  session: writer
43
+ when: [testcases-needed]
32
44
  task: |
33
- Write test cases for this pull request from criteria.md and review.md. /qa-write-test-cases
45
+ If there is linked issue and it was already reviewed by Testeiya and have linked tests - skip this step
46
+ Write test cases for this pull request from requirements.md and review.md. /qa-write-test-cases
34
47
  Put them in test-cases/, one markdown file per suite.
35
- inputs: [criteria.md, review.md]
48
+ inputs: [requirements.md, review.md]
36
49
  outputs: [test-cases/]
37
50
 
38
51
  - id: sync
39
- when: [testomatio]
40
- each_file: test-cases/*.md
52
+ title: Sync to Testomat.io
53
+ emoji: πŸ”„
54
+ when: [testomatio, testcases-needed]
41
55
  task: |
42
56
  Sync the test cases in ${ITEM} to Testomat.io. /sync-test-cases-with-tms
43
- Skip a case that already exists there.
@@ -1,5 +1,6 @@
1
1
  name: regression
2
2
  description: Run the tests a change can break, from the coverage map, then explain the failures.
3
+ target: pr
3
4
 
4
5
  gates:
5
6
  coverage:
@@ -22,6 +23,8 @@ env:
22
23
 
23
24
  stages:
24
25
  - id: tests
26
+ title: Tests
27
+ emoji: πŸ§ͺ
25
28
  when: [testomatio]
26
29
  run: |
27
30
  npx -y @testomatio/reporter run --kind detect --warn \
@@ -30,10 +33,11 @@ stages:
30
33
  timeout: 30m
31
34
 
32
35
  - id: failures
36
+ title: Failures
37
+ emoji: 🐞
33
38
  when: [local, test-command]
34
39
  session: triage
35
40
  task: |
36
- Read the test run in tests.log. For each failure, say if this change caused it,
37
- if it is flaky, or if the test is out of date. /debug-fix-failed-flaky-autotests
38
- Do not edit any file. Fail the run if this change caused a failure.
41
+ Triage the failures in tests.log without editing files. /debug-fix-failed-flaky-autotests
42
+ Fail the run if this change caused a failure.
39
43
  inputs: [tests.log]
@@ -1,5 +1,6 @@
1
1
  name: web-testing
2
2
  description: Review a pull request, test the change in a browser with Explorbot, explain what broke.
3
+ target: pr
3
4
 
4
5
  gates:
5
6
  staging:
@@ -13,38 +14,39 @@ gates:
13
14
  message: Explorbot has no AI provider. Set EXPLORBOT_AI_PROVIDER and its key.
14
15
 
15
16
  env:
16
- EXPLORBOT_OUTPUT: ${PIPELINE_DIR}/explorbot
17
17
  EXPLORBOT_NO_BANNER: "1"
18
18
 
19
19
  stages:
20
20
  - id: review
21
+ title: Review
22
+ emoji: πŸ”
21
23
  session: qa
22
- task: |
23
- Review this pull request as a QA engineer. /qa-review-pr
24
- Write the user-facing scenarios worth checking in a browser to scenarios.md.
25
- outputs: [scenarios.md]
24
+ task: Review this pull request as a QA engineer. List the scenarios worth checking in a browser. /qa-review-pr
26
25
 
27
26
  - id: write-plan
27
+ title: Test plan
28
+ emoji: πŸ—ΊοΈ
28
29
  session: qa
29
30
  when: [staging]
30
- task: |
31
- Turn scenarios.md into an Explorbot test plan for ${EXPLORBOT_URL}. /explorbot-plan
32
- Write the plan to plan.md. Keep only scenarios a browser can check.
33
- inputs: [scenarios.md]
31
+ task: Turn the browser scenarios in review.md into an Explorbot test plan for ${EXPLORBOT_URL} in plan.md. /explorbot-plan
32
+ inputs: [review.md]
34
33
  outputs: [plan.md]
35
34
 
36
35
  - id: explore
36
+ title: Browser testing
37
+ emoji: 🌐
37
38
  when: [staging, browser, explorbot-ai]
38
- run: npx -y explorbot test "$PIPELINE_DIR/plan.md" '*'
39
+ run: EXPLORBOT_OUTPUT="$STAGE_DIR/explorbot" npx -y explorbot test "$STAGE_DIR/plan.md" '*'
39
40
  inputs: [plan.md]
40
41
  outputs: [explorbot/]
41
42
  timeout: 30m
42
43
 
43
44
  - id: results
45
+ title: Results
46
+ emoji: πŸ“Š
44
47
  session: qa
45
48
  when: [staging, browser, explorbot-ai]
46
49
  task: |
47
- Explorbot results are under explorbot/. Find its session report and read it.
48
- Say which failed scenarios are real defects in this change and which are test noise.
50
+ Read the Explorbot report in explorbot/ and say which failed scenarios are real defects and which are noise. /explorbot-fundamentals
49
51
  Fail the run if any is a real defect.
50
52
  inputs: [plan.md, explorbot/]
@@ -0,0 +1,23 @@
1
+ import dedent from "dedent";
2
+
3
+ export const pipelineReport = dedent`
4
+ <pipeline-report>
5
+ The draft is the report: every stage's report, word for word, under its own \`### <emoji> <title>\` heading. Your job is to trim it, never to write it. This format overrides <final-report>, its title included.
6
+
7
+ 1. Copy the draft to the report file with the \`write\` tool, word for word.
8
+ 2. Trim it with the \`edit\` tool:
9
+ * Drop a line that repeats what an earlier section already said.
10
+ * When a section is too long, shorten its lines or drop its least important bullets.
11
+ 3. Nothing repeats and nothing is too long: leave the copy as it is.
12
+
13
+ Never:
14
+ * Add, rename, merge, reorder or drop a heading.
15
+ * Add a sentence, a title, an intro, a conclusion or a closing summary.
16
+ * Change a fact, a number, an id or a link. Reword only to shorten.
17
+ * Cut a numbered list, or replace a list with a count like "10 items, see the file".
18
+ * Add findings, assumptions or advice of your own.
19
+
20
+ * A command stage's section links its log. You may add up to three bullets quoting its failures from the log.
21
+ * The verdict is given. Do not call a result tool to set one.
22
+ </pipeline-report>
23
+ `;
package/prompt/report.ts CHANGED
@@ -18,7 +18,7 @@ export function finalReport(path: string): string {
18
18
  <final-report>
19
19
  * Write your complete final report to \`${path}\` with the \`write\` tool. Writing it is required before you finish.
20
20
  * That file is your answer. It is the run's deliverable; nothing else you say is kept.
21
- * A skill's output format overrides every rule in this block, including the title. Follow it strictly.
21
+ * A skill's or the task's output format overrides every rule in this block, including the title. Follow it strictly.
22
22
  * Decide the **severity of your report**. Low severity: a few short bullets, nothing more.
23
23
  * Do not make the reader go through a long report for a minor issue with no effect.
24
24
  * Severity decides how many items you report, not how long each one is. Even a critical finding is: what breaks, for whom, when.
@@ -15,7 +15,7 @@ export function buildSystemPrompt(options: SystemPromptOptions): string {
15
15
  const date = new Date().toISOString().split("T")[0];
16
16
  const clis = options.connectedClis?.join(", ") || "none connected yet";
17
17
  const mcps = options.connectedMcps?.join(", ") || "none connected yet";
18
- let manualTestsHint = " Pulled manual tests usually live in `.testeiya/manual-tests/`; check there before declaring the project has no manual tests.";
18
+ let manualTestsHint = " Pulled manual tests usually live in `.testeiya/test-cases/`; check there before declaring the project has no manual tests.";
19
19
  if (options.manualTestsHint === false) manualTestsHint = "";
20
20
 
21
21
  const prompt = dedent`
@@ -38,8 +38,8 @@ export function testomatio(options: TestomatioOptions): string {
38
38
  }
39
39
 
40
40
  function dynamicData(tms: TmsAccess): string {
41
- if (tms === "mcp-proxy") {
42
- return "Get them through the Testomat.io tools, one per entity (`tests`, `runs`, `testruns`, `issues`, …); pick the operation with its `command` param. The `mcp` tool searches them when the name is unclear.";
41
+ if (tms === "mcp-tools") {
42
+ return "Get them through the `mcp__testomatio__*` tools, one per entity (`tests`, `runs`, `testruns`, `issues`, …); pick the operation with its `command` param.";
43
43
  }
44
44
  if (tms === "cli-only") {
45
45
  return "There are no Testomat.io tools in this session. Get them from the REST API: `curl` with the `TESTOMATIO` token as the Authorization header against `$TESTOMATIO_URL/api/v2`. Keep to documented endpoints; never invent paths or parameters.";
@@ -48,11 +48,11 @@ function dynamicData(tms: TmsAccess): string {
48
48
  }
49
49
 
50
50
  /**
51
- * `mcp-proxy`: one tool per entity plus the `mcp` search tool. `cli-only`: no
51
+ * `mcp-tools`: one tool per entity, named `mcp__testomatio__<tool>`. `cli-only`: no
52
52
  * tools at all; `check-tests` and REST through the shell. `mcp-direct`: one tool
53
53
  * per entity, prefixed `testomatio-<slug>`; the desktop app's one-shot mode.
54
54
  */
55
- export type TmsAccess = "mcp-direct" | "mcp-proxy" | "cli-only";
55
+ export type TmsAccess = "mcp-direct" | "mcp-tools" | "cli-only";
56
56
 
57
57
  export interface TestomatioOptions {
58
58
  /** How the agent reaches Testomat.io in this run. */
@@ -79,7 +79,7 @@
79
79
  {
80
80
  "source": "microsoft/playwright-cli/tree/main/skills/playwright-cli",
81
81
  "ref": null,
82
- "sha": "b1a5903c5b633b8c9f843ad7b629c2a78437040c",
82
+ "sha": "86f5616716033854f0990734fe2f9fcde0c1f6cc",
83
83
  "folder": "playwright",
84
84
  "skills": [
85
85
  "playwright-cli"
@@ -1,9 +0,0 @@
1
- import { mcpConfig, seedMetadataCache, vendorBundle } from "./mcp.js";
2
- /** The MCP adapter, configured from the environment, as a pi extension. */
3
- export default async function mcpExtension(pi) {
4
- const config = mcpConfig();
5
- await seedMetadataCache(config);
6
- const { createMcpAdapter } = (await import(vendorBundle()));
7
- await createMcpAdapter({ config })(pi);
8
- }
9
- //# sourceMappingURL=mcp-extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-extension.js","sourceRoot":"","sources":["../../src/mcp-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEtE,2EAA2E;AAC3E,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,YAAY,CAAC,EAAW;IACpD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEhC,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,CAEzD,CAAC;IACF,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC"}