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.
- package/PIPELINES.md +156 -19
- package/README.md +30 -14
- package/dist/prompt/pipeline-report.js +23 -0
- package/dist/prompt/pipeline-report.js.map +1 -0
- package/dist/prompt/report.js +1 -1
- package/dist/prompt/system-prompt.js +1 -1
- package/dist/prompt/system-prompt.js.map +1 -1
- package/dist/prompt/testomat.io.js +2 -2
- package/dist/prompt/testomat.io.js.map +1 -1
- package/dist/src/args.js +19 -1
- package/dist/src/args.js.map +1 -1
- package/dist/src/cli.js +4 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/doctor.js +8 -10
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/git.js +10 -0
- package/dist/src/git.js.map +1 -1
- package/dist/src/langfuse-extension.js +2 -0
- package/dist/src/langfuse-extension.js.map +1 -1
- package/dist/src/mcp.js +20 -90
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/model.js +2 -0
- package/dist/src/model.js.map +1 -1
- package/dist/src/pipeline/command-stage.js +2 -2
- package/dist/src/pipeline/command-stage.js.map +1 -1
- package/dist/src/pipeline/log.js +5 -0
- package/dist/src/pipeline/log.js.map +1 -1
- package/dist/src/pipeline/overlay.js +217 -0
- package/dist/src/pipeline/overlay.js.map +1 -0
- package/dist/src/pipeline/pipeline-file.js +77 -7
- package/dist/src/pipeline/pipeline-file.js.map +1 -1
- package/dist/src/pipeline/pipeline.js +59 -36
- package/dist/src/pipeline/pipeline.js.map +1 -1
- package/dist/src/pipeline/stage.js +49 -13
- package/dist/src/pipeline/stage.js.map +1 -1
- package/dist/src/pipeline/state.js +3 -1
- package/dist/src/pipeline/state.js.map +1 -1
- package/dist/src/pipeline/summary-stage.js +99 -0
- package/dist/src/pipeline/summary-stage.js.map +1 -0
- package/dist/src/pipeline/task-stage.js +25 -10
- package/dist/src/pipeline/task-stage.js.map +1 -1
- package/dist/src/pipeline/variables.js +34 -2
- package/dist/src/pipeline/variables.js.map +1 -1
- package/dist/src/session.js +22 -15
- package/dist/src/session.js.map +1 -1
- package/package.json +6 -9
- package/pipelines/api-testing.yml +23 -9
- package/pipelines/issue-test-cases.yml +17 -17
- package/pipelines/pr-review.yml +27 -14
- package/pipelines/regression.yml +7 -3
- package/pipelines/web-testing.yml +14 -12
- package/prompt/pipeline-report.ts +23 -0
- package/prompt/report.ts +1 -1
- package/prompt/system-prompt.ts +1 -1
- package/prompt/testomat.io.ts +4 -4
- package/skills/skills.lock.json +1 -1
- package/dist/src/mcp-extension.js +0 -9
- package/dist/src/mcp-extension.js.map +0 -1
- package/dist/vendor/mcp.js +0 -14801
- package/mcp-tools.json +0 -1949
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/pipeline/stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/pipeline/stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,9 @@ export const STATE_FILE = "pipeline.json";
|
|
|
4
4
|
export const COPY_FILE = "pipeline.yml";
|
|
5
5
|
export const SESSIONS_DIR = ".sessions";
|
|
6
6
|
export const CHANGES_FILE = "changes.txt";
|
|
7
|
-
|
|
7
|
+
/** The last round's files, kept so the next round updates them. */
|
|
8
|
+
export const LAST_DIR = ".last";
|
|
9
|
+
const OWN = [STATE_FILE, COPY_FILE, SESSIONS_DIR, LAST_DIR];
|
|
8
10
|
/**
|
|
9
11
|
* `pipeline.json` in the pipeline folder: the round, each stage's result, and
|
|
10
12
|
* the rounds before. The next run reads it to retry or start a new round, the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/pipeline/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAC1C,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/pipeline/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pipelineReport } from "../../prompt/pipeline-report.js";
|
|
4
|
+
import { STATE_FILE } from "./state.js";
|
|
5
|
+
import { TaskStage } from "./task-stage.js";
|
|
6
|
+
const DRAFT_FILE = "draft.md";
|
|
7
|
+
/** A stage's own headings start one level under its section. */
|
|
8
|
+
const TOP_LEVEL = 4;
|
|
9
|
+
/**
|
|
10
|
+
* The final report. Code joins the stages' reports into a draft, word for
|
|
11
|
+
* word, so the agent only trims it and never writes a section of its own.
|
|
12
|
+
*/
|
|
13
|
+
export class SummaryStage extends TaskStage {
|
|
14
|
+
stages;
|
|
15
|
+
state;
|
|
16
|
+
constructor(pipeline, stages, state, dir) {
|
|
17
|
+
const lines = [`Write the final report of the "${pipeline.name}" pipeline, round ${state.record.round}.`];
|
|
18
|
+
if (pipeline.summary)
|
|
19
|
+
lines.push("", pipeline.summary.trim());
|
|
20
|
+
lines.push("", `The verdict is ${state.record.status}.`, `The draft: ${join(dir, "summary", DRAFT_FILE)}`, "", pipelineReport);
|
|
21
|
+
const spec = { id: "summary", title: "Summary", emoji: "🧾", task: lines.join("\n"), session: "summary" };
|
|
22
|
+
super({ ...spec, inputs: [STATE_FILE], outputs: [], when: [], stopOn: [] });
|
|
23
|
+
this.stages = stages;
|
|
24
|
+
this.state = state;
|
|
25
|
+
}
|
|
26
|
+
files() {
|
|
27
|
+
return [...super.files(), DRAFT_FILE];
|
|
28
|
+
}
|
|
29
|
+
async run(context, record) {
|
|
30
|
+
mkdirSync(this.dir(context), { recursive: true });
|
|
31
|
+
writeFileSync(join(this.dir(context), DRAFT_FILE), this.draft(context.dir));
|
|
32
|
+
await super.run(context, record);
|
|
33
|
+
}
|
|
34
|
+
/** The stages' reports already update the last round, so the summary starts from the draft. */
|
|
35
|
+
lastRound() {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/** One `### <emoji> <title>` section per stage, in order. */
|
|
39
|
+
draft(dir) {
|
|
40
|
+
const sections = this.stages.map((stage) => {
|
|
41
|
+
const body = this.section(stage, this.state.stage(stage.id), dir);
|
|
42
|
+
return `### ${stage.spec.emoji} ${stage.spec.title}\n\n${body}`;
|
|
43
|
+
});
|
|
44
|
+
return `${sections.join("\n\n")}\n`;
|
|
45
|
+
}
|
|
46
|
+
section(stage, record, dir) {
|
|
47
|
+
if (!record || record.status === "not-run")
|
|
48
|
+
return "Did not run.";
|
|
49
|
+
if (record.status === "skipped")
|
|
50
|
+
return `Skipped: ${record.reason}`;
|
|
51
|
+
const lines = [];
|
|
52
|
+
if (record.status === "broken" || record.status === "timeout") {
|
|
53
|
+
lines.push(`Stopped: ${record.reason}. A re-run on the same commit picks up from there.`);
|
|
54
|
+
}
|
|
55
|
+
if (record.status === "fail" && record.reason)
|
|
56
|
+
lines.push(`Failed: ${record.reason}`);
|
|
57
|
+
if (record.log)
|
|
58
|
+
lines.push(`\`${stage.spec.run}\` ended ${record.status}. Log: [${record.log}](${record.log})`);
|
|
59
|
+
const report = record.report && join(dir, record.report);
|
|
60
|
+
if (report && existsSync(report))
|
|
61
|
+
lines.push(this.demote(readFileSync(report, "utf8").trim()));
|
|
62
|
+
if (lines.length === 0)
|
|
63
|
+
return `Ended ${record.status}.`;
|
|
64
|
+
return lines.join("\n\n");
|
|
65
|
+
}
|
|
66
|
+
/** Moves every heading down so the report's top one is `####`, outside code blocks. */
|
|
67
|
+
demote(text) {
|
|
68
|
+
const lines = text.split("\n");
|
|
69
|
+
const levels = this.headings(lines).map((index) => this.level(lines[index]));
|
|
70
|
+
if (levels.length === 0)
|
|
71
|
+
return text;
|
|
72
|
+
const shift = TOP_LEVEL - Math.min(...levels);
|
|
73
|
+
if (shift <= 0)
|
|
74
|
+
return text;
|
|
75
|
+
for (const index of this.headings(lines))
|
|
76
|
+
lines[index] = `${"#".repeat(shift)}${lines[index]}`;
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
}
|
|
79
|
+
headings(lines) {
|
|
80
|
+
const found = [];
|
|
81
|
+
let fenced = false;
|
|
82
|
+
for (const [index, line] of lines.entries()) {
|
|
83
|
+
if (line.startsWith("```"))
|
|
84
|
+
fenced = !fenced;
|
|
85
|
+
if (!fenced && this.level(line) > 0)
|
|
86
|
+
found.push(index);
|
|
87
|
+
}
|
|
88
|
+
return found;
|
|
89
|
+
}
|
|
90
|
+
level(line) {
|
|
91
|
+
let hashes = 0;
|
|
92
|
+
while (line[hashes] === "#")
|
|
93
|
+
hashes++;
|
|
94
|
+
if (hashes === 0 || hashes > 6 || line[hashes] !== " ")
|
|
95
|
+
return 0;
|
|
96
|
+
return hashes;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=summary-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-stage.js","sourceRoot":"","sources":["../../../src/pipeline/summary-stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,11 @@ import { existsSync, readFileSync, rmSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { log } from "./log.js";
|
|
4
4
|
import { Stage } from "./stage.js";
|
|
5
|
-
import { SESSIONS_DIR } from "./state.js";
|
|
6
|
-
const RETRY_NOTE = "This stage stopped before it finished. Go on from where you stopped. Files you already wrote are in the
|
|
5
|
+
import { CHANGES_FILE, LAST_DIR, SESSIONS_DIR } from "./state.js";
|
|
6
|
+
const RETRY_NOTE = "This stage stopped before it finished. Go on from where you stopped. Files you already wrote are in the stage folder.";
|
|
7
7
|
/**
|
|
8
8
|
* An agent stage: a `testeiya task` run. It writes its report to `<id>.md`
|
|
9
|
-
* and its verdict to `<id>.json
|
|
9
|
+
* and its verdict to `<id>.json`, in its folder.
|
|
10
10
|
*/
|
|
11
11
|
export class TaskStage extends Stage {
|
|
12
12
|
result = { field: "report", extension: "md" };
|
|
@@ -15,8 +15,8 @@ export class TaskStage extends Stage {
|
|
|
15
15
|
}
|
|
16
16
|
async runItem(context, item, vars) {
|
|
17
17
|
const { dir } = context;
|
|
18
|
-
const report = `${this.id}${item.suffix}.md`;
|
|
19
|
-
const envelope = `${this.id}${item.suffix}.json`;
|
|
18
|
+
const report = `${this.folder}/${this.id}${item.suffix}.md`;
|
|
19
|
+
const envelope = `${this.folder}/${this.id}${item.suffix}.json`;
|
|
20
20
|
rmSync(join(dir, report), { force: true });
|
|
21
21
|
rmSync(join(dir, envelope), { force: true });
|
|
22
22
|
const task = this.task(context, vars);
|
|
@@ -38,8 +38,9 @@ export class TaskStage extends Stage {
|
|
|
38
38
|
const { session } = this.spec;
|
|
39
39
|
const args = [];
|
|
40
40
|
// Only the reporting stage posts. Every other stage keeps out of the comment thread.
|
|
41
|
+
// Their reports land in the summary, which is signed once.
|
|
41
42
|
if (!context.report)
|
|
42
|
-
args.push("--no-thread");
|
|
43
|
+
args.push("--no-thread", "--no-default-footer");
|
|
43
44
|
for (const output of outputs)
|
|
44
45
|
args.push("-o", output);
|
|
45
46
|
if (context.report)
|
|
@@ -56,20 +57,34 @@ export class TaskStage extends Stage {
|
|
|
56
57
|
}
|
|
57
58
|
/** The task, then where its files are, so the model never guesses a path. */
|
|
58
59
|
task(context, vars) {
|
|
59
|
-
const
|
|
60
|
-
const lines = [`
|
|
60
|
+
const dir = this.dir(context);
|
|
61
|
+
const lines = [`Stage folder: ${dir}`];
|
|
61
62
|
const wanted = this.inputs();
|
|
62
63
|
const present = wanted.filter((input) => existsSync(join(dir, input)));
|
|
63
64
|
const absent = wanted.filter((input) => !present.includes(input));
|
|
64
65
|
if (present.length > 0)
|
|
65
|
-
lines.push(`Read these first: ${present.join(", ")}`);
|
|
66
|
-
const outputs = this.spec.outputs.map((output) => vars.expand(output));
|
|
66
|
+
lines.push(`Read these first: ${present.map((input) => join(dir, input)).join(", ")}`);
|
|
67
|
+
const outputs = this.spec.outputs.map((output) => join(dir, vars.expand(output)));
|
|
67
68
|
if (outputs.length > 0)
|
|
68
69
|
lines.push(`Write these files: ${outputs.join(", ")}`);
|
|
69
70
|
for (const input of absent)
|
|
70
71
|
lines.push(`Not available: ${input} (${context.missing(input)})`);
|
|
72
|
+
const last = this.lastRound(context);
|
|
73
|
+
if (last)
|
|
74
|
+
lines.push(last);
|
|
71
75
|
return `${vars.expand(this.spec.task ?? "").trim()}\n\n${lines.join("\n")}`;
|
|
72
76
|
}
|
|
77
|
+
/** A new round updates the last one's result instead of starting over. */
|
|
78
|
+
lastRound(context) {
|
|
79
|
+
const last = join(context.dir, LAST_DIR, this.folder);
|
|
80
|
+
if (!existsSync(last))
|
|
81
|
+
return null;
|
|
82
|
+
let line = `Last round: ${last}. Update its result: keep what still holds, redo what the changes touch.`;
|
|
83
|
+
const changes = join(context.dir, CHANGES_FILE);
|
|
84
|
+
if (existsSync(changes))
|
|
85
|
+
line += ` Changed files: ${changes}`;
|
|
86
|
+
return line;
|
|
87
|
+
}
|
|
73
88
|
readEnvelope(path) {
|
|
74
89
|
if (!existsSync(path))
|
|
75
90
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-stage.js","sourceRoot":"","sources":["../../../src/pipeline/task-stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAgC,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"task-stage.js","sourceRoot":"","sources":["../../../src/pipeline/task-stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,42 @@
|
|
|
1
|
+
import { Liquid } from "liquidjs";
|
|
2
|
+
/** `${NAME}`, `${NAME:-default}` or `${NAME | filter | filter: arg}`. */
|
|
3
|
+
const REFERENCE = /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*)|(\s*\|[^}]*))?\}/g;
|
|
4
|
+
/** Liquid's filters, and ours for URLs. Only expressions: Liquid's tags never run. */
|
|
5
|
+
const liquid = new Liquid({ strictFilters: true });
|
|
6
|
+
liquid.registerFilter("host", (value) => url(value)?.host ?? "");
|
|
7
|
+
liquid.registerFilter("path", (value) => url(value)?.pathname ?? "");
|
|
1
8
|
/** The environment a pipeline runs in, and `${NAME}` expansion over it. */
|
|
2
9
|
export class Variables {
|
|
3
10
|
values;
|
|
4
11
|
constructor(values) {
|
|
5
12
|
this.values = values;
|
|
6
13
|
}
|
|
14
|
+
/** Why the filters in `text` cannot run, or null. */
|
|
15
|
+
static problem(text) {
|
|
16
|
+
for (const [, name, , filters] of text.matchAll(REFERENCE)) {
|
|
17
|
+
if (!filters)
|
|
18
|
+
continue;
|
|
19
|
+
try {
|
|
20
|
+
liquid.evalValueSync(`${name}${filters}`, {});
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return `\${${name}${filters}}: ${err.message.split("\n")[0]}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/** Whether `text` uses a filter. */
|
|
29
|
+
static filtered(text) {
|
|
30
|
+
return [...text.matchAll(REFERENCE)].some((match) => match[3]);
|
|
31
|
+
}
|
|
7
32
|
get(name) {
|
|
8
33
|
return this.values[name];
|
|
9
34
|
}
|
|
10
|
-
/** `${NAME}` and `${NAME:-default}`, the shell's rule: unset is empty. */
|
|
35
|
+
/** `${NAME}` and `${NAME:-default}`, the shell's rule: unset is empty. A `|` runs Liquid filters. */
|
|
11
36
|
expand(text) {
|
|
12
|
-
return text.replace(
|
|
37
|
+
return text.replace(REFERENCE, (_, name, fallback, filters) => {
|
|
38
|
+
if (filters)
|
|
39
|
+
return String(liquid.evalValueSync(`${name}${filters}`, this.values) ?? "");
|
|
13
40
|
const value = this.values[name];
|
|
14
41
|
if (value)
|
|
15
42
|
return value;
|
|
@@ -38,4 +65,9 @@ export class Variables {
|
|
|
38
65
|
return { ...this.values };
|
|
39
66
|
}
|
|
40
67
|
}
|
|
68
|
+
function url(value) {
|
|
69
|
+
if (typeof value !== "string" || !URL.canParse(value))
|
|
70
|
+
return null;
|
|
71
|
+
return new URL(value);
|
|
72
|
+
}
|
|
41
73
|
//# sourceMappingURL=variables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../src/pipeline/variables.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAW;QAAX,WAAM,GAAN,MAAM,CAAK;IAAG,CAAC;IAE5C,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../src/pipeline/variables.ts"],"names":[],"mappings":"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"}
|
package/dist/src/session.js
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { createAgentSession, createCodemodeExtension, createMcpExtension, DefaultResourceLoader, ModelRuntime, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
4
5
|
import { buildSystemPrompt } from "../prompt/system-prompt.js";
|
|
5
6
|
import { pathClis } from "../prompt/clis.js";
|
|
6
7
|
import { PACKAGE_ROOT, PI_STATE_DIR, TESTEIYA_HOME } from "./env.js";
|
|
7
8
|
import { langfuseConfig } from "./langfuse.js";
|
|
8
|
-
import { hasMcp, tmsAccess } from "./mcp.js";
|
|
9
|
+
import { hasMcp, mcpConfig, tmsAccess } from "./mcp.js";
|
|
9
10
|
import { applyEnvKeys, resolveModel } from "./model.js";
|
|
10
11
|
import { createSetResultTool } from "./result.js";
|
|
11
12
|
import { sessionModel } from "./sessions.js";
|
|
12
13
|
// From the package root, never this file's own directory: `../skills` would
|
|
13
14
|
// resolve to dist/skills, and the filter below would silently drop everything.
|
|
14
15
|
export const BUNDLED_SKILLS_DIR = join(PACKAGE_ROOT, "skills");
|
|
15
|
-
const MCP_EXTENSION = extensionPath("mcp-extension");
|
|
16
16
|
const ATTRIBUTION_EXTENSION = extensionPath("attribution-extension");
|
|
17
17
|
const LANGFUSE_EXTENSION = extensionPath("langfuse-extension");
|
|
18
|
+
// The package root: pi loads it through its `pi.extensions` manifest.
|
|
19
|
+
const SUBAGENTS_EXTENSION = dirname(createRequire(import.meta.url).resolve("pi-subagents"));
|
|
18
20
|
/** The one runtime factory, so every command reads the same auth. */
|
|
19
21
|
export async function createRuntime() {
|
|
20
22
|
const runtime = await ModelRuntime.create({
|
|
21
23
|
authPath: join(TESTEIYA_HOME, "auth.json"),
|
|
22
|
-
|
|
24
|
+
// A run inside Testeiya Cloud points its providers at the cloud's own AI
|
|
25
|
+
// proxy by handing the CLI a models.json; anywhere else this stays unset.
|
|
26
|
+
modelsPath: process.env.TESTEIYA_MODELS_JSON ?? null,
|
|
23
27
|
});
|
|
24
28
|
await applyEnvKeys(runtime);
|
|
25
29
|
return runtime;
|
|
@@ -37,6 +41,7 @@ export function createLoader(options) {
|
|
|
37
41
|
settingsManager: options.settingsManager,
|
|
38
42
|
additionalSkillPaths: [BUNDLED_SKILLS_DIR],
|
|
39
43
|
additionalExtensionPaths: options.extensionPaths,
|
|
44
|
+
extensionFactories: options.extensionFactories,
|
|
40
45
|
systemPromptOverride: options.systemPrompt,
|
|
41
46
|
skillsOverride: (current) => ({
|
|
42
47
|
skills: current.skills.filter((s) => s.baseDir.startsWith(BUNDLED_SKILLS_DIR)),
|
|
@@ -47,19 +52,26 @@ export function createLoader(options) {
|
|
|
47
52
|
export async function createTesteiyaSession(options) {
|
|
48
53
|
const runtime = await createRuntime();
|
|
49
54
|
const model = resolveModel(runtime, options.model, sessionModel(options.sessionManager));
|
|
50
|
-
const settingsManager = SettingsManager.inMemory(
|
|
51
|
-
|
|
55
|
+
const settingsManager = SettingsManager.inMemory({
|
|
56
|
+
defaultTools: ["+codemode"],
|
|
57
|
+
// A checkout never gets to add agents, settings or MCP servers of its own.
|
|
58
|
+
defaultProjectTrust: "never",
|
|
59
|
+
});
|
|
60
|
+
const extensionPaths = [ATTRIBUTION_EXTENSION, SUBAGENTS_EXTENSION];
|
|
52
61
|
if (langfuseConfig())
|
|
53
62
|
extensionPaths.push(LANGFUSE_EXTENSION);
|
|
63
|
+
// pi's CLI loads these as built-ins; SDK sessions only get what is listed here.
|
|
64
|
+
const extensionFactories = [createCodemodeExtension({ models: false })];
|
|
54
65
|
const connectedMcps = [];
|
|
55
66
|
if (hasMcp()) {
|
|
56
|
-
|
|
67
|
+
extensionFactories.push(createMcpExtension({ loadConfig: mcpConfig, openUrl: () => { } }));
|
|
57
68
|
connectedMcps.push("Testomat.io");
|
|
58
69
|
}
|
|
59
70
|
const loader = createLoader({
|
|
60
71
|
cwd: options.cwd,
|
|
61
72
|
settingsManager,
|
|
62
73
|
extensionPaths,
|
|
74
|
+
extensionFactories,
|
|
63
75
|
systemPrompt: () => buildSystemPrompt({
|
|
64
76
|
cwd: options.cwd,
|
|
65
77
|
tms: tmsAccess(),
|
|
@@ -83,15 +95,10 @@ export async function createTesteiyaSession(options) {
|
|
|
83
95
|
settingsManager,
|
|
84
96
|
sessionManager: options.sessionManager,
|
|
85
97
|
customTools: [createSetResultTool(options.result)],
|
|
86
|
-
// Extensions start their runtime on this event. Without it the MCP adapter
|
|
87
|
-
// registers its tools but never connects, and every call answers
|
|
88
|
-
// "MCP not initialized".
|
|
89
98
|
sessionStartEvent: { type: "session_start", reason: "startup" },
|
|
90
99
|
});
|
|
91
|
-
// Starts the extension runtime and fires session_start.
|
|
92
|
-
// does not do this
|
|
93
|
-
// constructed but never initialized: the MCP adapter registers its tools and
|
|
94
|
-
// then answers "MCP not initialized" for every call.
|
|
100
|
+
// Starts the extension runtime and fires session_start, where MCP connects.
|
|
101
|
+
// createAgentSession does not do this; pi's own modes do.
|
|
95
102
|
await session.bindExtensions({
|
|
96
103
|
mode: "print",
|
|
97
104
|
onError: (err) => {
|
package/dist/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,eAAe,GAKhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,4EAA4E;AAC5E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAE/D,MAAM,qBAAqB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;AACrE,MAAM,kBAAkB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAC/D,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;AAE5F,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC;QACxC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;QAC1C,yEAAyE;QACzE,0EAA0E;QAC1E,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI;KACrD,CAAC,CAAC;IACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,OAAO,IAAI,qBAAqB,CAAC;QAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,YAAY;QACtB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,oBAAoB,EAAE,CAAC,kBAAkB,CAAC;QAC1C,wBAAwB,EAAE,OAAO,CAAC,cAAc;QAChD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,oBAAoB,EAAE,OAAO,CAAC,YAAY;QAC1C,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;YAC9E,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAuB;IACjE,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAEzF,MAAM,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC;QAC/C,YAAY,EAAE,CAAC,WAAW,CAAC;QAC3B,2EAA2E;QAC3E,mBAAmB,EAAE,OAAO;KAC7B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAa,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;IAC9E,IAAI,cAAc,EAAE;QAAE,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9D,gFAAgF;IAChF,MAAM,kBAAkB,GAAuB,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,MAAM,EAAE,EAAE,CAAC;QACb,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe;QACf,cAAc;QACd,kBAAkB;QAClB,YAAY,EAAE,GAAG,EAAE,CACjB,iBAAiB,CAAC;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,SAAS,EAAE;YAChB,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc;YAC7C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YAC7D,aAAa,EAAE,QAAQ,EAAE;YACzB,aAAa;SACd,CAAC;KACL,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IAEtB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC;QAC3C,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,YAAY;QACtB,KAAK;QACL,YAAY,EAAE,OAAO;QACrB,cAAc,EAAE,MAAM;QACtB,eAAe;QACf,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,WAAW,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,iBAAiB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE;KAChE,CAAC,CAAC;IAEH,4EAA4E;IAC5E,0DAA0D;IAC1D,MAAM,OAAO,CAAC,cAAc,CAAC;QAC3B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,aAAa,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QACnF,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testeiya",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "AI testing agent — QA-focused coding agent for manual and automated tests",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
"pipelines",
|
|
19
19
|
"PIPELINES.md",
|
|
20
20
|
"skills",
|
|
21
|
-
"mcp-tools.json",
|
|
22
21
|
"README.md",
|
|
23
22
|
"LICENSE"
|
|
24
23
|
],
|
|
@@ -31,8 +30,7 @@
|
|
|
31
30
|
"scripts": {
|
|
32
31
|
"start": "npm run build && node dist/src/cli.js",
|
|
33
32
|
"dev": "./testeiya",
|
|
34
|
-
"build": "tsc -p tsconfig.json
|
|
35
|
-
"build:vendor": "esbuild scripts/vendor-entry.ts --bundle --format=esm --platform=node --packages=external --outfile=dist/vendor/mcp.js",
|
|
33
|
+
"build": "tsc -p tsconfig.json",
|
|
36
34
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
37
35
|
"prepublishOnly": "npm run build",
|
|
38
36
|
"test": "npm run build && node --test test/*.test.js"
|
|
@@ -46,19 +44,18 @@
|
|
|
46
44
|
"pi"
|
|
47
45
|
],
|
|
48
46
|
"dependencies": {
|
|
49
|
-
"@earendil-works/pi-ai": "^
|
|
50
|
-
"@earendil-works/pi-coding-agent": "^
|
|
51
|
-
"@earendil-works/pi-tui": "^0.84.3",
|
|
47
|
+
"@earendil-works/pi-ai": "^1.4.0",
|
|
48
|
+
"@earendil-works/pi-coding-agent": "^1.4.0",
|
|
52
49
|
"@testomatio/mcp": "^3.1.0",
|
|
53
50
|
"chalk": "^5.6.2",
|
|
54
51
|
"dedent": "^1.7.2",
|
|
55
|
-
"
|
|
52
|
+
"liquidjs": "^10.30.0",
|
|
53
|
+
"pi-subagents": "^0.81.0",
|
|
56
54
|
"typebox": "1.3.7",
|
|
57
55
|
"yaml": "^2.9.0"
|
|
58
56
|
},
|
|
59
57
|
"devDependencies": {
|
|
60
58
|
"@types/node": "^22.19.19",
|
|
61
|
-
"esbuild": "^0.28.1",
|
|
62
59
|
"tsx": "^4.23.12",
|
|
63
60
|
"typescript": "^5.9.3"
|
|
64
61
|
}
|
|
@@ -1,39 +1,53 @@
|
|
|
1
1
|
name: api-testing
|
|
2
2
|
description: Find the API endpoints a pull request changed, test each with Explorbot, explain what broke.
|
|
3
|
+
target: pr
|
|
3
4
|
|
|
4
5
|
gates:
|
|
5
6
|
api:
|
|
6
|
-
env: [EXPLORBOT_URL,
|
|
7
|
-
message: No API to test. Set EXPLORBOT_URL to the API base and
|
|
7
|
+
env: [EXPLORBOT_URL, OPENAPI_SPEC]
|
|
8
|
+
message: No API to test. Set EXPLORBOT_URL to the API base and OPENAPI_SPEC to its OpenAPI spec.
|
|
8
9
|
explorbot-ai:
|
|
9
10
|
env: [EXPLORBOT_AI_PROVIDER]
|
|
10
11
|
message: Explorbot has no AI provider. Set EXPLORBOT_AI_PROVIDER and its key.
|
|
11
12
|
|
|
12
13
|
env:
|
|
13
|
-
EXPLORBOT_OUTPUT: ${PIPELINE_DIR}/explorbot
|
|
14
14
|
EXPLORBOT_NO_BANNER: "1"
|
|
15
15
|
|
|
16
16
|
stages:
|
|
17
|
+
- id: spec
|
|
18
|
+
title: OpenAPI spec
|
|
19
|
+
emoji: 📜
|
|
20
|
+
when: [api]
|
|
21
|
+
run: npx -y @apidevtools/swagger-cli validate "$OPENAPI_SPEC"
|
|
22
|
+
stopOn: fail
|
|
23
|
+
timeout: 2m
|
|
24
|
+
|
|
17
25
|
- id: review
|
|
26
|
+
title: API review
|
|
27
|
+
emoji: 🔍
|
|
18
28
|
session: qa
|
|
29
|
+
when: [API_SPEC]
|
|
19
30
|
task: |
|
|
20
|
-
Review this pull request
|
|
21
|
-
List
|
|
22
|
-
|
|
31
|
+
Review this pull request for public API changes
|
|
32
|
+
List the API endpoints it adds or changes in endpoints.txt, one path per line like /users/{id}, empty if none.
|
|
33
|
+
|
|
23
34
|
outputs: [endpoints.txt]
|
|
24
35
|
|
|
25
36
|
- id: explore
|
|
37
|
+
title: API exploration
|
|
38
|
+
emoji: 🤖
|
|
26
39
|
when: [api, explorbot-ai]
|
|
27
40
|
each_line: endpoints.txt
|
|
28
|
-
run: npx -y explorbot api explore "$ITEM" --
|
|
41
|
+
run: EXPLORBOT_OUTPUT="$STAGE_DIR/explorbot" npx -y explorbot api explore "$ITEM" --spec "$OPENAPI_SPEC"
|
|
29
42
|
outputs: [explorbot/]
|
|
30
43
|
timeout: 10m
|
|
31
44
|
|
|
32
45
|
- id: results
|
|
46
|
+
title: Results
|
|
47
|
+
emoji: 📊
|
|
33
48
|
session: qa
|
|
34
49
|
when: [api, explorbot-ai]
|
|
35
50
|
task: |
|
|
36
|
-
Explorbot results
|
|
37
|
-
Say which failures are real defects in this change: a broken contract, missing validation, a wrong status.
|
|
51
|
+
Read the Explorbot results in explorbot/ and say which failures are real defects in this change. /explorbot-fundamentals
|
|
38
52
|
Fail the run if any is a real defect.
|
|
39
53
|
inputs: [endpoints.txt, explorbot/]
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
name: issue-test-cases
|
|
2
2
|
description: Turn an issue or epic into test cases, and sync them to Testomat.io.
|
|
3
|
+
target: issue
|
|
3
4
|
|
|
4
5
|
gates:
|
|
5
6
|
issue:
|
|
6
7
|
env: [ISSUE_URL]
|
|
7
8
|
message: No issue. Set ISSUE_URL to the issue or epic to cover.
|
|
8
9
|
testomatio:
|
|
9
|
-
env: [TESTOMATIO
|
|
10
|
-
message: No Testomat.io project. Set TESTOMATIO
|
|
10
|
+
env: [TESTOMATIO]
|
|
11
|
+
message: No Testomat.io project. Set TESTOMATIO API Key to import test cases
|
|
11
12
|
|
|
12
13
|
when: [issue]
|
|
13
14
|
|
|
15
|
+
env:
|
|
16
|
+
# https://github.com/org/repo/issues/42 → org-repo-issues-42
|
|
17
|
+
TESTOMATIO_BRANCH: ${ISSUE_URL | path | slugify}
|
|
18
|
+
|
|
14
19
|
stages:
|
|
15
20
|
- id: requirements
|
|
21
|
+
title: Requirements
|
|
22
|
+
emoji: 📋
|
|
16
23
|
session: analyst
|
|
17
|
-
task:
|
|
18
|
-
Read the issue at ${ISSUE_URL}: its body, its comments, and every linked issue.
|
|
19
|
-
An epic has sub-issues. Read each one. On GitHub, `gh issue view <url> --comments`
|
|
20
|
-
reads an issue and `gh api repos/<owner>/<repo>/issues/<number>/sub_issues` lists sub-issues.
|
|
21
|
-
Review the requirements as a QA engineer. /qa-requirement-reviewer
|
|
22
|
-
Write the acceptance criteria to criteria.md, one section per sub-issue or feature area.
|
|
23
|
-
End it with the open questions and gaps you found.
|
|
24
|
-
The code here may not implement the issue yet. Read it only to use the real names of screens and terms.
|
|
25
|
-
outputs: [criteria.md]
|
|
24
|
+
task: Review the requirements in ${ISSUE_URL}. /qa-requirement-reviewer
|
|
26
25
|
|
|
27
26
|
- id: test-cases
|
|
27
|
+
title: Test cases
|
|
28
|
+
emoji: 📝
|
|
28
29
|
session: writer
|
|
29
30
|
task: |
|
|
30
|
-
Write test cases from
|
|
31
|
-
Put them in test-cases/, one markdown file per suite
|
|
32
|
-
|
|
33
|
-
inputs: [criteria.md]
|
|
31
|
+
Write test cases from requirements.md. /qa-write-test-cases
|
|
32
|
+
Put them in test-cases/, one markdown file per suite.
|
|
33
|
+
inputs: [requirements.md]
|
|
34
34
|
outputs: [test-cases/]
|
|
35
35
|
|
|
36
36
|
- id: sync
|
|
37
|
+
title: Sync to Testomat.io
|
|
38
|
+
emoji: 🔄
|
|
37
39
|
when: [testomatio]
|
|
38
|
-
each_file: test-cases/*.md
|
|
39
40
|
task: |
|
|
40
41
|
Sync the test cases in ${ITEM} to Testomat.io. /sync-test-cases-with-tms
|
|
41
|
-
Skip a case that already exists there.
|