release-skill 0.1.6 → 0.1.8

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 (65) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.codex-plugin/plugin.json +4 -4
  4. package/.kimi-plugin/plugin.json +27 -0
  5. package/CHANGELOG.md +53 -0
  6. package/INSTALL.md +73 -2
  7. package/INSTALL.zh-CN.md +94 -99
  8. package/LICENSE +1 -0
  9. package/NOTICE +10 -0
  10. package/README.md +53 -81
  11. package/README.zh-CN.md +86 -352
  12. package/adapters/claude/.claude-plugin/marketplace.json +3 -3
  13. package/adapters/claude/.claude-plugin/plugin.json +2 -2
  14. package/adapters/claude/bin/release-skill.bundle.mjs +1061 -182
  15. package/adapters/claude/schemas/.render-manifest.json +4 -4
  16. package/adapters/claude/schemas/release-plan.schema.json +20 -2
  17. package/adapters/claude/schemas/release-project.schema.json +22 -4
  18. package/adapters/claude/schemas/release-run.schema.json +1 -0
  19. package/adapters/codex/.codex-plugin/plugin.json +4 -4
  20. package/adapters/codex/bin/release-skill.bundle.mjs +1061 -182
  21. package/adapters/codex/schemas/.render-manifest.json +4 -4
  22. package/adapters/codex/schemas/release-plan.schema.json +20 -2
  23. package/adapters/codex/schemas/release-project.schema.json +22 -4
  24. package/adapters/codex/schemas/release-run.schema.json +1 -0
  25. package/adapters/kimi/.kimi-plugin/plugin.json +27 -0
  26. package/adapters/kimi/bin/release-skill.bundle.mjs +84415 -0
  27. package/adapters/kimi/bin/release-skill.mjs +54 -0
  28. package/adapters/kimi/native/safe-write/binding.gyp +41 -0
  29. package/adapters/kimi/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  30. package/adapters/kimi/native/safe-write/prebuilds.json +24 -0
  31. package/adapters/kimi/native/safe-write/src/safe_write.cc +2032 -0
  32. package/adapters/kimi/schemas/.render-manifest.json +37 -0
  33. package/adapters/kimi/schemas/approval-record.schema.json +115 -0
  34. package/adapters/kimi/schemas/artifact-lock.schema.json +111 -0
  35. package/adapters/kimi/schemas/artifact-plan.schema.json +52 -0
  36. package/adapters/kimi/schemas/artifact-policy.schema.json +76 -0
  37. package/adapters/kimi/schemas/evidence-event.schema.json +89 -0
  38. package/adapters/kimi/schemas/release-plan.schema.json +878 -0
  39. package/adapters/kimi/schemas/release-project.schema.json +895 -0
  40. package/adapters/kimi/schemas/release-run.schema.json +343 -0
  41. package/adapters/kimi/skills/release-assess/SKILL.md +58 -0
  42. package/adapters/kimi/skills/release-help/SKILL.md +84 -0
  43. package/adapters/kimi/skills/release-prepare/SKILL.md +99 -0
  44. package/adapters/kimi/skills/release-publish/SKILL.md +64 -0
  45. package/adapters/kimi/skills/release-reconcile/SKILL.md +80 -0
  46. package/adapters/kimi/skills/release-setup/SKILL.md +102 -0
  47. package/adapters/kimi/skills/release-verify/SKILL.md +77 -0
  48. package/bin/release-skill-cli.mjs +16 -4
  49. package/bin/release-skill.bundle.mjs +1061 -182
  50. package/package.json +15 -5
  51. package/schemas/.render-manifest.json +4 -4
  52. package/schemas/release-plan.schema.json +20 -2
  53. package/schemas/release-project.schema.json +22 -4
  54. package/schemas/release-run.schema.json +1 -0
  55. package/src/adapters/contract.mjs +1 -0
  56. package/src/adapters/plugin-marketplace.mjs +990 -30
  57. package/src/commands/assess.mjs +50 -1
  58. package/src/commands/prepare.mjs +65 -0
  59. package/src/commands/publish.mjs +3 -0
  60. package/src/commands/reconcile.mjs +3 -0
  61. package/src/commands/setup.mjs +10 -5
  62. package/src/commands/verify.mjs +16 -6
  63. package/src/core/plan.mjs +118 -0
  64. package/src/core/verification-gates.mjs +1 -1
  65. package/src/producers/build-adapters.mjs +38 -8
@@ -0,0 +1,895 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://release-skill.dev/schemas/release-project/v1",
4
+ "title": "Release Project Configuration",
5
+ "description": "Schema for .release-skill/project.yaml project configuration file",
6
+ "type": "object",
7
+ "required": [
8
+ "apiVersion",
9
+ "kind",
10
+ "project",
11
+ "releaseUnits"
12
+ ],
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "apiVersion": {
16
+ "type": "string",
17
+ "const": "release-skill/v1"
18
+ },
19
+ "kind": {
20
+ "type": "string",
21
+ "const": "ReleaseProject"
22
+ },
23
+ "project": {
24
+ "type": "object",
25
+ "required": [
26
+ "name",
27
+ "defaultBranch"
28
+ ],
29
+ "additionalProperties": false,
30
+ "properties": {
31
+ "name": {
32
+ "type": "string",
33
+ "minLength": 1
34
+ },
35
+ "defaultBranch": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ }
39
+ }
40
+ },
41
+ "releaseUnits": {
42
+ "type": "array",
43
+ "minItems": 1,
44
+ "items": {
45
+ "type": "object",
46
+ "required": [
47
+ "id",
48
+ "source",
49
+ "publicRepo",
50
+ "version",
51
+ "distributions",
52
+ "publicFiles",
53
+ "requiredPublicFiles",
54
+ "previousPublicBaseline"
55
+ ],
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "id": {
59
+ "type": "string",
60
+ "minLength": 1,
61
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
62
+ },
63
+ "source": {
64
+ "type": "string",
65
+ "minLength": 1,
66
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
67
+ },
68
+ "publicRepo": {
69
+ "type": "string",
70
+ "pattern": "^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$"
71
+ },
72
+ "production": {
73
+ "type": "object",
74
+ "additionalProperties": false,
75
+ "properties": {
76
+ "githubHost": {
77
+ "type": "string",
78
+ "pattern": "^[a-zA-Z0-9.-]+$"
79
+ },
80
+ "branchTemplate": {
81
+ "type": "string",
82
+ "minLength": 1
83
+ },
84
+ "releaseTitleTemplate": {
85
+ "type": "string",
86
+ "minLength": 1
87
+ },
88
+ "releaseNotes": {
89
+ "type": "string"
90
+ },
91
+ "branchStrategy": {
92
+ "type": "string",
93
+ "enum": [
94
+ "create-release-branch",
95
+ "advance-existing-branch",
96
+ "initialize-default-branch"
97
+ ]
98
+ },
99
+ "setAsDefaultBranch": {
100
+ "type": "boolean"
101
+ },
102
+ "expectedCurrentDefaultBranch": {
103
+ "type": "string",
104
+ "minLength": 1
105
+ }
106
+ }
107
+ },
108
+ "version": {
109
+ "type": "object",
110
+ "required": [
111
+ "source",
112
+ "tagTemplate"
113
+ ],
114
+ "additionalProperties": false,
115
+ "properties": {
116
+ "source": {
117
+ "type": "string",
118
+ "minLength": 1
119
+ },
120
+ "tagTemplate": {
121
+ "type": "string",
122
+ "minLength": 1
123
+ }
124
+ }
125
+ },
126
+ "distributions": {
127
+ "type": "array",
128
+ "minItems": 1,
129
+ "items": {
130
+ "type": "object",
131
+ "required": [
132
+ "type"
133
+ ],
134
+ "additionalProperties": false,
135
+ "properties": {
136
+ "type": {
137
+ "type": "string",
138
+ "enum": [
139
+ "npm",
140
+ "claude-plugin",
141
+ "codex-plugin",
142
+ "kimi-plugin"
143
+ ]
144
+ },
145
+ "package": {
146
+ "type": "string",
147
+ "minLength": 1,
148
+ "maxLength": 214,
149
+ "pattern": "^(?:@[a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)$"
150
+ },
151
+ "access": {
152
+ "type": "string",
153
+ "enum": [
154
+ "public",
155
+ "restricted"
156
+ ]
157
+ },
158
+ "provenance": {
159
+ "type": "boolean"
160
+ },
161
+ "tag": {
162
+ "type": "string",
163
+ "minLength": 1
164
+ },
165
+ "registry": {
166
+ "type": "string",
167
+ "minLength": 1,
168
+ "pattern": "^https://[^\\s]+$",
169
+ "description": "Normalized HTTPS URL of the npm registry"
170
+ },
171
+ "publisher": {
172
+ "type": "string",
173
+ "minLength": 1,
174
+ "pattern": "^[a-z0-9][a-z0-9._-]*$",
175
+ "description": "Expected npm whoami username for this registry"
176
+ },
177
+ "plugin": {
178
+ "type": "string",
179
+ "minLength": 1,
180
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
181
+ },
182
+ "marketplace": {
183
+ "type": "string",
184
+ "minLength": 1,
185
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
186
+ },
187
+ "entrySkill": {
188
+ "type": "string",
189
+ "minLength": 1,
190
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
191
+ },
192
+ "smokeBin": {
193
+ "type": "string",
194
+ "minLength": 1
195
+ },
196
+ "smokeArgs": {
197
+ "type": "array",
198
+ "items": {
199
+ "type": "string"
200
+ }
201
+ },
202
+ "smokeExpectedJson": {
203
+ "type": "object"
204
+ },
205
+ "timeoutMs": {
206
+ "type": "integer",
207
+ "minimum": 30000,
208
+ "maximum": 900000,
209
+ "description": "Timeout in milliseconds for plugin marketplace install commands (claude-plugin, codex-plugin). Kimi Code has no scriptable install command, so for kimi-plugin this bounds the read-only observation/verification only, not an install command. Only valid for claude-plugin, codex-plugin, and kimi-plugin distributions."
210
+ }
211
+ },
212
+ "allOf": [
213
+ {
214
+ "if": {
215
+ "properties": {
216
+ "type": {
217
+ "const": "npm"
218
+ }
219
+ }
220
+ },
221
+ "then": {
222
+ "required": [
223
+ "package",
224
+ "registry",
225
+ "publisher"
226
+ ]
227
+ }
228
+ },
229
+ {
230
+ "if": {
231
+ "required": [
232
+ "timeoutMs"
233
+ ]
234
+ },
235
+ "then": {
236
+ "properties": {
237
+ "type": {
238
+ "enum": [
239
+ "claude-plugin",
240
+ "codex-plugin",
241
+ "kimi-plugin"
242
+ ]
243
+ }
244
+ }
245
+ }
246
+ },
247
+ {
248
+ "if": {
249
+ "properties": {
250
+ "type": {
251
+ "enum": [
252
+ "claude-plugin",
253
+ "codex-plugin"
254
+ ]
255
+ }
256
+ }
257
+ },
258
+ "then": {
259
+ "required": [
260
+ "plugin",
261
+ "marketplace",
262
+ "entrySkill"
263
+ ]
264
+ }
265
+ },
266
+ {
267
+ "if": {
268
+ "properties": {
269
+ "type": {
270
+ "const": "kimi-plugin"
271
+ }
272
+ }
273
+ },
274
+ "then": {
275
+ "required": [
276
+ "plugin",
277
+ "entrySkill"
278
+ ]
279
+ }
280
+ },
281
+ {
282
+ "if": {
283
+ "required": [
284
+ "smokeExpectedJson"
285
+ ],
286
+ "properties": {
287
+ "smokeBin": {
288
+ "minLength": 1
289
+ }
290
+ }
291
+ },
292
+ "then": {
293
+ "required": [
294
+ "smokeBin"
295
+ ]
296
+ }
297
+ },
298
+ {
299
+ "if": {
300
+ "required": [
301
+ "smokeArgs"
302
+ ],
303
+ "properties": {
304
+ "smokeBin": {
305
+ "minLength": 1
306
+ }
307
+ }
308
+ },
309
+ "then": {
310
+ "required": [
311
+ "smokeBin"
312
+ ]
313
+ }
314
+ }
315
+ ]
316
+ }
317
+ },
318
+ "publicFiles": {
319
+ "type": "array",
320
+ "minItems": 1,
321
+ "items": {
322
+ "type": "object",
323
+ "required": [
324
+ "from",
325
+ "to",
326
+ "mode"
327
+ ],
328
+ "additionalProperties": false,
329
+ "properties": {
330
+ "sourceScope": {
331
+ "type": "string",
332
+ "enum": [
333
+ "unit",
334
+ "workspace"
335
+ ],
336
+ "default": "unit"
337
+ },
338
+ "from": {
339
+ "type": "string",
340
+ "minLength": 1,
341
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
342
+ },
343
+ "to": {
344
+ "type": "string",
345
+ "minLength": 1,
346
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
347
+ },
348
+ "mode": {
349
+ "type": "string",
350
+ "enum": [
351
+ "preserve"
352
+ ]
353
+ }
354
+ }
355
+ }
356
+ },
357
+ "requiredPublicFiles": {
358
+ "type": "array",
359
+ "uniqueItems": true,
360
+ "items": {
361
+ "type": "string",
362
+ "minLength": 1,
363
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
364
+ }
365
+ },
366
+ "previousPublicBaseline": {
367
+ "type": "object",
368
+ "required": [
369
+ "mode"
370
+ ],
371
+ "additionalProperties": false,
372
+ "properties": {
373
+ "mode": {
374
+ "type": "string",
375
+ "enum": [
376
+ "none",
377
+ "bound"
378
+ ]
379
+ },
380
+ "githubHost": {
381
+ "type": "string",
382
+ "pattern": "^[a-zA-Z0-9.-]+$"
383
+ },
384
+ "repo": {
385
+ "type": "string",
386
+ "pattern": "^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$"
387
+ },
388
+ "ref": {
389
+ "type": "string",
390
+ "minLength": 1
391
+ },
392
+ "commit": {
393
+ "type": "string",
394
+ "pattern": "^[a-f0-9]{40,64}$"
395
+ },
396
+ "tree": {
397
+ "type": "string",
398
+ "pattern": "^[a-f0-9]{40,64}$"
399
+ },
400
+ "manifestDigest": {
401
+ "type": "string",
402
+ "pattern": "^[a-f0-9]{64}$"
403
+ }
404
+ },
405
+ "if": {
406
+ "properties": {
407
+ "mode": {
408
+ "const": "bound"
409
+ }
410
+ }
411
+ },
412
+ "then": {
413
+ "required": [
414
+ "repo",
415
+ "ref",
416
+ "commit"
417
+ ]
418
+ },
419
+ "else": {
420
+ "allOf": [
421
+ {
422
+ "not": {
423
+ "required": [
424
+ "repo"
425
+ ]
426
+ }
427
+ },
428
+ {
429
+ "not": {
430
+ "required": [
431
+ "githubHost"
432
+ ]
433
+ }
434
+ },
435
+ {
436
+ "not": {
437
+ "required": [
438
+ "ref"
439
+ ]
440
+ }
441
+ },
442
+ {
443
+ "not": {
444
+ "required": [
445
+ "commit"
446
+ ]
447
+ }
448
+ },
449
+ {
450
+ "not": {
451
+ "required": [
452
+ "tree"
453
+ ]
454
+ }
455
+ },
456
+ {
457
+ "not": {
458
+ "required": [
459
+ "manifestDigest"
460
+ ]
461
+ }
462
+ }
463
+ ]
464
+ }
465
+ },
466
+ "releaseDocuments": {
467
+ "$ref": "#/definitions/releaseDocuments"
468
+ }
469
+ },
470
+ "allOf": [
471
+ {
472
+ "if": {
473
+ "required": [
474
+ "production"
475
+ ],
476
+ "properties": {
477
+ "production": {
478
+ "required": [
479
+ "branchStrategy"
480
+ ],
481
+ "properties": {
482
+ "branchStrategy": {
483
+ "enum": [
484
+ "advance-existing-branch",
485
+ "initialize-default-branch"
486
+ ]
487
+ }
488
+ }
489
+ }
490
+ }
491
+ },
492
+ "then": {
493
+ "properties": {
494
+ "previousPublicBaseline": {
495
+ "properties": {
496
+ "mode": {
497
+ "const": "bound"
498
+ }
499
+ },
500
+ "required": [
501
+ "mode"
502
+ ]
503
+ }
504
+ }
505
+ }
506
+ },
507
+ {
508
+ "if": {
509
+ "required": [
510
+ "production"
511
+ ],
512
+ "properties": {
513
+ "production": {
514
+ "required": [
515
+ "branchStrategy"
516
+ ],
517
+ "properties": {
518
+ "branchStrategy": {
519
+ "const": "initialize-default-branch"
520
+ }
521
+ }
522
+ }
523
+ }
524
+ },
525
+ "then": {
526
+ "properties": {
527
+ "production": {
528
+ "required": [
529
+ "setAsDefaultBranch",
530
+ "expectedCurrentDefaultBranch"
531
+ ],
532
+ "properties": {
533
+ "setAsDefaultBranch": {
534
+ "const": true
535
+ }
536
+ }
537
+ }
538
+ }
539
+ }
540
+ },
541
+ {
542
+ "if": {
543
+ "required": [
544
+ "production"
545
+ ],
546
+ "properties": {
547
+ "production": {
548
+ "required": [
549
+ "setAsDefaultBranch"
550
+ ],
551
+ "properties": {
552
+ "setAsDefaultBranch": {
553
+ "const": true
554
+ }
555
+ }
556
+ }
557
+ }
558
+ },
559
+ "then": {
560
+ "properties": {
561
+ "production": {
562
+ "required": [
563
+ "branchStrategy"
564
+ ],
565
+ "properties": {
566
+ "branchStrategy": {
567
+ "const": "initialize-default-branch"
568
+ }
569
+ }
570
+ }
571
+ }
572
+ }
573
+ }
574
+ ]
575
+ }
576
+ },
577
+ "verificationGates": {
578
+ "type": "array",
579
+ "items": {
580
+ "$ref": "#/definitions/verificationGate"
581
+ }
582
+ },
583
+ "hooks": {
584
+ "type": "object",
585
+ "additionalProperties": false,
586
+ "properties": {
587
+ "docs": {
588
+ "$ref": "#/definitions/hook"
589
+ },
590
+ "build": {
591
+ "$ref": "#/definitions/hook"
592
+ },
593
+ "test": {
594
+ "$ref": "#/definitions/hook"
595
+ },
596
+ "typecheck": {
597
+ "$ref": "#/definitions/hook"
598
+ },
599
+ "lint": {
600
+ "$ref": "#/definitions/hook"
601
+ }
602
+ }
603
+ },
604
+ "policy": {
605
+ "type": "object",
606
+ "additionalProperties": false,
607
+ "properties": {
608
+ "forbiddenPaths": {
609
+ "type": "array",
610
+ "items": {
611
+ "type": "string"
612
+ }
613
+ },
614
+ "forbiddenContentPatterns": {
615
+ "type": "array",
616
+ "items": {
617
+ "type": "string"
618
+ }
619
+ }
620
+ }
621
+ }
622
+ },
623
+ "definitions": {
624
+ "hook": {
625
+ "type": "object",
626
+ "required": [
627
+ "command"
628
+ ],
629
+ "additionalProperties": false,
630
+ "properties": {
631
+ "command": {
632
+ "type": "array",
633
+ "minItems": 1,
634
+ "items": {
635
+ "type": "string"
636
+ }
637
+ },
638
+ "cwd": {
639
+ "type": "string",
640
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
641
+ },
642
+ "timeoutMs": {
643
+ "type": "integer",
644
+ "minimum": 1000,
645
+ "maximum": 7200000
646
+ },
647
+ "envAllowlist": {
648
+ "type": "array",
649
+ "items": {
650
+ "type": "string",
651
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
652
+ },
653
+ "uniqueItems": true
654
+ }
655
+ }
656
+ },
657
+ "releaseDocuments": {
658
+ "type": "object",
659
+ "description": "Optional configuration-driven multilingual release-document refresh for one release unit. Absence preserves legacy behaviour. Lexical layer only; runtime path, locale-membership and collision checks apply additionally.",
660
+ "required": [
661
+ "notesSource",
662
+ "locales",
663
+ "changelogs",
664
+ "readmes"
665
+ ],
666
+ "additionalProperties": false,
667
+ "properties": {
668
+ "notesSource": {
669
+ "type": "string",
670
+ "minLength": 1,
671
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$)(?!.*\\{(?!version\\}))(?!.*(?<!\\{version)\\}).+\\.(?:yaml|yml|json)$"
672
+ },
673
+ "locales": {
674
+ "type": "array",
675
+ "minItems": 1,
676
+ "uniqueItems": true,
677
+ "items": {
678
+ "type": "string",
679
+ "pattern": "^[a-zA-Z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
680
+ }
681
+ },
682
+ "changelogs": {
683
+ "type": "array",
684
+ "minItems": 1,
685
+ "items": {
686
+ "$ref": "#/definitions/releaseDocumentsChangelog"
687
+ }
688
+ },
689
+ "readmes": {
690
+ "type": "array",
691
+ "minItems": 1,
692
+ "items": {
693
+ "$ref": "#/definitions/releaseDocumentsReadme"
694
+ }
695
+ }
696
+ }
697
+ },
698
+ "releaseDocumentsChangelog": {
699
+ "type": "object",
700
+ "required": [
701
+ "path",
702
+ "locale"
703
+ ],
704
+ "additionalProperties": false,
705
+ "properties": {
706
+ "path": {
707
+ "type": "string",
708
+ "minLength": 1,
709
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
710
+ },
711
+ "locale": {
712
+ "type": "string",
713
+ "pattern": "^[a-zA-Z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
714
+ }
715
+ }
716
+ },
717
+ "releaseDocumentsReadme": {
718
+ "type": "object",
719
+ "required": [
720
+ "path",
721
+ "locale",
722
+ "regions"
723
+ ],
724
+ "additionalProperties": false,
725
+ "properties": {
726
+ "path": {
727
+ "type": "string",
728
+ "minLength": 1,
729
+ "pattern": "^(?!/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(/|$))(?!\\.$)(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/$).*$"
730
+ },
731
+ "locale": {
732
+ "type": "string",
733
+ "pattern": "^[a-zA-Z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
734
+ },
735
+ "regions": {
736
+ "type": "array",
737
+ "minItems": 1,
738
+ "uniqueItems": true,
739
+ "items": {
740
+ "type": "string",
741
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
742
+ }
743
+ },
744
+ "versionMarkers": {
745
+ "type": "array",
746
+ "minItems": 1,
747
+ "uniqueItems": true,
748
+ "items": {
749
+ "$ref": "#/definitions/releaseDocumentsVersionMarker"
750
+ }
751
+ }
752
+ }
753
+ },
754
+ "releaseDocumentsVersionMarker": {
755
+ "type": "object",
756
+ "required": [
757
+ "id",
758
+ "pattern"
759
+ ],
760
+ "additionalProperties": false,
761
+ "properties": {
762
+ "id": {
763
+ "type": "string",
764
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
765
+ },
766
+ "pattern": {
767
+ "type": "string",
768
+ "minLength": 1
769
+ }
770
+ }
771
+ },
772
+ "verificationGate": {
773
+ "type": "object",
774
+ "required": [
775
+ "id",
776
+ "phase",
777
+ "scope",
778
+ "command",
779
+ "cwd",
780
+ "timeoutMs",
781
+ "envAllowlist"
782
+ ],
783
+ "additionalProperties": false,
784
+ "properties": {
785
+ "id": {
786
+ "type": "string",
787
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
788
+ },
789
+ "phase": {
790
+ "type": "string",
791
+ "enum": [
792
+ "snapshot-verify",
793
+ "consumer-verify"
794
+ ]
795
+ },
796
+ "scope": {
797
+ "type": "object",
798
+ "required": [
799
+ "unit"
800
+ ],
801
+ "additionalProperties": false,
802
+ "properties": {
803
+ "unit": {
804
+ "type": "string",
805
+ "pattern": "^(?!\\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._-]*$"
806
+ },
807
+ "distribution": {
808
+ "type": "string",
809
+ "enum": [
810
+ "npm",
811
+ "claude-plugin",
812
+ "codex-plugin",
813
+ "kimi-plugin"
814
+ ]
815
+ }
816
+ }
817
+ },
818
+ "command": {
819
+ "type": "array",
820
+ "minItems": 1,
821
+ "items": {
822
+ "type": "string"
823
+ }
824
+ },
825
+ "cwd": {
826
+ "type": "string",
827
+ "pattern": "^(?:\\.$|(?!\\/)(?!\\.\\/)(?!.*\\\\)(?!.*:)(?!\\.\\.(?:\\/|$))(?!.*\\/\\.\\.\\/)(?!.*\\/\\.\\.$)(?!.*\\/\\.\\/)(?!.*\\/\\/)(?!.*\\0)(?!.*\\/\\.$)(?!.*\\/\\/$)(?!.*\\/$).*)$"
828
+ },
829
+ "timeoutMs": {
830
+ "type": "integer",
831
+ "minimum": 1000,
832
+ "maximum": 7200000
833
+ },
834
+ "envAllowlist": {
835
+ "type": "array",
836
+ "items": {
837
+ "type": "string",
838
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
839
+ },
840
+ "uniqueItems": true
841
+ },
842
+ "expectedJson": {
843
+ "type": "object"
844
+ }
845
+ },
846
+ "allOf": [
847
+ {
848
+ "if": {
849
+ "properties": {
850
+ "phase": {
851
+ "const": "consumer-verify"
852
+ }
853
+ },
854
+ "required": [
855
+ "phase"
856
+ ]
857
+ },
858
+ "then": {
859
+ "properties": {
860
+ "scope": {
861
+ "required": [
862
+ "unit",
863
+ "distribution"
864
+ ]
865
+ }
866
+ }
867
+ }
868
+ },
869
+ {
870
+ "if": {
871
+ "properties": {
872
+ "phase": {
873
+ "const": "snapshot-verify"
874
+ }
875
+ },
876
+ "required": [
877
+ "phase"
878
+ ]
879
+ },
880
+ "then": {
881
+ "properties": {
882
+ "scope": {
883
+ "not": {
884
+ "required": [
885
+ "distribution"
886
+ ]
887
+ }
888
+ }
889
+ }
890
+ }
891
+ }
892
+ ]
893
+ }
894
+ }
895
+ }