kaloko 0.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.
- package/README.md +119 -0
- package/bin/kaloko.mjs +4 -0
- package/bin/qawalk.mjs +4 -0
- package/package.json +42 -0
- package/schemas/bundle.v1.json +19 -0
- package/schemas/config.v1.json +268 -0
- package/schemas/revision.v1.json +36 -0
- package/schemas/run.v1.json +549 -0
- package/schemas/scenario.v1.json +668 -0
- package/schemas/tokens.v1.json +102 -0
- package/skills/kaloko/SKILL.md +94 -0
- package/skills/kaloko/reference/acceptance.md +208 -0
- package/skills/kaloko/reference/apps.md +161 -0
- package/skills/kaloko/reference/collaboration.md +218 -0
- package/skills/kaloko/reference/design.md +143 -0
- package/skills/kaloko/reference/documentation.md +72 -0
- package/skills/kaloko/reference/environments.md +140 -0
- package/skills/kaloko/reference/evaluation.md +62 -0
- package/skills/kaloko/reference/execution.md +75 -0
- package/skills/kaloko/reference/mcp.md +69 -0
- package/skills/kaloko/reference/stacks.md +122 -0
- package/src/cli.mjs +1344 -0
- package/src/lib/access.mjs +169 -0
- package/src/lib/apps/capture.mjs +59 -0
- package/src/lib/apps/drivers.mjs +284 -0
- package/src/lib/apps/helper.swift +102 -0
- package/src/lib/apps/tree.mjs +222 -0
- package/src/lib/browser-daemon.mjs +41 -0
- package/src/lib/browser.mjs +161 -0
- package/src/lib/build.mjs +149 -0
- package/src/lib/calibrate.mjs +97 -0
- package/src/lib/capture.mjs +233 -0
- package/src/lib/compare.mjs +88 -0
- package/src/lib/config.mjs +117 -0
- package/src/lib/console.mjs +13 -0
- package/src/lib/coverage.mjs +75 -0
- package/src/lib/design-cli.mjs +440 -0
- package/src/lib/design-core.mjs +163 -0
- package/src/lib/design.mjs +164 -0
- package/src/lib/doctor.mjs +149 -0
- package/src/lib/draft.mjs +76 -0
- package/src/lib/drift.mjs +145 -0
- package/src/lib/evaluate.mjs +222 -0
- package/src/lib/git.mjs +70 -0
- package/src/lib/htmlview.mjs +130 -0
- package/src/lib/jev.mjs +95 -0
- package/src/lib/mail.mjs +182 -0
- package/src/lib/manifest-core.mjs +127 -0
- package/src/lib/pack-help.mjs +55 -0
- package/src/lib/packs.mjs +121 -0
- package/src/lib/pr.mjs +78 -0
- package/src/lib/probe.mjs +379 -0
- package/src/lib/recheck.mjs +70 -0
- package/src/lib/run.mjs +85 -0
- package/src/lib/scenario.mjs +98 -0
- package/src/lib/schema.mjs +25 -0
- package/src/lib/secrets.mjs +59 -0
- package/src/lib/service.mjs +52 -0
- package/src/lib/stack.mjs +130 -0
- package/src/lib/tokens.mjs +352 -0
- package/src/lib/util.mjs +97 -0
- package/templates/ACCEPTANCE.md +55 -0
- package/templates/cs/ACCEPTANCE.md +55 -0
- package/templates/kaloko.config.yml +76 -0
- package/templates/mail/letter-opener.mjs +47 -0
- package/templates/scenario.yml +119 -0
- package/templates/steps/consent.mjs +33 -0
- package/viewer/index.html +2772 -0
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://qawalk.com/schemas/scenario.v1.json",
|
|
4
|
+
"title": "Kaloko scenario",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"schema",
|
|
8
|
+
"id",
|
|
9
|
+
"title",
|
|
10
|
+
"nodes",
|
|
11
|
+
"edges"
|
|
12
|
+
],
|
|
13
|
+
"additionalProperties": false,
|
|
14
|
+
"properties": {
|
|
15
|
+
"schema": {
|
|
16
|
+
"const": "qawalk.scenario.v1"
|
|
17
|
+
},
|
|
18
|
+
"id": {
|
|
19
|
+
"$ref": "#/$defs/slug"
|
|
20
|
+
},
|
|
21
|
+
"title": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1
|
|
24
|
+
},
|
|
25
|
+
"kind": {
|
|
26
|
+
"enum": [
|
|
27
|
+
"task",
|
|
28
|
+
"flow"
|
|
29
|
+
],
|
|
30
|
+
"default": "task"
|
|
31
|
+
},
|
|
32
|
+
"archived": {
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"default": false,
|
|
35
|
+
"description": "A retired scenario (replaced or split): the service hides it from the scenario list; its runs stay reachable."
|
|
36
|
+
},
|
|
37
|
+
"source": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "Path to the human acceptance plan (ACCEPTANCE.md)."
|
|
40
|
+
},
|
|
41
|
+
"version": {
|
|
42
|
+
"type": "integer",
|
|
43
|
+
"minimum": 1
|
|
44
|
+
},
|
|
45
|
+
"locales": {
|
|
46
|
+
"type": "array",
|
|
47
|
+
"items": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
},
|
|
50
|
+
"minItems": 1
|
|
51
|
+
},
|
|
52
|
+
"viewports": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"additionalProperties": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "integer",
|
|
58
|
+
"minimum": 200
|
|
59
|
+
},
|
|
60
|
+
"minItems": 2,
|
|
61
|
+
"maxItems": 2
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"environments": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"readonly": {
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"default": false
|
|
73
|
+
},
|
|
74
|
+
"platform": {
|
|
75
|
+
"enum": ["web", "android", "ios", "electron", "desktop"],
|
|
76
|
+
"default": "web",
|
|
77
|
+
"description": "What the flow runs on. web: pages in Chrome. android/ios/electron/desktop: an app, driven by the environment's app block (adb, iOS Simulator, Playwright Electron, macOS window) or captured with kaloko capture --image. Node paths are deep links for apps."
|
|
78
|
+
},
|
|
79
|
+
"tags": {
|
|
80
|
+
"type": "array",
|
|
81
|
+
"items": {
|
|
82
|
+
"type": "string"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"nodes": {
|
|
86
|
+
"type": "array",
|
|
87
|
+
"minItems": 1,
|
|
88
|
+
"items": {
|
|
89
|
+
"$ref": "#/$defs/node"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"edges": {
|
|
93
|
+
"type": "array",
|
|
94
|
+
"items": {
|
|
95
|
+
"$ref": "#/$defs/edge"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"lanes": {
|
|
99
|
+
"type": "array",
|
|
100
|
+
"description": "Optional labels for layout lanes, index = lane number.",
|
|
101
|
+
"items": {
|
|
102
|
+
"type": "string"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"issue": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"additionalProperties": false,
|
|
108
|
+
"description": "Ticket the scenario verifies. `number` alone resolves against the repository's remote.",
|
|
109
|
+
"properties": {
|
|
110
|
+
"repo": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"description": "owner/name"
|
|
113
|
+
},
|
|
114
|
+
"number": {
|
|
115
|
+
"type": "integer",
|
|
116
|
+
"minimum": 1
|
|
117
|
+
},
|
|
118
|
+
"url": {
|
|
119
|
+
"type": "string"
|
|
120
|
+
},
|
|
121
|
+
"title": {
|
|
122
|
+
"type": "string"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"sessions": {
|
|
127
|
+
"type": "object",
|
|
128
|
+
"description": "People in the flow. Every non-decision node names one; the runner keeps one browser context per session and locale.",
|
|
129
|
+
"additionalProperties": {
|
|
130
|
+
"type": "object",
|
|
131
|
+
"additionalProperties": false,
|
|
132
|
+
"required": [
|
|
133
|
+
"title"
|
|
134
|
+
],
|
|
135
|
+
"properties": {
|
|
136
|
+
"title": {
|
|
137
|
+
"description": "Localized or plain title, e.g. Member of the club."
|
|
138
|
+
},
|
|
139
|
+
"mailbox": {
|
|
140
|
+
"type": "string",
|
|
141
|
+
"description": "Default recipient for e-mail nodes of this session; {run} is replaced by the short run id."
|
|
142
|
+
},
|
|
143
|
+
"account": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "Opaque project key handed to step scripts (the project maps it to credentials)."
|
|
146
|
+
},
|
|
147
|
+
"blocked_on": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"items": {
|
|
150
|
+
"type": "string"
|
|
151
|
+
},
|
|
152
|
+
"description": "Environments where this session's nodes are skipped."
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"project": {
|
|
158
|
+
"$ref": "#/$defs/slug",
|
|
159
|
+
"description": "Optional project this flow belongs to; overrides `project` from kaloko.config.yml and the repository name for its runs."
|
|
160
|
+
},
|
|
161
|
+
"capture": {
|
|
162
|
+
"$ref": "#/$defs/capture"
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
"$defs": {
|
|
166
|
+
"slug": {
|
|
167
|
+
"type": "string",
|
|
168
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$"
|
|
169
|
+
},
|
|
170
|
+
"localized": {
|
|
171
|
+
"oneOf": [
|
|
172
|
+
{
|
|
173
|
+
"type": "string"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"type": "object",
|
|
177
|
+
"additionalProperties": {
|
|
178
|
+
"type": "string"
|
|
179
|
+
},
|
|
180
|
+
"minProperties": 1
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
"node": {
|
|
185
|
+
"type": "object",
|
|
186
|
+
"required": [
|
|
187
|
+
"id",
|
|
188
|
+
"kind",
|
|
189
|
+
"title"
|
|
190
|
+
],
|
|
191
|
+
"additionalProperties": false,
|
|
192
|
+
"properties": {
|
|
193
|
+
"id": {
|
|
194
|
+
"$ref": "#/$defs/slug"
|
|
195
|
+
},
|
|
196
|
+
"kind": {
|
|
197
|
+
"enum": [
|
|
198
|
+
"screen",
|
|
199
|
+
"email",
|
|
200
|
+
"external",
|
|
201
|
+
"decision",
|
|
202
|
+
"stack"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
"title": {
|
|
206
|
+
"$ref": "#/$defs/localized"
|
|
207
|
+
},
|
|
208
|
+
"path": {
|
|
209
|
+
"$ref": "#/$defs/localized"
|
|
210
|
+
},
|
|
211
|
+
"purpose": {
|
|
212
|
+
"type": "string"
|
|
213
|
+
},
|
|
214
|
+
"lane": {
|
|
215
|
+
"type": "integer",
|
|
216
|
+
"minimum": 0
|
|
217
|
+
},
|
|
218
|
+
"readonly": {
|
|
219
|
+
"type": "boolean"
|
|
220
|
+
},
|
|
221
|
+
"execution": {
|
|
222
|
+
"$ref": "#/$defs/execution"
|
|
223
|
+
},
|
|
224
|
+
"mail": {
|
|
225
|
+
"type": "object",
|
|
226
|
+
"additionalProperties": false,
|
|
227
|
+
"properties": {
|
|
228
|
+
"subject": {
|
|
229
|
+
"$ref": "#/$defs/localized"
|
|
230
|
+
},
|
|
231
|
+
"to": {
|
|
232
|
+
"type": "string"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"criteria": {
|
|
237
|
+
"type": "array",
|
|
238
|
+
"items": {
|
|
239
|
+
"$ref": "#/$defs/criterion"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
"session": {
|
|
243
|
+
"type": "string",
|
|
244
|
+
"description": "Key from `sessions`; which person performs this step."
|
|
245
|
+
},
|
|
246
|
+
"packs": {
|
|
247
|
+
"type": "array",
|
|
248
|
+
"items": {
|
|
249
|
+
"enum": [
|
|
250
|
+
"seo",
|
|
251
|
+
"usability",
|
|
252
|
+
"a11y",
|
|
253
|
+
"perf",
|
|
254
|
+
"console",
|
|
255
|
+
"errors",
|
|
256
|
+
"app",
|
|
257
|
+
"design"
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
"description": "Check packs whose criteria are added to this node (ids AC1xx seo, AC2xx usability, AC3xx a11y, AC4xx perf, AC5xx console, AC6xx design: checks against the design reference)."
|
|
261
|
+
},
|
|
262
|
+
"capture": {
|
|
263
|
+
"$ref": "#/$defs/capture"
|
|
264
|
+
},
|
|
265
|
+
"items": {
|
|
266
|
+
"type": "object",
|
|
267
|
+
"additionalProperties": false,
|
|
268
|
+
"description": "Stack steps: which pages of one template the step covers. One source: urls, file, sitemap (with match/exclude), crawl or script.",
|
|
269
|
+
"properties": {
|
|
270
|
+
"urls": {
|
|
271
|
+
"type": "array",
|
|
272
|
+
"items": {
|
|
273
|
+
"type": "string"
|
|
274
|
+
},
|
|
275
|
+
"description": "Paths or absolute URLs"
|
|
276
|
+
},
|
|
277
|
+
"file": {
|
|
278
|
+
"type": "string",
|
|
279
|
+
"description": "Text (one path or URL per line), CSV (first column) or JSON array of paths/URLs or {path,title}; relative to the scenario"
|
|
280
|
+
},
|
|
281
|
+
"sitemap": {
|
|
282
|
+
"type": "string",
|
|
283
|
+
"description": "Sitemap path or URL (sitemap indexes are followed one level)"
|
|
284
|
+
},
|
|
285
|
+
"match": {
|
|
286
|
+
"type": "string",
|
|
287
|
+
"description": "Regex on the path: keep matching pages"
|
|
288
|
+
},
|
|
289
|
+
"exclude": {
|
|
290
|
+
"type": "string",
|
|
291
|
+
"description": "Regex on the path: drop matching pages"
|
|
292
|
+
},
|
|
293
|
+
"crawl": {
|
|
294
|
+
"type": "object",
|
|
295
|
+
"additionalProperties": false,
|
|
296
|
+
"required": [
|
|
297
|
+
"from",
|
|
298
|
+
"links"
|
|
299
|
+
],
|
|
300
|
+
"properties": {
|
|
301
|
+
"from": {
|
|
302
|
+
"type": "string",
|
|
303
|
+
"description": "Listing page path"
|
|
304
|
+
},
|
|
305
|
+
"links": {
|
|
306
|
+
"type": "string",
|
|
307
|
+
"description": "CSS selector of the links to the pages"
|
|
308
|
+
},
|
|
309
|
+
"next": {
|
|
310
|
+
"type": "string",
|
|
311
|
+
"description": "CSS selector of the next-page link"
|
|
312
|
+
},
|
|
313
|
+
"pages": {
|
|
314
|
+
"type": "integer",
|
|
315
|
+
"minimum": 1,
|
|
316
|
+
"maximum": 200,
|
|
317
|
+
"description": "Listing pages to follow (default 1)"
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"script": {
|
|
322
|
+
"type": "string",
|
|
323
|
+
"description": "Module relative to the scenario: default export async ({ page, env, locale, url }) => [{ path | url, title?, key? }]"
|
|
324
|
+
},
|
|
325
|
+
"limit": {
|
|
326
|
+
"type": "integer",
|
|
327
|
+
"minimum": 1,
|
|
328
|
+
"maximum": 10000,
|
|
329
|
+
"description": "At most this many pages (default 500)"
|
|
330
|
+
},
|
|
331
|
+
"semantic_sample": {
|
|
332
|
+
"type": "integer",
|
|
333
|
+
"minimum": 0,
|
|
334
|
+
"maximum": 10000,
|
|
335
|
+
"description": "Semantic criteria are evaluated on the first N pages only (default 20); deterministic ones on every page"
|
|
336
|
+
},
|
|
337
|
+
"viewports": {
|
|
338
|
+
"type": "array",
|
|
339
|
+
"items": {
|
|
340
|
+
"type": "string"
|
|
341
|
+
},
|
|
342
|
+
"description": "Viewports for the pages (default: the first of the run)"
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
"fields": {
|
|
347
|
+
"type": "array",
|
|
348
|
+
"maxItems": 12,
|
|
349
|
+
"description": "Stack steps: columns of the stack index, read from every page",
|
|
350
|
+
"items": {
|
|
351
|
+
"type": "object",
|
|
352
|
+
"required": [
|
|
353
|
+
"id"
|
|
354
|
+
],
|
|
355
|
+
"additionalProperties": false,
|
|
356
|
+
"properties": {
|
|
357
|
+
"id": {
|
|
358
|
+
"type": "string",
|
|
359
|
+
"pattern": "^[a-z][a-z0-9_]{0,30}$"
|
|
360
|
+
},
|
|
361
|
+
"label": {
|
|
362
|
+
"type": "string"
|
|
363
|
+
},
|
|
364
|
+
"from": {
|
|
365
|
+
"type": "string",
|
|
366
|
+
"description": "title | h1 | description | canonical | lang | words | http | url | path | a CSS selector (text), selector@attribute, or count:selector"
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
"allOf": [
|
|
373
|
+
{
|
|
374
|
+
"if": {
|
|
375
|
+
"properties": {
|
|
376
|
+
"kind": {
|
|
377
|
+
"const": "decision"
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
"then": {
|
|
382
|
+
"not": {
|
|
383
|
+
"required": [
|
|
384
|
+
"criteria"
|
|
385
|
+
]
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
},
|
|
391
|
+
"execution": {
|
|
392
|
+
"type": "object",
|
|
393
|
+
"required": [
|
|
394
|
+
"strategy",
|
|
395
|
+
"instructions"
|
|
396
|
+
],
|
|
397
|
+
"additionalProperties": false,
|
|
398
|
+
"properties": {
|
|
399
|
+
"strategy": {
|
|
400
|
+
"enum": [
|
|
401
|
+
"playwright",
|
|
402
|
+
"script",
|
|
403
|
+
"agent",
|
|
404
|
+
"manual"
|
|
405
|
+
],
|
|
406
|
+
"description": "playwright/script: an automated step script (web: Playwright page; apps: the app driver); agent: an agent drives and captures; manual: a person does."
|
|
407
|
+
},
|
|
408
|
+
"script": {
|
|
409
|
+
"type": "string"
|
|
410
|
+
},
|
|
411
|
+
"instructions": {
|
|
412
|
+
"type": "string",
|
|
413
|
+
"minLength": 1
|
|
414
|
+
},
|
|
415
|
+
"requires": {
|
|
416
|
+
"type": "array",
|
|
417
|
+
"description": "Agent capabilities the step needs, e.g. browser, computer_use.",
|
|
418
|
+
"items": {
|
|
419
|
+
"type": "string"
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"criterion": {
|
|
425
|
+
"type": "object",
|
|
426
|
+
"required": [
|
|
427
|
+
"id",
|
|
428
|
+
"text",
|
|
429
|
+
"check"
|
|
430
|
+
],
|
|
431
|
+
"additionalProperties": false,
|
|
432
|
+
"properties": {
|
|
433
|
+
"id": {
|
|
434
|
+
"type": "string",
|
|
435
|
+
"pattern": "^AC[0-9]+[a-z]?$"
|
|
436
|
+
},
|
|
437
|
+
"text": {
|
|
438
|
+
"type": "string",
|
|
439
|
+
"minLength": 1
|
|
440
|
+
},
|
|
441
|
+
"highlight": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"description": "CSS selector to outline in the screenshot."
|
|
444
|
+
},
|
|
445
|
+
"check": {
|
|
446
|
+
"oneOf": [
|
|
447
|
+
{
|
|
448
|
+
"$ref": "#/$defs/deterministic"
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"$ref": "#/$defs/semantic"
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
"$ref": "#/$defs/manualCheck"
|
|
455
|
+
}
|
|
456
|
+
]
|
|
457
|
+
},
|
|
458
|
+
"pack": {
|
|
459
|
+
"type": "string",
|
|
460
|
+
"description": "Set by the CLI on criteria that came from a pack."
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
},
|
|
464
|
+
"deterministic": {
|
|
465
|
+
"type": "object",
|
|
466
|
+
"required": [
|
|
467
|
+
"type",
|
|
468
|
+
"assert"
|
|
469
|
+
],
|
|
470
|
+
"additionalProperties": false,
|
|
471
|
+
"properties": {
|
|
472
|
+
"type": {
|
|
473
|
+
"const": "deterministic"
|
|
474
|
+
},
|
|
475
|
+
"assert": {
|
|
476
|
+
"enum": [
|
|
477
|
+
"exists",
|
|
478
|
+
"absent",
|
|
479
|
+
"count",
|
|
480
|
+
"text_matches",
|
|
481
|
+
"text_absent",
|
|
482
|
+
"attr_equals",
|
|
483
|
+
"no_overflow",
|
|
484
|
+
"no_console_errors",
|
|
485
|
+
"title_matches",
|
|
486
|
+
"meta_matches",
|
|
487
|
+
"link_matches",
|
|
488
|
+
"http_status",
|
|
489
|
+
"link_home",
|
|
490
|
+
"app_touch_targets",
|
|
491
|
+
"app_no_truncation",
|
|
492
|
+
"app_no_crash",
|
|
493
|
+
"app_labels",
|
|
494
|
+
"a11y_images_alt",
|
|
495
|
+
"a11y_names",
|
|
496
|
+
"a11y_labels",
|
|
497
|
+
"a11y_headings",
|
|
498
|
+
"a11y_contrast",
|
|
499
|
+
"a11y_main",
|
|
500
|
+
"a11y_unique_ids",
|
|
501
|
+
"perf_lcp",
|
|
502
|
+
"perf_cls",
|
|
503
|
+
"perf_ttfb",
|
|
504
|
+
"perf_weight",
|
|
505
|
+
"uses_tokens",
|
|
506
|
+
"design_pixels",
|
|
507
|
+
"design_structure"
|
|
508
|
+
]
|
|
509
|
+
},
|
|
510
|
+
"selector": {
|
|
511
|
+
"type": "string"
|
|
512
|
+
},
|
|
513
|
+
"pattern": {
|
|
514
|
+
"type": "string"
|
|
515
|
+
},
|
|
516
|
+
"attr": {
|
|
517
|
+
"type": "string"
|
|
518
|
+
},
|
|
519
|
+
"value": {
|
|
520
|
+
"type": [
|
|
521
|
+
"string",
|
|
522
|
+
"number",
|
|
523
|
+
"boolean"
|
|
524
|
+
],
|
|
525
|
+
"description": "attr_equals: the attribute value; http_status: the exact status (e.g. 404). Without value, http_status accepts min..max (default 200..299)."
|
|
526
|
+
},
|
|
527
|
+
"min": {
|
|
528
|
+
"type": "integer",
|
|
529
|
+
"minimum": 0
|
|
530
|
+
},
|
|
531
|
+
"max": {
|
|
532
|
+
"type": "integer",
|
|
533
|
+
"minimum": 0
|
|
534
|
+
},
|
|
535
|
+
"ratio": {
|
|
536
|
+
"type": "number",
|
|
537
|
+
"minimum": 0,
|
|
538
|
+
"description": "design_pixels: maximum share of differing pixels (default 0.03)."
|
|
539
|
+
},
|
|
540
|
+
"flags": {
|
|
541
|
+
"type": "string",
|
|
542
|
+
"pattern": "^[imsu]{0,4}$",
|
|
543
|
+
"description": "Regex flags for pattern: i (ignore case), m, s. Page text is innerText, so CSS text-transform (uppercase buttons) applies."
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
"semantic": {
|
|
548
|
+
"type": "object",
|
|
549
|
+
"required": [
|
|
550
|
+
"type",
|
|
551
|
+
"question"
|
|
552
|
+
],
|
|
553
|
+
"additionalProperties": false,
|
|
554
|
+
"properties": {
|
|
555
|
+
"type": {
|
|
556
|
+
"const": "semantic"
|
|
557
|
+
},
|
|
558
|
+
"question": {
|
|
559
|
+
"type": "string",
|
|
560
|
+
"minLength": 1,
|
|
561
|
+
"description": "Yes/no question in English; yes means the criterion is met."
|
|
562
|
+
},
|
|
563
|
+
"true": {
|
|
564
|
+
"type": "string",
|
|
565
|
+
"description": "What counts as yes (edge cases)."
|
|
566
|
+
},
|
|
567
|
+
"false": {
|
|
568
|
+
"type": "string",
|
|
569
|
+
"description": "What counts as no (edge cases)."
|
|
570
|
+
},
|
|
571
|
+
"scope": {
|
|
572
|
+
"type": "string",
|
|
573
|
+
"description": "CSS selector limiting the state sent to the evaluator."
|
|
574
|
+
},
|
|
575
|
+
"about": {
|
|
576
|
+
"enum": [
|
|
577
|
+
"page",
|
|
578
|
+
"console"
|
|
579
|
+
],
|
|
580
|
+
"description": "console: the evaluator reads the captured console errors with the step purpose (triage) instead of the page"
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
"manualCheck": {
|
|
585
|
+
"type": "object",
|
|
586
|
+
"required": [
|
|
587
|
+
"type"
|
|
588
|
+
],
|
|
589
|
+
"additionalProperties": false,
|
|
590
|
+
"properties": {
|
|
591
|
+
"type": {
|
|
592
|
+
"const": "manual"
|
|
593
|
+
},
|
|
594
|
+
"note": {
|
|
595
|
+
"type": "string"
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
"edge": {
|
|
600
|
+
"type": "object",
|
|
601
|
+
"required": [
|
|
602
|
+
"from",
|
|
603
|
+
"to"
|
|
604
|
+
],
|
|
605
|
+
"additionalProperties": false,
|
|
606
|
+
"properties": {
|
|
607
|
+
"from": {
|
|
608
|
+
"$ref": "#/$defs/slug"
|
|
609
|
+
},
|
|
610
|
+
"to": {
|
|
611
|
+
"$ref": "#/$defs/slug"
|
|
612
|
+
},
|
|
613
|
+
"label": {
|
|
614
|
+
"type": "string"
|
|
615
|
+
},
|
|
616
|
+
"kind": {
|
|
617
|
+
"enum": [
|
|
618
|
+
"main",
|
|
619
|
+
"alt"
|
|
620
|
+
],
|
|
621
|
+
"default": "main"
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
},
|
|
625
|
+
"capture": {
|
|
626
|
+
"type": "object",
|
|
627
|
+
"additionalProperties": false,
|
|
628
|
+
"description": "Capture quality. Default WebP at 1× for the canvas; documentation runs use { format: png, scale: 2, mask: [...], annotate: true }.",
|
|
629
|
+
"properties": {
|
|
630
|
+
"format": {
|
|
631
|
+
"enum": [
|
|
632
|
+
"webp",
|
|
633
|
+
"png"
|
|
634
|
+
],
|
|
635
|
+
"description": "png is lossless (print, manuals)"
|
|
636
|
+
},
|
|
637
|
+
"scale": {
|
|
638
|
+
"enum": [
|
|
639
|
+
1,
|
|
640
|
+
2
|
|
641
|
+
],
|
|
642
|
+
"description": "device pixel ratio of the screenshot"
|
|
643
|
+
},
|
|
644
|
+
"quality": {
|
|
645
|
+
"type": "number",
|
|
646
|
+
"minimum": 0.3,
|
|
647
|
+
"maximum": 1,
|
|
648
|
+
"description": "WebP quality"
|
|
649
|
+
},
|
|
650
|
+
"mask": {
|
|
651
|
+
"type": "array",
|
|
652
|
+
"items": {
|
|
653
|
+
"type": "string"
|
|
654
|
+
},
|
|
655
|
+
"description": "CSS selectors covered by a solid box on the image (personal data)"
|
|
656
|
+
},
|
|
657
|
+
"annotate": {
|
|
658
|
+
"type": "boolean",
|
|
659
|
+
"description": "numbered marks on the elements of criteria with highlight"
|
|
660
|
+
},
|
|
661
|
+
"full_page": {
|
|
662
|
+
"type": "boolean",
|
|
663
|
+
"description": "Screenshot of the whole page (default true; false for stack pages: the first screen only)"
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|