@intentius/terragucci 0.4.4 → 0.4.5

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.
@@ -0,0 +1,3005 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/terragucci/terragucci.schema.json",
4
+ "title": "terragucci.yml",
5
+ "description": "One repo's settings, or a control repo's defaults and projects. https://intentius.io/terragucci/reference/config/",
6
+ "type": [
7
+ "object",
8
+ "null"
9
+ ],
10
+ "properties": {
11
+ "roots": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "string"
15
+ },
16
+ "description": "Globs of root directories. Detected when absent."
17
+ },
18
+ "binary": {
19
+ "enum": [
20
+ "terraform",
21
+ "tofu",
22
+ "choudoufu"
23
+ ],
24
+ "description": "The binary the pipeline runs. Detected when absent."
25
+ },
26
+ "version": {
27
+ "anyOf": [
28
+ {
29
+ "type": "string"
30
+ },
31
+ {
32
+ "type": "object",
33
+ "additionalProperties": {
34
+ "type": "string",
35
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.]+)?$"
36
+ }
37
+ }
38
+ ],
39
+ "description": "The binary's release, or a map of root glob to release."
40
+ },
41
+ "generate": {
42
+ "$ref": "#/$defs/generate",
43
+ "description": "Backend, provider and version files terragucci generate writes for each plain root."
44
+ },
45
+ "forge": {
46
+ "enum": [
47
+ "github",
48
+ "gitlab",
49
+ "forgejo"
50
+ ],
51
+ "description": "The forge, for a host terragucci cannot name."
52
+ },
53
+ "url": {
54
+ "type": "string",
55
+ "description": "Where the project lives, for a forge not on https or the default port."
56
+ },
57
+ "gate": {
58
+ "enum": [
59
+ "always",
60
+ "on-destroy",
61
+ "never"
62
+ ],
63
+ "description": "When a wave waits for an approval."
64
+ },
65
+ "approval": {
66
+ "enum": [
67
+ "ledger",
68
+ "pr-review",
69
+ "sealed"
70
+ ],
71
+ "description": "What counts as a waiting wave's approval."
72
+ },
73
+ "apply": {
74
+ "type": "object",
75
+ "properties": {
76
+ "when": {
77
+ "enum": [
78
+ "merge",
79
+ "pull-request"
80
+ ]
81
+ },
82
+ "merge": {
83
+ "enum": [
84
+ "manual",
85
+ "auto"
86
+ ]
87
+ },
88
+ "merge_token_env": {
89
+ "type": "string",
90
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
91
+ },
92
+ "requires": {
93
+ "type": "array",
94
+ "uniqueItems": true,
95
+ "items": {
96
+ "enum": [
97
+ "approved",
98
+ "mergeable",
99
+ "undiverged",
100
+ "checks"
101
+ ]
102
+ }
103
+ },
104
+ "resume": {
105
+ "type": "integer",
106
+ "minimum": 5,
107
+ "maximum": 60
108
+ },
109
+ "branches": {
110
+ "type": "object",
111
+ "minProperties": 1,
112
+ "propertyNames": {
113
+ "type": "string",
114
+ "pattern": "^[A-Za-z0-9._][A-Za-z0-9._/-]*$"
115
+ },
116
+ "additionalProperties": {
117
+ "type": "array",
118
+ "minItems": 1,
119
+ "items": {
120
+ "type": "string",
121
+ "pattern": "^[^\\s,;=']+$"
122
+ }
123
+ }
124
+ }
125
+ },
126
+ "additionalProperties": false,
127
+ "description": "When a change applies."
128
+ },
129
+ "locks": {
130
+ "enum": [
131
+ "apply",
132
+ "plan"
133
+ ],
134
+ "description": "When a pull request takes its root locks."
135
+ },
136
+ "waves": {
137
+ "type": "object",
138
+ "properties": {
139
+ "canary": {
140
+ "type": "array",
141
+ "items": {
142
+ "type": "string"
143
+ }
144
+ },
145
+ "jobs": {
146
+ "type": "integer",
147
+ "minimum": 1
148
+ },
149
+ "after": {
150
+ "type": "object",
151
+ "additionalProperties": {
152
+ "type": "array",
153
+ "minItems": 1,
154
+ "items": {
155
+ "type": "string",
156
+ "minLength": 1
157
+ }
158
+ }
159
+ }
160
+ },
161
+ "description": "The canary wave, the jobs one wave spreads across, and extra apply order."
162
+ },
163
+ "drift": {
164
+ "anyOf": [
165
+ {
166
+ "type": "string"
167
+ },
168
+ {
169
+ "const": false
170
+ }
171
+ ],
172
+ "description": "A cron schedule for tf-drift, or false."
173
+ },
174
+ "synth": {
175
+ "type": "string",
176
+ "pattern": "\\S",
177
+ "description": "The command that writes the roots before any job reads them."
178
+ },
179
+ "steps": {
180
+ "type": "array",
181
+ "items": {
182
+ "type": "object",
183
+ "properties": {
184
+ "name": {
185
+ "type": "string",
186
+ "pattern": "\\S"
187
+ },
188
+ "run": {
189
+ "type": "string",
190
+ "pattern": "\\S"
191
+ },
192
+ "before": {
193
+ "enum": [
194
+ "init",
195
+ "plan",
196
+ "apply",
197
+ "drift"
198
+ ]
199
+ },
200
+ "after": {
201
+ "enum": [
202
+ "init",
203
+ "plan",
204
+ "apply",
205
+ "drift"
206
+ ]
207
+ },
208
+ "roots": {
209
+ "type": "array",
210
+ "items": {
211
+ "type": "string"
212
+ }
213
+ },
214
+ "on_failure": {
215
+ "enum": [
216
+ "fail",
217
+ "approve"
218
+ ]
219
+ }
220
+ },
221
+ "additionalProperties": false,
222
+ "required": [
223
+ "run"
224
+ ],
225
+ "oneOf": [
226
+ {
227
+ "required": [
228
+ "before"
229
+ ]
230
+ },
231
+ {
232
+ "required": [
233
+ "after"
234
+ ]
235
+ }
236
+ ],
237
+ "if": {
238
+ "properties": {
239
+ "on_failure": {
240
+ "const": "approve"
241
+ }
242
+ },
243
+ "required": [
244
+ "on_failure"
245
+ ]
246
+ },
247
+ "then": {
248
+ "properties": {
249
+ "before": {
250
+ "enum": [
251
+ "init",
252
+ "plan"
253
+ ]
254
+ },
255
+ "after": {
256
+ "enum": [
257
+ "init",
258
+ "plan"
259
+ ]
260
+ }
261
+ }
262
+ }
263
+ },
264
+ "description": "Commands run before or after a root's init, plan, apply and drift."
265
+ },
266
+ "image": {
267
+ "type": "string",
268
+ "pattern": "^[^\\s]+$",
269
+ "description": "The image every job runs in, built FROM terragucci's."
270
+ },
271
+ "notify": {
272
+ "type": "object",
273
+ "properties": {
274
+ "slack": {
275
+ "type": "string",
276
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
277
+ },
278
+ "teams": {
279
+ "type": "string",
280
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
281
+ },
282
+ "webhook": {
283
+ "type": "string",
284
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
285
+ },
286
+ "webhook_key": {
287
+ "type": "string",
288
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
289
+ },
290
+ "relay": {
291
+ "type": "string",
292
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9 ._-]{0,63}$"
293
+ }
294
+ },
295
+ "additionalProperties": false,
296
+ "minProperties": 1,
297
+ "dependentRequired": {
298
+ "webhook": [
299
+ "webhook_key"
300
+ ],
301
+ "webhook_key": [
302
+ "webhook"
303
+ ]
304
+ },
305
+ "if": {
306
+ "required": [
307
+ "relay"
308
+ ]
309
+ },
310
+ "then": {
311
+ "anyOf": [
312
+ {
313
+ "required": [
314
+ "slack"
315
+ ]
316
+ },
317
+ {
318
+ "required": [
319
+ "teams"
320
+ ]
321
+ }
322
+ ]
323
+ },
324
+ "description": "The secrets holding Slack, Teams or webhook addresses, and the relay's name."
325
+ },
326
+ "cost": {
327
+ "anyOf": [
328
+ {
329
+ "const": true
330
+ },
331
+ {
332
+ "type": "object",
333
+ "properties": {
334
+ "key_secret": {
335
+ "type": "string",
336
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
337
+ },
338
+ "command": {
339
+ "type": "string",
340
+ "pattern": "\\S"
341
+ },
342
+ "approve_above": {
343
+ "type": "number",
344
+ "minimum": 0
345
+ }
346
+ },
347
+ "additionalProperties": false
348
+ }
349
+ ],
350
+ "description": "Cost estimates per root in the plan note."
351
+ },
352
+ "comments": {
353
+ "anyOf": [
354
+ {
355
+ "type": "string"
356
+ },
357
+ {
358
+ "const": false
359
+ }
360
+ ],
361
+ "description": "GitLab only: the cron of the comments schedule, or false."
362
+ },
363
+ "rollouts": {
364
+ "anyOf": [
365
+ {
366
+ "type": "string",
367
+ "pattern": "\\S"
368
+ },
369
+ {
370
+ "const": false
371
+ }
372
+ ],
373
+ "description": "A cron schedule for the job that opens each rollout's next wave, or false."
374
+ },
375
+ "gitlab": {
376
+ "type": "object",
377
+ "properties": {
378
+ "token": {
379
+ "enum": [
380
+ "unprotected",
381
+ "protected"
382
+ ]
383
+ }
384
+ },
385
+ "additionalProperties": false,
386
+ "description": "GitLab only: how the project keeps its forge token."
387
+ },
388
+ "runtime": {
389
+ "enum": [
390
+ "forge"
391
+ ],
392
+ "description": "Where the stages run."
393
+ },
394
+ "reports": {
395
+ "type": "object",
396
+ "properties": {
397
+ "bucket": {
398
+ "type": "string"
399
+ },
400
+ "endpoint": {},
401
+ "prefix": {},
402
+ "url": {
403
+ "type": "string",
404
+ "pattern": "^https?://[^\\s?#]+$"
405
+ },
406
+ "role": {
407
+ "type": "string",
408
+ "pattern": "^arn:aws[\\w-]*:iam::\\d{12}:role/\\S+$"
409
+ }
410
+ },
411
+ "required": [
412
+ "bucket"
413
+ ],
414
+ "description": "A bucket for plan reports: s3://, gs:// or az://."
415
+ },
416
+ "token_env": {
417
+ "type": "string",
418
+ "description": "The environment variable holding the forge token."
419
+ },
420
+ "env": {
421
+ "type": "object",
422
+ "additionalProperties": {
423
+ "type": "string"
424
+ },
425
+ "description": "Environment variables every job gets. Values only, never secrets."
426
+ },
427
+ "runner": {
428
+ "anyOf": [
429
+ {
430
+ "anyOf": [
431
+ {
432
+ "type": "string",
433
+ "pattern": "^[^\\s,]+$"
434
+ },
435
+ {
436
+ "type": "array",
437
+ "minItems": 1,
438
+ "uniqueItems": true,
439
+ "items": {
440
+ "type": "string",
441
+ "pattern": "^[^\\s,]+$"
442
+ }
443
+ },
444
+ {
445
+ "type": "object",
446
+ "properties": {
447
+ "group": {
448
+ "type": "string",
449
+ "pattern": "\\S"
450
+ },
451
+ "labels": {
452
+ "type": "array",
453
+ "minItems": 1,
454
+ "uniqueItems": true,
455
+ "items": {
456
+ "type": "string",
457
+ "pattern": "^[^\\s,]+$"
458
+ }
459
+ }
460
+ },
461
+ "additionalProperties": false,
462
+ "required": [
463
+ "group"
464
+ ]
465
+ }
466
+ ]
467
+ },
468
+ {
469
+ "type": "object",
470
+ "minProperties": 1,
471
+ "not": {
472
+ "required": [
473
+ "group"
474
+ ]
475
+ },
476
+ "propertyNames": {
477
+ "enum": [
478
+ "default",
479
+ "plan",
480
+ "apply",
481
+ "drift"
482
+ ]
483
+ },
484
+ "additionalProperties": {
485
+ "anyOf": [
486
+ {
487
+ "type": "string",
488
+ "pattern": "^[^\\s,]+$"
489
+ },
490
+ {
491
+ "type": "array",
492
+ "minItems": 1,
493
+ "uniqueItems": true,
494
+ "items": {
495
+ "type": "string",
496
+ "pattern": "^[^\\s,]+$"
497
+ }
498
+ },
499
+ {
500
+ "type": "object",
501
+ "properties": {
502
+ "group": {
503
+ "type": "string",
504
+ "pattern": "\\S"
505
+ },
506
+ "labels": {
507
+ "type": "array",
508
+ "minItems": 1,
509
+ "uniqueItems": true,
510
+ "items": {
511
+ "type": "string",
512
+ "pattern": "^[^\\s,]+$"
513
+ }
514
+ }
515
+ },
516
+ "additionalProperties": false,
517
+ "required": [
518
+ "group"
519
+ ]
520
+ }
521
+ ]
522
+ }
523
+ }
524
+ ],
525
+ "description": "The runner each job runs on: a label, a list of labels, a GitHub runner group, or one per stage."
526
+ },
527
+ "pass": {
528
+ "type": "object",
529
+ "properties": {
530
+ "secrets": {
531
+ "type": "array",
532
+ "minItems": 1,
533
+ "uniqueItems": true,
534
+ "items": {
535
+ "type": "string",
536
+ "pattern": "^(?!(?:[Gg][Ii][Tt][Hh][Uu][Bb]_|[Gg][Ii][Tt][Ee][Aa]_|[Ff][Oo][Rr][Gg][Ee][Jj][Oo]_|[Tt][Gg]_|[Tt][Ee][Rr][Rr][Aa][Gg][Uu][Cc][Cc][Ii]_))(?!(?:TF_IN_AUTOMATION|TF_INPUT)$)[A-Za-z_][A-Za-z0-9_]*$"
537
+ }
538
+ },
539
+ "vars": {
540
+ "type": "array",
541
+ "minItems": 1,
542
+ "uniqueItems": true,
543
+ "items": {
544
+ "type": "string",
545
+ "pattern": "^(?!(?:[Gg][Ii][Tt][Hh][Uu][Bb]_|[Gg][Ii][Tt][Ee][Aa]_|[Ff][Oo][Rr][Gg][Ee][Jj][Oo]_|[Tt][Gg]_|[Tt][Ee][Rr][Rr][Aa][Gg][Uu][Cc][Cc][Ii]_))(?!(?:TF_IN_AUTOMATION|TF_INPUT)$)[A-Za-z_][A-Za-z0-9_]*$"
546
+ }
547
+ }
548
+ },
549
+ "additionalProperties": false,
550
+ "minProperties": 1,
551
+ "description": "Names of CI secrets and variables the plan, apply and drift jobs get."
552
+ },
553
+ "telemetry": {
554
+ "type": "object",
555
+ "properties": {
556
+ "headers_secret": {
557
+ "type": "string",
558
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
559
+ },
560
+ "trace_url": {
561
+ "type": "string",
562
+ "pattern": "^https?://\\S*\\{trace_id\\}\\S*$"
563
+ }
564
+ },
565
+ "additionalProperties": false,
566
+ "minProperties": 1,
567
+ "description": "The secret holding OTLP headers, and a trace link with {trace_id}."
568
+ },
569
+ "tips": {
570
+ "type": "boolean",
571
+ "description": "Tips in the plan note."
572
+ },
573
+ "modules": {
574
+ "type": "object",
575
+ "properties": {
576
+ "path": {
577
+ "type": "string"
578
+ },
579
+ "publish": {
580
+ "anyOf": [
581
+ {
582
+ "type": "string",
583
+ "pattern": "^(?:git-tags$|oci://[^/]+/.)"
584
+ },
585
+ {
586
+ "type": "array",
587
+ "items": {
588
+ "type": "string",
589
+ "pattern": "^(?:git-tags$|oci://[^/]+/.)"
590
+ }
591
+ }
592
+ ]
593
+ },
594
+ "attest": {
595
+ "anyOf": [
596
+ {
597
+ "type": "boolean"
598
+ },
599
+ {
600
+ "type": "object",
601
+ "properties": {
602
+ "key": {
603
+ "type": "string",
604
+ "minLength": 1
605
+ }
606
+ },
607
+ "additionalProperties": false
608
+ }
609
+ ]
610
+ },
611
+ "require": {
612
+ "const": "attested"
613
+ },
614
+ "trusted": {
615
+ "type": "array",
616
+ "items": {
617
+ "type": "object",
618
+ "properties": {
619
+ "source": {
620
+ "type": "string",
621
+ "pattern": "^(oci://[^/]+/.+|(git::)?(https?|ssh)://.+)$"
622
+ },
623
+ "key": {
624
+ "type": "string",
625
+ "minLength": 1
626
+ },
627
+ "ledger": {
628
+ "type": "string",
629
+ "pattern": "^(https?|ssh|file)://."
630
+ }
631
+ },
632
+ "additionalProperties": false,
633
+ "required": [
634
+ "source",
635
+ "key",
636
+ "ledger"
637
+ ]
638
+ }
639
+ },
640
+ "test": {
641
+ "type": "boolean"
642
+ },
643
+ "registry": {
644
+ "type": "object",
645
+ "properties": {
646
+ "bucket": {
647
+ "type": "string"
648
+ },
649
+ "dir": {
650
+ "type": "string",
651
+ "minLength": 1,
652
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$))"
653
+ },
654
+ "endpoint": {
655
+ "type": "string"
656
+ },
657
+ "prefix": {
658
+ "type": "string"
659
+ },
660
+ "url": {
661
+ "type": "string",
662
+ "pattern": "^https://[^/\\s?#]+/?$"
663
+ },
664
+ "namespace": {
665
+ "type": "string",
666
+ "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z_-]{0,62}[0-9A-Za-z])?$"
667
+ },
668
+ "namespaces": {
669
+ "type": "object",
670
+ "propertyNames": {
671
+ "pattern": "^[^/]"
672
+ },
673
+ "additionalProperties": {
674
+ "type": "string",
675
+ "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z_-]{0,62}[0-9A-Za-z])?$"
676
+ }
677
+ },
678
+ "system": {
679
+ "type": "string",
680
+ "pattern": "^[0-9a-z]{1,64}$"
681
+ },
682
+ "download": {
683
+ "enum": [
684
+ "tarball",
685
+ "git-tags",
686
+ "oci"
687
+ ]
688
+ }
689
+ },
690
+ "additionalProperties": false,
691
+ "required": [
692
+ "url",
693
+ "namespace"
694
+ ],
695
+ "oneOf": [
696
+ {
697
+ "required": [
698
+ "bucket"
699
+ ]
700
+ },
701
+ {
702
+ "required": [
703
+ "dir"
704
+ ]
705
+ }
706
+ ],
707
+ "dependentRequired": {
708
+ "endpoint": [
709
+ "bucket"
710
+ ]
711
+ }
712
+ }
713
+ },
714
+ "additionalProperties": false,
715
+ "description": "Module publishing, attestation and the module registry."
716
+ },
717
+ "oidc": {
718
+ "type": "object",
719
+ "properties": {
720
+ "plan_role": {
721
+ "type": "string",
722
+ "minLength": 1
723
+ },
724
+ "apply_role": {
725
+ "type": "string",
726
+ "minLength": 1
727
+ },
728
+ "audience": {
729
+ "type": "string"
730
+ },
731
+ "roles": {
732
+ "type": "object",
733
+ "minProperties": 1,
734
+ "additionalProperties": {
735
+ "type": "object",
736
+ "properties": {
737
+ "plan": {
738
+ "type": "string",
739
+ "minLength": 1
740
+ },
741
+ "apply": {
742
+ "type": "string",
743
+ "minLength": 1
744
+ }
745
+ },
746
+ "additionalProperties": false,
747
+ "required": [
748
+ "plan",
749
+ "apply"
750
+ ]
751
+ }
752
+ },
753
+ "gcp": {
754
+ "type": "object",
755
+ "properties": {
756
+ "workload_identity_provider": {
757
+ "type": "string",
758
+ "pattern": "^projects\\/[0-9]+\\/locations\\/global\\/workloadIdentityPools\\/[^/\\s]+\\/providers\\/[^/\\s]+$"
759
+ },
760
+ "plan_service_account": {
761
+ "type": "string",
762
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
763
+ },
764
+ "apply_service_account": {
765
+ "type": "string",
766
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
767
+ },
768
+ "token_url": {
769
+ "type": "string",
770
+ "pattern": "^https://[^\\s/]+/\\S*$"
771
+ },
772
+ "roles": {
773
+ "type": "object",
774
+ "minProperties": 1,
775
+ "additionalProperties": {
776
+ "type": "object",
777
+ "properties": {
778
+ "plan": {
779
+ "type": "string",
780
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
781
+ },
782
+ "apply": {
783
+ "type": "string",
784
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
785
+ }
786
+ },
787
+ "additionalProperties": false,
788
+ "required": [
789
+ "plan",
790
+ "apply"
791
+ ]
792
+ }
793
+ }
794
+ },
795
+ "additionalProperties": false,
796
+ "required": [
797
+ "workload_identity_provider",
798
+ "plan_service_account",
799
+ "apply_service_account"
800
+ ]
801
+ },
802
+ "azure": {
803
+ "type": "object",
804
+ "properties": {
805
+ "tenant_id": {
806
+ "type": "string",
807
+ "minLength": 1
808
+ },
809
+ "subscription_id": {
810
+ "type": "string",
811
+ "minLength": 1
812
+ },
813
+ "plan_client_id": {
814
+ "type": "string",
815
+ "minLength": 1
816
+ },
817
+ "apply_client_id": {
818
+ "type": "string",
819
+ "minLength": 1
820
+ },
821
+ "audience": {
822
+ "type": "string",
823
+ "minLength": 1
824
+ },
825
+ "roles": {
826
+ "type": "object",
827
+ "minProperties": 1,
828
+ "additionalProperties": {
829
+ "type": "object",
830
+ "properties": {
831
+ "plan": {
832
+ "type": "string",
833
+ "minLength": 1
834
+ },
835
+ "apply": {
836
+ "type": "string",
837
+ "minLength": 1
838
+ }
839
+ },
840
+ "additionalProperties": false,
841
+ "required": [
842
+ "plan",
843
+ "apply"
844
+ ]
845
+ }
846
+ }
847
+ },
848
+ "additionalProperties": false,
849
+ "required": [
850
+ "tenant_id",
851
+ "subscription_id",
852
+ "plan_client_id",
853
+ "apply_client_id"
854
+ ]
855
+ }
856
+ },
857
+ "additionalProperties": false,
858
+ "minProperties": 1,
859
+ "dependentRequired": {
860
+ "plan_role": [
861
+ "apply_role"
862
+ ],
863
+ "apply_role": [
864
+ "plan_role"
865
+ ]
866
+ },
867
+ "if": {
868
+ "required": [
869
+ "audience"
870
+ ],
871
+ "not": {
872
+ "required": [
873
+ "roles"
874
+ ]
875
+ }
876
+ },
877
+ "then": {
878
+ "required": [
879
+ "plan_role",
880
+ "apply_role"
881
+ ]
882
+ },
883
+ "description": "Cloud identities the jobs take over OIDC: a read-only one for plan, a write one for apply."
884
+ },
885
+ "parallelism": {
886
+ "type": "integer",
887
+ "minimum": 1,
888
+ "description": "How many roots of one dependency layer plan at once."
889
+ },
890
+ "terragrunt": {
891
+ "type": "object",
892
+ "properties": {
893
+ "version": {
894
+ "type": "string",
895
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.]+)?$"
896
+ },
897
+ "exclude": {
898
+ "type": "array",
899
+ "items": {
900
+ "type": "string"
901
+ }
902
+ },
903
+ "parallelism": {
904
+ "type": "integer",
905
+ "minimum": 1
906
+ },
907
+ "dependents": {
908
+ "enum": [
909
+ "follow",
910
+ "plan"
911
+ ]
912
+ },
913
+ "credentials": {
914
+ "type": "object",
915
+ "additionalProperties": {
916
+ "type": "object",
917
+ "properties": {
918
+ "plan": {
919
+ "type": "string",
920
+ "minLength": 1
921
+ },
922
+ "apply": {
923
+ "type": "string",
924
+ "minLength": 1
925
+ }
926
+ },
927
+ "additionalProperties": false,
928
+ "required": [
929
+ "plan",
930
+ "apply"
931
+ ]
932
+ }
933
+ }
934
+ },
935
+ "additionalProperties": false,
936
+ "description": "Terragrunt settings."
937
+ },
938
+ "atmos": {
939
+ "type": "object",
940
+ "properties": {
941
+ "version": {
942
+ "type": "string",
943
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.]+)?$"
944
+ }
945
+ },
946
+ "additionalProperties": false,
947
+ "description": "Atmos settings."
948
+ },
949
+ "policy": {
950
+ "type": "object",
951
+ "properties": {
952
+ "engine": {
953
+ "enum": [
954
+ "conftest",
955
+ "opa"
956
+ ]
957
+ },
958
+ "path": {
959
+ "type": "string",
960
+ "minLength": 1,
961
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$))"
962
+ },
963
+ "source": {
964
+ "type": "string",
965
+ "pattern": "^git\\+(https?|file)://.*@"
966
+ },
967
+ "namespace": {
968
+ "type": "string",
969
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.]*$"
970
+ },
971
+ "input": {
972
+ "enum": [
973
+ "plan",
974
+ "hcp"
975
+ ]
976
+ },
977
+ "override": {
978
+ "type": "array",
979
+ "minItems": 1,
980
+ "items": {
981
+ "type": "string",
982
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
983
+ }
984
+ }
985
+ },
986
+ "additionalProperties": false,
987
+ "description": "Policy checks over each plan."
988
+ },
989
+ "atlantis_comments": {
990
+ "type": "boolean",
991
+ "description": "Read atlantis plan and atlantis apply comments as terragucci's."
992
+ },
993
+ "respond": {
994
+ "type": "object",
995
+ "properties": {
996
+ "plan": {
997
+ "enum": [
998
+ "summary"
999
+ ]
1000
+ },
1001
+ "wave-refused": {
1002
+ "enum": [
1003
+ "diff",
1004
+ "off"
1005
+ ]
1006
+ },
1007
+ "apply-failed": {
1008
+ "enum": [
1009
+ "triage",
1010
+ "off"
1011
+ ]
1012
+ },
1013
+ "drift": {
1014
+ "enum": [
1015
+ "pull-request",
1016
+ "attribute",
1017
+ "off"
1018
+ ]
1019
+ },
1020
+ "tips": {
1021
+ "enum": [
1022
+ "pull-request",
1023
+ "off"
1024
+ ]
1025
+ },
1026
+ "fmt": {
1027
+ "enum": [
1028
+ "commit",
1029
+ "off"
1030
+ ]
1031
+ },
1032
+ "publish": {
1033
+ "enum": [
1034
+ "notes",
1035
+ "off"
1036
+ ]
1037
+ },
1038
+ "rollout": {
1039
+ "enum": [
1040
+ "next-wave",
1041
+ "off"
1042
+ ]
1043
+ },
1044
+ "version-bump": {
1045
+ "enum": [
1046
+ "off",
1047
+ "suggest"
1048
+ ]
1049
+ },
1050
+ "description": {
1051
+ "enum": [
1052
+ "off",
1053
+ "check"
1054
+ ]
1055
+ }
1056
+ },
1057
+ "additionalProperties": false,
1058
+ "description": "The response to each pipeline event."
1059
+ },
1060
+ "agent": {
1061
+ "type": "object",
1062
+ "properties": {
1063
+ "via": {
1064
+ "enum": [
1065
+ "forge"
1066
+ ]
1067
+ },
1068
+ "token_env": {
1069
+ "type": "string",
1070
+ "minLength": 1
1071
+ },
1072
+ "comment": {
1073
+ "anyOf": [
1074
+ {
1075
+ "type": "boolean"
1076
+ },
1077
+ {
1078
+ "type": "object",
1079
+ "properties": {
1080
+ "command": {
1081
+ "type": "string",
1082
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
1083
+ },
1084
+ "key_secret": {
1085
+ "type": "string",
1086
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1087
+ },
1088
+ "max_turns": {
1089
+ "type": "integer",
1090
+ "minimum": 1
1091
+ },
1092
+ "timeout": {
1093
+ "type": "integer",
1094
+ "minimum": 1
1095
+ }
1096
+ },
1097
+ "additionalProperties": false
1098
+ }
1099
+ ]
1100
+ },
1101
+ "drift": {
1102
+ "anyOf": [
1103
+ {
1104
+ "type": "boolean"
1105
+ },
1106
+ {
1107
+ "type": "object",
1108
+ "properties": {
1109
+ "command": {
1110
+ "type": "string",
1111
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
1112
+ },
1113
+ "key_secret": {
1114
+ "type": "string",
1115
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1116
+ },
1117
+ "max_turns": {
1118
+ "type": "integer",
1119
+ "minimum": 1
1120
+ },
1121
+ "timeout": {
1122
+ "type": "integer",
1123
+ "minimum": 1
1124
+ }
1125
+ },
1126
+ "additionalProperties": false
1127
+ }
1128
+ ]
1129
+ }
1130
+ },
1131
+ "additionalProperties": false,
1132
+ "required": [
1133
+ "via",
1134
+ "token_env"
1135
+ ],
1136
+ "description": "The coding agent behind /terragucci agent and the drift agent."
1137
+ },
1138
+ "review": {
1139
+ "type": "object",
1140
+ "properties": {
1141
+ "agent": {
1142
+ "type": "boolean"
1143
+ },
1144
+ "command": {
1145
+ "type": "string",
1146
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
1147
+ },
1148
+ "key_secret": {
1149
+ "type": "string",
1150
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1151
+ },
1152
+ "instructions": {
1153
+ "type": "string",
1154
+ "pattern": "^(?:\\./)?(?!/)[A-Za-z0-9_./-]+$"
1155
+ },
1156
+ "timeout": {
1157
+ "type": "integer",
1158
+ "minimum": 1
1159
+ }
1160
+ },
1161
+ "additionalProperties": false,
1162
+ "anyOf": [
1163
+ {
1164
+ "maxProperties": 0
1165
+ },
1166
+ {
1167
+ "required": [
1168
+ "agent"
1169
+ ]
1170
+ }
1171
+ ],
1172
+ "description": "A model's review of each pull request's intent against its plan."
1173
+ },
1174
+ "decide": {
1175
+ "type": "object",
1176
+ "properties": {
1177
+ "backend": {
1178
+ "enum": [
1179
+ "laya",
1180
+ "von",
1181
+ "decider",
1182
+ "jev"
1183
+ ]
1184
+ },
1185
+ "url": {
1186
+ "type": "string",
1187
+ "pattern": "^https?://[^/\\s]+"
1188
+ },
1189
+ "model": {
1190
+ "type": "string",
1191
+ "minLength": 1,
1192
+ "pattern": "^(?![\\s\\S]*(?:^|[-_.])(?:latest|preview)$)"
1193
+ },
1194
+ "token_env": {
1195
+ "type": "string",
1196
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1197
+ },
1198
+ "thresholds": {
1199
+ "type": "object",
1200
+ "properties": {
1201
+ "noul": {
1202
+ "type": "number",
1203
+ "exclusiveMinimum": 0,
1204
+ "maximum": 1
1205
+ },
1206
+ "choice": {
1207
+ "type": "number",
1208
+ "exclusiveMinimum": 0,
1209
+ "maximum": 1
1210
+ },
1211
+ "score": {
1212
+ "type": "number",
1213
+ "exclusiveMinimum": 0,
1214
+ "maximum": 1
1215
+ }
1216
+ },
1217
+ "additionalProperties": false
1218
+ }
1219
+ },
1220
+ "additionalProperties": false,
1221
+ "required": [
1222
+ "backend"
1223
+ ],
1224
+ "allOf": [
1225
+ {
1226
+ "if": {
1227
+ "properties": {
1228
+ "backend": {
1229
+ "const": "jev"
1230
+ }
1231
+ }
1232
+ },
1233
+ "then": {
1234
+ "required": [
1235
+ "token_env"
1236
+ ]
1237
+ },
1238
+ "else": {
1239
+ "required": [
1240
+ "url"
1241
+ ]
1242
+ }
1243
+ },
1244
+ {
1245
+ "if": {
1246
+ "properties": {
1247
+ "backend": {
1248
+ "const": "laya"
1249
+ }
1250
+ }
1251
+ },
1252
+ "else": {
1253
+ "required": [
1254
+ "model"
1255
+ ]
1256
+ }
1257
+ }
1258
+ ],
1259
+ "description": "The typed-decision service."
1260
+ },
1261
+ "audit_region": {
1262
+ "type": "string",
1263
+ "pattern": "^[a-z]{2}(-[a-z]+)+-\\d+$",
1264
+ "description": "The AWS region whose CloudTrail drift attribution reads."
1265
+ },
1266
+ "dashboards": {
1267
+ "anyOf": [
1268
+ {
1269
+ "type": "boolean"
1270
+ },
1271
+ {
1272
+ "type": "object",
1273
+ "properties": {
1274
+ "dir": {
1275
+ "type": "string",
1276
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$))[^\\r\\n]+$"
1277
+ },
1278
+ "prometheus": {
1279
+ "type": "string",
1280
+ "pattern": "^[^\\r\\n]+$"
1281
+ },
1282
+ "tempo": {
1283
+ "type": "string",
1284
+ "pattern": "^[^\\r\\n]+$"
1285
+ },
1286
+ "folder": {
1287
+ "type": "string",
1288
+ "pattern": "^[^\\r\\n]+$"
1289
+ },
1290
+ "path": {
1291
+ "type": "string",
1292
+ "pattern": "^[^\\r\\n]+$"
1293
+ },
1294
+ "drift_age": {
1295
+ "type": "string",
1296
+ "pattern": "^(\\d+(ms|s|m|h|d|w|y))+$"
1297
+ },
1298
+ "wave_wait": {
1299
+ "type": "string",
1300
+ "pattern": "^(\\d+(ms|s|m|h|d|w|y))+$"
1301
+ },
1302
+ "schedule": {
1303
+ "type": "string",
1304
+ "pattern": "^(\\d+(ms|s|m|h|d|w|y))+$"
1305
+ }
1306
+ },
1307
+ "additionalProperties": false
1308
+ }
1309
+ ],
1310
+ "description": "Dashboards and alert rules written next to the pipeline."
1311
+ },
1312
+ "own_jobs": {
1313
+ "anyOf": [
1314
+ {
1315
+ "type": "string",
1316
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$)).*\\.ya?ml$"
1317
+ },
1318
+ {
1319
+ "type": "object",
1320
+ "minProperties": 1,
1321
+ "propertyNames": {
1322
+ "type": "string",
1323
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
1324
+ },
1325
+ "additionalProperties": {
1326
+ "type": "object",
1327
+ "minProperties": 1
1328
+ }
1329
+ }
1330
+ ],
1331
+ "description": "Jobs of your own, in the forge's syntax, or the path of a YAML file holding them."
1332
+ },
1333
+ "ephemeral": {
1334
+ "type": "object",
1335
+ "properties": {
1336
+ "roots": {
1337
+ "type": "array",
1338
+ "minItems": 1,
1339
+ "items": {
1340
+ "type": "string",
1341
+ "pattern": "^[^\\s,;=']+$"
1342
+ }
1343
+ },
1344
+ "ttl": {
1345
+ "type": "string",
1346
+ "pattern": "^[1-9]\\d*[mhd]$"
1347
+ },
1348
+ "sweep": {
1349
+ "type": "integer",
1350
+ "minimum": 5,
1351
+ "maximum": 60
1352
+ }
1353
+ },
1354
+ "additionalProperties": false,
1355
+ "required": [
1356
+ "roots"
1357
+ ],
1358
+ "description": "Roots each pull request gets a copy of."
1359
+ },
1360
+ "defaults": {
1361
+ "$ref": "#/$defs/project",
1362
+ "not": {
1363
+ "required": [
1364
+ "url"
1365
+ ]
1366
+ },
1367
+ "description": "Settings every project takes, under its own."
1368
+ },
1369
+ "projects": {
1370
+ "type": "object",
1371
+ "propertyNames": {
1372
+ "pattern": "^(?:https?://)?[^/]+(?:/[^/]+){2,}/*$"
1373
+ },
1374
+ "additionalProperties": {
1375
+ "anyOf": [
1376
+ {
1377
+ "type": "null"
1378
+ },
1379
+ {
1380
+ "$ref": "#/$defs/project"
1381
+ }
1382
+ ]
1383
+ },
1384
+ "description": "<host>/<owner>/<name> to that project's settings."
1385
+ }
1386
+ },
1387
+ "additionalProperties": false,
1388
+ "dependentRequired": {
1389
+ "defaults": [
1390
+ "projects"
1391
+ ]
1392
+ },
1393
+ "if": {
1394
+ "required": [
1395
+ "projects"
1396
+ ]
1397
+ },
1398
+ "then": {
1399
+ "propertyNames": {
1400
+ "enum": [
1401
+ "defaults",
1402
+ "projects"
1403
+ ]
1404
+ }
1405
+ },
1406
+ "$defs": {
1407
+ "project": {
1408
+ "type": "object",
1409
+ "properties": {
1410
+ "roots": {
1411
+ "type": "array",
1412
+ "items": {
1413
+ "type": "string"
1414
+ },
1415
+ "description": "Globs of root directories. Detected when absent."
1416
+ },
1417
+ "binary": {
1418
+ "enum": [
1419
+ "terraform",
1420
+ "tofu",
1421
+ "choudoufu"
1422
+ ],
1423
+ "description": "The binary the pipeline runs. Detected when absent."
1424
+ },
1425
+ "version": {
1426
+ "type": "string",
1427
+ "description": "The binary's release."
1428
+ },
1429
+ "generate": {
1430
+ "$ref": "#/$defs/generate",
1431
+ "description": "Backend, provider and version files terragucci generate writes for each plain root."
1432
+ },
1433
+ "forge": {
1434
+ "enum": [
1435
+ "github",
1436
+ "gitlab",
1437
+ "forgejo"
1438
+ ],
1439
+ "description": "The forge, for a host terragucci cannot name."
1440
+ },
1441
+ "url": {
1442
+ "type": "string",
1443
+ "description": "Where the project lives, for a forge not on https or the default port."
1444
+ },
1445
+ "gate": {
1446
+ "enum": [
1447
+ "always",
1448
+ "on-destroy",
1449
+ "never"
1450
+ ],
1451
+ "description": "When a wave waits for an approval."
1452
+ },
1453
+ "approval": {
1454
+ "enum": [
1455
+ "ledger",
1456
+ "pr-review",
1457
+ "sealed"
1458
+ ],
1459
+ "description": "What counts as a waiting wave's approval."
1460
+ },
1461
+ "apply": {
1462
+ "type": "object",
1463
+ "properties": {
1464
+ "when": {
1465
+ "enum": [
1466
+ "merge",
1467
+ "pull-request"
1468
+ ]
1469
+ },
1470
+ "merge": {
1471
+ "enum": [
1472
+ "manual",
1473
+ "auto"
1474
+ ]
1475
+ },
1476
+ "merge_token_env": {
1477
+ "type": "string",
1478
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1479
+ },
1480
+ "requires": {
1481
+ "type": "array",
1482
+ "uniqueItems": true,
1483
+ "items": {
1484
+ "enum": [
1485
+ "approved",
1486
+ "mergeable",
1487
+ "undiverged",
1488
+ "checks"
1489
+ ]
1490
+ }
1491
+ },
1492
+ "resume": {
1493
+ "type": "integer",
1494
+ "minimum": 5,
1495
+ "maximum": 60
1496
+ },
1497
+ "branches": {
1498
+ "type": "object",
1499
+ "minProperties": 1,
1500
+ "propertyNames": {
1501
+ "type": "string",
1502
+ "pattern": "^[A-Za-z0-9._][A-Za-z0-9._/-]*$"
1503
+ },
1504
+ "additionalProperties": {
1505
+ "type": "array",
1506
+ "minItems": 1,
1507
+ "items": {
1508
+ "type": "string",
1509
+ "pattern": "^[^\\s,;=']+$"
1510
+ }
1511
+ }
1512
+ }
1513
+ },
1514
+ "additionalProperties": false,
1515
+ "description": "When a change applies."
1516
+ },
1517
+ "locks": {
1518
+ "enum": [
1519
+ "apply",
1520
+ "plan"
1521
+ ],
1522
+ "description": "When a pull request takes its root locks."
1523
+ },
1524
+ "waves": {
1525
+ "type": "object",
1526
+ "properties": {
1527
+ "canary": {
1528
+ "type": "array",
1529
+ "items": {
1530
+ "type": "string"
1531
+ }
1532
+ },
1533
+ "jobs": {
1534
+ "type": "integer",
1535
+ "minimum": 1
1536
+ },
1537
+ "after": {
1538
+ "type": "object",
1539
+ "additionalProperties": {
1540
+ "type": "array",
1541
+ "minItems": 1,
1542
+ "items": {
1543
+ "type": "string",
1544
+ "minLength": 1
1545
+ }
1546
+ }
1547
+ }
1548
+ },
1549
+ "description": "The canary wave, the jobs one wave spreads across, and extra apply order."
1550
+ },
1551
+ "drift": {
1552
+ "anyOf": [
1553
+ {
1554
+ "type": "string"
1555
+ },
1556
+ {
1557
+ "const": false
1558
+ }
1559
+ ],
1560
+ "description": "A cron schedule for tf-drift, or false."
1561
+ },
1562
+ "synth": {
1563
+ "type": "string",
1564
+ "pattern": "\\S",
1565
+ "description": "The command that writes the roots before any job reads them."
1566
+ },
1567
+ "steps": {
1568
+ "type": "array",
1569
+ "items": {
1570
+ "type": "object",
1571
+ "properties": {
1572
+ "name": {
1573
+ "type": "string",
1574
+ "pattern": "\\S"
1575
+ },
1576
+ "run": {
1577
+ "type": "string",
1578
+ "pattern": "\\S"
1579
+ },
1580
+ "before": {
1581
+ "enum": [
1582
+ "init",
1583
+ "plan",
1584
+ "apply",
1585
+ "drift"
1586
+ ]
1587
+ },
1588
+ "after": {
1589
+ "enum": [
1590
+ "init",
1591
+ "plan",
1592
+ "apply",
1593
+ "drift"
1594
+ ]
1595
+ },
1596
+ "roots": {
1597
+ "type": "array",
1598
+ "items": {
1599
+ "type": "string"
1600
+ }
1601
+ },
1602
+ "on_failure": {
1603
+ "enum": [
1604
+ "fail",
1605
+ "approve"
1606
+ ]
1607
+ }
1608
+ },
1609
+ "additionalProperties": false,
1610
+ "required": [
1611
+ "run"
1612
+ ],
1613
+ "oneOf": [
1614
+ {
1615
+ "required": [
1616
+ "before"
1617
+ ]
1618
+ },
1619
+ {
1620
+ "required": [
1621
+ "after"
1622
+ ]
1623
+ }
1624
+ ],
1625
+ "if": {
1626
+ "properties": {
1627
+ "on_failure": {
1628
+ "const": "approve"
1629
+ }
1630
+ },
1631
+ "required": [
1632
+ "on_failure"
1633
+ ]
1634
+ },
1635
+ "then": {
1636
+ "properties": {
1637
+ "before": {
1638
+ "enum": [
1639
+ "init",
1640
+ "plan"
1641
+ ]
1642
+ },
1643
+ "after": {
1644
+ "enum": [
1645
+ "init",
1646
+ "plan"
1647
+ ]
1648
+ }
1649
+ }
1650
+ }
1651
+ },
1652
+ "description": "Commands run before or after a root's init, plan, apply and drift."
1653
+ },
1654
+ "image": {
1655
+ "type": "string",
1656
+ "pattern": "^[^\\s]+$",
1657
+ "description": "The image every job runs in, built FROM terragucci's."
1658
+ },
1659
+ "notify": {
1660
+ "type": "object",
1661
+ "properties": {
1662
+ "slack": {
1663
+ "type": "string",
1664
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1665
+ },
1666
+ "teams": {
1667
+ "type": "string",
1668
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1669
+ },
1670
+ "webhook": {
1671
+ "type": "string",
1672
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1673
+ },
1674
+ "webhook_key": {
1675
+ "type": "string",
1676
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1677
+ },
1678
+ "relay": {
1679
+ "type": "string",
1680
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9 ._-]{0,63}$"
1681
+ }
1682
+ },
1683
+ "additionalProperties": false,
1684
+ "minProperties": 1,
1685
+ "dependentRequired": {
1686
+ "webhook": [
1687
+ "webhook_key"
1688
+ ],
1689
+ "webhook_key": [
1690
+ "webhook"
1691
+ ]
1692
+ },
1693
+ "if": {
1694
+ "required": [
1695
+ "relay"
1696
+ ]
1697
+ },
1698
+ "then": {
1699
+ "anyOf": [
1700
+ {
1701
+ "required": [
1702
+ "slack"
1703
+ ]
1704
+ },
1705
+ {
1706
+ "required": [
1707
+ "teams"
1708
+ ]
1709
+ }
1710
+ ]
1711
+ },
1712
+ "description": "The secrets holding Slack, Teams or webhook addresses, and the relay's name."
1713
+ },
1714
+ "cost": {
1715
+ "anyOf": [
1716
+ {
1717
+ "const": true
1718
+ },
1719
+ {
1720
+ "type": "object",
1721
+ "properties": {
1722
+ "key_secret": {
1723
+ "type": "string",
1724
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1725
+ },
1726
+ "command": {
1727
+ "type": "string",
1728
+ "pattern": "\\S"
1729
+ },
1730
+ "approve_above": {
1731
+ "type": "number",
1732
+ "minimum": 0
1733
+ }
1734
+ },
1735
+ "additionalProperties": false
1736
+ }
1737
+ ],
1738
+ "description": "Cost estimates per root in the plan note."
1739
+ },
1740
+ "comments": {
1741
+ "anyOf": [
1742
+ {
1743
+ "type": "string"
1744
+ },
1745
+ {
1746
+ "const": false
1747
+ }
1748
+ ],
1749
+ "description": "GitLab only: the cron of the comments schedule, or false."
1750
+ },
1751
+ "rollouts": {
1752
+ "const": false,
1753
+ "description": "A single repo's key; a control repo runs terragucci respond rollout itself."
1754
+ },
1755
+ "gitlab": {
1756
+ "type": "object",
1757
+ "properties": {
1758
+ "token": {
1759
+ "enum": [
1760
+ "unprotected",
1761
+ "protected"
1762
+ ]
1763
+ }
1764
+ },
1765
+ "additionalProperties": false,
1766
+ "description": "GitLab only: how the project keeps its forge token."
1767
+ },
1768
+ "runtime": {
1769
+ "enum": [
1770
+ "forge"
1771
+ ],
1772
+ "description": "Where the stages run."
1773
+ },
1774
+ "reports": {
1775
+ "type": "object",
1776
+ "properties": {
1777
+ "bucket": {
1778
+ "type": "string"
1779
+ },
1780
+ "endpoint": {},
1781
+ "prefix": {},
1782
+ "url": {
1783
+ "type": "string",
1784
+ "pattern": "^https?://[^\\s?#]+$"
1785
+ },
1786
+ "role": {
1787
+ "type": "string",
1788
+ "pattern": "^arn:aws[\\w-]*:iam::\\d{12}:role/\\S+$"
1789
+ }
1790
+ },
1791
+ "required": [
1792
+ "bucket"
1793
+ ],
1794
+ "description": "A bucket for plan reports: s3://, gs:// or az://."
1795
+ },
1796
+ "token_env": {
1797
+ "type": "string",
1798
+ "description": "The environment variable holding the forge token."
1799
+ },
1800
+ "env": {
1801
+ "type": "object",
1802
+ "additionalProperties": {
1803
+ "type": "string"
1804
+ },
1805
+ "description": "Environment variables every job gets. Values only, never secrets."
1806
+ },
1807
+ "runner": {
1808
+ "anyOf": [
1809
+ {
1810
+ "anyOf": [
1811
+ {
1812
+ "type": "string",
1813
+ "pattern": "^[^\\s,]+$"
1814
+ },
1815
+ {
1816
+ "type": "array",
1817
+ "minItems": 1,
1818
+ "uniqueItems": true,
1819
+ "items": {
1820
+ "type": "string",
1821
+ "pattern": "^[^\\s,]+$"
1822
+ }
1823
+ },
1824
+ {
1825
+ "type": "object",
1826
+ "properties": {
1827
+ "group": {
1828
+ "type": "string",
1829
+ "pattern": "\\S"
1830
+ },
1831
+ "labels": {
1832
+ "type": "array",
1833
+ "minItems": 1,
1834
+ "uniqueItems": true,
1835
+ "items": {
1836
+ "type": "string",
1837
+ "pattern": "^[^\\s,]+$"
1838
+ }
1839
+ }
1840
+ },
1841
+ "additionalProperties": false,
1842
+ "required": [
1843
+ "group"
1844
+ ]
1845
+ }
1846
+ ]
1847
+ },
1848
+ {
1849
+ "type": "object",
1850
+ "minProperties": 1,
1851
+ "not": {
1852
+ "required": [
1853
+ "group"
1854
+ ]
1855
+ },
1856
+ "propertyNames": {
1857
+ "enum": [
1858
+ "default",
1859
+ "plan",
1860
+ "apply",
1861
+ "drift"
1862
+ ]
1863
+ },
1864
+ "additionalProperties": {
1865
+ "anyOf": [
1866
+ {
1867
+ "type": "string",
1868
+ "pattern": "^[^\\s,]+$"
1869
+ },
1870
+ {
1871
+ "type": "array",
1872
+ "minItems": 1,
1873
+ "uniqueItems": true,
1874
+ "items": {
1875
+ "type": "string",
1876
+ "pattern": "^[^\\s,]+$"
1877
+ }
1878
+ },
1879
+ {
1880
+ "type": "object",
1881
+ "properties": {
1882
+ "group": {
1883
+ "type": "string",
1884
+ "pattern": "\\S"
1885
+ },
1886
+ "labels": {
1887
+ "type": "array",
1888
+ "minItems": 1,
1889
+ "uniqueItems": true,
1890
+ "items": {
1891
+ "type": "string",
1892
+ "pattern": "^[^\\s,]+$"
1893
+ }
1894
+ }
1895
+ },
1896
+ "additionalProperties": false,
1897
+ "required": [
1898
+ "group"
1899
+ ]
1900
+ }
1901
+ ]
1902
+ }
1903
+ }
1904
+ ],
1905
+ "description": "The runner each job runs on: a label, a list of labels, a GitHub runner group, or one per stage."
1906
+ },
1907
+ "pass": {
1908
+ "type": "object",
1909
+ "properties": {
1910
+ "secrets": {
1911
+ "type": "array",
1912
+ "minItems": 1,
1913
+ "uniqueItems": true,
1914
+ "items": {
1915
+ "type": "string",
1916
+ "pattern": "^(?!(?:[Gg][Ii][Tt][Hh][Uu][Bb]_|[Gg][Ii][Tt][Ee][Aa]_|[Ff][Oo][Rr][Gg][Ee][Jj][Oo]_|[Tt][Gg]_|[Tt][Ee][Rr][Rr][Aa][Gg][Uu][Cc][Cc][Ii]_))(?!(?:TF_IN_AUTOMATION|TF_INPUT)$)[A-Za-z_][A-Za-z0-9_]*$"
1917
+ }
1918
+ },
1919
+ "vars": {
1920
+ "type": "array",
1921
+ "minItems": 1,
1922
+ "uniqueItems": true,
1923
+ "items": {
1924
+ "type": "string",
1925
+ "pattern": "^(?!(?:[Gg][Ii][Tt][Hh][Uu][Bb]_|[Gg][Ii][Tt][Ee][Aa]_|[Ff][Oo][Rr][Gg][Ee][Jj][Oo]_|[Tt][Gg]_|[Tt][Ee][Rr][Rr][Aa][Gg][Uu][Cc][Cc][Ii]_))(?!(?:TF_IN_AUTOMATION|TF_INPUT)$)[A-Za-z_][A-Za-z0-9_]*$"
1926
+ }
1927
+ }
1928
+ },
1929
+ "additionalProperties": false,
1930
+ "minProperties": 1,
1931
+ "description": "Names of CI secrets and variables the plan, apply and drift jobs get."
1932
+ },
1933
+ "telemetry": {
1934
+ "type": "object",
1935
+ "properties": {
1936
+ "headers_secret": {
1937
+ "type": "string",
1938
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
1939
+ },
1940
+ "trace_url": {
1941
+ "type": "string",
1942
+ "pattern": "^https?://\\S*\\{trace_id\\}\\S*$"
1943
+ }
1944
+ },
1945
+ "additionalProperties": false,
1946
+ "minProperties": 1,
1947
+ "description": "The secret holding OTLP headers, and a trace link with {trace_id}."
1948
+ },
1949
+ "tips": {
1950
+ "type": "boolean",
1951
+ "description": "Tips in the plan note."
1952
+ },
1953
+ "modules": {
1954
+ "type": "object",
1955
+ "properties": {
1956
+ "path": {
1957
+ "type": "string"
1958
+ },
1959
+ "publish": {
1960
+ "anyOf": [
1961
+ {
1962
+ "type": "string",
1963
+ "pattern": "^(?:git-tags$|oci://[^/]+/.)"
1964
+ },
1965
+ {
1966
+ "type": "array",
1967
+ "items": {
1968
+ "type": "string",
1969
+ "pattern": "^(?:git-tags$|oci://[^/]+/.)"
1970
+ }
1971
+ }
1972
+ ]
1973
+ },
1974
+ "attest": {
1975
+ "anyOf": [
1976
+ {
1977
+ "type": "boolean"
1978
+ },
1979
+ {
1980
+ "type": "object",
1981
+ "properties": {
1982
+ "key": {
1983
+ "type": "string",
1984
+ "minLength": 1
1985
+ }
1986
+ },
1987
+ "additionalProperties": false
1988
+ }
1989
+ ]
1990
+ },
1991
+ "require": {
1992
+ "const": "attested"
1993
+ },
1994
+ "trusted": {
1995
+ "type": "array",
1996
+ "items": {
1997
+ "type": "object",
1998
+ "properties": {
1999
+ "source": {
2000
+ "type": "string",
2001
+ "pattern": "^(oci://[^/]+/.+|(git::)?(https?|ssh)://.+)$"
2002
+ },
2003
+ "key": {
2004
+ "type": "string",
2005
+ "minLength": 1
2006
+ },
2007
+ "ledger": {
2008
+ "type": "string",
2009
+ "pattern": "^(https?|ssh|file)://."
2010
+ }
2011
+ },
2012
+ "additionalProperties": false,
2013
+ "required": [
2014
+ "source",
2015
+ "key",
2016
+ "ledger"
2017
+ ]
2018
+ }
2019
+ },
2020
+ "test": {
2021
+ "type": "boolean"
2022
+ },
2023
+ "registry": {
2024
+ "type": "object",
2025
+ "properties": {
2026
+ "bucket": {
2027
+ "type": "string"
2028
+ },
2029
+ "dir": {
2030
+ "type": "string",
2031
+ "minLength": 1,
2032
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$))"
2033
+ },
2034
+ "endpoint": {
2035
+ "type": "string"
2036
+ },
2037
+ "prefix": {
2038
+ "type": "string"
2039
+ },
2040
+ "url": {
2041
+ "type": "string",
2042
+ "pattern": "^https://[^/\\s?#]+/?$"
2043
+ },
2044
+ "namespace": {
2045
+ "type": "string",
2046
+ "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z_-]{0,62}[0-9A-Za-z])?$"
2047
+ },
2048
+ "namespaces": {
2049
+ "type": "object",
2050
+ "propertyNames": {
2051
+ "pattern": "^[^/]"
2052
+ },
2053
+ "additionalProperties": {
2054
+ "type": "string",
2055
+ "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z_-]{0,62}[0-9A-Za-z])?$"
2056
+ }
2057
+ },
2058
+ "system": {
2059
+ "type": "string",
2060
+ "pattern": "^[0-9a-z]{1,64}$"
2061
+ },
2062
+ "download": {
2063
+ "enum": [
2064
+ "tarball",
2065
+ "git-tags",
2066
+ "oci"
2067
+ ]
2068
+ }
2069
+ },
2070
+ "additionalProperties": false,
2071
+ "required": [
2072
+ "url",
2073
+ "namespace"
2074
+ ],
2075
+ "oneOf": [
2076
+ {
2077
+ "required": [
2078
+ "bucket"
2079
+ ]
2080
+ },
2081
+ {
2082
+ "required": [
2083
+ "dir"
2084
+ ]
2085
+ }
2086
+ ],
2087
+ "dependentRequired": {
2088
+ "endpoint": [
2089
+ "bucket"
2090
+ ]
2091
+ }
2092
+ }
2093
+ },
2094
+ "additionalProperties": false,
2095
+ "description": "Module publishing, attestation and the module registry."
2096
+ },
2097
+ "oidc": {
2098
+ "type": "object",
2099
+ "properties": {
2100
+ "plan_role": {
2101
+ "type": "string",
2102
+ "minLength": 1
2103
+ },
2104
+ "apply_role": {
2105
+ "type": "string",
2106
+ "minLength": 1
2107
+ },
2108
+ "audience": {
2109
+ "type": "string"
2110
+ },
2111
+ "roles": {
2112
+ "type": "object",
2113
+ "minProperties": 1,
2114
+ "additionalProperties": {
2115
+ "type": "object",
2116
+ "properties": {
2117
+ "plan": {
2118
+ "type": "string",
2119
+ "minLength": 1
2120
+ },
2121
+ "apply": {
2122
+ "type": "string",
2123
+ "minLength": 1
2124
+ }
2125
+ },
2126
+ "additionalProperties": false,
2127
+ "required": [
2128
+ "plan",
2129
+ "apply"
2130
+ ]
2131
+ }
2132
+ },
2133
+ "gcp": {
2134
+ "type": "object",
2135
+ "properties": {
2136
+ "workload_identity_provider": {
2137
+ "type": "string",
2138
+ "pattern": "^projects\\/[0-9]+\\/locations\\/global\\/workloadIdentityPools\\/[^/\\s]+\\/providers\\/[^/\\s]+$"
2139
+ },
2140
+ "plan_service_account": {
2141
+ "type": "string",
2142
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
2143
+ },
2144
+ "apply_service_account": {
2145
+ "type": "string",
2146
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
2147
+ },
2148
+ "token_url": {
2149
+ "type": "string",
2150
+ "pattern": "^https://[^\\s/]+/\\S*$"
2151
+ },
2152
+ "roles": {
2153
+ "type": "object",
2154
+ "minProperties": 1,
2155
+ "additionalProperties": {
2156
+ "type": "object",
2157
+ "properties": {
2158
+ "plan": {
2159
+ "type": "string",
2160
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
2161
+ },
2162
+ "apply": {
2163
+ "type": "string",
2164
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
2165
+ }
2166
+ },
2167
+ "additionalProperties": false,
2168
+ "required": [
2169
+ "plan",
2170
+ "apply"
2171
+ ]
2172
+ }
2173
+ }
2174
+ },
2175
+ "additionalProperties": false,
2176
+ "required": [
2177
+ "workload_identity_provider",
2178
+ "plan_service_account",
2179
+ "apply_service_account"
2180
+ ]
2181
+ },
2182
+ "azure": {
2183
+ "type": "object",
2184
+ "properties": {
2185
+ "tenant_id": {
2186
+ "type": "string",
2187
+ "minLength": 1
2188
+ },
2189
+ "subscription_id": {
2190
+ "type": "string",
2191
+ "minLength": 1
2192
+ },
2193
+ "plan_client_id": {
2194
+ "type": "string",
2195
+ "minLength": 1
2196
+ },
2197
+ "apply_client_id": {
2198
+ "type": "string",
2199
+ "minLength": 1
2200
+ },
2201
+ "audience": {
2202
+ "type": "string",
2203
+ "minLength": 1
2204
+ },
2205
+ "roles": {
2206
+ "type": "object",
2207
+ "minProperties": 1,
2208
+ "additionalProperties": {
2209
+ "type": "object",
2210
+ "properties": {
2211
+ "plan": {
2212
+ "type": "string",
2213
+ "minLength": 1
2214
+ },
2215
+ "apply": {
2216
+ "type": "string",
2217
+ "minLength": 1
2218
+ }
2219
+ },
2220
+ "additionalProperties": false,
2221
+ "required": [
2222
+ "plan",
2223
+ "apply"
2224
+ ]
2225
+ }
2226
+ }
2227
+ },
2228
+ "additionalProperties": false,
2229
+ "required": [
2230
+ "tenant_id",
2231
+ "subscription_id",
2232
+ "plan_client_id",
2233
+ "apply_client_id"
2234
+ ]
2235
+ }
2236
+ },
2237
+ "additionalProperties": false,
2238
+ "minProperties": 1,
2239
+ "dependentRequired": {
2240
+ "plan_role": [
2241
+ "apply_role"
2242
+ ],
2243
+ "apply_role": [
2244
+ "plan_role"
2245
+ ]
2246
+ },
2247
+ "if": {
2248
+ "required": [
2249
+ "audience"
2250
+ ],
2251
+ "not": {
2252
+ "required": [
2253
+ "roles"
2254
+ ]
2255
+ }
2256
+ },
2257
+ "then": {
2258
+ "required": [
2259
+ "plan_role",
2260
+ "apply_role"
2261
+ ]
2262
+ },
2263
+ "description": "Cloud identities the jobs take over OIDC: a read-only one for plan, a write one for apply."
2264
+ },
2265
+ "parallelism": {
2266
+ "type": "integer",
2267
+ "minimum": 1,
2268
+ "description": "How many roots of one dependency layer plan at once."
2269
+ },
2270
+ "terragrunt": {
2271
+ "type": "object",
2272
+ "properties": {
2273
+ "version": {
2274
+ "type": "string",
2275
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.]+)?$"
2276
+ },
2277
+ "exclude": {
2278
+ "type": "array",
2279
+ "items": {
2280
+ "type": "string"
2281
+ }
2282
+ },
2283
+ "parallelism": {
2284
+ "type": "integer",
2285
+ "minimum": 1
2286
+ },
2287
+ "dependents": {
2288
+ "enum": [
2289
+ "follow",
2290
+ "plan"
2291
+ ]
2292
+ },
2293
+ "credentials": {
2294
+ "type": "object",
2295
+ "additionalProperties": {
2296
+ "type": "object",
2297
+ "properties": {
2298
+ "plan": {
2299
+ "type": "string",
2300
+ "minLength": 1
2301
+ },
2302
+ "apply": {
2303
+ "type": "string",
2304
+ "minLength": 1
2305
+ }
2306
+ },
2307
+ "additionalProperties": false,
2308
+ "required": [
2309
+ "plan",
2310
+ "apply"
2311
+ ]
2312
+ }
2313
+ }
2314
+ },
2315
+ "additionalProperties": false,
2316
+ "description": "Terragrunt settings."
2317
+ },
2318
+ "atmos": {
2319
+ "type": "object",
2320
+ "properties": {
2321
+ "version": {
2322
+ "type": "string",
2323
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.]+)?$"
2324
+ }
2325
+ },
2326
+ "additionalProperties": false,
2327
+ "description": "Atmos settings."
2328
+ },
2329
+ "policy": {
2330
+ "type": "object",
2331
+ "properties": {
2332
+ "engine": {
2333
+ "enum": [
2334
+ "conftest",
2335
+ "opa"
2336
+ ]
2337
+ },
2338
+ "path": {
2339
+ "type": "string",
2340
+ "minLength": 1,
2341
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$))"
2342
+ },
2343
+ "source": {
2344
+ "type": "string",
2345
+ "pattern": "^git\\+(https?|file)://.*@"
2346
+ },
2347
+ "namespace": {
2348
+ "type": "string",
2349
+ "pattern": "^[A-Za-z_][A-Za-z0-9_.]*$"
2350
+ },
2351
+ "input": {
2352
+ "enum": [
2353
+ "plan",
2354
+ "hcp"
2355
+ ]
2356
+ },
2357
+ "override": {
2358
+ "type": "array",
2359
+ "minItems": 1,
2360
+ "items": {
2361
+ "type": "string",
2362
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
2363
+ }
2364
+ }
2365
+ },
2366
+ "additionalProperties": false,
2367
+ "description": "Policy checks over each plan."
2368
+ },
2369
+ "atlantis_comments": {
2370
+ "type": "boolean",
2371
+ "description": "Read atlantis plan and atlantis apply comments as terragucci's."
2372
+ },
2373
+ "respond": {
2374
+ "type": "object",
2375
+ "properties": {
2376
+ "plan": {
2377
+ "enum": [
2378
+ "summary"
2379
+ ]
2380
+ },
2381
+ "wave-refused": {
2382
+ "enum": [
2383
+ "diff",
2384
+ "off"
2385
+ ]
2386
+ },
2387
+ "apply-failed": {
2388
+ "enum": [
2389
+ "triage",
2390
+ "off"
2391
+ ]
2392
+ },
2393
+ "drift": {
2394
+ "enum": [
2395
+ "pull-request",
2396
+ "attribute",
2397
+ "off"
2398
+ ]
2399
+ },
2400
+ "tips": {
2401
+ "enum": [
2402
+ "pull-request",
2403
+ "off"
2404
+ ]
2405
+ },
2406
+ "fmt": {
2407
+ "enum": [
2408
+ "commit",
2409
+ "off"
2410
+ ]
2411
+ },
2412
+ "publish": {
2413
+ "enum": [
2414
+ "notes",
2415
+ "off"
2416
+ ]
2417
+ },
2418
+ "rollout": {
2419
+ "enum": [
2420
+ "next-wave",
2421
+ "off"
2422
+ ]
2423
+ },
2424
+ "version-bump": {
2425
+ "enum": [
2426
+ "off",
2427
+ "suggest"
2428
+ ]
2429
+ },
2430
+ "description": {
2431
+ "enum": [
2432
+ "off",
2433
+ "check"
2434
+ ]
2435
+ }
2436
+ },
2437
+ "additionalProperties": false,
2438
+ "description": "The response to each pipeline event."
2439
+ },
2440
+ "agent": {
2441
+ "type": "object",
2442
+ "properties": {
2443
+ "via": {
2444
+ "enum": [
2445
+ "forge"
2446
+ ]
2447
+ },
2448
+ "token_env": {
2449
+ "type": "string",
2450
+ "minLength": 1
2451
+ },
2452
+ "comment": {
2453
+ "anyOf": [
2454
+ {
2455
+ "type": "boolean"
2456
+ },
2457
+ {
2458
+ "type": "object",
2459
+ "properties": {
2460
+ "command": {
2461
+ "type": "string",
2462
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
2463
+ },
2464
+ "key_secret": {
2465
+ "type": "string",
2466
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
2467
+ },
2468
+ "max_turns": {
2469
+ "type": "integer",
2470
+ "minimum": 1
2471
+ },
2472
+ "timeout": {
2473
+ "type": "integer",
2474
+ "minimum": 1
2475
+ }
2476
+ },
2477
+ "additionalProperties": false
2478
+ }
2479
+ ]
2480
+ },
2481
+ "drift": {
2482
+ "anyOf": [
2483
+ {
2484
+ "type": "boolean"
2485
+ },
2486
+ {
2487
+ "type": "object",
2488
+ "properties": {
2489
+ "command": {
2490
+ "type": "string",
2491
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
2492
+ },
2493
+ "key_secret": {
2494
+ "type": "string",
2495
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
2496
+ },
2497
+ "max_turns": {
2498
+ "type": "integer",
2499
+ "minimum": 1
2500
+ },
2501
+ "timeout": {
2502
+ "type": "integer",
2503
+ "minimum": 1
2504
+ }
2505
+ },
2506
+ "additionalProperties": false
2507
+ }
2508
+ ]
2509
+ }
2510
+ },
2511
+ "additionalProperties": false,
2512
+ "required": [
2513
+ "via",
2514
+ "token_env"
2515
+ ],
2516
+ "description": "The coding agent behind /terragucci agent and the drift agent."
2517
+ },
2518
+ "review": {
2519
+ "type": "object",
2520
+ "properties": {
2521
+ "agent": {
2522
+ "type": "boolean"
2523
+ },
2524
+ "command": {
2525
+ "type": "string",
2526
+ "pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
2527
+ },
2528
+ "key_secret": {
2529
+ "type": "string",
2530
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
2531
+ },
2532
+ "instructions": {
2533
+ "type": "string",
2534
+ "pattern": "^(?:\\./)?(?!/)[A-Za-z0-9_./-]+$"
2535
+ },
2536
+ "timeout": {
2537
+ "type": "integer",
2538
+ "minimum": 1
2539
+ }
2540
+ },
2541
+ "additionalProperties": false,
2542
+ "anyOf": [
2543
+ {
2544
+ "maxProperties": 0
2545
+ },
2546
+ {
2547
+ "required": [
2548
+ "agent"
2549
+ ]
2550
+ }
2551
+ ],
2552
+ "description": "A model's review of each pull request's intent against its plan."
2553
+ },
2554
+ "decide": {
2555
+ "type": "object",
2556
+ "properties": {
2557
+ "backend": {
2558
+ "enum": [
2559
+ "laya",
2560
+ "von",
2561
+ "decider",
2562
+ "jev"
2563
+ ]
2564
+ },
2565
+ "url": {
2566
+ "type": "string",
2567
+ "pattern": "^https?://[^/\\s]+"
2568
+ },
2569
+ "model": {
2570
+ "type": "string",
2571
+ "minLength": 1,
2572
+ "pattern": "^(?![\\s\\S]*(?:^|[-_.])(?:latest|preview)$)"
2573
+ },
2574
+ "token_env": {
2575
+ "type": "string",
2576
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
2577
+ },
2578
+ "thresholds": {
2579
+ "type": "object",
2580
+ "properties": {
2581
+ "noul": {
2582
+ "type": "number",
2583
+ "exclusiveMinimum": 0,
2584
+ "maximum": 1
2585
+ },
2586
+ "choice": {
2587
+ "type": "number",
2588
+ "exclusiveMinimum": 0,
2589
+ "maximum": 1
2590
+ },
2591
+ "score": {
2592
+ "type": "number",
2593
+ "exclusiveMinimum": 0,
2594
+ "maximum": 1
2595
+ }
2596
+ },
2597
+ "additionalProperties": false
2598
+ }
2599
+ },
2600
+ "additionalProperties": false,
2601
+ "required": [
2602
+ "backend"
2603
+ ],
2604
+ "allOf": [
2605
+ {
2606
+ "if": {
2607
+ "properties": {
2608
+ "backend": {
2609
+ "const": "jev"
2610
+ }
2611
+ }
2612
+ },
2613
+ "then": {
2614
+ "required": [
2615
+ "token_env"
2616
+ ]
2617
+ },
2618
+ "else": {
2619
+ "required": [
2620
+ "url"
2621
+ ]
2622
+ }
2623
+ },
2624
+ {
2625
+ "if": {
2626
+ "properties": {
2627
+ "backend": {
2628
+ "const": "laya"
2629
+ }
2630
+ }
2631
+ },
2632
+ "else": {
2633
+ "required": [
2634
+ "model"
2635
+ ]
2636
+ }
2637
+ }
2638
+ ],
2639
+ "description": "The typed-decision service."
2640
+ },
2641
+ "audit_region": {
2642
+ "type": "string",
2643
+ "pattern": "^[a-z]{2}(-[a-z]+)+-\\d+$",
2644
+ "description": "The AWS region whose CloudTrail drift attribution reads."
2645
+ },
2646
+ "dashboards": {
2647
+ "anyOf": [
2648
+ {
2649
+ "type": "boolean"
2650
+ },
2651
+ {
2652
+ "type": "object",
2653
+ "properties": {
2654
+ "dir": {
2655
+ "type": "string",
2656
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$))[^\\r\\n]+$"
2657
+ },
2658
+ "prometheus": {
2659
+ "type": "string",
2660
+ "pattern": "^[^\\r\\n]+$"
2661
+ },
2662
+ "tempo": {
2663
+ "type": "string",
2664
+ "pattern": "^[^\\r\\n]+$"
2665
+ },
2666
+ "folder": {
2667
+ "type": "string",
2668
+ "pattern": "^[^\\r\\n]+$"
2669
+ },
2670
+ "path": {
2671
+ "type": "string",
2672
+ "pattern": "^[^\\r\\n]+$"
2673
+ },
2674
+ "drift_age": {
2675
+ "type": "string",
2676
+ "pattern": "^(\\d+(ms|s|m|h|d|w|y))+$"
2677
+ },
2678
+ "wave_wait": {
2679
+ "type": "string",
2680
+ "pattern": "^(\\d+(ms|s|m|h|d|w|y))+$"
2681
+ },
2682
+ "schedule": {
2683
+ "type": "string",
2684
+ "pattern": "^(\\d+(ms|s|m|h|d|w|y))+$"
2685
+ }
2686
+ },
2687
+ "additionalProperties": false
2688
+ }
2689
+ ],
2690
+ "description": "Dashboards and alert rules written next to the pipeline."
2691
+ },
2692
+ "own_jobs": {
2693
+ "anyOf": [
2694
+ {
2695
+ "type": "string",
2696
+ "pattern": "^(?!/)(?!(?:.*/)?\\.\\.(?:/|$)).*\\.ya?ml$"
2697
+ },
2698
+ {
2699
+ "type": "object",
2700
+ "minProperties": 1,
2701
+ "propertyNames": {
2702
+ "type": "string",
2703
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2704
+ },
2705
+ "additionalProperties": {
2706
+ "type": "object",
2707
+ "minProperties": 1
2708
+ }
2709
+ }
2710
+ ],
2711
+ "description": "Jobs of your own, in the forge's syntax, or the path of a YAML file holding them."
2712
+ },
2713
+ "ephemeral": {
2714
+ "type": "object",
2715
+ "properties": {
2716
+ "roots": {
2717
+ "type": "array",
2718
+ "minItems": 1,
2719
+ "items": {
2720
+ "type": "string",
2721
+ "pattern": "^[^\\s,;=']+$"
2722
+ }
2723
+ },
2724
+ "ttl": {
2725
+ "type": "string",
2726
+ "pattern": "^[1-9]\\d*[mhd]$"
2727
+ },
2728
+ "sweep": {
2729
+ "type": "integer",
2730
+ "minimum": 5,
2731
+ "maximum": 60
2732
+ }
2733
+ },
2734
+ "additionalProperties": false,
2735
+ "required": [
2736
+ "roots"
2737
+ ],
2738
+ "description": "Roots each pull request gets a copy of."
2739
+ }
2740
+ },
2741
+ "additionalProperties": false
2742
+ },
2743
+ "generate": {
2744
+ "type": "object",
2745
+ "properties": {
2746
+ "backend": {
2747
+ "anyOf": [
2748
+ {
2749
+ "type": "null"
2750
+ },
2751
+ {
2752
+ "type": "object",
2753
+ "minProperties": 1,
2754
+ "maxProperties": 1,
2755
+ "propertyNames": {
2756
+ "type": "string",
2757
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2758
+ },
2759
+ "additionalProperties": {
2760
+ "type": "object",
2761
+ "propertyNames": {
2762
+ "type": "string",
2763
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2764
+ },
2765
+ "additionalProperties": {
2766
+ "anyOf": [
2767
+ {
2768
+ "type": "null"
2769
+ },
2770
+ {
2771
+ "$ref": "#/$defs/hcl_value"
2772
+ }
2773
+ ]
2774
+ }
2775
+ }
2776
+ }
2777
+ ]
2778
+ },
2779
+ "providers": {
2780
+ "type": "object",
2781
+ "propertyNames": {
2782
+ "type": "string",
2783
+ "pattern": "^[a-z][a-z0-9_-]*(\\.[A-Za-z_][A-Za-z0-9_-]*)?$"
2784
+ },
2785
+ "additionalProperties": {
2786
+ "anyOf": [
2787
+ {
2788
+ "type": "null"
2789
+ },
2790
+ {
2791
+ "type": "object",
2792
+ "properties": {
2793
+ "source": {
2794
+ "type": [
2795
+ "string",
2796
+ "null"
2797
+ ]
2798
+ },
2799
+ "version": {
2800
+ "type": [
2801
+ "string",
2802
+ "null"
2803
+ ]
2804
+ }
2805
+ },
2806
+ "propertyNames": {
2807
+ "type": "string",
2808
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2809
+ },
2810
+ "additionalProperties": {
2811
+ "anyOf": [
2812
+ {
2813
+ "type": "null"
2814
+ },
2815
+ {
2816
+ "$ref": "#/$defs/hcl_value"
2817
+ }
2818
+ ]
2819
+ },
2820
+ "not": {
2821
+ "required": [
2822
+ "alias"
2823
+ ]
2824
+ }
2825
+ }
2826
+ ]
2827
+ }
2828
+ },
2829
+ "required_version": {
2830
+ "anyOf": [
2831
+ {
2832
+ "type": "null"
2833
+ },
2834
+ {
2835
+ "type": "string",
2836
+ "pattern": "\\S"
2837
+ }
2838
+ ]
2839
+ },
2840
+ "disable_init": {
2841
+ "type": [
2842
+ "boolean",
2843
+ "null"
2844
+ ]
2845
+ },
2846
+ "dirs": {
2847
+ "type": "object",
2848
+ "additionalProperties": {
2849
+ "anyOf": [
2850
+ {
2851
+ "type": "null"
2852
+ },
2853
+ {
2854
+ "$ref": "#/$defs/generate_level"
2855
+ }
2856
+ ]
2857
+ }
2858
+ },
2859
+ "roots": {
2860
+ "type": "object",
2861
+ "additionalProperties": {
2862
+ "anyOf": [
2863
+ {
2864
+ "type": "null"
2865
+ },
2866
+ {
2867
+ "$ref": "#/$defs/generate_level"
2868
+ }
2869
+ ]
2870
+ }
2871
+ }
2872
+ },
2873
+ "additionalProperties": false
2874
+ },
2875
+ "generate_level": {
2876
+ "type": "object",
2877
+ "properties": {
2878
+ "backend": {
2879
+ "anyOf": [
2880
+ {
2881
+ "type": "null"
2882
+ },
2883
+ {
2884
+ "type": "object",
2885
+ "minProperties": 1,
2886
+ "maxProperties": 1,
2887
+ "propertyNames": {
2888
+ "type": "string",
2889
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2890
+ },
2891
+ "additionalProperties": {
2892
+ "type": "object",
2893
+ "propertyNames": {
2894
+ "type": "string",
2895
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2896
+ },
2897
+ "additionalProperties": {
2898
+ "anyOf": [
2899
+ {
2900
+ "type": "null"
2901
+ },
2902
+ {
2903
+ "$ref": "#/$defs/hcl_value"
2904
+ }
2905
+ ]
2906
+ }
2907
+ }
2908
+ }
2909
+ ]
2910
+ },
2911
+ "providers": {
2912
+ "type": "object",
2913
+ "propertyNames": {
2914
+ "type": "string",
2915
+ "pattern": "^[a-z][a-z0-9_-]*(\\.[A-Za-z_][A-Za-z0-9_-]*)?$"
2916
+ },
2917
+ "additionalProperties": {
2918
+ "anyOf": [
2919
+ {
2920
+ "type": "null"
2921
+ },
2922
+ {
2923
+ "type": "object",
2924
+ "properties": {
2925
+ "source": {
2926
+ "type": [
2927
+ "string",
2928
+ "null"
2929
+ ]
2930
+ },
2931
+ "version": {
2932
+ "type": [
2933
+ "string",
2934
+ "null"
2935
+ ]
2936
+ }
2937
+ },
2938
+ "propertyNames": {
2939
+ "type": "string",
2940
+ "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$"
2941
+ },
2942
+ "additionalProperties": {
2943
+ "anyOf": [
2944
+ {
2945
+ "type": "null"
2946
+ },
2947
+ {
2948
+ "$ref": "#/$defs/hcl_value"
2949
+ }
2950
+ ]
2951
+ },
2952
+ "not": {
2953
+ "required": [
2954
+ "alias"
2955
+ ]
2956
+ }
2957
+ }
2958
+ ]
2959
+ }
2960
+ },
2961
+ "required_version": {
2962
+ "anyOf": [
2963
+ {
2964
+ "type": "null"
2965
+ },
2966
+ {
2967
+ "type": "string",
2968
+ "pattern": "\\S"
2969
+ }
2970
+ ]
2971
+ },
2972
+ "disable_init": {
2973
+ "type": [
2974
+ "boolean",
2975
+ "null"
2976
+ ]
2977
+ }
2978
+ },
2979
+ "additionalProperties": false
2980
+ },
2981
+ "hcl_value": {
2982
+ "anyOf": [
2983
+ {
2984
+ "type": [
2985
+ "string",
2986
+ "number",
2987
+ "boolean"
2988
+ ]
2989
+ },
2990
+ {
2991
+ "type": "array",
2992
+ "items": {
2993
+ "$ref": "#/$defs/hcl_value"
2994
+ }
2995
+ },
2996
+ {
2997
+ "type": "object",
2998
+ "additionalProperties": {
2999
+ "$ref": "#/$defs/hcl_value"
3000
+ }
3001
+ }
3002
+ ]
3003
+ }
3004
+ }
3005
+ }