testeiya 0.3.17 → 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/skills.lock.json +1 -1
- 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
package/skills/skills.lock.json
CHANGED
|
@@ -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
|
+
```
|