@frankzhang2026/opencode-android-orchestrator 1.0.4 → 1.1.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 (107) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +79 -18
  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 +14 -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 +10 -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 +49 -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 +77 -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 +2 -1
  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 +9 -1
  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 +155 -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 +152 -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/MIGRATION.md +110 -9
  73. package/docs/QUEUE.md +360 -6
  74. package/docs/SECURITY.md +5 -2
  75. package/docs/TROUBLESHOOTING.md +82 -8
  76. package/package.json +1 -1
  77. package/templates/.opencode/agents/scheduled-coder.md +22 -0
  78. package/templates/.opencode/agents/scheduled-planner.md +73 -2
  79. package/templates/.opencode/skills/scheduled-quality-coder/SKILL.md +34 -2
  80. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +65 -4
  81. package/templates/.opencode/skills/scheduled-quality-reviewer/SKILL.md +22 -0
  82. package/templates/AGENTS.md.fragment +10 -4
  83. package/templates/README.md +3 -1
  84. package/templates/automation/config.schema.json +212 -22
  85. package/templates/automation/task-contract.schema.json +617 -21
  86. package/templates/automation/tasks/TASK-TEMPLATE.json.example +31 -3
  87. package/templates/automation/verification/collect.init.gradle +98 -0
  88. package/templates/automation/verification/contract.cjs +93 -0
  89. package/templates/automation/verification/inventory.cjs +433 -0
  90. package/templates/automation/verification/project.cjs +172 -0
  91. package/templates/automation/verification/recovery.cjs +426 -0
  92. package/templates/scripts/automation/acceptance-report.sh +29 -0
  93. package/templates/scripts/automation/claim-task.sh +35 -2
  94. package/templates/scripts/automation/integration-scope-gate.sh +3 -3
  95. package/templates/scripts/automation/lib.sh +167 -17
  96. package/templates/scripts/automation/orchestrate-task.sh +7 -1
  97. package/templates/scripts/automation/preflight.sh +1 -2
  98. package/templates/scripts/automation/quality-gate.sh +10 -1
  99. package/templates/scripts/automation/record-red.sh +182 -32
  100. package/templates/scripts/automation/resume-task.sh +3 -0
  101. package/templates/scripts/automation/scope-gate.sh +4 -4
  102. package/templates/scripts/automation/show-acceptance-review.sh +8 -0
  103. package/templates/scripts/automation/status.sh +38 -0
  104. package/templates/scripts/automation/submit-review.sh +10 -1
  105. package/templates/scripts/automation/validate-contract.sh +56 -3
  106. package/templates/scripts/automation/verify-integration.sh +3 -0
  107. package/templates/scripts/automation/verify-task.sh +17 -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:v2",
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,
@@ -14,6 +14,170 @@
14
14
  "type": "string",
15
15
  "minLength": 1,
16
16
  "pattern": "^[A-Za-z0-9_.#$*-]+$"
17
+ },
18
+ "expectedFailure": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": [
22
+ "type",
23
+ "origin"
24
+ ],
25
+ "properties": {
26
+ "type": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "messageIncludes": {
31
+ "type": "string",
32
+ "minLength": 3
33
+ },
34
+ "origin": {
35
+ "type": "string",
36
+ "minLength": 12
37
+ }
38
+ }
39
+ },
40
+ "verificationCase": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": [
44
+ "id",
45
+ "criterion",
46
+ "intent",
47
+ "before",
48
+ "after",
49
+ "source",
50
+ "test"
51
+ ],
52
+ "properties": {
53
+ "id": {
54
+ "type": "string",
55
+ "pattern": "^[A-Z][A-Z0-9-]{2,63}$"
56
+ },
57
+ "criterion": {
58
+ "type": "integer",
59
+ "minimum": 1
60
+ },
61
+ "intent": {
62
+ "enum": [
63
+ "preserve",
64
+ "change",
65
+ "observe"
66
+ ]
67
+ },
68
+ "before": {
69
+ "enum": [
70
+ "pass",
71
+ "fail",
72
+ "observe"
73
+ ]
74
+ },
75
+ "after": {
76
+ "const": "pass"
77
+ },
78
+ "source": {
79
+ "enum": [
80
+ "userRequirement",
81
+ "existingTest",
82
+ "baselineCapture",
83
+ "measuredFact"
84
+ ]
85
+ },
86
+ "test": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "required": [
90
+ "target",
91
+ "className",
92
+ "name"
93
+ ],
94
+ "properties": {
95
+ "target": {
96
+ "type": "integer",
97
+ "minimum": 0
98
+ },
99
+ "className": {
100
+ "type": "string",
101
+ "minLength": 1
102
+ },
103
+ "name": {
104
+ "type": "string",
105
+ "minLength": 1
106
+ }
107
+ }
108
+ },
109
+ "expectedFailure": {
110
+ "$ref": "#/$defs/expectedFailure"
111
+ }
112
+ },
113
+ "allOf": [
114
+ {
115
+ "if": {
116
+ "properties": {
117
+ "intent": {
118
+ "const": "preserve"
119
+ }
120
+ }
121
+ },
122
+ "then": {
123
+ "properties": {
124
+ "before": {
125
+ "const": "pass"
126
+ },
127
+ "source": {
128
+ "enum": [
129
+ "existingTest",
130
+ "baselineCapture",
131
+ "measuredFact"
132
+ ]
133
+ }
134
+ },
135
+ "not": {
136
+ "required": [
137
+ "expectedFailure"
138
+ ]
139
+ }
140
+ }
141
+ },
142
+ {
143
+ "if": {
144
+ "properties": {
145
+ "intent": {
146
+ "const": "change"
147
+ }
148
+ }
149
+ },
150
+ "then": {
151
+ "properties": {
152
+ "before": {
153
+ "const": "fail"
154
+ },
155
+ "source": {
156
+ "const": "userRequirement"
157
+ }
158
+ },
159
+ "required": [
160
+ "expectedFailure"
161
+ ]
162
+ }
163
+ },
164
+ {
165
+ "if": {
166
+ "properties": {
167
+ "intent": {
168
+ "const": "observe"
169
+ }
170
+ }
171
+ },
172
+ "then": {
173
+ "properties": {
174
+ "before": {
175
+ "const": "observe"
176
+ }
177
+ }
178
+ }
179
+ }
180
+ ]
17
181
  }
18
182
  },
19
183
  "required": [
@@ -32,26 +196,63 @@
32
196
  "nonGoals",
33
197
  "targetTests",
34
198
  "deviceTestsRequired",
35
- "testPolicy"
199
+ "testPolicy",
200
+ "verification"
36
201
  ],
37
202
  "properties": {
38
- "schemaVersion": { "const": 2 },
39
- "id": { "type": "string", "pattern": "^TASK-[A-Z0-9-]+$" },
40
- "title": { "type": "string", "minLength": 1 },
41
- "designApproved": { "const": true },
42
- "planPath": { "type": "string", "minLength": 1 },
43
- "ambiguityPolicy": { "const": "BLOCKED" },
44
- "maxFixLoops": { "type": "integer", "minimum": 0, "maximum": 1 },
45
- "maxChangedFiles": { "type": "integer", "minimum": 1, "maximum": 12 },
203
+ "schemaVersion": {
204
+ "enum": [
205
+ 3,
206
+ 4,
207
+ 5,
208
+ 6,
209
+ 7,
210
+ 8
211
+ ]
212
+ },
213
+ "id": {
214
+ "type": "string",
215
+ "pattern": "^TASK-[A-Z0-9-]+$"
216
+ },
217
+ "title": {
218
+ "type": "string",
219
+ "minLength": 1
220
+ },
221
+ "designApproved": {
222
+ "const": true
223
+ },
224
+ "planPath": {
225
+ "type": "string",
226
+ "minLength": 1
227
+ },
228
+ "ambiguityPolicy": {
229
+ "const": "BLOCKED"
230
+ },
231
+ "maxFixLoops": {
232
+ "type": "integer",
233
+ "minimum": 0,
234
+ "maximum": 1
235
+ },
236
+ "maxChangedFiles": {
237
+ "type": "integer",
238
+ "minimum": 1,
239
+ "maximum": 12
240
+ },
46
241
  "allowedPaths": {
47
242
  "type": "array",
48
243
  "minItems": 1,
49
- "items": { "type": "string", "minLength": 1 }
244
+ "items": {
245
+ "type": "string",
246
+ "minLength": 1
247
+ }
50
248
  },
51
249
  "forbiddenPaths": {
52
250
  "type": "array",
53
251
  "minItems": 1,
54
- "items": { "type": "string", "minLength": 1 }
252
+ "items": {
253
+ "type": "string",
254
+ "minLength": 1
255
+ }
55
256
  },
56
257
  "allowedWorkflowSkills": {
57
258
  "type": "array",
@@ -64,12 +265,18 @@
64
265
  "acceptanceCriteria": {
65
266
  "type": "array",
66
267
  "minItems": 1,
67
- "items": { "type": "string", "minLength": 1 }
268
+ "items": {
269
+ "type": "string",
270
+ "minLength": 1
271
+ }
68
272
  },
69
273
  "nonGoals": {
70
274
  "type": "array",
71
275
  "minItems": 1,
72
- "items": { "type": "string", "minLength": 1 }
276
+ "items": {
277
+ "type": "string",
278
+ "minLength": 1
279
+ }
73
280
  },
74
281
  "targetTests": {
75
282
  "type": "array",
@@ -78,15 +285,404 @@
78
285
  "items": {
79
286
  "type": "object",
80
287
  "additionalProperties": false,
81
- "required": ["gradleTask", "filter"],
288
+ "required": [
289
+ "gradleTask",
290
+ "filter"
291
+ ],
82
292
  "properties": {
83
- "gradleTask": { "$ref": "#/$defs/gradleTask" },
84
- "filter": { "$ref": "#/$defs/testFilter" }
293
+ "gradleTask": {
294
+ "$ref": "#/$defs/gradleTask"
295
+ },
296
+ "filter": {
297
+ "$ref": "#/$defs/testFilter"
298
+ }
85
299
  }
86
300
  }
87
301
  },
88
- "deviceTestsRequired": { "type": "boolean" },
89
- "testPolicy": { "enum": ["required", "not-required"] },
90
- "testPolicyReason": { "type": "string" }
91
- }
302
+ "deviceTestsRequired": {
303
+ "type": "boolean"
304
+ },
305
+ "testPolicy": {
306
+ "enum": [
307
+ "required",
308
+ "not-required"
309
+ ]
310
+ },
311
+ "testPolicyReason": {
312
+ "type": "string"
313
+ },
314
+ "verification": {
315
+ "type": "object",
316
+ "additionalProperties": false,
317
+ "required": [
318
+ "version",
319
+ "maxPreparationFixes",
320
+ "cases"
321
+ ],
322
+ "properties": {
323
+ "version": {
324
+ "enum": [
325
+ 1,
326
+ 2
327
+ ]
328
+ },
329
+ "maxPreparationFixes": {
330
+ "type": "integer",
331
+ "minimum": 0,
332
+ "maximum": 1
333
+ },
334
+ "cases": {
335
+ "type": "array",
336
+ "minItems": 1,
337
+ "items": {
338
+ "$ref": "#/$defs/verificationCase"
339
+ }
340
+ },
341
+ "inventory": {
342
+ "type": "object",
343
+ "additionalProperties": false,
344
+ "required": [
345
+ "mode",
346
+ "existingSkips",
347
+ "emptyBaseline"
348
+ ],
349
+ "properties": {
350
+ "mode": {
351
+ "const": "focusedBaseline"
352
+ },
353
+ "existingSkips": {
354
+ "enum": [
355
+ "reject",
356
+ "preserve"
357
+ ]
358
+ },
359
+ "emptyBaseline": {
360
+ "enum": [
361
+ "reject",
362
+ "allow"
363
+ ]
364
+ }
365
+ }
366
+ }
367
+ }
368
+ },
369
+ "recovery": {
370
+ "type": "object",
371
+ "additionalProperties": false,
372
+ "required": [
373
+ "version",
374
+ "scope",
375
+ "maxEnvironmentRetries",
376
+ "maxManualRetries",
377
+ "maxSameFailureRetries",
378
+ "maxElapsedMs",
379
+ "initialDelayMs",
380
+ "maxDelayMs"
381
+ ],
382
+ "properties": {
383
+ "version": {
384
+ "const": 1
385
+ },
386
+ "scope": {
387
+ "const": "baseline"
388
+ },
389
+ "maxEnvironmentRetries": {
390
+ "type": "integer",
391
+ "minimum": 0,
392
+ "maximum": 3
393
+ },
394
+ "maxManualRetries": {
395
+ "type": "integer",
396
+ "minimum": 0,
397
+ "maximum": 3
398
+ },
399
+ "maxSameFailureRetries": {
400
+ "type": "integer",
401
+ "minimum": 0,
402
+ "maximum": 3
403
+ },
404
+ "maxElapsedMs": {
405
+ "type": "integer",
406
+ "minimum": 1000,
407
+ "maximum": 86400000
408
+ },
409
+ "initialDelayMs": {
410
+ "type": "integer",
411
+ "minimum": 1000,
412
+ "maximum": 600000
413
+ },
414
+ "maxDelayMs": {
415
+ "type": "integer",
416
+ "minimum": 1000,
417
+ "maximum": 600000
418
+ }
419
+ }
420
+ },
421
+ "execution": {
422
+ "type": "object",
423
+ "additionalProperties": false,
424
+ "required": [
425
+ "version",
426
+ "maxRunMs",
427
+ "maxStageMs",
428
+ "terminationGraceMs"
429
+ ],
430
+ "properties": {
431
+ "version": {
432
+ "const": 1
433
+ },
434
+ "maxRunMs": {
435
+ "type": "integer",
436
+ "minimum": 1000,
437
+ "maximum": 86400000
438
+ },
439
+ "maxStageMs": {
440
+ "type": "integer",
441
+ "minimum": 1000,
442
+ "maximum": 86400000
443
+ },
444
+ "terminationGraceMs": {
445
+ "type": "integer",
446
+ "minimum": 1000,
447
+ "maximum": 60000
448
+ }
449
+ }
450
+ },
451
+ "stageRecovery": {
452
+ "type": "object",
453
+ "additionalProperties": false,
454
+ "required": [
455
+ "version",
456
+ "maxEnvironmentRetries",
457
+ "maxElapsedMs",
458
+ "initialDelayMs",
459
+ "maxDelayMs",
460
+ "maxSameFailureRetries"
461
+ ],
462
+ "properties": {
463
+ "version": {
464
+ "const": 1
465
+ },
466
+ "maxEnvironmentRetries": {
467
+ "type": "integer",
468
+ "minimum": 0,
469
+ "maximum": 3
470
+ },
471
+ "maxElapsedMs": {
472
+ "type": "integer",
473
+ "minimum": 1000,
474
+ "maximum": 86400000
475
+ },
476
+ "initialDelayMs": {
477
+ "type": "integer",
478
+ "minimum": 1000,
479
+ "maximum": 600000
480
+ },
481
+ "maxDelayMs": {
482
+ "type": "integer",
483
+ "minimum": 1000,
484
+ "maximum": 600000
485
+ },
486
+ "maxSameFailureRetries": {
487
+ "type": "integer",
488
+ "minimum": 0,
489
+ "maximum": 3
490
+ }
491
+ }
492
+ },
493
+ "continuity": {
494
+ "type": "object",
495
+ "additionalProperties": false,
496
+ "required": [
497
+ "version",
498
+ "isolatedAutoIntegration",
499
+ "planningRefresh",
500
+ "planningInputs"
501
+ ],
502
+ "properties": {
503
+ "version": {
504
+ "const": 1
505
+ },
506
+ "isolatedAutoIntegration": {
507
+ "type": "boolean"
508
+ },
509
+ "planningRefresh": {
510
+ "enum": [
511
+ "reject",
512
+ "completedQueueTasks"
513
+ ]
514
+ },
515
+ "planningInputs": {
516
+ "type": "array",
517
+ "minItems": 1,
518
+ "maxItems": 128,
519
+ "uniqueItems": true,
520
+ "items": {
521
+ "type": "string",
522
+ "minLength": 1,
523
+ "maxLength": 512,
524
+ "pattern": "^[A-Za-z0-9._/?*-]+$",
525
+ "not": {
526
+ "pattern": "(^/|\\.\\.|(^|/)(\\.git|\\.)(/|$)|//|/$)"
527
+ }
528
+ }
529
+ }
530
+ }
531
+ }
532
+ },
533
+ "allOf": [
534
+ {
535
+ "if": {
536
+ "properties": {
537
+ "schemaVersion": {
538
+ "enum": [
539
+ 4,
540
+ 5,
541
+ 6,
542
+ 7,
543
+ 8
544
+ ]
545
+ }
546
+ }
547
+ },
548
+ "then": {
549
+ "properties": {
550
+ "testPolicy": {
551
+ "const": "required"
552
+ },
553
+ "targetTests": {
554
+ "items": {
555
+ "properties": {
556
+ "gradleTask": {
557
+ "pattern": "^(?::[A-Za-z0-9_.-]+)+$"
558
+ }
559
+ }
560
+ }
561
+ },
562
+ "verification": {
563
+ "required": [
564
+ "inventory"
565
+ ],
566
+ "properties": {
567
+ "version": {
568
+ "const": 2
569
+ }
570
+ }
571
+ }
572
+ }
573
+ },
574
+ "else": {
575
+ "properties": {
576
+ "verification": {
577
+ "properties": {
578
+ "version": {
579
+ "const": 1
580
+ }
581
+ },
582
+ "not": {
583
+ "required": [
584
+ "inventory"
585
+ ]
586
+ }
587
+ }
588
+ }
589
+ }
590
+ },
591
+ {
592
+ "if": {
593
+ "properties": {
594
+ "schemaVersion": {
595
+ "enum": [
596
+ 5,
597
+ 6,
598
+ 7,
599
+ 8
600
+ ]
601
+ }
602
+ }
603
+ },
604
+ "then": {
605
+ "required": [
606
+ "recovery"
607
+ ]
608
+ },
609
+ "else": {
610
+ "not": {
611
+ "required": [
612
+ "recovery"
613
+ ]
614
+ }
615
+ }
616
+ },
617
+ {
618
+ "if": {
619
+ "properties": {
620
+ "schemaVersion": {
621
+ "enum": [
622
+ 6,
623
+ 7,
624
+ 8
625
+ ]
626
+ }
627
+ }
628
+ },
629
+ "then": {
630
+ "required": [
631
+ "execution"
632
+ ]
633
+ },
634
+ "else": {
635
+ "not": {
636
+ "required": [
637
+ "execution"
638
+ ]
639
+ }
640
+ }
641
+ },
642
+ {
643
+ "if": {
644
+ "properties": {
645
+ "schemaVersion": {
646
+ "enum": [
647
+ 7,
648
+ 8
649
+ ]
650
+ }
651
+ }
652
+ },
653
+ "then": {
654
+ "required": [
655
+ "stageRecovery"
656
+ ]
657
+ },
658
+ "else": {
659
+ "not": {
660
+ "required": [
661
+ "stageRecovery"
662
+ ]
663
+ }
664
+ }
665
+ },
666
+ {
667
+ "if": {
668
+ "properties": {
669
+ "schemaVersion": {
670
+ "const": 8
671
+ }
672
+ }
673
+ },
674
+ "then": {
675
+ "required": [
676
+ "continuity"
677
+ ]
678
+ },
679
+ "else": {
680
+ "not": {
681
+ "required": [
682
+ "continuity"
683
+ ]
684
+ }
685
+ }
686
+ }
687
+ ]
92
688
  }