@crvouga/atlas 1.9.0 → 1.11.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/CHANGELOG.md +15 -1
- package/dist/reports/src/review-collection-store.d.ts +47 -0
- package/dist/reports/src/review-collection-store.js +214 -0
- package/dist/reports/src/review-collection.d.ts +88 -0
- package/dist/reports/src/review-collection.js +144 -0
- package/dist/reports/src/test-catalog.d.ts +2 -0
- package/dist/reports/src/test-catalog.js +1 -1
- package/dist/schema/src/api.d.ts +574 -0
- package/dist/schema/src/api.js +152 -1
- package/dist/server/src/app.js +4 -1
- package/dist/server/src/openapi.js +46 -1
- package/dist/server/src/review-collections.d.ts +39 -0
- package/dist/server/src/review-collections.js +179 -0
- package/docs/extending.md +1 -1
- package/docs/reference/http-api.md +122 -0
- package/docs/reference/reports.md +294 -0
- package/docs/reference/schema.md +131 -0
- package/docs/reference/server.md +44 -0
- package/docs/rich-evidence.md +38 -0
- package/docs/server.md +41 -0
- package/docs/ui.md +67 -1
- package/llms-full.txt +269 -2
- package/package.json +1 -1
- package/packages/schema/schemas/review-collection.schema.json +398 -0
- package/packages/schema/schemas/review-manifest.schema.json +475 -0
- package/packages/server/openapi.json +6729 -4084
- package/packages/visualizer/src/app/router.tsx +6 -1
- package/packages/visualizer/src/evidence/applicability-view.tsx +233 -0
- package/packages/visualizer/src/evidence/applicability.test.ts +131 -0
- package/packages/visualizer/src/evidence/applicability.ts +241 -0
- package/packages/visualizer/src/evidence/artifact-tags.tsx +3 -2
- package/packages/visualizer/src/evidence/behavior-panel.tsx +11 -1
- package/packages/visualizer/src/evidence/feature-page.tsx +25 -4
- package/packages/visualizer/src/explorer/ArtifactsView.tsx +26 -2
- package/packages/visualizer/src/explorer/Explorer.tsx +7 -2
- package/packages/visualizer/src/explorer/RecordingTextSearch.tsx +355 -0
- package/packages/visualizer/src/explorer/RunsView.tsx +11 -1
- package/packages/visualizer/src/explorer/collection-model.test.ts +31 -0
- package/packages/visualizer/src/explorer/collection-model.ts +45 -0
- package/packages/visualizer/src/explorer/collections.tsx +513 -0
- package/packages/visualizer/src/explorer/playlist-entries.test.ts +51 -0
- package/packages/visualizer/src/explorer/playlist-entries.ts +163 -0
- package/packages/visualizer/src/explorer/playlist.tsx +500 -0
- package/packages/visualizer/src/explorer/recording-text.test.ts +149 -0
- package/packages/visualizer/src/explorer/recording-text.ts +490 -0
- package/packages/visualizer/src/explorer/search.ts +10 -2
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$id": "https://github.com/crvouga/atlas/schemas/review-manifest.schema.json",
|
|
3
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"schemaVersion": {
|
|
7
|
+
"type": "number",
|
|
8
|
+
"const": 1
|
|
9
|
+
},
|
|
10
|
+
"generatedAtMs": {
|
|
11
|
+
"type": "number"
|
|
12
|
+
},
|
|
13
|
+
"collection": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"id": {
|
|
17
|
+
"type": "string"
|
|
18
|
+
},
|
|
19
|
+
"revision": {
|
|
20
|
+
"type": "integer",
|
|
21
|
+
"minimum": 1,
|
|
22
|
+
"maximum": 9007199254740991
|
|
23
|
+
},
|
|
24
|
+
"title": {
|
|
25
|
+
"type": "string"
|
|
26
|
+
},
|
|
27
|
+
"purpose": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
},
|
|
30
|
+
"audience": {
|
|
31
|
+
"type": "string"
|
|
32
|
+
},
|
|
33
|
+
"tags": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"createdBy": {
|
|
40
|
+
"type": "string"
|
|
41
|
+
},
|
|
42
|
+
"createdAtMs": {
|
|
43
|
+
"type": "number"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"required": [
|
|
47
|
+
"id",
|
|
48
|
+
"revision",
|
|
49
|
+
"title",
|
|
50
|
+
"tags",
|
|
51
|
+
"createdBy",
|
|
52
|
+
"createdAtMs"
|
|
53
|
+
],
|
|
54
|
+
"additionalProperties": {}
|
|
55
|
+
},
|
|
56
|
+
"entries": {
|
|
57
|
+
"type": "array",
|
|
58
|
+
"items": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"properties": {
|
|
61
|
+
"id": {
|
|
62
|
+
"type": "string"
|
|
63
|
+
},
|
|
64
|
+
"position": {
|
|
65
|
+
"type": "integer",
|
|
66
|
+
"minimum": 1,
|
|
67
|
+
"maximum": 9007199254740991
|
|
68
|
+
},
|
|
69
|
+
"caption": {
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
"source": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"properties": {
|
|
75
|
+
"layer": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"pattern": "^[0-9a-f]{64}$",
|
|
78
|
+
"description": "The id of the archived layer that recorded the result"
|
|
79
|
+
},
|
|
80
|
+
"check": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"minLength": 1,
|
|
83
|
+
"maxLength": 1024,
|
|
84
|
+
"description": "The check's id in that layer"
|
|
85
|
+
},
|
|
86
|
+
"kind": {
|
|
87
|
+
"description": "The kind of the part holding the check, when the same id exists in several parts",
|
|
88
|
+
"type": "string",
|
|
89
|
+
"minLength": 1,
|
|
90
|
+
"maxLength": 256
|
|
91
|
+
},
|
|
92
|
+
"recording": {
|
|
93
|
+
"description": "One recording of the result (`VideoRef.recording`: `sha256:…`, a bundle key or an address). Absent: the result as a whole",
|
|
94
|
+
"type": "string",
|
|
95
|
+
"minLength": 1,
|
|
96
|
+
"maxLength": 2048
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"required": [
|
|
100
|
+
"layer",
|
|
101
|
+
"check"
|
|
102
|
+
],
|
|
103
|
+
"additionalProperties": {}
|
|
104
|
+
},
|
|
105
|
+
"snapshot": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"properties": {
|
|
108
|
+
"title": {
|
|
109
|
+
"type": "string"
|
|
110
|
+
},
|
|
111
|
+
"specPath": {
|
|
112
|
+
"type": [
|
|
113
|
+
"string",
|
|
114
|
+
"null"
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
"status": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"enum": [
|
|
120
|
+
"passed",
|
|
121
|
+
"failed",
|
|
122
|
+
"running",
|
|
123
|
+
"not-run"
|
|
124
|
+
],
|
|
125
|
+
"description": "The result's recorded status, as that layer recorded it"
|
|
126
|
+
},
|
|
127
|
+
"recordedAtMs": {
|
|
128
|
+
"type": "number"
|
|
129
|
+
},
|
|
130
|
+
"environment": {
|
|
131
|
+
"type": [
|
|
132
|
+
"string",
|
|
133
|
+
"null"
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
"producer": {
|
|
137
|
+
"type": "string"
|
|
138
|
+
},
|
|
139
|
+
"branch": {
|
|
140
|
+
"type": [
|
|
141
|
+
"string",
|
|
142
|
+
"null"
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
"sha": {
|
|
146
|
+
"type": [
|
|
147
|
+
"string",
|
|
148
|
+
"null"
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
"run": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"description": "The key of the run it belongs to"
|
|
154
|
+
},
|
|
155
|
+
"runUrl": {
|
|
156
|
+
"type": [
|
|
157
|
+
"string",
|
|
158
|
+
"null"
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"backend": {
|
|
162
|
+
"description": "The backend the layer was read from",
|
|
163
|
+
"type": [
|
|
164
|
+
"string",
|
|
165
|
+
"null"
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
"testKey": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"description": "The test's key, as `GET /api/reports/tests` lists it"
|
|
171
|
+
},
|
|
172
|
+
"attemptStatuses": {
|
|
173
|
+
"description": "The status of each recorded try, in order, when the check was retried. Never collapsed to the last",
|
|
174
|
+
"type": "array",
|
|
175
|
+
"items": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"enum": [
|
|
178
|
+
"passed",
|
|
179
|
+
"failed",
|
|
180
|
+
"running",
|
|
181
|
+
"not-run"
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"videos": {
|
|
186
|
+
"description": "Its references to videos when it was frozen",
|
|
187
|
+
"type": "array",
|
|
188
|
+
"items": {
|
|
189
|
+
"type": "object",
|
|
190
|
+
"properties": {
|
|
191
|
+
"name": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"description": "The attachment name"
|
|
194
|
+
},
|
|
195
|
+
"owner": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"description": "Who holds it: `layer`, `check`, `attempt` or `step`. An open vocabulary: treat an unknown owner as a check"
|
|
198
|
+
},
|
|
199
|
+
"attempt": {
|
|
200
|
+
"description": "The retry attempt that holds it, or that holds the step that does",
|
|
201
|
+
"type": "integer",
|
|
202
|
+
"minimum": 0,
|
|
203
|
+
"maximum": 9007199254740991
|
|
204
|
+
},
|
|
205
|
+
"step": {
|
|
206
|
+
"description": "The name of the step that holds it",
|
|
207
|
+
"type": "string"
|
|
208
|
+
},
|
|
209
|
+
"tags": {
|
|
210
|
+
"description": "The normalized tags of this attachment itself. Absent when it has none (and in documents of older servers)",
|
|
211
|
+
"type": "array",
|
|
212
|
+
"items": {
|
|
213
|
+
"type": "string"
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
"recording": {
|
|
217
|
+
"description": "What identifies the bytes; references with the same value are one recording. Absent when it cannot be played",
|
|
218
|
+
"type": "string"
|
|
219
|
+
},
|
|
220
|
+
"available": {
|
|
221
|
+
"type": "boolean",
|
|
222
|
+
"description": "False when the reference names no bytes (no bundle key, address or inline text)"
|
|
223
|
+
},
|
|
224
|
+
"scope": {
|
|
225
|
+
"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",
|
|
226
|
+
"type": "object",
|
|
227
|
+
"properties": {
|
|
228
|
+
"surface": {
|
|
229
|
+
"description": "Where the product ran, in an open vocabulary: `browser`, `native-app`, `api`, `cli`…",
|
|
230
|
+
"type": "string",
|
|
231
|
+
"minLength": 1
|
|
232
|
+
},
|
|
233
|
+
"deviceKind": {
|
|
234
|
+
"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",
|
|
235
|
+
"type": "string",
|
|
236
|
+
"minLength": 1
|
|
237
|
+
},
|
|
238
|
+
"syntheticData": {
|
|
239
|
+
"description": "True: the data was made up for the run. False: real data. Absent: unknown",
|
|
240
|
+
"type": "boolean"
|
|
241
|
+
},
|
|
242
|
+
"dependencies": {
|
|
243
|
+
"description": "Whether what the product talks to was `scripted` (replies fixed in advance), `live` or `mixed`. An open vocabulary; absent is unknown",
|
|
244
|
+
"type": "string",
|
|
245
|
+
"minLength": 1
|
|
246
|
+
},
|
|
247
|
+
"audioCaptured": {
|
|
248
|
+
"description": "True: the recording has real audio. False: it is silent. Absent: unknown",
|
|
249
|
+
"type": "boolean"
|
|
250
|
+
},
|
|
251
|
+
"pacing": {
|
|
252
|
+
"description": "How time ran, in an open vocabulary: `paced` (slowed or scripted for a viewer), `real-time`. Absent: unknown",
|
|
253
|
+
"type": "string",
|
|
254
|
+
"minLength": 1
|
|
255
|
+
},
|
|
256
|
+
"asserted": {
|
|
257
|
+
"description": "The boundaries the result actually asserts. Activity visible in a recording beyond them is not verified behavior",
|
|
258
|
+
"type": "array",
|
|
259
|
+
"items": {
|
|
260
|
+
"type": "string"
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
"limitations": {
|
|
264
|
+
"description": "Known limits of what this evidence shows, in the producer's words",
|
|
265
|
+
"type": "array",
|
|
266
|
+
"items": {
|
|
267
|
+
"type": "string"
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"declaredBy": {
|
|
271
|
+
"description": "Who or what made this declaration: a tool, a team, a person",
|
|
272
|
+
"type": "string"
|
|
273
|
+
},
|
|
274
|
+
"verified": {
|
|
275
|
+
"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",
|
|
276
|
+
"type": "array",
|
|
277
|
+
"items": {
|
|
278
|
+
"type": "string"
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"verifiedBy": {
|
|
282
|
+
"description": "What checked the `verified` fields",
|
|
283
|
+
"type": "string"
|
|
284
|
+
},
|
|
285
|
+
"provenance": {
|
|
286
|
+
"description": "Where the declaration comes from and how to check it: a document, a CI step, a device log",
|
|
287
|
+
"type": "array",
|
|
288
|
+
"items": {
|
|
289
|
+
"type": "object",
|
|
290
|
+
"properties": {
|
|
291
|
+
"url": {
|
|
292
|
+
"type": "string",
|
|
293
|
+
"minLength": 1
|
|
294
|
+
},
|
|
295
|
+
"name": {
|
|
296
|
+
"type": "string"
|
|
297
|
+
},
|
|
298
|
+
"rel": {
|
|
299
|
+
"description": "Why it is linked, in an open vocabulary: issue, run, trace, docs, source…",
|
|
300
|
+
"type": "string"
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
"required": [
|
|
304
|
+
"url"
|
|
305
|
+
],
|
|
306
|
+
"additionalProperties": {}
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
"extensions": {
|
|
310
|
+
"type": "object",
|
|
311
|
+
"propertyNames": {
|
|
312
|
+
"type": "string",
|
|
313
|
+
"minLength": 1
|
|
314
|
+
},
|
|
315
|
+
"additionalProperties": {}
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
"additionalProperties": {}
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"required": [
|
|
322
|
+
"name",
|
|
323
|
+
"owner",
|
|
324
|
+
"available"
|
|
325
|
+
],
|
|
326
|
+
"additionalProperties": {}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"required": [
|
|
331
|
+
"title",
|
|
332
|
+
"specPath",
|
|
333
|
+
"status",
|
|
334
|
+
"recordedAtMs",
|
|
335
|
+
"environment",
|
|
336
|
+
"producer",
|
|
337
|
+
"branch",
|
|
338
|
+
"sha",
|
|
339
|
+
"run",
|
|
340
|
+
"runUrl",
|
|
341
|
+
"backend",
|
|
342
|
+
"testKey"
|
|
343
|
+
],
|
|
344
|
+
"additionalProperties": {}
|
|
345
|
+
},
|
|
346
|
+
"state": {
|
|
347
|
+
"type": "string",
|
|
348
|
+
"enum": [
|
|
349
|
+
"available",
|
|
350
|
+
"unverified",
|
|
351
|
+
"unavailable"
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
"reason": {
|
|
355
|
+
"type": "string"
|
|
356
|
+
},
|
|
357
|
+
"reviewed": {
|
|
358
|
+
"type": "boolean"
|
|
359
|
+
},
|
|
360
|
+
"files": {
|
|
361
|
+
"type": "array",
|
|
362
|
+
"items": {
|
|
363
|
+
"type": "object",
|
|
364
|
+
"properties": {
|
|
365
|
+
"name": {
|
|
366
|
+
"type": "string",
|
|
367
|
+
"description": "The attachment's name as recorded"
|
|
368
|
+
},
|
|
369
|
+
"safeName": {
|
|
370
|
+
"type": "string",
|
|
371
|
+
"description": "A name safe to write to a file system: letters, digits, dot, dash and underscore"
|
|
372
|
+
},
|
|
373
|
+
"path": {
|
|
374
|
+
"type": "string",
|
|
375
|
+
"description": "Where a packer should put it: `files/<entry position>-<safeName>`"
|
|
376
|
+
},
|
|
377
|
+
"recording": {
|
|
378
|
+
"type": "string"
|
|
379
|
+
},
|
|
380
|
+
"sha256": {
|
|
381
|
+
"description": "The digest of the bytes when the report recorded one, else null: unknown, not verified",
|
|
382
|
+
"type": [
|
|
383
|
+
"string",
|
|
384
|
+
"null"
|
|
385
|
+
]
|
|
386
|
+
},
|
|
387
|
+
"missing": {
|
|
388
|
+
"type": "boolean",
|
|
389
|
+
"description": "True when the source cannot be read now"
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
"required": [
|
|
393
|
+
"name",
|
|
394
|
+
"safeName",
|
|
395
|
+
"path",
|
|
396
|
+
"sha256",
|
|
397
|
+
"missing"
|
|
398
|
+
],
|
|
399
|
+
"additionalProperties": {}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"required": [
|
|
404
|
+
"id",
|
|
405
|
+
"position",
|
|
406
|
+
"source",
|
|
407
|
+
"snapshot",
|
|
408
|
+
"state",
|
|
409
|
+
"reviewed",
|
|
410
|
+
"files"
|
|
411
|
+
],
|
|
412
|
+
"additionalProperties": {}
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
"gaps": {
|
|
416
|
+
"type": "array",
|
|
417
|
+
"items": {
|
|
418
|
+
"type": "object",
|
|
419
|
+
"properties": {
|
|
420
|
+
"id": {
|
|
421
|
+
"type": "string"
|
|
422
|
+
},
|
|
423
|
+
"note": {
|
|
424
|
+
"type": "string"
|
|
425
|
+
},
|
|
426
|
+
"after": {
|
|
427
|
+
"type": "integer",
|
|
428
|
+
"minimum": 0,
|
|
429
|
+
"maximum": 9007199254740991,
|
|
430
|
+
"description": "It sits after this many entries"
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
"required": [
|
|
434
|
+
"id",
|
|
435
|
+
"note",
|
|
436
|
+
"after"
|
|
437
|
+
],
|
|
438
|
+
"additionalProperties": {}
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
"missing": {
|
|
442
|
+
"type": "array",
|
|
443
|
+
"items": {
|
|
444
|
+
"type": "object",
|
|
445
|
+
"properties": {
|
|
446
|
+
"entry": {
|
|
447
|
+
"type": "string"
|
|
448
|
+
},
|
|
449
|
+
"reason": {
|
|
450
|
+
"type": "string"
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
"required": [
|
|
454
|
+
"entry",
|
|
455
|
+
"reason"
|
|
456
|
+
],
|
|
457
|
+
"additionalProperties": {}
|
|
458
|
+
},
|
|
459
|
+
"description": "Entries whose sources cannot be read now, and every file that is missing"
|
|
460
|
+
},
|
|
461
|
+
"notes": {
|
|
462
|
+
"type": "string"
|
|
463
|
+
}
|
|
464
|
+
},
|
|
465
|
+
"required": [
|
|
466
|
+
"schemaVersion",
|
|
467
|
+
"generatedAtMs",
|
|
468
|
+
"collection",
|
|
469
|
+
"entries",
|
|
470
|
+
"gaps",
|
|
471
|
+
"missing",
|
|
472
|
+
"notes"
|
|
473
|
+
],
|
|
474
|
+
"additionalProperties": {}
|
|
475
|
+
}
|