release-skill 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/CHANGELOG.md +60 -0
  5. package/INSTALL.md +179 -5
  6. package/INSTALL.zh-CN.md +320 -0
  7. package/README.md +347 -67
  8. package/README.zh-CN.md +318 -59
  9. package/adapters/claude/.claude-plugin/marketplace.json +1 -1
  10. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  11. package/adapters/claude/skills/release-help/SKILL.md +7 -4
  12. package/adapters/claude/skills/release-prepare/SKILL.md +11 -1
  13. package/adapters/claude/skills/release-publish/SKILL.md +6 -3
  14. package/adapters/claude/skills/release-reconcile/SKILL.md +1 -1
  15. package/adapters/claude/skills/release-setup/SKILL.md +111 -0
  16. package/adapters/claude/skills/release-verify/SKILL.md +5 -2
  17. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  18. package/adapters/codex/skills/release-help/SKILL.md +7 -4
  19. package/adapters/codex/skills/release-prepare/SKILL.md +11 -1
  20. package/adapters/codex/skills/release-publish/SKILL.md +6 -3
  21. package/adapters/codex/skills/release-reconcile/SKILL.md +1 -1
  22. package/adapters/codex/skills/release-setup/SKILL.md +111 -0
  23. package/adapters/codex/skills/release-verify/SKILL.md +5 -2
  24. package/bin/release-skill.mjs +65 -9
  25. package/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  26. package/native/safe-write/prebuilds.json +22 -2
  27. package/native/safe-write/src/safe_write.cc +11 -2
  28. package/package.json +3 -1
  29. package/references/02-project-config.md +54 -3
  30. package/references/05-evidence-and-errors.md +6 -2
  31. package/schemas/release-plan.schema.json +550 -65
  32. package/schemas/release-project.schema.json +398 -29
  33. package/schemas/release-run.schema.json +165 -18
  34. package/skills/release-help/SKILL.md +7 -4
  35. package/skills/release-prepare/SKILL.md +11 -1
  36. package/skills/release-publish/SKILL.md +6 -3
  37. package/skills/release-reconcile/SKILL.md +1 -1
  38. package/skills/release-setup/SKILL.md +111 -0
  39. package/skills/release-verify/SKILL.md +5 -2
  40. package/skills-src/release-help/SKILL.md +7 -4
  41. package/skills-src/release-prepare/SKILL.md +11 -1
  42. package/skills-src/release-publish/SKILL.md +6 -3
  43. package/skills-src/release-reconcile/SKILL.md +1 -1
  44. package/skills-src/release-setup/SKILL.md +111 -0
  45. package/skills-src/release-verify/SKILL.md +5 -2
  46. package/src/adapters/contract.mjs +3 -0
  47. package/src/adapters/git-github.mjs +84 -2
  48. package/src/adapters/plugin-marketplace.mjs +65 -21
  49. package/src/adapters/push-snapshot.mjs +84 -17
  50. package/src/commands/prepare.mjs +223 -20
  51. package/src/commands/publish.mjs +45 -0
  52. package/src/commands/reconcile.mjs +152 -0
  53. package/src/commands/setup.mjs +886 -0
  54. package/src/commands/verify.mjs +122 -26
  55. package/src/core/config.mjs +34 -0
  56. package/src/core/errors.mjs +4 -0
  57. package/src/core/plan.mjs +123 -0
  58. package/src/core/previous-public-baseline.mjs +21 -1
  59. package/src/core/verification-gates.mjs +451 -0
  60. package/src/snapshot/frozen.mjs +89 -5
@@ -4,7 +4,13 @@
4
4
  "title": "Release Plan",
5
5
  "description": "Schema for frozen release plan produced by the prepare phase",
6
6
  "type": "object",
7
- "required": ["planVersion", "status", "baseline", "units", "externalActions"],
7
+ "required": [
8
+ "planVersion",
9
+ "status",
10
+ "baseline",
11
+ "units",
12
+ "externalActions"
13
+ ],
8
14
  "additionalProperties": false,
9
15
  "properties": {
10
16
  "planVersion": {
@@ -28,16 +34,26 @@
28
34
  },
29
35
  "production": {
30
36
  "type": "object",
31
- "required": ["mode", "assetRoot"],
37
+ "required": [
38
+ "mode",
39
+ "assetRoot"
40
+ ],
32
41
  "additionalProperties": false,
33
42
  "properties": {
34
- "mode": { "const": "github-npm-v1" },
35
- "assetRoot": { "type": "string", "minLength": 1 }
43
+ "mode": {
44
+ "const": "github-npm-v1"
45
+ },
46
+ "assetRoot": {
47
+ "type": "string",
48
+ "minLength": 1
49
+ }
36
50
  }
37
51
  },
38
52
  "baseline": {
39
53
  "type": "object",
40
- "required": ["gitTreeHash"],
54
+ "required": [
55
+ "gitTreeHash"
56
+ ],
41
57
  "additionalProperties": false,
42
58
  "properties": {
43
59
  "gitTreeHash": {
@@ -59,7 +75,9 @@
59
75
  },
60
76
  "dirtyFiles": {
61
77
  "type": "array",
62
- "items": { "type": "string" }
78
+ "items": {
79
+ "type": "string"
80
+ }
63
81
  },
64
82
  "capturedAt": {
65
83
  "type": "string",
@@ -72,7 +90,11 @@
72
90
  "minItems": 1,
73
91
  "items": {
74
92
  "type": "object",
75
- "required": ["id", "targetVersion", "previousPublicBaseline"],
93
+ "required": [
94
+ "id",
95
+ "targetVersion",
96
+ "previousPublicBaseline"
97
+ ],
76
98
  "additionalProperties": false,
77
99
  "properties": {
78
100
  "id": {
@@ -99,53 +121,229 @@
99
121
  },
100
122
  "productionConfig": {
101
123
  "type": "object",
124
+ "required": [
125
+ "githubHost",
126
+ "branchTemplate",
127
+ "branchStrategy"
128
+ ],
102
129
  "additionalProperties": false,
103
130
  "properties": {
104
- "githubHost": { "type": "string" },
105
- "branchTemplate": { "type": "string" },
106
- "releaseTitleTemplate": { "type": "string" },
107
- "releaseNotes": { "type": "string" }
108
- }
131
+ "githubHost": {
132
+ "type": "string"
133
+ },
134
+ "branchTemplate": {
135
+ "type": "string"
136
+ },
137
+ "releaseTitleTemplate": {
138
+ "type": "string"
139
+ },
140
+ "releaseNotes": {
141
+ "type": "string"
142
+ },
143
+ "branchStrategy": {
144
+ "type": "string",
145
+ "enum": [
146
+ "create-release-branch",
147
+ "advance-existing-branch",
148
+ "initialize-default-branch"
149
+ ]
150
+ },
151
+ "setAsDefaultBranch": {
152
+ "type": "boolean"
153
+ },
154
+ "expectedCurrentDefaultBranch": {
155
+ "type": "string",
156
+ "minLength": 1
157
+ }
158
+ },
159
+ "allOf": [
160
+ {
161
+ "if": {
162
+ "properties": {
163
+ "branchStrategy": {
164
+ "const": "initialize-default-branch"
165
+ }
166
+ },
167
+ "required": [
168
+ "branchStrategy"
169
+ ]
170
+ },
171
+ "then": {
172
+ "required": [
173
+ "setAsDefaultBranch",
174
+ "expectedCurrentDefaultBranch"
175
+ ],
176
+ "properties": {
177
+ "setAsDefaultBranch": {
178
+ "const": true
179
+ }
180
+ }
181
+ }
182
+ },
183
+ {
184
+ "if": {
185
+ "properties": {
186
+ "setAsDefaultBranch": {
187
+ "const": true
188
+ }
189
+ },
190
+ "required": [
191
+ "setAsDefaultBranch"
192
+ ]
193
+ },
194
+ "then": {
195
+ "properties": {
196
+ "branchStrategy": {
197
+ "const": "initialize-default-branch"
198
+ }
199
+ }
200
+ }
201
+ }
202
+ ]
109
203
  },
110
204
  "frozenSnapshot": {
111
205
  "type": "object",
112
- "required": ["path", "manifestDigest", "gitObjectDir", "branch", "commit", "tree"],
206
+ "required": [
207
+ "path",
208
+ "manifestDigest",
209
+ "gitObjectDir",
210
+ "branch",
211
+ "branchStrategy",
212
+ "commit",
213
+ "tree"
214
+ ],
113
215
  "additionalProperties": false,
114
216
  "properties": {
115
- "path": { "type": "string", "minLength": 1 },
116
- "manifestDigest": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
117
- "gitObjectDir": { "type": "string", "minLength": 1 },
118
- "branch": { "type": "string", "minLength": 1 },
119
- "commit": { "type": "string", "pattern": "^[a-f0-9]{40,64}$" },
120
- "tree": { "type": "string", "pattern": "^[a-f0-9]{40,64}$" },
217
+ "path": {
218
+ "type": "string",
219
+ "minLength": 1
220
+ },
221
+ "manifestDigest": {
222
+ "type": "string",
223
+ "pattern": "^[a-f0-9]{64}$"
224
+ },
225
+ "gitObjectDir": {
226
+ "type": "string",
227
+ "minLength": 1
228
+ },
229
+ "branch": {
230
+ "type": "string",
231
+ "minLength": 1
232
+ },
233
+ "commit": {
234
+ "type": "string",
235
+ "pattern": "^[a-f0-9]{40,64}$"
236
+ },
237
+ "tree": {
238
+ "type": "string",
239
+ "pattern": "^[a-f0-9]{40,64}$"
240
+ },
241
+ "parentCommit": {
242
+ "type": "string",
243
+ "pattern": "^[a-f0-9]{40,64}$"
244
+ },
245
+ "branchStrategy": {
246
+ "type": "string",
247
+ "enum": [
248
+ "create-release-branch",
249
+ "advance-existing-branch",
250
+ "initialize-default-branch"
251
+ ]
252
+ },
121
253
  "npm": {
122
254
  "anyOf": [
123
- { "type": "null" },
255
+ {
256
+ "type": "null"
257
+ },
124
258
  {
125
259
  "type": "object",
126
- "required": ["tarballPath", "tarballSha256", "integrity", "size"],
260
+ "required": [
261
+ "tarballPath",
262
+ "tarballSha256",
263
+ "integrity",
264
+ "size"
265
+ ],
127
266
  "additionalProperties": false,
128
267
  "properties": {
129
- "tarballPath": { "type": "string", "minLength": 1 },
130
- "tarballSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
131
- "integrity": { "type": "string", "minLength": 1 },
132
- "size": { "type": "integer", "minimum": 1 }
268
+ "tarballPath": {
269
+ "type": "string",
270
+ "minLength": 1
271
+ },
272
+ "tarballSha256": {
273
+ "type": "string",
274
+ "pattern": "^[a-f0-9]{64}$"
275
+ },
276
+ "integrity": {
277
+ "type": "string",
278
+ "minLength": 1
279
+ },
280
+ "size": {
281
+ "type": "integer",
282
+ "minimum": 1
283
+ }
133
284
  }
134
285
  }
135
286
  ]
136
287
  }
137
- }
288
+ },
289
+ "allOf": [
290
+ {
291
+ "if": {
292
+ "properties": {
293
+ "branchStrategy": {
294
+ "enum": [
295
+ "advance-existing-branch",
296
+ "initialize-default-branch"
297
+ ]
298
+ }
299
+ },
300
+ "required": [
301
+ "branchStrategy"
302
+ ]
303
+ },
304
+ "then": {
305
+ "required": [
306
+ "parentCommit"
307
+ ]
308
+ }
309
+ },
310
+ {
311
+ "if": {
312
+ "properties": {
313
+ "branchStrategy": {
314
+ "const": "create-release-branch"
315
+ }
316
+ },
317
+ "required": [
318
+ "branchStrategy"
319
+ ]
320
+ },
321
+ "then": {
322
+ "not": {
323
+ "required": [
324
+ "parentCommit"
325
+ ]
326
+ }
327
+ }
328
+ }
329
+ ]
138
330
  },
139
331
  "distributions": {
140
332
  "type": "array",
141
333
  "items": {
142
334
  "type": "object",
143
- "required": ["type"],
335
+ "required": [
336
+ "type"
337
+ ],
144
338
  "additionalProperties": false,
145
339
  "properties": {
146
340
  "type": {
147
341
  "type": "string",
148
- "enum": ["npm", "claude-plugin", "codex-plugin"]
342
+ "enum": [
343
+ "npm",
344
+ "claude-plugin",
345
+ "codex-plugin"
346
+ ]
149
347
  },
150
348
  "package": {
151
349
  "type": "string",
@@ -154,7 +352,10 @@
154
352
  },
155
353
  "access": {
156
354
  "type": "string",
157
- "enum": ["public", "restricted"]
355
+ "enum": [
356
+ "public",
357
+ "restricted"
358
+ ]
158
359
  },
159
360
  "provenance": {
160
361
  "type": "boolean"
@@ -196,7 +397,9 @@
196
397
  },
197
398
  "smokeArgs": {
198
399
  "type": "array",
199
- "items": { "type": "string" }
400
+ "items": {
401
+ "type": "string"
402
+ }
200
403
  },
201
404
  "smokeExpectedJson": {
202
405
  "type": "object"
@@ -205,61 +408,199 @@
205
408
  "allOf": [
206
409
  {
207
410
  "if": {
208
- "properties": { "type": { "const": "npm" } }
411
+ "properties": {
412
+ "type": {
413
+ "const": "npm"
414
+ }
415
+ }
209
416
  },
210
- "then": { "required": ["package", "registry", "publisher"] }
417
+ "then": {
418
+ "required": [
419
+ "package",
420
+ "registry",
421
+ "publisher"
422
+ ]
423
+ }
211
424
  },
212
425
  {
213
426
  "if": {
214
- "properties": { "type": { "enum": ["claude-plugin", "codex-plugin"] } }
427
+ "properties": {
428
+ "type": {
429
+ "enum": [
430
+ "claude-plugin",
431
+ "codex-plugin"
432
+ ]
433
+ }
434
+ }
215
435
  },
216
- "then": { "required": ["plugin", "marketplace", "entrySkill"] }
436
+ "then": {
437
+ "required": [
438
+ "plugin",
439
+ "marketplace",
440
+ "entrySkill"
441
+ ]
442
+ }
217
443
  },
218
444
  {
219
445
  "if": {
220
- "required": ["smokeExpectedJson"],
221
- "properties": { "smokeBin": { "minLength": 1 } }
446
+ "required": [
447
+ "smokeExpectedJson"
448
+ ],
449
+ "properties": {
450
+ "smokeBin": {
451
+ "minLength": 1
452
+ }
453
+ }
222
454
  },
223
- "then": { "required": ["smokeBin"] }
455
+ "then": {
456
+ "required": [
457
+ "smokeBin"
458
+ ]
459
+ }
224
460
  },
225
461
  {
226
462
  "if": {
227
- "required": ["smokeArgs"],
228
- "properties": { "smokeBin": { "minLength": 1 } }
463
+ "required": [
464
+ "smokeArgs"
465
+ ],
466
+ "properties": {
467
+ "smokeBin": {
468
+ "minLength": 1
469
+ }
470
+ }
229
471
  },
230
- "then": { "required": ["smokeBin"] }
472
+ "then": {
473
+ "required": [
474
+ "smokeBin"
475
+ ]
476
+ }
231
477
  }
232
478
  ]
233
479
  }
234
480
  },
235
481
  "previousPublicBaseline": {
236
482
  "type": "object",
237
- "required": ["mode", "status"],
483
+ "required": [
484
+ "mode",
485
+ "status"
486
+ ],
238
487
  "additionalProperties": false,
239
488
  "properties": {
240
- "mode": { "type": "string", "enum": ["none", "bound"] },
241
- "githubHost": { "type": "string" },
242
- "repo": { "type": "string" },
243
- "ref": { "type": "string" },
244
- "commit": { "type": "string" },
245
- "tree": { "type": "string" },
246
- "manifestDigest": { "type": "string" },
247
- "observedCommit": { "type": "string" },
248
- "observedAt": { "type": "string", "format": "date-time" },
249
- "status": { "type": "string", "enum": ["consistent", "drifted", "unknown", "unobserved-offline", "blocking"] }
489
+ "mode": {
490
+ "type": "string",
491
+ "enum": [
492
+ "none",
493
+ "bound"
494
+ ]
495
+ },
496
+ "githubHost": {
497
+ "type": "string"
498
+ },
499
+ "repo": {
500
+ "type": "string"
501
+ },
502
+ "ref": {
503
+ "type": "string"
504
+ },
505
+ "commit": {
506
+ "type": "string"
507
+ },
508
+ "tree": {
509
+ "type": "string"
510
+ },
511
+ "manifestDigest": {
512
+ "type": "string"
513
+ },
514
+ "observedCommit": {
515
+ "type": "string"
516
+ },
517
+ "observedAt": {
518
+ "type": "string",
519
+ "format": "date-time"
520
+ },
521
+ "status": {
522
+ "type": "string",
523
+ "enum": [
524
+ "consistent",
525
+ "drifted",
526
+ "unknown",
527
+ "unobserved-offline",
528
+ "blocking"
529
+ ]
530
+ }
531
+ },
532
+ "if": {
533
+ "properties": {
534
+ "mode": {
535
+ "const": "bound"
536
+ }
537
+ }
538
+ },
539
+ "then": {
540
+ "required": [
541
+ "repo",
542
+ "ref",
543
+ "commit"
544
+ ]
250
545
  },
251
- "if": { "properties": { "mode": { "const": "bound" } } },
252
- "then": { "required": ["repo", "ref", "commit"] },
253
546
  "else": {
254
547
  "allOf": [
255
- { "not": { "required": ["repo"] } },
256
- { "not": { "required": ["githubHost"] } },
257
- { "not": { "required": ["ref"] } },
258
- { "not": { "required": ["commit"] } },
259
- { "not": { "required": ["tree"] } },
260
- { "not": { "required": ["manifestDigest"] } },
261
- { "not": { "required": ["observedCommit"] } },
262
- { "not": { "required": ["observedAt"] } }
548
+ {
549
+ "not": {
550
+ "required": [
551
+ "repo"
552
+ ]
553
+ }
554
+ },
555
+ {
556
+ "not": {
557
+ "required": [
558
+ "githubHost"
559
+ ]
560
+ }
561
+ },
562
+ {
563
+ "not": {
564
+ "required": [
565
+ "ref"
566
+ ]
567
+ }
568
+ },
569
+ {
570
+ "not": {
571
+ "required": [
572
+ "commit"
573
+ ]
574
+ }
575
+ },
576
+ {
577
+ "not": {
578
+ "required": [
579
+ "tree"
580
+ ]
581
+ }
582
+ },
583
+ {
584
+ "not": {
585
+ "required": [
586
+ "manifestDigest"
587
+ ]
588
+ }
589
+ },
590
+ {
591
+ "not": {
592
+ "required": [
593
+ "observedCommit"
594
+ ]
595
+ }
596
+ },
597
+ {
598
+ "not": {
599
+ "required": [
600
+ "observedAt"
601
+ ]
602
+ }
603
+ }
263
604
  ]
264
605
  }
265
606
  }
@@ -271,12 +612,22 @@
271
612
  "minLength": 1,
272
613
  "description": "Digest of the project configuration at plan freeze time"
273
614
  },
615
+ "verificationGates": {
616
+ "type": "array",
617
+ "items": {
618
+ "$ref": "#/definitions/verificationGate"
619
+ }
620
+ },
274
621
  "externalActions": {
275
622
  "type": "array",
276
623
  "minItems": 1,
277
624
  "items": {
278
625
  "type": "object",
279
- "required": ["id", "type", "adapter"],
626
+ "required": [
627
+ "id",
628
+ "type",
629
+ "adapter"
630
+ ],
280
631
  "additionalProperties": false,
281
632
  "properties": {
282
633
  "id": {
@@ -292,7 +643,8 @@
292
643
  "npm-publish",
293
644
  "github-release",
294
645
  "claude-marketplace-install",
295
- "codex-marketplace-install"
646
+ "codex-marketplace-install",
647
+ "set-default-branch"
296
648
  ]
297
649
  },
298
650
  "adapter": {
@@ -311,7 +663,12 @@
311
663
  },
312
664
  "status": {
313
665
  "type": "string",
314
- "enum": ["PENDING", "SUCCEEDED", "FAILED", "SKIPPED"],
666
+ "enum": [
667
+ "PENDING",
668
+ "SUCCEEDED",
669
+ "FAILED",
670
+ "SKIPPED"
671
+ ],
315
672
  "description": "Action execution status"
316
673
  }
317
674
  }
@@ -343,7 +700,12 @@
343
700
  "type": "array",
344
701
  "items": {
345
702
  "type": "object",
346
- "required": ["rule", "reason", "responsible", "expiresAt"],
703
+ "required": [
704
+ "rule",
705
+ "reason",
706
+ "responsible",
707
+ "expiresAt"
708
+ ],
347
709
  "additionalProperties": false,
348
710
  "properties": {
349
711
  "rule": {
@@ -365,5 +727,128 @@
365
727
  }
366
728
  }
367
729
  }
730
+ },
731
+ "definitions": {
732
+ "verificationGate": {
733
+ "type": "object",
734
+ "required": [
735
+ "id",
736
+ "phase",
737
+ "scope",
738
+ "command",
739
+ "cwd",
740
+ "timeoutMs",
741
+ "envAllowlist"
742
+ ],
743
+ "additionalProperties": false,
744
+ "properties": {
745
+ "id": {
746
+ "type": "string",
747
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
748
+ },
749
+ "phase": {
750
+ "type": "string",
751
+ "enum": [
752
+ "snapshot-verify",
753
+ "consumer-verify"
754
+ ]
755
+ },
756
+ "scope": {
757
+ "type": "object",
758
+ "required": [
759
+ "unit"
760
+ ],
761
+ "additionalProperties": false,
762
+ "properties": {
763
+ "unit": {
764
+ "type": "string",
765
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
766
+ },
767
+ "distribution": {
768
+ "type": "string",
769
+ "enum": [
770
+ "npm",
771
+ "claude-plugin",
772
+ "codex-plugin"
773
+ ]
774
+ }
775
+ }
776
+ },
777
+ "command": {
778
+ "type": "array",
779
+ "minItems": 1,
780
+ "items": {
781
+ "type": "string"
782
+ }
783
+ },
784
+ "cwd": {
785
+ "type": "string",
786
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
787
+ },
788
+ "timeoutMs": {
789
+ "type": "integer",
790
+ "minimum": 1000,
791
+ "maximum": 7200000
792
+ },
793
+ "envAllowlist": {
794
+ "type": "array",
795
+ "items": {
796
+ "type": "string",
797
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
798
+ },
799
+ "uniqueItems": true
800
+ },
801
+ "expectedJson": {
802
+ "type": "object"
803
+ }
804
+ },
805
+ "allOf": [
806
+ {
807
+ "if": {
808
+ "properties": {
809
+ "phase": {
810
+ "const": "consumer-verify"
811
+ }
812
+ },
813
+ "required": [
814
+ "phase"
815
+ ]
816
+ },
817
+ "then": {
818
+ "properties": {
819
+ "scope": {
820
+ "required": [
821
+ "unit",
822
+ "distribution"
823
+ ]
824
+ }
825
+ }
826
+ }
827
+ },
828
+ {
829
+ "if": {
830
+ "properties": {
831
+ "phase": {
832
+ "const": "snapshot-verify"
833
+ }
834
+ },
835
+ "required": [
836
+ "phase"
837
+ ]
838
+ },
839
+ "then": {
840
+ "properties": {
841
+ "scope": {
842
+ "not": {
843
+ "required": [
844
+ "distribution"
845
+ ]
846
+ }
847
+ }
848
+ }
849
+ }
850
+ }
851
+ ]
852
+ }
368
853
  }
369
854
  }