@frankzhang2026/opencode-android-orchestrator 1.0.5 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +79 -15
  3. package/dist/config/queue-policy.d.ts.map +1 -1
  4. package/dist/config/queue-policy.js +1 -2
  5. package/dist/config/queue-policy.js.map +1 -1
  6. package/dist/doctor/index.d.ts.map +1 -1
  7. package/dist/doctor/index.js +27 -3
  8. package/dist/doctor/index.js.map +1 -1
  9. package/dist/doctor/installation.d.ts +1 -1
  10. package/dist/doctor/installation.d.ts.map +1 -1
  11. package/dist/doctor/installation.js +11 -1
  12. package/dist/doctor/installation.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/installer/adaptive-templates.d.ts +4 -1
  18. package/dist/installer/adaptive-templates.d.ts.map +1 -1
  19. package/dist/installer/adaptive-templates.js +42 -13
  20. package/dist/installer/adaptive-templates.js.map +1 -1
  21. package/dist/installer/android-project.d.ts +3 -1
  22. package/dist/installer/android-project.d.ts.map +1 -1
  23. package/dist/installer/android-project.js.map +1 -1
  24. package/dist/installer/capabilities-script.d.ts +2 -0
  25. package/dist/installer/capabilities-script.d.ts.map +1 -0
  26. package/dist/installer/capabilities-script.js +84 -0
  27. package/dist/installer/capabilities-script.js.map +1 -0
  28. package/dist/installer/gradle-verification.d.ts.map +1 -1
  29. package/dist/installer/gradle-verification.js +13 -6
  30. package/dist/installer/gradle-verification.js.map +1 -1
  31. package/dist/installer/init.d.ts.map +1 -1
  32. package/dist/installer/init.js +3 -2
  33. package/dist/installer/init.js.map +1 -1
  34. package/dist/installer/opencode-config.d.ts +3 -3
  35. package/dist/installer/opencode-config.js +1 -1
  36. package/dist/installer/project-capabilities.d.ts +35 -0
  37. package/dist/installer/project-capabilities.d.ts.map +1 -0
  38. package/dist/installer/project-capabilities.js +82 -0
  39. package/dist/installer/project-capabilities.js.map +1 -0
  40. package/dist/installer/upgrade.d.ts.map +1 -1
  41. package/dist/installer/upgrade.js +10 -2
  42. package/dist/installer/upgrade.js.map +1 -1
  43. package/dist/queue/cli.d.ts.map +1 -1
  44. package/dist/queue/cli.js +32 -5
  45. package/dist/queue/cli.js.map +1 -1
  46. package/dist/queue/executor.d.ts +1 -0
  47. package/dist/queue/executor.d.ts.map +1 -1
  48. package/dist/queue/executor.js +160 -11
  49. package/dist/queue/executor.js.map +1 -1
  50. package/dist/queue/process-ownership.d.ts +12 -0
  51. package/dist/queue/process-ownership.d.ts.map +1 -0
  52. package/dist/queue/process-ownership.js +58 -0
  53. package/dist/queue/process-ownership.js.map +1 -0
  54. package/dist/queue/queue.d.ts +25 -1
  55. package/dist/queue/queue.d.ts.map +1 -1
  56. package/dist/queue/queue.js +96 -11
  57. package/dist/queue/queue.js.map +1 -1
  58. package/dist/queue/service.d.ts.map +1 -1
  59. package/dist/queue/service.js +19 -2
  60. package/dist/queue/service.js.map +1 -1
  61. package/dist/queue/storage.d.ts +3 -1
  62. package/dist/queue/storage.d.ts.map +1 -1
  63. package/dist/queue/storage.js +25 -15
  64. package/dist/queue/storage.js.map +1 -1
  65. package/dist/queue/supervision.d.ts +38 -0
  66. package/dist/queue/supervision.d.ts.map +1 -0
  67. package/dist/queue/supervision.js +247 -0
  68. package/dist/queue/supervision.js.map +1 -0
  69. package/dist/queue/tools.d.ts.map +1 -1
  70. package/dist/queue/tools.js +4 -2
  71. package/dist/queue/tools.js.map +1 -1
  72. package/docs/GRADLE-6.7.1.md +112 -0
  73. package/docs/MIGRATION.md +125 -11
  74. package/docs/QUEUE.md +350 -16
  75. package/docs/SECURITY.md +5 -2
  76. package/docs/TROUBLESHOOTING.md +81 -8
  77. package/package.json +1 -1
  78. package/templates/.opencode/agents/scheduled-coder.md +14 -1
  79. package/templates/.opencode/agents/scheduled-planner.md +64 -3
  80. package/templates/.opencode/skills/scheduled-quality-coder/SKILL.md +36 -3
  81. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +65 -4
  82. package/templates/.opencode/skills/scheduled-quality-reviewer/SKILL.md +23 -1
  83. package/templates/AGENTS.md.fragment +10 -4
  84. package/templates/README.md +3 -1
  85. package/templates/automation/config.schema.json +212 -22
  86. package/templates/automation/task-contract.schema.json +659 -49
  87. package/templates/automation/tasks/TASK-TEMPLATE.json.example +14 -8
  88. package/templates/automation/verification/collect.init.gradle +108 -0
  89. package/templates/automation/verification/contract.cjs +119 -0
  90. package/templates/automation/verification/inventory.cjs +536 -0
  91. package/templates/automation/verification/project.cjs +230 -0
  92. package/templates/automation/verification/recovery.cjs +425 -0
  93. package/templates/automation/verification/runtime.init.gradle +58 -0
  94. package/templates/scripts/automation/acceptance-report.sh +17 -0
  95. package/templates/scripts/automation/claim-task.sh +35 -2
  96. package/templates/scripts/automation/integration-scope-gate.sh +3 -3
  97. package/templates/scripts/automation/lib.sh +61 -19
  98. package/templates/scripts/automation/orchestrate-task.sh +7 -1
  99. package/templates/scripts/automation/preflight.sh +1 -2
  100. package/templates/scripts/automation/quality-gate.sh +10 -1
  101. package/templates/scripts/automation/record-red.sh +13 -1
  102. package/templates/scripts/automation/resume-task.sh +3 -0
  103. package/templates/scripts/automation/scope-gate.sh +4 -4
  104. package/templates/scripts/automation/show-acceptance-review.sh +1 -0
  105. package/templates/scripts/automation/status.sh +35 -0
  106. package/templates/scripts/automation/submit-review.sh +10 -1
  107. package/templates/scripts/automation/validate-contract.sh +10 -1
  108. package/templates/scripts/automation/verify-integration.sh +3 -0
  109. package/templates/scripts/automation/verify-task.sh +3 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:frankzhang2026:opencode-android-orchestrator:task-contract:v3",
3
+ "$id": "urn:frankzhang2026:opencode-android-orchestrator:task-contract:v8",
4
4
  "title": "Scheduled coding task contract",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
@@ -18,57 +18,199 @@
18
18
  "expectedFailure": {
19
19
  "type": "object",
20
20
  "additionalProperties": false,
21
- "required": ["type", "origin"],
21
+ "required": [
22
+ "type",
23
+ "origin"
24
+ ],
22
25
  "properties": {
23
- "type": { "type": "string", "minLength": 1 },
24
- "messageIncludes": { "type": "string", "minLength": 3 },
25
- "origin": { "type": "string", "minLength": 12 }
26
+ "type": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "messageIncludes": {
31
+ "type": "string",
32
+ "minLength": 3
33
+ },
34
+ "origin": {
35
+ "oneOf": [
36
+ {
37
+ "type": "string",
38
+ "minLength": 12
39
+ },
40
+ {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": [
44
+ "className",
45
+ "methodName"
46
+ ],
47
+ "properties": {
48
+ "className": {
49
+ "type": "string",
50
+ "pattern": "^[A-Za-z_$][A-Za-z0-9_.$]*$"
51
+ },
52
+ "methodName": {
53
+ "type": "string",
54
+ "minLength": 1
55
+ },
56
+ "fileName": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "lineNumber": {
61
+ "type": "integer",
62
+ "minimum": 1
63
+ }
64
+ },
65
+ "dependentRequired": {
66
+ "lineNumber": [
67
+ "fileName"
68
+ ]
69
+ }
70
+ }
71
+ ]
72
+ }
26
73
  }
27
74
  },
28
75
  "verificationCase": {
29
76
  "type": "object",
30
77
  "additionalProperties": false,
31
- "required": ["id", "criterion", "intent", "before", "after", "source", "test"],
78
+ "required": [
79
+ "id",
80
+ "criterion",
81
+ "intent",
82
+ "before",
83
+ "after",
84
+ "source",
85
+ "test"
86
+ ],
32
87
  "properties": {
33
- "id": { "type": "string", "pattern": "^[A-Z][A-Z0-9-]{2,63}$" },
34
- "criterion": { "type": "integer", "minimum": 1 },
35
- "intent": { "enum": ["preserve", "change", "observe"] },
36
- "before": { "enum": ["pass", "fail", "observe"] },
37
- "after": { "const": "pass" },
38
- "source": { "enum": ["userRequirement", "existingTest", "baselineCapture", "measuredFact"] },
88
+ "id": {
89
+ "type": "string",
90
+ "pattern": "^[A-Z][A-Z0-9-]{2,63}$"
91
+ },
92
+ "criterion": {
93
+ "type": "integer",
94
+ "minimum": 1
95
+ },
96
+ "intent": {
97
+ "enum": [
98
+ "preserve",
99
+ "change",
100
+ "observe"
101
+ ]
102
+ },
103
+ "before": {
104
+ "enum": [
105
+ "pass",
106
+ "fail",
107
+ "observe"
108
+ ]
109
+ },
110
+ "after": {
111
+ "const": "pass"
112
+ },
113
+ "source": {
114
+ "enum": [
115
+ "userRequirement",
116
+ "existingTest",
117
+ "baselineCapture",
118
+ "measuredFact"
119
+ ]
120
+ },
39
121
  "test": {
40
122
  "type": "object",
41
123
  "additionalProperties": false,
42
- "required": ["target", "className", "name"],
124
+ "required": [
125
+ "target",
126
+ "className",
127
+ "name"
128
+ ],
43
129
  "properties": {
44
- "target": { "type": "integer", "minimum": 0 },
45
- "className": { "type": "string", "minLength": 1 },
46
- "name": { "type": "string", "minLength": 1 }
130
+ "target": {
131
+ "type": "integer",
132
+ "minimum": 0
133
+ },
134
+ "className": {
135
+ "type": "string",
136
+ "minLength": 1
137
+ },
138
+ "name": {
139
+ "type": "string",
140
+ "minLength": 1
141
+ }
47
142
  }
48
143
  },
49
- "expectedFailure": { "$ref": "#/$defs/expectedFailure" }
144
+ "expectedFailure": {
145
+ "$ref": "#/$defs/expectedFailure"
146
+ }
50
147
  },
51
148
  "allOf": [
52
149
  {
53
- "if": { "properties": { "intent": { "const": "preserve" } } },
150
+ "if": {
151
+ "properties": {
152
+ "intent": {
153
+ "const": "preserve"
154
+ }
155
+ }
156
+ },
54
157
  "then": {
55
158
  "properties": {
56
- "before": { "const": "pass" },
57
- "source": { "enum": ["existingTest", "baselineCapture", "measuredFact"] }
159
+ "before": {
160
+ "const": "pass"
161
+ },
162
+ "source": {
163
+ "enum": [
164
+ "existingTest",
165
+ "baselineCapture",
166
+ "measuredFact"
167
+ ]
168
+ }
58
169
  },
59
- "not": { "required": ["expectedFailure"] }
170
+ "not": {
171
+ "required": [
172
+ "expectedFailure"
173
+ ]
174
+ }
60
175
  }
61
176
  },
62
177
  {
63
- "if": { "properties": { "intent": { "const": "change" } } },
178
+ "if": {
179
+ "properties": {
180
+ "intent": {
181
+ "const": "change"
182
+ }
183
+ }
184
+ },
64
185
  "then": {
65
- "properties": { "before": { "const": "fail" }, "source": { "const": "userRequirement" } },
66
- "required": ["expectedFailure"]
186
+ "properties": {
187
+ "before": {
188
+ "const": "fail"
189
+ },
190
+ "source": {
191
+ "const": "userRequirement"
192
+ }
193
+ },
194
+ "required": [
195
+ "expectedFailure"
196
+ ]
67
197
  }
68
198
  },
69
199
  {
70
- "if": { "properties": { "intent": { "const": "observe" } } },
71
- "then": { "properties": { "before": { "const": "observe" } } }
200
+ "if": {
201
+ "properties": {
202
+ "intent": {
203
+ "const": "observe"
204
+ }
205
+ }
206
+ },
207
+ "then": {
208
+ "properties": {
209
+ "before": {
210
+ "const": "observe"
211
+ }
212
+ }
213
+ }
72
214
  }
73
215
  ]
74
216
  }
@@ -93,23 +235,59 @@
93
235
  "verification"
94
236
  ],
95
237
  "properties": {
96
- "schemaVersion": { "const": 3 },
97
- "id": { "type": "string", "pattern": "^TASK-[A-Z0-9-]+$" },
98
- "title": { "type": "string", "minLength": 1 },
99
- "designApproved": { "const": true },
100
- "planPath": { "type": "string", "minLength": 1 },
101
- "ambiguityPolicy": { "const": "BLOCKED" },
102
- "maxFixLoops": { "type": "integer", "minimum": 0, "maximum": 1 },
103
- "maxChangedFiles": { "type": "integer", "minimum": 1, "maximum": 12 },
238
+ "schemaVersion": {
239
+ "enum": [
240
+ 3,
241
+ 4,
242
+ 5,
243
+ 6,
244
+ 7,
245
+ 8
246
+ ]
247
+ },
248
+ "id": {
249
+ "type": "string",
250
+ "pattern": "^TASK-[A-Z0-9-]+$"
251
+ },
252
+ "title": {
253
+ "type": "string",
254
+ "minLength": 1
255
+ },
256
+ "designApproved": {
257
+ "const": true
258
+ },
259
+ "planPath": {
260
+ "type": "string",
261
+ "minLength": 1
262
+ },
263
+ "ambiguityPolicy": {
264
+ "const": "BLOCKED"
265
+ },
266
+ "maxFixLoops": {
267
+ "type": "integer",
268
+ "minimum": 0,
269
+ "maximum": 1
270
+ },
271
+ "maxChangedFiles": {
272
+ "type": "integer",
273
+ "minimum": 1,
274
+ "maximum": 12
275
+ },
104
276
  "allowedPaths": {
105
277
  "type": "array",
106
278
  "minItems": 1,
107
- "items": { "type": "string", "minLength": 1 }
279
+ "items": {
280
+ "type": "string",
281
+ "minLength": 1
282
+ }
108
283
  },
109
284
  "forbiddenPaths": {
110
285
  "type": "array",
111
286
  "minItems": 1,
112
- "items": { "type": "string", "minLength": 1 }
287
+ "items": {
288
+ "type": "string",
289
+ "minLength": 1
290
+ }
113
291
  },
114
292
  "allowedWorkflowSkills": {
115
293
  "type": "array",
@@ -122,12 +300,18 @@
122
300
  "acceptanceCriteria": {
123
301
  "type": "array",
124
302
  "minItems": 1,
125
- "items": { "type": "string", "minLength": 1 }
303
+ "items": {
304
+ "type": "string",
305
+ "minLength": 1
306
+ }
126
307
  },
127
308
  "nonGoals": {
128
309
  "type": "array",
129
310
  "minItems": 1,
130
- "items": { "type": "string", "minLength": 1 }
311
+ "items": {
312
+ "type": "string",
313
+ "minLength": 1
314
+ }
131
315
  },
132
316
  "targetTests": {
133
317
  "type": "array",
@@ -136,29 +320,455 @@
136
320
  "items": {
137
321
  "type": "object",
138
322
  "additionalProperties": false,
139
- "required": ["gradleTask", "filter"],
323
+ "required": [
324
+ "gradleTask",
325
+ "filter"
326
+ ],
140
327
  "properties": {
141
- "gradleTask": { "$ref": "#/$defs/gradleTask" },
142
- "filter": { "$ref": "#/$defs/testFilter" }
328
+ "gradleTask": {
329
+ "$ref": "#/$defs/gradleTask"
330
+ },
331
+ "filter": {
332
+ "$ref": "#/$defs/testFilter"
333
+ }
143
334
  }
144
335
  }
145
336
  },
146
- "deviceTestsRequired": { "type": "boolean" },
147
- "testPolicy": { "enum": ["required", "not-required"] },
148
- "testPolicyReason": { "type": "string" },
337
+ "deviceTestsRequired": {
338
+ "type": "boolean"
339
+ },
340
+ "testPolicy": {
341
+ "enum": [
342
+ "required",
343
+ "not-required"
344
+ ]
345
+ },
346
+ "testPolicyReason": {
347
+ "type": "string"
348
+ },
149
349
  "verification": {
150
350
  "type": "object",
151
351
  "additionalProperties": false,
152
- "required": ["version", "maxPreparationFixes", "cases"],
352
+ "required": [
353
+ "version",
354
+ "maxPreparationFixes",
355
+ "cases"
356
+ ],
153
357
  "properties": {
154
- "version": { "const": 1 },
155
- "maxPreparationFixes": { "type": "integer", "minimum": 0, "maximum": 1 },
358
+ "version": {
359
+ "enum": [
360
+ 1,
361
+ 2
362
+ ]
363
+ },
364
+ "maxPreparationFixes": {
365
+ "type": "integer",
366
+ "minimum": 0,
367
+ "maximum": 1
368
+ },
156
369
  "cases": {
157
370
  "type": "array",
158
371
  "minItems": 1,
159
- "items": { "$ref": "#/$defs/verificationCase" }
372
+ "items": {
373
+ "$ref": "#/$defs/verificationCase"
374
+ }
375
+ },
376
+ "inventory": {
377
+ "type": "object",
378
+ "additionalProperties": false,
379
+ "required": [
380
+ "mode",
381
+ "existingSkips",
382
+ "emptyBaseline"
383
+ ],
384
+ "properties": {
385
+ "mode": {
386
+ "const": "focusedBaseline"
387
+ },
388
+ "existingSkips": {
389
+ "enum": [
390
+ "reject",
391
+ "preserve"
392
+ ]
393
+ },
394
+ "emptyBaseline": {
395
+ "enum": [
396
+ "reject",
397
+ "allow"
398
+ ]
399
+ }
400
+ }
401
+ },
402
+ "criteriaEvidence": {
403
+ "type": "array",
404
+ "items": {
405
+ "type": "object",
406
+ "additionalProperties": false,
407
+ "required": [
408
+ "criterion",
409
+ "kind",
410
+ "references"
411
+ ],
412
+ "properties": {
413
+ "criterion": {
414
+ "type": "integer",
415
+ "minimum": 1
416
+ },
417
+ "kind": {
418
+ "enum": [
419
+ "behavior",
420
+ "build",
421
+ "lint",
422
+ "device"
423
+ ]
424
+ },
425
+ "references": {
426
+ "type": "array",
427
+ "minItems": 1,
428
+ "uniqueItems": true,
429
+ "items": {
430
+ "type": "string",
431
+ "minLength": 1
432
+ }
433
+ }
434
+ }
435
+ }
436
+ },
437
+ "supplementalTests": {
438
+ "type": "object",
439
+ "additionalProperties": false,
440
+ "required": [
441
+ "mode",
442
+ "maxRevisions"
443
+ ],
444
+ "properties": {
445
+ "mode": {
446
+ "const": "baselinePassingNewFiles"
447
+ },
448
+ "maxRevisions": {
449
+ "const": 1
450
+ }
451
+ }
452
+ }
453
+ }
454
+ },
455
+ "recovery": {
456
+ "type": "object",
457
+ "additionalProperties": false,
458
+ "required": [
459
+ "version",
460
+ "scope",
461
+ "maxEnvironmentRetries",
462
+ "maxManualRetries",
463
+ "maxSameFailureRetries",
464
+ "maxElapsedMs",
465
+ "initialDelayMs",
466
+ "maxDelayMs"
467
+ ],
468
+ "properties": {
469
+ "version": {
470
+ "const": 1
471
+ },
472
+ "scope": {
473
+ "const": "baseline"
474
+ },
475
+ "maxEnvironmentRetries": {
476
+ "type": "integer",
477
+ "minimum": 0,
478
+ "maximum": 3
479
+ },
480
+ "maxManualRetries": {
481
+ "type": "integer",
482
+ "minimum": 0,
483
+ "maximum": 3
484
+ },
485
+ "maxSameFailureRetries": {
486
+ "type": "integer",
487
+ "minimum": 0,
488
+ "maximum": 3
489
+ },
490
+ "maxElapsedMs": {
491
+ "type": "integer",
492
+ "minimum": 1000,
493
+ "maximum": 86400000
494
+ },
495
+ "initialDelayMs": {
496
+ "type": "integer",
497
+ "minimum": 1000,
498
+ "maximum": 600000
499
+ },
500
+ "maxDelayMs": {
501
+ "type": "integer",
502
+ "minimum": 1000,
503
+ "maximum": 600000
504
+ }
505
+ }
506
+ },
507
+ "execution": {
508
+ "type": "object",
509
+ "additionalProperties": false,
510
+ "required": [
511
+ "version",
512
+ "maxRunMs",
513
+ "maxStageMs",
514
+ "terminationGraceMs"
515
+ ],
516
+ "properties": {
517
+ "version": {
518
+ "const": 1
519
+ },
520
+ "maxRunMs": {
521
+ "type": "integer",
522
+ "minimum": 1000,
523
+ "maximum": 86400000
524
+ },
525
+ "maxStageMs": {
526
+ "type": "integer",
527
+ "minimum": 1000,
528
+ "maximum": 86400000
529
+ },
530
+ "terminationGraceMs": {
531
+ "type": "integer",
532
+ "minimum": 1000,
533
+ "maximum": 60000
534
+ }
535
+ }
536
+ },
537
+ "stageRecovery": {
538
+ "type": "object",
539
+ "additionalProperties": false,
540
+ "required": [
541
+ "version",
542
+ "maxEnvironmentRetries",
543
+ "maxElapsedMs",
544
+ "initialDelayMs",
545
+ "maxDelayMs",
546
+ "maxSameFailureRetries"
547
+ ],
548
+ "properties": {
549
+ "version": {
550
+ "const": 1
551
+ },
552
+ "maxEnvironmentRetries": {
553
+ "type": "integer",
554
+ "minimum": 0,
555
+ "maximum": 3
556
+ },
557
+ "maxElapsedMs": {
558
+ "type": "integer",
559
+ "minimum": 1000,
560
+ "maximum": 86400000
561
+ },
562
+ "initialDelayMs": {
563
+ "type": "integer",
564
+ "minimum": 1000,
565
+ "maximum": 600000
566
+ },
567
+ "maxDelayMs": {
568
+ "type": "integer",
569
+ "minimum": 1000,
570
+ "maximum": 600000
571
+ },
572
+ "maxSameFailureRetries": {
573
+ "type": "integer",
574
+ "minimum": 0,
575
+ "maximum": 3
576
+ }
577
+ }
578
+ },
579
+ "continuity": {
580
+ "type": "object",
581
+ "additionalProperties": false,
582
+ "required": [
583
+ "version",
584
+ "isolatedAutoIntegration",
585
+ "planningRefresh",
586
+ "planningInputs"
587
+ ],
588
+ "properties": {
589
+ "version": {
590
+ "const": 1
591
+ },
592
+ "isolatedAutoIntegration": {
593
+ "type": "boolean"
594
+ },
595
+ "planningRefresh": {
596
+ "enum": [
597
+ "reject",
598
+ "completedQueueTasks"
599
+ ]
600
+ },
601
+ "planningInputs": {
602
+ "type": "array",
603
+ "minItems": 1,
604
+ "maxItems": 128,
605
+ "uniqueItems": true,
606
+ "items": {
607
+ "type": "string",
608
+ "minLength": 1,
609
+ "maxLength": 512,
610
+ "pattern": "^[A-Za-z0-9._/?*-]+$",
611
+ "not": {
612
+ "pattern": "(^/|\\.\\.|(^|/)(\\.git|\\.)(/|$)|//|/$)"
613
+ }
614
+ }
615
+ }
616
+ }
617
+ }
618
+ },
619
+ "allOf": [
620
+ {
621
+ "if": {
622
+ "properties": {
623
+ "schemaVersion": {
624
+ "enum": [
625
+ 4,
626
+ 5,
627
+ 6,
628
+ 7,
629
+ 8
630
+ ]
631
+ }
632
+ }
633
+ },
634
+ "then": {
635
+ "properties": {
636
+ "testPolicy": {
637
+ "const": "required"
638
+ },
639
+ "targetTests": {
640
+ "items": {
641
+ "properties": {
642
+ "gradleTask": {
643
+ "pattern": "^(?::[A-Za-z0-9_.-]+)+$"
644
+ }
645
+ }
646
+ }
647
+ },
648
+ "verification": {
649
+ "required": [
650
+ "inventory"
651
+ ],
652
+ "properties": {
653
+ "version": {
654
+ "const": 2
655
+ }
656
+ }
657
+ }
658
+ }
659
+ },
660
+ "else": {
661
+ "properties": {
662
+ "verification": {
663
+ "properties": {
664
+ "version": {
665
+ "const": 1
666
+ }
667
+ },
668
+ "not": {
669
+ "required": [
670
+ "inventory"
671
+ ]
672
+ }
673
+ }
674
+ }
675
+ }
676
+ },
677
+ {
678
+ "if": {
679
+ "properties": {
680
+ "schemaVersion": {
681
+ "enum": [
682
+ 5,
683
+ 6,
684
+ 7,
685
+ 8
686
+ ]
687
+ }
688
+ }
689
+ },
690
+ "then": {
691
+ "required": [
692
+ "recovery"
693
+ ]
694
+ },
695
+ "else": {
696
+ "not": {
697
+ "required": [
698
+ "recovery"
699
+ ]
700
+ }
701
+ }
702
+ },
703
+ {
704
+ "if": {
705
+ "properties": {
706
+ "schemaVersion": {
707
+ "enum": [
708
+ 6,
709
+ 7,
710
+ 8
711
+ ]
712
+ }
713
+ }
714
+ },
715
+ "then": {
716
+ "required": [
717
+ "execution"
718
+ ]
719
+ },
720
+ "else": {
721
+ "not": {
722
+ "required": [
723
+ "execution"
724
+ ]
725
+ }
726
+ }
727
+ },
728
+ {
729
+ "if": {
730
+ "properties": {
731
+ "schemaVersion": {
732
+ "enum": [
733
+ 7,
734
+ 8
735
+ ]
736
+ }
737
+ }
738
+ },
739
+ "then": {
740
+ "required": [
741
+ "stageRecovery"
742
+ ]
743
+ },
744
+ "else": {
745
+ "not": {
746
+ "required": [
747
+ "stageRecovery"
748
+ ]
749
+ }
750
+ }
751
+ },
752
+ {
753
+ "if": {
754
+ "properties": {
755
+ "schemaVersion": {
756
+ "const": 8
757
+ }
758
+ }
759
+ },
760
+ "then": {
761
+ "required": [
762
+ "continuity"
763
+ ]
764
+ },
765
+ "else": {
766
+ "not": {
767
+ "required": [
768
+ "continuity"
769
+ ]
160
770
  }
161
771
  }
162
772
  }
163
- }
773
+ ]
164
774
  }