@crvouga/atlas 1.1.0 → 1.3.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 (54) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/reports/src/artifact-query.d.ts +123 -0
  3. package/dist/reports/src/artifact-query.js +234 -0
  4. package/dist/reports/src/evidence-detail.d.ts +14 -3
  5. package/dist/reports/src/evidence-detail.js +34 -19
  6. package/dist/reports/src/evidence-scope.d.ts +83 -0
  7. package/dist/reports/src/evidence-scope.js +129 -0
  8. package/dist/reports/src/evidence-types.d.ts +5 -1
  9. package/dist/reports/src/explorer-types.d.ts +1 -1
  10. package/dist/reports/src/layer-merge.js +3 -2
  11. package/dist/reports/src/layer-types.d.ts +1 -1
  12. package/dist/reports/src/publish-checks.js +1 -0
  13. package/dist/reports/src/reporter.d.ts +1 -1
  14. package/dist/reports/src/reports-explorer-route.d.ts +276 -0
  15. package/dist/reports/src/reports-route.d.ts +276 -0
  16. package/dist/reports/src/test-catalog.d.ts +108 -6
  17. package/dist/reports/src/test-catalog.js +155 -8
  18. package/dist/schema/src/api.d.ts +745 -0
  19. package/dist/schema/src/api.js +48 -6
  20. package/dist/schema/src/layer.d.ts +981 -0
  21. package/dist/schema/src/layer.js +43 -4
  22. package/dist/server/src/app.js +16 -5
  23. package/dist/server/src/openapi.js +42 -3
  24. package/docs/extending.md +1 -0
  25. package/docs/reference/http-api.md +86 -2
  26. package/docs/reference/reports.md +550 -14
  27. package/docs/reference/schema.md +55 -0
  28. package/docs/rich-evidence.md +78 -0
  29. package/docs/server.md +4 -1
  30. package/docs/ui.md +1 -1
  31. package/llms-full.txt +170 -4
  32. package/package.json +1 -1
  33. package/packages/schema/schemas/check-detail.schema.json +673 -1
  34. package/packages/schema/schemas/effective-delta.schema.json +206 -0
  35. package/packages/schema/schemas/effective-evidence.schema.json +206 -0
  36. package/packages/schema/schemas/evidence-page.schema.json +103 -0
  37. package/packages/schema/schemas/layer-rows.schema.json +103 -0
  38. package/packages/schema/schemas/layer.schema.json +1598 -62
  39. package/packages/schema/schemas/publish-checks.schema.json +768 -0
  40. package/packages/schema/schemas/report-run.schema.json +131 -0
  41. package/packages/schema/schemas/report-runs.schema.json +221 -0
  42. package/packages/schema/schemas/test-catalog.schema.json +135 -0
  43. package/packages/schema/schemas/test-history.schema.json +216 -0
  44. package/packages/server/openapi.json +4731 -735
  45. package/packages/visualizer/src/evidence/artifacts.tsx +24 -18
  46. package/packages/visualizer/src/evidence/evidence-scope.tsx +106 -0
  47. package/packages/visualizer/src/evidence/format.ts +11 -0
  48. package/packages/visualizer/src/explorer/ArtifactsView.tsx +162 -0
  49. package/packages/visualizer/src/explorer/Explorer.tsx +47 -3
  50. package/packages/visualizer/src/explorer/RunsView.tsx +43 -19
  51. package/packages/visualizer/src/explorer/catalog.tsx +97 -12
  52. package/packages/visualizer/src/explorer/filters.tsx +279 -0
  53. package/packages/visualizer/src/explorer/search.ts +85 -6
  54. package/packages/visualizer/src/explorer/views.ts +75 -0
@@ -170,6 +170,34 @@
170
170
  "unavailable"
171
171
  ],
172
172
  "additionalProperties": {}
173
+ },
174
+ "artifactTags": {
175
+ "description": "The normalized tags of the attachments of its results, sorted and distinct. Absent when none is tagged, and in reports of older servers",
176
+ "type": "array",
177
+ "items": {
178
+ "type": "string"
179
+ }
180
+ },
181
+ "tags": {
182
+ "description": "The tags of its checks and layers, which its attachments inherit (what `inherited=1` also matches). Absent when none",
183
+ "type": "array",
184
+ "items": {
185
+ "type": "string"
186
+ }
187
+ },
188
+ "types": {
189
+ "description": "The media types (roles) of its attachments, sorted and distinct; `video` only for a playable recording. Absent when it has no attachment",
190
+ "type": "array",
191
+ "items": {
192
+ "type": "string"
193
+ }
194
+ },
195
+ "labels": {
196
+ "description": "The `key=value` labels of its results and layers, sorted and distinct. Absent when it has none",
197
+ "type": "array",
198
+ "items": {
199
+ "type": "string"
200
+ }
173
201
  }
174
202
  },
175
203
  "required": [
@@ -267,6 +295,13 @@
267
295
  "description": "The name of the step that holds it",
268
296
  "type": "string"
269
297
  },
298
+ "tags": {
299
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
300
+ "type": "array",
301
+ "items": {
302
+ "type": "string"
303
+ }
304
+ },
270
305
  "recording": {
271
306
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
272
307
  "type": "string"
@@ -274,6 +309,102 @@
274
309
  "available": {
275
310
  "type": "boolean",
276
311
  "description": "False when the reference names no bytes (no bundle key, address or inline text)"
312
+ },
313
+ "scope": {
314
+ "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
315
+ "type": "object",
316
+ "properties": {
317
+ "surface": {
318
+ "description": "Where the product ran, in an open vocabulary: `browser`, `native-app`, `api`, `cli`…",
319
+ "type": "string",
320
+ "minLength": 1
321
+ },
322
+ "deviceKind": {
323
+ "description": "What it ran on, in an open vocabulary: `simulator`, `emulator`, `physical`, `virtual-machine`, `desktop`… A simulator and a physical phone stay distinct values; they are filtered separately",
324
+ "type": "string",
325
+ "minLength": 1
326
+ },
327
+ "syntheticData": {
328
+ "description": "True: the data was made up for the run. False: real data. Absent: unknown",
329
+ "type": "boolean"
330
+ },
331
+ "dependencies": {
332
+ "description": "Whether what the product talks to was `scripted` (replies fixed in advance), `live` or `mixed`. An open vocabulary; absent is unknown",
333
+ "type": "string",
334
+ "minLength": 1
335
+ },
336
+ "audioCaptured": {
337
+ "description": "True: the recording has real audio. False: it is silent. Absent: unknown",
338
+ "type": "boolean"
339
+ },
340
+ "pacing": {
341
+ "description": "How time ran, in an open vocabulary: `paced` (slowed or scripted for a viewer), `real-time`. Absent: unknown",
342
+ "type": "string",
343
+ "minLength": 1
344
+ },
345
+ "asserted": {
346
+ "description": "The boundaries the result actually asserts. Activity visible in a recording beyond them is not verified behavior",
347
+ "type": "array",
348
+ "items": {
349
+ "type": "string"
350
+ }
351
+ },
352
+ "limitations": {
353
+ "description": "Known limits of what this evidence shows, in the producer's words",
354
+ "type": "array",
355
+ "items": {
356
+ "type": "string"
357
+ }
358
+ },
359
+ "declaredBy": {
360
+ "description": "Who or what made this declaration: a tool, a team, a person",
361
+ "type": "string"
362
+ },
363
+ "verified": {
364
+ "description": "The names of the fields above (`surface`, `deviceKind`, `syntheticData`, `dependencies`, `audioCaptured`, `pacing`) that something independent of the producer checked. Every other field is only declared",
365
+ "type": "array",
366
+ "items": {
367
+ "type": "string"
368
+ }
369
+ },
370
+ "verifiedBy": {
371
+ "description": "What checked the `verified` fields",
372
+ "type": "string"
373
+ },
374
+ "provenance": {
375
+ "description": "Where the declaration comes from and how to check it: a document, a CI step, a device log",
376
+ "type": "array",
377
+ "items": {
378
+ "type": "object",
379
+ "properties": {
380
+ "url": {
381
+ "type": "string",
382
+ "minLength": 1
383
+ },
384
+ "name": {
385
+ "type": "string"
386
+ },
387
+ "rel": {
388
+ "description": "Why it is linked, in an open vocabulary: issue, run, trace, docs, source…",
389
+ "type": "string"
390
+ }
391
+ },
392
+ "required": [
393
+ "url"
394
+ ],
395
+ "additionalProperties": {}
396
+ }
397
+ },
398
+ "extensions": {
399
+ "type": "object",
400
+ "propertyNames": {
401
+ "type": "string",
402
+ "minLength": 1
403
+ },
404
+ "additionalProperties": {}
405
+ }
406
+ },
407
+ "additionalProperties": {}
277
408
  }
278
409
  },
279
410
  "required": [
@@ -178,6 +178,34 @@
178
178
  "unavailable"
179
179
  ],
180
180
  "additionalProperties": {}
181
+ },
182
+ "artifactTags": {
183
+ "description": "The normalized tags of the attachments of its results, sorted and distinct. Absent when none is tagged, and in reports of older servers",
184
+ "type": "array",
185
+ "items": {
186
+ "type": "string"
187
+ }
188
+ },
189
+ "tags": {
190
+ "description": "The tags of its checks and layers, which its attachments inherit (what `inherited=1` also matches). Absent when none",
191
+ "type": "array",
192
+ "items": {
193
+ "type": "string"
194
+ }
195
+ },
196
+ "types": {
197
+ "description": "The media types (roles) of its attachments, sorted and distinct; `video` only for a playable recording. Absent when it has no attachment",
198
+ "type": "array",
199
+ "items": {
200
+ "type": "string"
201
+ }
202
+ },
203
+ "labels": {
204
+ "description": "The `key=value` labels of its results and layers, sorted and distinct. Absent when it has none",
205
+ "type": "array",
206
+ "items": {
207
+ "type": "string"
208
+ }
181
209
  }
182
210
  },
183
211
  "required": [
@@ -204,6 +232,199 @@
204
232
  "type": "integer",
205
233
  "minimum": 0,
206
234
  "maximum": 9007199254740991
235
+ },
236
+ "filters": {
237
+ "description": "The filter parameters this server applied (`artifactTag`, `type`, `outcome`…). A viewer that asked for one that is missing here knows the server ignored it. Absent on servers that predate filtering",
238
+ "type": "array",
239
+ "items": {
240
+ "type": "string"
241
+ }
242
+ },
243
+ "facets": {
244
+ "description": "The values each filter dimension offers, counted over every run. Absent on servers that predate filtering",
245
+ "type": "object",
246
+ "properties": {
247
+ "artifactTags": {
248
+ "type": "array",
249
+ "items": {
250
+ "type": "object",
251
+ "properties": {
252
+ "value": {
253
+ "type": "string"
254
+ },
255
+ "count": {
256
+ "type": "integer",
257
+ "minimum": 0,
258
+ "maximum": 9007199254740991
259
+ }
260
+ },
261
+ "required": [
262
+ "value",
263
+ "count"
264
+ ],
265
+ "additionalProperties": {}
266
+ }
267
+ },
268
+ "types": {
269
+ "type": "array",
270
+ "items": {
271
+ "type": "object",
272
+ "properties": {
273
+ "value": {
274
+ "type": "string"
275
+ },
276
+ "count": {
277
+ "type": "integer",
278
+ "minimum": 0,
279
+ "maximum": 9007199254740991
280
+ }
281
+ },
282
+ "required": [
283
+ "value",
284
+ "count"
285
+ ],
286
+ "additionalProperties": {}
287
+ }
288
+ },
289
+ "labels": {
290
+ "type": "array",
291
+ "items": {
292
+ "type": "object",
293
+ "properties": {
294
+ "value": {
295
+ "type": "string"
296
+ },
297
+ "count": {
298
+ "type": "integer",
299
+ "minimum": 0,
300
+ "maximum": 9007199254740991
301
+ }
302
+ },
303
+ "required": [
304
+ "value",
305
+ "count"
306
+ ],
307
+ "additionalProperties": {}
308
+ },
309
+ "description": "Values are `key=value`"
310
+ },
311
+ "environments": {
312
+ "type": "array",
313
+ "items": {
314
+ "type": "object",
315
+ "properties": {
316
+ "value": {
317
+ "type": "string"
318
+ },
319
+ "count": {
320
+ "type": "integer",
321
+ "minimum": 0,
322
+ "maximum": 9007199254740991
323
+ }
324
+ },
325
+ "required": [
326
+ "value",
327
+ "count"
328
+ ],
329
+ "additionalProperties": {}
330
+ }
331
+ },
332
+ "producers": {
333
+ "type": "array",
334
+ "items": {
335
+ "type": "object",
336
+ "properties": {
337
+ "value": {
338
+ "type": "string"
339
+ },
340
+ "count": {
341
+ "type": "integer",
342
+ "minimum": 0,
343
+ "maximum": 9007199254740991
344
+ }
345
+ },
346
+ "required": [
347
+ "value",
348
+ "count"
349
+ ],
350
+ "additionalProperties": {}
351
+ }
352
+ },
353
+ "branches": {
354
+ "type": "array",
355
+ "items": {
356
+ "type": "object",
357
+ "properties": {
358
+ "value": {
359
+ "type": "string"
360
+ },
361
+ "count": {
362
+ "type": "integer",
363
+ "minimum": 0,
364
+ "maximum": 9007199254740991
365
+ }
366
+ },
367
+ "required": [
368
+ "value",
369
+ "count"
370
+ ],
371
+ "additionalProperties": {}
372
+ }
373
+ },
374
+ "outcomes": {
375
+ "type": "array",
376
+ "items": {
377
+ "type": "object",
378
+ "properties": {
379
+ "value": {
380
+ "type": "string"
381
+ },
382
+ "count": {
383
+ "type": "integer",
384
+ "minimum": 0,
385
+ "maximum": 9007199254740991
386
+ }
387
+ },
388
+ "required": [
389
+ "value",
390
+ "count"
391
+ ],
392
+ "additionalProperties": {}
393
+ }
394
+ },
395
+ "domains": {
396
+ "description": "Only for artifacts: runs have no domain",
397
+ "type": "array",
398
+ "items": {
399
+ "type": "object",
400
+ "properties": {
401
+ "value": {
402
+ "type": "string"
403
+ },
404
+ "count": {
405
+ "type": "integer",
406
+ "minimum": 0,
407
+ "maximum": 9007199254740991
408
+ }
409
+ },
410
+ "required": [
411
+ "value",
412
+ "count"
413
+ ],
414
+ "additionalProperties": {}
415
+ }
416
+ }
417
+ },
418
+ "required": [
419
+ "artifactTags",
420
+ "types",
421
+ "labels",
422
+ "environments",
423
+ "producers",
424
+ "branches",
425
+ "outcomes"
426
+ ],
427
+ "additionalProperties": {}
207
428
  }
208
429
  },
209
430
  "required": [
@@ -611,6 +611,28 @@
611
611
  "additionalProperties": {}
612
612
  }
613
613
  },
614
+ "scopes": {
615
+ "description": "Scope tokens of recordings (`device:simulator`, `unknown`) with the number of tests that have a recording stating each",
616
+ "type": "array",
617
+ "items": {
618
+ "type": "object",
619
+ "properties": {
620
+ "value": {
621
+ "type": "string"
622
+ },
623
+ "count": {
624
+ "type": "integer",
625
+ "minimum": 0,
626
+ "maximum": 9007199254740991
627
+ }
628
+ },
629
+ "required": [
630
+ "value",
631
+ "count"
632
+ ],
633
+ "additionalProperties": {}
634
+ }
635
+ },
614
636
  "branches": {
615
637
  "type": "array",
616
638
  "items": {
@@ -923,6 +945,13 @@
923
945
  "description": "The name of the step that holds it",
924
946
  "type": "string"
925
947
  },
948
+ "tags": {
949
+ "description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
950
+ "type": "array",
951
+ "items": {
952
+ "type": "string"
953
+ }
954
+ },
926
955
  "recording": {
927
956
  "description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
928
957
  "type": "string"
@@ -930,6 +959,102 @@
930
959
  "available": {
931
960
  "type": "boolean",
932
961
  "description": "False when the reference names no bytes (no bundle key, address or inline text)"
962
+ },
963
+ "scope": {
964
+ "description": "What this recording shows as its producer declared it: its own `scope`, else its attempt's, check's, part's or layer's. Absent: the scope is unknown, never live, physical or audible",
965
+ "type": "object",
966
+ "properties": {
967
+ "surface": {
968
+ "description": "Where the product ran, in an open vocabulary: `browser`, `native-app`, `api`, `cli`…",
969
+ "type": "string",
970
+ "minLength": 1
971
+ },
972
+ "deviceKind": {
973
+ "description": "What it ran on, in an open vocabulary: `simulator`, `emulator`, `physical`, `virtual-machine`, `desktop`… A simulator and a physical phone stay distinct values; they are filtered separately",
974
+ "type": "string",
975
+ "minLength": 1
976
+ },
977
+ "syntheticData": {
978
+ "description": "True: the data was made up for the run. False: real data. Absent: unknown",
979
+ "type": "boolean"
980
+ },
981
+ "dependencies": {
982
+ "description": "Whether what the product talks to was `scripted` (replies fixed in advance), `live` or `mixed`. An open vocabulary; absent is unknown",
983
+ "type": "string",
984
+ "minLength": 1
985
+ },
986
+ "audioCaptured": {
987
+ "description": "True: the recording has real audio. False: it is silent. Absent: unknown",
988
+ "type": "boolean"
989
+ },
990
+ "pacing": {
991
+ "description": "How time ran, in an open vocabulary: `paced` (slowed or scripted for a viewer), `real-time`. Absent: unknown",
992
+ "type": "string",
993
+ "minLength": 1
994
+ },
995
+ "asserted": {
996
+ "description": "The boundaries the result actually asserts. Activity visible in a recording beyond them is not verified behavior",
997
+ "type": "array",
998
+ "items": {
999
+ "type": "string"
1000
+ }
1001
+ },
1002
+ "limitations": {
1003
+ "description": "Known limits of what this evidence shows, in the producer's words",
1004
+ "type": "array",
1005
+ "items": {
1006
+ "type": "string"
1007
+ }
1008
+ },
1009
+ "declaredBy": {
1010
+ "description": "Who or what made this declaration: a tool, a team, a person",
1011
+ "type": "string"
1012
+ },
1013
+ "verified": {
1014
+ "description": "The names of the fields above (`surface`, `deviceKind`, `syntheticData`, `dependencies`, `audioCaptured`, `pacing`) that something independent of the producer checked. Every other field is only declared",
1015
+ "type": "array",
1016
+ "items": {
1017
+ "type": "string"
1018
+ }
1019
+ },
1020
+ "verifiedBy": {
1021
+ "description": "What checked the `verified` fields",
1022
+ "type": "string"
1023
+ },
1024
+ "provenance": {
1025
+ "description": "Where the declaration comes from and how to check it: a document, a CI step, a device log",
1026
+ "type": "array",
1027
+ "items": {
1028
+ "type": "object",
1029
+ "properties": {
1030
+ "url": {
1031
+ "type": "string",
1032
+ "minLength": 1
1033
+ },
1034
+ "name": {
1035
+ "type": "string"
1036
+ },
1037
+ "rel": {
1038
+ "description": "Why it is linked, in an open vocabulary: issue, run, trace, docs, source…",
1039
+ "type": "string"
1040
+ }
1041
+ },
1042
+ "required": [
1043
+ "url"
1044
+ ],
1045
+ "additionalProperties": {}
1046
+ }
1047
+ },
1048
+ "extensions": {
1049
+ "type": "object",
1050
+ "propertyNames": {
1051
+ "type": "string",
1052
+ "minLength": 1
1053
+ },
1054
+ "additionalProperties": {}
1055
+ }
1056
+ },
1057
+ "additionalProperties": {}
933
1058
  }
934
1059
  },
935
1060
  "required": [
@@ -1133,6 +1258,16 @@
1133
1258
  "type": "string"
1134
1259
  }
1135
1260
  },
1261
+ "scopeProfiles": {
1262
+ "description": "The scope tokens each distinct playable recording of its current results declares (`device:physical`, `audio:silent`); `[\"unknown\"]` for a recording that declared none. What `?scope=` matches, one recording at a time. Absent when it has no playable recording",
1263
+ "type": "array",
1264
+ "items": {
1265
+ "type": "array",
1266
+ "items": {
1267
+ "type": "string"
1268
+ }
1269
+ }
1270
+ },
1136
1271
  "labels": {
1137
1272
  "type": "object",
1138
1273
  "propertyNames": {