agentweaver 0.1.9 → 0.1.10

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 (26) hide show
  1. package/README.md +60 -28
  2. package/dist/artifacts.js +1 -1
  3. package/dist/errors.js +7 -0
  4. package/dist/index.js +66 -34
  5. package/dist/interactive-ui.js +351 -44
  6. package/dist/pipeline/declarative-flows.js +7 -4
  7. package/dist/pipeline/flow-catalog.js +28 -21
  8. package/dist/pipeline/flow-specs/opencode/auto-opencode.json +1365 -0
  9. package/dist/pipeline/flow-specs/opencode/bugz/bug-analyze-opencode.json +382 -0
  10. package/dist/pipeline/flow-specs/opencode/bugz/bug-fix-opencode.json +56 -0
  11. package/dist/pipeline/flow-specs/opencode/gitlab/gitlab-diff-review-opencode.json +308 -0
  12. package/dist/pipeline/flow-specs/opencode/gitlab/gitlab-review-opencode.json +437 -0
  13. package/dist/pipeline/flow-specs/opencode/gitlab/mr-description-opencode.json +117 -0
  14. package/dist/pipeline/flow-specs/opencode/go/run-go-linter-loop-opencode.json +321 -0
  15. package/dist/pipeline/flow-specs/opencode/go/run-go-tests-loop-opencode.json +321 -0
  16. package/dist/pipeline/flow-specs/opencode/implement-opencode.json +64 -0
  17. package/dist/pipeline/flow-specs/{plan-opencode.json → opencode/plan-opencode.json} +4 -4
  18. package/dist/pipeline/flow-specs/opencode/review/review-fix-opencode.json +209 -0
  19. package/dist/pipeline/flow-specs/opencode/review/review-opencode.json +452 -0
  20. package/dist/pipeline/flow-specs/opencode/task-describe-opencode.json +148 -0
  21. package/dist/pipeline/spec-loader.js +18 -7
  22. package/dist/runtime/process-runner.js +45 -1
  23. package/package.json +1 -1
  24. package/dist/pipeline/flow-specs/preflight.json +0 -206
  25. package/dist/pipeline/flow-specs/run-linter-loop.json +0 -155
  26. package/dist/pipeline/flow-specs/run-tests-loop.json +0 -155
@@ -0,0 +1,1365 @@
1
+ {
2
+ "kind": "auto-flow",
3
+ "version": 1,
4
+ "constants": {
5
+ "autoReviewFixExtraPrompt": "Исправлять только блокеры, критикалы и важные"
6
+ },
7
+ "phases": [
8
+ {
9
+ "id": "plan",
10
+ "steps": [
11
+ {
12
+ "id": "fetch_jira",
13
+ "node": "jira-fetch",
14
+ "params": {
15
+ "jiraApiUrl": {
16
+ "ref": "params.jiraApiUrl"
17
+ },
18
+ "outputFile": {
19
+ "artifact": {
20
+ "kind": "jira-task-file",
21
+ "taskKey": {
22
+ "ref": "params.taskKey"
23
+ }
24
+ }
25
+ },
26
+ "attachmentsManifestFile": {
27
+ "artifact": {
28
+ "kind": "jira-attachments-manifest-file",
29
+ "taskKey": {
30
+ "ref": "params.taskKey"
31
+ }
32
+ }
33
+ },
34
+ "attachmentsContextFile": {
35
+ "artifact": {
36
+ "kind": "jira-attachments-context-file",
37
+ "taskKey": {
38
+ "ref": "params.taskKey"
39
+ }
40
+ }
41
+ }
42
+ },
43
+ "expect": [
44
+ {
45
+ "kind": "require-file",
46
+ "path": {
47
+ "artifact": {
48
+ "kind": "jira-task-file",
49
+ "taskKey": {
50
+ "ref": "params.taskKey"
51
+ }
52
+ }
53
+ },
54
+ "message": "Jira fetch node did not produce the Jira task file."
55
+ },
56
+ {
57
+ "kind": "require-file",
58
+ "path": {
59
+ "artifact": {
60
+ "kind": "jira-attachments-manifest-file",
61
+ "taskKey": {
62
+ "ref": "params.taskKey"
63
+ }
64
+ }
65
+ },
66
+ "message": "Jira fetch node did not produce the Jira attachments manifest file."
67
+ },
68
+ {
69
+ "kind": "require-file",
70
+ "path": {
71
+ "artifact": {
72
+ "kind": "jira-attachments-context-file",
73
+ "taskKey": {
74
+ "ref": "params.taskKey"
75
+ }
76
+ }
77
+ },
78
+ "message": "Jira fetch node did not produce the Jira attachments context file."
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ "id": "load_existing_task_summary",
84
+ "when": {
85
+ "all": [
86
+ {
87
+ "not": {
88
+ "ref": "params.forceRefresh"
89
+ }
90
+ },
91
+ {
92
+ "exists": {
93
+ "artifact": {
94
+ "kind": "task-summary-file",
95
+ "taskKey": {
96
+ "ref": "params.taskKey"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ]
102
+ },
103
+ "node": "summary-file-load",
104
+ "params": {
105
+ "path": {
106
+ "artifact": {
107
+ "kind": "task-summary-file",
108
+ "taskKey": {
109
+ "ref": "params.taskKey"
110
+ }
111
+ }
112
+ }
113
+ }
114
+ },
115
+ {
116
+ "id": "generate_task_summary",
117
+ "when": {
118
+ "any": [
119
+ {
120
+ "ref": "params.forceRefresh"
121
+ },
122
+ {
123
+ "not": {
124
+ "exists": {
125
+ "artifact": {
126
+ "kind": "task-summary-file",
127
+ "taskKey": {
128
+ "ref": "params.taskKey"
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ ]
135
+ },
136
+ "node": "opencode-prompt",
137
+ "prompt": {
138
+ "templateRef": "task-summary",
139
+ "vars": {
140
+ "jira_task_file": {
141
+ "artifact": {
142
+ "kind": "jira-task-file",
143
+ "taskKey": {
144
+ "ref": "params.taskKey"
145
+ }
146
+ }
147
+ },
148
+ "task_summary_file": {
149
+ "artifact": {
150
+ "kind": "task-summary-file",
151
+ "taskKey": {
152
+ "ref": "params.taskKey"
153
+ }
154
+ }
155
+ },
156
+ "task_summary_json_file": {
157
+ "artifact": {
158
+ "kind": "task-summary-json-file",
159
+ "taskKey": {
160
+ "ref": "params.taskKey"
161
+ }
162
+ }
163
+ }
164
+ },
165
+ "format": "plain"
166
+ },
167
+ "params": {
168
+ "labelText": {
169
+ "const": "Preparing task summary"
170
+ },
171
+ "outputFile": {
172
+ "artifact": {
173
+ "kind": "task-summary-file",
174
+ "taskKey": {
175
+ "ref": "params.taskKey"
176
+ }
177
+ }
178
+ },
179
+ "requiredArtifacts": {
180
+ "list": [
181
+ {
182
+ "artifact": {
183
+ "kind": "task-summary-json-file",
184
+ "taskKey": {
185
+ "ref": "params.taskKey"
186
+ }
187
+ }
188
+ }
189
+ ]
190
+ },
191
+ "model": {
192
+ "const": "minimax-coding-plan/MiniMax-M2.7"
193
+ }
194
+ },
195
+ "expect": [
196
+ {
197
+ "kind": "require-artifacts",
198
+ "when": {
199
+ "not": {
200
+ "ref": "context.dryRun"
201
+ }
202
+ },
203
+ "paths": {
204
+ "list": [
205
+ {
206
+ "artifact": {
207
+ "kind": "task-summary-file",
208
+ "taskKey": {
209
+ "ref": "params.taskKey"
210
+ }
211
+ }
212
+ }
213
+ ]
214
+ },
215
+ "message": "Claude summary did not produce the task summary artifact."
216
+ },
217
+ {
218
+ "kind": "require-structured-artifacts",
219
+ "when": {
220
+ "not": {
221
+ "ref": "context.dryRun"
222
+ }
223
+ },
224
+ "items": [
225
+ {
226
+ "path": {
227
+ "artifact": {
228
+ "kind": "task-summary-json-file",
229
+ "taskKey": {
230
+ "ref": "params.taskKey"
231
+ }
232
+ }
233
+ },
234
+ "schemaId": "task-summary/v1"
235
+ }
236
+ ],
237
+ "message": "Claude summary produced invalid structured artifacts."
238
+ }
239
+ ],
240
+ "after": [
241
+ {
242
+ "kind": "set-summary-from-file",
243
+ "when": {
244
+ "not": {
245
+ "ref": "context.dryRun"
246
+ }
247
+ },
248
+ "path": {
249
+ "artifact": {
250
+ "kind": "task-summary-file",
251
+ "taskKey": {
252
+ "ref": "params.taskKey"
253
+ }
254
+ }
255
+ }
256
+ }
257
+ ]
258
+ },
259
+ {
260
+ "id": "generate_planning_questions",
261
+ "node": "opencode-prompt",
262
+ "prompt": {
263
+ "templateRef": "plan-questions",
264
+ "vars": {
265
+ "jira_task_file": {
266
+ "artifact": {
267
+ "kind": "jira-task-file",
268
+ "taskKey": {
269
+ "ref": "params.taskKey"
270
+ }
271
+ }
272
+ },
273
+ "jira_attachments_manifest_file": {
274
+ "artifact": {
275
+ "kind": "jira-attachments-manifest-file",
276
+ "taskKey": {
277
+ "ref": "params.taskKey"
278
+ }
279
+ }
280
+ },
281
+ "jira_attachments_context_file": {
282
+ "artifact": {
283
+ "kind": "jira-attachments-context-file",
284
+ "taskKey": {
285
+ "ref": "params.taskKey"
286
+ }
287
+ }
288
+ },
289
+ "planning_questions_json_file": {
290
+ "artifact": {
291
+ "kind": "planning-questions-json-file",
292
+ "taskKey": {
293
+ "ref": "params.taskKey"
294
+ }
295
+ }
296
+ }
297
+ },
298
+ "extraPrompt": {
299
+ "ref": "params.extraPrompt"
300
+ },
301
+ "format": "task-prompt"
302
+ },
303
+ "params": {
304
+ "labelText": {
305
+ "const": "Generating planning questions"
306
+ },
307
+ "model": {
308
+ "const": "minimax-coding-plan/MiniMax-M2.7"
309
+ },
310
+ "requiredArtifacts": {
311
+ "list": [
312
+ {
313
+ "artifact": {
314
+ "kind": "planning-questions-json-file",
315
+ "taskKey": {
316
+ "ref": "params.taskKey"
317
+ }
318
+ }
319
+ }
320
+ ]
321
+ }
322
+ },
323
+ "expect": [
324
+ {
325
+ "kind": "require-artifacts",
326
+ "when": {
327
+ "not": {
328
+ "ref": "context.dryRun"
329
+ }
330
+ },
331
+ "paths": {
332
+ "list": [
333
+ {
334
+ "artifact": {
335
+ "kind": "planning-questions-json-file",
336
+ "taskKey": {
337
+ "ref": "params.taskKey"
338
+ }
339
+ }
340
+ }
341
+ ]
342
+ },
343
+ "message": "Planning questions step did not produce the questions artifact."
344
+ },
345
+ {
346
+ "kind": "require-structured-artifacts",
347
+ "when": {
348
+ "not": {
349
+ "ref": "context.dryRun"
350
+ }
351
+ },
352
+ "items": [
353
+ {
354
+ "path": {
355
+ "artifact": {
356
+ "kind": "planning-questions-json-file",
357
+ "taskKey": {
358
+ "ref": "params.taskKey"
359
+ }
360
+ }
361
+ },
362
+ "schemaId": "planning-questions/v1"
363
+ }
364
+ ],
365
+ "message": "Planning questions step produced invalid structured artifacts."
366
+ }
367
+ ]
368
+ },
369
+ {
370
+ "id": "build_planning_questions_form",
371
+ "node": "planning-questions-form",
372
+ "params": {
373
+ "planningQuestionsJsonFile": {
374
+ "artifact": {
375
+ "kind": "planning-questions-json-file",
376
+ "taskKey": {
377
+ "ref": "params.taskKey"
378
+ }
379
+ }
380
+ },
381
+ "formId": {
382
+ "const": "planning-questions"
383
+ },
384
+ "title": {
385
+ "const": "Planning Questions"
386
+ },
387
+ "description": {
388
+ "const": "Ответьте на вопросы модели, если они нужны для точного design/plan. Если вопросов нет, шаг завершится автоматически."
389
+ }
390
+ }
391
+ },
392
+ {
393
+ "id": "collect_planning_answers",
394
+ "node": "user-input",
395
+ "params": {
396
+ "formId": {
397
+ "ref": "steps.plan.build_planning_questions_form.value.formId"
398
+ },
399
+ "title": {
400
+ "ref": "steps.plan.build_planning_questions_form.value.title"
401
+ },
402
+ "description": {
403
+ "ref": "steps.plan.build_planning_questions_form.value.description"
404
+ },
405
+ "submitLabel": {
406
+ "const": "Continue planning"
407
+ },
408
+ "fields": {
409
+ "ref": "steps.plan.build_planning_questions_form.value.fields"
410
+ },
411
+ "outputFile": {
412
+ "artifact": {
413
+ "kind": "planning-answers-json-file",
414
+ "taskKey": {
415
+ "ref": "params.taskKey"
416
+ }
417
+ }
418
+ }
419
+ },
420
+ "expect": [
421
+ {
422
+ "kind": "require-structured-artifacts",
423
+ "items": [
424
+ {
425
+ "path": {
426
+ "artifact": {
427
+ "kind": "planning-answers-json-file",
428
+ "taskKey": {
429
+ "ref": "params.taskKey"
430
+ }
431
+ }
432
+ },
433
+ "schemaId": "user-input/v1"
434
+ }
435
+ ],
436
+ "message": "Planning answers input is missing or invalid."
437
+ }
438
+ ]
439
+ },
440
+ {
441
+ "id": "run_plan",
442
+ "node": "opencode-prompt",
443
+ "prompt": {
444
+ "templateRef": "plan",
445
+ "vars": {
446
+ "jira_task_file": {
447
+ "artifact": {
448
+ "kind": "jira-task-file",
449
+ "taskKey": {
450
+ "ref": "params.taskKey"
451
+ }
452
+ }
453
+ },
454
+ "jira_attachments_manifest_file": {
455
+ "artifact": {
456
+ "kind": "jira-attachments-manifest-file",
457
+ "taskKey": {
458
+ "ref": "params.taskKey"
459
+ }
460
+ }
461
+ },
462
+ "jira_attachments_context_file": {
463
+ "artifact": {
464
+ "kind": "jira-attachments-context-file",
465
+ "taskKey": {
466
+ "ref": "params.taskKey"
467
+ }
468
+ }
469
+ },
470
+ "design_file": {
471
+ "artifact": {
472
+ "kind": "design-file",
473
+ "taskKey": {
474
+ "ref": "params.taskKey"
475
+ }
476
+ }
477
+ },
478
+ "design_json_file": {
479
+ "artifact": {
480
+ "kind": "design-json-file",
481
+ "taskKey": {
482
+ "ref": "params.taskKey"
483
+ }
484
+ }
485
+ },
486
+ "plan_file": {
487
+ "artifact": {
488
+ "kind": "plan-file",
489
+ "taskKey": {
490
+ "ref": "params.taskKey"
491
+ }
492
+ }
493
+ },
494
+ "plan_json_file": {
495
+ "artifact": {
496
+ "kind": "plan-json-file",
497
+ "taskKey": {
498
+ "ref": "params.taskKey"
499
+ }
500
+ }
501
+ },
502
+ "qa_file": {
503
+ "artifact": {
504
+ "kind": "qa-file",
505
+ "taskKey": {
506
+ "ref": "params.taskKey"
507
+ }
508
+ }
509
+ },
510
+ "qa_json_file": {
511
+ "artifact": {
512
+ "kind": "qa-json-file",
513
+ "taskKey": {
514
+ "ref": "params.taskKey"
515
+ }
516
+ }
517
+ }
518
+ },
519
+ "extraPrompt": {
520
+ "appendPrompt": {
521
+ "base": {
522
+ "ref": "params.extraPrompt"
523
+ },
524
+ "suffix": {
525
+ "ref": "steps.plan.collect_planning_answers.value.promptSuffix"
526
+ }
527
+ }
528
+ },
529
+ "format": "task-prompt"
530
+ },
531
+ "params": {
532
+ "labelText": {
533
+ "const": "Running OpenCode planning mode"
534
+ },
535
+ "model": {
536
+ "const": "minimax-coding-plan/MiniMax-M2.7"
537
+ }
538
+ },
539
+ "expect": [
540
+ {
541
+ "kind": "require-artifacts",
542
+ "when": {
543
+ "not": {
544
+ "ref": "context.dryRun"
545
+ }
546
+ },
547
+ "paths": {
548
+ "artifactList": {
549
+ "kind": "plan-artifacts",
550
+ "taskKey": {
551
+ "ref": "params.taskKey"
552
+ }
553
+ }
554
+ },
555
+ "message": "Plan mode did not produce the required artifacts."
556
+ },
557
+ {
558
+ "kind": "require-structured-artifacts",
559
+ "when": {
560
+ "not": {
561
+ "ref": "context.dryRun"
562
+ }
563
+ },
564
+ "items": [
565
+ {
566
+ "path": {
567
+ "artifact": {
568
+ "kind": "design-json-file",
569
+ "taskKey": {
570
+ "ref": "params.taskKey"
571
+ }
572
+ }
573
+ },
574
+ "schemaId": "implementation-design/v1"
575
+ },
576
+ {
577
+ "path": {
578
+ "artifact": {
579
+ "kind": "plan-json-file",
580
+ "taskKey": {
581
+ "ref": "params.taskKey"
582
+ }
583
+ }
584
+ },
585
+ "schemaId": "implementation-plan/v1"
586
+ },
587
+ {
588
+ "path": {
589
+ "artifact": {
590
+ "kind": "qa-json-file",
591
+ "taskKey": {
592
+ "ref": "params.taskKey"
593
+ }
594
+ }
595
+ },
596
+ "schemaId": "qa-plan/v1"
597
+ }
598
+ ],
599
+ "message": "Plan mode produced invalid structured artifacts."
600
+ }
601
+ ]
602
+ }
603
+ ]
604
+ },
605
+ {
606
+ "id": "implement",
607
+ "steps": [
608
+ {
609
+ "id": "run_implement",
610
+ "node": "opencode-prompt",
611
+ "prompt": {
612
+ "templateRef": "implement",
613
+ "vars": {
614
+ "design_file": {
615
+ "artifact": {
616
+ "kind": "design-file",
617
+ "taskKey": {
618
+ "ref": "params.taskKey"
619
+ }
620
+ }
621
+ },
622
+ "design_json_file": {
623
+ "artifact": {
624
+ "kind": "design-json-file",
625
+ "taskKey": {
626
+ "ref": "params.taskKey"
627
+ }
628
+ }
629
+ },
630
+ "plan_file": {
631
+ "artifact": {
632
+ "kind": "plan-file",
633
+ "taskKey": {
634
+ "ref": "params.taskKey"
635
+ }
636
+ }
637
+ },
638
+ "plan_json_file": {
639
+ "artifact": {
640
+ "kind": "plan-json-file",
641
+ "taskKey": {
642
+ "ref": "params.taskKey"
643
+ }
644
+ }
645
+ }
646
+ },
647
+ "extraPrompt": {
648
+ "ref": "params.extraPrompt"
649
+ },
650
+ "format": "task-prompt"
651
+ },
652
+ "params": {
653
+ "labelText": {
654
+ "const": "Running OpenCode implementation mode locally"
655
+ },
656
+ "model": {
657
+ "const": "minimax-coding-plan/MiniMax-M2.7"
658
+ }
659
+ }
660
+ }
661
+ ]
662
+ },
663
+ {
664
+ "id": "run_go_linter_loop_after_implement",
665
+ "steps": [
666
+ {
667
+ "id": "run_go_linter_loop",
668
+ "node": "flow-run",
669
+ "params": {
670
+ "fileName": {
671
+ "const": "run-go-linter-loop-opencode.json"
672
+ },
673
+ "labelText": {
674
+ "const": "Running run-go-linter-loop after implement"
675
+ },
676
+ "taskKey": {
677
+ "ref": "params.taskKey"
678
+ },
679
+ "runGoLinterScript": {
680
+ "ref": "params.runGoLinterScript"
681
+ },
682
+ "extraPrompt": {
683
+ "ref": "params.extraPrompt"
684
+ }
685
+ }
686
+ }
687
+ ]
688
+ },
689
+ {
690
+ "id": "run_go_tests_loop_after_implement",
691
+ "steps": [
692
+ {
693
+ "id": "run_go_tests_loop",
694
+ "node": "flow-run",
695
+ "params": {
696
+ "fileName": {
697
+ "const": "run-go-tests-loop-opencode.json"
698
+ },
699
+ "labelText": {
700
+ "const": "Running run-go-tests-loop after implement"
701
+ },
702
+ "taskKey": {
703
+ "ref": "params.taskKey"
704
+ },
705
+ "runGoTestsScript": {
706
+ "ref": "params.runGoTestsScript"
707
+ },
708
+ "extraPrompt": {
709
+ "ref": "params.extraPrompt"
710
+ }
711
+ }
712
+ }
713
+ ]
714
+ },
715
+ {
716
+ "id": "review",
717
+ "when": {
718
+ "not": {
719
+ "exists": {
720
+ "artifact": {
721
+ "kind": "ready-to-merge-file",
722
+ "taskKey": {
723
+ "ref": "params.taskKey"
724
+ }
725
+ }
726
+ }
727
+ }
728
+ },
729
+ "steps": [
730
+ {
731
+ "id": "run_review",
732
+ "node": "opencode-prompt",
733
+ "prompt": {
734
+ "templateRef": "review",
735
+ "vars": {
736
+ "jira_task_file": {
737
+ "artifact": {
738
+ "kind": "jira-task-file",
739
+ "taskKey": {
740
+ "ref": "params.taskKey"
741
+ }
742
+ }
743
+ },
744
+ "design_file": {
745
+ "artifact": {
746
+ "kind": "design-file",
747
+ "taskKey": {
748
+ "ref": "params.taskKey"
749
+ }
750
+ }
751
+ },
752
+ "design_json_file": {
753
+ "artifact": {
754
+ "kind": "design-json-file",
755
+ "taskKey": {
756
+ "ref": "params.taskKey"
757
+ }
758
+ }
759
+ },
760
+ "plan_file": {
761
+ "artifact": {
762
+ "kind": "plan-file",
763
+ "taskKey": {
764
+ "ref": "params.taskKey"
765
+ }
766
+ }
767
+ },
768
+ "plan_json_file": {
769
+ "artifact": {
770
+ "kind": "plan-json-file",
771
+ "taskKey": {
772
+ "ref": "params.taskKey"
773
+ }
774
+ }
775
+ },
776
+ "review_file": {
777
+ "artifact": {
778
+ "kind": "review-file",
779
+ "taskKey": {
780
+ "ref": "params.taskKey"
781
+ },
782
+ "iteration": {
783
+ "const": 1
784
+ }
785
+ }
786
+ },
787
+ "review_json_file": {
788
+ "artifact": {
789
+ "kind": "review-json-file",
790
+ "taskKey": {
791
+ "ref": "params.taskKey"
792
+ },
793
+ "iteration": {
794
+ "const": 1
795
+ }
796
+ }
797
+ }
798
+ },
799
+ "extraPrompt": {
800
+ "ref": "params.extraPrompt"
801
+ },
802
+ "format": "task-prompt"
803
+ },
804
+ "params": {
805
+ "labelText": {
806
+ "const": "Running OpenCode review mode"
807
+ },
808
+ "model": {
809
+ "const": "minimax-coding-plan/MiniMax-M2.7"
810
+ }
811
+ },
812
+ "expect": [
813
+ {
814
+ "kind": "require-artifacts",
815
+ "when": {
816
+ "not": {
817
+ "ref": "context.dryRun"
818
+ }
819
+ },
820
+ "paths": {
821
+ "list": [
822
+ {
823
+ "artifact": {
824
+ "kind": "review-file",
825
+ "taskKey": {
826
+ "ref": "params.taskKey"
827
+ },
828
+ "iteration": {
829
+ "const": 1
830
+ }
831
+ }
832
+ }
833
+ ]
834
+ },
835
+ "message": "Review did not produce the required review artifact."
836
+ },
837
+ {
838
+ "kind": "require-structured-artifacts",
839
+ "when": {
840
+ "not": {
841
+ "ref": "context.dryRun"
842
+ }
843
+ },
844
+ "items": [
845
+ {
846
+ "path": {
847
+ "artifact": {
848
+ "kind": "review-json-file",
849
+ "taskKey": {
850
+ "ref": "params.taskKey"
851
+ },
852
+ "iteration": {
853
+ "const": 1
854
+ }
855
+ }
856
+ },
857
+ "schemaId": "review-findings/v1"
858
+ }
859
+ ],
860
+ "message": "Claude review produced invalid structured artifacts."
861
+ }
862
+ ]
863
+ },
864
+ {
865
+ "id": "summarize_review",
866
+ "when": {
867
+ "not": {
868
+ "ref": "context.dryRun"
869
+ }
870
+ },
871
+ "node": "opencode-prompt",
872
+ "prompt": {
873
+ "templateRef": "review-summary",
874
+ "vars": {
875
+ "review_file": {
876
+ "artifact": {
877
+ "kind": "review-file",
878
+ "taskKey": {
879
+ "ref": "params.taskKey"
880
+ },
881
+ "iteration": {
882
+ "const": 1
883
+ }
884
+ }
885
+ },
886
+ "review_summary_file": {
887
+ "artifact": {
888
+ "kind": "review-summary-file",
889
+ "taskKey": {
890
+ "ref": "params.taskKey"
891
+ },
892
+ "iteration": {
893
+ "const": 1
894
+ }
895
+ }
896
+ }
897
+ },
898
+ "format": "plain"
899
+ },
900
+ "params": {
901
+ "labelText": {
902
+ "const": "Preparing OpenCode review summary"
903
+ },
904
+ "outputFile": {
905
+ "artifact": {
906
+ "kind": "review-summary-file",
907
+ "taskKey": {
908
+ "ref": "params.taskKey"
909
+ },
910
+ "iteration": {
911
+ "const": 1
912
+ }
913
+ }
914
+ },
915
+ "summaryTitle": {
916
+ "const": "OpenCode Comments"
917
+ },
918
+ "model": {
919
+ "const": "minimax-coding-plan/MiniMax-M2.7"
920
+ }
921
+ }
922
+ },
923
+ {
924
+ "id": "run_review_reply",
925
+ "node": "opencode-prompt",
926
+ "prompt": {
927
+ "templateRef": "review-reply",
928
+ "vars": {
929
+ "review_file": {
930
+ "artifact": {
931
+ "kind": "review-file",
932
+ "taskKey": {
933
+ "ref": "params.taskKey"
934
+ },
935
+ "iteration": {
936
+ "const": 1
937
+ }
938
+ }
939
+ },
940
+ "review_json_file": {
941
+ "artifact": {
942
+ "kind": "review-json-file",
943
+ "taskKey": {
944
+ "ref": "params.taskKey"
945
+ },
946
+ "iteration": {
947
+ "const": 1
948
+ }
949
+ }
950
+ },
951
+ "jira_task_file": {
952
+ "artifact": {
953
+ "kind": "jira-task-file",
954
+ "taskKey": {
955
+ "ref": "params.taskKey"
956
+ }
957
+ }
958
+ },
959
+ "design_file": {
960
+ "artifact": {
961
+ "kind": "design-file",
962
+ "taskKey": {
963
+ "ref": "params.taskKey"
964
+ }
965
+ }
966
+ },
967
+ "design_json_file": {
968
+ "artifact": {
969
+ "kind": "design-json-file",
970
+ "taskKey": {
971
+ "ref": "params.taskKey"
972
+ }
973
+ }
974
+ },
975
+ "plan_file": {
976
+ "artifact": {
977
+ "kind": "plan-file",
978
+ "taskKey": {
979
+ "ref": "params.taskKey"
980
+ }
981
+ }
982
+ },
983
+ "plan_json_file": {
984
+ "artifact": {
985
+ "kind": "plan-json-file",
986
+ "taskKey": {
987
+ "ref": "params.taskKey"
988
+ }
989
+ }
990
+ },
991
+ "review_reply_file": {
992
+ "artifact": {
993
+ "kind": "review-reply-file",
994
+ "taskKey": {
995
+ "ref": "params.taskKey"
996
+ },
997
+ "iteration": {
998
+ "const": 1
999
+ }
1000
+ }
1001
+ },
1002
+ "review_reply_json_file": {
1003
+ "artifact": {
1004
+ "kind": "review-reply-json-file",
1005
+ "taskKey": {
1006
+ "ref": "params.taskKey"
1007
+ },
1008
+ "iteration": {
1009
+ "const": 1
1010
+ }
1011
+ }
1012
+ }
1013
+ },
1014
+ "extraPrompt": {
1015
+ "ref": "params.extraPrompt"
1016
+ },
1017
+ "format": "task-prompt"
1018
+ },
1019
+ "params": {
1020
+ "labelText": {
1021
+ "const": "Running OpenCode review reply mode"
1022
+ },
1023
+ "model": {
1024
+ "const": "minimax-coding-plan/MiniMax-M2.7"
1025
+ }
1026
+ },
1027
+ "expect": [
1028
+ {
1029
+ "kind": "require-artifacts",
1030
+ "when": {
1031
+ "not": {
1032
+ "ref": "context.dryRun"
1033
+ }
1034
+ },
1035
+ "paths": {
1036
+ "list": [
1037
+ {
1038
+ "artifact": {
1039
+ "kind": "review-reply-file",
1040
+ "taskKey": {
1041
+ "ref": "params.taskKey"
1042
+ },
1043
+ "iteration": {
1044
+ "const": 1
1045
+ }
1046
+ }
1047
+ }
1048
+ ]
1049
+ },
1050
+ "message": "Review reply did not produce the required review-reply artifact."
1051
+ },
1052
+ {
1053
+ "kind": "require-structured-artifacts",
1054
+ "when": {
1055
+ "not": {
1056
+ "ref": "context.dryRun"
1057
+ }
1058
+ },
1059
+ "items": [
1060
+ {
1061
+ "path": {
1062
+ "artifact": {
1063
+ "kind": "review-reply-json-file",
1064
+ "taskKey": {
1065
+ "ref": "params.taskKey"
1066
+ },
1067
+ "iteration": {
1068
+ "const": 1
1069
+ }
1070
+ }
1071
+ },
1072
+ "schemaId": "review-reply/v1"
1073
+ }
1074
+ ],
1075
+ "message": "Codex review reply produced invalid structured artifacts."
1076
+ }
1077
+ ]
1078
+ },
1079
+ {
1080
+ "id": "summarize_review_reply",
1081
+ "when": {
1082
+ "not": {
1083
+ "ref": "context.dryRun"
1084
+ }
1085
+ },
1086
+ "node": "opencode-prompt",
1087
+ "prompt": {
1088
+ "templateRef": "review-reply-summary",
1089
+ "vars": {
1090
+ "review_reply_file": {
1091
+ "artifact": {
1092
+ "kind": "review-reply-file",
1093
+ "taskKey": {
1094
+ "ref": "params.taskKey"
1095
+ },
1096
+ "iteration": {
1097
+ "const": 1
1098
+ }
1099
+ }
1100
+ },
1101
+ "review_reply_summary_file": {
1102
+ "artifact": {
1103
+ "kind": "review-reply-summary-file",
1104
+ "taskKey": {
1105
+ "ref": "params.taskKey"
1106
+ },
1107
+ "iteration": {
1108
+ "const": 1
1109
+ }
1110
+ }
1111
+ }
1112
+ },
1113
+ "format": "plain"
1114
+ },
1115
+ "params": {
1116
+ "labelText": {
1117
+ "const": "Preparing OpenCode reply summary"
1118
+ },
1119
+ "outputFile": {
1120
+ "artifact": {
1121
+ "kind": "review-reply-summary-file",
1122
+ "taskKey": {
1123
+ "ref": "params.taskKey"
1124
+ },
1125
+ "iteration": {
1126
+ "const": 1
1127
+ }
1128
+ }
1129
+ },
1130
+ "summaryTitle": {
1131
+ "const": "OpenCode Reply Summary"
1132
+ },
1133
+ "model": {
1134
+ "const": "minimax-coding-plan/MiniMax-M2.7"
1135
+ }
1136
+ }
1137
+ },
1138
+ {
1139
+ "id": "check_ready_to_merge",
1140
+ "node": "file-check",
1141
+ "stopFlowIf": {
1142
+ "ref": "steps.review.check_ready_to_merge.outputs.exists"
1143
+ },
1144
+ "params": {
1145
+ "path": {
1146
+ "artifact": {
1147
+ "kind": "ready-to-merge-file",
1148
+ "taskKey": {
1149
+ "ref": "params.taskKey"
1150
+ }
1151
+ }
1152
+ },
1153
+ "panelTitle": {
1154
+ "const": "Ready To Merge"
1155
+ },
1156
+ "foundMessage": {
1157
+ "const": "Изменения готовы к merge\nФайл ready-to-merge.md создан."
1158
+ },
1159
+ "tone": {
1160
+ "const": "green"
1161
+ }
1162
+ }
1163
+ }
1164
+ ]
1165
+ },
1166
+ {
1167
+ "id": "review_fix",
1168
+ "when": {
1169
+ "not": {
1170
+ "ref": "steps.review.check_ready_to_merge.outputs.exists"
1171
+ }
1172
+ },
1173
+ "steps": [
1174
+ {
1175
+ "id": "run_review_fix",
1176
+ "node": "opencode-prompt",
1177
+ "prompt": {
1178
+ "templateRef": "review-fix",
1179
+ "vars": {
1180
+ "review_reply_file": {
1181
+ "artifact": {
1182
+ "kind": "review-reply-file",
1183
+ "taskKey": {
1184
+ "ref": "params.taskKey"
1185
+ },
1186
+ "iteration": {
1187
+ "const": 1
1188
+ }
1189
+ }
1190
+ },
1191
+ "review_reply_json_file": {
1192
+ "artifact": {
1193
+ "kind": "review-reply-json-file",
1194
+ "taskKey": {
1195
+ "ref": "params.taskKey"
1196
+ },
1197
+ "iteration": {
1198
+ "const": 1
1199
+ }
1200
+ }
1201
+ },
1202
+ "items": {
1203
+ "ref": "params.reviewFixPoints"
1204
+ },
1205
+ "review_fix_file": {
1206
+ "artifact": {
1207
+ "kind": "review-fix-file",
1208
+ "taskKey": {
1209
+ "ref": "params.taskKey"
1210
+ },
1211
+ "iteration": {
1212
+ "const": 1
1213
+ }
1214
+ }
1215
+ },
1216
+ "review_fix_json_file": {
1217
+ "artifact": {
1218
+ "kind": "review-fix-json-file",
1219
+ "taskKey": {
1220
+ "ref": "params.taskKey"
1221
+ },
1222
+ "iteration": {
1223
+ "const": 1
1224
+ }
1225
+ }
1226
+ }
1227
+ },
1228
+ "extraPrompt": {
1229
+ "appendPrompt": {
1230
+ "base": {
1231
+ "ref": "params.extraPrompt"
1232
+ },
1233
+ "suffix": {
1234
+ "ref": "flow.autoReviewFixExtraPrompt"
1235
+ }
1236
+ }
1237
+ },
1238
+ "format": "task-prompt"
1239
+ },
1240
+ "params": {
1241
+ "labelText": {
1242
+ "const": "Running OpenCode review-fix mode locally"
1243
+ },
1244
+ "model": {
1245
+ "const": "minimax-coding-plan/MiniMax-M2.7"
1246
+ }
1247
+ },
1248
+ "expect": [
1249
+ {
1250
+ "kind": "require-artifacts",
1251
+ "when": {
1252
+ "not": {
1253
+ "ref": "context.dryRun"
1254
+ }
1255
+ },
1256
+ "paths": {
1257
+ "list": [
1258
+ {
1259
+ "artifact": {
1260
+ "kind": "review-fix-file",
1261
+ "taskKey": {
1262
+ "ref": "params.taskKey"
1263
+ },
1264
+ "iteration": {
1265
+ "const": 1
1266
+ }
1267
+ }
1268
+ }
1269
+ ]
1270
+ },
1271
+ "message": "Review-fix mode did not produce the required review-fix artifact."
1272
+ },
1273
+ {
1274
+ "kind": "require-structured-artifacts",
1275
+ "when": {
1276
+ "not": {
1277
+ "ref": "context.dryRun"
1278
+ }
1279
+ },
1280
+ "items": [
1281
+ {
1282
+ "path": {
1283
+ "artifact": {
1284
+ "kind": "review-fix-json-file",
1285
+ "taskKey": {
1286
+ "ref": "params.taskKey"
1287
+ },
1288
+ "iteration": {
1289
+ "const": 1
1290
+ }
1291
+ }
1292
+ },
1293
+ "schemaId": "review-fix-report/v1"
1294
+ }
1295
+ ],
1296
+ "message": "Review-fix mode produced invalid structured artifacts."
1297
+ }
1298
+ ]
1299
+ }
1300
+ ]
1301
+ },
1302
+ {
1303
+ "id": "run_go_linter_loop_after_review_fix",
1304
+ "when": {
1305
+ "not": {
1306
+ "ref": "steps.review.check_ready_to_merge.outputs.exists"
1307
+ }
1308
+ },
1309
+ "steps": [
1310
+ {
1311
+ "id": "run_go_linter_loop",
1312
+ "node": "flow-run",
1313
+ "params": {
1314
+ "fileName": {
1315
+ "const": "run-go-linter-loop-opencode.json"
1316
+ },
1317
+ "labelText": {
1318
+ "const": "Running run-go-linter-loop after review-fix"
1319
+ },
1320
+ "taskKey": {
1321
+ "ref": "params.taskKey"
1322
+ },
1323
+ "runGoLinterScript": {
1324
+ "ref": "params.runGoLinterScript"
1325
+ },
1326
+ "extraPrompt": {
1327
+ "ref": "params.extraPrompt"
1328
+ }
1329
+ }
1330
+ }
1331
+ ]
1332
+ },
1333
+ {
1334
+ "id": "run_go_tests_loop_after_review_fix",
1335
+ "when": {
1336
+ "not": {
1337
+ "ref": "steps.review.check_ready_to_merge.outputs.exists"
1338
+ }
1339
+ },
1340
+ "steps": [
1341
+ {
1342
+ "id": "run_go_tests_loop",
1343
+ "node": "flow-run",
1344
+ "params": {
1345
+ "fileName": {
1346
+ "const": "run-go-tests-loop-opencode.json"
1347
+ },
1348
+ "labelText": {
1349
+ "const": "Running run-go-tests-loop after review-fix"
1350
+ },
1351
+ "taskKey": {
1352
+ "ref": "params.taskKey"
1353
+ },
1354
+ "runGoTestsScript": {
1355
+ "ref": "params.runGoTestsScript"
1356
+ },
1357
+ "extraPrompt": {
1358
+ "ref": "params.extraPrompt"
1359
+ }
1360
+ }
1361
+ }
1362
+ ]
1363
+ }
1364
+ ]
1365
+ }