@intentius/plywood 0.0.0-stage → 0.0.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/LICENSE +201 -0
- package/dist/plywood.mjs +7754 -0
- package/dist/plywood.mjs.map +7 -0
- package/package.json +43 -4
- package/plywood.schema.json +1133 -0
- package/presets/dashboards/plywood.json +83 -0
- package/presets/policy/plywood-providers/PulumiPolicy.yaml +2 -0
- package/presets/policy/plywood-providers/index.ts +29 -0
- package/presets/policy/plywood-providers/package.json +10 -0
- package/presets/policy/plywood_providers.rego.tmpl +31 -0
- package/templates/agent-guard/bin/plunge +27 -0
- package/templates/agent-guard/bin/pulumi +27 -0
- package/templates/agent-guard/plywood-guard.mjs +60 -0
- package/templates/agent-prompt.md +6 -0
- package/templates/chant.config.ts.tmpl +10 -0
- package/templates/plywood.yml +8 -0
- package/README.md +0 -3
|
@@ -0,0 +1,1133 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/plywood/plywood.schema.json",
|
|
4
|
+
"title": "plywood.yml",
|
|
5
|
+
"description": "plywood's config. Each key wraps a chant setting; plywood sets chant's keys from it, so a ci. key is refused.",
|
|
6
|
+
"$comment": "Generated from packages/plywood/src/config by scripts/build-schema.mjs; edit the group modules, then run npm run schema.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"stacks": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"description": "Each stack as project/stack. plywood init finds them when the key is absent.",
|
|
13
|
+
"propertyNames": {
|
|
14
|
+
"pattern": "^[^/\\s]+\\/[^/\\s]+$"
|
|
15
|
+
},
|
|
16
|
+
"additionalProperties": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"properties": {
|
|
20
|
+
"dir": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "The directory holding the stack's Pulumi.yaml."
|
|
23
|
+
},
|
|
24
|
+
"paths": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": {
|
|
27
|
+
"type": "string"
|
|
28
|
+
},
|
|
29
|
+
"description": "Paths whose change previews the stack, beside its directory."
|
|
30
|
+
},
|
|
31
|
+
"gate": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"enum": [
|
|
34
|
+
"always",
|
|
35
|
+
"on-destructive",
|
|
36
|
+
"never"
|
|
37
|
+
],
|
|
38
|
+
"description": "The stack's gate, in place of the top-level gate."
|
|
39
|
+
},
|
|
40
|
+
"backend": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"description": "The backend URL. A plunge+ URL (plunge+file://, plunge+s3://) picks the plunge engine."
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"waves": {
|
|
48
|
+
"description": "Lists of stacks, updated in order, the first wave the canary; or canary and after. One wave per environment when absent.",
|
|
49
|
+
"oneOf": [
|
|
50
|
+
{
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"items": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
},
|
|
57
|
+
"minItems": 1
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "object",
|
|
62
|
+
"additionalProperties": false,
|
|
63
|
+
"properties": {
|
|
64
|
+
"canary": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
},
|
|
69
|
+
"minItems": 1,
|
|
70
|
+
"description": "The stacks that update first, in a wave of their own."
|
|
71
|
+
},
|
|
72
|
+
"after": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"description": "Each stack to the stacks it updates after, beside the order its StackReferences give.",
|
|
75
|
+
"additionalProperties": {
|
|
76
|
+
"type": "array",
|
|
77
|
+
"items": {
|
|
78
|
+
"type": "string"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
"engine": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"enum": [
|
|
89
|
+
"pulumi",
|
|
90
|
+
"plunge"
|
|
91
|
+
],
|
|
92
|
+
"description": "pulumi or plunge. Absent, a plunge+ backend picks plunge, else chant reads PULUMI_BACKEND_URL and Pulumi.yaml."
|
|
93
|
+
},
|
|
94
|
+
"backend": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "The backend URL. A plunge+ URL (plunge+file://, plunge+s3://) picks the plunge engine."
|
|
97
|
+
},
|
|
98
|
+
"apply": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"additionalProperties": false,
|
|
101
|
+
"properties": {
|
|
102
|
+
"when": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"enum": [
|
|
105
|
+
"merge",
|
|
106
|
+
"pull-request"
|
|
107
|
+
],
|
|
108
|
+
"default": "merge",
|
|
109
|
+
"description": "merge, or pull-request for /plywood up before merge."
|
|
110
|
+
},
|
|
111
|
+
"requires": {
|
|
112
|
+
"type": "array",
|
|
113
|
+
"items": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"enum": [
|
|
116
|
+
"approved",
|
|
117
|
+
"mergeable",
|
|
118
|
+
"undiverged",
|
|
119
|
+
"checks"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
"uniqueItems": true,
|
|
123
|
+
"description": "What an open pull request needs before /plywood up updates it. All four when absent. Only with when: pull-request."
|
|
124
|
+
},
|
|
125
|
+
"merge": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"enum": [
|
|
128
|
+
"manual",
|
|
129
|
+
"auto"
|
|
130
|
+
],
|
|
131
|
+
"default": "manual",
|
|
132
|
+
"description": "auto merges the pull request once its update before merge applied. Only with when: pull-request."
|
|
133
|
+
},
|
|
134
|
+
"merge_token_env": {
|
|
135
|
+
"type": "string",
|
|
136
|
+
"description": "The variable holding the token the merge uses: a secret on GitHub and Forgejo, a protected variable on GitLab. Needed with merge: auto."
|
|
137
|
+
},
|
|
138
|
+
"merge_method": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"enum": [
|
|
141
|
+
"merge",
|
|
142
|
+
"squash",
|
|
143
|
+
"rebase"
|
|
144
|
+
],
|
|
145
|
+
"description": "merge, squash or rebase. The forge's default when absent."
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"locks": {
|
|
150
|
+
"type": "object",
|
|
151
|
+
"additionalProperties": false,
|
|
152
|
+
"properties": {
|
|
153
|
+
"when": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"enum": [
|
|
156
|
+
"preview",
|
|
157
|
+
"up"
|
|
158
|
+
],
|
|
159
|
+
"default": "preview",
|
|
160
|
+
"description": "preview, from the first preview, or up, from an update before merge or a /plywood lock comment."
|
|
161
|
+
},
|
|
162
|
+
"grain": {
|
|
163
|
+
"type": "string",
|
|
164
|
+
"enum": [
|
|
165
|
+
"resource",
|
|
166
|
+
"stack"
|
|
167
|
+
],
|
|
168
|
+
"description": "resource, one lock per resource, or stack, one lock per stack. Absent, resource on plunge and stack on stock Pulumi."
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
"gate": {
|
|
173
|
+
"type": "string",
|
|
174
|
+
"enum": [
|
|
175
|
+
"always",
|
|
176
|
+
"on-destructive",
|
|
177
|
+
"never"
|
|
178
|
+
],
|
|
179
|
+
"default": "on-destructive",
|
|
180
|
+
"description": "always, on-destructive or never."
|
|
181
|
+
},
|
|
182
|
+
"approval": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"enum": [
|
|
185
|
+
"ledger",
|
|
186
|
+
"sealed",
|
|
187
|
+
"pr-review"
|
|
188
|
+
],
|
|
189
|
+
"default": "ledger",
|
|
190
|
+
"description": "ledger, sealed or pr-review."
|
|
191
|
+
},
|
|
192
|
+
"approval_rules": {
|
|
193
|
+
"type": "object",
|
|
194
|
+
"description": "Role and quorum per stack glob. Read at base.",
|
|
195
|
+
"additionalProperties": {
|
|
196
|
+
"type": "object",
|
|
197
|
+
"additionalProperties": false,
|
|
198
|
+
"properties": {
|
|
199
|
+
"role": {
|
|
200
|
+
"type": "string",
|
|
201
|
+
"description": "A role .chant/trust.json gives the approvers."
|
|
202
|
+
},
|
|
203
|
+
"roles": {
|
|
204
|
+
"type": "array",
|
|
205
|
+
"items": {
|
|
206
|
+
"type": "string"
|
|
207
|
+
},
|
|
208
|
+
"description": "Roles, any of which counts."
|
|
209
|
+
},
|
|
210
|
+
"quorum": {
|
|
211
|
+
"type": "integer",
|
|
212
|
+
"minimum": 1,
|
|
213
|
+
"default": 1,
|
|
214
|
+
"description": "Distinct approvers the stacks need."
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"policy": {
|
|
220
|
+
"type": "object",
|
|
221
|
+
"additionalProperties": false,
|
|
222
|
+
"description": "Rego rules and CrossGuard policy packs in the preview job, feeding chant's gate. Read at base.",
|
|
223
|
+
"properties": {
|
|
224
|
+
"rego": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"description": "The directory of Rego rules, relative to the repository root. deny_* denies, hold_* waits for a person, warn_* is a note line."
|
|
227
|
+
},
|
|
228
|
+
"engine": {
|
|
229
|
+
"type": "string",
|
|
230
|
+
"enum": [
|
|
231
|
+
"conftest",
|
|
232
|
+
"opa"
|
|
233
|
+
],
|
|
234
|
+
"default": "conftest",
|
|
235
|
+
"description": "The result shape the rules' engine prints: conftest or opa. A hold needs opa."
|
|
236
|
+
},
|
|
237
|
+
"namespace": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"description": "The Rego package to read. conftest: every package; opa: main."
|
|
240
|
+
},
|
|
241
|
+
"command": {
|
|
242
|
+
"type": "array",
|
|
243
|
+
"items": {
|
|
244
|
+
"type": "string"
|
|
245
|
+
},
|
|
246
|
+
"minItems": 1,
|
|
247
|
+
"description": "argv in place of the engine's own; {policy} is the rules' directory at base, {input} the change set."
|
|
248
|
+
},
|
|
249
|
+
"source": {
|
|
250
|
+
"type": "object",
|
|
251
|
+
"additionalProperties": false,
|
|
252
|
+
"required": [
|
|
253
|
+
"repo",
|
|
254
|
+
"ref"
|
|
255
|
+
],
|
|
256
|
+
"description": "A shared rule set from a git ref, fetched by the job at the ref the base names (chant >= the release after 0.124.54). packs are then paths inside it.",
|
|
257
|
+
"properties": {
|
|
258
|
+
"repo": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"description": "The repository: https://, ssh:// or file:// URL, or git@<host>:<path>."
|
|
261
|
+
},
|
|
262
|
+
"ref": {
|
|
263
|
+
"type": "string",
|
|
264
|
+
"description": "A tag, a branch or a full commit."
|
|
265
|
+
},
|
|
266
|
+
"path": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"default": "policy",
|
|
269
|
+
"description": "The Rego directory inside the repository."
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"providers": {
|
|
274
|
+
"type": "array",
|
|
275
|
+
"items": {
|
|
276
|
+
"type": "string",
|
|
277
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
278
|
+
},
|
|
279
|
+
"uniqueItems": true,
|
|
280
|
+
"description": "The provider packages a stack may use, such as aws and random; component packages too. plywood init writes the allowlist as a Rego rule into policy.rego and as the CrossGuard pack policy/plywood-providers."
|
|
281
|
+
},
|
|
282
|
+
"packs": {
|
|
283
|
+
"type": "array",
|
|
284
|
+
"description": "CrossGuard packs the preview and the update run with --policy-pack. Mandatory violations deny; advisory ones are note lines.",
|
|
285
|
+
"items": {
|
|
286
|
+
"oneOf": [
|
|
287
|
+
{
|
|
288
|
+
"type": "string",
|
|
289
|
+
"description": "The pack's directory, relative to the repository root."
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"type": "object",
|
|
293
|
+
"additionalProperties": false,
|
|
294
|
+
"required": [
|
|
295
|
+
"dir"
|
|
296
|
+
],
|
|
297
|
+
"properties": {
|
|
298
|
+
"dir": {
|
|
299
|
+
"type": "string",
|
|
300
|
+
"description": "The pack's directory, relative to the repository root."
|
|
301
|
+
},
|
|
302
|
+
"config": {
|
|
303
|
+
"type": "string",
|
|
304
|
+
"description": "Its --policy-pack-config file."
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
"identity": {
|
|
314
|
+
"type": "object",
|
|
315
|
+
"additionalProperties": false,
|
|
316
|
+
"description": "The preview and up identities per cloud, for every stack and per stack glob. The preview job trades its OIDC token before the program is checked out.",
|
|
317
|
+
"properties": {
|
|
318
|
+
"preview": {
|
|
319
|
+
"type": "object",
|
|
320
|
+
"additionalProperties": false,
|
|
321
|
+
"properties": {
|
|
322
|
+
"aws": {
|
|
323
|
+
"type": "string",
|
|
324
|
+
"description": "An IAM role ARN."
|
|
325
|
+
},
|
|
326
|
+
"gcp": {
|
|
327
|
+
"type": "string",
|
|
328
|
+
"description": "A service account email."
|
|
329
|
+
},
|
|
330
|
+
"azure": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"description": "An Entra app's client id."
|
|
333
|
+
},
|
|
334
|
+
"pulumi": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"pattern": "^(?:(?:team|user):[^\\s:]+|organization|organization:admin)$",
|
|
337
|
+
"description": "A Pulumi Cloud token: team:<name>, user:<login>, organization or organization:admin."
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
"description": "The preview job's identity per cloud, for every stack."
|
|
341
|
+
},
|
|
342
|
+
"up": {
|
|
343
|
+
"type": "object",
|
|
344
|
+
"additionalProperties": false,
|
|
345
|
+
"properties": {
|
|
346
|
+
"aws": {
|
|
347
|
+
"type": "string",
|
|
348
|
+
"description": "An IAM role ARN."
|
|
349
|
+
},
|
|
350
|
+
"gcp": {
|
|
351
|
+
"type": "string",
|
|
352
|
+
"description": "A service account email."
|
|
353
|
+
},
|
|
354
|
+
"azure": {
|
|
355
|
+
"type": "string",
|
|
356
|
+
"description": "An Entra app's client id."
|
|
357
|
+
},
|
|
358
|
+
"pulumi": {
|
|
359
|
+
"type": "string",
|
|
360
|
+
"pattern": "^(?:(?:team|user):[^\\s:]+|organization|organization:admin)$",
|
|
361
|
+
"description": "A Pulumi Cloud token: team:<name>, user:<login>, organization or organization:admin."
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"description": "The update job's identity per cloud, for every stack."
|
|
365
|
+
},
|
|
366
|
+
"stacks": {
|
|
367
|
+
"type": "object",
|
|
368
|
+
"description": "Stack glob (project/stack; * stays within one segment) to its own preview and up identities. The first glob that matches a stack is its.",
|
|
369
|
+
"additionalProperties": {
|
|
370
|
+
"type": "object",
|
|
371
|
+
"additionalProperties": false,
|
|
372
|
+
"properties": {
|
|
373
|
+
"preview": {
|
|
374
|
+
"type": "object",
|
|
375
|
+
"additionalProperties": false,
|
|
376
|
+
"properties": {
|
|
377
|
+
"aws": {
|
|
378
|
+
"type": "string",
|
|
379
|
+
"description": "An IAM role ARN."
|
|
380
|
+
},
|
|
381
|
+
"gcp": {
|
|
382
|
+
"type": "string",
|
|
383
|
+
"description": "A service account email."
|
|
384
|
+
},
|
|
385
|
+
"azure": {
|
|
386
|
+
"type": "string",
|
|
387
|
+
"description": "An Entra app's client id."
|
|
388
|
+
},
|
|
389
|
+
"pulumi": {
|
|
390
|
+
"type": "string",
|
|
391
|
+
"pattern": "^(?:(?:team|user):[^\\s:]+|organization|organization:admin)$",
|
|
392
|
+
"description": "A Pulumi Cloud token: team:<name>, user:<login>, organization or organization:admin."
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
"up": {
|
|
397
|
+
"type": "object",
|
|
398
|
+
"additionalProperties": false,
|
|
399
|
+
"properties": {
|
|
400
|
+
"aws": {
|
|
401
|
+
"type": "string",
|
|
402
|
+
"description": "An IAM role ARN."
|
|
403
|
+
},
|
|
404
|
+
"gcp": {
|
|
405
|
+
"type": "string",
|
|
406
|
+
"description": "A service account email."
|
|
407
|
+
},
|
|
408
|
+
"azure": {
|
|
409
|
+
"type": "string",
|
|
410
|
+
"description": "An Entra app's client id."
|
|
411
|
+
},
|
|
412
|
+
"pulumi": {
|
|
413
|
+
"type": "string",
|
|
414
|
+
"pattern": "^(?:(?:team|user):[^\\s:]+|organization|organization:admin)$",
|
|
415
|
+
"description": "A Pulumi Cloud token: team:<name>, user:<login>, organization or organization:admin."
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
"environments": {
|
|
420
|
+
"type": "array",
|
|
421
|
+
"items": {
|
|
422
|
+
"type": "string"
|
|
423
|
+
},
|
|
424
|
+
"description": "Environment globs the rule covers. Absent: every environment."
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
"aws": {
|
|
430
|
+
"type": "object",
|
|
431
|
+
"additionalProperties": false,
|
|
432
|
+
"properties": {
|
|
433
|
+
"region": {
|
|
434
|
+
"type": "string"
|
|
435
|
+
},
|
|
436
|
+
"audience": {
|
|
437
|
+
"type": "string"
|
|
438
|
+
},
|
|
439
|
+
"endpoint": {
|
|
440
|
+
"type": "string"
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
"gcp": {
|
|
445
|
+
"type": "object",
|
|
446
|
+
"additionalProperties": false,
|
|
447
|
+
"properties": {
|
|
448
|
+
"provider": {
|
|
449
|
+
"type": "string"
|
|
450
|
+
},
|
|
451
|
+
"audience": {
|
|
452
|
+
"type": "string"
|
|
453
|
+
},
|
|
454
|
+
"sts_endpoint": {
|
|
455
|
+
"type": "string"
|
|
456
|
+
},
|
|
457
|
+
"iam_endpoint": {
|
|
458
|
+
"type": "string"
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
"azure": {
|
|
463
|
+
"type": "object",
|
|
464
|
+
"additionalProperties": false,
|
|
465
|
+
"properties": {
|
|
466
|
+
"tenant_id": {
|
|
467
|
+
"type": "string"
|
|
468
|
+
},
|
|
469
|
+
"subscription_id": {
|
|
470
|
+
"type": "string"
|
|
471
|
+
},
|
|
472
|
+
"audience": {
|
|
473
|
+
"type": "string"
|
|
474
|
+
},
|
|
475
|
+
"authority": {
|
|
476
|
+
"type": "string"
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
"pulumi_cloud": {
|
|
483
|
+
"type": "object",
|
|
484
|
+
"additionalProperties": false,
|
|
485
|
+
"required": [
|
|
486
|
+
"org"
|
|
487
|
+
],
|
|
488
|
+
"description": "The Pulumi Cloud organization the stacks' state is in. With identity's pulumi tokens, each job trades for its own access token.",
|
|
489
|
+
"properties": {
|
|
490
|
+
"org": {
|
|
491
|
+
"type": "string",
|
|
492
|
+
"description": "The organization."
|
|
493
|
+
},
|
|
494
|
+
"api_url": {
|
|
495
|
+
"type": "string",
|
|
496
|
+
"description": "The Pulumi Cloud API, for a self-hosted one. Default https://api.pulumi.com."
|
|
497
|
+
},
|
|
498
|
+
"audience": {
|
|
499
|
+
"type": "string",
|
|
500
|
+
"description": "The OIDC token's audience. Default urn:pulumi:org:<org>."
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
"review_stacks": {
|
|
505
|
+
"type": "object",
|
|
506
|
+
"additionalProperties": false,
|
|
507
|
+
"required": [
|
|
508
|
+
"template"
|
|
509
|
+
],
|
|
510
|
+
"description": "A stack per open pull request. Off when absent.",
|
|
511
|
+
"properties": {
|
|
512
|
+
"template": {
|
|
513
|
+
"type": "string",
|
|
514
|
+
"description": "The stack whose config a review stack starts from, as project/stack."
|
|
515
|
+
},
|
|
516
|
+
"name": {
|
|
517
|
+
"type": "string",
|
|
518
|
+
"pattern": "^pr-\\{number\\}(?:-[a-z0-9][a-z0-9-]*)?$",
|
|
519
|
+
"default": "pr-{number}",
|
|
520
|
+
"description": "The review stack's name: pr-{number}, or pr-{number}-<suffix>. Only stacks named so are destroyed."
|
|
521
|
+
},
|
|
522
|
+
"ttl": {
|
|
523
|
+
"type": "string",
|
|
524
|
+
"pattern": "^\\d+[mhd]$",
|
|
525
|
+
"description": "How long a review stack lives after its last update, such as 72h. chant's default when absent."
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
},
|
|
529
|
+
"notify": {
|
|
530
|
+
"type": "object",
|
|
531
|
+
"additionalProperties": false,
|
|
532
|
+
"description": "Chat and webhook messages when a wave waits, an update is refused or fails, or drift is found. Each value names a variable.",
|
|
533
|
+
"properties": {
|
|
534
|
+
"slack": {
|
|
535
|
+
"type": "object",
|
|
536
|
+
"additionalProperties": false,
|
|
537
|
+
"required": [
|
|
538
|
+
"webhook"
|
|
539
|
+
],
|
|
540
|
+
"properties": {
|
|
541
|
+
"webhook": {
|
|
542
|
+
"type": "string",
|
|
543
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
|
|
544
|
+
"description": "The variable holding the incoming webhook's URL."
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
},
|
|
548
|
+
"teams": {
|
|
549
|
+
"type": "object",
|
|
550
|
+
"additionalProperties": false,
|
|
551
|
+
"required": [
|
|
552
|
+
"webhook"
|
|
553
|
+
],
|
|
554
|
+
"properties": {
|
|
555
|
+
"webhook": {
|
|
556
|
+
"type": "string",
|
|
557
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
|
|
558
|
+
"description": "The variable holding the incoming webhook's URL."
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"webhook": {
|
|
563
|
+
"type": "object",
|
|
564
|
+
"additionalProperties": false,
|
|
565
|
+
"required": [
|
|
566
|
+
"url",
|
|
567
|
+
"key"
|
|
568
|
+
],
|
|
569
|
+
"description": "A generic webhook; each chant.notify/v1 event is signed with the key.",
|
|
570
|
+
"properties": {
|
|
571
|
+
"url": {
|
|
572
|
+
"type": "string",
|
|
573
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
|
|
574
|
+
"description": "The variable holding the webhook's URL."
|
|
575
|
+
},
|
|
576
|
+
"key": {
|
|
577
|
+
"type": "string",
|
|
578
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
|
|
579
|
+
"description": "The variable holding the signing key."
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
"on": {
|
|
584
|
+
"type": "array",
|
|
585
|
+
"items": {
|
|
586
|
+
"type": "string",
|
|
587
|
+
"enum": [
|
|
588
|
+
"wave-waiting",
|
|
589
|
+
"up-refused",
|
|
590
|
+
"up-failed",
|
|
591
|
+
"drift"
|
|
592
|
+
]
|
|
593
|
+
},
|
|
594
|
+
"description": "The events to send. Default: all of them."
|
|
595
|
+
},
|
|
596
|
+
"relay": {
|
|
597
|
+
"type": "string",
|
|
598
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
|
|
599
|
+
"description": "The variable holding the relay key. A waiting wave's Slack and Teams messages then carry the approval that plywood notify relay records."
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
"telemetry": {
|
|
604
|
+
"type": "object",
|
|
605
|
+
"additionalProperties": false,
|
|
606
|
+
"description": "One OpenTelemetry trace per run over OTLP/HTTP, with a span per stack. OTEL_* variables in the job win over these.",
|
|
607
|
+
"properties": {
|
|
608
|
+
"endpoint": {
|
|
609
|
+
"type": "string",
|
|
610
|
+
"description": "The OTLP/HTTP base URL; /v1/traces is added."
|
|
611
|
+
},
|
|
612
|
+
"headers_env": {
|
|
613
|
+
"type": "string",
|
|
614
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
|
|
615
|
+
"description": "The variable holding the OTLP headers, k=v,k2=v2."
|
|
616
|
+
},
|
|
617
|
+
"service_name": {
|
|
618
|
+
"type": "string",
|
|
619
|
+
"default": "plywood",
|
|
620
|
+
"description": "The trace's service.name."
|
|
621
|
+
},
|
|
622
|
+
"traces": {
|
|
623
|
+
"type": "boolean",
|
|
624
|
+
"default": true,
|
|
625
|
+
"description": "false turns traces off."
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
},
|
|
629
|
+
"reports": {
|
|
630
|
+
"type": "object",
|
|
631
|
+
"additionalProperties": false,
|
|
632
|
+
"required": [
|
|
633
|
+
"url"
|
|
634
|
+
],
|
|
635
|
+
"description": "Where each run's HTML report is kept.",
|
|
636
|
+
"properties": {
|
|
637
|
+
"url": {
|
|
638
|
+
"type": "string",
|
|
639
|
+
"description": "s3://<bucket>/<prefix>, gs://<bucket>/<prefix>, az://<account>/<container>/<prefix> or file://<dir>."
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
},
|
|
643
|
+
"drift": {
|
|
644
|
+
"type": "object",
|
|
645
|
+
"additionalProperties": false,
|
|
646
|
+
"description": "The scheduled drift check. Off when absent.",
|
|
647
|
+
"properties": {
|
|
648
|
+
"schedule": {
|
|
649
|
+
"type": "string",
|
|
650
|
+
"description": "A five-field cron line, such as \"0 6 * * *\"; the drift job runs on it."
|
|
651
|
+
},
|
|
652
|
+
"stacks": {
|
|
653
|
+
"type": "array",
|
|
654
|
+
"items": {
|
|
655
|
+
"type": "string"
|
|
656
|
+
},
|
|
657
|
+
"description": "The stacks the job reads, by name or project/* glob. Every stack when absent."
|
|
658
|
+
},
|
|
659
|
+
"audit_log": {
|
|
660
|
+
"description": "aws or aws:<region>, or a stack glob to one: the CloudTrail plywood drift reads to name who changed each drifted attribute.",
|
|
661
|
+
"oneOf": [
|
|
662
|
+
{
|
|
663
|
+
"type": "string",
|
|
664
|
+
"pattern": "^aws(?::[a-z0-9-]+)?$"
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
"type": "object",
|
|
668
|
+
"additionalProperties": {
|
|
669
|
+
"type": "string",
|
|
670
|
+
"pattern": "^aws(?::[a-z0-9-]+)?$"
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
]
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
},
|
|
677
|
+
"respond": {
|
|
678
|
+
"type": "object",
|
|
679
|
+
"additionalProperties": false,
|
|
680
|
+
"description": "What plywood does about a finding.",
|
|
681
|
+
"properties": {
|
|
682
|
+
"drift": {
|
|
683
|
+
"type": "string",
|
|
684
|
+
"enum": [
|
|
685
|
+
"issue",
|
|
686
|
+
"pull-request",
|
|
687
|
+
"up",
|
|
688
|
+
"none"
|
|
689
|
+
],
|
|
690
|
+
"default": "issue",
|
|
691
|
+
"description": "issue: one issue per drifted stack; pull-request: the issue and the drift agent's pull request; up: the issue and a gated update; none: the exit code only."
|
|
692
|
+
},
|
|
693
|
+
"wave_refused": {
|
|
694
|
+
"type": "string",
|
|
695
|
+
"enum": [
|
|
696
|
+
"diff",
|
|
697
|
+
"off"
|
|
698
|
+
],
|
|
699
|
+
"default": "diff",
|
|
700
|
+
"description": "diff: a refused wave posts the diff against the approved preview; off: nothing."
|
|
701
|
+
},
|
|
702
|
+
"apply_failed": {
|
|
703
|
+
"type": "string",
|
|
704
|
+
"enum": [
|
|
705
|
+
"triage",
|
|
706
|
+
"off"
|
|
707
|
+
],
|
|
708
|
+
"default": "triage",
|
|
709
|
+
"description": "triage: a failed update posts the stacks and resources that failed, with the error; off: nothing."
|
|
710
|
+
},
|
|
711
|
+
"description": {
|
|
712
|
+
"type": "string",
|
|
713
|
+
"enum": [
|
|
714
|
+
"off",
|
|
715
|
+
"check"
|
|
716
|
+
],
|
|
717
|
+
"default": "off",
|
|
718
|
+
"description": "check: flag a pull request whose description leaves out what its preview deletes or replaces. Needs decide."
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
},
|
|
722
|
+
"decide": {
|
|
723
|
+
"type": "object",
|
|
724
|
+
"additionalProperties": false,
|
|
725
|
+
"description": "The decide service respond.description: check asks.",
|
|
726
|
+
"properties": {
|
|
727
|
+
"backend": {
|
|
728
|
+
"type": "string",
|
|
729
|
+
"description": "A decide.backends entry of chant.config, read at the target branch."
|
|
730
|
+
},
|
|
731
|
+
"model": {
|
|
732
|
+
"type": "string",
|
|
733
|
+
"description": "The pinned model id."
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
},
|
|
737
|
+
"review": {
|
|
738
|
+
"description": "A model reviews each pull request and posts one note. It approves and gates nothing. Off when absent.",
|
|
739
|
+
"oneOf": [
|
|
740
|
+
{
|
|
741
|
+
"type": "boolean"
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
"type": "object",
|
|
745
|
+
"additionalProperties": false,
|
|
746
|
+
"properties": {
|
|
747
|
+
"instructions": {
|
|
748
|
+
"type": "string",
|
|
749
|
+
"description": "The instructions file, read from the base branch. Default .chant/review.md."
|
|
750
|
+
},
|
|
751
|
+
"command": {
|
|
752
|
+
"type": "string",
|
|
753
|
+
"description": "The model command: the prompt on stdin, the answer on stdout."
|
|
754
|
+
},
|
|
755
|
+
"key_env": {
|
|
756
|
+
"type": "string",
|
|
757
|
+
"default": "ANTHROPIC_API_KEY",
|
|
758
|
+
"description": "The variable holding the model's key, the one secret the command sees."
|
|
759
|
+
},
|
|
760
|
+
"timeout": {
|
|
761
|
+
"type": "integer",
|
|
762
|
+
"minimum": 1,
|
|
763
|
+
"description": "Minutes the command may run."
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
]
|
|
768
|
+
},
|
|
769
|
+
"agent": {
|
|
770
|
+
"type": "object",
|
|
771
|
+
"additionalProperties": false,
|
|
772
|
+
"description": "Agents that act on a request: /plywood agent <ask>, and the drift agent's pull request.",
|
|
773
|
+
"properties": {
|
|
774
|
+
"comment": {
|
|
775
|
+
"type": "boolean",
|
|
776
|
+
"default": false,
|
|
777
|
+
"description": "Answer /plywood agent <ask> on a pull request."
|
|
778
|
+
},
|
|
779
|
+
"drift": {
|
|
780
|
+
"type": "boolean",
|
|
781
|
+
"default": false,
|
|
782
|
+
"description": "Open a pull request that fixes a drifted stack (respond.drift: pull-request)."
|
|
783
|
+
},
|
|
784
|
+
"command": {
|
|
785
|
+
"type": "string",
|
|
786
|
+
"description": "The model command: the prompt on stdin, the answer on stdout."
|
|
787
|
+
},
|
|
788
|
+
"key_env": {
|
|
789
|
+
"type": "string",
|
|
790
|
+
"default": "ANTHROPIC_API_KEY",
|
|
791
|
+
"description": "The variable holding the model's key, the one secret the command sees."
|
|
792
|
+
},
|
|
793
|
+
"timeout": {
|
|
794
|
+
"type": "integer",
|
|
795
|
+
"minimum": 1,
|
|
796
|
+
"description": "Minutes the command may run."
|
|
797
|
+
},
|
|
798
|
+
"max_runs": {
|
|
799
|
+
"type": "integer",
|
|
800
|
+
"minimum": 1,
|
|
801
|
+
"description": "The most agent runs per day."
|
|
802
|
+
},
|
|
803
|
+
"token_env": {
|
|
804
|
+
"type": "string",
|
|
805
|
+
"description": "The secret (GitHub, Forgejo) or protected variable (GitLab) holding the token the push job pushes the agent's branch with. Default: the job token on GitHub and Forgejo, CHANT_FORGE_TOKEN on GitLab. A GitHub push with the job token starts no workflow, so the agent's commit gets no preview."
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
},
|
|
809
|
+
"branches": {
|
|
810
|
+
"type": "object",
|
|
811
|
+
"additionalProperties": {
|
|
812
|
+
"type": "array",
|
|
813
|
+
"items": {
|
|
814
|
+
"type": "string"
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
"description": "Branch name to stack globs. A stack a glob matches updates from that branch alone."
|
|
818
|
+
},
|
|
819
|
+
"labels": {
|
|
820
|
+
"type": "object",
|
|
821
|
+
"additionalProperties": {
|
|
822
|
+
"type": "array",
|
|
823
|
+
"items": {
|
|
824
|
+
"type": "string"
|
|
825
|
+
}
|
|
826
|
+
},
|
|
827
|
+
"description": "Pull request label to stack globs. A labelled pull request previews only the stacks its labels match."
|
|
828
|
+
},
|
|
829
|
+
"forge": {
|
|
830
|
+
"type": "object",
|
|
831
|
+
"additionalProperties": false,
|
|
832
|
+
"description": "The forge the jobs talk to. Read from the repository's remote when absent.",
|
|
833
|
+
"properties": {
|
|
834
|
+
"kind": {
|
|
835
|
+
"type": "string",
|
|
836
|
+
"enum": [
|
|
837
|
+
"github",
|
|
838
|
+
"gitlab",
|
|
839
|
+
"forgejo"
|
|
840
|
+
]
|
|
841
|
+
},
|
|
842
|
+
"url": {
|
|
843
|
+
"type": "string",
|
|
844
|
+
"description": "The forge's base URL, for a self-hosted forge."
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
},
|
|
848
|
+
"pulumi": {
|
|
849
|
+
"description": "The Pulumi CLI release the jobs run, such as 3.272.0: one for every stack, or a map of stack glob to release. plywood's image's release when absent.",
|
|
850
|
+
"anyOf": [
|
|
851
|
+
{
|
|
852
|
+
"type": "string",
|
|
853
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$"
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
"type": "object",
|
|
857
|
+
"minProperties": 1,
|
|
858
|
+
"additionalProperties": {
|
|
859
|
+
"type": "string",
|
|
860
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$"
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
]
|
|
864
|
+
},
|
|
865
|
+
"plunge": {
|
|
866
|
+
"description": "The plunge release the jobs run, such as 0.1.0: one for every stack, or a map of stack glob to release. plywood's image's release when absent.",
|
|
867
|
+
"anyOf": [
|
|
868
|
+
{
|
|
869
|
+
"type": "string",
|
|
870
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$"
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
"type": "object",
|
|
874
|
+
"minProperties": 1,
|
|
875
|
+
"additionalProperties": {
|
|
876
|
+
"type": "string",
|
|
877
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$"
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
]
|
|
881
|
+
},
|
|
882
|
+
"image": {
|
|
883
|
+
"description": "The image every job runs in, in place of plywood's: a reference pinned by digest, or a map with name and the plugins a prepared image carries.",
|
|
884
|
+
"anyOf": [
|
|
885
|
+
{
|
|
886
|
+
"type": "string"
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
"type": "object",
|
|
890
|
+
"additionalProperties": false,
|
|
891
|
+
"properties": {
|
|
892
|
+
"name": {
|
|
893
|
+
"type": "string",
|
|
894
|
+
"description": "The image reference, built FROM plywood-pulumi or plywood-plunge, pinned by digest."
|
|
895
|
+
},
|
|
896
|
+
"plugins": {
|
|
897
|
+
"type": "array",
|
|
898
|
+
"items": {
|
|
899
|
+
"type": "string",
|
|
900
|
+
"pattern": "^(?:(resource|converter|language|analyzer|tool):)?([a-z0-9][a-z0-9-]*)@(\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?)$"
|
|
901
|
+
},
|
|
902
|
+
"description": "Plugins the prepared image installs, as name@version or kind:name@version."
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
]
|
|
907
|
+
},
|
|
908
|
+
"runners": {
|
|
909
|
+
"description": "The runner every job runs on: a label, a list of labels, or a GitHub runner group; or default, preview, up and drift each mapped to one. runs-on on GitHub and Forgejo, tags on GitLab.",
|
|
910
|
+
"anyOf": [
|
|
911
|
+
{
|
|
912
|
+
"anyOf": [
|
|
913
|
+
{
|
|
914
|
+
"type": "string",
|
|
915
|
+
"pattern": "^[^\\s,]+$"
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
"type": "array",
|
|
919
|
+
"items": {
|
|
920
|
+
"type": "string",
|
|
921
|
+
"pattern": "^[^\\s,]+$"
|
|
922
|
+
},
|
|
923
|
+
"minItems": 1,
|
|
924
|
+
"uniqueItems": true
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
"type": "object",
|
|
928
|
+
"additionalProperties": false,
|
|
929
|
+
"required": [
|
|
930
|
+
"group"
|
|
931
|
+
],
|
|
932
|
+
"properties": {
|
|
933
|
+
"group": {
|
|
934
|
+
"type": "string",
|
|
935
|
+
"minLength": 1
|
|
936
|
+
},
|
|
937
|
+
"labels": {
|
|
938
|
+
"type": "array",
|
|
939
|
+
"items": {
|
|
940
|
+
"type": "string",
|
|
941
|
+
"pattern": "^[^\\s,]+$"
|
|
942
|
+
},
|
|
943
|
+
"minItems": 1,
|
|
944
|
+
"uniqueItems": true
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
]
|
|
949
|
+
},
|
|
950
|
+
{
|
|
951
|
+
"type": "object",
|
|
952
|
+
"minProperties": 1,
|
|
953
|
+
"not": {
|
|
954
|
+
"required": [
|
|
955
|
+
"group"
|
|
956
|
+
]
|
|
957
|
+
},
|
|
958
|
+
"propertyNames": {
|
|
959
|
+
"enum": [
|
|
960
|
+
"default",
|
|
961
|
+
"preview",
|
|
962
|
+
"up",
|
|
963
|
+
"drift"
|
|
964
|
+
]
|
|
965
|
+
},
|
|
966
|
+
"additionalProperties": {
|
|
967
|
+
"anyOf": [
|
|
968
|
+
{
|
|
969
|
+
"type": "string",
|
|
970
|
+
"pattern": "^[^\\s,]+$"
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
"type": "array",
|
|
974
|
+
"items": {
|
|
975
|
+
"type": "string",
|
|
976
|
+
"pattern": "^[^\\s,]+$"
|
|
977
|
+
},
|
|
978
|
+
"minItems": 1,
|
|
979
|
+
"uniqueItems": true
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
"type": "object",
|
|
983
|
+
"additionalProperties": false,
|
|
984
|
+
"required": [
|
|
985
|
+
"group"
|
|
986
|
+
],
|
|
987
|
+
"properties": {
|
|
988
|
+
"group": {
|
|
989
|
+
"type": "string",
|
|
990
|
+
"minLength": 1
|
|
991
|
+
},
|
|
992
|
+
"labels": {
|
|
993
|
+
"type": "array",
|
|
994
|
+
"items": {
|
|
995
|
+
"type": "string",
|
|
996
|
+
"pattern": "^[^\\s,]+$"
|
|
997
|
+
},
|
|
998
|
+
"minItems": 1,
|
|
999
|
+
"uniqueItems": true
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
]
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
]
|
|
1007
|
+
},
|
|
1008
|
+
"env": {
|
|
1009
|
+
"description": "Variables every job runs with: the waves, the drift jobs and the pull request jobs. Values are written into the workflow, so put a secret under pass.",
|
|
1010
|
+
"type": "object",
|
|
1011
|
+
"propertyNames": {
|
|
1012
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
1013
|
+
},
|
|
1014
|
+
"additionalProperties": {
|
|
1015
|
+
"type": [
|
|
1016
|
+
"string",
|
|
1017
|
+
"number",
|
|
1018
|
+
"boolean"
|
|
1019
|
+
]
|
|
1020
|
+
}
|
|
1021
|
+
},
|
|
1022
|
+
"pass": {
|
|
1023
|
+
"description": "Secrets the jobs read as variables, named and never written: a list of secret names, each passed under its own name, or a map of variable to secret.",
|
|
1024
|
+
"anyOf": [
|
|
1025
|
+
{
|
|
1026
|
+
"type": "array",
|
|
1027
|
+
"items": {
|
|
1028
|
+
"type": "string",
|
|
1029
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
1030
|
+
},
|
|
1031
|
+
"uniqueItems": true
|
|
1032
|
+
},
|
|
1033
|
+
{
|
|
1034
|
+
"type": "object",
|
|
1035
|
+
"propertyNames": {
|
|
1036
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
1037
|
+
},
|
|
1038
|
+
"additionalProperties": {
|
|
1039
|
+
"type": "string",
|
|
1040
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
]
|
|
1044
|
+
},
|
|
1045
|
+
"parallelism": {
|
|
1046
|
+
"description": "The most stacks a pull request previews at once in a wave, and the most a wave updates at once. Default: every stack of a wave at once in a preview, one at a time in an update.",
|
|
1047
|
+
"type": "integer",
|
|
1048
|
+
"minimum": 1
|
|
1049
|
+
},
|
|
1050
|
+
"environments": {
|
|
1051
|
+
"description": "Stack glob to the forge deployment environment its update jobs run in (GitHub and GitLab): a name, or a map with name and url. The first glob that matches a stack wins; stacks of one wave in different environments run in one job each.",
|
|
1052
|
+
"type": "object",
|
|
1053
|
+
"additionalProperties": {
|
|
1054
|
+
"anyOf": [
|
|
1055
|
+
{
|
|
1056
|
+
"type": "string",
|
|
1057
|
+
"minLength": 1
|
|
1058
|
+
},
|
|
1059
|
+
{
|
|
1060
|
+
"type": "object",
|
|
1061
|
+
"additionalProperties": false,
|
|
1062
|
+
"required": [
|
|
1063
|
+
"name"
|
|
1064
|
+
],
|
|
1065
|
+
"properties": {
|
|
1066
|
+
"name": {
|
|
1067
|
+
"type": "string",
|
|
1068
|
+
"minLength": 1
|
|
1069
|
+
},
|
|
1070
|
+
"url": {
|
|
1071
|
+
"type": "string"
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
]
|
|
1076
|
+
}
|
|
1077
|
+
},
|
|
1078
|
+
"control": {
|
|
1079
|
+
"description": "The control repo this repository tells after each update on merge: its project key or URL, or a mapping.",
|
|
1080
|
+
"oneOf": [
|
|
1081
|
+
{
|
|
1082
|
+
"type": "string"
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
"type": "object",
|
|
1086
|
+
"additionalProperties": false,
|
|
1087
|
+
"required": [
|
|
1088
|
+
"repo"
|
|
1089
|
+
],
|
|
1090
|
+
"properties": {
|
|
1091
|
+
"repo": {
|
|
1092
|
+
"type": "string",
|
|
1093
|
+
"description": "The control repo, as host/owner/name or its https URL."
|
|
1094
|
+
},
|
|
1095
|
+
"op": {
|
|
1096
|
+
"type": "string",
|
|
1097
|
+
"description": "The Op the control repo runs on this repository's dependents. Default pulumi-up."
|
|
1098
|
+
},
|
|
1099
|
+
"member": {
|
|
1100
|
+
"type": "string",
|
|
1101
|
+
"description": "This repository's name in the control repo's workspace. Default the repository's name."
|
|
1102
|
+
},
|
|
1103
|
+
"forge": {
|
|
1104
|
+
"type": "string",
|
|
1105
|
+
"enum": [
|
|
1106
|
+
"github",
|
|
1107
|
+
"gitlab",
|
|
1108
|
+
"forgejo"
|
|
1109
|
+
],
|
|
1110
|
+
"description": "The control repo's forge, when its host does not say."
|
|
1111
|
+
},
|
|
1112
|
+
"token_secret": {
|
|
1113
|
+
"type": "string",
|
|
1114
|
+
"description": "The secret holding the dispatch token. Default CHANT_CONTROL_TOKEN."
|
|
1115
|
+
},
|
|
1116
|
+
"read_token_secret": {
|
|
1117
|
+
"type": "string",
|
|
1118
|
+
"description": "The secret holding a read-only token for the control repo. Default CHANT_CONTROL_READ_TOKEN."
|
|
1119
|
+
},
|
|
1120
|
+
"ref": {
|
|
1121
|
+
"type": "string",
|
|
1122
|
+
"description": "The branch a GitLab or Forgejo dispatch runs on. Default main."
|
|
1123
|
+
},
|
|
1124
|
+
"api_base": {
|
|
1125
|
+
"type": "string",
|
|
1126
|
+
"description": "The forge's REST base, when the host's usual one is not it."
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
]
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
}
|