@testivai/mcp 0.6.1 → 0.8.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 CHANGED
@@ -3,22 +3,30 @@
3
3
  MCP (Model Context Protocol) server that gives AI coding agents eyes on your
4
4
  visual regression results. The agent changes UI code, runs your test suite,
5
5
  then uses these tools to find out **what actually changed on screen** — and
6
- whether it's real or just render noise.
6
+ whether it is a real change, likely render noise, or a case the DOM and style
7
+ signals cannot settle.
7
8
 
8
9
  ## Tools
9
10
 
10
11
  | Tool | What it does |
11
12
  |---|---|
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 |
13
+ | `get_visual_results` | Reads `visual-report/results.json` and returns a one-line verdict per snapshot: passed (an auto-passed diff says which configured criterion passed it) / likely render noise (the DOM and computed styles both match and the diff is small and scattered; still not proof) / concentrated in one area or large (the DOM and computed styles match, but every diff region fits in a box covering at most a third of the page, or over 1% of pixels differ: a bad capture or a change the style check does not cover, such as size, overflow, transform or an image, so compare the images before approving) / style-only change (identical DOM, different computed styles: a real change) / structural change (with the DOM summary) / styles not compared (identical DOM, style check unavailable: could be render noise or a stylesheet-only change, so compare the images before approving). Snapshots that share an identical signal (style-only change on the same elements, the same page shift, identical DOM with styles not compared, a large spread-out diff, likely render noise) are grouped first; a diff concentrated in one area is never grouped. Each missing baseline (committed, but no capture this run) gets its own line (several share one verdict line, so a partial run stays short), with nothing to approve: an intended removal deletes the baseline directory. It ends with the paths to open the HTML report and each diff image |
14
+ | `explain_snapshot` | Layered evidence for one snapshot: pixel regions and the shape of the diff (`layers.pixel.shape`: scattered, concentrated or large), element attribution (which selectors shifted vs changed, whole-page shift), the DOM/style signal, and interpretation guidance; for a missing baseline, status `missing`, the committed baseline files and what to check instead |
14
15
  | `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 |
16
+ | `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; for a missing baseline, the committed baseline image only |
16
17
  | `list_baselines` | Lists the committed baselines under `.testivai/baselines/` |
17
18
  | `approve_snapshot` / `approve_all` | Promote reviewed captures to committed baselines (same as `testivai approve`), **only after a human confirms** |
18
19
 
19
- The server also ships a prompt, `review-visual-changes`, that walks the agent
20
+ The server also ships two prompts. `review-visual-changes` walks the agent
20
21
  through a full review: summary, `explain_snapshot` per change, diff images when
21
22
  the evidence is ambiguous, and a recommendation per snapshot.
23
+ `triage-visual-diff` (optional `snapshot` and `intent` arguments) sorts each
24
+ diff, and each missing baseline, into glitch, intended change, bug or possible
25
+ bug, with the evidence and a next step; a changed DOM or changed computed
26
+ styles is never a glitch, and neither is a missing baseline. The
27
+ same rules run in CI with the
28
+ [`testivai/testivai-oss/review@v1`](https://github.com/testivai/testivai-oss/blob/main/docs/github-action.md#ai-triage-of-every-diff)
29
+ action.
22
30
 
23
31
  ### Approval is a human decision
24
32
 
package/dist/lib.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type DiffShape } from '@testivai/witness/report';
1
2
  /** Subset of the semver-governed results.json contract this server reads. */
2
3
  export interface DomInfo {
3
4
  changed: boolean;
@@ -37,6 +38,8 @@ export interface SnapshotResult {
37
38
  name: string;
38
39
  status: 'passed' | 'changed' | 'new';
39
40
  diffPercent?: number;
41
+ /** Pixels compared: the page area. With `regions`, it says whether a diff is spread out or in one area. */
42
+ totalPixels?: number;
40
43
  baselinePath?: string;
41
44
  currentPath?: string;
42
45
  diffPath?: string;
@@ -54,13 +57,21 @@ export interface SnapshotResult {
54
57
  export interface ResultsFile {
55
58
  version: string;
56
59
  timestamp: string;
60
+ /** `missing`: results.json 2.3.0+, the number of baselines with no capture this run. */
57
61
  summary: {
58
62
  total: number;
59
63
  passed: number;
60
64
  changed: number;
61
65
  newSnapshots: number;
66
+ missing?: number;
62
67
  };
63
68
  snapshots: SnapshotResult[];
69
+ /**
70
+ * results.json 2.3.0+: committed baselines that got no capture this run
71
+ * (the test was removed, renamed or skipped, or failed before it
72
+ * captured). Absent in older results: treat as none.
73
+ */
74
+ missingBaselines?: string[];
64
75
  }
65
76
  export interface ProjectPaths {
66
77
  root: string;
@@ -69,6 +80,75 @@ export interface ProjectPaths {
69
80
  /** Resolve the report dir from .testivai/config.json (reportDir key), default visual-report/. */
70
81
  export declare function resolvePaths(root: string): ProjectPaths;
71
82
  export declare function readResults(paths: ProjectPaths): ResultsFile | null;
83
+ /** The get_visual_results header: the run and its counts, with missing baselines when the results carry them. */
84
+ export declare function summaryLine(results: ResultsFile): string;
85
+ /**
86
+ * The missing baselines to report, in results order and each once: names in
87
+ * `missingBaselines` that are not also a snapshot (the snapshot's own line
88
+ * covers those). Older results have no such list: none.
89
+ */
90
+ export declare function missingBaselineNames(results: ResultsFile): string[];
91
+ /** The baselines directory relative to the project root (config.json baselinesDir, `{platform}` resolved). */
92
+ export declare const baselinesDirFor: (root: string) => string;
93
+ /**
94
+ * The committed baseline directory of a missing baseline (absolute), or null.
95
+ * This is the only way a missing name becomes a path: the name must be listed
96
+ * in `missingBaselines` (and not be a snapshot), must name one directory
97
+ * directly inside the baselines directory (resolveBaselinesDir: config.json
98
+ * `baselinesDir`, `{platform}` included), and, when it exists, must not lead
99
+ * out of it through a symlink. witness lists missing baselines from that
100
+ * directory's own entries, so a real one always passes.
101
+ */
102
+ export declare function missingBaselineDir(root: string, results: ResultsFile, name: string): string | null;
103
+ /** One-line verdict for a missing baseline; `dir` is its baseline directory relative to the project root, when known. */
104
+ export declare function missingVerdict(dir?: string | null): string;
105
+ /**
106
+ * Why a missing baseline's directory may not be there: the results predate a
107
+ * deletion, or another machine wrote them with a baselinesDir that resolved
108
+ * elsewhere (`{platform}`). Neither is "committed here", so no git rm.
109
+ */
110
+ export declare function notHere(dir: string): string;
111
+ /**
112
+ * get_visual_results lines for the missing baselines. One is shaped like the
113
+ * per-snapshot lines (`- <name>: <verdict>`). Several are grouped by kind,
114
+ * each kind's verdict once and a short line per name, since a partial run
115
+ * (`--grep`, a matrix lane) can leave most of the suite missing: committed
116
+ * here, not on this machine (stale results, another platform's
117
+ * `{platform}`), or a name outside the baselines directory. A baseline that
118
+ * is not here is never under the "committed, delete it" verdict.
119
+ */
120
+ export declare function missingBaselineLines(root: string, results: ResultsFile): string[];
121
+ /** explain_snapshot for a missing baseline: no capture, so no layers; the committed files and what to check instead. */
122
+ export interface MissingBaselineExplanation {
123
+ name: string;
124
+ status: 'missing';
125
+ verdict: string;
126
+ baseline: {
127
+ /** Relative to the project root; null when the name does not resolve inside the baselines directory. */
128
+ directory: string | null;
129
+ /** The committed files that exist (screenshot.png, dom.html, metadata.json, elements.json), relative to the project root. */
130
+ files: string[];
131
+ };
132
+ guidance: string[];
133
+ }
134
+ /** One item of a tool result: text or a PNG. */
135
+ export type ToolContent = {
136
+ type: 'text';
137
+ text: string;
138
+ } | {
139
+ type: 'image';
140
+ data: string;
141
+ mimeType: string;
142
+ };
143
+ /** An image labelled like get_diff labels it, downscaled for model context. */
144
+ export declare function imageContent(label: string, raw: Buffer): ToolContent[];
145
+ /**
146
+ * get_diff for a missing baseline: its verdict, that there is no current
147
+ * capture, and the committed baseline screenshot only. A screenshot that is
148
+ * not there, or not a PNG, is said, never thrown. Null when the name is not
149
+ * a missing baseline.
150
+ */
151
+ export declare function missingBaselineDiff(root: string, results: ResultsFile, name: string): ToolContent[] | null;
72
152
  /** One-line, agent-oriented verdict for a snapshot. */
73
153
  export declare function verdictFor(snapshot: SnapshotResult): string;
74
154
  /** Resolve a report-relative image path safely inside the report dir. */
@@ -106,6 +186,14 @@ export interface SnapshotExplanation {
106
186
  regionCount: number;
107
187
  /** Top regions by area, largest first (max 10). */
108
188
  regions: RegionInfo[];
189
+ /**
190
+ * How the diff is laid out (diffShape in @testivai/witness): 'scattered'
191
+ * (small and spread out, the only shape render noise takes),
192
+ * 'concentrated' (every region in one box covering at most a third of
193
+ * the page) or 'large' (spread out, over 1% of pixels). Null for a new
194
+ * snapshot or a pass with no pixel diff.
195
+ */
196
+ shape: DiffShape | null;
109
197
  };
110
198
  /** Element-level evidence: which elements, moved vs changed. */
111
199
  element: {
@@ -123,8 +211,12 @@ export interface SnapshotExplanation {
123
211
  /** Interpretation rules the evidence supports, phrased for the model. */
124
212
  guidance: string[];
125
213
  }
126
- /** Build the layered explanation bundle for one snapshot, or null if absent. */
127
- export declare function explainSnapshot(root: string, name: string): SnapshotExplanation | null;
214
+ /**
215
+ * Build the layered explanation bundle for one snapshot, the missing-baseline
216
+ * explanation for a name in `missingBaselines` that is not a snapshot, or
217
+ * null when the latest results have neither.
218
+ */
219
+ export declare function explainSnapshot(root: string, name: string): SnapshotExplanation | MissingBaselineExplanation | null;
128
220
  /** Result of an approve operation — machine-readable for agents. */
129
221
  export interface ApproveResult {
130
222
  approved: string[];
@@ -163,7 +255,14 @@ export declare function downscalePng(buffer: Buffer, maxEdge?: number): {
163
255
  export declare function resolveApprovalPrompt(argv: string[], configValue: boolean | undefined): boolean;
164
256
  /** Snapshots listed together because their grouping signal is identical. */
165
257
  export interface ChangeGroup {
166
- basis: 'style-only' | 'page-shift' | 'noise';
258
+ /**
259
+ * 'styles-not-compared' is an identical DOM whose styles were not compared:
260
+ * unknown (render noise or a stylesheet-only change), never 'noise'.
261
+ * 'large-diff' is an identical DOM with matching styles whose diff is
262
+ * spread out but over 1% of pixels: more than render noise usually
263
+ * changes, never 'noise'. A diff concentrated in one area is never grouped.
264
+ */
265
+ basis: 'style-only' | 'page-shift' | 'styles-not-compared' | 'large-diff' | 'noise';
167
266
  /** What every member has in common, phrased for the reader. */
168
267
  label: string;
169
268
  /** Snapshot names, sorted. Always two or more. */
@@ -173,8 +272,8 @@ export interface ChangeGroup {
173
272
  * Deterministic grouping of changed snapshots whose grouping signal is
174
273
  * identical. Pure: no I/O, and the output does not depend on input order.
175
274
  * 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.
275
+ * shift, styles not compared, large diff, noise), then signature; members by
276
+ * name. Only groups with two or more members are returned.
178
277
  */
179
278
  export declare function groupChanges(snapshots: SnapshotResult[]): ChangeGroup[];
180
279
  /**
@@ -183,4 +282,12 @@ export declare function groupChanges(snapshots: SnapshotResult[]): ChangeGroup[]
183
282
  * more members.
184
283
  */
185
284
  export declare function changeGroupLines(snapshots: SnapshotResult[]): string[];
285
+ /**
286
+ * MCP makes a prompts/get request's `arguments` optional, but the SDK
287
+ * validates a prompt's argument schema against the object itself and rejects
288
+ * a request without one, even when every argument is optional. Run on each
289
+ * incoming message, before the SDK sees it: a prompts/get with no arguments
290
+ * gets an empty object. Everything else is returned as it was.
291
+ */
292
+ export declare function withPromptArguments<T>(message: T): T;
186
293
  //# 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":"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"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}