@viberaven/cli 1.6.12 → 1.7.1
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/AGENTS.md +64 -64
- package/LICENSE +21 -21
- package/README.md +67 -67
- package/SECURITY.md +59 -59
- package/dist/cli.js +5025 -1958
- package/dist/console/app.js +251 -251
- package/dist/console/index.html +46 -46
- package/dist/console/styles.css +267 -267
- package/dist/github-ci.js +1645 -0
- package/dist/playbooks/_stack-default.json +11 -11
- package/dist/playbooks/auth-supabase.json +31 -31
- package/dist/playbooks/stripe.json +66 -66
- package/dist/playbooks/supabase.json +51 -51
- package/dist/playbooks/vercel.json +42 -42
- package/dist/report/assets/provider-authjs.svg +5 -5
- package/dist/report/assets/provider-aws.svg +5 -5
- package/dist/report/assets/provider-logrocket.svg +4 -4
- package/dist/report/report-cli.css +1466 -1466
- package/dist/report/station.css +11854 -11854
- package/dist/report/station.js +8319 -8319
- package/dist/stack/app.js +14 -14
- package/dist/stack/scene.css +522 -484
- package/dist/stack/stack.css +1691 -1691
- package/dist/vendor/anime.umd.min.js +7 -7
- package/package.json +96 -95
- package/playbooks/_stack-default.json +11 -11
- package/playbooks/auth-supabase.json +31 -31
- package/playbooks/stripe.json +66 -66
- package/playbooks/supabase.json +51 -51
- package/playbooks/vercel.json +42 -42
- package/schemas/permissions-matrix.schema.json +90 -90
- package/schemas/verification-plan.schema.json +350 -0
- package/schemas/verification-report.schema.json +550 -0
- package/templates/AGENTS.snippet.md +56 -56
- package/templates/CLAUDE.snippet.md +14 -14
- package/templates/CURSOR.snippet.md +14 -14
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://viberaven.dev/schemas/permissions-matrix.v1.json",
|
|
4
|
-
"title": "VibeRaven permissions matrix (viberaven.permissions.json)",
|
|
5
|
-
"description": "Who may read, add, change and delete rows in each table, written by a person. `viberaven rls-test` checks the migrations against it. Never generate it from the app's own policies. Every cell is about rows owned by `owner`: owner acts on their own row, other_user is a different signed-in user acting on the owner's row, anon is a request with only the public anon key. For insert, the new row names the owner as its owner.",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"additionalProperties": false,
|
|
8
|
-
"required": ["version", "tables"],
|
|
9
|
-
"properties": {
|
|
10
|
-
"$schema": { "type": "string" },
|
|
11
|
-
"version": { "const": 1 },
|
|
12
|
-
"description": { "type": "string" },
|
|
13
|
-
"defaultGrants": {
|
|
14
|
-
"description": "Table grants the test database gives new public tables. supabase-legacy: anon and authenticated get all privileges on new public tables, as on existing Supabase projects (the more exposed assumption). none: no default grants, only what the migrations grant.",
|
|
15
|
-
"enum": ["supabase-legacy", "none"],
|
|
16
|
-
"default": "supabase-legacy"
|
|
17
|
-
},
|
|
18
|
-
"tables": {
|
|
19
|
-
"type": "object",
|
|
20
|
-
"minProperties": 1,
|
|
21
|
-
"propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_$]*(\\.[A-Za-z_][A-Za-z0-9_$]*)?$" },
|
|
22
|
-
"additionalProperties": { "$ref": "#/$defs/table" }
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"$defs": {
|
|
26
|
-
"table": {
|
|
27
|
-
"type": "object",
|
|
28
|
-
"additionalProperties": false,
|
|
29
|
-
"required": ["owner", "expect"],
|
|
30
|
-
"properties": {
|
|
31
|
-
"description": { "type": "string" },
|
|
32
|
-
"owner": {
|
|
33
|
-
"description": "How a row's owner is defined. Only `column = auth.uid()` is supported.",
|
|
34
|
-
"type": "object",
|
|
35
|
-
"additionalProperties": false,
|
|
36
|
-
"required": ["column", "is"],
|
|
37
|
-
"properties": {
|
|
38
|
-
"column": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_$]*$" },
|
|
39
|
-
"is": { "const": "auth.uid()" }
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
"expect": { "$ref": "#/$defs/expectation" },
|
|
43
|
-
"seed": {
|
|
44
|
-
"description": "Values for columns the test cannot fill by itself (for example a NOT NULL foreign key). Used for every seeded and inserted row. Leave the owner column out.",
|
|
45
|
-
"type": "object",
|
|
46
|
-
"propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_$]*$" },
|
|
47
|
-
"additionalProperties": { "type": ["string", "number", "boolean", "null"] }
|
|
48
|
-
},
|
|
49
|
-
"updateColumn": {
|
|
50
|
-
"description": "Column the update probe changes. Default: the first plain column that is not the owner column or part of the primary key.",
|
|
51
|
-
"type": "string",
|
|
52
|
-
"pattern": "^[A-Za-z_][A-Za-z0-9_$]*$"
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
"expectation": {
|
|
57
|
-
"type": "object",
|
|
58
|
-
"additionalProperties": false,
|
|
59
|
-
"required": ["owner", "other_user", "anon"],
|
|
60
|
-
"properties": {
|
|
61
|
-
"owner": { "$ref": "#/$defs/actorCells" },
|
|
62
|
-
"other_user": { "$ref": "#/$defs/actorCells" },
|
|
63
|
-
"anon": { "$ref": "#/$defs/actorCells" },
|
|
64
|
-
"service_role": {
|
|
65
|
-
"description": "The service role bypasses RLS, so it is never tested.",
|
|
66
|
-
"const": "excluded"
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
"actorCells": {
|
|
71
|
-
"type": "object",
|
|
72
|
-
"additionalProperties": false,
|
|
73
|
-
"required": ["select", "insert", "update", "delete"],
|
|
74
|
-
"properties": {
|
|
75
|
-
"select": { "$ref": "#/$defs/cell" },
|
|
76
|
-
"insert": { "$ref": "#/$defs/cell" },
|
|
77
|
-
"update": { "$ref": "#/$defs/cell" },
|
|
78
|
-
"delete": { "$ref": "#/$defs/cell" },
|
|
79
|
-
"reassign": {
|
|
80
|
-
"description": "Optional. Setting the owner column of the owner's row to another user: the owner giving the row away, or another user taking it. Not tested when absent.",
|
|
81
|
-
"$ref": "#/$defs/cell"
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
"cell": {
|
|
86
|
-
"description": "allow: the action must work on the owner's row. deny: it must return nothing, change nothing, or be refused with a permission error. skip: not tested (N/A).",
|
|
87
|
-
"enum": ["allow", "deny", "skip"]
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://viberaven.dev/schemas/permissions-matrix.v1.json",
|
|
4
|
+
"title": "VibeRaven permissions matrix (viberaven.permissions.json)",
|
|
5
|
+
"description": "Who may read, add, change and delete rows in each table, written by a person. `viberaven rls-test` checks the migrations against it. Never generate it from the app's own policies. Every cell is about rows owned by `owner`: owner acts on their own row, other_user is a different signed-in user acting on the owner's row, anon is a request with only the public anon key. For insert, the new row names the owner as its owner.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["version", "tables"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": { "type": "string" },
|
|
11
|
+
"version": { "const": 1 },
|
|
12
|
+
"description": { "type": "string" },
|
|
13
|
+
"defaultGrants": {
|
|
14
|
+
"description": "Table grants the test database gives new public tables. supabase-legacy: anon and authenticated get all privileges on new public tables, as on existing Supabase projects (the more exposed assumption). none: no default grants, only what the migrations grant.",
|
|
15
|
+
"enum": ["supabase-legacy", "none"],
|
|
16
|
+
"default": "supabase-legacy"
|
|
17
|
+
},
|
|
18
|
+
"tables": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"minProperties": 1,
|
|
21
|
+
"propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_$]*(\\.[A-Za-z_][A-Za-z0-9_$]*)?$" },
|
|
22
|
+
"additionalProperties": { "$ref": "#/$defs/table" }
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"$defs": {
|
|
26
|
+
"table": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["owner", "expect"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"description": { "type": "string" },
|
|
32
|
+
"owner": {
|
|
33
|
+
"description": "How a row's owner is defined. Only `column = auth.uid()` is supported.",
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"required": ["column", "is"],
|
|
37
|
+
"properties": {
|
|
38
|
+
"column": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_$]*$" },
|
|
39
|
+
"is": { "const": "auth.uid()" }
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"expect": { "$ref": "#/$defs/expectation" },
|
|
43
|
+
"seed": {
|
|
44
|
+
"description": "Values for columns the test cannot fill by itself (for example a NOT NULL foreign key). Used for every seeded and inserted row. Leave the owner column out.",
|
|
45
|
+
"type": "object",
|
|
46
|
+
"propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_$]*$" },
|
|
47
|
+
"additionalProperties": { "type": ["string", "number", "boolean", "null"] }
|
|
48
|
+
},
|
|
49
|
+
"updateColumn": {
|
|
50
|
+
"description": "Column the update probe changes. Default: the first plain column that is not the owner column or part of the primary key.",
|
|
51
|
+
"type": "string",
|
|
52
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_$]*$"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"expectation": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"additionalProperties": false,
|
|
59
|
+
"required": ["owner", "other_user", "anon"],
|
|
60
|
+
"properties": {
|
|
61
|
+
"owner": { "$ref": "#/$defs/actorCells" },
|
|
62
|
+
"other_user": { "$ref": "#/$defs/actorCells" },
|
|
63
|
+
"anon": { "$ref": "#/$defs/actorCells" },
|
|
64
|
+
"service_role": {
|
|
65
|
+
"description": "The service role bypasses RLS, so it is never tested.",
|
|
66
|
+
"const": "excluded"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"actorCells": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"additionalProperties": false,
|
|
73
|
+
"required": ["select", "insert", "update", "delete"],
|
|
74
|
+
"properties": {
|
|
75
|
+
"select": { "$ref": "#/$defs/cell" },
|
|
76
|
+
"insert": { "$ref": "#/$defs/cell" },
|
|
77
|
+
"update": { "$ref": "#/$defs/cell" },
|
|
78
|
+
"delete": { "$ref": "#/$defs/cell" },
|
|
79
|
+
"reassign": {
|
|
80
|
+
"description": "Optional. Setting the owner column of the owner's row to another user: the owner giving the row away, or another user taking it. Not tested when absent.",
|
|
81
|
+
"$ref": "#/$defs/cell"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"cell": {
|
|
86
|
+
"description": "allow: the action must work on the owner's row. deny: it must return nothing, change nothing, or be refused with a permission error. skip: not tested (N/A).",
|
|
87
|
+
"enum": ["allow", "deny", "skip"]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "VibeRaven local verification plan v1",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"schemaVersion": {
|
|
7
|
+
"const": 1
|
|
8
|
+
},
|
|
9
|
+
"checks": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"minItems": 1,
|
|
12
|
+
"maxItems": 32,
|
|
13
|
+
"items": {
|
|
14
|
+
"oneOf": [
|
|
15
|
+
{
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": {
|
|
18
|
+
"id": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"pattern": "^[a-z][a-z0-9_-]{0,39}$"
|
|
21
|
+
},
|
|
22
|
+
"conditionId": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"pattern": "^[a-z][a-z0-9_-]{0,39}$"
|
|
25
|
+
},
|
|
26
|
+
"adapter": {
|
|
27
|
+
"const": "module"
|
|
28
|
+
},
|
|
29
|
+
"module": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1,
|
|
32
|
+
"maxLength": 200,
|
|
33
|
+
"pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\\\:*?\"<>|\\u0000-\\u001f])(?!/)(?!.*//)(?!.*[. ](?:/|$))[^/]+(?:/[^/]+)*$"
|
|
34
|
+
},
|
|
35
|
+
"export": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"pattern": "^[A-Za-z_$][A-Za-z0-9_$]{0,79}$"
|
|
38
|
+
},
|
|
39
|
+
"cases": {
|
|
40
|
+
"type": "array",
|
|
41
|
+
"minItems": 1,
|
|
42
|
+
"maxItems": 32,
|
|
43
|
+
"items": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"properties": {
|
|
46
|
+
"args": {
|
|
47
|
+
"type": "array",
|
|
48
|
+
"maxItems": 16
|
|
49
|
+
},
|
|
50
|
+
"expected": {}
|
|
51
|
+
},
|
|
52
|
+
"required": [
|
|
53
|
+
"args",
|
|
54
|
+
"expected"
|
|
55
|
+
],
|
|
56
|
+
"additionalProperties": false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"required": [
|
|
61
|
+
"id",
|
|
62
|
+
"conditionId",
|
|
63
|
+
"adapter",
|
|
64
|
+
"module",
|
|
65
|
+
"export",
|
|
66
|
+
"cases"
|
|
67
|
+
],
|
|
68
|
+
"additionalProperties": false
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "object",
|
|
72
|
+
"properties": {
|
|
73
|
+
"id": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"pattern": "^[a-z][a-z0-9_-]{0,39}$"
|
|
76
|
+
},
|
|
77
|
+
"conditionId": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"pattern": "^[a-z][a-z0-9_-]{0,39}$"
|
|
80
|
+
},
|
|
81
|
+
"adapter": {
|
|
82
|
+
"const": "node-test"
|
|
83
|
+
},
|
|
84
|
+
"entry": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"minLength": 1,
|
|
87
|
+
"maxLength": 200,
|
|
88
|
+
"pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\\\:*?\"<>|\\u0000-\\u001f])(?!/)(?!.*//)(?!.*[. ](?:/|$))[^/]+(?:/[^/]+)*$"
|
|
89
|
+
},
|
|
90
|
+
"frozenPaths": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"minItems": 0,
|
|
93
|
+
"maxItems": 16,
|
|
94
|
+
"uniqueItems": true,
|
|
95
|
+
"items": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"minLength": 1,
|
|
98
|
+
"maxLength": 200,
|
|
99
|
+
"pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\\\:*?\"<>|\\u0000-\\u001f])(?!/)(?!.*//)(?!.*[. ](?:/|$))[^/]+(?:/[^/]+)*$"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"required": [
|
|
104
|
+
"id",
|
|
105
|
+
"conditionId",
|
|
106
|
+
"adapter",
|
|
107
|
+
"entry",
|
|
108
|
+
"frozenPaths"
|
|
109
|
+
],
|
|
110
|
+
"additionalProperties": false
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"type": "object",
|
|
114
|
+
"properties": {
|
|
115
|
+
"id": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"pattern": "^[a-z][a-z0-9_-]{0,39}$"
|
|
118
|
+
},
|
|
119
|
+
"conditionId": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"pattern": "^[a-z][a-z0-9_-]{0,39}$"
|
|
122
|
+
},
|
|
123
|
+
"adapter": {
|
|
124
|
+
"const": "http"
|
|
125
|
+
},
|
|
126
|
+
"module": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"minLength": 1,
|
|
129
|
+
"maxLength": 200,
|
|
130
|
+
"pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*[\\\\:*?\"<>|\\u0000-\\u001f])(?!/)(?!.*//)(?!.*[. ](?:/|$))[^/]+(?:/[^/]+)*$"
|
|
131
|
+
},
|
|
132
|
+
"export": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"pattern": "^[A-Za-z_$][A-Za-z0-9_$]{0,79}$"
|
|
135
|
+
},
|
|
136
|
+
"cases": {
|
|
137
|
+
"type": "array",
|
|
138
|
+
"minItems": 1,
|
|
139
|
+
"maxItems": 32,
|
|
140
|
+
"items": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"properties": {
|
|
143
|
+
"request": {
|
|
144
|
+
"type": "object",
|
|
145
|
+
"properties": {
|
|
146
|
+
"method": {
|
|
147
|
+
"enum": [
|
|
148
|
+
"GET",
|
|
149
|
+
"HEAD",
|
|
150
|
+
"POST",
|
|
151
|
+
"PUT",
|
|
152
|
+
"PATCH",
|
|
153
|
+
"DELETE",
|
|
154
|
+
"OPTIONS"
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
"path": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"minLength": 1,
|
|
160
|
+
"maxLength": 2048,
|
|
161
|
+
"allOf": [
|
|
162
|
+
{
|
|
163
|
+
"pattern": "^/(?!/)(?!.*%(?:0[0-9a-fA-F]|1[0-9a-fA-F]|20|7[fF]|5[cC]))[!-~]*$(?![\\s\\S])"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"not": {
|
|
167
|
+
"pattern": "[\\\\#]"
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
"headers": {
|
|
173
|
+
"type": "object",
|
|
174
|
+
"maxProperties": 8,
|
|
175
|
+
"propertyNames": {
|
|
176
|
+
"pattern": "^(?:accept|content-type|stripe-signature|x-(?:fixture|test)-[a-z0-9-]{1,40})$(?![\\s\\S])"
|
|
177
|
+
},
|
|
178
|
+
"additionalProperties": {
|
|
179
|
+
"type": "string",
|
|
180
|
+
"maxLength": 512,
|
|
181
|
+
"pattern": "^[ -~]*$(?![\\s\\S])"
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"body": {
|
|
185
|
+
"type": "string",
|
|
186
|
+
"maxLength": 8192
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"required": [
|
|
190
|
+
"method",
|
|
191
|
+
"path"
|
|
192
|
+
],
|
|
193
|
+
"additionalProperties": false,
|
|
194
|
+
"allOf": [
|
|
195
|
+
{
|
|
196
|
+
"if": {
|
|
197
|
+
"properties": {
|
|
198
|
+
"method": {
|
|
199
|
+
"enum": [
|
|
200
|
+
"GET",
|
|
201
|
+
"HEAD"
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"then": {
|
|
207
|
+
"not": {
|
|
208
|
+
"required": [
|
|
209
|
+
"body"
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
"expected": {
|
|
217
|
+
"type": "object",
|
|
218
|
+
"properties": {
|
|
219
|
+
"status": {
|
|
220
|
+
"type": "integer",
|
|
221
|
+
"minimum": 200,
|
|
222
|
+
"maximum": 599
|
|
223
|
+
},
|
|
224
|
+
"json": {},
|
|
225
|
+
"text": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"maxLength": 8192
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"required": [
|
|
231
|
+
"status"
|
|
232
|
+
],
|
|
233
|
+
"additionalProperties": false,
|
|
234
|
+
"oneOf": [
|
|
235
|
+
{
|
|
236
|
+
"required": [
|
|
237
|
+
"json"
|
|
238
|
+
],
|
|
239
|
+
"not": {
|
|
240
|
+
"required": [
|
|
241
|
+
"text"
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"required": [
|
|
247
|
+
"text"
|
|
248
|
+
],
|
|
249
|
+
"not": {
|
|
250
|
+
"required": [
|
|
251
|
+
"json"
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
],
|
|
256
|
+
"allOf": [
|
|
257
|
+
{
|
|
258
|
+
"if": {
|
|
259
|
+
"properties": {
|
|
260
|
+
"status": {
|
|
261
|
+
"enum": [
|
|
262
|
+
204,
|
|
263
|
+
205,
|
|
264
|
+
304
|
|
265
|
+
]
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"then": {
|
|
270
|
+
"required": [
|
|
271
|
+
"text"
|
|
272
|
+
],
|
|
273
|
+
"properties": {
|
|
274
|
+
"text": {
|
|
275
|
+
"const": ""
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"not": {
|
|
279
|
+
"required": [
|
|
280
|
+
"json"
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
"required": [
|
|
289
|
+
"request",
|
|
290
|
+
"expected"
|
|
291
|
+
],
|
|
292
|
+
"additionalProperties": false,
|
|
293
|
+
"allOf": [
|
|
294
|
+
{
|
|
295
|
+
"if": {
|
|
296
|
+
"properties": {
|
|
297
|
+
"request": {
|
|
298
|
+
"properties": {
|
|
299
|
+
"method": {
|
|
300
|
+
"const": "HEAD"
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"then": {
|
|
307
|
+
"properties": {
|
|
308
|
+
"expected": {
|
|
309
|
+
"required": [
|
|
310
|
+
"text"
|
|
311
|
+
],
|
|
312
|
+
"properties": {
|
|
313
|
+
"text": {
|
|
314
|
+
"const": ""
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
"not": {
|
|
318
|
+
"required": [
|
|
319
|
+
"json"
|
|
320
|
+
]
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"required": [
|
|
331
|
+
"id",
|
|
332
|
+
"conditionId",
|
|
333
|
+
"adapter",
|
|
334
|
+
"module",
|
|
335
|
+
"export",
|
|
336
|
+
"cases"
|
|
337
|
+
],
|
|
338
|
+
"additionalProperties": false
|
|
339
|
+
}
|
|
340
|
+
]
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
"required": [
|
|
345
|
+
"schemaVersion",
|
|
346
|
+
"checks"
|
|
347
|
+
],
|
|
348
|
+
"additionalProperties": false,
|
|
349
|
+
"description": "Reviewed local observations, not commands or imported proof. Runtime also bounds JSON depth/UTF-8 bytes, including HTTP request/expected bodies to 8192 bytes, rejects unknown condition IDs, and restricts node-test to preservation conditions and frozen test-owned paths. HTTP factories return unlistened Node servers; sequential requests observe volatile state only. Runtime package/config files remain candidate inputs. Expected values remain in the host comparator. Coverage completeness is a human judgment."
|
|
350
|
+
}
|