testeiya 0.3.16 → 0.4.0
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/dist/src/attribution-extension.js +31 -0
- package/dist/src/attribution-extension.js.map +1 -0
- package/dist/src/session.js +2 -1
- package/dist/src/session.js.map +1 -1
- package/package.json +1 -1
- package/skills/playwright/playwright-cli/SKILL.md +5 -0
- package/skills/playwright/playwright-cli/references/tracing.md +1 -1
- package/skills/skills.lock.json +2 -2
- package/skills/testomatio/qa-process/qa-review-pr/SKILL.md +28 -4
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// pi names itself on the providers that publish a client identity (its own
|
|
2
|
+
// `core/provider-attribution.ts`), so without this every Testeiya run is
|
|
3
|
+
// credited to pi. `before_provider_headers` fires for every provider, hence the
|
|
4
|
+
// model check.
|
|
5
|
+
const OPENROUTER = {
|
|
6
|
+
// OpenRouter identifies an app by its `HTTP-Referer`: that URL is the app's
|
|
7
|
+
// page and its row in the openrouter.ai/apps rankings.
|
|
8
|
+
"HTTP-Referer": "https://testomat.ai/testeiya/",
|
|
9
|
+
"X-OpenRouter-Title": "Testeiya",
|
|
10
|
+
"X-OpenRouter-Categories": "cli-agent",
|
|
11
|
+
};
|
|
12
|
+
// Cloudflare names the client by `User-Agent` in the AI Gateway logs.
|
|
13
|
+
const CLOUDFLARE = { "User-Agent": "Testeiya" };
|
|
14
|
+
/** Credit Testeiya, not pi, wherever a provider records who is calling. */
|
|
15
|
+
export default function attributionExtension(pi) {
|
|
16
|
+
pi.on("before_provider_headers", (event, ctx) => {
|
|
17
|
+
const attribution = attributionFor(ctx.model);
|
|
18
|
+
if (attribution)
|
|
19
|
+
Object.assign(event.headers, attribution);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function attributionFor(model) {
|
|
23
|
+
if (!model)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (model.provider === "openrouter" || model.baseUrl.includes("openrouter.ai"))
|
|
26
|
+
return OPENROUTER;
|
|
27
|
+
if (model.provider.startsWith("cloudflare") || model.baseUrl.includes("cloudflare.com"))
|
|
28
|
+
return CLOUDFLARE;
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=attribution-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution-extension.js","sourceRoot":"","sources":["../../src/attribution-extension.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,yEAAyE;AACzE,gFAAgF;AAChF,eAAe;AACf,MAAM,UAAU,GAAG;IACjB,4EAA4E;IAC5E,uDAAuD;IACvD,cAAc,EAAE,+BAA+B;IAC/C,oBAAoB,EAAE,UAAU;IAChC,yBAAyB,EAAE,WAAW;CACvC,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAgB;IAC3D,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,GAAqB,EAAE,EAAE;QAChE,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,WAAW;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAgC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IAClG,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3G,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/src/session.js
CHANGED
|
@@ -11,6 +11,7 @@ import { sessionModel } from "./sessions.js";
|
|
|
11
11
|
// resolve to dist/skills, and the filter below would silently drop everything.
|
|
12
12
|
export const BUNDLED_SKILLS_DIR = join(PACKAGE_ROOT, "skills");
|
|
13
13
|
const MCP_EXTENSION = join(import.meta.dirname, "mcp-extension.js");
|
|
14
|
+
const ATTRIBUTION_EXTENSION = join(import.meta.dirname, "attribution-extension.js");
|
|
14
15
|
/** The one runtime factory, so every command reads the same auth. */
|
|
15
16
|
export async function createRuntime() {
|
|
16
17
|
const runtime = await ModelRuntime.create({
|
|
@@ -44,7 +45,7 @@ export async function createTesteiyaSession(options) {
|
|
|
44
45
|
const runtime = await createRuntime();
|
|
45
46
|
const model = resolveModel(runtime, options.model, sessionModel(options.sessionManager));
|
|
46
47
|
const settingsManager = SettingsManager.inMemory();
|
|
47
|
-
const extensionPaths = [];
|
|
48
|
+
const extensionPaths = [ATTRIBUTION_EXTENSION];
|
|
48
49
|
const connectedMcps = [];
|
|
49
50
|
if (hasMcp()) {
|
|
50
51
|
extensionPaths.push(MCP_EXTENSION);
|
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,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,eAAe,GAIhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7C,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,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -165,6 +165,11 @@ playwright-cli run-code "async page => await page.context().grantPermissions(['g
|
|
|
165
165
|
playwright-cli run-code --filename=script.js
|
|
166
166
|
playwright-cli tracing-start
|
|
167
167
|
playwright-cli tracing-stop
|
|
168
|
+
|
|
169
|
+
# record user actions in the browser, print them as Playwright code on stop
|
|
170
|
+
playwright-cli recording-start
|
|
171
|
+
playwright-cli recording-stop
|
|
172
|
+
|
|
168
173
|
playwright-cli video-start video.webm
|
|
169
174
|
playwright-cli video-chapter "Chapter Title" --description="Details" --duration=2000
|
|
170
175
|
playwright-cli video-stop
|
|
@@ -19,7 +19,7 @@ playwright-cli tracing-stop
|
|
|
19
19
|
|
|
20
20
|
## Trace Output Files
|
|
21
21
|
|
|
22
|
-
When you start tracing, Playwright creates a
|
|
22
|
+
When you start tracing, Playwright creates a `.playwright-cli/traces/` directory with several files:
|
|
23
23
|
|
|
24
24
|
### `trace-{timestamp}.trace`
|
|
25
25
|
|
package/skills/skills.lock.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{
|
|
4
4
|
"source": "testomatio/skills",
|
|
5
5
|
"ref": null,
|
|
6
|
-
"sha": "
|
|
6
|
+
"sha": "a6a122421dadccd36f71ae3ed4c186eecbd1a286",
|
|
7
7
|
"folder": "testomatio",
|
|
8
8
|
"skills": [
|
|
9
9
|
"automate-manual-test-cases",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
{
|
|
72
72
|
"source": "microsoft/playwright-cli/tree/main/skills/playwright-cli",
|
|
73
73
|
"ref": null,
|
|
74
|
-
"sha": "
|
|
74
|
+
"sha": "397ee39c83a651e1314cfb010b94e8a3aac11261",
|
|
75
75
|
"folder": "playwright",
|
|
76
76
|
"skills": [
|
|
77
77
|
"playwright-cli"
|
|
@@ -33,7 +33,31 @@ Gather intent with the `qa-pr-requirements-analyzer` skill first.
|
|
|
33
33
|
|
|
34
34
|
## Requested sections
|
|
35
35
|
|
|
36
|
-
- Section
|
|
37
|
-
- Section
|
|
38
|
-
- Section
|
|
39
|
-
- Section
|
|
36
|
+
- Section `Is it done`: does the code meet the original request (pr title, issue description, etc). Include brief (1 line) original issue summary in it. Avoid details, your goal is to detect unmatched or wrongly understood issues. 1-3 sentances max.
|
|
37
|
+
- Section `Backwards Compatibility`: how this change is aligned with our existsing features, is there a significant behavior changes we need to be aware of (if no compatibility issues present, just say so).
|
|
38
|
+
- Section `Merge Risks`: what are potential problems can be introduced by merging this PR.
|
|
39
|
+
- Section `What must be verified`: up to 5 most risk usage scenarios for end-users. Start in form: "**What if {persona} {verb}**". Avoid scenarios that are technical and can be unit tested.
|
|
40
|
+
|
|
41
|
+
## Output Format
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
### 👷♀️ Is it done
|
|
45
|
+
|
|
46
|
+
<Yes, no, partially; few words>
|
|
47
|
+
|
|
48
|
+
<Reasoning for decision, references>
|
|
49
|
+
|
|
50
|
+
### 🦕 Backwards Compatibility
|
|
51
|
+
|
|
52
|
+
<reasoning>
|
|
53
|
+
<if no breaking changes -> 'No breaking changes'>
|
|
54
|
+
<if no change behavior -> 'No behavior changes'>
|
|
55
|
+
|
|
56
|
+
### 🌋 Merge Risks
|
|
57
|
+
|
|
58
|
+
<numbered list. 1 to 5 points>
|
|
59
|
+
|
|
60
|
+
### 🔬 What must be verified
|
|
61
|
+
|
|
62
|
+
<bullet list in 'What if' format>
|
|
63
|
+
```
|