@jimhoyd/urlcode 0.5.0 → 0.5.6

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 (67) hide show
  1. package/.claude/skills/urlcode-authoring/SKILL.md +1 -1
  2. package/.claude/skills/urlcode-operations/SKILL.md +1 -1
  3. package/README.md +13 -16
  4. package/dist/BUILD-MANIFEST.json +21 -18
  5. package/dist/agents-guide.js +1 -1
  6. package/dist/authoring.js +50 -9
  7. package/dist/capabilities.js +1 -1
  8. package/dist/cli.js +20 -7
  9. package/dist/ecosystem-cli.js +6 -0
  10. package/dist/explain-cli.js +1 -1
  11. package/dist/explain.js +2 -2
  12. package/dist/extension-artifacts.js +10 -23
  13. package/dist/extension-bundles.js +8 -16
  14. package/dist/extension-transport.js +41 -0
  15. package/dist/feature-plan.js +99 -0
  16. package/dist/index.js +2 -2
  17. package/dist/mcp.js +6 -2
  18. package/dist/policies/agents.js +1 -1
  19. package/dist/policies/security.js +1 -1
  20. package/dist/policies.js +1 -1
  21. package/dist/review.js +206 -0
  22. package/dist/router.js +15 -2
  23. package/dist/scripts/operational-drills.js +1 -1
  24. package/dist/tooling.js +4 -0
  25. package/dist/types/authoring.d.ts +2 -0
  26. package/dist/types/explain.d.ts +3 -0
  27. package/dist/types/extension-artifacts.d.ts +2 -4
  28. package/dist/types/extension-transport.d.ts +31 -0
  29. package/dist/types/feature-plan.d.ts +67 -0
  30. package/dist/types/index.d.ts +2 -2
  31. package/dist/types/review.d.ts +30 -0
  32. package/dist/types/tooling.d.ts +4 -0
  33. package/dist/types/types.d.ts +9 -1
  34. package/dist/types.js +10 -3
  35. package/docs/AI-AUTHORING.md +466 -0
  36. package/docs/FUNCTION-SECURITY.md +251 -0
  37. package/docs/README.md +96 -0
  38. package/docs/TOOLING.md +422 -0
  39. package/docs/YAML-REFERENCE.md +473 -0
  40. package/examples/assets/example.yaml +3 -3
  41. package/examples/aws/example.yaml +3 -3
  42. package/examples/cloudflare/example.yaml +3 -3
  43. package/examples/compliance/README.md +1 -1
  44. package/examples/compliance/example.yaml +1 -1
  45. package/examples/conditions/example.yaml +3 -3
  46. package/examples/cookbook/README.md +4 -4
  47. package/examples/cookbook/example.yaml +3 -3
  48. package/examples/coverage-waiver/example.yaml +3 -3
  49. package/examples/egress/example.yaml +2 -2
  50. package/examples/extensions/example.yaml +1 -1
  51. package/examples/lifecycle/example.yaml +2 -2
  52. package/examples/not-found/README.md +2 -2
  53. package/examples/not-found/example.yaml +3 -3
  54. package/examples/prerender/README.md +4 -4
  55. package/examples/prerender/example.yaml +2 -2
  56. package/examples/provider-conformance/example.yaml +2 -2
  57. package/examples/shared-blocks/example.yaml +3 -3
  58. package/examples/vercel/example.yaml +3 -3
  59. package/llms-full.txt +119 -84
  60. package/llms.txt +28 -19
  61. package/package.json +19 -13
  62. package/recipes/store-crud/README.md +9 -10
  63. package/recipes/store-crud/recipe.yaml +1 -1
  64. package/schemas/urlcode.schema.json +3 -0
  65. package/skills/urlcode/SKILL.md +1 -1
  66. package/starters/default/AGENTS.md +1 -1
  67. package/starters/default/README.md +2 -2
@@ -0,0 +1,473 @@
1
+ # YAML field reference
2
+
3
+ Generated from the bundled JSON Schema by `npm run docs:reference`. Required
4
+ means required within its containing object, not that the object itself must be
5
+ present. `routes.*` means a route path; other `*` markers mean user-selected
6
+ keys. `[]` means an array item. Option rows describe union alternatives.
7
+
8
+ Read the [YAML guide](YAML-GUIDE.md) for examples and [specification](SPECIFICATION.md)
9
+ for semantic validation beyond JSON Schema. Exactly one handler is required per
10
+ route; respond.text/respond.json are mutually exclusive. Runtime defaults include
11
+ GET/HEAD, redirect 302, respond 200, default module export, and asset no-cache.
12
+ Only Set-Cookie accepts response header arrays. This table does not imply all
13
+ schema-valid combinations activate successfully.
14
+
15
+ | Field | Type | Required | Schema constraints |
16
+ |---|---|---|---|
17
+ | `version` | constant | yes | const: "1" |
18
+ | `routes` | object | yes | maxProperties: 100000 |
19
+ | `routes.*` | object | no | unknown keys rejected |
20
+ | `routes.*.methods` | array | no | default: ["GET","HEAD"]; minItems: 1; uniqueItems: true |
21
+ | `routes.*.methods[]` | string | no | enum: ["GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"] |
22
+ | `routes.*.enabled` | boolean | no | — |
23
+ | `routes.*.sandbox` | boolean | no | default: false |
24
+ | `routes.*.sandboxReason` | string | no | maxLength: 500 |
25
+ | `routes.*.coveredElsewhere` | object | no | minProperties: 1 |
26
+ | `routes.*.coveredElsewhere.*` | string | no | minLength: 1; maxLength: 500 |
27
+ | `routes.*.expires` | string | no | — |
28
+ | `routes.*.description` | string | no | maxLength: 1024 |
29
+ | `routes.*.parameters` | array | no | maxItems: 64 |
30
+ | `routes.*.parameters[]` | object | no | unknown keys rejected |
31
+ | `routes.*.parameters[].name` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_-]*$" |
32
+ | `routes.*.parameters[].in` | string | yes | enum: ["path","query","header"] |
33
+ | `routes.*.parameters[].required` | boolean | no | — |
34
+ | `routes.*.parameters[].schema` | object | yes | unknown keys rejected |
35
+ | `routes.*.parameters[].schema.type` | string | yes | enum: ["string","integer","number","boolean","array"] |
36
+ | `routes.*.parameters[].schema.enum` | array | no | minItems: 1; uniqueItems: true |
37
+ | `routes.*.parameters[].schema.enum[]` | string / number / boolean | no | — |
38
+ | `routes.*.parameters[].schema.default` | string / number / boolean / array | no | — |
39
+ | `routes.*.parameters[].schema.default[]` | string / number / boolean | no | — |
40
+ | `routes.*.parameters[].schema.minLength` | integer | no | minimum: 0; maximum: 8192 |
41
+ | `routes.*.parameters[].schema.maxLength` | integer | no | minimum: 0; maximum: 8192 |
42
+ | `routes.*.parameters[].schema.minimum` | number | no | — |
43
+ | `routes.*.parameters[].schema.maximum` | number | no | — |
44
+ | `routes.*.parameters[].schema.pattern` | string | no | minLength: 1; maxLength: 128 |
45
+ | `routes.*.parameters[].schema.format` | string | no | enum: ["uuid"] |
46
+ | `routes.*.parameters[].schema.items` | object | no | unknown keys rejected |
47
+ | `routes.*.parameters[].schema.items.type` | string | yes | enum: ["string","integer","number","boolean"] |
48
+ | `routes.*.parameters[].schema.maxItems` | integer | no | minimum: 0; maximum: 100 |
49
+ | `routes.*.redirect` | object | no | unknown keys rejected |
50
+ | `routes.*.redirect.url` | string | yes | maxLength: 8192 |
51
+ | `routes.*.redirect.status` | number | no | enum: [301,302,303,307,308] |
52
+ | `routes.*.redirect.query` | object | no | unknown keys rejected |
53
+ | `routes.*.redirect.query.pass` | one of the shapes below | no | — |
54
+ | `routes.*.redirect.query.pass (option 1)` | constant | no | const: false |
55
+ | `routes.*.redirect.query.pass (option 2)` | array | no | uniqueItems: true |
56
+ | `routes.*.redirect.query.pass (option 2)[]` | string | no | — |
57
+ | `routes.*.redirect.query.map` | object | no | — |
58
+ | `routes.*.redirect.query.map.*` | object | no | unknown keys rejected |
59
+ | `routes.*.redirect.query.map.*.from` | string | yes | enum: ["path","query","header"] |
60
+ | `routes.*.redirect.query.map.*.name` | string | yes | — |
61
+ | `routes.*.function` | one of the shapes below | no | — |
62
+ | `routes.*.function (option 1)` | string | no | minLength: 1; maxLength: 1024 |
63
+ | `routes.*.function (option 2)` | object | no | unknown keys rejected |
64
+ | `routes.*.function (option 2).source` | string | yes | maxLength: 1024 |
65
+ | `routes.*.function (option 2).export` | string | no | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
66
+ | `routes.*.function (option 2).args` | object | no | — |
67
+ | `routes.*.function (option 2).args.*` | one of the shapes below | no | — |
68
+ | `routes.*.function (option 2).args.* (option 1)` | string / number / boolean | no | — |
69
+ | `routes.*.function (option 2).args.* (option 2)` | object | no | unknown keys rejected |
70
+ | `routes.*.function (option 2).args.* (option 2).from` | string | yes | enum: ["path","query","header"] |
71
+ | `routes.*.function (option 2).args.* (option 2).name` | string | yes | — |
72
+ | `routes.*.function (option 2).args.* (option 3)` | object | no | unknown keys rejected |
73
+ | `routes.*.function (option 2).args.* (option 3).env` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
74
+ | `routes.*.function (option 2).args.* (option 4)` | object | no | unknown keys rejected |
75
+ | `routes.*.function (option 2).args.* (option 4).secret` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
76
+ | `routes.*.env` | object | no | — |
77
+ | `routes.*.env.*` | one of the shapes below | no | — |
78
+ | `routes.*.env.* (option 1)` | object | no | unknown keys rejected |
79
+ | `routes.*.env.* (option 1).value` | string | yes | — |
80
+ | `routes.*.env.* (option 2)` | object | no | unknown keys rejected |
81
+ | `routes.*.env.* (option 2).env` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
82
+ | `routes.*.env.* (option 2).default` | string | no | — |
83
+ | `routes.*.secrets` | object | no | — |
84
+ | `routes.*.secrets.*` | object | no | unknown keys rejected |
85
+ | `routes.*.secrets.*.secret` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
86
+ | `routes.*.page` | object | no | unknown keys rejected |
87
+ | `routes.*.page.file` | string | yes | minLength: 1; maxLength: 1024 |
88
+ | `routes.*.page.contentType` | string | no | maxLength: 128; pattern: "^[A-Za-z0-9!#$&^_.+-]+/[A-Za-z0-9!#$&^_.+-]+$" |
89
+ | `routes.*.page.cacheControl` | string | no | enum: ["no-cache","no-store","public, max-age=3600","public, max-age=31536000, immutable"] |
90
+ | `routes.*.download` | object | no | unknown keys rejected |
91
+ | `routes.*.download.file` | string | yes | minLength: 1; maxLength: 1024 |
92
+ | `routes.*.download.contentType` | string | no | maxLength: 128; pattern: "^[A-Za-z0-9!#$&^_.+-]+/[A-Za-z0-9!#$&^_.+-]+$" |
93
+ | `routes.*.download.cacheControl` | string | no | enum: ["no-cache","no-store","public, max-age=3600","public, max-age=31536000, immutable"] |
94
+ | `routes.*.download.filename` | string | no | minLength: 1; maxLength: 255 |
95
+ | `routes.*.static` | object | no | unknown keys rejected |
96
+ | `routes.*.static.directory` | string | yes | minLength: 1; maxLength: 1024 |
97
+ | `routes.*.static.contentType` | string | no | maxLength: 128; pattern: "^[A-Za-z0-9!#$&^_.+-]+/[A-Za-z0-9!#$&^_.+-]+$" |
98
+ | `routes.*.static.cacheControl` | string | no | enum: ["no-cache","no-store","public, max-age=3600","public, max-age=31536000, immutable"] |
99
+ | `routes.*.static.index` | string | no | pattern: "^[A-Za-z0-9_-]+\\.html$" |
100
+ | `routes.*.request` | object | no | unknown keys rejected |
101
+ | `routes.*.request.body` | object | no | unknown keys rejected |
102
+ | `routes.*.request.body.required` | boolean | no | — |
103
+ | `routes.*.request.body.maxBytes` | integer | no | minimum: 0; maximum: 1048576 |
104
+ | `routes.*.request.body.contentTypes` | array | no | minItems: 1; maxItems: 16; uniqueItems: true |
105
+ | `routes.*.request.body.contentTypes[]` | string | no | pattern: "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+$" |
106
+ | `routes.*.request.body.format` | string | no | enum: ["text","json"] |
107
+ | `routes.*.request.body.schema` | object | no | — |
108
+ | `routes.*.response` | object | no | unknown keys rejected |
109
+ | `routes.*.response.headers` | object | no | maxProperties: 64 |
110
+ | `routes.*.response.headers.*` | one of the shapes below | no | — |
111
+ | `routes.*.response.headers.* (option 1)` | string | no | maxLength: 4096 |
112
+ | `routes.*.response.headers.* (option 2)` | array | no | minItems: 1; maxItems: 16 |
113
+ | `routes.*.response.headers.* (option 2)[]` | string | no | maxLength: 4096 |
114
+ | `routes.*.respond` | object | no | unknown keys rejected |
115
+ | `routes.*.respond.status` | integer | no | minimum: 200; maximum: 599 |
116
+ | `routes.*.respond.text` | string | no | maxLength: 1048576 |
117
+ | `routes.*.respond.json` | any JSON value | no | — |
118
+ | `routes.*.middleware` | array | no | maxItems: 16 |
119
+ | `routes.*.middleware[]` | one of the shapes below | no | — |
120
+ | `routes.*.middleware[] (option 1)` | string | no | minLength: 1; maxLength: 1024 |
121
+ | `routes.*.middleware[] (option 2)` | object | no | unknown keys rejected |
122
+ | `routes.*.middleware[] (option 2).source` | string | yes | maxLength: 1024 |
123
+ | `routes.*.middleware[] (option 2).export` | string | no | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
124
+ | `routes.*.policies` | object | no | unknown keys rejected |
125
+ | `routes.*.policies.profile` | string | no | pattern: "^[a-z][a-z0-9-]{0,63}$" |
126
+ | `routes.*.policies.throttle` | one of the shapes below | no | — |
127
+ | `routes.*.policies.throttle (option 1)` | constant | no | const: false |
128
+ | `routes.*.policies.throttle (option 2)` | object | no | unknown keys rejected |
129
+ | `routes.*.policies.throttle (option 2).quota` | integer | no | minimum: 1; maximum: 1000000 |
130
+ | `routes.*.policies.throttle (option 2).window` | integer | no | minimum: 1; maximum: 86400 |
131
+ | `routes.*.policies.throttle (option 2).partition` | string | no | enum: ["client","route","client-route"]; default: "client" |
132
+ | `routes.*.policies.throttle (option 2).status` | integer | no | default: 429; minimum: 400; maximum: 599 |
133
+ | `routes.*.policies.throttle (option 2).mode` | string | no | enum: ["enforce","report"]; default: "enforce" |
134
+ | `routes.*.policies.throttle (option 2).maxKeys` | integer | no | default: 100000; minimum: 1000; maximum: 10000000 |
135
+ | `routes.*.policies.agents` | one of the shapes below | no | — |
136
+ | `routes.*.policies.agents (option 1)` | constant | no | const: false |
137
+ | `routes.*.policies.agents (option 2)` | object | no | unknown keys rejected |
138
+ | `routes.*.policies.agents (option 2).deny` | array | no | maxItems: 32; uniqueItems: true |
139
+ | `routes.*.policies.agents (option 2).deny[]` | string | no | minLength: 1; maxLength: 1024 |
140
+ | `routes.*.policies.agents (option 2).allow` | array | no | maxItems: 32; uniqueItems: true |
141
+ | `routes.*.policies.agents (option 2).allow[]` | string | no | minLength: 1; maxLength: 1024 |
142
+ | `routes.*.policies.agents (option 2).denyPatterns` | array | no | maxItems: 256; uniqueItems: true |
143
+ | `routes.*.policies.agents (option 2).denyPatterns[]` | string | no | minLength: 1; maxLength: 256 |
144
+ | `routes.*.policies.agents (option 2).allowPatterns` | array | no | maxItems: 256; uniqueItems: true |
145
+ | `routes.*.policies.agents (option 2).allowPatterns[]` | string | no | minLength: 1; maxLength: 256 |
146
+ | `routes.*.policies.agents (option 2).denyEmpty` | boolean | no | default: false |
147
+ | `routes.*.policies.agents (option 2).status` | integer | no | default: 403; minimum: 400; maximum: 599 |
148
+ | `routes.*.policies.agents (option 2).mode` | string | no | enum: ["enforce","report"]; default: "enforce" |
149
+ | `routes.*.policies.security` | one of the shapes below | no | — |
150
+ | `routes.*.policies.security (option 1)` | constant | no | const: false |
151
+ | `routes.*.policies.security (option 2)` | object | no | unknown keys rejected |
152
+ | `routes.*.policies.security (option 2).headers` | string | no | enum: ["oshp","oshp-no-csp","off"]; default: "oshp" |
153
+ | `routes.*.policies.security (option 2).set` | object | no | maxProperties: 32 |
154
+ | `routes.*.policies.security (option 2).set.*` | string | no | maxLength: 4096 |
155
+ | `routes.*.policies.security (option 2).unset` | array | no | maxItems: 32; uniqueItems: true |
156
+ | `routes.*.policies.security (option 2).unset[]` | string | no | minLength: 1; maxLength: 128 |
157
+ | `routes.*.policies.compression` | one of the shapes below | no | — |
158
+ | `routes.*.policies.compression (option 1)` | constant | no | const: false |
159
+ | `routes.*.policies.compression (option 2)` | object | no | unknown keys rejected |
160
+ | `routes.*.policies.compression (option 2).encodings` | array | no | default: ["br","gzip"]; minItems: 1; uniqueItems: true |
161
+ | `routes.*.policies.compression (option 2).encodings[]` | string | no | enum: ["br","gzip","deflate","zstd"] |
162
+ | `routes.*.policies.compression (option 2).minBytes` | integer | no | default: 1024; minimum: 0; maximum: 1048576 |
163
+ | `routes.*.policies.compression (option 2).types` | array | no | maxItems: 64; uniqueItems: true |
164
+ | `routes.*.policies.compression (option 2).types[]` | string | no | minLength: 1; maxLength: 128 |
165
+ | `routes.*.policies.compression (option 2).level` | integer | no | minimum: 1; maximum: 11 |
166
+ | `routes.*.policies.compression (option 2).allowWithSecrets` | boolean | no | default: false |
167
+ | `routes.*.policies.cache` | one of the shapes below | no | — |
168
+ | `routes.*.policies.cache (option 1)` | constant | no | const: false |
169
+ | `routes.*.policies.cache (option 2)` | object | no | unknown keys rejected |
170
+ | `routes.*.policies.cache (option 2).strategy` | string | no | enum: ["no-store","revalidate","public","immutable","swr","sie","micro","cdn-only","private"] |
171
+ | `routes.*.policies.cache (option 2).maxAge` | integer | no | minimum: 0; maximum: 31536000 |
172
+ | `routes.*.policies.cache (option 2).staleWhileRevalidate` | integer | no | minimum: 0; maximum: 31536000 |
173
+ | `routes.*.policies.cache (option 2).staleIfError` | integer | no | minimum: 0; maximum: 31536000 |
174
+ | `routes.*.policies.cache (option 2).cdnMaxAge` | integer | no | minimum: 0; maximum: 31536000 |
175
+ | `routes.*.policies.cache (option 2).originTtl` | integer | no | minimum: 0; maximum: 86400 |
176
+ | `routes.*.policies.cache (option 2).vary` | array | no | maxItems: 8; uniqueItems: true |
177
+ | `routes.*.policies.cache (option 2).vary[]` | string | no | minLength: 1; maxLength: 128 |
178
+ | `routes.*.policies.cache (option 2).statuses` | array | no | maxItems: 16; uniqueItems: true |
179
+ | `routes.*.policies.cache (option 2).statuses[]` | integer | no | minimum: 200; maximum: 599 |
180
+ | `routes.*.policies.cache (option 2).maxBytes` | integer | no | minimum: 0; maximum: 16777216 |
181
+ | `routes.*.policies.cache (option 2).maxEntries` | integer | no | minimum: 1; maximum: 1000000 |
182
+ | `routes.*.policies.cache (option 2).force` | boolean | no | default: false |
183
+ | `routes.*.policies.extensions` | one of the shapes below | no | — |
184
+ | `routes.*.policies.extensions (option 1)` | constant | no | const: false |
185
+ | `routes.*.policies.extensions (option 2)` | object | no | maxProperties: 16 |
186
+ | `routes.*.policies.extensions (option 2).*` | one of the shapes below | no | — |
187
+ | `routes.*.policies.extensions (option 2).* (option 1)` | constant | no | const: false |
188
+ | `routes.*.policies.extensions (option 2).* (option 2)` | object | no | — |
189
+ | `routes.*.match` | object | no | minProperties: 1; unknown keys rejected |
190
+ | `routes.*.match.query` | object | no | minProperties: 1; maxProperties: 16 |
191
+ | `routes.*.match.query.*` | string | no | maxLength: 1024 |
192
+ | `routes.*.match.headers` | object | no | minProperties: 1; maxProperties: 16 |
193
+ | `routes.*.match.headers.*` | string | no | maxLength: 1024 |
194
+ | `routes.*.match.cookies` | object | no | minProperties: 1; maxProperties: 16 |
195
+ | `routes.*.match.cookies.*` | string | no | maxLength: 1024 |
196
+ | `routes.*.match.host` | string | no | maxLength: 255 |
197
+ | `routes.*.match.method` | string | no | enum: ["GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"] |
198
+ | `routes.*.conditional` | object | no | unknown keys rejected |
199
+ | `routes.*.conditional.cases` | array | yes | minItems: 1; maxItems: 16 |
200
+ | `routes.*.conditional.cases[]` | object | no | unknown keys rejected |
201
+ | `routes.*.conditional.cases[].redirect` | object | no | unknown keys rejected |
202
+ | `routes.*.conditional.cases[].redirect.url` | string | yes | maxLength: 8192 |
203
+ | `routes.*.conditional.cases[].redirect.status` | number | no | enum: [301,302,303,307,308] |
204
+ | `routes.*.conditional.cases[].redirect.query` | object | no | unknown keys rejected |
205
+ | `routes.*.conditional.cases[].redirect.query.pass` | one of the shapes below | no | — |
206
+ | `routes.*.conditional.cases[].redirect.query.pass (option 1)` | constant | no | const: false |
207
+ | `routes.*.conditional.cases[].redirect.query.pass (option 2)` | array | no | uniqueItems: true |
208
+ | `routes.*.conditional.cases[].redirect.query.pass (option 2)[]` | string | no | — |
209
+ | `routes.*.conditional.cases[].redirect.query.map` | object | no | — |
210
+ | `routes.*.conditional.cases[].redirect.query.map.*` | object | no | unknown keys rejected |
211
+ | `routes.*.conditional.cases[].redirect.query.map.*.from` | string | yes | enum: ["path","query","header"] |
212
+ | `routes.*.conditional.cases[].redirect.query.map.*.name` | string | yes | — |
213
+ | `routes.*.conditional.cases[].respond` | object | no | unknown keys rejected |
214
+ | `routes.*.conditional.cases[].respond.status` | integer | no | minimum: 200; maximum: 599 |
215
+ | `routes.*.conditional.cases[].respond.text` | string | no | maxLength: 1048576 |
216
+ | `routes.*.conditional.cases[].respond.json` | any JSON value | no | — |
217
+ | `routes.*.conditional.cases[].match` | object | yes | minProperties: 1; unknown keys rejected |
218
+ | `routes.*.conditional.cases[].match.query` | object | no | minProperties: 1; maxProperties: 16 |
219
+ | `routes.*.conditional.cases[].match.query.*` | string | no | maxLength: 1024 |
220
+ | `routes.*.conditional.cases[].match.headers` | object | no | minProperties: 1; maxProperties: 16 |
221
+ | `routes.*.conditional.cases[].match.headers.*` | string | no | maxLength: 1024 |
222
+ | `routes.*.conditional.cases[].match.cookies` | object | no | minProperties: 1; maxProperties: 16 |
223
+ | `routes.*.conditional.cases[].match.cookies.*` | string | no | maxLength: 1024 |
224
+ | `routes.*.conditional.cases[].match.host` | string | no | maxLength: 255 |
225
+ | `routes.*.conditional.cases[].match.method` | string | no | enum: ["GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"] |
226
+ | `routes.*.conditional.fallback` | object | no | unknown keys rejected |
227
+ | `routes.*.conditional.fallback.redirect` | object | no | unknown keys rejected |
228
+ | `routes.*.conditional.fallback.redirect.url` | string | yes | maxLength: 8192 |
229
+ | `routes.*.conditional.fallback.redirect.status` | number | no | enum: [301,302,303,307,308] |
230
+ | `routes.*.conditional.fallback.redirect.query` | object | no | unknown keys rejected |
231
+ | `routes.*.conditional.fallback.redirect.query.pass` | one of the shapes below | no | — |
232
+ | `routes.*.conditional.fallback.redirect.query.pass (option 1)` | constant | no | const: false |
233
+ | `routes.*.conditional.fallback.redirect.query.pass (option 2)` | array | no | uniqueItems: true |
234
+ | `routes.*.conditional.fallback.redirect.query.pass (option 2)[]` | string | no | — |
235
+ | `routes.*.conditional.fallback.redirect.query.map` | object | no | — |
236
+ | `routes.*.conditional.fallback.redirect.query.map.*` | object | no | unknown keys rejected |
237
+ | `routes.*.conditional.fallback.redirect.query.map.*.from` | string | yes | enum: ["path","query","header"] |
238
+ | `routes.*.conditional.fallback.redirect.query.map.*.name` | string | yes | — |
239
+ | `routes.*.conditional.fallback.respond` | object | no | unknown keys rejected |
240
+ | `routes.*.conditional.fallback.respond.status` | integer | no | minimum: 200; maximum: 599 |
241
+ | `routes.*.conditional.fallback.respond.text` | string | no | maxLength: 1048576 |
242
+ | `routes.*.conditional.fallback.respond.json` | any JSON value | no | — |
243
+ | `routes.*.proxy` | object | no | unknown keys rejected |
244
+ | `routes.*.proxy.url` | string | yes | maxLength: 8192 |
245
+ | `routes.*.proxy.headers` | object | no | maxProperties: 32 |
246
+ | `routes.*.proxy.headers.*` | one of the shapes below | no | — |
247
+ | `routes.*.proxy.headers.* (option 1)` | string | no | maxLength: 4096 |
248
+ | `routes.*.proxy.headers.* (option 2)` | object | no | unknown keys rejected |
249
+ | `routes.*.proxy.headers.* (option 2).secret` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
250
+ | `routes.*.proxy.query` | array | no | maxItems: 32; uniqueItems: true |
251
+ | `routes.*.proxy.query[]` | string | no | minLength: 1; maxLength: 128 |
252
+ | `routes.*.proxy.requestHeaders` | array | no | maxItems: 32; uniqueItems: true |
253
+ | `routes.*.proxy.requestHeaders[]` | string | no | minLength: 1; maxLength: 128 |
254
+ | `routes.*.proxy.responseHeaders` | array | no | maxItems: 32; uniqueItems: true |
255
+ | `routes.*.proxy.responseHeaders[]` | string | no | minLength: 1; maxLength: 128 |
256
+ | `routes.*.signals` | array | no | minItems: 1; maxItems: 8 |
257
+ | `routes.*.signals[]` | object | no | unknown keys rejected |
258
+ | `routes.*.signals[].url` | string | yes | maxLength: 8192 |
259
+ | `routes.*.signals[].headers` | object | no | maxProperties: 32 |
260
+ | `routes.*.signals[].headers.*` | one of the shapes below | no | — |
261
+ | `routes.*.signals[].headers.* (option 1)` | string | no | maxLength: 4096 |
262
+ | `routes.*.signals[].headers.* (option 2)` | object | no | unknown keys rejected |
263
+ | `routes.*.signals[].headers.* (option 2).secret` | string | yes | pattern: "^[A-Za-z_][A-Za-z0-9_]*$" |
264
+ | `routes.*.extension` | string | no | pattern: "^[a-z][a-z0-9-]{0,63}$" |
265
+ | `routes.*.auth` | one of the shapes below | no | — |
266
+ | `routes.*.auth (option 1)` | constant | no | const: true |
267
+ | `routes.*.auth (option 2)` | object | no | unknown keys rejected |
268
+ | `routes.*.auth (option 2).required` | boolean | no | default: true |
269
+ | `routes.*.auth (option 2).role` | string | no | minLength: 1; maxLength: 64 |
270
+ | `routes.*.auth (option 2).permission` | string | no | minLength: 1; maxLength: 128 |
271
+ | `routes.*.auth (option 2).verified` | boolean | no | — |
272
+ | `routes.*.auth (option 2).freshWithinSeconds` | integer | no | minimum: 1; maximum: 3600 |
273
+ | `routes.*.auth (option 2).onDeny` | number / string | no | enum: [401,403,404,"sign-in"] |
274
+ | `routes.*.cache` | object | no | unknown keys rejected |
275
+ | `routes.*.cache.strategy` | string | no | enum: ["no-store","revalidate","public","immutable","swr","sie","micro","cdn-only","private"] |
276
+ | `routes.*.cache.maxAge` | integer | no | minimum: 0; maximum: 31536000 |
277
+ | `routes.*.cache.staleWhileRevalidate` | integer | no | minimum: 0; maximum: 31536000 |
278
+ | `routes.*.cache.staleIfError` | integer | no | minimum: 0; maximum: 31536000 |
279
+ | `routes.*.cache.cdnMaxAge` | integer | no | minimum: 0; maximum: 31536000 |
280
+ | `routes.*.cache.originTtl` | integer | no | minimum: 0; maximum: 86400 |
281
+ | `routes.*.cache.vary` | array | no | maxItems: 8; uniqueItems: true |
282
+ | `routes.*.cache.vary[]` | string | no | minLength: 1; maxLength: 128 |
283
+ | `routes.*.cache.statuses` | array | no | maxItems: 16; uniqueItems: true |
284
+ | `routes.*.cache.statuses[]` | integer | no | minimum: 200; maximum: 599 |
285
+ | `routes.*.cache.maxBytes` | integer | no | minimum: 0; maximum: 16777216 |
286
+ | `routes.*.cache.maxEntries` | integer | no | minimum: 1; maximum: 1000000 |
287
+ | `routes.*.cache.force` | boolean | no | default: false |
288
+ | `routes.*.use` | string | no | pattern: "^[a-z][a-z0-9-]{0,63}$" |
289
+ | `includes` | array | no | maxItems: 256; uniqueItems: true |
290
+ | `includes[]` | string | no | maxLength: 1024 |
291
+ | `policies` | object | no | unknown keys rejected |
292
+ | `policies.profile` | string | no | pattern: "^[a-z][a-z0-9-]{0,63}$" |
293
+ | `policies.throttle` | one of the shapes below | no | — |
294
+ | `policies.throttle (option 1)` | constant | no | const: false |
295
+ | `policies.throttle (option 2)` | object | no | unknown keys rejected |
296
+ | `policies.throttle (option 2).quota` | integer | no | minimum: 1; maximum: 1000000 |
297
+ | `policies.throttle (option 2).window` | integer | no | minimum: 1; maximum: 86400 |
298
+ | `policies.throttle (option 2).partition` | string | no | enum: ["client","route","client-route"]; default: "client" |
299
+ | `policies.throttle (option 2).status` | integer | no | default: 429; minimum: 400; maximum: 599 |
300
+ | `policies.throttle (option 2).mode` | string | no | enum: ["enforce","report"]; default: "enforce" |
301
+ | `policies.throttle (option 2).maxKeys` | integer | no | default: 100000; minimum: 1000; maximum: 10000000 |
302
+ | `policies.agents` | one of the shapes below | no | — |
303
+ | `policies.agents (option 1)` | constant | no | const: false |
304
+ | `policies.agents (option 2)` | object | no | unknown keys rejected |
305
+ | `policies.agents (option 2).deny` | array | no | maxItems: 32; uniqueItems: true |
306
+ | `policies.agents (option 2).deny[]` | string | no | minLength: 1; maxLength: 1024 |
307
+ | `policies.agents (option 2).allow` | array | no | maxItems: 32; uniqueItems: true |
308
+ | `policies.agents (option 2).allow[]` | string | no | minLength: 1; maxLength: 1024 |
309
+ | `policies.agents (option 2).denyPatterns` | array | no | maxItems: 256; uniqueItems: true |
310
+ | `policies.agents (option 2).denyPatterns[]` | string | no | minLength: 1; maxLength: 256 |
311
+ | `policies.agents (option 2).allowPatterns` | array | no | maxItems: 256; uniqueItems: true |
312
+ | `policies.agents (option 2).allowPatterns[]` | string | no | minLength: 1; maxLength: 256 |
313
+ | `policies.agents (option 2).denyEmpty` | boolean | no | default: false |
314
+ | `policies.agents (option 2).status` | integer | no | default: 403; minimum: 400; maximum: 599 |
315
+ | `policies.agents (option 2).mode` | string | no | enum: ["enforce","report"]; default: "enforce" |
316
+ | `policies.security` | one of the shapes below | no | — |
317
+ | `policies.security (option 1)` | constant | no | const: false |
318
+ | `policies.security (option 2)` | object | no | unknown keys rejected |
319
+ | `policies.security (option 2).headers` | string | no | enum: ["oshp","oshp-no-csp","off"]; default: "oshp" |
320
+ | `policies.security (option 2).set` | object | no | maxProperties: 32 |
321
+ | `policies.security (option 2).set.*` | string | no | maxLength: 4096 |
322
+ | `policies.security (option 2).unset` | array | no | maxItems: 32; uniqueItems: true |
323
+ | `policies.security (option 2).unset[]` | string | no | minLength: 1; maxLength: 128 |
324
+ | `policies.compression` | one of the shapes below | no | — |
325
+ | `policies.compression (option 1)` | constant | no | const: false |
326
+ | `policies.compression (option 2)` | object | no | unknown keys rejected |
327
+ | `policies.compression (option 2).encodings` | array | no | default: ["br","gzip"]; minItems: 1; uniqueItems: true |
328
+ | `policies.compression (option 2).encodings[]` | string | no | enum: ["br","gzip","deflate","zstd"] |
329
+ | `policies.compression (option 2).minBytes` | integer | no | default: 1024; minimum: 0; maximum: 1048576 |
330
+ | `policies.compression (option 2).types` | array | no | maxItems: 64; uniqueItems: true |
331
+ | `policies.compression (option 2).types[]` | string | no | minLength: 1; maxLength: 128 |
332
+ | `policies.compression (option 2).level` | integer | no | minimum: 1; maximum: 11 |
333
+ | `policies.compression (option 2).allowWithSecrets` | boolean | no | default: false |
334
+ | `policies.cache` | one of the shapes below | no | — |
335
+ | `policies.cache (option 1)` | constant | no | const: false |
336
+ | `policies.cache (option 2)` | object | no | unknown keys rejected |
337
+ | `policies.cache (option 2).strategy` | string | no | enum: ["no-store","revalidate","public","immutable","swr","sie","micro","cdn-only","private"] |
338
+ | `policies.cache (option 2).maxAge` | integer | no | minimum: 0; maximum: 31536000 |
339
+ | `policies.cache (option 2).staleWhileRevalidate` | integer | no | minimum: 0; maximum: 31536000 |
340
+ | `policies.cache (option 2).staleIfError` | integer | no | minimum: 0; maximum: 31536000 |
341
+ | `policies.cache (option 2).cdnMaxAge` | integer | no | minimum: 0; maximum: 31536000 |
342
+ | `policies.cache (option 2).originTtl` | integer | no | minimum: 0; maximum: 86400 |
343
+ | `policies.cache (option 2).vary` | array | no | maxItems: 8; uniqueItems: true |
344
+ | `policies.cache (option 2).vary[]` | string | no | minLength: 1; maxLength: 128 |
345
+ | `policies.cache (option 2).statuses` | array | no | maxItems: 16; uniqueItems: true |
346
+ | `policies.cache (option 2).statuses[]` | integer | no | minimum: 200; maximum: 599 |
347
+ | `policies.cache (option 2).maxBytes` | integer | no | minimum: 0; maximum: 16777216 |
348
+ | `policies.cache (option 2).maxEntries` | integer | no | minimum: 1; maximum: 1000000 |
349
+ | `policies.cache (option 2).force` | boolean | no | default: false |
350
+ | `policies.extensions` | one of the shapes below | no | — |
351
+ | `policies.extensions (option 1)` | constant | no | const: false |
352
+ | `policies.extensions (option 2)` | object | no | maxProperties: 16 |
353
+ | `policies.extensions (option 2).*` | one of the shapes below | no | — |
354
+ | `policies.extensions (option 2).* (option 1)` | constant | no | const: false |
355
+ | `policies.extensions (option 2).* (option 2)` | object | no | — |
356
+ | `profiles` | object | no | maxProperties: 32 |
357
+ | `profiles.*` | object | no | unknown keys rejected |
358
+ | `profiles.*.throttle` | one of the shapes below | no | — |
359
+ | `profiles.*.throttle (option 1)` | constant | no | const: false |
360
+ | `profiles.*.throttle (option 2)` | object | no | unknown keys rejected |
361
+ | `profiles.*.throttle (option 2).quota` | integer | no | minimum: 1; maximum: 1000000 |
362
+ | `profiles.*.throttle (option 2).window` | integer | no | minimum: 1; maximum: 86400 |
363
+ | `profiles.*.throttle (option 2).partition` | string | no | enum: ["client","route","client-route"]; default: "client" |
364
+ | `profiles.*.throttle (option 2).status` | integer | no | default: 429; minimum: 400; maximum: 599 |
365
+ | `profiles.*.throttle (option 2).mode` | string | no | enum: ["enforce","report"]; default: "enforce" |
366
+ | `profiles.*.throttle (option 2).maxKeys` | integer | no | default: 100000; minimum: 1000; maximum: 10000000 |
367
+ | `profiles.*.agents` | one of the shapes below | no | — |
368
+ | `profiles.*.agents (option 1)` | constant | no | const: false |
369
+ | `profiles.*.agents (option 2)` | object | no | unknown keys rejected |
370
+ | `profiles.*.agents (option 2).deny` | array | no | maxItems: 32; uniqueItems: true |
371
+ | `profiles.*.agents (option 2).deny[]` | string | no | minLength: 1; maxLength: 1024 |
372
+ | `profiles.*.agents (option 2).allow` | array | no | maxItems: 32; uniqueItems: true |
373
+ | `profiles.*.agents (option 2).allow[]` | string | no | minLength: 1; maxLength: 1024 |
374
+ | `profiles.*.agents (option 2).denyPatterns` | array | no | maxItems: 256; uniqueItems: true |
375
+ | `profiles.*.agents (option 2).denyPatterns[]` | string | no | minLength: 1; maxLength: 256 |
376
+ | `profiles.*.agents (option 2).allowPatterns` | array | no | maxItems: 256; uniqueItems: true |
377
+ | `profiles.*.agents (option 2).allowPatterns[]` | string | no | minLength: 1; maxLength: 256 |
378
+ | `profiles.*.agents (option 2).denyEmpty` | boolean | no | default: false |
379
+ | `profiles.*.agents (option 2).status` | integer | no | default: 403; minimum: 400; maximum: 599 |
380
+ | `profiles.*.agents (option 2).mode` | string | no | enum: ["enforce","report"]; default: "enforce" |
381
+ | `profiles.*.security` | one of the shapes below | no | — |
382
+ | `profiles.*.security (option 1)` | constant | no | const: false |
383
+ | `profiles.*.security (option 2)` | object | no | unknown keys rejected |
384
+ | `profiles.*.security (option 2).headers` | string | no | enum: ["oshp","oshp-no-csp","off"]; default: "oshp" |
385
+ | `profiles.*.security (option 2).set` | object | no | maxProperties: 32 |
386
+ | `profiles.*.security (option 2).set.*` | string | no | maxLength: 4096 |
387
+ | `profiles.*.security (option 2).unset` | array | no | maxItems: 32; uniqueItems: true |
388
+ | `profiles.*.security (option 2).unset[]` | string | no | minLength: 1; maxLength: 128 |
389
+ | `profiles.*.compression` | one of the shapes below | no | — |
390
+ | `profiles.*.compression (option 1)` | constant | no | const: false |
391
+ | `profiles.*.compression (option 2)` | object | no | unknown keys rejected |
392
+ | `profiles.*.compression (option 2).encodings` | array | no | default: ["br","gzip"]; minItems: 1; uniqueItems: true |
393
+ | `profiles.*.compression (option 2).encodings[]` | string | no | enum: ["br","gzip","deflate","zstd"] |
394
+ | `profiles.*.compression (option 2).minBytes` | integer | no | default: 1024; minimum: 0; maximum: 1048576 |
395
+ | `profiles.*.compression (option 2).types` | array | no | maxItems: 64; uniqueItems: true |
396
+ | `profiles.*.compression (option 2).types[]` | string | no | minLength: 1; maxLength: 128 |
397
+ | `profiles.*.compression (option 2).level` | integer | no | minimum: 1; maximum: 11 |
398
+ | `profiles.*.compression (option 2).allowWithSecrets` | boolean | no | default: false |
399
+ | `profiles.*.cache` | one of the shapes below | no | — |
400
+ | `profiles.*.cache (option 1)` | constant | no | const: false |
401
+ | `profiles.*.cache (option 2)` | object | no | unknown keys rejected |
402
+ | `profiles.*.cache (option 2).strategy` | string | no | enum: ["no-store","revalidate","public","immutable","swr","sie","micro","cdn-only","private"] |
403
+ | `profiles.*.cache (option 2).maxAge` | integer | no | minimum: 0; maximum: 31536000 |
404
+ | `profiles.*.cache (option 2).staleWhileRevalidate` | integer | no | minimum: 0; maximum: 31536000 |
405
+ | `profiles.*.cache (option 2).staleIfError` | integer | no | minimum: 0; maximum: 31536000 |
406
+ | `profiles.*.cache (option 2).cdnMaxAge` | integer | no | minimum: 0; maximum: 31536000 |
407
+ | `profiles.*.cache (option 2).originTtl` | integer | no | minimum: 0; maximum: 86400 |
408
+ | `profiles.*.cache (option 2).vary` | array | no | maxItems: 8; uniqueItems: true |
409
+ | `profiles.*.cache (option 2).vary[]` | string | no | minLength: 1; maxLength: 128 |
410
+ | `profiles.*.cache (option 2).statuses` | array | no | maxItems: 16; uniqueItems: true |
411
+ | `profiles.*.cache (option 2).statuses[]` | integer | no | minimum: 200; maximum: 599 |
412
+ | `profiles.*.cache (option 2).maxBytes` | integer | no | minimum: 0; maximum: 16777216 |
413
+ | `profiles.*.cache (option 2).maxEntries` | integer | no | minimum: 1; maximum: 1000000 |
414
+ | `profiles.*.cache (option 2).force` | boolean | no | default: false |
415
+ | `profiles.*.extensions` | one of the shapes below | no | — |
416
+ | `profiles.*.extensions (option 1)` | constant | no | const: false |
417
+ | `profiles.*.extensions (option 2)` | object | no | maxProperties: 16 |
418
+ | `profiles.*.extensions (option 2).*` | one of the shapes below | no | — |
419
+ | `profiles.*.extensions (option 2).* (option 1)` | constant | no | const: false |
420
+ | `profiles.*.extensions (option 2).* (option 2)` | object | no | — |
421
+ | `site` | object | no | unknown keys rejected |
422
+ | `site.robots` | object | no | unknown keys rejected |
423
+ | `site.robots.disallow` | array | no | maxItems: 1024; uniqueItems: true |
424
+ | `site.robots.disallow[]` | string | no | minLength: 1; maxLength: 2048 |
425
+ | `site.robots.allow` | array | no | maxItems: 1024; uniqueItems: true |
426
+ | `site.robots.allow[]` | string | no | minLength: 1; maxLength: 2048 |
427
+ | `site.robots.sitemap` | boolean | no | — |
428
+ | `site.robots.extra` | array | no | maxItems: 1024 |
429
+ | `site.robots.extra[]` | string | no | maxLength: 2048 |
430
+ | `site.sitemap` | one of the shapes below | no | — |
431
+ | `site.sitemap (option 1)` | constant | no | const: true |
432
+ | `site.sitemap (option 2)` | object | no | unknown keys rejected |
433
+ | `site.sitemap (option 2).exclude` | array | no | maxItems: 1024; uniqueItems: true |
434
+ | `site.sitemap (option 2).exclude[]` | string | no | minLength: 1; maxLength: 2048 |
435
+ | `site.sitemap (option 2).changefreq` | string | no | enum: ["always","hourly","daily","weekly","monthly","yearly","never"] |
436
+ | `site.sitemap (option 2).priority` | number | no | minimum: 0; maximum: 1 |
437
+ | `site.favicon` | string | no | minLength: 1; maxLength: 1024 |
438
+ | `site.securityTxt` | object | no | unknown keys rejected |
439
+ | `site.securityTxt.contact` | array | yes | minItems: 1; maxItems: 64 |
440
+ | `site.securityTxt.contact[]` | string | no | minLength: 1; maxLength: 2048 |
441
+ | `site.securityTxt.expires` | string | yes | pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$" |
442
+ | `site.securityTxt.policy` | array | no | maxItems: 64 |
443
+ | `site.securityTxt.policy[]` | string | no | maxLength: 2048; pattern: "^https://" |
444
+ | `site.securityTxt.acknowledgments` | array | no | maxItems: 64 |
445
+ | `site.securityTxt.acknowledgments[]` | string | no | maxLength: 2048; pattern: "^https://" |
446
+ | `site.securityTxt.preferredLanguages` | array | no | minItems: 1; maxItems: 64 |
447
+ | `site.securityTxt.preferredLanguages[]` | string | no | minLength: 2; maxLength: 35 |
448
+ | `site.securityTxt.canonical` | array | no | maxItems: 64 |
449
+ | `site.securityTxt.canonical[]` | string | no | maxLength: 2048; pattern: "^https://" |
450
+ | `site.securityTxt.encryption` | array | no | maxItems: 64 |
451
+ | `site.securityTxt.encryption[]` | string | no | minLength: 1; maxLength: 2048 |
452
+ | `site.llms` | string | no | minLength: 1; maxLength: 1024 |
453
+ | `site.notFound` | string | no | minLength: 1; maxLength: 1024; pattern: "\\.[hH][tT][mM][lL]?$" |
454
+ | `extensions` | object | no | maxProperties: 16 |
455
+ | `extensions.*` | object | no | unknown keys rejected |
456
+ | `extensions.*.version` | constant | yes | const: "1" |
457
+ | `extensions.*.config` | object | yes | — |
458
+ | `shared` | object | no | maxProperties: 32 |
459
+ | `shared.*` | object | no | unknown keys rejected |
460
+ | `shared.*.request` | object | no | unknown keys rejected |
461
+ | `shared.*.request.body` | object | no | unknown keys rejected |
462
+ | `shared.*.request.body.required` | boolean | no | — |
463
+ | `shared.*.request.body.maxBytes` | integer | no | minimum: 0; maximum: 1048576 |
464
+ | `shared.*.request.body.contentTypes` | array | no | minItems: 1; maxItems: 16; uniqueItems: true |
465
+ | `shared.*.request.body.contentTypes[]` | string | no | pattern: "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+$" |
466
+ | `shared.*.request.body.format` | string | no | enum: ["text","json"] |
467
+ | `shared.*.request.body.schema` | object | no | — |
468
+ | `shared.*.response` | object | no | unknown keys rejected |
469
+ | `shared.*.response.headers` | object | no | maxProperties: 64 |
470
+ | `shared.*.response.headers.*` | one of the shapes below | no | — |
471
+ | `shared.*.response.headers.* (option 1)` | string | no | maxLength: 4096 |
472
+ | `shared.*.response.headers.* (option 2)` | array | no | minItems: 1; maxItems: 16 |
473
+ | `shared.*.response.headers.* (option 2)[]` | string | no | maxLength: 4096 |
@@ -9,9 +9,9 @@ files: [urlcode.yaml, functions/hello.mjs, public/about.html, public/guide.txt,
9
9
  tests:
10
10
  fixtures: tests/requests.json
11
11
  commands:
12
- - node src/cli.ts validate --local --project examples/assets
13
- - node src/cli.ts test --project examples/assets
14
- - node src/cli.ts audit --project examples/assets --expect-routes 5
12
+ - node packages/core/src/cli.ts validate --local --project examples/assets
13
+ - node packages/core/src/cli.ts test --project examples/assets
14
+ - node packages/core/src/cli.ts audit --project examples/assets --expect-routes 5
15
15
  behavior:
16
16
  - native page, static and download routes serve snapshotted files with explicit caching
17
17
  - one trusted function shows the two kinds of route side by side
@@ -12,9 +12,9 @@ files: [urlcode.yaml, handler.mjs, template.yaml, public/index.html, public/note
12
12
  tests:
13
13
  fixtures: tests/requests.json
14
14
  commands:
15
- - node src/cli.ts validate --local --project examples/aws
16
- - node src/cli.ts test --project examples/aws
17
- - node src/cli.ts audit --project examples/aws --expect-routes 5
15
+ - node packages/core/src/cli.ts validate --local --project examples/aws
16
+ - node packages/core/src/cli.ts test --project examples/aws
17
+ - node packages/core/src/cli.ts audit --project examples/aws --expect-routes 5
18
18
  behavior:
19
19
  - every route is native, so the project activates on Lambda without the sandbox
20
20
  - handler.mjs wraps the project with createLambdaHandler; deployment itself is unverified evidence
@@ -12,8 +12,8 @@ files: [urlcode.yaml, wrangler.toml, tests/requests.json, README.md]
12
12
  tests:
13
13
  fixtures: tests/requests.json
14
14
  commands:
15
- - node src/cli.ts validate --local --project examples/cloudflare
16
- - node src/cli.ts test --project examples/cloudflare
17
- - node src/cli.ts audit --project examples/cloudflare --expect-routes 4
15
+ - node packages/core/src/cli.ts validate --local --project examples/cloudflare
16
+ - node packages/core/src/cli.ts test --project examples/cloudflare
17
+ - node packages/core/src/cli.ts audit --project examples/cloudflare --expect-routes 4
18
18
  behavior:
19
19
  - only capabilities the Worker lowering supports appear, so the build succeeds on every target
@@ -10,7 +10,7 @@ Run it against the cookbook from the runtime checkout. The module must be an
10
10
  absolute path outside the audited project:
11
11
 
12
12
  ```sh
13
- node src/cli.ts audit --project examples/cookbook \
13
+ node packages/core/src/cli.ts audit --project examples/cookbook \
14
14
  --compliance baseline --compliance-rules "$PWD/examples/compliance/rules.mjs" --compliance-warn
15
15
  ```
16
16
 
@@ -6,6 +6,6 @@ runnable: false
6
6
  files: [rules.mjs, README.md]
7
7
  tests:
8
8
  commands:
9
- - node src/cli.ts audit --project examples/cookbook --compliance baseline --compliance-rules "$PWD/examples/compliance/rules.mjs" --compliance-warn
9
+ - node packages/core/src/cli.ts audit --project examples/cookbook --compliance baseline --compliance-rules "$PWD/examples/compliance/rules.mjs" --compliance-warn
10
10
  behavior:
11
11
  - three custom rules run alongside the built-in profile; one built-in notice is disabled and one severity raised
@@ -12,8 +12,8 @@ files: [urlcode.yaml, tests/requests.json, README.md]
12
12
  tests:
13
13
  fixtures: tests/requests.json
14
14
  commands:
15
- - node src/cli.ts validate --local --project examples/conditions --origin https://conditions.example.test
16
- - node src/cli.ts test --project examples/conditions --origin https://conditions.example.test
17
- - node src/cli.ts audit --project examples/conditions --expect-routes 4 --origin https://conditions.example.test
15
+ - node packages/core/src/cli.ts validate --local --project examples/conditions --origin https://conditions.example.test
16
+ - node packages/core/src/cli.ts test --project examples/conditions --origin https://conditions.example.test
17
+ - node packages/core/src/cli.ts audit --project examples/conditions --expect-routes 4 --origin https://conditions.example.test
18
18
  behavior:
19
19
  - cases are provably disjoint and every branch stays no-store; no branch is authentication
@@ -11,10 +11,10 @@ external services are required. Redirects target example.com; tests never follow
11
11
  From the runtime checkout:
12
12
 
13
13
  ```sh
14
- node src/cli.ts validate --project examples/cookbook
15
- node src/cli.ts test --project examples/cookbook
16
- node src/cli.ts audit --project examples/cookbook --expect-routes 40
17
- node src/cli.ts dev --project examples/cookbook
14
+ node packages/core/src/cli.ts validate --project examples/cookbook
15
+ node packages/core/src/cli.ts test --project examples/cookbook
16
+ node packages/core/src/cli.ts audit --project examples/cookbook --expect-routes 40
17
+ node packages/core/src/cli.ts dev --project examples/cookbook
18
18
  ```
19
19
 
20
20
  The [YAML guide](../../docs/YAML-GUIDE.md) explains the recipes and binding policy.
@@ -9,9 +9,9 @@ files: [urlcode.yaml, routes/code.yaml, routes/redirects.yaml, routes/responses.
9
9
  tests:
10
10
  fixtures: tests/requests.json
11
11
  commands:
12
- - node src/cli.ts validate --local --project examples/cookbook
13
- - node src/cli.ts test --project examples/cookbook
14
- - node src/cli.ts audit --project examples/cookbook --expect-routes 40
12
+ - node packages/core/src/cli.ts validate --local --project examples/cookbook
13
+ - node packages/core/src/cli.ts test --project examples/cookbook
14
+ - node packages/core/src/cli.ts audit --project examples/cookbook --expect-routes 40
15
15
  behavior:
16
16
  - urlcode examples search finds single routes here through the generated route-index.json
17
17
  - fifteen routes exercise the fourteen middleware modules that the middleware recipe copies
@@ -9,8 +9,8 @@ files: [urlcode.yaml, functions/notes.mjs, tests/requests.json, README.md]
9
9
  tests:
10
10
  fixtures: tests/requests.json
11
11
  commands:
12
- - node src/cli.ts validate --local --project examples/coverage-waiver
13
- - node src/cli.ts test --project examples/coverage-waiver
14
- - node src/cli.ts audit --project examples/coverage-waiver --expect-routes 1
12
+ - node packages/core/src/cli.ts validate --local --project examples/coverage-waiver
13
+ - node packages/core/src/cli.ts test --project examples/coverage-waiver
14
+ - node packages/core/src/cli.ts audit --project examples/coverage-waiver --expect-routes 1
15
15
  behavior:
16
16
  - POST /notes is waived from coverage with a reason; GET is asserted by a fixture; the waiver is listed by audit, not hidden
@@ -13,7 +13,7 @@ grants:
13
13
  files: [urlcode.yaml, README.md]
14
14
  tests:
15
15
  commands:
16
- - node src/cli.ts permissions --project examples/egress
17
- - node src/cli.ts validate --local --project examples/egress --policy /operator/egress-policy.json
16
+ - node packages/core/src/cli.ts permissions --project examples/egress
17
+ - node packages/core/src/cli.ts validate --local --project examples/egress --policy /operator/egress-policy.json
18
18
  behavior:
19
19
  - without the policy the project refuses to activate; nothing here reaches the network during authoring inspection
@@ -16,6 +16,6 @@ grants:
16
16
  files: [urlcode.yaml, README.md]
17
17
  tests:
18
18
  commands:
19
- - node src/cli.ts validate --local --project examples/extensions --host-file /operator/host.mjs --origin https://extensions.example.test
19
+ - node packages/core/src/cli.ts validate --local --project examples/extensions --host-file /operator/host.mjs --origin https://extensions.example.test
20
20
  behavior:
21
21
  - "/account uses auth: {role: member}; routes and audit show the expanded policies.extensions.auth form"
@@ -12,8 +12,8 @@ files: [urlcode.yaml, functions/notes.mjs, tests/requests.json, README.md]
12
12
  tests:
13
13
  fixtures: tests/requests.json
14
14
  commands:
15
- - node src/cli.ts test --project examples/lifecycle
16
- - node src/cli.ts audit --project examples/lifecycle --expect-routes 2
15
+ - node packages/core/src/cli.ts test --project examples/lifecycle
16
+ - node packages/core/src/cli.ts audit --project examples/lifecycle --expect-routes 2
17
17
  behavior:
18
18
  - a note created by POST /notes is readable, replaceable and still present after the runtime restarts on the same data directory
19
19
  - the id and Location the create response returns are captured and substituted into later steps as {{id}} and {{where}}