agentweaver 0.1.15 → 0.1.17

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 +76 -19
  2. package/dist/artifact-manifest.js +219 -0
  3. package/dist/artifacts.js +88 -3
  4. package/dist/doctor/checks/env-diagnostics.js +25 -0
  5. package/dist/doctor/checks/executors.js +2 -2
  6. package/dist/doctor/checks/flow-readiness.js +15 -18
  7. package/dist/flow-state.js +212 -15
  8. package/dist/index.js +539 -209
  9. package/dist/interactive/blessed-session.js +361 -0
  10. package/dist/interactive/controller.js +1326 -0
  11. package/dist/interactive/create-interactive-session.js +5 -0
  12. package/dist/interactive/ink/index.js +597 -0
  13. package/dist/interactive/progress.js +245 -0
  14. package/dist/interactive/selectors.js +14 -0
  15. package/dist/interactive/session.js +1 -0
  16. package/dist/interactive/state.js +34 -0
  17. package/dist/interactive/tree.js +155 -0
  18. package/dist/interactive/types.js +1 -0
  19. package/dist/interactive/view-model.js +1 -0
  20. package/dist/interactive-ui.js +159 -194
  21. package/dist/pipeline/auto-flow.js +9 -6
  22. package/dist/pipeline/context.js +7 -5
  23. package/dist/pipeline/declarative-flow-runner.js +212 -6
  24. package/dist/pipeline/declarative-flows.js +63 -17
  25. package/dist/pipeline/execution-routing-config.js +15 -0
  26. package/dist/pipeline/flow-catalog.js +50 -12
  27. package/dist/pipeline/flow-run-resume.js +29 -0
  28. package/dist/pipeline/flow-specs/auto-common.json +90 -360
  29. package/dist/pipeline/flow-specs/auto-golang.json +81 -360
  30. package/dist/pipeline/flow-specs/auto-simple.json +141 -0
  31. package/dist/pipeline/flow-specs/bugz/bug-analyze.json +2 -0
  32. package/dist/pipeline/flow-specs/bugz/bug-fix.json +1 -0
  33. package/dist/pipeline/flow-specs/design-review/design-review-loop.json +316 -0
  34. package/dist/pipeline/flow-specs/design-review.json +10 -0
  35. package/dist/pipeline/flow-specs/gitlab/gitlab-diff-review.json +11 -0
  36. package/dist/pipeline/flow-specs/gitlab/gitlab-review.json +2 -0
  37. package/dist/pipeline/flow-specs/gitlab/mr-description.json +1 -0
  38. package/dist/pipeline/flow-specs/go/run-go-linter-loop.json +2 -0
  39. package/dist/pipeline/flow-specs/go/run-go-tests-loop.json +2 -0
  40. package/dist/pipeline/flow-specs/implement.json +13 -6
  41. package/dist/pipeline/flow-specs/instant-task.json +177 -0
  42. package/dist/pipeline/flow-specs/normalize-task-source.json +311 -0
  43. package/dist/pipeline/flow-specs/plan-revise.json +7 -1
  44. package/dist/pipeline/flow-specs/plan.json +51 -71
  45. package/dist/pipeline/flow-specs/review/review-fix.json +24 -4
  46. package/dist/pipeline/flow-specs/review/review-loop.json +351 -45
  47. package/dist/pipeline/flow-specs/review/review-project-loop.json +590 -0
  48. package/dist/pipeline/flow-specs/review/review-project.json +12 -0
  49. package/dist/pipeline/flow-specs/review/review.json +37 -31
  50. package/dist/pipeline/flow-specs/task-describe.json +2 -0
  51. package/dist/pipeline/flow-specs/task-source/jira-fetch.json +70 -0
  52. package/dist/pipeline/flow-specs/task-source/manual-input.json +216 -0
  53. package/dist/pipeline/launch-profile-config.js +30 -18
  54. package/dist/pipeline/node-contract.js +1 -0
  55. package/dist/pipeline/node-registry.js +115 -6
  56. package/dist/pipeline/node-runner.js +3 -2
  57. package/dist/pipeline/nodes/build-review-fix-prompt-node.js +5 -1
  58. package/dist/pipeline/nodes/clear-ready-to-merge-node.js +11 -0
  59. package/dist/pipeline/nodes/commit-message-form-node.js +8 -0
  60. package/dist/pipeline/nodes/design-review-verdict-node.js +36 -0
  61. package/dist/pipeline/nodes/ensure-summary-json-node.js +13 -2
  62. package/dist/pipeline/nodes/fetch-gitlab-diff-node.js +19 -2
  63. package/dist/pipeline/nodes/fetch-gitlab-review-node.js +19 -2
  64. package/dist/pipeline/nodes/flow-run-node.js +242 -8
  65. package/dist/pipeline/nodes/git-commit-form-node.js +8 -0
  66. package/dist/pipeline/nodes/gitlab-review-artifacts-node.js +19 -2
  67. package/dist/pipeline/nodes/jira-fetch-node.js +50 -4
  68. package/dist/pipeline/nodes/llm-prompt-node.js +38 -36
  69. package/dist/pipeline/nodes/planning-bundle-node.js +10 -0
  70. package/dist/pipeline/nodes/review-verdict-node.js +86 -0
  71. package/dist/pipeline/nodes/select-files-form-node.js +8 -0
  72. package/dist/pipeline/nodes/structured-summary-node.js +24 -0
  73. package/dist/pipeline/nodes/user-input-node.js +38 -3
  74. package/dist/pipeline/nodes/write-selection-file-node.js +20 -4
  75. package/dist/pipeline/plugin-loader.js +389 -0
  76. package/dist/pipeline/plugin-types.js +1 -0
  77. package/dist/pipeline/prompt-registry.js +3 -1
  78. package/dist/pipeline/prompt-runtime.js +4 -1
  79. package/dist/pipeline/registry.js +71 -4
  80. package/dist/pipeline/review-iteration.js +26 -0
  81. package/dist/pipeline/spec-compiler.js +3 -0
  82. package/dist/pipeline/spec-loader.js +14 -0
  83. package/dist/pipeline/spec-types.js +3 -0
  84. package/dist/pipeline/spec-validator.js +20 -0
  85. package/dist/pipeline/value-resolver.js +76 -2
  86. package/dist/plugin-sdk.js +1 -0
  87. package/dist/prompts.js +36 -14
  88. package/dist/review-severity.js +45 -0
  89. package/dist/runtime/artifact-registry.js +405 -0
  90. package/dist/runtime/design-review-input-contract.js +17 -16
  91. package/dist/runtime/env-loader.js +3 -0
  92. package/dist/runtime/execution-routing-store.js +134 -0
  93. package/dist/runtime/execution-routing.js +233 -0
  94. package/dist/runtime/interactive-execution-routing.js +471 -0
  95. package/dist/runtime/plan-revise-input-contract.js +35 -32
  96. package/dist/runtime/planning-bundle.js +123 -0
  97. package/dist/runtime/ready-to-merge.js +22 -1
  98. package/dist/runtime/review-input-contract.js +100 -0
  99. package/dist/structured-artifact-schema-registry.js +9 -0
  100. package/dist/structured-artifact-schemas.json +140 -1
  101. package/dist/structured-artifacts.js +77 -6
  102. package/dist/user-input.js +70 -3
  103. package/docs/example/.flows/examples/claude-example.json +50 -0
  104. package/docs/example/.plugins/claude-example-plugin/index.js +149 -0
  105. package/docs/example/.plugins/claude-example-plugin/plugin.json +8 -0
  106. package/docs/examples/.flows/claude-example.json +50 -0
  107. package/docs/examples/.plugins/claude-example-plugin/index.js +149 -0
  108. package/docs/examples/.plugins/claude-example-plugin/plugin.json +8 -0
  109. package/docs/plugin-sdk.md +731 -0
  110. package/package.json +11 -4
@@ -0,0 +1,311 @@
1
+ {
2
+ "kind": "normalize-task-source-flow",
3
+ "version": 1,
4
+ "description": "Normalizes the available task source into a connector-agnostic task-context artifact for planning and review flows.",
5
+ "catalogVisibility": "hidden",
6
+ "phases": [
7
+ {
8
+ "id": "normalize",
9
+ "steps": [
10
+ {
11
+ "id": "validate_jira_source",
12
+ "when": {
13
+ "exists": {
14
+ "artifact": {
15
+ "kind": "jira-task-file",
16
+ "taskKey": { "ref": "params.taskKey" }
17
+ }
18
+ }
19
+ },
20
+ "node": "file-check",
21
+ "params": {
22
+ "path": {
23
+ "artifact": {
24
+ "kind": "jira-task-file",
25
+ "taskKey": { "ref": "params.taskKey" }
26
+ }
27
+ },
28
+ "panelTitle": { "const": "Jira Task Source" },
29
+ "foundMessage": { "const": "Raw Jira task context found and will be normalized." },
30
+ "tone": { "const": "cyan" }
31
+ },
32
+ "expect": [
33
+ {
34
+ "kind": "require-file",
35
+ "path": {
36
+ "artifact": {
37
+ "kind": "jira-task-file",
38
+ "taskKey": { "ref": "params.taskKey" }
39
+ }
40
+ },
41
+ "message": "Jira task source is missing."
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "id": "run_normalize_from_jira",
47
+ "when": {
48
+ "exists": {
49
+ "artifact": {
50
+ "kind": "jira-task-file",
51
+ "taskKey": { "ref": "params.taskKey" }
52
+ }
53
+ }
54
+ },
55
+ "node": "llm-prompt",
56
+ "routingGroup": "planning",
57
+ "prompt": {
58
+ "templateRef": "task-context-from-jira",
59
+ "vars": {
60
+ "jira_task_file": {
61
+ "artifact": {
62
+ "kind": "jira-task-file",
63
+ "taskKey": { "ref": "params.taskKey" }
64
+ }
65
+ },
66
+ "jira_attachments_manifest_file": {
67
+ "artifact": {
68
+ "kind": "jira-attachments-manifest-file",
69
+ "taskKey": { "ref": "params.taskKey" }
70
+ }
71
+ },
72
+ "jira_attachments_context_file": {
73
+ "artifact": {
74
+ "kind": "jira-attachments-context-file",
75
+ "taskKey": { "ref": "params.taskKey" }
76
+ }
77
+ },
78
+ "task_context_file": {
79
+ "artifact": {
80
+ "kind": "task-context-file",
81
+ "taskKey": { "ref": "params.taskKey" },
82
+ "iteration": { "ref": "params.iteration" }
83
+ }
84
+ },
85
+ "task_context_json_file": {
86
+ "artifact": {
87
+ "kind": "task-context-json-file",
88
+ "taskKey": { "ref": "params.taskKey" },
89
+ "iteration": { "ref": "params.iteration" }
90
+ }
91
+ }
92
+ },
93
+ "extraPrompt": { "ref": "params.extraPrompt" },
94
+ "format": "task-prompt"
95
+ },
96
+ "params": {
97
+ "labelText": { "const": "Normalizing Jira task context" },
98
+ "model": { "ref": "params.llmModel" },
99
+ "executor": { "ref": "params.llmExecutor" },
100
+ "requiredArtifacts": {
101
+ "list": [
102
+ {
103
+ "artifact": {
104
+ "kind": "task-context-file",
105
+ "taskKey": { "ref": "params.taskKey" },
106
+ "iteration": { "ref": "params.iteration" }
107
+ }
108
+ },
109
+ {
110
+ "artifact": {
111
+ "kind": "task-context-json-file",
112
+ "taskKey": { "ref": "params.taskKey" },
113
+ "iteration": { "ref": "params.iteration" }
114
+ }
115
+ }
116
+ ]
117
+ }
118
+ }
119
+ },
120
+ {
121
+ "id": "validate_manual_source",
122
+ "when": {
123
+ "all": [
124
+ {
125
+ "not": {
126
+ "exists": {
127
+ "artifact": {
128
+ "kind": "jira-task-file",
129
+ "taskKey": { "ref": "params.taskKey" }
130
+ }
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "exists": {
136
+ "artifact": {
137
+ "kind": "instant-task-input-json-file",
138
+ "taskKey": { "ref": "params.taskKey" }
139
+ }
140
+ }
141
+ }
142
+ ]
143
+ },
144
+ "node": "file-check",
145
+ "params": {
146
+ "path": {
147
+ "artifact": {
148
+ "kind": "instant-task-input-json-file",
149
+ "taskKey": { "ref": "params.taskKey" }
150
+ }
151
+ },
152
+ "panelTitle": { "const": "Manual Task Source" },
153
+ "foundMessage": { "const": "Manual task input found and will be normalized." },
154
+ "tone": { "const": "cyan" }
155
+ },
156
+ "expect": [
157
+ {
158
+ "kind": "require-structured-artifacts",
159
+ "items": [
160
+ {
161
+ "path": {
162
+ "artifact": {
163
+ "kind": "instant-task-input-json-file",
164
+ "taskKey": { "ref": "params.taskKey" }
165
+ }
166
+ },
167
+ "schemaId": "user-input/v1"
168
+ }
169
+ ],
170
+ "message": "Manual task source input is missing or invalid."
171
+ }
172
+ ]
173
+ },
174
+ {
175
+ "id": "run_normalize_from_manual",
176
+ "when": {
177
+ "all": [
178
+ {
179
+ "not": {
180
+ "exists": {
181
+ "artifact": {
182
+ "kind": "jira-task-file",
183
+ "taskKey": { "ref": "params.taskKey" }
184
+ }
185
+ }
186
+ }
187
+ },
188
+ {
189
+ "exists": {
190
+ "artifact": {
191
+ "kind": "instant-task-input-json-file",
192
+ "taskKey": { "ref": "params.taskKey" }
193
+ }
194
+ }
195
+ }
196
+ ]
197
+ },
198
+ "node": "llm-prompt",
199
+ "routingGroup": "planning",
200
+ "prompt": {
201
+ "templateRef": "task-context-from-manual",
202
+ "vars": {
203
+ "task_input_file": {
204
+ "artifact": {
205
+ "kind": "instant-task-input-json-file",
206
+ "taskKey": { "ref": "params.taskKey" }
207
+ }
208
+ },
209
+ "task_context_file": {
210
+ "artifact": {
211
+ "kind": "task-context-file",
212
+ "taskKey": { "ref": "params.taskKey" },
213
+ "iteration": { "ref": "params.iteration" }
214
+ }
215
+ },
216
+ "task_context_json_file": {
217
+ "artifact": {
218
+ "kind": "task-context-json-file",
219
+ "taskKey": { "ref": "params.taskKey" },
220
+ "iteration": { "ref": "params.iteration" }
221
+ }
222
+ }
223
+ },
224
+ "extraPrompt": { "ref": "params.extraPrompt" },
225
+ "format": "task-prompt"
226
+ },
227
+ "params": {
228
+ "labelText": { "const": "Normalizing manual task context" },
229
+ "model": { "ref": "params.llmModel" },
230
+ "executor": { "ref": "params.llmExecutor" },
231
+ "requiredArtifacts": {
232
+ "list": [
233
+ {
234
+ "artifact": {
235
+ "kind": "task-context-file",
236
+ "taskKey": { "ref": "params.taskKey" },
237
+ "iteration": { "ref": "params.iteration" }
238
+ }
239
+ },
240
+ {
241
+ "artifact": {
242
+ "kind": "task-context-json-file",
243
+ "taskKey": { "ref": "params.taskKey" },
244
+ "iteration": { "ref": "params.iteration" }
245
+ }
246
+ }
247
+ ]
248
+ }
249
+ }
250
+ },
251
+ {
252
+ "id": "validate_task_context_json",
253
+ "node": "file-check",
254
+ "params": {
255
+ "path": {
256
+ "artifact": {
257
+ "kind": "task-context-json-file",
258
+ "taskKey": { "ref": "params.taskKey" },
259
+ "iteration": { "ref": "params.iteration" }
260
+ }
261
+ },
262
+ "panelTitle": { "const": "Normalized Task Context" },
263
+ "foundMessage": { "const": "Normalized task context artifact found." },
264
+ "tone": { "const": "cyan" }
265
+ },
266
+ "expect": [
267
+ {
268
+ "kind": "require-file",
269
+ "path": {
270
+ "artifact": {
271
+ "kind": "task-context-json-file",
272
+ "taskKey": { "ref": "params.taskKey" },
273
+ "iteration": { "ref": "params.iteration" }
274
+ }
275
+ },
276
+ "message": "Task source normalization did not produce the task-context artifact."
277
+ },
278
+ {
279
+ "kind": "require-structured-artifacts",
280
+ "items": [
281
+ {
282
+ "path": {
283
+ "artifact": {
284
+ "kind": "task-context-json-file",
285
+ "taskKey": { "ref": "params.taskKey" },
286
+ "iteration": { "ref": "params.iteration" }
287
+ }
288
+ },
289
+ "schemaId": "task-context/v1"
290
+ }
291
+ ],
292
+ "message": "Task source normalization produced an invalid task-context artifact."
293
+ }
294
+ ],
295
+ "after": [
296
+ {
297
+ "kind": "set-summary-from-file",
298
+ "path": {
299
+ "artifact": {
300
+ "kind": "task-context-file",
301
+ "taskKey": { "ref": "params.taskKey" },
302
+ "iteration": { "ref": "params.iteration" }
303
+ }
304
+ }
305
+ }
306
+ ]
307
+ }
308
+ ]
309
+ }
310
+ ]
311
+ }
@@ -152,6 +152,7 @@
152
152
  {
153
153
  "id": "run_plan_revise",
154
154
  "node": "llm-prompt",
155
+ "routingGroup": "planning",
155
156
  "prompt": {
156
157
  "templateRef": "plan-revise",
157
158
  "vars": {
@@ -163,10 +164,12 @@
163
164
  "plan_json_file": { "ref": "params.planJsonFile" },
164
165
  "qa_file": { "ref": "params.qaFile" },
165
166
  "qa_json_file": { "ref": "params.qaJsonFile" },
167
+ "task_context_json_file": { "ref": "params.taskContextJsonFile" },
166
168
  "jira_task_file": { "ref": "params.jiraTaskFile" },
167
169
  "jira_attachments_manifest_file": { "ref": "params.jiraAttachmentsManifestFile" },
168
170
  "jira_attachments_context_file": { "ref": "params.jiraAttachmentsContextFile" },
169
171
  "planning_answers_json_file": { "ref": "params.planningAnswersJsonFile" },
172
+ "task_input_json_file": { "ref": "params.taskInputJsonFile" },
170
173
  "revised_design_file": { "ref": "params.revisedDesignFile" },
171
174
  "revised_design_json_file": { "ref": "params.revisedDesignJsonFile" },
172
175
  "revised_plan_file": { "ref": "params.revisedPlanFile" },
@@ -189,8 +192,11 @@
189
192
  "requiredArtifacts": {
190
193
  "list": [
191
194
  { "ref": "params.revisedDesignFile" },
195
+ { "ref": "params.revisedDesignJsonFile" },
192
196
  { "ref": "params.revisedPlanFile" },
193
- { "ref": "params.revisedQaFile" }
197
+ { "ref": "params.revisedPlanJsonFile" },
198
+ { "ref": "params.revisedQaFile" },
199
+ { "ref": "params.revisedQaJsonFile" }
194
200
  ]
195
201
  }
196
202
  },
@@ -1,90 +1,68 @@
1
1
  {
2
2
  "kind": "plan-flow",
3
3
  "version": 1,
4
- "description": "Fetches Jira task with attachments, generates clarifying questions for the developer, collects answers, and produces design, implementation plan, and QA plan as structured JSON and markdown artifacts.",
4
+ "description": "Consumes the normalized task-context artifact, generates clarifying questions for the developer, collects answers, and produces design, implementation plan, and QA plan as structured JSON and markdown artifacts.",
5
5
  "phases": [
6
6
  {
7
7
  "id": "plan",
8
8
  "steps": [
9
9
  {
10
- "id": "fetch_jira",
11
- "node": "jira-fetch",
10
+ "id": "validate_task_context",
11
+ "node": "file-check",
12
12
  "params": {
13
- "jiraApiUrl": { "ref": "params.jiraApiUrl" },
14
- "outputFile": {
15
- "artifact": {
16
- "kind": "jira-task-file",
17
- "taskKey": { "ref": "params.taskKey" }
18
- }
19
- },
20
- "attachmentsManifestFile": {
13
+ "path": {
21
14
  "artifact": {
22
- "kind": "jira-attachments-manifest-file",
23
- "taskKey": { "ref": "params.taskKey" }
15
+ "kind": "task-context-json-file",
16
+ "taskKey": { "ref": "params.taskKey" },
17
+ "iteration": { "ref": "params.taskContextIteration" }
24
18
  }
25
19
  },
26
- "attachmentsContextFile": {
27
- "artifact": {
28
- "kind": "jira-attachments-context-file",
29
- "taskKey": { "ref": "params.taskKey" }
30
- }
31
- }
20
+ "panelTitle": { "const": "Task Context" },
21
+ "foundMessage": { "const": "Normalized task context artifact found for planning." },
22
+ "tone": { "const": "cyan" }
32
23
  },
33
24
  "expect": [
34
25
  {
35
26
  "kind": "require-file",
36
27
  "path": {
37
28
  "artifact": {
38
- "kind": "jira-task-file",
39
- "taskKey": { "ref": "params.taskKey" }
40
- }
41
- },
42
- "message": "Jira fetch node did not produce the Jira task file."
43
- },
44
- {
45
- "kind": "require-file",
46
- "path": {
47
- "artifact": {
48
- "kind": "jira-attachments-manifest-file",
49
- "taskKey": { "ref": "params.taskKey" }
29
+ "kind": "task-context-json-file",
30
+ "taskKey": { "ref": "params.taskKey" },
31
+ "iteration": { "ref": "params.taskContextIteration" }
50
32
  }
51
33
  },
52
- "message": "Jira fetch node did not produce the Jira attachments manifest file."
34
+ "message": "Plan mode requires a normalized task-context artifact."
53
35
  },
54
36
  {
55
- "kind": "require-file",
56
- "path": {
57
- "artifact": {
58
- "kind": "jira-attachments-context-file",
59
- "taskKey": { "ref": "params.taskKey" }
37
+ "kind": "require-structured-artifacts",
38
+ "items": [
39
+ {
40
+ "path": {
41
+ "artifact": {
42
+ "kind": "task-context-json-file",
43
+ "taskKey": { "ref": "params.taskKey" },
44
+ "iteration": { "ref": "params.taskContextIteration" }
45
+ }
46
+ },
47
+ "schemaId": "task-context/v1"
60
48
  }
61
- },
62
- "message": "Jira fetch node did not produce the Jira attachments context file."
49
+ ],
50
+ "message": "Plan mode requires a valid task-context artifact."
63
51
  }
64
52
  ]
65
53
  },
66
54
  {
67
55
  "id": "generate_planning_questions",
68
56
  "node": "llm-prompt",
57
+ "routingGroup": "planning",
69
58
  "prompt": {
70
59
  "templateRef": "plan-questions",
71
60
  "vars": {
72
- "jira_task_file": {
61
+ "task_context_json_file": {
73
62
  "artifact": {
74
- "kind": "jira-task-file",
75
- "taskKey": { "ref": "params.taskKey" }
76
- }
77
- },
78
- "jira_attachments_manifest_file": {
79
- "artifact": {
80
- "kind": "jira-attachments-manifest-file",
81
- "taskKey": { "ref": "params.taskKey" }
82
- }
83
- },
84
- "jira_attachments_context_file": {
85
- "artifact": {
86
- "kind": "jira-attachments-context-file",
87
- "taskKey": { "ref": "params.taskKey" }
63
+ "kind": "task-context-json-file",
64
+ "taskKey": { "ref": "params.taskKey" },
65
+ "iteration": { "ref": "params.taskContextIteration" }
88
66
  }
89
67
  },
90
68
  "planning_questions_json_file": {
@@ -165,6 +143,7 @@
165
143
  },
166
144
  {
167
145
  "id": "notify_questions_need_answering",
146
+ "when": { "not": { "equals": [{ "ref": "steps.plan.build_planning_questions_form.value.questionCount" }, { "const": 0 }] } },
168
147
  "node": "telegram-notify",
169
148
  "params": {
170
149
  "message": { "const": "Questions need answering" }
@@ -207,24 +186,20 @@
207
186
  {
208
187
  "id": "run_plan",
209
188
  "node": "llm-prompt",
189
+ "routingGroup": "planning",
210
190
  "prompt": {
211
191
  "templateRef": "plan",
212
192
  "vars": {
213
- "jira_task_file": {
193
+ "task_context_json_file": {
214
194
  "artifact": {
215
- "kind": "jira-task-file",
216
- "taskKey": { "ref": "params.taskKey" }
217
- }
218
- },
219
- "jira_attachments_manifest_file": {
220
- "artifact": {
221
- "kind": "jira-attachments-manifest-file",
222
- "taskKey": { "ref": "params.taskKey" }
195
+ "kind": "task-context-json-file",
196
+ "taskKey": { "ref": "params.taskKey" },
197
+ "iteration": { "ref": "params.taskContextIteration" }
223
198
  }
224
199
  },
225
- "jira_attachments_context_file": {
200
+ "planning_answers_json_file": {
226
201
  "artifact": {
227
- "kind": "jira-attachments-context-file",
202
+ "kind": "planning-answers-json-file",
228
203
  "taskKey": { "ref": "params.taskKey" }
229
204
  }
230
205
  },
@@ -272,17 +247,21 @@
272
247
  }
273
248
  },
274
249
  "extraPrompt": {
275
- "appendPrompt": {
276
- "base": { "ref": "params.extraPrompt" },
277
- "suffix": { "ref": "steps.plan.collect_planning_answers.value.promptSuffix" }
278
- }
250
+ "ref": "params.extraPrompt"
279
251
  },
280
252
  "format": "task-prompt"
281
253
  },
282
254
  "params": {
283
255
  "labelText": { "const": "Running planning mode" },
284
256
  "model": { "ref": "params.llmModel" },
285
- "executor": { "ref": "params.llmExecutor" }
257
+ "executor": { "ref": "params.llmExecutor" },
258
+ "requiredArtifacts": {
259
+ "artifactList": {
260
+ "kind": "plan-artifacts",
261
+ "taskKey": { "ref": "params.taskKey" },
262
+ "iteration": { "ref": "params.planIteration" }
263
+ }
264
+ }
286
265
  },
287
266
  "expect": [
288
267
  {
@@ -291,7 +270,8 @@
291
270
  "paths": {
292
271
  "artifactList": {
293
272
  "kind": "plan-artifacts",
294
- "taskKey": { "ref": "params.taskKey" }
273
+ "taskKey": { "ref": "params.taskKey" },
274
+ "iteration": { "ref": "params.planIteration" }
295
275
  }
296
276
  },
297
277
  "message": "Plan mode did not produce the required artifacts."
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "kind": "review-fix-flow",
3
3
  "version": 1,
4
- "description": "Takes review findings, auto-selects blockers and criticals (or lets the developer pick manually), builds a targeted fix prompt, and applies fixes locally. Runs mandatory checks after modifications.",
4
+ "description": "Takes review findings, auto-selects the configured blocking severities (or lets the developer pick manually), builds a targeted fix prompt, and applies fixes locally. Runs mandatory checks after modifications.",
5
5
  "constants": {
6
- "autoReviewFixExtraPrompt": "Fix only blockers and criticals"
6
+ "autoReviewFixExtraPrompt": "Fix only blocking severities"
7
7
  },
8
8
  "phases": [
9
9
  {
@@ -56,7 +56,8 @@
56
56
  "iteration": { "ref": "params.latestIteration" }
57
57
  }
58
58
  },
59
- "selectionMode": { "const": "auto-blockers-criticals" }
59
+ "selectionMode": { "const": "auto-blocking-severities" },
60
+ "blockingSeverities": { "ref": "params.reviewBlockingSeverities" }
60
61
  }
61
62
  },
62
63
  {
@@ -114,6 +115,7 @@
114
115
  {
115
116
  "id": "run_review_fix",
116
117
  "node": "llm-prompt",
118
+ "routingGroup": "repair-loop",
117
119
  "prompt": {
118
120
  "templateRef": "review-fix",
119
121
  "vars": {
@@ -163,7 +165,25 @@
163
165
  }
164
166
  },
165
167
  "model": { "ref": "params.llmModel" },
166
- "executor": { "ref": "params.llmExecutor" }
168
+ "executor": { "ref": "params.llmExecutor" },
169
+ "requiredArtifacts": {
170
+ "list": [
171
+ {
172
+ "artifact": {
173
+ "kind": "review-fix-file",
174
+ "taskKey": { "ref": "params.taskKey" },
175
+ "iteration": { "ref": "params.latestIteration" }
176
+ }
177
+ },
178
+ {
179
+ "artifact": {
180
+ "kind": "review-fix-json-file",
181
+ "taskKey": { "ref": "params.taskKey" },
182
+ "iteration": { "ref": "params.latestIteration" }
183
+ }
184
+ }
185
+ ]
186
+ }
167
187
  },
168
188
  "expect": [
169
189
  {