@healflow/playwright 0.1.2 → 0.1.3

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 (165) hide show
  1. package/README.md +35 -18
  2. package/dist/index.d.ts +2 -22
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -691
  5. package/dist/index.js.map +1 -1
  6. package/dist/plugin/classification.d.ts +6 -0
  7. package/dist/plugin/classification.d.ts.map +1 -0
  8. package/dist/plugin/classification.js +343 -0
  9. package/dist/plugin/classification.js.map +1 -0
  10. package/dist/plugin/constants.d.ts +5 -0
  11. package/dist/plugin/constants.d.ts.map +1 -0
  12. package/dist/plugin/constants.js +55 -0
  13. package/dist/plugin/constants.js.map +1 -0
  14. package/dist/plugin/heal-emit.d.ts +5 -0
  15. package/dist/plugin/heal-emit.d.ts.map +1 -0
  16. package/dist/plugin/heal-emit.js +69 -0
  17. package/dist/plugin/heal-emit.js.map +1 -0
  18. package/dist/plugin/index.d.ts +5 -0
  19. package/dist/plugin/index.d.ts.map +1 -0
  20. package/dist/plugin/index.js +11 -0
  21. package/dist/plugin/index.js.map +1 -0
  22. package/dist/plugin/locator-wrap.d.ts +4 -0
  23. package/dist/plugin/locator-wrap.d.ts.map +1 -0
  24. package/dist/plugin/locator-wrap.js +68 -0
  25. package/dist/plugin/locator-wrap.js.map +1 -0
  26. package/dist/plugin/options.d.ts +3 -0
  27. package/dist/plugin/options.d.ts.map +1 -0
  28. package/dist/plugin/options.js +25 -0
  29. package/dist/plugin/options.js.map +1 -0
  30. package/dist/plugin/page-wrap.d.ts +9 -0
  31. package/dist/plugin/page-wrap.d.ts.map +1 -0
  32. package/dist/plugin/page-wrap.js +99 -0
  33. package/dist/plugin/page-wrap.js.map +1 -0
  34. package/dist/plugin/types.d.ts +19 -0
  35. package/dist/plugin/types.d.ts.map +1 -0
  36. package/dist/plugin/types.js +3 -0
  37. package/dist/plugin/types.js.map +1 -0
  38. package/dist/report-html/build.d.ts +7 -0
  39. package/dist/report-html/build.d.ts.map +1 -0
  40. package/dist/report-html/build.js +138 -0
  41. package/dist/report-html/build.js.map +1 -0
  42. package/dist/report-html/format.d.ts +6 -0
  43. package/dist/report-html/format.d.ts.map +1 -0
  44. package/dist/report-html/format.js +37 -0
  45. package/dist/report-html/format.js.map +1 -0
  46. package/dist/report-html/icons.d.ts +4 -0
  47. package/dist/report-html/icons.d.ts.map +1 -0
  48. package/dist/report-html/icons.js +7 -0
  49. package/dist/report-html/icons.js.map +1 -0
  50. package/dist/report-html/index.d.ts +3 -0
  51. package/dist/report-html/index.d.ts.map +1 -0
  52. package/dist/report-html/index.js +6 -0
  53. package/dist/report-html/index.js.map +1 -0
  54. package/dist/report-html/render.d.ts +6 -0
  55. package/dist/report-html/render.d.ts.map +1 -0
  56. package/dist/report-html/render.js +139 -0
  57. package/dist/report-html/render.js.map +1 -0
  58. package/dist/report-html/script.d.ts +2 -0
  59. package/dist/report-html/script.d.ts.map +1 -0
  60. package/dist/report-html/script.js +75 -0
  61. package/dist/report-html/script.js.map +1 -0
  62. package/dist/report-html/status.d.ts +2 -0
  63. package/dist/report-html/status.d.ts.map +1 -0
  64. package/dist/report-html/status.js +13 -0
  65. package/dist/report-html/status.js.map +1 -0
  66. package/dist/report-html/styles.d.ts +2 -0
  67. package/dist/report-html/styles.d.ts.map +1 -0
  68. package/dist/report-html/styles.js +441 -0
  69. package/dist/report-html/styles.js.map +1 -0
  70. package/dist/report-html/tree.d.ts +8 -0
  71. package/dist/report-html/tree.d.ts.map +1 -0
  72. package/dist/report-html/tree.js +57 -0
  73. package/dist/report-html/tree.js.map +1 -0
  74. package/dist/report-html/types.d.ts +19 -0
  75. package/dist/report-html/types.d.ts.map +1 -0
  76. package/dist/report-html/types.js +3 -0
  77. package/dist/report-html/types.js.map +1 -0
  78. package/dist/report-html.d.ts +2 -6
  79. package/dist/report-html.d.ts.map +1 -1
  80. package/dist/report-html.js +3 -859
  81. package/dist/report-html.js.map +1 -1
  82. package/dist/runtime-ladder.d.ts +17 -0
  83. package/dist/runtime-ladder.d.ts.map +1 -0
  84. package/dist/runtime-ladder.js +61 -0
  85. package/dist/runtime-ladder.js.map +1 -0
  86. package/dist/runtime-techniques/heal-helpers.d.ts +10 -0
  87. package/dist/runtime-techniques/heal-helpers.d.ts.map +1 -0
  88. package/dist/runtime-techniques/heal-helpers.js +304 -0
  89. package/dist/runtime-techniques/heal-helpers.js.map +1 -0
  90. package/dist/runtime-techniques/index.d.ts +11 -0
  91. package/dist/runtime-techniques/index.d.ts.map +1 -0
  92. package/dist/runtime-techniques/index.js +34 -0
  93. package/dist/runtime-techniques/index.js.map +1 -0
  94. package/dist/runtime-techniques/registry.d.ts +5 -0
  95. package/dist/runtime-techniques/registry.d.ts.map +1 -0
  96. package/dist/runtime-techniques/registry.js +29 -0
  97. package/dist/runtime-techniques/registry.js.map +1 -0
  98. package/dist/runtime-techniques/shared/constants.d.ts +4 -0
  99. package/dist/runtime-techniques/shared/constants.d.ts.map +1 -0
  100. package/dist/runtime-techniques/shared/constants.js +7 -0
  101. package/dist/runtime-techniques/shared/constants.js.map +1 -0
  102. package/dist/runtime-techniques/shared/error-utils.d.ts +9 -0
  103. package/dist/runtime-techniques/shared/error-utils.d.ts.map +1 -0
  104. package/dist/runtime-techniques/shared/error-utils.js +27 -0
  105. package/dist/runtime-techniques/shared/error-utils.js.map +1 -0
  106. package/dist/runtime-techniques/shared/heal-alternate.d.ts +6 -0
  107. package/dist/runtime-techniques/shared/heal-alternate.d.ts.map +1 -0
  108. package/dist/runtime-techniques/shared/heal-alternate.js +130 -0
  109. package/dist/runtime-techniques/shared/heal-alternate.js.map +1 -0
  110. package/dist/runtime-techniques/shared/heal-candidates.d.ts +11 -0
  111. package/dist/runtime-techniques/shared/heal-candidates.d.ts.map +1 -0
  112. package/dist/runtime-techniques/shared/heal-candidates.js +127 -0
  113. package/dist/runtime-techniques/shared/heal-candidates.js.map +1 -0
  114. package/dist/runtime-techniques/shared/heal-history.d.ts +10 -0
  115. package/dist/runtime-techniques/shared/heal-history.d.ts.map +1 -0
  116. package/dist/runtime-techniques/shared/heal-history.js +42 -0
  117. package/dist/runtime-techniques/shared/heal-history.js.map +1 -0
  118. package/dist/runtime-techniques/shared/locator-actions.d.ts +6 -0
  119. package/dist/runtime-techniques/shared/locator-actions.d.ts.map +1 -0
  120. package/dist/runtime-techniques/shared/locator-actions.js +66 -0
  121. package/dist/runtime-techniques/shared/locator-actions.js.map +1 -0
  122. package/dist/runtime-techniques/shared/page-waits.d.ts +6 -0
  123. package/dist/runtime-techniques/shared/page-waits.d.ts.map +1 -0
  124. package/dist/runtime-techniques/shared/page-waits.js +57 -0
  125. package/dist/runtime-techniques/shared/page-waits.js.map +1 -0
  126. package/dist/runtime-techniques/shared.d.ts +8 -0
  127. package/dist/runtime-techniques/shared.d.ts.map +1 -0
  128. package/dist/runtime-techniques/shared.js +24 -0
  129. package/dist/runtime-techniques/shared.js.map +1 -0
  130. package/dist/runtime-techniques/t0-retry.d.ts +4 -0
  131. package/dist/runtime-techniques/t0-retry.d.ts.map +1 -0
  132. package/dist/runtime-techniques/t0-retry.js +334 -0
  133. package/dist/runtime-techniques/t0-retry.js.map +1 -0
  134. package/dist/runtime-techniques/t1-scope.d.ts +4 -0
  135. package/dist/runtime-techniques/t1-scope.d.ts.map +1 -0
  136. package/dist/runtime-techniques/t1-scope.js +70 -0
  137. package/dist/runtime-techniques/t1-scope.js.map +1 -0
  138. package/dist/runtime-techniques/t2-normalize.d.ts +3 -0
  139. package/dist/runtime-techniques/t2-normalize.d.ts.map +1 -0
  140. package/dist/runtime-techniques/t2-normalize.js +12 -0
  141. package/dist/runtime-techniques/t2-normalize.js.map +1 -0
  142. package/dist/runtime-techniques/t3-fingerprint.d.ts +4 -0
  143. package/dist/runtime-techniques/t3-fingerprint.d.ts.map +1 -0
  144. package/dist/runtime-techniques/t3-fingerprint.js +13 -0
  145. package/dist/runtime-techniques/t3-fingerprint.js.map +1 -0
  146. package/dist/runtime-techniques/t4-trace.d.ts +4 -0
  147. package/dist/runtime-techniques/t4-trace.d.ts.map +1 -0
  148. package/dist/runtime-techniques/t4-trace.js +125 -0
  149. package/dist/runtime-techniques/t4-trace.js.map +1 -0
  150. package/dist/runtime-techniques/t5-history.d.ts +3 -0
  151. package/dist/runtime-techniques/t5-history.d.ts.map +1 -0
  152. package/dist/runtime-techniques/t5-history.js +50 -0
  153. package/dist/runtime-techniques/t5-history.js.map +1 -0
  154. package/dist/runtime-techniques/types.d.ts +36 -0
  155. package/dist/runtime-techniques/types.d.ts.map +1 -0
  156. package/dist/runtime-techniques/types.js +3 -0
  157. package/dist/runtime-techniques/types.js.map +1 -0
  158. package/dist/runtime-techniques.d.ts +2 -0
  159. package/dist/runtime-techniques.d.ts.map +1 -0
  160. package/dist/runtime-techniques.js +18 -0
  161. package/dist/runtime-techniques.js.map +1 -0
  162. package/dist/terminal.d.ts.map +1 -1
  163. package/dist/terminal.js +52 -3
  164. package/dist/terminal.js.map +1 -1
  165. package/package.json +3 -3
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REPORT_STYLES = void 0;
4
+ exports.REPORT_STYLES = `
5
+ :root {
6
+ --color-canvas-default: #ffffff;
7
+ --color-canvas-subtle: #f6f8fa;
8
+ --color-fg-default: #24292f;
9
+ --color-fg-muted: #57606a;
10
+ --color-border-default: #d0d7de;
11
+ --color-success-fg: #1a7f37;
12
+ --color-success-subtle: #dafbe1;
13
+ --color-danger-fg: #cf222e;
14
+ --color-danger-subtle: #ffebe9;
15
+ --color-attention-fg: #9a6700;
16
+ --color-attention-subtle: #fff8c5;
17
+ --color-accent-fg: #0969da;
18
+ --color-accent-subtle: #ddf4ff;
19
+ --color-heal-fg: #0550ae;
20
+ --color-heal-subtle: #ddf4ff;
21
+ --sidebar-width: 320px;
22
+ --font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
23
+ --mono-stack: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
24
+ }
25
+
26
+ * { box-sizing: border-box; }
27
+ html, body { height: 100%; }
28
+ body {
29
+ margin: 0;
30
+ font-family: var(--font-stack);
31
+ font-size: 14px;
32
+ line-height: 1.5;
33
+ color: var(--color-fg-default);
34
+ background: var(--color-canvas-default);
35
+ }
36
+
37
+ button, input { font: inherit; }
38
+
39
+ .app { display: flex; flex-direction: column; min-height: 100vh; }
40
+
41
+ .header-view {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 16px;
45
+ padding: 12px 20px;
46
+ border-bottom: 1px solid var(--color-border-default);
47
+ background: var(--color-canvas-default);
48
+ flex-wrap: wrap;
49
+ }
50
+
51
+ .header-brand {
52
+ display: flex;
53
+ align-items: center;
54
+ gap: 10px;
55
+ min-width: 0;
56
+ }
57
+
58
+ .header-logo {
59
+ width: 28px;
60
+ height: 28px;
61
+ border-radius: 6px;
62
+ background: linear-gradient(135deg, #2da44e, #0969da);
63
+ color: #fff;
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ font-weight: 700;
68
+ font-size: 13px;
69
+ }
70
+
71
+ .header-title {
72
+ font-size: 18px;
73
+ font-weight: 600;
74
+ letter-spacing: -0.2px;
75
+ }
76
+
77
+ .header-subtitle {
78
+ color: var(--color-fg-muted);
79
+ font-size: 12px;
80
+ }
81
+
82
+ .header-view-status-container {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: 8px;
86
+ flex-wrap: wrap;
87
+ margin-left: auto;
88
+ }
89
+
90
+ .summary-chip {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 6px;
94
+ padding: 4px 10px;
95
+ border-radius: 2em;
96
+ border: 1px solid var(--color-border-default);
97
+ background: var(--color-canvas-subtle);
98
+ font-size: 13px;
99
+ font-weight: 500;
100
+ white-space: nowrap;
101
+ }
102
+
103
+ .summary-chip.passed { color: var(--color-success-fg); background: var(--color-success-subtle); border-color: #82d8a5; }
104
+ .summary-chip.failed { color: var(--color-danger-fg); background: var(--color-danger-subtle); border-color: #ffbbb9; }
105
+ .summary-chip.healed { color: var(--color-heal-fg); background: var(--color-heal-subtle); border-color: #9cd7ff; }
106
+ .summary-chip.neutral { color: var(--color-fg-muted); }
107
+
108
+ .main-layout {
109
+ display: flex;
110
+ flex: 1;
111
+ min-height: 0;
112
+ }
113
+
114
+ .sidebar {
115
+ width: var(--sidebar-width);
116
+ flex-shrink: 0;
117
+ border-right: 1px solid var(--color-border-default);
118
+ background: var(--color-canvas-subtle);
119
+ display: flex;
120
+ flex-direction: column;
121
+ min-height: calc(100vh - 57px);
122
+ }
123
+
124
+ .sidebar-toolbar {
125
+ padding: 12px;
126
+ border-bottom: 1px solid var(--color-border-default);
127
+ background: var(--color-canvas-default);
128
+ }
129
+
130
+ .search-input {
131
+ width: 100%;
132
+ padding: 6px 10px;
133
+ border: 1px solid var(--color-border-default);
134
+ border-radius: 6px;
135
+ background: var(--color-canvas-default);
136
+ color: var(--color-fg-default);
137
+ }
138
+
139
+ .search-input:focus {
140
+ outline: 2px solid var(--color-accent-fg);
141
+ outline-offset: -1px;
142
+ }
143
+
144
+ .tree-panel {
145
+ flex: 1;
146
+ overflow: auto;
147
+ padding: 8px 0 24px;
148
+ }
149
+
150
+ .tree-empty {
151
+ padding: 16px;
152
+ color: var(--color-fg-muted);
153
+ }
154
+
155
+ .file-group { margin-bottom: 4px; }
156
+
157
+ .tree-item {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 8px;
161
+ padding: 6px 12px;
162
+ line-height: 20px;
163
+ overflow: hidden;
164
+ white-space: nowrap;
165
+ text-overflow: ellipsis;
166
+ }
167
+
168
+ .file-tree-item {
169
+ color: var(--color-fg-default);
170
+ font-weight: 600;
171
+ cursor: pointer;
172
+ user-select: none;
173
+ }
174
+
175
+ .test-tree-item {
176
+ padding-left: 28px;
177
+ cursor: pointer;
178
+ border-left: 3px solid transparent;
179
+ }
180
+
181
+ .test-tree-item:hover,
182
+ .test-tree-item:focus-visible {
183
+ background: rgba(9, 105, 218, 0.08);
184
+ outline: none;
185
+ }
186
+
187
+ .test-tree-item.selected {
188
+ background: #fff;
189
+ border-left-color: var(--color-accent-fg);
190
+ }
191
+
192
+ .overview-tree-item {
193
+ padding-left: 12px;
194
+ border-bottom: 1px solid var(--color-border-default);
195
+ margin-bottom: 8px;
196
+ }
197
+
198
+ .file-chevron {
199
+ width: 12px;
200
+ color: var(--color-fg-muted);
201
+ transition: transform 0.15s ease;
202
+ }
203
+
204
+ .file-group.expanded .file-chevron { transform: rotate(90deg); }
205
+
206
+ .file-tests { display: none; }
207
+ .file-group.expanded .file-tests { display: block; }
208
+
209
+ .tree-item-title {
210
+ overflow: hidden;
211
+ text-overflow: ellipsis;
212
+ }
213
+
214
+ .file-title { flex: 1; }
215
+
216
+ .file-heal-count {
217
+ font-size: 11px;
218
+ font-weight: 600;
219
+ color: var(--color-heal-fg);
220
+ background: var(--color-heal-subtle);
221
+ border-radius: 10px;
222
+ padding: 1px 7px;
223
+ }
224
+
225
+ .status-icon {
226
+ display: inline-flex;
227
+ flex-shrink: 0;
228
+ align-items: center;
229
+ justify-content: center;
230
+ }
231
+
232
+ .content {
233
+ flex: 1;
234
+ overflow: auto;
235
+ padding: 20px 24px 40px;
236
+ background: var(--color-canvas-default);
237
+ }
238
+
239
+ .overview-panel { max-width: 960px; }
240
+
241
+ .overview-grid {
242
+ display: grid;
243
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
244
+ gap: 12px;
245
+ margin: 16px 0 24px;
246
+ }
247
+
248
+ .meta-card {
249
+ border: 1px solid var(--color-border-default);
250
+ border-radius: 6px;
251
+ padding: 14px 16px;
252
+ background: var(--color-canvas-subtle);
253
+ }
254
+
255
+ .meta-card .label {
256
+ font-size: 12px;
257
+ color: var(--color-fg-muted);
258
+ margin-bottom: 4px;
259
+ }
260
+
261
+ .meta-card .value {
262
+ font-size: 16px;
263
+ font-weight: 600;
264
+ }
265
+
266
+ .muted { color: var(--color-fg-muted); }
267
+
268
+ .chip-header {
269
+ border: 1px solid var(--color-border-default);
270
+ border-top-left-radius: 6px;
271
+ border-top-right-radius: 6px;
272
+ background: var(--color-canvas-subtle);
273
+ padding: 0 12px;
274
+ font-weight: 600;
275
+ line-height: 38px;
276
+ }
277
+
278
+ .chip-body {
279
+ border: 1px solid var(--color-border-default);
280
+ border-top: none;
281
+ border-bottom-left-radius: 6px;
282
+ border-bottom-right-radius: 6px;
283
+ padding: 12px;
284
+ margin-bottom: 16px;
285
+ }
286
+
287
+ .detail-section { margin-bottom: 16px; }
288
+
289
+ .test-file-header {
290
+ margin-bottom: 20px;
291
+ padding-bottom: 16px;
292
+ border-bottom: 1px solid var(--color-border-default);
293
+ }
294
+
295
+ .test-file-title-row {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 10px;
299
+ }
300
+
301
+ .test-file-title {
302
+ margin: 0;
303
+ font-size: 20px;
304
+ font-weight: 600;
305
+ }
306
+
307
+ .test-file-path {
308
+ margin-top: 6px;
309
+ color: var(--color-fg-muted);
310
+ font-family: var(--mono-stack);
311
+ font-size: 12px;
312
+ word-break: break-all;
313
+ }
314
+
315
+ .heal-cards { display: grid; gap: 12px; }
316
+
317
+ .heal-card {
318
+ border: 1px solid var(--color-border-default);
319
+ border-radius: 6px;
320
+ padding: 12px 14px;
321
+ background: var(--color-canvas-default);
322
+ }
323
+
324
+ .heal-card-header {
325
+ display: flex;
326
+ align-items: center;
327
+ gap: 8px;
328
+ margin-bottom: 8px;
329
+ flex-wrap: wrap;
330
+ }
331
+
332
+ .heal-description {
333
+ margin: 0 0 12px;
334
+ color: var(--color-fg-default);
335
+ }
336
+
337
+ .detail-grid { display: grid; gap: 8px; }
338
+
339
+ .detail-row {
340
+ display: grid;
341
+ grid-template-columns: 120px 1fr;
342
+ gap: 12px;
343
+ align-items: start;
344
+ }
345
+
346
+ .detail-label {
347
+ color: var(--color-fg-muted);
348
+ font-size: 12px;
349
+ font-weight: 600;
350
+ }
351
+
352
+ .detail-value { word-break: break-word; }
353
+ .detail-value.mono { font-family: var(--mono-stack); font-size: 12px; }
354
+
355
+ .selector-change {
356
+ display: flex;
357
+ align-items: center;
358
+ gap: 8px;
359
+ flex-wrap: wrap;
360
+ }
361
+
362
+ .selector-change code {
363
+ font-family: var(--mono-stack);
364
+ font-size: 12px;
365
+ background: var(--color-canvas-subtle);
366
+ border: 1px solid var(--color-border-default);
367
+ border-radius: 4px;
368
+ padding: 2px 6px;
369
+ }
370
+
371
+ .arrow { color: var(--color-fg-muted); }
372
+
373
+ .category-badge {
374
+ display: inline-flex;
375
+ align-items: center;
376
+ padding: 2px 8px;
377
+ border-radius: 2em;
378
+ font-size: 11px;
379
+ font-weight: 700;
380
+ letter-spacing: 0.3px;
381
+ }
382
+
383
+ .category-timing { background: var(--color-attention-subtle); color: var(--color-attention-fg); }
384
+ .category-overlay { background: var(--color-danger-subtle); color: var(--color-danger-fg); }
385
+ .category-selector { background: var(--color-success-subtle); color: var(--color-success-fg); }
386
+ .category-iframe, .category-shadow_dom, .category-auth, .category-session, .category-network {
387
+ background: var(--color-accent-subtle);
388
+ color: var(--color-accent-fg);
389
+ }
390
+
391
+ .confidence-badge {
392
+ font-size: 12px;
393
+ color: var(--color-fg-muted);
394
+ }
395
+
396
+ .category-summary {
397
+ display: flex;
398
+ flex-wrap: wrap;
399
+ gap: 10px;
400
+ }
401
+
402
+ .category-stat {
403
+ display: inline-flex;
404
+ align-items: center;
405
+ gap: 8px;
406
+ border: 1px solid var(--color-border-default);
407
+ border-radius: 6px;
408
+ padding: 8px 10px;
409
+ background: var(--color-canvas-subtle);
410
+ }
411
+
412
+ .category-count {
413
+ font-weight: 700;
414
+ min-width: 1.5em;
415
+ text-align: right;
416
+ }
417
+
418
+ .run-status {
419
+ display: inline-flex;
420
+ align-items: center;
421
+ gap: 6px;
422
+ font-weight: 600;
423
+ text-transform: capitalize;
424
+ }
425
+
426
+ .run-status.passed { color: var(--color-success-fg); }
427
+ .run-status.failed { color: var(--color-danger-fg); }
428
+
429
+ @media (max-width: 900px) {
430
+ .main-layout { flex-direction: column; }
431
+ .sidebar {
432
+ width: 100%;
433
+ min-height: auto;
434
+ max-height: 40vh;
435
+ border-right: none;
436
+ border-bottom: 1px solid var(--color-border-default);
437
+ }
438
+ .detail-row { grid-template-columns: 1fr; gap: 2px; }
439
+ }
440
+ `;
441
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/report-html/styles.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAob5B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { HealFlowRunArtifacts, RuntimeHealRecord } from '@healflow/shared';
2
+ import type { FileGroup } from './types.js';
3
+ export declare function buildTestTree(artifacts: HealFlowRunArtifacts): FileGroup[];
4
+ export declare function categoryCounts(heals: RuntimeHealRecord[]): Array<{
5
+ category: string;
6
+ count: number;
7
+ }>;
8
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/report-html/tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEnG,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AAE3D,wBAAgB,aAAa,CAAC,SAAS,EAAE,oBAAoB,GAAG,SAAS,EAAE,CA6C1E;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,iBAAiB,EAAE,GACzB,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAS5C"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildTestTree = buildTestTree;
4
+ exports.categoryCounts = categoryCounts;
5
+ const node_path_1 = require("node:path");
6
+ const format_js_1 = require("./format.js");
7
+ function buildTestTree(artifacts) {
8
+ const fixByKey = new Map();
9
+ for (const fix of artifacts.fixes) {
10
+ fixByKey.set(`${fix.testFile}::${fix.testTitle}`, fix);
11
+ }
12
+ const testMap = new Map();
13
+ for (const heal of artifacts.heals) {
14
+ const testFile = heal.testFile ?? 'unknown';
15
+ const testTitle = heal.testTitle ?? 'Unknown test';
16
+ const key = `${testFile}::${testTitle}`;
17
+ const existing = testMap.get(key);
18
+ if (existing) {
19
+ existing.heals.push(heal);
20
+ continue;
21
+ }
22
+ testMap.set(key, {
23
+ id: (0, format_js_1.slugify)(key),
24
+ testFile,
25
+ testTitle,
26
+ heals: [heal],
27
+ fix: fixByKey.get(key),
28
+ });
29
+ }
30
+ const fileMap = new Map();
31
+ for (const test of testMap.values()) {
32
+ const fileName = (0, node_path_1.basename)(test.testFile);
33
+ const group = fileMap.get(test.testFile);
34
+ if (group) {
35
+ group.tests.push(test);
36
+ group.healCount += test.heals.length;
37
+ continue;
38
+ }
39
+ fileMap.set(test.testFile, {
40
+ testFile: test.testFile,
41
+ fileName,
42
+ tests: [test],
43
+ healCount: test.heals.length,
44
+ });
45
+ }
46
+ return [...fileMap.values()].sort((a, b) => a.fileName.localeCompare(b.fileName));
47
+ }
48
+ function categoryCounts(heals) {
49
+ const counts = new Map();
50
+ for (const heal of heals) {
51
+ counts.set(heal.category, (counts.get(heal.category) ?? 0) + 1);
52
+ }
53
+ return [...counts.entries()]
54
+ .map(([category, count]) => ({ category, count }))
55
+ .sort((a, b) => b.count - a.count);
56
+ }
57
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/report-html/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FixProposalRecord, RuntimeHealRecord } from '@healflow/shared';
2
+ export interface ReportHtmlOptions {
3
+ passedCount?: number;
4
+ durationMs?: number;
5
+ }
6
+ export interface TestTreeEntry {
7
+ id: string;
8
+ testFile: string;
9
+ testTitle: string;
10
+ heals: RuntimeHealRecord[];
11
+ fix?: FixProposalRecord;
12
+ }
13
+ export interface FileGroup {
14
+ testFile: string;
15
+ fileName: string;
16
+ tests: TestTreeEntry[];
17
+ healCount: number;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/report-html/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/report-html/types.ts"],"names":[],"mappings":""}
@@ -1,7 +1,3 @@
1
- import type { HealFlowRunArtifacts } from '@healflow/shared';
2
- export interface ReportHtmlOptions {
3
- passedCount?: number;
4
- durationMs?: number;
5
- }
6
- export declare function buildReportHtml(artifacts: HealFlowRunArtifacts, options?: ReportHtmlOptions): string;
1
+ export type { ReportHtmlOptions } from './report-html/index.js';
2
+ export { buildReportHtml } from './report-html/index.js';
7
3
  //# sourceMappingURL=report-html.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"report-html.d.ts","sourceRoot":"","sources":["../src/report-html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,oBAAoB,EAAqB,MAAM,kBAAkB,CAAC;AAGnG,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA+wBD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,oBAAoB,EAC/B,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAuIR"}
1
+ {"version":3,"file":"report-html.d.ts","sourceRoot":"","sources":["../src/report-html.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}