@testivai/witness 1.7.1 → 1.9.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.
Files changed (38) hide show
  1. package/dist/baselines/index.d.ts +1 -1
  2. package/dist/baselines/index.d.ts.map +1 -1
  3. package/dist/baselines/index.js +2 -1
  4. package/dist/baselines/index.js.map +1 -1
  5. package/dist/baselines/store.d.ts +15 -1
  6. package/dist/baselines/store.d.ts.map +1 -1
  7. package/dist/baselines/store.js +35 -2
  8. package/dist/baselines/store.js.map +1 -1
  9. package/dist/commands/exit-codes.d.ts +16 -5
  10. package/dist/commands/exit-codes.d.ts.map +1 -1
  11. package/dist/commands/exit-codes.js +6 -5
  12. package/dist/commands/exit-codes.js.map +1 -1
  13. package/dist/commands/report.d.ts.map +1 -1
  14. package/dist/commands/report.js +74 -2
  15. package/dist/commands/report.js.map +1 -1
  16. package/dist/config/local-config.d.ts +25 -0
  17. package/dist/config/local-config.d.ts.map +1 -1
  18. package/dist/config/local-config.js +1 -0
  19. package/dist/config/local-config.js.map +1 -1
  20. package/dist/diff/dom-diff.d.ts +14 -2
  21. package/dist/diff/dom-diff.d.ts.map +1 -1
  22. package/dist/diff/dom-diff.js +22 -19
  23. package/dist/diff/dom-diff.js.map +1 -1
  24. package/dist/report/compare.d.ts +6 -0
  25. package/dist/report/compare.d.ts.map +1 -1
  26. package/dist/report/compare.js +11 -4
  27. package/dist/report/compare.js.map +1 -1
  28. package/dist/report/generator.d.ts +27 -4
  29. package/dist/report/generator.d.ts.map +1 -1
  30. package/dist/report/generator.js +65 -6
  31. package/dist/report/generator.js.map +1 -1
  32. package/dist/report/results.d.ts +14 -0
  33. package/dist/report/results.d.ts.map +1 -1
  34. package/dist/report/template.d.ts +6 -4
  35. package/dist/report/template.d.ts.map +1 -1
  36. package/dist/report/template.js +264 -85
  37. package/dist/report/template.js.map +1 -1
  38. package/package.json +1 -1
@@ -2,10 +2,12 @@
2
2
  /**
3
3
  * TestivAI Report — HTML Template
4
4
  *
5
- * Single-file HTML with inlined CSS/JS.
6
- * Dark navy sidebar, cyan accents, summary cards,
7
- * Changed → New → Passed sections, 3-column diff view,
8
- * approve command copy button, cloud upgrade CTA, image zoom overlay.
5
+ * Single-file HTML with inlined CSS/JS. Light theme by default with a
6
+ * persisted dark-mode toggle (CSS custom properties). Sidebar + summary
7
+ * cards, Changed → New → Passed sections, a per-snapshot "Layered analysis"
8
+ * panel (verdict + DOM/style signal + attributed regions + page-shift +
9
+ * masks — the same evidence agents get via @testivai/mcp explain_snapshot),
10
+ * 3-column diff view, approve command copy button, image zoom overlay.
9
11
  */
10
12
  Object.defineProperty(exports, "__esModule", { value: true });
11
13
  exports.renderHtml = renderHtml;
@@ -17,6 +19,7 @@ function renderHtml(data) {
17
19
  const changed = snapshots.filter((s) => s.status === 'changed');
18
20
  const newSnapshots = snapshots.filter((s) => s.status === 'new');
19
21
  const passed = snapshots.filter((s) => s.status === 'passed');
22
+ const missing = data.missingBaselines ?? [];
20
23
  return `<!DOCTYPE html>
21
24
  <html lang="en">
22
25
  <head>
@@ -24,62 +27,128 @@ function renderHtml(data) {
24
27
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
28
  <title>TestivAI Visual Report</title>
26
29
  <style>
30
+ /* ── Theme tokens ─────────────────────────────────────────────────────
31
+ Light is the default (no attribute); html[data-theme="dark"] overrides.
32
+ The toggle persists to localStorage("testivai-theme"). */
33
+ :root {
34
+ --bg: #f6f8fa;
35
+ --surface: #ffffff;
36
+ --surface-2: #eef1f4;
37
+ --border: #d0d7de;
38
+ --border-soft: #e4e8ec;
39
+ --text: #1f2328;
40
+ --text-muted: #59636e;
41
+ --accent: #0e7490;
42
+ --accent-contrast: #ffffff;
43
+ --link: #0969da;
44
+ --changed: #cf222e; --changed-bg: #cf222e14;
45
+ --new: #bc4c00; --new-bg: #bc4c0014;
46
+ --passed: #1a7f37; --passed-bg: #1a7f3714;
47
+ --info: #0969da; --info-bg: #0969da12;
48
+ --code-bg: #eff2f5;
49
+ --shadow: 0 1px 3px rgba(31,35,40,0.06), 0 8px 24px rgba(31,35,40,0.04);
50
+ --sidebar-bg: #ffffff;
51
+ --hatch-a: #eef1f4; --hatch-b: #e4e8ec;
52
+ }
53
+ html[data-theme="dark"] {
54
+ --bg: #0d1117;
55
+ --surface: #161b22;
56
+ --surface-2: #1c2129;
57
+ --border: #30363d;
58
+ --border-soft: #21262d;
59
+ --text: #e6edf3;
60
+ --text-muted: #8b949e;
61
+ --accent: #00d4ff;
62
+ --accent-contrast: #08111f;
63
+ --link: #58a6ff;
64
+ --changed: #f85149; --changed-bg: #f8514922;
65
+ --new: #f0883e; --new-bg: #f0883e22;
66
+ --passed: #3fb950; --passed-bg: #3fb95022;
67
+ --info: #79c0ff; --info-bg: #1f6feb1a;
68
+ --code-bg: #0d1117;
69
+ --shadow: none;
70
+ --sidebar-bg: #08111f;
71
+ --hatch-a: #161b22; --hatch-b: #1c2129;
72
+ }
73
+
27
74
  * { margin: 0; padding: 0; box-sizing: border-box; }
28
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #0d1117; color: #e6edf3; display: flex; min-height: 100vh; }
75
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); display: flex; min-height: 100vh; }
76
+ code, .mono { font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; }
29
77
 
30
78
  /* Sidebar */
31
- .sidebar { width: 260px; background: #08111f; padding: 24px 16px; flex-shrink: 0; border-right: 1px solid #21262d; position: fixed; height: 100vh; overflow-y: auto; }
32
- .sidebar h1 { font-size: 18px; color: #00d4ff; margin-bottom: 4px; }
33
- .sidebar .version { font-size: 12px; color: #8b949e; margin-bottom: 24px; }
34
- .sidebar .timestamp { font-size: 11px; color: #8b949e; margin-bottom: 24px; }
79
+ .sidebar { width: 264px; background: var(--sidebar-bg); padding: 24px 16px; flex-shrink: 0; border-right: 1px solid var(--border-soft); position: fixed; height: 100vh; overflow-y: auto; display: flex; flex-direction: column; }
80
+ .brand-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
81
+ .sidebar h1 { font-size: 18px; color: var(--accent); letter-spacing: -0.2px; }
82
+ .theme-toggle { background: var(--surface-2); border: 1px solid var(--border); color: var(--text); border-radius: 999px; padding: 4px 10px; font-size: 12px; cursor: pointer; transition: all .15s; }
83
+ .theme-toggle:hover { border-color: var(--accent); }
84
+ .sidebar .version { font-size: 12px; color: var(--text-muted); margin-bottom: 2px; }
85
+ .sidebar .timestamp { font-size: 11px; color: var(--text-muted); margin-bottom: 20px; }
35
86
 
36
87
  /* Summary cards */
37
- .summary-cards { display: flex; flex-direction: column; gap: 8px; margin-bottom: 24px; }
38
- .card { padding: 12px; border-radius: 8px; background: #161b22; border: 1px solid #21262d; }
39
- .card .label { font-size: 11px; text-transform: uppercase; color: #8b949e; letter-spacing: 0.5px; }
40
- .card .value { font-size: 24px; font-weight: 700; margin-top: 4px; }
41
- .card.total .value { color: #e6edf3; }
42
- .card.changed .value { color: #f85149; }
43
- .card.new .value { color: #f0883e; }
44
- .card.passed .value { color: #3fb950; }
88
+ .summary-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 20px; }
89
+ .card { padding: 12px; border-radius: 10px; background: var(--surface); border: 1px solid var(--border-soft); box-shadow: var(--shadow); }
90
+ .card .label { font-size: 10px; text-transform: uppercase; color: var(--text-muted); letter-spacing: 0.6px; }
91
+ .card .value { font-size: 22px; font-weight: 700; margin-top: 4px; }
92
+ .card.total .value { color: var(--text); }
93
+ .card.changed .value { color: var(--changed); }
94
+ .card.new .value { color: var(--new); }
95
+ .card.passed .value { color: var(--passed); }
45
96
 
46
97
  /* Nav */
47
- .nav { list-style: none; margin-bottom: 24px; }
98
+ .nav { list-style: none; margin-bottom: 20px; }
48
99
  .nav li { margin-bottom: 2px; }
49
- .nav a { display: block; padding: 8px 12px; border-radius: 6px; color: #8b949e; text-decoration: none; font-size: 13px; transition: all 0.15s; }
50
- .nav a:hover { background: #161b22; color: #e6edf3; }
51
- .nav a .count { float: right; background: #21262d; padding: 2px 8px; border-radius: 10px; font-size: 11px; }
100
+ .nav a { display: block; padding: 8px 12px; border-radius: 8px; color: var(--text-muted); text-decoration: none; font-size: 13px; transition: all 0.15s; }
101
+ .nav a:hover { background: var(--surface-2); color: var(--text); }
102
+ .nav a .count { float: right; background: var(--surface-2); border: 1px solid var(--border-soft); padding: 1px 8px; border-radius: 10px; font-size: 11px; }
52
103
 
53
- /* CTA */
54
- .cta { background: linear-gradient(135deg, #0d419d 0%, #1158d9 100%); padding: 16px; border-radius: 8px; margin-top: auto; }
55
- .cta h3 { font-size: 13px; color: #fff; margin-bottom: 6px; }
56
- .cta p { font-size: 11px; color: #a5d6ff; line-height: 1.5; }
57
- .cta a { display: inline-block; margin-top: 8px; padding: 6px 14px; background: #00d4ff; color: #08111f; border-radius: 6px; text-decoration: none; font-size: 12px; font-weight: 600; }
104
+ /* Agent CTA */
105
+ .cta { background: var(--surface); border: 1px solid var(--border-soft); padding: 14px; border-radius: 10px; box-shadow: var(--shadow); }
106
+ .cta h3 { font-size: 13px; color: var(--text); margin-bottom: 6px; }
107
+ .cta p { font-size: 11px; color: var(--text-muted); line-height: 1.55; }
108
+ .cta code { background: var(--code-bg); border-radius: 4px; padding: 1px 4px; font-size: 10px; }
109
+ .cta a { display: inline-block; margin-top: 8px; padding: 6px 14px; background: var(--accent); color: var(--accent-contrast); border-radius: 6px; text-decoration: none; font-size: 12px; font-weight: 600; }
58
110
 
59
111
  /* Main content */
60
- .main { margin-left: 260px; flex: 1; padding: 32px; }
61
- .section { margin-bottom: 48px; }
62
- .section-title { font-size: 20px; font-weight: 600; margin-bottom: 16px; padding-bottom: 8px; border-bottom: 1px solid #21262d; }
63
- .section-title.changed { color: #f85149; }
64
- .section-title.new { color: #f0883e; }
65
- .section-title.passed { color: #3fb950; }
112
+ .main { margin-left: 264px; flex: 1; padding: 32px 36px; max-width: 1280px; }
113
+ .section { margin-bottom: 44px; }
114
+ .section-title { font-size: 18px; font-weight: 700; margin-bottom: 14px; display: flex; align-items: center; gap: 10px; }
115
+ .section-title::before { content: ''; width: 8px; height: 8px; border-radius: 50%; }
116
+ .section-title.changed { color: var(--changed); } .section-title.changed::before { background: var(--changed); }
117
+ .section-title.new { color: var(--new); } .section-title.new::before { background: var(--new); }
118
+ .section-title.passed { color: var(--passed); } .section-title.passed::before { background: var(--passed); }
66
119
 
67
120
  /* Snapshot card */
68
- .snapshot { background: #161b22; border: 1px solid #21262d; border-radius: 12px; padding: 20px; margin-bottom: 16px; }
69
- .snapshot-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
70
- .snapshot-name { font-size: 16px; font-weight: 600; }
71
- .snapshot-badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 600; }
72
- .badge-changed { background: #f8514922; color: #f85149; }
73
- .badge-new { background: #f0883e22; color: #f0883e; }
74
- .badge-passed { background: #3fb95022; color: #3fb950; }
75
- .snapshot-stats { font-size: 12px; color: #8b949e; margin-bottom: 16px; }
121
+ .snapshot { background: var(--surface); border: 1px solid var(--border-soft); border-radius: 14px; padding: 20px; margin-bottom: 16px; box-shadow: var(--shadow); }
122
+ .snapshot-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
123
+ .snapshot-name { font-size: 15px; font-weight: 650; }
124
+ .snapshot-badge { padding: 3px 12px; border-radius: 999px; font-size: 12px; font-weight: 600; text-transform: capitalize; }
125
+ .badge-changed { background: var(--changed-bg); color: var(--changed); }
126
+ .badge-new { background: var(--new-bg); color: var(--new); }
127
+ .badge-passed { background: var(--passed-bg); color: var(--passed); }
128
+ .snapshot-stats { font-size: 12px; color: var(--text-muted); margin-bottom: 10px; }
129
+
130
+ /* Layered analysis panel — the same evidence agents get via MCP */
131
+ .analysis { border: 1px solid var(--border-soft); background: var(--surface-2); border-radius: 10px; padding: 12px 14px; margin-bottom: 14px; }
132
+ .analysis-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
133
+ .analysis-title { font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--text-muted); }
134
+ .analysis-mcp { font-size: 10px; color: var(--text-muted); }
135
+ .analysis-mcp code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; }
136
+ .verdict { display: flex; gap: 8px; align-items: flex-start; padding: 10px 12px; border-radius: 8px; font-size: 13px; line-height: 1.5; font-weight: 550; margin-bottom: 8px; }
137
+ .verdict .v-icon { flex-shrink: 0; }
138
+ .verdict.v-noise { background: var(--info-bg); color: var(--info); border: 1px solid var(--info); border-color: color-mix(in srgb, var(--info) 30%, transparent); }
139
+ .verdict.v-style { background: var(--new-bg); color: var(--new); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); }
140
+ .verdict.v-structural { background: var(--changed-bg); color: var(--changed); border: 1px solid color-mix(in srgb, var(--changed) 30%, transparent); }
141
+ .verdict.v-shift { background: var(--info-bg); color: var(--info); border: 1px solid color-mix(in srgb, var(--info) 30%, transparent); }
142
+ .verdict.v-new { background: var(--new-bg); color: var(--new); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); }
143
+ .verdict.v-pass { background: var(--passed-bg); color: var(--passed); border: 1px solid color-mix(in srgb, var(--passed) 30%, transparent); }
144
+ .verdict code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 12px; }
76
145
 
77
146
  /* DOM noise hint */
78
- .dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding: 10px 12px; border-radius: 8px; font-size: 12px; line-height: 1.5; }
79
- .dom-hint.noise { background: #1f6feb1a; border: 1px solid #1f6feb44; color: #79c0ff; }
80
- .dom-hint.changed { background: #6e768166; border: 1px solid #8b949e44; color: #c9d1d9; }
81
- .dom-hint.style-changed { background: #f0883e1a; border: 1px solid #f0883e44; color: #f0883e; }
82
- .dom-hint.style-changed code { background: #0d1117; border-radius: 3px; padding: 1px 4px; font-size: 11px; }
147
+ .dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding: 9px 12px; border-radius: 8px; font-size: 12px; line-height: 1.5; }
148
+ .dom-hint.noise { background: var(--info-bg); color: var(--info); }
149
+ .dom-hint.changed { background: var(--surface); border: 1px solid var(--border-soft); color: var(--text); }
150
+ .dom-hint.style-changed { background: var(--new-bg); color: var(--new); }
151
+ .dom-hint.style-changed code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 11px; }
83
152
  .dom-hint .label { font-weight: 600; }
84
153
  .dom-hint .summary { color: inherit; opacity: 0.85; }
85
154
 
@@ -88,52 +157,60 @@ function renderHtml(data) {
88
157
  .diff-view.two-col { grid-template-columns: 1fr 1fr; }
89
158
  .diff-view.one-col { grid-template-columns: 1fr; }
90
159
  .diff-col { text-align: center; }
91
- .diff-col label { display: block; font-size: 11px; color: #8b949e; text-transform: uppercase; margin-bottom: 8px; letter-spacing: 0.5px; }
92
- .diff-col img { max-width: 100%; border-radius: 6px; border: 1px solid #21262d; cursor: zoom-in; transition: transform 0.2s; }
160
+ .diff-col label { display: block; font-size: 11px; color: var(--text-muted); text-transform: uppercase; margin-bottom: 8px; letter-spacing: 0.5px; }
161
+ .diff-col img { max-width: 100%; border-radius: 8px; border: 1px solid var(--border); cursor: zoom-in; transition: transform 0.2s; background: #fff; }
93
162
  .diff-col img:hover { transform: scale(1.02); }
94
163
 
95
164
  /* Approve command */
96
- .approve-cmd { margin-top: 16px; background: #0d1117; border: 1px solid #21262d; border-radius: 8px; padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; }
97
- .approve-cmd code { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 13px; color: #00d4ff; }
98
- .approve-cmd button { background: #21262d; border: 1px solid #30363d; color: #e6edf3; padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 12px; transition: all 0.15s; }
99
- .approve-cmd button:hover { background: #30363d; }
100
- .approve-cmd button.copied { background: #3fb950; color: #0d1117; }
165
+ .approve-cmd { margin-top: 16px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 8px; padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; }
166
+ .approve-cmd code { font-size: 13px; color: var(--accent); }
167
+ .approve-cmd button { background: var(--surface); border: 1px solid var(--border); color: var(--text); padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 12px; transition: all 0.15s; }
168
+ .approve-cmd button:hover { border-color: var(--accent); }
169
+ .approve-cmd button.copied { background: var(--passed); border-color: var(--passed); color: #fff; }
101
170
 
102
171
  /* Regions */
103
- .regions { margin-top: 8px; padding: 10px 12px; background: #0d1117; border: 1px solid #21262d; border-radius: 8px; font-size: 12px; }
104
- .regions .regions-title { color: #8b949e; font-weight: 600; margin-bottom: 6px; }
172
+ .regions { margin-top: 8px; padding: 10px 12px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 8px; font-size: 12px; }
173
+ .regions .regions-title { color: var(--text-muted); font-weight: 600; margin-bottom: 6px; }
105
174
  .regions ul { list-style: none; display: flex; flex-wrap: wrap; gap: 6px; }
106
- .regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background: #f8514922; color: #f85149; text-decoration: none; font-family: 'SF Mono', 'Fira Code', monospace; font-size: 11px; }
107
- .regions li a:hover { background: #f8514944; }
108
- .regions li a.region-shift { background: #1f6feb22; color: #79c0ff; }
109
- .regions li a.region-shift:hover { background: #1f6feb44; }
110
- .page-shift { margin-top: 8px; padding: 8px 10px; background: #1f6feb1a; border: 1px solid #1f6feb44; border-radius: 6px; font-size: 12px; color: #79c0ff; }
175
+ .regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background: var(--changed-bg); color: var(--changed); text-decoration: none; font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; font-size: 11px; }
176
+ .regions li a:hover { filter: brightness(0.95); }
177
+ .regions li a.region-shift { background: var(--info-bg); color: var(--info); }
178
+ .page-shift { margin-top: 8px; padding: 8px 10px; background: var(--info-bg); border-radius: 6px; font-size: 12px; color: var(--info); }
111
179
 
112
180
  /* Masks (audit trail) */
113
- .masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg, #161b22, #161b22 6px, #1c2129 6px, #1c2129 8px); border: 1px solid #30363d; border-radius: 8px; font-size: 12px; color: #8b949e; }
114
- .masks .label { font-weight: 600; color: #c9d1d9; }
115
- .masks code { color: #79c0ff; font-size: 11px; }
116
- .mask-warning { margin-top: 8px; padding: 10px 12px; background: #f0883e1a; border: 1px solid #f0883e44; border-radius: 8px; font-size: 12px; color: #f0883e; }
181
+ .masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg, var(--hatch-a), var(--hatch-a) 6px, var(--hatch-b) 6px, var(--hatch-b) 8px); border: 1px solid var(--border); border-radius: 8px; font-size: 12px; color: var(--text-muted); }
182
+ .masks .label { font-weight: 600; color: var(--text); }
183
+ .masks code { color: var(--link); font-size: 11px; }
184
+ .mask-warning { margin-top: 8px; padding: 10px 12px; background: var(--new-bg); border-radius: 8px; font-size: 12px; color: var(--new); }
117
185
 
118
186
  /* Zoom overlay */
119
187
  .zoom-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 100; justify-content: center; align-items: center; cursor: zoom-out; }
120
188
  .zoom-overlay.active { display: flex; }
121
189
  .zoom-overlay img { max-width: 95%; max-height: 95%; border-radius: 8px; }
122
190
 
123
- /* Empty state */
124
- .oss-notice { margin-top: 16px; padding: 12px 14px; background: #161b22; border: 1px solid #30363d; border-radius: 6px; font-size: 11px; color: #8b949e; line-height: 1.6; }
125
- .oss-notice h4 { margin: 0 0 8px; font-size: 11px; color: #e6edf3; }
191
+ /* Missing-baselines notice (coverage loss) */
192
+ .missing-notice { background: var(--new-bg); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); border-radius: 10px; padding: 14px 16px; margin-bottom: 24px; font-size: 13px; color: var(--new); }
193
+ .missing-notice .m-title { font-weight: 700; margin-bottom: 4px; }
194
+ .missing-notice code { background: var(--code-bg); border-radius: 3px; padding: 1px 5px; font-size: 12px; }
195
+ .missing-notice .m-hint { color: var(--text-muted); font-size: 12px; margin-top: 6px; }
196
+
197
+ /* Notices / empty state */
198
+ .oss-notice { margin-top: 14px; padding: 12px 14px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 8px; font-size: 11px; color: var(--text-muted); line-height: 1.6; box-shadow: var(--shadow); }
199
+ .oss-notice h4 { margin: 0 0 8px; font-size: 11px; color: var(--text); }
126
200
  .oss-notice p { margin: 0 0 6px; }
127
201
  .oss-notice p:last-child { margin-bottom: 0; }
128
- .oss-notice code { background: #0d1117; border: 1px solid #30363d; border-radius: 3px; padding: 1px 4px; font-size: 10px; color: #79c0ff; }
129
- .oss-notice a { color: #58a6ff; }
130
- .empty { text-align: center; padding: 48px; color: #8b949e; }
202
+ .oss-notice code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 10px; }
203
+ .oss-notice a { color: var(--link); }
204
+ .empty { text-align: center; padding: 48px; color: var(--text-muted); }
131
205
  .empty .icon { font-size: 48px; margin-bottom: 16px; }
132
206
  </style>
133
207
  </head>
134
208
  <body>
135
209
  <aside class="sidebar">
136
- <h1>TestivAI</h1>
210
+ <div class="brand-row">
211
+ <h1>TestivAI</h1>
212
+ <button class="theme-toggle" id="themeToggle" title="Switch between light and dark theme">🌙 Dark</button>
213
+ </div>
137
214
  <div class="version">Visual Report v${escapeHtml(version)}</div>
138
215
  <div class="timestamp">${escapeHtml(new Date(timestamp).toLocaleString())}</div>
139
216
 
@@ -168,11 +245,17 @@ function renderHtml(data) {
168
245
  </aside>
169
246
 
170
247
  <main class="main">
248
+ ${missing.length > 0 ? `
249
+ <div class="missing-notice">
250
+ <div class="m-title">⚠️ ${missing.length} baseline${missing.length === 1 ? '' : 's'} received no capture this run</div>
251
+ ${missing.map((n) => `<code>${escapeHtml(n)}</code>`).join(' ')}
252
+ <div class="m-hint">A deleted or renamed test silently stops guarding its page. If intentional, remove the baseline (and commit); if this was a filtered run (<code>--grep</code>), ignore this notice.</div>
253
+ </div>` : ''}
171
254
  ${summary.total === 0 ? `
172
255
  <div class="empty">
173
256
  <div class="icon">📸</div>
174
257
  <h2>No snapshots found</h2>
175
- <p>Run your tests to generate visual snapshots.</p>
258
+ <p>Run your tests to capture snapshots, then re-run the report.</p>
176
259
  </div>` : ''}
177
260
 
178
261
  ${changed.length > 0 ? `
@@ -194,15 +277,31 @@ function renderHtml(data) {
194
277
  </section>` : ''}
195
278
  </main>
196
279
 
197
- <div class="zoom-overlay" id="zoomOverlay">
198
- <img id="zoomImage" src="" alt="Zoomed">
199
- </div>
280
+ <div class="zoom-overlay" id="zoomOverlay"><img id="zoomImg" src="" alt="Zoomed"></div>
200
281
 
201
282
  <script>
202
- // Image zoom
283
+ // Theme: light is the default; a stored preference of "dark" overrides.
284
+ (function () {
285
+ const KEY = 'testivai-theme';
286
+ const btn = document.getElementById('themeToggle');
287
+ const apply = (theme) => {
288
+ if (theme === 'dark') document.documentElement.setAttribute('data-theme', 'dark');
289
+ else document.documentElement.removeAttribute('data-theme');
290
+ btn.textContent = theme === 'dark' ? '☀️ Light' : '🌙 Dark';
291
+ };
292
+ let theme = 'light';
293
+ try { theme = localStorage.getItem(KEY) === 'dark' ? 'dark' : 'light'; } catch {}
294
+ apply(theme);
295
+ btn.addEventListener('click', () => {
296
+ theme = theme === 'dark' ? 'light' : 'dark';
297
+ try { localStorage.setItem(KEY, theme); } catch {}
298
+ apply(theme);
299
+ });
300
+ })();
301
+
203
302
  document.querySelectorAll('.diff-col img').forEach(img => {
204
303
  img.addEventListener('click', () => {
205
- document.getElementById('zoomImage').src = img.src;
304
+ document.getElementById('zoomImg').src = img.src;
206
305
  document.getElementById('zoomOverlay').classList.add('active');
207
306
  });
208
307
  });
@@ -210,18 +309,17 @@ function renderHtml(data) {
210
309
  document.getElementById('zoomOverlay').classList.remove('active');
211
310
  });
212
311
 
213
- // Region chips zoom the diff image for inspection
214
312
  document.querySelectorAll('.region-chip').forEach(chip => {
215
313
  chip.addEventListener('click', (e) => {
216
314
  e.preventDefault();
217
315
  const diff = chip.dataset.diff;
218
- if (!diff) return;
219
- document.getElementById('zoomImage').src = diff;
220
- document.getElementById('zoomOverlay').classList.add('active');
316
+ if (diff) {
317
+ document.getElementById('zoomImg').src = diff;
318
+ document.getElementById('zoomOverlay').classList.add('active');
319
+ }
221
320
  });
222
321
  });
223
322
 
224
- // Copy approve command
225
323
  document.querySelectorAll('.copy-btn').forEach(btn => {
226
324
  btn.addEventListener('click', () => {
227
325
  const cmd = btn.dataset.cmd;
@@ -257,10 +355,8 @@ function renderSnapshot(snapshot) {
257
355
  <span class="snapshot-name">${escapeHtml(snapshot.name)}</span>
258
356
  <span class="snapshot-badge ${badgeClass}">${snapshot.status}</span>
259
357
  </div>
260
- ${snapshot.status === 'changed' || snapshot.autoPassed ? `<div class="snapshot-stats">Diff: ${snapshot.diffPercent.toFixed(2)}% (${snapshot.diffCount} pixels)${snapshot.autoPassed ? ` — auto-passed: ${snapshot.autoPassed === 'noise' ? 'DOM unchanged, within noise tolerance' : 'within configured diff tolerance'}` : ''}</div>` : ''}
261
- ${renderDomHint(snapshot)}
262
- ${renderRegions(snapshot)}
263
- ${renderMasks(snapshot)}
358
+ ${renderStats(snapshot)}
359
+ ${renderAnalysis(snapshot)}
264
360
  <div class="${gridClass}">
265
361
  ${hasBaseline ? `<div class="diff-col"><label>Baseline</label><img src="${snapshot.baselinePath}" alt="Baseline"></div>` : ''}
266
362
  ${hasDiff ? `<div class="diff-col"><label>Diff</label><img src="${snapshot.diffPath}" alt="Diff"></div>` : ''}
@@ -273,6 +369,89 @@ function renderSnapshot(snapshot) {
273
369
  </div>` : ''}
274
370
  </div>`;
275
371
  }
372
+ /**
373
+ * Stats line: diff numbers (for changed/auto-passed) plus baseline
374
+ * provenance — when the compared baseline was last approved. A months-old
375
+ * baseline deserves a closer look than yesterday's.
376
+ */
377
+ function renderStats(snapshot) {
378
+ const parts = [];
379
+ if (snapshot.status === 'changed' || snapshot.autoPassed) {
380
+ parts.push(`Diff: ${snapshot.diffPercent.toFixed(2)}% (${snapshot.diffCount} pixels)${snapshot.autoPassed ? ` — auto-passed: ${snapshot.autoPassed === 'noise' ? 'DOM unchanged, within noise tolerance' : 'within configured diff tolerance'}` : ''}`);
381
+ }
382
+ if (snapshot.baselineApprovedAt) {
383
+ const d = new Date(snapshot.baselineApprovedAt);
384
+ if (!isNaN(d.getTime())) {
385
+ parts.push(`baseline approved ${d.toISOString().slice(0, 10)}`);
386
+ }
387
+ }
388
+ if (parts.length === 0)
389
+ return '';
390
+ return `<div class="snapshot-stats">${parts.join(' · ')}</div>`;
391
+ }
392
+ /**
393
+ * The "Layered analysis" panel: a synthesized verdict headline followed by
394
+ * the individual evidence layers (DOM/style signal, attributed regions,
395
+ * page shift, masks). This is the human-facing view of the same layered
396
+ * evidence @testivai/mcp's explain_snapshot serves to AI agents.
397
+ */
398
+ function renderAnalysis(snapshot) {
399
+ const verdict = renderVerdict(snapshot);
400
+ const layers = [renderDomHint(snapshot), renderRegions(snapshot), renderMasks(snapshot)].filter(Boolean).join('');
401
+ if (!verdict && !layers)
402
+ return '';
403
+ return `
404
+ <div class="analysis">
405
+ <div class="analysis-head">
406
+ <span class="analysis-title">Layered analysis</span>
407
+ <span class="analysis-mcp">agents get this via <code>@testivai/mcp</code> · <code>explain_snapshot</code></span>
408
+ </div>
409
+ ${verdict}
410
+ ${layers}
411
+ </div>`;
412
+ }
413
+ /**
414
+ * Verdict headline: one plain-language line synthesizing the layers, in
415
+ * priority order — style-only change (real) > page shift (injected content)
416
+ * > structural DOM change > render noise > new snapshot > auto-pass.
417
+ */
418
+ function renderVerdict(snapshot) {
419
+ if (snapshot.status === 'passed' && !snapshot.autoPassed)
420
+ return '';
421
+ if (snapshot.status === 'new') {
422
+ return `<div class="verdict v-new"><span class="v-icon">🆕</span><span>First capture — no baseline yet. Review the image, then approve to make it the baseline.</span></div>`;
423
+ }
424
+ if (snapshot.dom?.styleCheck === 'mismatch' && snapshot.dom.styleChanges) {
425
+ const n = snapshot.dom.styleChanges.count;
426
+ const first = snapshot.dom.styleChanges.elements[0];
427
+ const el = first ? `<code>${escapeHtml(first.split(' > ').slice(-1)[0])}</code>` : '';
428
+ return `<div class="verdict v-style"><span class="v-icon">🎨</span><span>Style-only change — a real change, not noise: ${n} element${n === 1 ? '' : 's'} restyled with identical DOM${el ? ` (${el}${n > 1 ? ', …' : ''})` : ''}. Confirm it's intended before approving.</span></div>`;
429
+ }
430
+ if (snapshot.pageShift) {
431
+ const p = snapshot.pageShift;
432
+ return `<div class="verdict v-shift"><span class="v-icon">↕️</span><span>Layout shift — everything below y=${p.belowY} moved ${p.dy > 0 ? 'down' : 'up'} ${Math.abs(p.dy)}px (${p.count} elements together). Look <em>above</em> that line for inserted or removed content; the moved elements themselves are unchanged.</span></div>`;
433
+ }
434
+ if (snapshot.dom?.changed && snapshot.dom.summary) {
435
+ const s = snapshot.dom.summary;
436
+ const parts = [];
437
+ if (s.added > 0)
438
+ parts.push(`${s.added} added`);
439
+ if (s.removed > 0)
440
+ parts.push(`${s.removed} removed`);
441
+ if (s.attributeChanges > 0)
442
+ parts.push(`${s.attributeChanges} attribute`);
443
+ if (s.textChanges)
444
+ parts.push(`${s.textChanges} text`);
445
+ return `<div class="verdict v-structural"><span class="v-icon">🧱</span><span>Structural change — the DOM differs (${escapeHtml(parts.join(', ') || 'structural difference')}). Review the diff and confirm the change is intended before approving.</span></div>`;
446
+ }
447
+ if (snapshot.dom?.noiseHint) {
448
+ return `<div class="verdict v-noise"><span class="v-icon">💡</span><span>Likely render noise — pixels differ but the DOM${snapshot.dom.styleCheck === 'match' ? ' and computed styles are' : ' is'} identical (anti-aliasing, font hinting). Worth a glance, not a block.</span></div>`;
449
+ }
450
+ if (snapshot.autoPassed) {
451
+ return `<div class="verdict v-pass"><span class="v-icon">✅</span><span>Auto-passed via the <code>${snapshot.autoPassed}</code> criterion — reported for transparency, no action needed.</span></div>`;
452
+ }
453
+ return '';
454
+ }
276
455
  /**
277
456
  * Render the DOM noise-hint badge for a snapshot.
278
457
  *
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testivai/witness",
3
- "version": "1.7.1",
3
+ "version": "1.9.0",
4
4
  "description": "Framework-agnostic visual regression testing CLI for TestivAI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",