@testivai/mcp 0.5.9 → 0.6.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/README.md +38 -10
- package/dist/lib.d.ts +34 -0
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +151 -2
- package/dist/lib.js.map +1 -1
- package/dist/server.js +25 -29
- package/dist/server.js.map +1 -1
- package/dist/tool-meta.d.ts +54 -0
- package/dist/tool-meta.d.ts.map +1 -0
- package/dist/tool-meta.js +63 -0
- package/dist/tool-meta.js.map +1 -0
- package/package.json +3 -3
- package/server.json +3 -3
package/README.md
CHANGED
|
@@ -9,13 +9,37 @@ whether it's real or just render noise.
|
|
|
9
9
|
|
|
10
10
|
| Tool | What it does |
|
|
11
11
|
|---|---|
|
|
12
|
-
| `get_visual_results` | Reads `visual-report/results.json
|
|
13
|
-
| `
|
|
12
|
+
| `get_visual_results` | Reads `visual-report/results.json` and returns a one-line verdict per snapshot: passed / likely render noise (the DOM and computed styles both match) / style-only change (identical DOM, different computed styles: a real change) / structural change (with the DOM summary). Snapshots that share an identical signal (style-only change on the same elements, the same page shift, the same kind of noise) are grouped first; it ends with the paths to open the HTML report and each diff image |
|
|
13
|
+
| `explain_snapshot` | Layered evidence for one snapshot: pixel regions, element attribution (which selectors shifted vs changed, whole-page shift), the DOM/style signal, and interpretation guidance |
|
|
14
|
+
| `get_report` | The raw `results.json` payload, for agents that parse structured data |
|
|
15
|
+
| `get_diff` (alias `get_snapshot_diff`) | Returns the baseline, current, and diff **images** for one snapshot, downscaled to fit model context, so the agent can see the change |
|
|
14
16
|
| `list_baselines` | Lists the committed baselines under `.testivai/baselines/` |
|
|
17
|
+
| `approve_snapshot` / `approve_all` | Promote reviewed captures to committed baselines (same as `testivai approve`), **only after a human confirms** |
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
The server also ships a prompt, `review-visual-changes`, that walks the agent
|
|
20
|
+
through a full review: summary, `explain_snapshot` per change, diff images when
|
|
21
|
+
the evidence is ambiguous, and a recommendation per snapshot.
|
|
22
|
+
|
|
23
|
+
### Approval is a human decision
|
|
24
|
+
|
|
25
|
+
`approve_snapshot` and `approve_all` exist so a human who has looked at a diff
|
|
26
|
+
can say "approve it" in the conversation and have the agent carry it out. They
|
|
27
|
+
are not for the agent to decide on its own: approving rewrites what "correct"
|
|
28
|
+
means, so an agent that approves its own change can launder a regression into
|
|
29
|
+
the baseline. Both tool descriptions, the `review-visual-changes` prompt, and
|
|
30
|
+
every `get_visual_results` response say so. After approving, commit
|
|
31
|
+
`.testivai/baselines/`.
|
|
32
|
+
|
|
33
|
+
In Claude Code the client enforces this: both approve tools are marked
|
|
34
|
+
`anthropic/requiresUserInteraction`, so Claude Code asks you on every approve
|
|
35
|
+
call, even in auto-approving permission modes. To turn that off, start the
|
|
36
|
+
server with `--no-approval-prompt` or set `"mcpApprovalPrompt": false` in
|
|
37
|
+
`.testivai/config.json` (the flag wins); the approve tools then follow your
|
|
38
|
+
client's own permission settings. Walkthrough:
|
|
39
|
+
[Review and approve in Claude Code](https://github.com/testivai/testivai-oss/blob/main/docs/mcp.md#review-and-approve-in-claude-code).
|
|
40
|
+
|
|
41
|
+
The other approval paths stay available: `npx testivai approve <name>` locally,
|
|
42
|
+
or a `/testivai approve <name>` comment on the pull request.
|
|
19
43
|
|
|
20
44
|
## Setup
|
|
21
45
|
|
|
@@ -43,12 +67,16 @@ to override) and respects `reportDir` from `.testivai/config.json`.
|
|
|
43
67
|
|
|
44
68
|
1. Agent edits UI code.
|
|
45
69
|
2. Agent runs `npx playwright test` (the TestivAI reporter captures + diffs).
|
|
46
|
-
3. Agent calls `get_visual_results`
|
|
47
|
-
DOM changed (2 added, 1 removed
|
|
48
|
-
|
|
49
|
-
|
|
70
|
+
3. Agent calls `get_visual_results` and sees, for example, `homepage: changed
|
|
71
|
+
(4.20% pixels differ) and the DOM changed (2 added, 1 removed, 0 attribute
|
|
72
|
+
changes) — a real structural change; confirm it is intended before approving`.
|
|
73
|
+
4. Agent calls `explain_snapshot homepage` for the evidence, and `get_diff
|
|
74
|
+
homepage` to look at the images, then confirms the change matches the task
|
|
75
|
+
(or fixes its own regression).
|
|
50
76
|
5. Agent reports to the human: what changed, whether it looks intended, and
|
|
51
|
-
which snapshots need
|
|
77
|
+
which snapshots need approval. If the human says to approve, the agent calls
|
|
78
|
+
`approve_snapshot`; otherwise the human approves with `npx testivai approve`
|
|
79
|
+
or `/testivai approve` on the PR.
|
|
52
80
|
|
|
53
81
|
Local mode only — no account, no API key, nothing leaves the machine.
|
|
54
82
|
|
package/dist/lib.d.ts
CHANGED
|
@@ -81,6 +81,12 @@ export declare function verdictFor(snapshot: SnapshotResult): string;
|
|
|
81
81
|
* an agent (or a human) from chasing a run that isn't broken.
|
|
82
82
|
*/
|
|
83
83
|
export declare function describeMissingResults(root: string): string;
|
|
84
|
+
/**
|
|
85
|
+
* Absolute paths a person can open to see the images behind the verdicts:
|
|
86
|
+
* the HTML report, each changed snapshot's diff image, and each new
|
|
87
|
+
* snapshot's capture. Only files that exist inside the report dir are listed.
|
|
88
|
+
*/
|
|
89
|
+
export declare function reportLinks(paths: ProjectPaths, results: ResultsFile): string[];
|
|
84
90
|
export declare function resolveImage(paths: ProjectPaths, relativePath: string): string | null;
|
|
85
91
|
/**
|
|
86
92
|
* Layered evidence bundle for one snapshot — the input a client LLM turns
|
|
@@ -149,4 +155,32 @@ export declare function downscalePng(buffer: Buffer, maxEdge?: number): {
|
|
|
149
155
|
originalWidth: number;
|
|
150
156
|
originalHeight: number;
|
|
151
157
|
};
|
|
158
|
+
/**
|
|
159
|
+
* Whether the approve tools should force a per-call permission prompt.
|
|
160
|
+
* Precedence: --approval-prompt / --no-approval-prompt (last one wins), then
|
|
161
|
+
* `mcpApprovalPrompt` from .testivai/config.json, then the default (true).
|
|
162
|
+
*/
|
|
163
|
+
export declare function resolveApprovalPrompt(argv: string[], configValue: boolean | undefined): boolean;
|
|
164
|
+
/** Snapshots listed together because their grouping signal is identical. */
|
|
165
|
+
export interface ChangeGroup {
|
|
166
|
+
basis: 'style-only' | 'page-shift' | 'noise';
|
|
167
|
+
/** What every member has in common, phrased for the reader. */
|
|
168
|
+
label: string;
|
|
169
|
+
/** Snapshot names, sorted. Always two or more. */
|
|
170
|
+
members: string[];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Deterministic grouping of changed snapshots whose grouping signal is
|
|
174
|
+
* identical. Pure: no I/O, and the output does not depend on input order.
|
|
175
|
+
* Groups are ordered by size (largest first), then kind (style-only, page
|
|
176
|
+
* shift, noise), then signature; members by name. Only groups with two or
|
|
177
|
+
* more members are returned.
|
|
178
|
+
*/
|
|
179
|
+
export declare function groupChanges(snapshots: SnapshotResult[]): ChangeGroup[];
|
|
180
|
+
/**
|
|
181
|
+
* The get_visual_results section listing the groups, placed before the
|
|
182
|
+
* per-snapshot lines (which stay unchanged). Empty when no group has two or
|
|
183
|
+
* more members.
|
|
184
|
+
*/
|
|
185
|
+
export declare function changeGroupLines(snapshots: SnapshotResult[]): string[];
|
|
152
186
|
//# sourceMappingURL=lib.d.ts.map
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAKA,6EAA6E;AAC7E,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnG,iGAAiG;IACjG,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAClD,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACtD;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACpE,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACpC,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,uEAAuE;IACvE,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,UAAU,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAcvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAInE;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.js
CHANGED
|
@@ -37,12 +37,16 @@ exports.resolvePaths = resolvePaths;
|
|
|
37
37
|
exports.readResults = readResults;
|
|
38
38
|
exports.verdictFor = verdictFor;
|
|
39
39
|
exports.describeMissingResults = describeMissingResults;
|
|
40
|
+
exports.reportLinks = reportLinks;
|
|
40
41
|
exports.resolveImage = resolveImage;
|
|
41
42
|
exports.explainSnapshot = explainSnapshot;
|
|
42
43
|
exports.approveSnapshot = approveSnapshot;
|
|
43
44
|
exports.approveAll = approveAll;
|
|
44
45
|
exports.listBaselines = listBaselines;
|
|
45
46
|
exports.downscalePng = downscalePng;
|
|
47
|
+
exports.resolveApprovalPrompt = resolveApprovalPrompt;
|
|
48
|
+
exports.groupChanges = groupChanges;
|
|
49
|
+
exports.changeGroupLines = changeGroupLines;
|
|
46
50
|
const fs = __importStar(require("fs"));
|
|
47
51
|
const path = __importStar(require("path"));
|
|
48
52
|
const pngjs_1 = require("pngjs");
|
|
@@ -77,8 +81,15 @@ function verdictFor(snapshot) {
|
|
|
77
81
|
if (snapshot.status === 'new')
|
|
78
82
|
return 'new snapshot — no baseline yet; a human should review and approve it';
|
|
79
83
|
const pct = snapshot.diffPercent !== undefined ? `${snapshot.diffPercent.toFixed(2)}% pixels differ` : 'pixels differ';
|
|
84
|
+
// noiseHint means the DOM is identical and no style mismatch was found. Only
|
|
85
|
+
// styleCheck 'match' proves the styles were compared; 'unavailable' (no
|
|
86
|
+
// comparable digests) and results from before the style check also carry
|
|
87
|
+
// the hint, so the verdict must not claim the styles matched there.
|
|
80
88
|
if (snapshot.dom?.noiseHint) {
|
|
81
|
-
|
|
89
|
+
const evidence = snapshot.dom.styleCheck === 'match'
|
|
90
|
+
? 'the DOM and computed styles both match'
|
|
91
|
+
: 'DOM is structurally identical; styles were not compared (style check unavailable), so a style-only change is not ruled out';
|
|
92
|
+
return `changed (${pct}) but ${evidence} — likely render noise (font hinting, anti-aliasing); mention it, don't block`;
|
|
82
93
|
}
|
|
83
94
|
if (snapshot.dom?.changed) {
|
|
84
95
|
const s = snapshot.dom.summary;
|
|
@@ -149,6 +160,25 @@ function describeMissingResults(root) {
|
|
|
149
160
|
}
|
|
150
161
|
return `No results found at ${where}. Run the visual tests first (e.g. npx playwright test).`;
|
|
151
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Absolute paths a person can open to see the images behind the verdicts:
|
|
165
|
+
* the HTML report, each changed snapshot's diff image, and each new
|
|
166
|
+
* snapshot's capture. Only files that exist inside the report dir are listed.
|
|
167
|
+
*/
|
|
168
|
+
function reportLinks(paths, results) {
|
|
169
|
+
const links = [];
|
|
170
|
+
const report = resolveImage(paths, 'index.html');
|
|
171
|
+
if (report)
|
|
172
|
+
links.push(`- report: ${report}`);
|
|
173
|
+
for (const s of results.snapshots) {
|
|
174
|
+
const image = s.status === 'changed' && s.diffPath ? { label: 'diff', file: resolveImage(paths, s.diffPath) }
|
|
175
|
+
: s.status === 'new' && s.currentPath ? { label: 'new capture', file: resolveImage(paths, s.currentPath) }
|
|
176
|
+
: null;
|
|
177
|
+
if (image?.file)
|
|
178
|
+
links.push(`- ${s.name} (${image.label}): ${image.file}`);
|
|
179
|
+
}
|
|
180
|
+
return links.length > 0 ? ['Open on this machine:', ...links] : [];
|
|
181
|
+
}
|
|
152
182
|
function resolveImage(paths, relativePath) {
|
|
153
183
|
const abs = path.resolve(paths.reportDir, relativePath);
|
|
154
184
|
if (!abs.startsWith(path.resolve(paths.reportDir) + path.sep))
|
|
@@ -176,7 +206,10 @@ function explainSnapshot(root, name) {
|
|
|
176
206
|
guidance.push('No baseline exists yet — this is a first capture, not a regression. A human should review and approve it.');
|
|
177
207
|
}
|
|
178
208
|
if (snapshot.dom?.noiseHint) {
|
|
179
|
-
|
|
209
|
+
const evidence = snapshot.dom.styleCheck === 'match'
|
|
210
|
+
? 'the DOM is structurally identical and style digests match'
|
|
211
|
+
: 'the DOM is structurally identical; styles were not compared (no comparable style digests), so a style-only change is not ruled out';
|
|
212
|
+
guidance.push(`Pixels differ but ${evidence} — likely render noise (anti-aliasing, font hinting). Mention it; do not block on it.`);
|
|
180
213
|
}
|
|
181
214
|
if (snapshot.dom?.styleCheck === 'mismatch') {
|
|
182
215
|
const els = snapshot.dom.styleChanges?.elements?.slice(0, 5).join(', ');
|
|
@@ -292,4 +325,120 @@ function downscalePng(buffer, maxEdge = 1024) {
|
|
|
292
325
|
}
|
|
293
326
|
return { data: pngjs_1.PNG.sync.write(out), width: w, height: h, originalWidth: ow, originalHeight: oh };
|
|
294
327
|
}
|
|
328
|
+
/**
|
|
329
|
+
* Whether the approve tools should force a per-call permission prompt.
|
|
330
|
+
* Precedence: --approval-prompt / --no-approval-prompt (last one wins), then
|
|
331
|
+
* `mcpApprovalPrompt` from .testivai/config.json, then the default (true).
|
|
332
|
+
*/
|
|
333
|
+
function resolveApprovalPrompt(argv, configValue) {
|
|
334
|
+
for (let i = argv.length - 1; i >= 0; i--) {
|
|
335
|
+
if (argv[i] === '--approval-prompt')
|
|
336
|
+
return true;
|
|
337
|
+
if (argv[i] === '--no-approval-prompt')
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
return configValue ?? true;
|
|
341
|
+
}
|
|
342
|
+
// Real changes before noise when groups are the same size.
|
|
343
|
+
const BASIS_ORDER = ['style-only', 'page-shift', 'noise'];
|
|
344
|
+
/**
|
|
345
|
+
* The one grouping signal a changed snapshot carries, or null when it must
|
|
346
|
+
* not be grouped. Precedence: structural (never grouped) > style-only >
|
|
347
|
+
* page shift > noise. Every rule errs towards null: under-grouping is
|
|
348
|
+
* acceptable, over-grouping is a bug.
|
|
349
|
+
*/
|
|
350
|
+
function signatureOf(s) {
|
|
351
|
+
// Only changed snapshots; auto-passed ones are status 'passed'.
|
|
352
|
+
if (s.status !== 'changed')
|
|
353
|
+
return null;
|
|
354
|
+
// No DOM data means a structural change cannot be ruled out.
|
|
355
|
+
if (!s.dom || s.dom.changed)
|
|
356
|
+
return null;
|
|
357
|
+
if (s.dom.styleCheck === 'mismatch') {
|
|
358
|
+
const changes = s.dom.styleChanges;
|
|
359
|
+
// witness lists at most 10 elements: beyond that the lists cannot be
|
|
360
|
+
// compared exactly, so a truncated signature is never grouped.
|
|
361
|
+
if (!changes || changes.elements.length === 0 || changes.count > changes.elements.length)
|
|
362
|
+
return null;
|
|
363
|
+
const elements = [...changes.elements].sort();
|
|
364
|
+
const n = elements.length;
|
|
365
|
+
const shown = elements.slice(0, 3).join(', ') + (n > 3 ? ', …' : '');
|
|
366
|
+
return {
|
|
367
|
+
basis: 'style-only',
|
|
368
|
+
key: `style-only:${elements.join('|')}`,
|
|
369
|
+
label: `style-only change that restyled the same ${n} element${n === 1 ? '' : 's'} with identical DOM (${shown}); ` +
|
|
370
|
+
'grouped on which elements changed style, not on the new style values',
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
if (s.pageShift) {
|
|
374
|
+
const { dy, belowY } = s.pageShift;
|
|
375
|
+
return {
|
|
376
|
+
basis: 'page-shift',
|
|
377
|
+
key: `page-shift:${dy}:${belowY}`,
|
|
378
|
+
label: `the same page shift: everything at or below y=${belowY} moved ${dy > 0 ? 'down' : 'up'} ${Math.abs(dy)}px; ` +
|
|
379
|
+
'grouped on the displacement, not on its cause',
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
if (s.dom.noiseHint) {
|
|
383
|
+
return s.dom.styleCheck === 'match'
|
|
384
|
+
? { basis: 'noise', key: 'noise:match', label: 'likely render noise: the DOM and computed styles both match' }
|
|
385
|
+
: {
|
|
386
|
+
basis: 'noise',
|
|
387
|
+
key: 'noise:not-compared',
|
|
388
|
+
label: 'likely render noise with identical DOM, but styles not compared (style check unavailable)',
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Deterministic grouping of changed snapshots whose grouping signal is
|
|
395
|
+
* identical. Pure: no I/O, and the output does not depend on input order.
|
|
396
|
+
* Groups are ordered by size (largest first), then kind (style-only, page
|
|
397
|
+
* shift, noise), then signature; members by name. Only groups with two or
|
|
398
|
+
* more members are returned.
|
|
399
|
+
*/
|
|
400
|
+
function groupChanges(snapshots) {
|
|
401
|
+
const byKey = new Map();
|
|
402
|
+
for (const s of snapshots) {
|
|
403
|
+
const signature = signatureOf(s);
|
|
404
|
+
if (!signature)
|
|
405
|
+
continue;
|
|
406
|
+
const entry = byKey.get(signature.key) ?? { signature, members: [] };
|
|
407
|
+
entry.members.push(s.name);
|
|
408
|
+
byKey.set(signature.key, entry);
|
|
409
|
+
}
|
|
410
|
+
return [...byKey.values()]
|
|
411
|
+
.filter((g) => g.members.length >= 2)
|
|
412
|
+
.sort((a, b) => b.members.length - a.members.length ||
|
|
413
|
+
BASIS_ORDER.indexOf(a.signature.basis) - BASIS_ORDER.indexOf(b.signature.basis) ||
|
|
414
|
+
(a.signature.key < b.signature.key ? -1 : a.signature.key > b.signature.key ? 1 : 0))
|
|
415
|
+
.map(({ signature, members }) => ({ basis: signature.basis, label: signature.label, members: [...members].sort() }));
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* The get_visual_results section listing the groups, placed before the
|
|
419
|
+
* per-snapshot lines (which stay unchanged). Empty when no group has two or
|
|
420
|
+
* more members.
|
|
421
|
+
*/
|
|
422
|
+
function changeGroupLines(snapshots) {
|
|
423
|
+
const groups = groupChanges(snapshots);
|
|
424
|
+
if (groups.length === 0)
|
|
425
|
+
return [];
|
|
426
|
+
const truncated = snapshots
|
|
427
|
+
.filter((s) => {
|
|
428
|
+
const c = s.status === 'changed' && s.dom && !s.dom.changed && s.dom.styleCheck === 'mismatch' ? s.dom.styleChanges : undefined;
|
|
429
|
+
return c !== undefined && c.count > c.elements.length;
|
|
430
|
+
})
|
|
431
|
+
.map((s) => s.name)
|
|
432
|
+
.sort();
|
|
433
|
+
return [
|
|
434
|
+
'Grouped by identical signal (deterministic; members can still differ in ways the signal does not cover, so every snapshot keeps its own line below):',
|
|
435
|
+
...groups.map((g) => `- ${g.members.join(', ')} (${g.members.length}): ${g.label}`),
|
|
436
|
+
...(truncated.length > 0
|
|
437
|
+
? [
|
|
438
|
+
`Not grouped: ${truncated.join(', ')} ${truncated.length === 1 ? 'has' : 'have'} more than 10 restyled elements, ` +
|
|
439
|
+
'so the element lists are truncated and cannot be compared exactly.',
|
|
440
|
+
]
|
|
441
|
+
: []),
|
|
442
|
+
];
|
|
443
|
+
}
|
|
295
444
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -38,18 +38,21 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const zod_1 = require("zod");
|
|
39
39
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
40
40
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
41
|
+
const config_1 = require("@testivai/witness/config");
|
|
41
42
|
const lib_1 = require("./lib");
|
|
43
|
+
const tool_meta_1 = require("./tool-meta");
|
|
42
44
|
const packageJson = require('../package.json');
|
|
43
45
|
// Project root: --root <path> flag or cwd (MCP clients set cwd to the workspace).
|
|
44
46
|
const rootFlag = process.argv.indexOf('--root');
|
|
45
47
|
const projectRoot = rootFlag !== -1 && process.argv[rootFlag + 1] ? process.argv[rootFlag + 1] : process.cwd();
|
|
48
|
+
// Approve tools force a per-call permission prompt unless the user turned it
|
|
49
|
+
// off: --approval-prompt / --no-approval-prompt, then mcpApprovalPrompt in
|
|
50
|
+
// .testivai/config.json, then on.
|
|
51
|
+
const approvalPrompt = (0, lib_1.resolveApprovalPrompt)(process.argv.slice(2), (0, config_1.loadLocalConfig)(projectRoot).mcpApprovalPrompt);
|
|
52
|
+
const TOOL_META = (0, tool_meta_1.toolMetaFor)({ approvalPrompt });
|
|
46
53
|
const server = new mcp_js_1.McpServer({ name: 'testivai', version: packageJson.version });
|
|
47
54
|
server.registerTool('get_visual_results', {
|
|
48
|
-
|
|
49
|
-
description: 'Read the latest TestivAI visual regression results (visual-report/results.json). ' +
|
|
50
|
-
'Returns a per-snapshot verdict combining the pixel diff and the DOM signal: ' +
|
|
51
|
-
'DOM-identical diffs are likely render noise; DOM changes are real and need human review. ' +
|
|
52
|
-
'Run the test suite first (e.g. `npx playwright test`) if results are stale or missing.',
|
|
55
|
+
...TOOL_META.get_visual_results,
|
|
53
56
|
inputSchema: {},
|
|
54
57
|
}, async () => {
|
|
55
58
|
const paths = (0, lib_1.resolvePaths)(projectRoot);
|
|
@@ -67,12 +70,20 @@ server.registerTool('get_visual_results', {
|
|
|
67
70
|
const lines = [
|
|
68
71
|
`Run: ${results.timestamp} — ${results.summary.total} snapshots: ${results.summary.passed} passed, ${results.summary.changed} changed, ${results.summary.newSnapshots} new.`,
|
|
69
72
|
'',
|
|
73
|
+
...withBlankAfter((0, lib_1.changeGroupLines)(results.snapshots)),
|
|
70
74
|
...results.snapshots.map((s) => `- ${s.name}: ${(0, lib_1.verdictFor)(s)}`),
|
|
71
75
|
'',
|
|
72
|
-
|
|
76
|
+
...withBlankAfter((0, lib_1.reportLinks)(paths, results)),
|
|
77
|
+
'Baseline approval is a human decision: do not approve on your own. When the human confirms a change in this conversation, ' +
|
|
78
|
+
'call approve_snapshot with its name (approve_all only after they have reviewed every change); ' +
|
|
79
|
+
'otherwise suggest `npx testivai approve <name>` locally or `/testivai approve <name>` on the PR.',
|
|
73
80
|
];
|
|
74
81
|
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
75
82
|
});
|
|
83
|
+
// A section of lines followed by a blank separator, or nothing when empty.
|
|
84
|
+
function withBlankAfter(section) {
|
|
85
|
+
return section.length > 0 ? [...section, ''] : [];
|
|
86
|
+
}
|
|
76
87
|
// Shared handler for the diff-image tools (registered under two names).
|
|
77
88
|
const snapshotDiffHandler = async ({ name }) => {
|
|
78
89
|
const paths = (0, lib_1.resolvePaths)(projectRoot);
|
|
@@ -104,24 +115,17 @@ const snapshotDiffHandler = async ({ name }) => {
|
|
|
104
115
|
}
|
|
105
116
|
return { content };
|
|
106
117
|
};
|
|
107
|
-
const
|
|
108
|
-
title: 'View snapshot diff images',
|
|
109
|
-
description: 'Return the baseline, current, and diff images for one changed snapshot so you can see what changed visually. ' +
|
|
110
|
-
'Use get_report / get_visual_results first to find snapshot names.',
|
|
111
|
-
inputSchema: { name: zod_1.z.string().describe('Snapshot name from the results') },
|
|
112
|
-
};
|
|
118
|
+
const diffInputSchema = { name: zod_1.z.string().describe('Snapshot name from the results') };
|
|
113
119
|
// registerTool is called through an untyped alias: zod@3.25 + TS 6 blow the
|
|
114
120
|
// type-depth limit (TS2589) when inferring the schema generics. Runtime
|
|
115
121
|
// validation of the input schema is unaffected.
|
|
116
122
|
// `get_diff` is the canonical name; `get_snapshot_diff` is kept as an alias.
|
|
117
|
-
server.registerTool('get_diff',
|
|
118
|
-
server.registerTool('get_snapshot_diff',
|
|
123
|
+
server.registerTool('get_diff', { ...TOOL_META.get_diff, inputSchema: diffInputSchema }, snapshotDiffHandler);
|
|
124
|
+
server.registerTool('get_snapshot_diff', { ...TOOL_META.get_snapshot_diff, inputSchema: diffInputSchema }, snapshotDiffHandler);
|
|
119
125
|
// get_report — the raw results.json payload (the public schema) for agents
|
|
120
126
|
// that want to parse structured data rather than the human summary.
|
|
121
127
|
server.registerTool('get_report', {
|
|
122
|
-
|
|
123
|
-
description: 'Return the machine-readable results.json payload verbatim (summary + per-snapshot status, diff %, ' +
|
|
124
|
-
'DOM signal, and region→selector attribution). Parse this instead of scraping CLI output.',
|
|
128
|
+
...TOOL_META.get_report,
|
|
125
129
|
inputSchema: {},
|
|
126
130
|
}, async () => {
|
|
127
131
|
const results = (0, lib_1.readResults)((0, lib_1.resolvePaths)(projectRoot));
|
|
@@ -134,26 +138,21 @@ server.registerTool('get_report', {
|
|
|
134
138
|
// baselines. Approval accepts a new visual truth, so only call these once a
|
|
135
139
|
// reviewer has confirmed the change is intended (not a regression).
|
|
136
140
|
server.registerTool('approve_snapshot', {
|
|
137
|
-
|
|
138
|
-
description: 'Promote .testivai/temp/<name>/ to the committed baseline (same as `testivai approve <name>`). ' +
|
|
139
|
-
'Only approve changes a reviewer has confirmed are intended; then commit .testivai/baselines/.',
|
|
141
|
+
...TOOL_META.approve_snapshot,
|
|
140
142
|
inputSchema: { name: zod_1.z.string().describe('Snapshot name to approve') },
|
|
141
143
|
}, async ({ name }) => {
|
|
142
144
|
const result = (0, lib_1.approveSnapshot)(projectRoot, name);
|
|
143
145
|
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
|
|
144
146
|
});
|
|
145
147
|
server.registerTool('approve_all', {
|
|
146
|
-
|
|
147
|
-
description: 'Promote every pending capture under .testivai/temp/ to committed baselines (same as `testivai approve --all`). ' +
|
|
148
|
-
'Only run this after a reviewer has confirmed the changes; then commit .testivai/baselines/.',
|
|
148
|
+
...TOOL_META.approve_all,
|
|
149
149
|
inputSchema: {},
|
|
150
150
|
}, async () => {
|
|
151
151
|
const result = (0, lib_1.approveAll)(projectRoot);
|
|
152
152
|
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
|
|
153
153
|
});
|
|
154
154
|
server.registerTool('list_baselines', {
|
|
155
|
-
|
|
156
|
-
description: 'List the snapshot baselines committed under .testivai/baselines/.',
|
|
155
|
+
...TOOL_META.list_baselines,
|
|
157
156
|
inputSchema: {},
|
|
158
157
|
}, async () => {
|
|
159
158
|
const names = (0, lib_1.listBaselines)(projectRoot);
|
|
@@ -170,10 +169,7 @@ server.registerTool('list_baselines', {
|
|
|
170
169
|
// attribution → DOM/style signals → guidance). The client's own model turns
|
|
171
170
|
// this into the narrative; the server ships evidence, not an LLM.
|
|
172
171
|
server.registerTool('explain_snapshot', {
|
|
173
|
-
|
|
174
|
-
description: 'Layered evidence for one snapshot: pixel regions with bounding boxes, element attribution ' +
|
|
175
|
-
'(which selectors shifted vs changed, whole-page shift detection), the DOM/style signal, and ' +
|
|
176
|
-
'interpretation guidance. Use this to explain WHY a diff happened — pair with get_diff for the images.',
|
|
172
|
+
...TOOL_META.explain_snapshot,
|
|
177
173
|
inputSchema: { name: zod_1.z.string().describe('Snapshot name from the results') },
|
|
178
174
|
}, async ({ name }) => {
|
|
179
175
|
const explanation = (0, lib_1.explainSnapshot)(projectRoot, name);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AACzB,6BAAyB;AACzB,oEAAoE;AACpE,wEAAiF;AACjF,+
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Titles and descriptions for every tool the server registers.
|
|
3
|
+
*
|
|
4
|
+
* The model reads these before it calls a tool, so they are part of the
|
|
5
|
+
* agent-facing contract alongside the verdicts in lib.ts and must not
|
|
6
|
+
* contradict them. Kept apart from server.ts (which starts the stdio server
|
|
7
|
+
* on import) so tests can read them.
|
|
8
|
+
*/
|
|
9
|
+
export interface ToolMeta {
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
/** Client hints advertised in tools/list alongside the description. */
|
|
13
|
+
_meta?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export declare const TOOL_META: {
|
|
16
|
+
get_visual_results: {
|
|
17
|
+
title: string;
|
|
18
|
+
description: string;
|
|
19
|
+
};
|
|
20
|
+
get_diff: ToolMeta;
|
|
21
|
+
get_snapshot_diff: ToolMeta;
|
|
22
|
+
get_report: {
|
|
23
|
+
title: string;
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
approve_snapshot: {
|
|
27
|
+
title: string;
|
|
28
|
+
description: string;
|
|
29
|
+
_meta: {
|
|
30
|
+
'anthropic/requiresUserInteraction': boolean;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
approve_all: {
|
|
34
|
+
title: string;
|
|
35
|
+
description: string;
|
|
36
|
+
_meta: {
|
|
37
|
+
'anthropic/requiresUserInteraction': boolean;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
list_baselines: {
|
|
41
|
+
title: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
explain_snapshot: {
|
|
45
|
+
title: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/** The tool metadata for this server run, given the approval-prompt setting. */
|
|
50
|
+
export type ToolName = keyof typeof TOOL_META;
|
|
51
|
+
export declare function toolMetaFor({ approvalPrompt }: {
|
|
52
|
+
approvalPrompt: boolean;
|
|
53
|
+
}): Record<ToolName, ToolMeta>;
|
|
54
|
+
//# sourceMappingURL=tool-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-meta.d.ts","sourceRoot":"","sources":["../src/tool-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAcD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Cc,CAAC;AAErC,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,SAAS,CAAC;AAE9C,wBAAgB,WAAW,CAAC,EAAE,cAAc,EAAE,EAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAKvG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TOOL_META = void 0;
|
|
4
|
+
exports.toolMetaFor = toolMetaFor;
|
|
5
|
+
// Baseline approval must come from a person. Claude Code honours this key by
|
|
6
|
+
// showing the tool's permission prompt on every call, even in auto-approving
|
|
7
|
+
// permission modes; other clients ignore it.
|
|
8
|
+
const requiresUserInteraction = { 'anthropic/requiresUserInteraction': true };
|
|
9
|
+
const diffImages = {
|
|
10
|
+
title: 'View snapshot diff images',
|
|
11
|
+
description: 'Return the baseline, current, and diff images for one changed snapshot so you can see what changed visually. ' +
|
|
12
|
+
'Use get_report / get_visual_results first to find snapshot names.',
|
|
13
|
+
};
|
|
14
|
+
exports.TOOL_META = {
|
|
15
|
+
get_visual_results: {
|
|
16
|
+
title: 'Get visual test results',
|
|
17
|
+
description: 'Read the latest TestivAI visual regression results (visual-report/results.json). ' +
|
|
18
|
+
'Returns a per-snapshot verdict combining the pixel diff with the DOM and computed-style signals. ' +
|
|
19
|
+
'A pixel diff is likely render noise when the DOM and the computed styles both match; ' +
|
|
20
|
+
'a style-only change (identical DOM, different computed styles) is a real change, not noise, ' +
|
|
21
|
+
'and so is any DOM change — both need human review. ' +
|
|
22
|
+
'When the styles could not be compared, the verdict says so. ' +
|
|
23
|
+
'Run the test suite first (e.g. `npx playwright test`) if results are stale or missing.',
|
|
24
|
+
},
|
|
25
|
+
// `get_diff` is the canonical name; `get_snapshot_diff` is kept as an alias.
|
|
26
|
+
get_diff: diffImages,
|
|
27
|
+
get_snapshot_diff: diffImages,
|
|
28
|
+
get_report: {
|
|
29
|
+
title: 'Get the raw visual report (results.json)',
|
|
30
|
+
description: 'Return the machine-readable results.json payload verbatim (summary + per-snapshot status, diff %, ' +
|
|
31
|
+
'DOM signal, and region→selector attribution). Parse this instead of scraping CLI output.',
|
|
32
|
+
},
|
|
33
|
+
approve_snapshot: {
|
|
34
|
+
title: 'Approve one snapshot as the new baseline',
|
|
35
|
+
description: 'Promote .testivai/temp/<name>/ to the committed baseline (same as `testivai approve <name>`). ' +
|
|
36
|
+
'Only approve changes a reviewer has confirmed are intended; then commit .testivai/baselines/.',
|
|
37
|
+
_meta: requiresUserInteraction,
|
|
38
|
+
},
|
|
39
|
+
approve_all: {
|
|
40
|
+
title: 'Approve all pending snapshots as baselines',
|
|
41
|
+
description: 'Promote every pending capture under .testivai/temp/ to committed baselines (same as `testivai approve --all`). ' +
|
|
42
|
+
'Only run this after a reviewer has confirmed the changes; then commit .testivai/baselines/.',
|
|
43
|
+
_meta: requiresUserInteraction,
|
|
44
|
+
},
|
|
45
|
+
list_baselines: {
|
|
46
|
+
title: 'List committed baselines',
|
|
47
|
+
description: 'List the snapshot baselines committed under .testivai/baselines/.',
|
|
48
|
+
},
|
|
49
|
+
explain_snapshot: {
|
|
50
|
+
title: 'Explain what changed in one snapshot',
|
|
51
|
+
description: 'Layered evidence for one snapshot: pixel regions with bounding boxes, element attribution ' +
|
|
52
|
+
'(which selectors shifted vs changed, whole-page shift detection), the DOM/style signal, and ' +
|
|
53
|
+
'interpretation guidance. Use this to explain WHY a diff happened — pair with get_diff for the images.',
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
function toolMetaFor({ approvalPrompt }) {
|
|
57
|
+
if (approvalPrompt)
|
|
58
|
+
return exports.TOOL_META;
|
|
59
|
+
const { _meta: _snapshot, ...approveSnapshot } = exports.TOOL_META.approve_snapshot;
|
|
60
|
+
const { _meta: _all, ...approveAll } = exports.TOOL_META.approve_all;
|
|
61
|
+
return { ...exports.TOOL_META, approve_snapshot: approveSnapshot, approve_all: approveAll };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=tool-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-meta.js","sourceRoot":"","sources":["../src/tool-meta.ts"],"names":[],"mappings":";;;AA8EA,kCAKC;AApED,6EAA6E;AAC7E,6EAA6E;AAC7E,6CAA6C;AAC7C,MAAM,uBAAuB,GAAG,EAAE,mCAAmC,EAAE,IAAI,EAAE,CAAC;AAE9E,MAAM,UAAU,GAAa;IAC3B,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,+GAA+G;QAC/G,mEAAmE;CACtE,CAAC;AAEW,QAAA,SAAS,GAAG;IACvB,kBAAkB,EAAE;QAClB,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,mFAAmF;YACnF,mGAAmG;YACnG,uFAAuF;YACvF,8FAA8F;YAC9F,qDAAqD;YACrD,8DAA8D;YAC9D,wFAAwF;KAC3F;IACD,6EAA6E;IAC7E,QAAQ,EAAE,UAAU;IACpB,iBAAiB,EAAE,UAAU;IAC7B,UAAU,EAAE;QACV,KAAK,EAAE,0CAA0C;QACjD,WAAW,EACT,oGAAoG;YACpG,0FAA0F;KAC7F;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,0CAA0C;QACjD,WAAW,EACT,gGAAgG;YAChG,+FAA+F;QACjG,KAAK,EAAE,uBAAuB;KAC/B;IACD,WAAW,EAAE;QACX,KAAK,EAAE,4CAA4C;QACnD,WAAW,EACT,iHAAiH;YACjH,6FAA6F;QAC/F,KAAK,EAAE,uBAAuB;KAC/B;IACD,cAAc,EAAE;QACd,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,mEAAmE;KACjF;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EACT,4FAA4F;YAC5F,8FAA8F;YAC9F,uGAAuG;KAC1G;CACiC,CAAC;AAKrC,SAAgB,WAAW,CAAC,EAAE,cAAc,EAA+B;IACzE,IAAI,cAAc;QAAE,OAAO,iBAAS,CAAC;IACrC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,GAAG,iBAAS,CAAC,gBAAgB,CAAC;IAC5E,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,iBAAS,CAAC,WAAW,CAAC;IAC7D,OAAO,EAAE,GAAG,iBAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACtF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testivai/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MCP server exposing TestivAI visual regression results to AI coding agents",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -38,13 +38,13 @@
|
|
|
38
38
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
39
39
|
"pngjs": "^7.0.0",
|
|
40
40
|
"zod": "^3.25.0",
|
|
41
|
-
"@testivai/witness": "2.0
|
|
41
|
+
"@testivai/witness": "2.1.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/jest": "^30.0.0",
|
|
45
45
|
"@types/node": "^25.6.1",
|
|
46
46
|
"@types/pngjs": "^6.0.5",
|
|
47
|
-
"jest": "^30.
|
|
47
|
+
"jest": "^30.5.1",
|
|
48
48
|
"ts-jest": "^29.4.12",
|
|
49
49
|
"typescript": "^6.0.3"
|
|
50
50
|
},
|
package/server.json
CHANGED
|
@@ -6,16 +6,16 @@
|
|
|
6
6
|
"url": "https://github.com/testivai/testivai-oss",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.6.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
14
14
|
"identifier": "@testivai/mcp",
|
|
15
|
-
"version": "0.
|
|
15
|
+
"version": "0.6.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
|
-
}
|
|
21
|
+
}
|