workflow-ai 1.0.0 → 1.0.2

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.
@@ -1,422 +1,428 @@
1
- # =============================================================================
2
- # Pipeline Configuration — формат конфигурации пайплайна
3
- # =============================================================================
4
- # Описывает цепочку этапов (stages), доступных агентов, goto-логику переходов,
5
- # retry-стратегии и настройки выполнения.
6
- #
7
- # Runner читает этот файл и автономно оркестрирует работу:
8
- # node .workflow/src/runner.mjs --config .workflow/config/pipeline.yaml
9
- #
10
- # Переменные в goto.params:
11
- # $result.* — поля из результата текущего stage
12
- # $context.* — переменные из секции context (обновляются через params)
13
- # $counter.* — значения счётчиков (обновляются стейджами type: update-counter)
14
- # =============================================================================
15
-
16
- pipeline:
17
- name: "default"
18
- version: "1.0"
19
-
20
- # ===========================================================================
21
- # Агенты (agents)
22
- # ===========================================================================
23
- # Каждый агент — это CLI-инструмент, который runner вызывает через child_process.
24
- # Формат:
25
- # <agent-id>:
26
- # command: <string> — исполняемый файл (должен быть в PATH)
27
- # args: <string[]> — аргументы командной строки
28
- # workdir: <string> — рабочая директория (по умолчанию ".")
29
- # description: <string> — описание агента (опционально)
30
- #
31
- # Runner добавляет промпт последним аргументом автоматически.
32
- # ===========================================================================
33
- agents:
34
- claude-sonnet:
35
- command: "claude"
36
- args: ["--model", "claude-sonnet-4-6", "--permission-mode", "acceptEdits", "-p"]
37
- workdir: "."
38
- description: "Claude Sonnet — быстрая модель для простых задач"
39
-
40
- claude-opus:
41
- command: "claude"
42
- args: ["--model", "claude-opus-4-6", "--permission-mode", "acceptEdits", "-p"]
43
- workdir: "."
44
- description: "Claude Opus — мощная модель для сложных задач"
45
-
46
- qwen-code:
47
- command: "qwen"
48
- args: ["-y", "-d", "-p"]
49
- workdir: "."
50
- description: "Qwen Code — альтернативный агент для независимой проверки"
51
-
52
- kilo-code:
53
- command: "kilo"
54
- args: ["-m", "kilo/minimax/minimax-m2.5:free", "--agent", "orchestrator", "run"]
55
- workdir: "."
56
- description: "Kilo Code — агент с мульти-режимами (architect, code, debug)"
57
-
58
- kilo-glm:
59
- command: "kilo"
60
- args: ["-m", "zai-coding-plan/glm-4.7", "--agent", "orchestrator", "run"]
61
- workdir: "."
62
- description: "Kilo GLM"
63
-
64
- kilo-deepseek:
65
- command: "kilo"
66
- args: ["-m", "deepseek/deepseek-reasoner", "--agent", "code", "run"]
67
- workdir: "."
68
- description: "Kilo deepseek"
69
-
70
- script-move:
71
- command: "node"
72
- args: [".workflow/src/scripts/move-ticket.js"]
73
- workdir: "."
74
- description: "Скрипт для перемещения тикетов между директориями"
75
-
76
- script-pick:
77
- command: "node"
78
- args: [".workflow/src/scripts/pick-next-task.js"]
79
- workdir: "."
80
- description: "Скрипт для выбора следующего тикета из ready/"
81
-
82
- script-move-ready:
83
- command: "node"
84
- args: [".workflow/src/scripts/move-to-ready.js"]
85
- workdir: "."
86
- description: "Скрипт для перемещения тикетов из backlog/ в ready/"
87
-
88
- script-move-to-review:
89
- command: "node"
90
- args: [".workflow/src/scripts/move-to-review.js"]
91
- workdir: "."
92
- description: "Скрипт для перемещения завершённых тикетов из in-progress/ в review/"
93
-
94
- # ===========================================================================
95
- # Этапы (stages)
96
- # ===========================================================================
97
- # Каждый stage описывает один шаг пайплайна.
98
- # Формат:
99
- # <stage-id>:
100
- # description: <string> — что делает этот этап
101
- # agent: <agent-id> — какой агент выполняет (ссылка на agents.*)
102
- # skill: <skill-id> — какой skill использовать (файл .workflow/src/skills/<skill>/SKILL.md)
103
- # goto: — логика переходов по результату
104
- # <status>: — ключ = статус результата агента
105
- # stage: <stage-id> — следующий stage
106
- # params: <map> параметры, передаваемые в context следующего stage
107
- # default: fallback если статус не совпал ни с одним ключом
108
- #
109
- # Специальные значения stage:
110
- # "end" завершение пайплайна
111
- #
112
- # Встроенный тип стейджа (type: update-counter):
113
- # Инкрементирует счётчик без вызова агента.
114
- # type: update-counter — встроенный обработчик runner'а
115
- # counter: <string> — имя счётчика
116
- # max: <int> при достижении max возвращает статус "max_reached"
117
- # goto:
118
- # default: <stage> — следующий стейдж (счётчик < max)
119
- # max_reached: <stage> стейдж при достижении max
120
- # ===========================================================================
121
- stages:
122
-
123
- # -------------------------------------------------------------------------
124
- # 0. pick-first-task
125
- # Выбирает следующую задачу из ready/ по приоритету и зависимостям
126
- # Если ready/ пуст — проверяет review/
127
- # -------------------------------------------------------------------------
128
- pick-first-task:
129
- description: "Выбрать задачу задачу из ready по приоритету"
130
- agent: script-pick
131
- goto:
132
- found:
133
- stage: move-to-in-progress
134
- params:
135
- ticket_id: "$result.ticket_id"
136
- target: in-progress
137
- in_review:
138
- stage: review-result
139
- params:
140
- ticket_id: "$result.ticket_id"
141
- attempt: "1"
142
- completed_in_progress:
143
- stage: move-to-review
144
- params:
145
- ticket_id: "$result.ticket_id"
146
- empty: check-conditions
147
- error: create-report
148
-
149
- # -------------------------------------------------------------------------
150
- # 1. check-conditions
151
- # Проверяет условия тикетов в backlog/, выводит список готовых
152
- # -------------------------------------------------------------------------
153
- check-conditions:
154
- description: "Проверить условия тикетов в backlog, вывести готовые"
155
- agent: kilo-code
156
- fallback_agent: qwen-code
157
- skill: check-conditions
158
- goto:
159
- has_ready:
160
- stage: move-to-ready
161
- params:
162
- ready_tickets: "$result.ready_tickets"
163
- default: create-report
164
-
165
- # -------------------------------------------------------------------------
166
- # 1b. move-to-ready
167
- # Перемещает тикеты из backlog/ в ready/ (по списку из check-conditions)
168
- # -------------------------------------------------------------------------
169
- move-to-ready:
170
- description: "Переместить готовые тикеты из backlog в ready"
171
- agent: script-move-ready
172
- timeout: 120
173
- goto:
174
- default: pick-next-task
175
-
176
- # -------------------------------------------------------------------------
177
- # 2. pick-next-task
178
- # Выбирает следующую задачу из ready/ по приоритету и зависимостям
179
- # Если ready/ пуст — проверяет review/
180
- # -------------------------------------------------------------------------
181
- pick-next-task:
182
- description: "Выбрать следующую задачу из ready по приоритету"
183
- agent: script-pick
184
- goto:
185
- found:
186
- stage: move-to-in-progress
187
- params:
188
- ticket_id: "$result.ticket_id"
189
- target: in-progress
190
- in_review:
191
- stage: review-result
192
- params:
193
- ticket_id: "$result.ticket_id"
194
- attempt: "1"
195
- completed_in_progress:
196
- stage: move-to-review
197
- params:
198
- ticket_id: "$result.ticket_id"
199
- empty: check-conditions
200
- error: create-report
201
-
202
- # -------------------------------------------------------------------------
203
- # 2b. move-to-in-progress
204
- # Перемещает тикет из ready/ в in-progress/ перед выполнением
205
- # -------------------------------------------------------------------------
206
- move-to-in-progress:
207
- description: "Переместить тикет из ready в in-progress"
208
- agent: script-move
209
- timeout: 120
210
- goto:
211
- default:
212
- stage: execute-task
213
- params:
214
- ticket_id: "$context.ticket_id"
215
- error:
216
- stage: execute-task
217
- params:
218
- ticket_id: "$context.ticket_id"
219
-
220
-
221
- # -------------------------------------------------------------------------
222
- # 3. execute-task
223
- # Выполняет выбранную задачу (код, документация, план и т.д.)
224
- # -------------------------------------------------------------------------
225
- execute-task:
226
- description: "Выполнить выбранную задачу"
227
- agent: qwen-code
228
- fallback_agent: kilo-deepseek
229
- skill: execute-task
230
- goto:
231
- default:
232
- stage: move-to-review
233
- params:
234
- ticket_id: "$context.ticket_id"
235
- attempt: "$counter.task_attempts"
236
- target: review
237
- error:
238
- stage: move-to-review
239
- params:
240
- ticket_id: "$context.ticket_id"
241
- attempt: "$counter.task_attempts"
242
- target: review
243
-
244
- # -------------------------------------------------------------------------
245
- # 3b. move-to-review
246
- # Перемещает тикет в review/ после выполнения задачи
247
- # -------------------------------------------------------------------------
248
- move-to-review:
249
- description: "Переместить тикет в review после выполнения"
250
- agent: script-move-to-review
251
- timeout: 120
252
- goto:
253
- default:
254
- stage: review-result
255
- params:
256
- ticket_id: "$context.ticket_id"
257
- attempt: "$counter.task_attempts"
258
-
259
- # -------------------------------------------------------------------------
260
- # 4. review-result
261
- # Проверяет результат выполнения на соответствие DoD тикета.
262
- # Использует независимый агент (qwen-code) для объективной оценки.
263
- # При failed — переходит на increment-task-attempts для учёта попытки.
264
- # -------------------------------------------------------------------------
265
- review-result:
266
- description: "Проверить результат выполнения на соответствие DoD тикета"
267
- agent: claude-sonnet
268
- fallback_agent: qwen-code
269
- skill: review-result
270
- goto:
271
- passed:
272
- stage: move-ticket
273
- params:
274
- ticket_id: "$context.ticket_id"
275
- target: done
276
- failed:
277
- stage: increment-task-attempts
278
- params:
279
- ticket_id: "$context.ticket_id"
280
- default:
281
- stage: move-ticket
282
- params:
283
- ticket_id: "$context.ticket_id"
284
- target: blocked
285
-
286
- # -------------------------------------------------------------------------
287
- # 4b. increment-task-attempts
288
- # Отдельный стейдж обновления счётчика попыток выполнения тикета.
289
- # При достижении max — блокирует тикет. Иначе — возвращает в очередь.
290
- # -------------------------------------------------------------------------
291
- increment-task-attempts:
292
- description: "Обновить счётчик попыток выполнения тикета"
293
- type: update-counter
294
- counter: task_attempts
295
- max: 3
296
- goto:
297
- default:
298
- stage: move-ticket
299
- params:
300
- ticket_id: "$context.ticket_id"
301
- target: ready
302
- max_reached:
303
- stage: move-ticket
304
- params:
305
- ticket_id: "$context.ticket_id"
306
- target: blocked
307
-
308
- # -------------------------------------------------------------------------
309
- # 5. move-ticket
310
- # Перемещает тикет в целевую директорию (done/ или blocked/)
311
- # -------------------------------------------------------------------------
312
- move-ticket:
313
- description: "Переместить тикет (done / blocked)"
314
- agent: script-move
315
- timeout: 120
316
- goto:
317
- default: pick-next-task
318
-
319
- # -------------------------------------------------------------------------
320
- # 6. create-report
321
- # Создаёт итоговый отчёт по выполненным задачам текущего цикла
322
- # -------------------------------------------------------------------------
323
- create-report:
324
- description: "Создать итоговый отчёт по выполненным задачам"
325
- agent: claude-sonnet
326
- fallback_agent: qwen-code
327
- skill: create-report
328
- goto:
329
- default:
330
- stage: analyze-report
331
- params:
332
- report_id: "$result.report_id"
333
-
334
- # -------------------------------------------------------------------------
335
- # 7. analyze-report
336
- # Анализирует отчёт: план выполнен полностью или есть пробелы?
337
- # При has_gaps — переходит на increment-plan-iterations для учёта итерации.
338
- # -------------------------------------------------------------------------
339
- analyze-report:
340
- description: "Проанализировать отчёт: план выполнен полностью?"
341
- agent: claude-opus
342
- fallback_agent: qwen-code
343
- skill: analyze-report
344
- goto:
345
- completed: end
346
- has_gaps:
347
- stage: increment-plan-iterations
348
- params:
349
- gaps: "$result.gaps"
350
- report_id: "$context.report_id"
351
-
352
- # -------------------------------------------------------------------------
353
- # 7b. increment-plan-iterations
354
- # Отдельный стейдж обновления счётчика итераций анализа плана.
355
- # При достижении max — завершает пайплайн. Иначе — декомпозирует пробелы.
356
- # -------------------------------------------------------------------------
357
- increment-plan-iterations:
358
- description: "Обновить счётчик итераций анализа плана"
359
- type: update-counter
360
- counter: plan_iterations
361
- max: 3
362
- goto:
363
- default:
364
- stage: decompose-gaps
365
- max_reached: end
366
-
367
- # -------------------------------------------------------------------------
368
- # 8. decompose-gaps
369
- # Декомпозирует недочёты из анализа отчёта в новые тикеты (backlog/)
370
- # -------------------------------------------------------------------------
371
- decompose-gaps:
372
- description: "Декомпозировать недочёты из отчёта в новые тикеты"
373
- agent: claude-sonnet
374
- fallback_agent: qwen-code
375
- skill: decompose-gaps
376
- goto:
377
- default: check-conditions
378
-
379
- # ===========================================================================
380
- # Точка входа (entry)
381
- # ===========================================================================
382
- # Stage, с которого начинается выполнение пайплайна.
383
- # ===========================================================================
384
- entry: pick-first-task
385
-
386
- # ===========================================================================
387
- # Контекст (context)
388
- # ===========================================================================
389
- # Переменные, доступные всем stages через $context.*.
390
- # Runner автоматически обновляет context через params в goto-переходах.
391
- # Начальные значения задаются здесь или через CLI:
392
- # node runner.mjs --plan PLAN-003
393
- # ===========================================================================
394
- context:
395
- plan_id: "" # ID плана (задаётся при запуске)
396
-
397
- # ===========================================================================
398
- # Защита файлов (protected_files)
399
- # ===========================================================================
400
- # Glob-паттерны файлов, в которые агентам запрещена запись.
401
- # Runner проверяет эти паттерны и блокирует изменения.
402
- # Пути указываются относительно корня проекта (без префикса .workflow/)
403
- # ===========================================================================
404
- protected_files:
405
- - ".workflow/plans/**" # Планы — только для чтения
406
- - ".workflow/config/**" # Конфигурация
407
-
408
- # ===========================================================================
409
- # Настройки выполнения (execution)
410
- # ===========================================================================
411
- # Параметры, управляющие поведением runner'а.
412
- #
413
- # max_steps: — абсолютный лимит шагов за один запуск (защита от зацикливания)
414
- # delay_between_stages: — пауза между этапами в секундах
415
- # timeout_per_stage: — таймаут на один этап в секундах (по истечении — ошибка)
416
- # log_file: — путь к файлу логов (относительно корня проекта)
417
- # ===========================================================================
418
- execution:
419
- max_steps: 100
420
- delay_between_stages: 5
421
- timeout_per_stage: 600
422
- log_file: ".workflow/logs/pipeline.log"
1
+ # =============================================================================
2
+ # Pipeline Configuration — формат конфигурации пайплайна
3
+ # =============================================================================
4
+ # Описывает цепочку этапов (stages), доступных агентов, goto-логику переходов,
5
+ # retry-стратегии и настройки выполнения.
6
+ #
7
+ # Runner читает этот файл и автономно оркестрирует работу:
8
+ # node .workflow/src/runner.mjs --config .workflow/config/pipeline.yaml
9
+ #
10
+ # Переменные в goto.params:
11
+ # $result.* — поля из результата текущего stage
12
+ # $context.* — переменные из секции context (обновляются через params)
13
+ # $counter.* — значения счётчиков (обновляются стейджами type: update-counter)
14
+ # =============================================================================
15
+
16
+ pipeline:
17
+ name: "default"
18
+ version: "1.0"
19
+
20
+ # ===========================================================================
21
+ # Агенты (agents)
22
+ # ===========================================================================
23
+ # Каждый агент — это CLI-инструмент, который runner вызывает через child_process.
24
+ # Формат:
25
+ # <agent-id>:
26
+ # command: <string> — исполняемый файл (должен быть в PATH)
27
+ # args: <string[]> — аргументы командной строки
28
+ # workdir: <string> — рабочая директория (по умолчанию ".")
29
+ # description: <string> — описание агента (опционально)
30
+ #
31
+ # Runner добавляет промпт последним аргументом автоматически.
32
+ # ===========================================================================
33
+ agents:
34
+ claude-sonnet:
35
+ command: "claude"
36
+ args: ["--model", "claude-sonnet-4-6", "--permission-mode", "acceptEdits", "-p"]
37
+ workdir: "."
38
+ description: "Claude Sonnet — быстрая модель для простых задач"
39
+
40
+ claude-opus:
41
+ command: "claude"
42
+ args: ["--model", "claude-opus-4-6", "--permission-mode", "acceptEdits", "-p"]
43
+ workdir: "."
44
+ description: "Claude Opus — мощная модель для сложных задач"
45
+
46
+ qwen-code:
47
+ command: "qwen"
48
+ args: ["-y", "-p"]
49
+ workdir: "."
50
+ description: "Qwen Code — альтернативный агент для независимой проверки"
51
+
52
+ kilo-code:
53
+ command: "kilo"
54
+ args: ["-m", "kilo/minimax/minimax-m2.5:free", "--agent", "orchestrator", "run"]
55
+ workdir: "."
56
+ description: "Kilo Code — агент с мульти-режимами (architect, code, debug)"
57
+
58
+ kilo-glm:
59
+ command: "kilo"
60
+ args: ["-m", "zai-coding-plan/glm-4.7", "--agent", "orchestrator", "run"]
61
+ workdir: "."
62
+ description: "Kilo GLM"
63
+
64
+ kilo-deepseek:
65
+ command: "kilo"
66
+ args: ["-m", "deepseek/deepseek-reasoner", "--agent", "code", "run"]
67
+ workdir: "."
68
+ description: "Kilo deepseek"
69
+
70
+ script-move:
71
+ command: "node"
72
+ args: [".workflow/src/scripts/move-ticket.js"]
73
+ workdir: "."
74
+ description: "Скрипт для перемещения тикетов между директориями"
75
+
76
+ script-pick:
77
+ command: "node"
78
+ args: [".workflow/src/scripts/pick-next-task.js"]
79
+ workdir: "."
80
+ description: "Скрипт для выбора следующего тикета из ready/"
81
+
82
+ script-move-ready:
83
+ command: "node"
84
+ args: [".workflow/src/scripts/move-to-ready.js"]
85
+ workdir: "."
86
+ description: "Скрипт для перемещения тикетов из backlog/ в ready/"
87
+
88
+ script-check-conditions:
89
+ command: "node"
90
+ args: [".workflow/src/scripts/check-conditions.js"]
91
+ workdir: "."
92
+ description: "Скрипт для проверки условий тикетов в backlog/"
93
+
94
+ script-move-to-review:
95
+ command: "node"
96
+ args: [".workflow/src/scripts/move-to-review.js"]
97
+ workdir: "."
98
+ description: "Скрипт для перемещения завершённых тикетов из in-progress/ в review/"
99
+
100
+ # ===========================================================================
101
+ # Этапы (stages)
102
+ # ===========================================================================
103
+ # Каждый stage описывает один шаг пайплайна.
104
+ # Формат:
105
+ # <stage-id>:
106
+ # description: <string> что делает этот этап
107
+ # agent: <agent-id> какой агент выполняет (ссылка на agents.*)
108
+ # skill: <skill-id> — какой skill использовать (файл .workflow/src/skills/<skill>/SKILL.md)
109
+ # goto: — логика переходов по результату
110
+ # <status>: ключ = статус результата агента
111
+ # stage: <stage-id> — следующий stage
112
+ # params: <map> — параметры, передаваемые в context следующего stage
113
+ # default: — fallback если статус не совпал ни с одним ключом
114
+ #
115
+ # Специальные значения stage:
116
+ # "end" завершение пайплайна
117
+ #
118
+ # Встроенный тип стейджа (type: update-counter):
119
+ # Инкрементирует счётчик без вызова агента.
120
+ # type: update-counter — встроенный обработчик runner'а
121
+ # counter: <string> — имя счётчика
122
+ # max: <int> — при достижении max возвращает статус "max_reached"
123
+ # goto:
124
+ # default: <stage> — следующий стейдж (счётчик < max)
125
+ # max_reached: <stage> — стейдж при достижении max
126
+ # ===========================================================================
127
+ stages:
128
+
129
+ # -------------------------------------------------------------------------
130
+ # 0. pick-first-task
131
+ # Выбирает следующую задачу из ready/ по приоритету и зависимостям
132
+ # Если ready/ пуст — проверяет review/
133
+ # -------------------------------------------------------------------------
134
+ pick-first-task:
135
+ description: "Выбрать задачу задачу из ready по приоритету"
136
+ agent: script-pick
137
+ goto:
138
+ found:
139
+ stage: move-to-in-progress
140
+ params:
141
+ ticket_id: "$result.ticket_id"
142
+ target: in-progress
143
+ in_review:
144
+ stage: review-result
145
+ params:
146
+ ticket_id: "$result.ticket_id"
147
+ attempt: "1"
148
+ completed_in_progress:
149
+ stage: move-to-review
150
+ params:
151
+ ticket_id: "$result.ticket_id"
152
+ empty: check-conditions
153
+ error: create-report
154
+
155
+ # -------------------------------------------------------------------------
156
+ # 1. check-conditions
157
+ # Проверяет условия тикетов в backlog/, выводит список готовых
158
+ # -------------------------------------------------------------------------
159
+ check-conditions:
160
+ description: "Проверить условия тикетов в backlog, вывести готовые"
161
+ agent: script-check-conditions
162
+ goto:
163
+ has_ready:
164
+ stage: move-to-ready
165
+ params:
166
+ ready_tickets: "$result.ready_tickets"
167
+ default: pick-next-task
168
+ empty: create-report
169
+ error: create-report
170
+
171
+ # -------------------------------------------------------------------------
172
+ # 1b. move-to-ready
173
+ # Перемещает тикеты из backlog/ в ready/ (по списку из check-conditions)
174
+ # -------------------------------------------------------------------------
175
+ move-to-ready:
176
+ description: "Переместить готовые тикеты из backlog в ready"
177
+ agent: script-move-ready
178
+ timeout: 120
179
+ goto:
180
+ default: pick-next-task
181
+
182
+ # -------------------------------------------------------------------------
183
+ # 2. pick-next-task
184
+ # Выбирает следующую задачу из ready/ по приоритету и зависимостям
185
+ # Если ready/ пуст — проверяет review/
186
+ # -------------------------------------------------------------------------
187
+ pick-next-task:
188
+ description: "Выбрать следующую задачу из ready по приоритету"
189
+ agent: script-pick
190
+ goto:
191
+ found:
192
+ stage: move-to-in-progress
193
+ params:
194
+ ticket_id: "$result.ticket_id"
195
+ target: in-progress
196
+ in_review:
197
+ stage: review-result
198
+ params:
199
+ ticket_id: "$result.ticket_id"
200
+ attempt: "1"
201
+ completed_in_progress:
202
+ stage: move-to-review
203
+ params:
204
+ ticket_id: "$result.ticket_id"
205
+ empty: check-conditions
206
+ error: create-report
207
+
208
+ # -------------------------------------------------------------------------
209
+ # 2b. move-to-in-progress
210
+ # Перемещает тикет из ready/ в in-progress/ перед выполнением
211
+ # -------------------------------------------------------------------------
212
+ move-to-in-progress:
213
+ description: "Переместить тикет из ready в in-progress"
214
+ agent: script-move
215
+ timeout: 120
216
+ goto:
217
+ default:
218
+ stage: execute-task
219
+ params:
220
+ ticket_id: "$context.ticket_id"
221
+ error:
222
+ stage: execute-task
223
+ params:
224
+ ticket_id: "$context.ticket_id"
225
+
226
+
227
+ # -------------------------------------------------------------------------
228
+ # 3. execute-task
229
+ # Выполняет выбранную задачу (код, документация, план и т.д.)
230
+ # -------------------------------------------------------------------------
231
+ execute-task:
232
+ description: "Выполнить выбранную задачу"
233
+ agent: qwen-code
234
+ fallback_agent: kilo-deepseek
235
+ skill: execute-task
236
+ goto:
237
+ default:
238
+ stage: move-to-review
239
+ params:
240
+ ticket_id: "$context.ticket_id"
241
+ attempt: "$counter.task_attempts"
242
+ target: review
243
+ error:
244
+ stage: move-to-review
245
+ params:
246
+ ticket_id: "$context.ticket_id"
247
+ attempt: "$counter.task_attempts"
248
+ target: review
249
+
250
+ # -------------------------------------------------------------------------
251
+ # 3b. move-to-review
252
+ # Перемещает тикет в review/ после выполнения задачи
253
+ # -------------------------------------------------------------------------
254
+ move-to-review:
255
+ description: "Переместить тикет в review после выполнения"
256
+ agent: script-move-to-review
257
+ timeout: 120
258
+ goto:
259
+ default:
260
+ stage: review-result
261
+ params:
262
+ ticket_id: "$context.ticket_id"
263
+ attempt: "$counter.task_attempts"
264
+
265
+ # -------------------------------------------------------------------------
266
+ # 4. review-result
267
+ # Проверяет результат выполнения на соответствие DoD тикета.
268
+ # Использует независимый агент (qwen-code) для объективной оценки.
269
+ # При failed — переходит на increment-task-attempts для учёта попытки.
270
+ # -------------------------------------------------------------------------
271
+ review-result:
272
+ description: "Проверить результат выполнения на соответствие DoD тикета"
273
+ agent: claude-sonnet
274
+ fallback_agent: qwen-code
275
+ skill: review-result
276
+ goto:
277
+ passed:
278
+ stage: move-ticket
279
+ params:
280
+ ticket_id: "$context.ticket_id"
281
+ target: done
282
+ failed:
283
+ stage: increment-task-attempts
284
+ params:
285
+ ticket_id: "$context.ticket_id"
286
+ default:
287
+ stage: move-ticket
288
+ params:
289
+ ticket_id: "$context.ticket_id"
290
+ target: blocked
291
+
292
+ # -------------------------------------------------------------------------
293
+ # 4b. increment-task-attempts
294
+ # Отдельный стейдж обновления счётчика попыток выполнения тикета.
295
+ # При достижении max — блокирует тикет. Иначе — возвращает в очередь.
296
+ # -------------------------------------------------------------------------
297
+ increment-task-attempts:
298
+ description: "Обновить счётчик попыток выполнения тикета"
299
+ type: update-counter
300
+ counter: task_attempts
301
+ max: 3
302
+ goto:
303
+ default:
304
+ stage: move-ticket
305
+ params:
306
+ ticket_id: "$context.ticket_id"
307
+ target: ready
308
+ max_reached:
309
+ stage: move-ticket
310
+ params:
311
+ ticket_id: "$context.ticket_id"
312
+ target: blocked
313
+
314
+ # -------------------------------------------------------------------------
315
+ # 5. move-ticket
316
+ # Перемещает тикет в целевую директорию (done/ или blocked/)
317
+ # -------------------------------------------------------------------------
318
+ move-ticket:
319
+ description: "Переместить тикет (done / blocked)"
320
+ agent: script-move
321
+ timeout: 120
322
+ goto:
323
+ default: pick-next-task
324
+
325
+ # -------------------------------------------------------------------------
326
+ # 6. create-report
327
+ # Создаёт итоговый отчёт по выполненным задачам текущего цикла
328
+ # -------------------------------------------------------------------------
329
+ create-report:
330
+ description: "Создать итоговый отчёт по выполненным задачам"
331
+ agent: claude-sonnet
332
+ fallback_agent: qwen-code
333
+ skill: create-report
334
+ goto:
335
+ default:
336
+ stage: analyze-report
337
+ params:
338
+ report_id: "$result.report_id"
339
+
340
+ # -------------------------------------------------------------------------
341
+ # 7. analyze-report
342
+ # Анализирует отчёт: план выполнен полностью или есть пробелы?
343
+ # При has_gaps — переходит на increment-plan-iterations для учёта итерации.
344
+ # -------------------------------------------------------------------------
345
+ analyze-report:
346
+ description: "Проанализировать отчёт: план выполнен полностью?"
347
+ agent: claude-opus
348
+ fallback_agent: qwen-code
349
+ skill: analyze-report
350
+ goto:
351
+ completed: end
352
+ has_gaps:
353
+ stage: increment-plan-iterations
354
+ params:
355
+ gaps: "$result.gaps"
356
+ report_id: "$context.report_id"
357
+
358
+ # -------------------------------------------------------------------------
359
+ # 7b. increment-plan-iterations
360
+ # Отдельный стейдж обновления счётчика итераций анализа плана.
361
+ # При достижении max — завершает пайплайн. Иначе — декомпозирует пробелы.
362
+ # -------------------------------------------------------------------------
363
+ increment-plan-iterations:
364
+ description: "Обновить счётчик итераций анализа плана"
365
+ type: update-counter
366
+ counter: plan_iterations
367
+ max: 3
368
+ goto:
369
+ default:
370
+ stage: decompose-gaps
371
+ max_reached: end
372
+
373
+ # -------------------------------------------------------------------------
374
+ # 8. decompose-gaps
375
+ # Декомпозирует недочёты из анализа отчёта в новые тикеты (backlog/)
376
+ # -------------------------------------------------------------------------
377
+ decompose-gaps:
378
+ description: "Декомпозировать недочёты из отчёта в новые тикеты"
379
+ agent: claude-sonnet
380
+ fallback_agent: qwen-code
381
+ skill: decompose-gaps
382
+ goto:
383
+ default: check-conditions
384
+
385
+ # ===========================================================================
386
+ # Точка входа (entry)
387
+ # ===========================================================================
388
+ # Stage, с которого начинается выполнение пайплайна.
389
+ # ===========================================================================
390
+ entry: pick-first-task
391
+
392
+ # ===========================================================================
393
+ # Контекст (context)
394
+ # ===========================================================================
395
+ # Переменные, доступные всем stages через $context.*.
396
+ # Runner автоматически обновляет context через params в goto-переходах.
397
+ # Начальные значения задаются здесь или через CLI:
398
+ # node runner.mjs --plan PLAN-003
399
+ # ===========================================================================
400
+ context:
401
+ plan_id: "" # ID плана (задаётся при запуске)
402
+
403
+ # ===========================================================================
404
+ # Защита файлов (protected_files)
405
+ # ===========================================================================
406
+ # Glob-паттерны файлов, в которые агентам запрещена запись.
407
+ # Runner проверяет эти паттерны и блокирует изменения.
408
+ # Пути указываются относительно корня проекта (без префикса .workflow/)
409
+ # ===========================================================================
410
+ protected_files:
411
+ - ".workflow/plans/**" # Планы только для чтения
412
+ - ".workflow/config/**" # Конфигурация
413
+
414
+ # ===========================================================================
415
+ # Настройки выполнения (execution)
416
+ # ===========================================================================
417
+ # Параметры, управляющие поведением runner'а.
418
+ #
419
+ # max_steps: абсолютный лимит шагов за один запуск (защита от зацикливания)
420
+ # delay_between_stages: пауза между этапами в секундах
421
+ # timeout_per_stage: таймаут на один этап в секундах (по истечении — ошибка)
422
+ # log_file: путь к файлу логов (относительно корня проекта)
423
+ # ===========================================================================
424
+ execution:
425
+ max_steps: 100
426
+ delay_between_stages: 5
427
+ timeout_per_stage: 1800
428
+ log_file: ".workflow/logs/pipeline.log"