agentweaver 0.1.15 → 0.1.16

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 (94) hide show
  1. package/README.md +26 -9
  2. package/dist/artifact-manifest.js +219 -0
  3. package/dist/artifacts.js +15 -0
  4. package/dist/doctor/checks/env-diagnostics.js +25 -0
  5. package/dist/doctor/checks/flow-readiness.js +15 -18
  6. package/dist/flow-state.js +75 -15
  7. package/dist/index.js +391 -175
  8. package/dist/interactive/blessed-session.js +361 -0
  9. package/dist/interactive/controller.js +1293 -0
  10. package/dist/interactive/create-interactive-session.js +5 -0
  11. package/dist/interactive/ink/index.js +576 -0
  12. package/dist/interactive/progress.js +245 -0
  13. package/dist/interactive/selectors.js +14 -0
  14. package/dist/interactive/session.js +1 -0
  15. package/dist/interactive/state.js +34 -0
  16. package/dist/interactive/tree.js +155 -0
  17. package/dist/interactive/types.js +1 -0
  18. package/dist/interactive/view-model.js +1 -0
  19. package/dist/interactive-ui.js +159 -194
  20. package/dist/pipeline/context.js +1 -0
  21. package/dist/pipeline/declarative-flow-runner.js +212 -6
  22. package/dist/pipeline/declarative-flows.js +27 -0
  23. package/dist/pipeline/execution-routing-config.js +15 -0
  24. package/dist/pipeline/flow-catalog.js +19 -3
  25. package/dist/pipeline/flow-run-resume.js +29 -0
  26. package/dist/pipeline/flow-specs/auto-common.json +89 -360
  27. package/dist/pipeline/flow-specs/auto-golang.json +58 -363
  28. package/dist/pipeline/flow-specs/auto-simple.json +141 -0
  29. package/dist/pipeline/flow-specs/bugz/bug-analyze.json +2 -0
  30. package/dist/pipeline/flow-specs/bugz/bug-fix.json +1 -0
  31. package/dist/pipeline/flow-specs/design-review/design-review-loop.json +304 -0
  32. package/dist/pipeline/flow-specs/design-review.json +10 -0
  33. package/dist/pipeline/flow-specs/gitlab/gitlab-diff-review.json +11 -0
  34. package/dist/pipeline/flow-specs/gitlab/gitlab-review.json +2 -0
  35. package/dist/pipeline/flow-specs/gitlab/mr-description.json +1 -0
  36. package/dist/pipeline/flow-specs/go/run-go-linter-loop.json +2 -0
  37. package/dist/pipeline/flow-specs/go/run-go-tests-loop.json +2 -0
  38. package/dist/pipeline/flow-specs/implement.json +13 -6
  39. package/dist/pipeline/flow-specs/instant-task.json +177 -0
  40. package/dist/pipeline/flow-specs/normalize-task-source.json +311 -0
  41. package/dist/pipeline/flow-specs/plan-revise.json +7 -1
  42. package/dist/pipeline/flow-specs/plan.json +48 -70
  43. package/dist/pipeline/flow-specs/review/review-fix.json +24 -4
  44. package/dist/pipeline/flow-specs/review/review-loop.json +351 -45
  45. package/dist/pipeline/flow-specs/review/review-project-loop.json +590 -0
  46. package/dist/pipeline/flow-specs/review/review-project.json +12 -0
  47. package/dist/pipeline/flow-specs/review/review.json +37 -31
  48. package/dist/pipeline/flow-specs/task-describe.json +2 -0
  49. package/dist/pipeline/flow-specs/task-source/jira-fetch.json +70 -0
  50. package/dist/pipeline/flow-specs/task-source/manual-input.json +216 -0
  51. package/dist/pipeline/node-registry.js +41 -1
  52. package/dist/pipeline/node-runner.js +3 -2
  53. package/dist/pipeline/nodes/build-review-fix-prompt-node.js +5 -1
  54. package/dist/pipeline/nodes/clear-ready-to-merge-node.js +11 -0
  55. package/dist/pipeline/nodes/commit-message-form-node.js +8 -0
  56. package/dist/pipeline/nodes/design-review-verdict-node.js +36 -0
  57. package/dist/pipeline/nodes/ensure-summary-json-node.js +13 -2
  58. package/dist/pipeline/nodes/fetch-gitlab-diff-node.js +19 -2
  59. package/dist/pipeline/nodes/fetch-gitlab-review-node.js +19 -2
  60. package/dist/pipeline/nodes/flow-run-node.js +226 -7
  61. package/dist/pipeline/nodes/git-commit-form-node.js +8 -0
  62. package/dist/pipeline/nodes/gitlab-review-artifacts-node.js +19 -2
  63. package/dist/pipeline/nodes/jira-fetch-node.js +50 -4
  64. package/dist/pipeline/nodes/llm-prompt-node.js +32 -12
  65. package/dist/pipeline/nodes/planning-bundle-node.js +10 -0
  66. package/dist/pipeline/nodes/review-verdict-node.js +86 -0
  67. package/dist/pipeline/nodes/select-files-form-node.js +8 -0
  68. package/dist/pipeline/nodes/structured-summary-node.js +24 -0
  69. package/dist/pipeline/nodes/user-input-node.js +38 -3
  70. package/dist/pipeline/nodes/write-selection-file-node.js +20 -4
  71. package/dist/pipeline/prompt-registry.js +3 -1
  72. package/dist/pipeline/prompt-runtime.js +4 -1
  73. package/dist/pipeline/review-iteration.js +26 -0
  74. package/dist/pipeline/spec-compiler.js +2 -0
  75. package/dist/pipeline/spec-types.js +3 -0
  76. package/dist/pipeline/spec-validator.js +14 -0
  77. package/dist/pipeline/value-resolver.js +74 -1
  78. package/dist/prompts.js +36 -14
  79. package/dist/review-severity.js +45 -0
  80. package/dist/runtime/artifact-registry.js +402 -0
  81. package/dist/runtime/design-review-input-contract.js +17 -16
  82. package/dist/runtime/env-loader.js +3 -0
  83. package/dist/runtime/execution-routing-store.js +134 -0
  84. package/dist/runtime/execution-routing.js +227 -0
  85. package/dist/runtime/interactive-execution-routing.js +462 -0
  86. package/dist/runtime/plan-revise-input-contract.js +35 -32
  87. package/dist/runtime/planning-bundle.js +123 -0
  88. package/dist/runtime/ready-to-merge.js +22 -1
  89. package/dist/runtime/review-input-contract.js +100 -0
  90. package/dist/structured-artifact-schema-registry.js +9 -0
  91. package/dist/structured-artifact-schemas.json +140 -1
  92. package/dist/structured-artifacts.js +77 -6
  93. package/dist/user-input.js +70 -3
  94. package/package.json +6 -3
@@ -1,359 +1,62 @@
1
1
  {
2
2
  "kind": "auto-flow",
3
3
  "version": 1,
4
- "description": "End-to-end resumable pipeline for Go projects. Runs the full sequence: plan (with Jira fetch and Q&A) → implement → linter loop → test loop → review loop → final linter loop → final test loop. Supports --from to restart from a specific phase and auto-status/auto-reset for state management.",
4
+ "description": "End-to-end resumable pipeline for Go projects. Runs the full sequence: Jira fetch task source normalization plan → implement → linter loop → test loop → review loop → final linter loop → final test loop. Supports --from to restart from a specific phase and auto-status/auto-reset for state management.",
5
5
  "constants": {
6
6
  "autoReviewFixExtraPrompt": "Fix only blockers, criticals, and important findings"
7
7
  },
8
8
  "phases": [
9
9
  {
10
- "id": "plan",
10
+ "id": "source",
11
11
  "steps": [
12
12
  {
13
- "id": "fetch_jira",
14
- "node": "jira-fetch",
13
+ "id": "fetch_jira_source",
14
+ "node": "flow-run",
15
15
  "params": {
16
+ "fileName": { "const": "jira-fetch.json" },
17
+ "labelText": { "const": "Fetching Jira task source" },
16
18
  "jiraApiUrl": { "ref": "params.jiraApiUrl" },
17
- "outputFile": {
18
- "artifact": {
19
- "kind": "jira-task-file",
20
- "taskKey": { "ref": "params.taskKey" }
21
- }
22
- },
23
- "attachmentsManifestFile": {
24
- "artifact": {
25
- "kind": "jira-attachments-manifest-file",
26
- "taskKey": { "ref": "params.taskKey" }
27
- }
28
- },
29
- "attachmentsContextFile": {
30
- "artifact": {
31
- "kind": "jira-attachments-context-file",
32
- "taskKey": { "ref": "params.taskKey" }
33
- }
34
- }
35
- },
36
- "expect": [
37
- {
38
- "kind": "require-file",
39
- "path": {
40
- "artifact": {
41
- "kind": "jira-task-file",
42
- "taskKey": { "ref": "params.taskKey" }
43
- }
44
- },
45
- "message": "Jira fetch node did not produce the Jira task file."
46
- },
47
- {
48
- "kind": "require-file",
49
- "path": {
50
- "artifact": {
51
- "kind": "jira-attachments-manifest-file",
52
- "taskKey": { "ref": "params.taskKey" }
53
- }
54
- },
55
- "message": "Jira fetch node did not produce the Jira attachments manifest file."
56
- },
57
- {
58
- "kind": "require-file",
59
- "path": {
60
- "artifact": {
61
- "kind": "jira-attachments-context-file",
62
- "taskKey": { "ref": "params.taskKey" }
63
- }
64
- },
65
- "message": "Jira fetch node did not produce the Jira attachments context file."
66
- }
67
- ]
68
- },
69
- {
70
- "id": "generate_planning_questions",
71
- "node": "llm-prompt",
72
- "prompt": {
73
- "templateRef": "plan-questions",
74
- "vars": {
75
- "jira_task_file": {
76
- "artifact": {
77
- "kind": "jira-task-file",
78
- "taskKey": { "ref": "params.taskKey" }
79
- }
80
- },
81
- "jira_attachments_manifest_file": {
82
- "artifact": {
83
- "kind": "jira-attachments-manifest-file",
84
- "taskKey": { "ref": "params.taskKey" }
85
- }
86
- },
87
- "jira_attachments_context_file": {
88
- "artifact": {
89
- "kind": "jira-attachments-context-file",
90
- "taskKey": { "ref": "params.taskKey" }
91
- }
92
- },
93
- "planning_questions_json_file": {
94
- "artifact": {
95
- "kind": "planning-questions-json-file",
96
- "taskKey": { "ref": "params.taskKey" }
97
- }
98
- }
99
- },
100
- "extraPrompt": { "ref": "params.extraPrompt" },
101
- "format": "task-prompt"
102
- },
103
- "params": {
104
- "labelText": { "const": "Generating planning questions" },
105
- "model": { "ref": "params.llmModel" },
106
- "executor": { "ref": "params.llmExecutor" },
107
- "requiredArtifacts": {
108
- "list": [
109
- {
110
- "artifact": {
111
- "kind": "planning-questions-json-file",
112
- "taskKey": { "ref": "params.taskKey" }
113
- }
114
- }
115
- ]
116
- }
117
- },
118
- "expect": [
119
- {
120
- "kind": "require-artifacts",
121
- "when": { "not": { "ref": "context.dryRun" } },
122
- "paths": {
123
- "list": [
124
- {
125
- "artifact": {
126
- "kind": "planning-questions-json-file",
127
- "taskKey": { "ref": "params.taskKey" }
128
- }
129
- }
130
- ]
131
- },
132
- "message": "Planning questions step did not produce the questions artifact."
133
- },
134
- {
135
- "kind": "require-structured-artifacts",
136
- "when": { "not": { "ref": "context.dryRun" } },
137
- "items": [
138
- {
139
- "path": {
140
- "artifact": {
141
- "kind": "planning-questions-json-file",
142
- "taskKey": { "ref": "params.taskKey" }
143
- }
144
- },
145
- "schemaId": "planning-questions/v1"
146
- }
147
- ],
148
- "message": "Planning questions step produced invalid structured artifacts."
149
- }
150
- ]
151
- },
152
- {
153
- "id": "build_planning_questions_form",
154
- "node": "planning-questions-form",
155
- "params": {
156
- "planningQuestionsJsonFile": {
157
- "artifact": {
158
- "kind": "planning-questions-json-file",
159
- "taskKey": { "ref": "params.taskKey" }
160
- }
161
- },
162
- "formId": { "const": "planning-questions" },
163
- "title": { "const": "Planning Questions" },
164
- "description": {
165
- "const": "Reply to model questions if they are needed for accurate design and plan. If there are no questions, the step will complete automatically."
166
- }
19
+ "taskKey": { "ref": "params.taskKey" }
167
20
  }
168
- },
21
+ }
22
+ ]
23
+ },
24
+ {
25
+ "id": "normalize",
26
+ "steps": [
169
27
  {
170
- "id": "notify_planning_questions",
171
- "when": { "not": { "equals": [{ "ref": "steps.plan.build_planning_questions_form.value.questionCount" }, { "const": 0 }] } },
172
- "node": "telegram-notify",
28
+ "id": "run_normalize_source",
29
+ "node": "flow-run",
173
30
  "params": {
174
- "message": {
175
- "template": "Planning questions generated for {taskKey}. Please review and answer if needed.",
176
- "vars": {
177
- "taskKey": { "ref": "params.taskKey" }
178
- }
179
- }
31
+ "fileName": { "const": "normalize-task-source.json" },
32
+ "labelText": { "const": "Normalizing task source" },
33
+ "taskKey": { "ref": "params.taskKey" },
34
+ "iteration": { "ref": "params.taskContextIteration" },
35
+ "llmExecutor": { "ref": "params.llmExecutor" },
36
+ "llmModel": { "ref": "params.llmModel" },
37
+ "extraPrompt": { "ref": "params.extraPrompt" }
180
38
  }
181
- },
182
- {
183
- "id": "collect_planning_answers",
184
- "node": "user-input",
185
- "params": {
186
- "formId": { "ref": "steps.plan.build_planning_questions_form.value.formId" },
187
- "title": { "ref": "steps.plan.build_planning_questions_form.value.title" },
188
- "description": { "ref": "steps.plan.build_planning_questions_form.value.description" },
189
- "submitLabel": { "const": "Continue planning" },
190
- "fields": { "ref": "steps.plan.build_planning_questions_form.value.fields" },
191
- "outputFile": {
192
- "artifact": {
193
- "kind": "planning-answers-json-file",
194
- "taskKey": { "ref": "params.taskKey" }
195
- }
196
- }
197
- },
198
- "expect": [
199
- {
200
- "kind": "require-structured-artifacts",
201
- "items": [
202
- {
203
- "path": {
204
- "artifact": {
205
- "kind": "planning-answers-json-file",
206
- "taskKey": { "ref": "params.taskKey" }
207
- }
208
- },
209
- "schemaId": "user-input/v1"
210
- }
211
- ],
212
- "message": "Planning answers input is missing or invalid."
213
- }
214
- ]
215
- },
216
- {
217
- "id": "run_plan",
218
- "node": "llm-prompt",
219
- "prompt": {
220
- "templateRef": "plan",
221
- "vars": {
222
- "jira_task_file": {
223
- "artifact": {
224
- "kind": "jira-task-file",
225
- "taskKey": { "ref": "params.taskKey" }
226
- }
227
- },
228
- "jira_attachments_manifest_file": {
229
- "artifact": {
230
- "kind": "jira-attachments-manifest-file",
231
- "taskKey": { "ref": "params.taskKey" }
232
- }
233
- },
234
- "jira_attachments_context_file": {
235
- "artifact": {
236
- "kind": "jira-attachments-context-file",
237
- "taskKey": { "ref": "params.taskKey" }
238
- }
239
- },
240
- "design_file": {
241
- "artifact": {
242
- "kind": "design-file",
243
- "taskKey": { "ref": "params.taskKey" },
244
- "iteration": { "ref": "params.designIteration" }
245
- }
246
- },
247
- "design_json_file": {
248
- "artifact": {
249
- "kind": "design-json-file",
250
- "taskKey": { "ref": "params.taskKey" },
251
- "iteration": { "ref": "params.designIteration" }
252
- }
253
- },
254
- "plan_file": {
255
- "artifact": {
256
- "kind": "plan-file",
257
- "taskKey": { "ref": "params.taskKey" },
258
- "iteration": { "ref": "params.planIteration" }
259
- }
260
- },
261
- "plan_json_file": {
262
- "artifact": {
263
- "kind": "plan-json-file",
264
- "taskKey": { "ref": "params.taskKey" },
265
- "iteration": { "ref": "params.planIteration" }
266
- }
267
- },
268
- "qa_file": {
269
- "artifact": {
270
- "kind": "qa-file",
271
- "taskKey": { "ref": "params.taskKey" },
272
- "iteration": { "ref": "params.qaIteration" }
273
- }
274
- },
275
- "qa_json_file": {
276
- "artifact": {
277
- "kind": "qa-json-file",
278
- "taskKey": { "ref": "params.taskKey" },
279
- "iteration": { "ref": "params.qaIteration" }
280
- }
281
- }
282
- },
283
- "extraPrompt": {
284
- "appendPrompt": {
285
- "base": { "ref": "params.extraPrompt" },
286
- "suffix": { "ref": "steps.plan.collect_planning_answers.value.promptSuffix" }
287
- }
288
- },
289
- "format": "task-prompt"
290
- },
291
- "params": {
292
- "labelText": { "const": "Running planning mode" },
293
- "model": { "ref": "params.llmModel" },
294
- "executor": { "ref": "params.llmExecutor" }
295
- },
296
- "expect": [
297
- {
298
- "kind": "require-artifacts",
299
- "when": { "not": { "ref": "context.dryRun" } },
300
- "paths": {
301
- "artifactList": {
302
- "kind": "plan-artifacts",
303
- "taskKey": { "ref": "params.taskKey" }
304
- }
305
- },
306
- "message": "Plan mode did not produce the required artifacts."
307
- },
308
- {
309
- "kind": "require-structured-artifacts",
310
- "when": { "not": { "ref": "context.dryRun" } },
311
- "items": [
312
- {
313
- "path": {
314
- "artifact": {
315
- "kind": "design-json-file",
316
- "taskKey": { "ref": "params.taskKey" },
317
- "iteration": { "ref": "params.designIteration" }
318
- }
319
- },
320
- "schemaId": "implementation-design/v1"
321
- },
322
- {
323
- "path": {
324
- "artifact": {
325
- "kind": "plan-json-file",
326
- "taskKey": { "ref": "params.taskKey" },
327
- "iteration": { "ref": "params.planIteration" }
328
- }
329
- },
330
- "schemaId": "implementation-plan/v1"
331
- },
332
- {
333
- "path": {
334
- "artifact": {
335
- "kind": "qa-json-file",
336
- "taskKey": { "ref": "params.taskKey" },
337
- "iteration": { "ref": "params.qaIteration" }
338
- }
339
- },
340
- "schemaId": "qa-plan/v1"
341
- }
342
- ],
343
- "message": "Plan mode produced invalid structured artifacts."
344
- }
345
- ]
346
- },
39
+ }
40
+ ]
41
+ },
42
+ {
43
+ "id": "plan",
44
+ "steps": [
347
45
  {
348
- "id": "notify_plan_complete",
349
- "node": "telegram-notify",
46
+ "id": "run_plan_flow",
47
+ "node": "flow-run",
350
48
  "params": {
351
- "message": {
352
- "template": "Plan phase for {taskKey} complete.",
353
- "vars": {
354
- "taskKey": { "ref": "params.taskKey" }
355
- }
356
- }
49
+ "fileName": { "const": "plan.json" },
50
+ "labelText": { "const": "Running planning flow" },
51
+ "taskKey": { "ref": "params.taskKey" },
52
+ "taskContextIteration": { "ref": "params.taskContextIteration" },
53
+ "designIteration": { "ref": "params.designIteration" },
54
+ "planIteration": { "ref": "params.planIteration" },
55
+ "qaIteration": { "ref": "params.qaIteration" },
56
+ "llmExecutor": { "ref": "params.llmExecutor" },
57
+ "llmModel": { "ref": "params.llmModel" },
58
+ "extraPrompt": { "ref": "params.extraPrompt" },
59
+ "mdLang": { "ref": "params.mdLang" }
357
60
  }
358
61
  }
359
62
  ]
@@ -361,36 +64,26 @@
361
64
  {
362
65
  "id": "implement",
363
66
  "steps": [
67
+ {
68
+ "id": "resolve_planning_bundle",
69
+ "node": "planning-bundle",
70
+ "params": {
71
+ "taskKey": { "ref": "params.taskKey" }
72
+ }
73
+ },
364
74
  {
365
75
  "id": "run_implement",
366
76
  "node": "llm-prompt",
77
+ "routingGroup": "implementation",
367
78
  "prompt": {
368
79
  "templateRef": "implement",
369
80
  "vars": {
370
- "design_file": {
371
- "artifact": {
372
- "kind": "design-file",
373
- "taskKey": { "ref": "params.taskKey" }
374
- }
375
- },
376
- "design_json_file": {
377
- "artifact": {
378
- "kind": "design-json-file",
379
- "taskKey": { "ref": "params.taskKey" }
380
- }
381
- },
382
- "plan_file": {
383
- "artifact": {
384
- "kind": "plan-file",
385
- "taskKey": { "ref": "params.taskKey" }
386
- }
387
- },
388
- "plan_json_file": {
389
- "artifact": {
390
- "kind": "plan-json-file",
391
- "taskKey": { "ref": "params.taskKey" }
392
- }
393
- }
81
+ "design_file": { "ref": "steps.implement.resolve_planning_bundle.value.designFile" },
82
+ "design_json_file": { "ref": "steps.implement.resolve_planning_bundle.value.designJsonFile" },
83
+ "plan_file": { "ref": "steps.implement.resolve_planning_bundle.value.planFile" },
84
+ "plan_json_file": { "ref": "steps.implement.resolve_planning_bundle.value.planJsonFile" },
85
+ "qa_file": { "ref": "steps.implement.resolve_planning_bundle.value.qaFile" },
86
+ "qa_json_file": { "ref": "steps.implement.resolve_planning_bundle.value.qaJsonFile" }
394
87
  },
395
88
  "extraPrompt": { "ref": "params.extraPrompt" },
396
89
  "format": "task-prompt"
@@ -482,9 +175,11 @@
482
175
  "fileName": { "const": "review-loop.json" },
483
176
  "labelText": { "const": "Running review-loop" },
484
177
  "taskKey": { "ref": "params.taskKey" },
178
+ "baseIteration": { "ref": "params.baseIteration" },
485
179
  "workspaceDir": { "ref": "params.workspaceDir" },
486
180
  "extraPrompt": { "ref": "params.extraPrompt" },
487
181
  "reviewFixPoints": { "ref": "params.reviewFixPoints" },
182
+ "reviewBlockingSeverities": { "ref": "params.reviewBlockingSeverities" },
488
183
  "llmExecutor": { "ref": "params.llmExecutor" },
489
184
  "llmModel": { "ref": "params.llmModel" }
490
185
  }
@@ -561,4 +256,4 @@
561
256
  ]
562
257
  }
563
258
  ]
564
- }
259
+ }
@@ -0,0 +1,141 @@
1
+ {
2
+ "kind": "auto-flow",
3
+ "version": 1,
4
+ "description": "End-to-end resumable pipeline without language-specific checks. Runs: Jira fetch → task source normalization → plan → implement → review loop. Simplified alternative to auto-golang for projects that do not need Go linter/test loops.",
5
+ "phases": [
6
+ {
7
+ "id": "source",
8
+ "steps": [
9
+ {
10
+ "id": "fetch_jira_source",
11
+ "node": "flow-run",
12
+ "params": {
13
+ "fileName": { "const": "jira-fetch.json" },
14
+ "labelText": { "const": "Fetching Jira task source" },
15
+ "jiraApiUrl": { "ref": "params.jiraApiUrl" },
16
+ "taskKey": { "ref": "params.taskKey" }
17
+ }
18
+ }
19
+ ]
20
+ },
21
+ {
22
+ "id": "normalize",
23
+ "steps": [
24
+ {
25
+ "id": "run_normalize_source",
26
+ "node": "flow-run",
27
+ "params": {
28
+ "fileName": { "const": "normalize-task-source.json" },
29
+ "labelText": { "const": "Normalizing task source" },
30
+ "taskKey": { "ref": "params.taskKey" },
31
+ "iteration": { "ref": "params.taskContextIteration" },
32
+ "llmExecutor": { "ref": "params.llmExecutor" },
33
+ "llmModel": { "ref": "params.llmModel" },
34
+ "extraPrompt": { "ref": "params.extraPrompt" }
35
+ }
36
+ }
37
+ ]
38
+ },
39
+ {
40
+ "id": "plan",
41
+ "steps": [
42
+ {
43
+ "id": "run_plan_flow",
44
+ "node": "flow-run",
45
+ "params": {
46
+ "fileName": { "const": "plan.json" },
47
+ "labelText": { "const": "Running planning flow" },
48
+ "taskKey": { "ref": "params.taskKey" },
49
+ "taskContextIteration": { "ref": "params.taskContextIteration" },
50
+ "designIteration": { "ref": "params.designIteration" },
51
+ "planIteration": { "ref": "params.planIteration" },
52
+ "qaIteration": { "ref": "params.qaIteration" },
53
+ "llmExecutor": { "ref": "params.llmExecutor" },
54
+ "llmModel": { "ref": "params.llmModel" },
55
+ "extraPrompt": { "ref": "params.extraPrompt" },
56
+ "mdLang": { "ref": "params.mdLang" }
57
+ }
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ "id": "implement",
63
+ "steps": [
64
+ {
65
+ "id": "resolve_planning_bundle",
66
+ "node": "planning-bundle",
67
+ "params": {
68
+ "taskKey": { "ref": "params.taskKey" }
69
+ }
70
+ },
71
+ {
72
+ "id": "run_implement",
73
+ "node": "llm-prompt",
74
+ "prompt": {
75
+ "templateRef": "implement",
76
+ "vars": {
77
+ "design_file": { "ref": "steps.implement.resolve_planning_bundle.value.designFile" },
78
+ "design_json_file": { "ref": "steps.implement.resolve_planning_bundle.value.designJsonFile" },
79
+ "plan_file": { "ref": "steps.implement.resolve_planning_bundle.value.planFile" },
80
+ "plan_json_file": { "ref": "steps.implement.resolve_planning_bundle.value.planJsonFile" },
81
+ "qa_file": { "ref": "steps.implement.resolve_planning_bundle.value.qaFile" },
82
+ "qa_json_file": { "ref": "steps.implement.resolve_planning_bundle.value.qaJsonFile" }
83
+ },
84
+ "extraPrompt": { "ref": "params.extraPrompt" },
85
+ "format": "task-prompt"
86
+ },
87
+ "params": {
88
+ "labelText": { "const": "Running implementation mode locally" },
89
+ "model": { "ref": "params.llmModel" },
90
+ "executor": { "ref": "params.llmExecutor" }
91
+ }
92
+ },
93
+ {
94
+ "id": "notify_implement_complete",
95
+ "node": "telegram-notify",
96
+ "params": {
97
+ "message": {
98
+ "template": "Implementation phase for {taskKey} complete.",
99
+ "vars": {
100
+ "taskKey": { "ref": "params.taskKey" }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ ]
106
+ },
107
+ {
108
+ "id": "review-loop",
109
+ "steps": [
110
+ {
111
+ "id": "run_review_loop",
112
+ "node": "flow-run",
113
+ "params": {
114
+ "fileName": { "const": "review-loop.json" },
115
+ "labelText": { "const": "Running review-loop" },
116
+ "taskKey": { "ref": "params.taskKey" },
117
+ "baseIteration": { "ref": "params.baseIteration" },
118
+ "workspaceDir": { "ref": "params.workspaceDir" },
119
+ "extraPrompt": { "ref": "params.extraPrompt" },
120
+ "reviewFixPoints": { "ref": "params.reviewFixPoints" },
121
+ "reviewBlockingSeverities": { "ref": "params.reviewBlockingSeverities" },
122
+ "llmExecutor": { "ref": "params.llmExecutor" },
123
+ "llmModel": { "ref": "params.llmModel" }
124
+ }
125
+ },
126
+ {
127
+ "id": "notify_task_complete",
128
+ "node": "telegram-notify",
129
+ "params": {
130
+ "message": {
131
+ "template": "Task {taskKey} complete.",
132
+ "vars": {
133
+ "taskKey": { "ref": "params.taskKey" }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ ]
139
+ }
140
+ ]
141
+ }
@@ -90,6 +90,7 @@
90
90
  ]
91
91
  },
92
92
  "node": "llm-prompt",
93
+ "routingGroup": "planning",
93
94
  "prompt": {
94
95
  "templateRef": "task-summary",
95
96
  "vars": {
@@ -191,6 +192,7 @@
191
192
  {
192
193
  "id": "run_bug_analyze",
193
194
  "node": "llm-prompt",
195
+ "routingGroup": "planning",
194
196
  "prompt": {
195
197
  "templateRef": "bug-analyze",
196
198
  "vars": {
@@ -9,6 +9,7 @@
9
9
  {
10
10
  "id": "run_bug_fix",
11
11
  "node": "llm-prompt",
12
+ "routingGroup": "implementation",
12
13
  "prompt": {
13
14
  "templateRef": "bug-fix",
14
15
  "vars": {