agentweaver 0.1.10 → 0.1.12

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 (110) hide show
  1. package/README.md +218 -224
  2. package/dist/artifacts.js +109 -55
  3. package/dist/executors/{codex-local-executor.js → codex-executor.js} +6 -5
  4. package/dist/executors/configs/{codex-local-config.js → codex-config.js} +1 -1
  5. package/dist/executors/configs/jira-fetch-config.js +2 -0
  6. package/dist/executors/configs/telegram-notifier-config.js +3 -0
  7. package/dist/executors/fetch-gitlab-diff-executor.js +1 -1
  8. package/dist/executors/fetch-gitlab-review-executor.js +1 -1
  9. package/dist/executors/git-commit-executor.js +25 -0
  10. package/dist/executors/jira-fetch-executor.js +1 -0
  11. package/dist/executors/opencode-executor.js +22 -11
  12. package/dist/executors/process-executor.js +3 -0
  13. package/dist/executors/telegram-notifier-executor.js +54 -0
  14. package/dist/flow-state.js +46 -1
  15. package/dist/gitlab.js +13 -8
  16. package/dist/index.js +477 -514
  17. package/dist/interactive-ui.js +609 -88
  18. package/dist/jira.js +109 -5
  19. package/dist/pipeline/auto-flow.js +6 -6
  20. package/dist/pipeline/context.js +1 -0
  21. package/dist/pipeline/flow-catalog.js +34 -4
  22. package/dist/pipeline/flow-model-settings.js +77 -0
  23. package/dist/pipeline/flow-specs/auto-common.json +446 -0
  24. package/dist/pipeline/flow-specs/auto-golang.json +563 -0
  25. package/dist/pipeline/flow-specs/{bug-analyze.json → bugz/bug-analyze.json} +43 -25
  26. package/dist/pipeline/flow-specs/{bug-fix.json → bugz/bug-fix.json} +5 -4
  27. package/dist/pipeline/flow-specs/git-commit.json +196 -0
  28. package/dist/pipeline/flow-specs/{gitlab-diff-review.json → gitlab/gitlab-diff-review.json} +20 -50
  29. package/dist/pipeline/flow-specs/{gitlab-review.json → gitlab/gitlab-review.json} +65 -133
  30. package/dist/pipeline/flow-specs/{mr-description.json → gitlab/mr-description.json} +17 -10
  31. package/dist/pipeline/flow-specs/{run-go-linter-loop.json → go/run-go-linter-loop.json} +40 -14
  32. package/dist/pipeline/flow-specs/{run-go-tests-loop.json → go/run-go-tests-loop.json} +40 -14
  33. package/dist/pipeline/flow-specs/implement.json +5 -4
  34. package/dist/pipeline/flow-specs/plan.json +40 -148
  35. package/dist/pipeline/flow-specs/{review-fix.json → review/review-fix.json} +74 -13
  36. package/dist/pipeline/flow-specs/review/review-loop.json +282 -0
  37. package/dist/pipeline/flow-specs/review/review-project.json +87 -0
  38. package/dist/pipeline/flow-specs/review/review.json +126 -0
  39. package/dist/pipeline/flow-specs/task-describe.json +252 -11
  40. package/dist/pipeline/launch-profile-config.js +38 -0
  41. package/dist/pipeline/node-registry.js +75 -45
  42. package/dist/pipeline/nodes/build-failure-summary-node.js +16 -29
  43. package/dist/pipeline/nodes/build-review-fix-prompt-node.js +36 -0
  44. package/dist/pipeline/nodes/codex-prompt-node.js +41 -0
  45. package/dist/pipeline/nodes/commit-message-form-node.js +79 -0
  46. package/dist/pipeline/nodes/git-commit-form-node.js +138 -0
  47. package/dist/pipeline/nodes/git-commit-node.js +28 -0
  48. package/dist/pipeline/nodes/git-status-node.js +221 -0
  49. package/dist/pipeline/nodes/gitlab-review-artifacts-node.js +10 -6
  50. package/dist/pipeline/nodes/jira-context-node.js +10 -0
  51. package/dist/pipeline/nodes/jira-fetch-node.js +3 -0
  52. package/dist/pipeline/nodes/llm-prompt-node.js +62 -0
  53. package/dist/pipeline/nodes/plan-codex-node.js +1 -1
  54. package/dist/pipeline/nodes/read-file-node.js +11 -0
  55. package/dist/pipeline/nodes/review-findings-form-node.js +48 -14
  56. package/dist/pipeline/nodes/select-files-form-node.js +72 -0
  57. package/dist/pipeline/nodes/telegram-notifier-node.js +28 -0
  58. package/dist/pipeline/nodes/user-input-node.js +43 -8
  59. package/dist/pipeline/nodes/write-selection-file-node.js +46 -0
  60. package/dist/pipeline/prompt-registry.js +3 -4
  61. package/dist/pipeline/prompt-runtime.js +13 -3
  62. package/dist/pipeline/registry.js +6 -8
  63. package/dist/pipeline/spec-compiler.js +5 -0
  64. package/dist/pipeline/spec-types.js +9 -3
  65. package/dist/pipeline/spec-validator.js +4 -0
  66. package/dist/pipeline/types.js +1 -0
  67. package/dist/pipeline/value-resolver.js +50 -38
  68. package/dist/prompts.js +119 -110
  69. package/dist/runtime/agentweaver-home.js +8 -0
  70. package/dist/runtime/command-resolution.js +0 -38
  71. package/dist/runtime/env-loader.js +43 -0
  72. package/dist/runtime/process-runner.js +9 -3
  73. package/dist/structured-artifact-schema-registry.js +54 -0
  74. package/dist/structured-artifact-schemas.json +22 -20
  75. package/dist/structured-artifacts.js +3 -43
  76. package/dist/user-input.js +38 -3
  77. package/package.json +2 -6
  78. package/Dockerfile.codex +0 -56
  79. package/dist/executors/claude-executor.js +0 -46
  80. package/dist/executors/codex-docker-executor.js +0 -27
  81. package/dist/executors/configs/claude-config.js +0 -12
  82. package/dist/executors/configs/codex-docker-config.js +0 -10
  83. package/dist/executors/configs/verify-build-config.js +0 -7
  84. package/dist/executors/verify-build-executor.js +0 -123
  85. package/dist/pipeline/flow-specs/auto.json +0 -979
  86. package/dist/pipeline/flow-specs/opencode/auto-opencode.json +0 -1365
  87. package/dist/pipeline/flow-specs/opencode/bugz/bug-analyze-opencode.json +0 -382
  88. package/dist/pipeline/flow-specs/opencode/bugz/bug-fix-opencode.json +0 -56
  89. package/dist/pipeline/flow-specs/opencode/gitlab/gitlab-diff-review-opencode.json +0 -308
  90. package/dist/pipeline/flow-specs/opencode/gitlab/gitlab-review-opencode.json +0 -437
  91. package/dist/pipeline/flow-specs/opencode/gitlab/mr-description-opencode.json +0 -117
  92. package/dist/pipeline/flow-specs/opencode/go/run-go-linter-loop-opencode.json +0 -321
  93. package/dist/pipeline/flow-specs/opencode/go/run-go-tests-loop-opencode.json +0 -321
  94. package/dist/pipeline/flow-specs/opencode/implement-opencode.json +0 -64
  95. package/dist/pipeline/flow-specs/opencode/plan-opencode.json +0 -603
  96. package/dist/pipeline/flow-specs/opencode/review/review-fix-opencode.json +0 -209
  97. package/dist/pipeline/flow-specs/opencode/review/review-opencode.json +0 -452
  98. package/dist/pipeline/flow-specs/opencode/task-describe-opencode.json +0 -148
  99. package/dist/pipeline/flow-specs/review-project.json +0 -243
  100. package/dist/pipeline/flow-specs/review.json +0 -312
  101. package/dist/pipeline/flows/preflight-flow.js +0 -19
  102. package/dist/pipeline/nodes/claude-prompt-node.js +0 -54
  103. package/dist/pipeline/nodes/codex-docker-prompt-node.js +0 -32
  104. package/dist/pipeline/nodes/codex-local-prompt-node.js +0 -32
  105. package/dist/pipeline/nodes/review-claude-node.js +0 -38
  106. package/dist/pipeline/nodes/review-reply-codex-node.js +0 -40
  107. package/dist/pipeline/nodes/verify-build-node.js +0 -15
  108. package/dist/runtime/docker-runtime.js +0 -51
  109. package/docker-compose.yml +0 -445
  110. package/verify_build.sh +0 -105
@@ -0,0 +1,563 @@
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": { "ref": "params.jiraApiUrl" },
16
+ "outputFile": {
17
+ "artifact": {
18
+ "kind": "jira-task-file",
19
+ "taskKey": { "ref": "params.taskKey" }
20
+ }
21
+ },
22
+ "attachmentsManifestFile": {
23
+ "artifact": {
24
+ "kind": "jira-attachments-manifest-file",
25
+ "taskKey": { "ref": "params.taskKey" }
26
+ }
27
+ },
28
+ "attachmentsContextFile": {
29
+ "artifact": {
30
+ "kind": "jira-attachments-context-file",
31
+ "taskKey": { "ref": "params.taskKey" }
32
+ }
33
+ }
34
+ },
35
+ "expect": [
36
+ {
37
+ "kind": "require-file",
38
+ "path": {
39
+ "artifact": {
40
+ "kind": "jira-task-file",
41
+ "taskKey": { "ref": "params.taskKey" }
42
+ }
43
+ },
44
+ "message": "Jira fetch node did not produce the Jira task file."
45
+ },
46
+ {
47
+ "kind": "require-file",
48
+ "path": {
49
+ "artifact": {
50
+ "kind": "jira-attachments-manifest-file",
51
+ "taskKey": { "ref": "params.taskKey" }
52
+ }
53
+ },
54
+ "message": "Jira fetch node did not produce the Jira attachments manifest file."
55
+ },
56
+ {
57
+ "kind": "require-file",
58
+ "path": {
59
+ "artifact": {
60
+ "kind": "jira-attachments-context-file",
61
+ "taskKey": { "ref": "params.taskKey" }
62
+ }
63
+ },
64
+ "message": "Jira fetch node did not produce the Jira attachments context file."
65
+ }
66
+ ]
67
+ },
68
+ {
69
+ "id": "generate_planning_questions",
70
+ "node": "llm-prompt",
71
+ "prompt": {
72
+ "templateRef": "plan-questions",
73
+ "vars": {
74
+ "jira_task_file": {
75
+ "artifact": {
76
+ "kind": "jira-task-file",
77
+ "taskKey": { "ref": "params.taskKey" }
78
+ }
79
+ },
80
+ "jira_attachments_manifest_file": {
81
+ "artifact": {
82
+ "kind": "jira-attachments-manifest-file",
83
+ "taskKey": { "ref": "params.taskKey" }
84
+ }
85
+ },
86
+ "jira_attachments_context_file": {
87
+ "artifact": {
88
+ "kind": "jira-attachments-context-file",
89
+ "taskKey": { "ref": "params.taskKey" }
90
+ }
91
+ },
92
+ "planning_questions_json_file": {
93
+ "artifact": {
94
+ "kind": "planning-questions-json-file",
95
+ "taskKey": { "ref": "params.taskKey" }
96
+ }
97
+ }
98
+ },
99
+ "extraPrompt": { "ref": "params.extraPrompt" },
100
+ "format": "task-prompt"
101
+ },
102
+ "params": {
103
+ "labelText": { "const": "Generating planning questions" },
104
+ "model": { "ref": "params.llmModel" },
105
+ "executor": { "ref": "params.llmExecutor" },
106
+ "requiredArtifacts": {
107
+ "list": [
108
+ {
109
+ "artifact": {
110
+ "kind": "planning-questions-json-file",
111
+ "taskKey": { "ref": "params.taskKey" }
112
+ }
113
+ }
114
+ ]
115
+ }
116
+ },
117
+ "expect": [
118
+ {
119
+ "kind": "require-artifacts",
120
+ "when": { "not": { "ref": "context.dryRun" } },
121
+ "paths": {
122
+ "list": [
123
+ {
124
+ "artifact": {
125
+ "kind": "planning-questions-json-file",
126
+ "taskKey": { "ref": "params.taskKey" }
127
+ }
128
+ }
129
+ ]
130
+ },
131
+ "message": "Planning questions step did not produce the questions artifact."
132
+ },
133
+ {
134
+ "kind": "require-structured-artifacts",
135
+ "when": { "not": { "ref": "context.dryRun" } },
136
+ "items": [
137
+ {
138
+ "path": {
139
+ "artifact": {
140
+ "kind": "planning-questions-json-file",
141
+ "taskKey": { "ref": "params.taskKey" }
142
+ }
143
+ },
144
+ "schemaId": "planning-questions/v1"
145
+ }
146
+ ],
147
+ "message": "Planning questions step produced invalid structured artifacts."
148
+ }
149
+ ]
150
+ },
151
+ {
152
+ "id": "build_planning_questions_form",
153
+ "node": "planning-questions-form",
154
+ "params": {
155
+ "planningQuestionsJsonFile": {
156
+ "artifact": {
157
+ "kind": "planning-questions-json-file",
158
+ "taskKey": { "ref": "params.taskKey" }
159
+ }
160
+ },
161
+ "formId": { "const": "planning-questions" },
162
+ "title": { "const": "Planning Questions" },
163
+ "description": {
164
+ "const": "Reply to model questions if they are needed for accurate design and plan. If there are no questions, the step will complete automatically."
165
+ }
166
+ }
167
+ },
168
+ {
169
+ "id": "notify_planning_questions",
170
+ "when": { "not": { "equals": [{ "ref": "steps.plan.build_planning_questions_form.value.questionCount" }, { "const": 0 }] } },
171
+ "node": "telegram-notify",
172
+ "params": {
173
+ "message": {
174
+ "template": "Planning questions generated for {taskKey}. Please review and answer if needed.",
175
+ "vars": {
176
+ "taskKey": { "ref": "params.taskKey" }
177
+ }
178
+ }
179
+ }
180
+ },
181
+ {
182
+ "id": "collect_planning_answers",
183
+ "node": "user-input",
184
+ "params": {
185
+ "formId": { "ref": "steps.plan.build_planning_questions_form.value.formId" },
186
+ "title": { "ref": "steps.plan.build_planning_questions_form.value.title" },
187
+ "description": { "ref": "steps.plan.build_planning_questions_form.value.description" },
188
+ "submitLabel": { "const": "Continue planning" },
189
+ "fields": { "ref": "steps.plan.build_planning_questions_form.value.fields" },
190
+ "outputFile": {
191
+ "artifact": {
192
+ "kind": "planning-answers-json-file",
193
+ "taskKey": { "ref": "params.taskKey" }
194
+ }
195
+ }
196
+ },
197
+ "expect": [
198
+ {
199
+ "kind": "require-structured-artifacts",
200
+ "items": [
201
+ {
202
+ "path": {
203
+ "artifact": {
204
+ "kind": "planning-answers-json-file",
205
+ "taskKey": { "ref": "params.taskKey" }
206
+ }
207
+ },
208
+ "schemaId": "user-input/v1"
209
+ }
210
+ ],
211
+ "message": "Planning answers input is missing or invalid."
212
+ }
213
+ ]
214
+ },
215
+ {
216
+ "id": "run_plan",
217
+ "node": "llm-prompt",
218
+ "prompt": {
219
+ "templateRef": "plan",
220
+ "vars": {
221
+ "jira_task_file": {
222
+ "artifact": {
223
+ "kind": "jira-task-file",
224
+ "taskKey": { "ref": "params.taskKey" }
225
+ }
226
+ },
227
+ "jira_attachments_manifest_file": {
228
+ "artifact": {
229
+ "kind": "jira-attachments-manifest-file",
230
+ "taskKey": { "ref": "params.taskKey" }
231
+ }
232
+ },
233
+ "jira_attachments_context_file": {
234
+ "artifact": {
235
+ "kind": "jira-attachments-context-file",
236
+ "taskKey": { "ref": "params.taskKey" }
237
+ }
238
+ },
239
+ "design_file": {
240
+ "artifact": {
241
+ "kind": "design-file",
242
+ "taskKey": { "ref": "params.taskKey" },
243
+ "iteration": { "ref": "params.designIteration" }
244
+ }
245
+ },
246
+ "design_json_file": {
247
+ "artifact": {
248
+ "kind": "design-json-file",
249
+ "taskKey": { "ref": "params.taskKey" },
250
+ "iteration": { "ref": "params.designIteration" }
251
+ }
252
+ },
253
+ "plan_file": {
254
+ "artifact": {
255
+ "kind": "plan-file",
256
+ "taskKey": { "ref": "params.taskKey" },
257
+ "iteration": { "ref": "params.planIteration" }
258
+ }
259
+ },
260
+ "plan_json_file": {
261
+ "artifact": {
262
+ "kind": "plan-json-file",
263
+ "taskKey": { "ref": "params.taskKey" },
264
+ "iteration": { "ref": "params.planIteration" }
265
+ }
266
+ },
267
+ "qa_file": {
268
+ "artifact": {
269
+ "kind": "qa-file",
270
+ "taskKey": { "ref": "params.taskKey" },
271
+ "iteration": { "ref": "params.qaIteration" }
272
+ }
273
+ },
274
+ "qa_json_file": {
275
+ "artifact": {
276
+ "kind": "qa-json-file",
277
+ "taskKey": { "ref": "params.taskKey" },
278
+ "iteration": { "ref": "params.qaIteration" }
279
+ }
280
+ }
281
+ },
282
+ "extraPrompt": {
283
+ "appendPrompt": {
284
+ "base": { "ref": "params.extraPrompt" },
285
+ "suffix": { "ref": "steps.plan.collect_planning_answers.value.promptSuffix" }
286
+ }
287
+ },
288
+ "format": "task-prompt"
289
+ },
290
+ "params": {
291
+ "labelText": { "const": "Running planning mode" },
292
+ "model": { "ref": "params.llmModel" },
293
+ "executor": { "ref": "params.llmExecutor" }
294
+ },
295
+ "expect": [
296
+ {
297
+ "kind": "require-artifacts",
298
+ "when": { "not": { "ref": "context.dryRun" } },
299
+ "paths": {
300
+ "artifactList": {
301
+ "kind": "plan-artifacts",
302
+ "taskKey": { "ref": "params.taskKey" }
303
+ }
304
+ },
305
+ "message": "Plan mode did not produce the required artifacts."
306
+ },
307
+ {
308
+ "kind": "require-structured-artifacts",
309
+ "when": { "not": { "ref": "context.dryRun" } },
310
+ "items": [
311
+ {
312
+ "path": {
313
+ "artifact": {
314
+ "kind": "design-json-file",
315
+ "taskKey": { "ref": "params.taskKey" },
316
+ "iteration": { "ref": "params.designIteration" }
317
+ }
318
+ },
319
+ "schemaId": "implementation-design/v1"
320
+ },
321
+ {
322
+ "path": {
323
+ "artifact": {
324
+ "kind": "plan-json-file",
325
+ "taskKey": { "ref": "params.taskKey" },
326
+ "iteration": { "ref": "params.planIteration" }
327
+ }
328
+ },
329
+ "schemaId": "implementation-plan/v1"
330
+ },
331
+ {
332
+ "path": {
333
+ "artifact": {
334
+ "kind": "qa-json-file",
335
+ "taskKey": { "ref": "params.taskKey" },
336
+ "iteration": { "ref": "params.qaIteration" }
337
+ }
338
+ },
339
+ "schemaId": "qa-plan/v1"
340
+ }
341
+ ],
342
+ "message": "Plan mode produced invalid structured artifacts."
343
+ }
344
+ ]
345
+ },
346
+ {
347
+ "id": "notify_plan_complete",
348
+ "node": "telegram-notify",
349
+ "params": {
350
+ "message": {
351
+ "template": "Plan phase for {taskKey} complete.",
352
+ "vars": {
353
+ "taskKey": { "ref": "params.taskKey" }
354
+ }
355
+ }
356
+ }
357
+ }
358
+ ]
359
+ },
360
+ {
361
+ "id": "implement",
362
+ "steps": [
363
+ {
364
+ "id": "run_implement",
365
+ "node": "llm-prompt",
366
+ "prompt": {
367
+ "templateRef": "implement",
368
+ "vars": {
369
+ "design_file": {
370
+ "artifact": {
371
+ "kind": "design-file",
372
+ "taskKey": { "ref": "params.taskKey" }
373
+ }
374
+ },
375
+ "design_json_file": {
376
+ "artifact": {
377
+ "kind": "design-json-file",
378
+ "taskKey": { "ref": "params.taskKey" }
379
+ }
380
+ },
381
+ "plan_file": {
382
+ "artifact": {
383
+ "kind": "plan-file",
384
+ "taskKey": { "ref": "params.taskKey" }
385
+ }
386
+ },
387
+ "plan_json_file": {
388
+ "artifact": {
389
+ "kind": "plan-json-file",
390
+ "taskKey": { "ref": "params.taskKey" }
391
+ }
392
+ }
393
+ },
394
+ "extraPrompt": { "ref": "params.extraPrompt" },
395
+ "format": "task-prompt"
396
+ },
397
+ "params": {
398
+ "labelText": { "const": "Running implementation mode locally" },
399
+ "model": { "ref": "params.llmModel" },
400
+ "executor": { "ref": "params.llmExecutor" }
401
+ }
402
+ },
403
+ {
404
+ "id": "notify_implement_complete",
405
+ "node": "telegram-notify",
406
+ "params": {
407
+ "message": {
408
+ "template": "Implementation phase for {taskKey} complete.",
409
+ "vars": {
410
+ "taskKey": { "ref": "params.taskKey" }
411
+ }
412
+ }
413
+ }
414
+ }
415
+ ]
416
+ },
417
+ {
418
+ "id": "after_implement_checks",
419
+ "steps": [
420
+ {
421
+ "id": "run_go_linter_loop",
422
+ "node": "flow-run",
423
+ "params": {
424
+ "fileName": { "const": "run-go-linter-loop.json" },
425
+ "labelText": { "const": "Running final linter check" },
426
+ "taskKey": { "ref": "params.taskKey" },
427
+ "runGoLinterScript": { "ref": "params.runGoLinterScript" },
428
+ "extraPrompt": { "ref": "params.extraPrompt" },
429
+ "llmExecutor": { "ref": "params.llmExecutor" },
430
+ "llmModel": { "ref": "params.llmModel" },
431
+ "runGoLinterIteration": { "ref": "params.runGoLinterIteration" }
432
+ }
433
+ },
434
+ {
435
+ "id": "notify_linter_loop_complete",
436
+ "node": "telegram-notify",
437
+ "params": {
438
+ "message": {
439
+ "template": "Linter loop for {taskKey} complete.",
440
+ "vars": {
441
+ "taskKey": { "ref": "params.taskKey" }
442
+ }
443
+ }
444
+ }
445
+ },
446
+ {
447
+ "id": "run_go_tests_loop",
448
+ "node": "flow-run",
449
+ "params": {
450
+ "fileName": { "const": "run-go-tests-loop.json" },
451
+ "labelText": { "const": "Running final tests check" },
452
+ "taskKey": { "ref": "params.taskKey" },
453
+ "runGoTestsScript": { "ref": "params.runGoTestsScript" },
454
+ "extraPrompt": { "ref": "params.extraPrompt" },
455
+ "llmExecutor": { "ref": "params.llmExecutor" },
456
+ "llmModel": { "ref": "params.llmModel" },
457
+ "runGoTestsIteration": { "ref": "params.runGoTestsIteration" }
458
+ }
459
+ },
460
+ {
461
+ "id": "notify_tests_loop_complete",
462
+ "node": "telegram-notify",
463
+ "params": {
464
+ "message": {
465
+ "template": "Tests loop for {taskKey} complete.",
466
+ "vars": {
467
+ "taskKey": { "ref": "params.taskKey" }
468
+ }
469
+ }
470
+ }
471
+ }
472
+ ]
473
+ },
474
+ {
475
+ "id": "review_loop",
476
+ "steps": [
477
+ {
478
+ "id": "run_review_loop",
479
+ "node": "flow-run",
480
+ "params": {
481
+ "fileName": { "const": "review-loop.json" },
482
+ "labelText": { "const": "Running review-loop" },
483
+ "taskKey": { "ref": "params.taskKey" },
484
+ "workspaceDir": { "ref": "params.workspaceDir" },
485
+ "extraPrompt": { "ref": "params.extraPrompt" },
486
+ "reviewFixPoints": { "ref": "params.reviewFixPoints" },
487
+ "llmExecutor": { "ref": "params.llmExecutor" },
488
+ "llmModel": { "ref": "params.llmModel" }
489
+ }
490
+ },
491
+ {
492
+ "id": "notify_review_loop_complete",
493
+ "node": "telegram-notify",
494
+ "params": {
495
+ "message": {
496
+ "template": "Review loop for {taskKey} complete.",
497
+ "vars": {
498
+ "taskKey": { "ref": "params.taskKey" }
499
+ }
500
+ }
501
+ }
502
+ }
503
+ ]
504
+ },
505
+ {
506
+ "id": "final_checks",
507
+ "steps": [
508
+ {
509
+ "id": "run_go_linter_loop",
510
+ "node": "flow-run",
511
+ "params": {
512
+ "fileName": { "const": "run-go-linter-loop.json" },
513
+ "labelText": { "const": "Running final linter check" },
514
+ "taskKey": { "ref": "params.taskKey" },
515
+ "runGoLinterScript": { "ref": "params.runGoLinterScript" },
516
+ "extraPrompt": { "ref": "params.extraPrompt" },
517
+ "llmExecutor": { "ref": "params.llmExecutor" },
518
+ "llmModel": { "ref": "params.llmModel" },
519
+ "runGoLinterIteration": { "ref": "params.runGoLinterIteration" }
520
+ }
521
+ },
522
+ {
523
+ "id": "notify_final_linter_loop_complete",
524
+ "node": "telegram-notify",
525
+ "params": {
526
+ "message": {
527
+ "template": "Final linter loop for {taskKey} complete.",
528
+ "vars": {
529
+ "taskKey": { "ref": "params.taskKey" }
530
+ }
531
+ }
532
+ }
533
+ },
534
+ {
535
+ "id": "run_go_tests_loop",
536
+ "node": "flow-run",
537
+ "params": {
538
+ "fileName": { "const": "run-go-tests-loop.json" },
539
+ "labelText": { "const": "Running final tests check" },
540
+ "taskKey": { "ref": "params.taskKey" },
541
+ "runGoTestsScript": { "ref": "params.runGoTestsScript" },
542
+ "extraPrompt": { "ref": "params.extraPrompt" },
543
+ "llmExecutor": { "ref": "params.llmExecutor" },
544
+ "llmModel": { "ref": "params.llmModel" },
545
+ "runGoTestsIteration": { "ref": "params.runGoTestsIteration" }
546
+ }
547
+ },
548
+ {
549
+ "id": "notify_final_tests_loop_complete",
550
+ "node": "telegram-notify",
551
+ "params": {
552
+ "message": {
553
+ "template": "Final tests loop for {taskKey} complete.",
554
+ "vars": {
555
+ "taskKey": { "ref": "params.taskKey" }
556
+ }
557
+ }
558
+ }
559
+ }
560
+ ]
561
+ }
562
+ ]
563
+ }