workflow-ai 1.0.59 → 1.0.60

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,592 +0,0 @@
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", "bypassPermissions", "-p"]
37
- workdir: "."
38
- description: "Claude Sonnet — быстрая модель для простых задач"
39
-
40
- claude-opus:
41
- command: "claude"
42
- args: ["--model", "claude-opus-4-6", "--permission-mode", "bypassPermissions", "-p"]
43
- workdir: "."
44
- description: "Claude Opus — мощная модель для сложных задач"
45
-
46
- claude-coach:
47
- command: "claude"
48
- args: ["--model", "claude-opus-4-6", "--permission-mode", "bypassPermissions", "-p", "coach"]
49
- workdir: "."
50
- description: "Claude Opus — coach"
51
-
52
- claude-qa:
53
- command: "claude"
54
- args: ["--model", "claude-sonnet-4-6", "--permission-mode", "bypassPermissions", "-p", "manual-testing"]
55
- workdir: "."
56
- description: "Claude Opus — QA"
57
-
58
- qwen-code:
59
- command: "qwen"
60
- args: ["-y", "-p"]
61
- workdir: "."
62
- description: "Qwen Code — альтернативный агент для независимой проверки"
63
-
64
- kilo-code:
65
- command: "kilo"
66
- args: ["-m", "kilo/minimax/minimax-m2.5:free", "--agent", "orchestrator", "run"]
67
- workdir: "."
68
- description: "Агент с мульти-режимами (architect, code, debug)"
69
-
70
- kilo-glm:
71
- command: "kilo"
72
- args: ["-m", "zai-coding-plan/glm-4.7", "--agent", "orchestrator", "run"]
73
- workdir: "."
74
- description: "Kilo GLM"
75
-
76
- kilo-deepseek:
77
- command: "kilo"
78
- args: ["-m", "deepseek/deepseek-reasoner", "--agent", "code", "run"]
79
- workdir: "."
80
- description: "Kilo deepseek"
81
-
82
- kilo-minimax:
83
- command: "kilo"
84
- args: ["-m", "kilo/minimax/minimax-m2.5:free", "--agent", "code", "run"]
85
- workdir: "."
86
- description: "Kilo minimax"
87
-
88
- script-move:
89
- command: "node"
90
- args: [".workflow/src/scripts/move-ticket.js"]
91
- workdir: "."
92
- description: "Скрипт для перемещения тикетов между директориями"
93
-
94
- script-pick:
95
- command: "node"
96
- args: [".workflow/src/scripts/pick-next-task.js"]
97
- workdir: "."
98
- description: "Скрипт для выбора следующего тикета из ready/"
99
-
100
- script-move-ready:
101
- command: "node"
102
- args: [".workflow/src/scripts/move-to-ready.js"]
103
- workdir: "."
104
- description: "Скрипт для перемещения тикетов из backlog/ в ready/"
105
-
106
- script-check-conditions:
107
- command: "node"
108
- args: [".workflow/src/scripts/check-conditions.js"]
109
- workdir: "."
110
- description: "Скрипт для проверки условий тикетов в backlog/"
111
-
112
- script-check-plan-decomposed:
113
- command: "node"
114
- args: [".workflow/src/scripts/check-plan-decomposed.js"]
115
- workdir: "."
116
- description: "Скрипт для проверки, декомпозирован ли текущий план"
117
-
118
- script-move-to-review:
119
- command: "node"
120
- args: [".workflow/src/scripts/move-to-review.js"]
121
- workdir: "."
122
- description: "Скрипт для перемещения завершённых тикетов из in-progress/ в review/"
123
-
124
- script-check-templates:
125
- command: "node"
126
- args: [".workflow/src/scripts/check-plan-templates.js"]
127
- workdir: "."
128
- description: "Проверка и активация шаблонов планов по триггерам"
129
-
130
-
131
- default_agent: qwen-code
132
-
133
- # ===========================================================================
134
- # Этапы (stages)
135
- # ===========================================================================
136
- # Каждый stage описывает один шаг пайплайна.
137
- # Формат:
138
- # <stage-id>:
139
- # description: <string> — что делает этот этап
140
- # agent: <agent-id> — какой агент выполняет (ссылка на agents.*)
141
- # fallback_agent: <agent-id> — запасной агент, если основной недоступен
142
- # skill: <skill-id> — какой skill использовать (.workflow/src/skills/<skill>/SKILL.md)
143
- # instructions: <string> — доп. инструкции, передаваемые агенту в промпте
144
- # counter: <string> — имя счётчика попыток для этого stage
145
- # agent_by_type: — маршрутизация агента по типу задачи (task_type)
146
- # <type>: <agent-id> — например: impl: claude-sonnet, arch: claude-opus
147
- # <type>: — или расширенный формат с fallback_model:
148
- # agent: <agent-id>
149
- # fallback_model: <agent-id>
150
- # agent_by_attempt: — ротация агента по номеру попытки
151
- # <N>: <agent-id> — например: 1: qwen-code, 2: claude-sonnet
152
- # goto: — логика переходов по результату
153
- # <status>: — ключ = статус результата агента
154
- # stage: <stage-id> — следующий stage
155
- # params: <map> — параметры, передаваемые в context следующего stage
156
- # default: — fallback если статус не совпал ни с одним ключом
157
- #
158
- # Приоритет выбора агента: agent_by_attempt > agent_by_type > agent > default_agent
159
- #
160
- # Специальные значения stage:
161
- # "end" — завершение пайплайна
162
- #
163
- # Встроенный тип стейджа (type: update-counter):
164
- # Инкрементирует счётчик без вызова агента.
165
- # type: update-counter — встроенный обработчик runner'а
166
- # counter: <string> — имя счётчика
167
- # max: <int> — при достижении max возвращает статус "max_reached"
168
- # goto:
169
- # default: <stage> — следующий стейдж (счётчик < max)
170
- # max_reached: <stage> — стейдж при достижении max
171
- # ===========================================================================
172
- stages:
173
-
174
- # -------------------------------------------------------------------------
175
- # 0. pick-first-task
176
- # Выбирает следующую задачу из ready/ по приоритету и зависимостям
177
- # Если ready/ пуст — проверяет review/
178
- # -------------------------------------------------------------------------
179
- pick-first-task:
180
- description: "Выбрать задачу задачу из ready по приоритету"
181
- agent: script-pick
182
- goto:
183
- found:
184
- stage: move-to-in-progress
185
- params:
186
- ticket_id: "$result.ticket_id"
187
- target: in-progress
188
- in_review:
189
- stage: review-result
190
- params:
191
- ticket_id: "$result.ticket_id"
192
- attempt: "1"
193
- completed_in_progress:
194
- stage: move-to-review
195
- params:
196
- ticket_id: "$result.ticket_id"
197
- empty: check-plan-templates
198
- error: create-report
199
-
200
- # -------------------------------------------------------------------------
201
- # 0a. check-plan-templates
202
- # Проверяет шаблоны планов в plans/templates/.
203
- # Если триггер сработал — создаёт план в plans/current/ со статусом approved.
204
- # Всегда переходит на check-plan-decomposition.
205
- # -------------------------------------------------------------------------
206
- check-plan-templates:
207
- description: "Проверить шаблоны планов и создать планы по триггерам"
208
- agent: script-check-templates
209
- goto:
210
- plan_created: check-plan-decomposition
211
- no_triggers: check-plan-decomposition
212
- default: check-plan-decomposition
213
- error: check-plan-decomposition
214
-
215
- # -------------------------------------------------------------------------
216
- # 0b. check-plan-decomposition
217
- # Если нет тикетов — проверяет, есть ли недекомпозированный план.
218
- # Если план не декомпозирован — декомпозирует перед check-conditions.
219
- # -------------------------------------------------------------------------
220
- check-plan-decomposition:
221
- description: "Проверить, декомпозирован ли текущий план"
222
- agent: script-check-plan-decomposed
223
- goto:
224
- needs_decomposition:
225
- stage: decompose-plan
226
- params:
227
- plan_file: "$result.plan_file"
228
- decomposed: check-conditions
229
- no_plan: check-conditions
230
- default: check-conditions
231
- error: check-conditions
232
-
233
- # -------------------------------------------------------------------------
234
- # 0c. decompose-plan
235
- # Декомпозирует план на тикеты в backlog/
236
- # -------------------------------------------------------------------------
237
- decompose-plan:
238
- description: "Декомпозировать план на тикеты"
239
- agent: claude-sonnet
240
- fallback_agent: qwen-code
241
- skill: decompose-plan
242
- instructions: "Декомпозируй план .workflow/$context.plan_file на тикеты."
243
- goto:
244
- default: check-conditions
245
-
246
- # -------------------------------------------------------------------------
247
- # 1. check-conditions
248
- # Проверяет условия тикетов в backlog/, выводит список готовых
249
- # -------------------------------------------------------------------------
250
- check-conditions:
251
- description: "Проверить условия тикетов в backlog, вывести готовые"
252
- agent: script-check-conditions
253
- goto:
254
- has_ready:
255
- stage: move-to-ready
256
- params:
257
- ready_tickets: "$result.ready_tickets"
258
- default: pick-next-task
259
- empty: create-report
260
- error: create-report
261
-
262
- # -------------------------------------------------------------------------
263
- # 1b. move-to-ready
264
- # Перемещает тикеты из backlog/ в ready/ (по списку из check-conditions)
265
- # -------------------------------------------------------------------------
266
- move-to-ready:
267
- description: "Переместить готовые тикеты из backlog в ready"
268
- agent: script-move-ready
269
- timeout: 120
270
- goto:
271
- default: pick-next-task
272
-
273
- # -------------------------------------------------------------------------
274
- # 2. pick-next-task
275
- # Выбирает следующую задачу из ready/ по приоритету и зависимостям
276
- # Если ready/ пуст — проверяет review/
277
- # -------------------------------------------------------------------------
278
- pick-next-task:
279
- description: "Выбрать следующую задачу из ready по приоритету"
280
- agent: script-pick
281
- goto:
282
- found:
283
- stage: move-to-in-progress
284
- params:
285
- ticket_id: "$result.ticket_id"
286
- task_type: "$result.type"
287
- target: in-progress
288
- in_review:
289
- stage: review-result
290
- params:
291
- ticket_id: "$result.ticket_id"
292
- attempt: "1"
293
- completed_in_progress:
294
- stage: move-to-review
295
- params:
296
- ticket_id: "$result.ticket_id"
297
- empty: check-conditions
298
- error: create-report
299
-
300
- # -------------------------------------------------------------------------
301
- # 2b. move-to-in-progress
302
- # Перемещает тикет из ready/ в in-progress/ перед выполнением
303
- # -------------------------------------------------------------------------
304
- move-to-in-progress:
305
- description: "Переместить тикет из ready в in-progress"
306
- agent: script-move
307
- timeout: 120
308
- goto:
309
- default:
310
- stage: check-relevance
311
- params:
312
- ticket_id: "$context.ticket_id"
313
- error:
314
- stage: check-relevance
315
- params:
316
- ticket_id: "$context.ticket_id"
317
-
318
- # -------------------------------------------------------------------------
319
- # 2c. check-relevance
320
- # Проверяет актуальность тикета перед выполнением (план активен, DoD не выполнен)
321
- # Fail-safe: default fallback → execute-task (лучше выполнить лишний, чем пропустить)
322
- # -------------------------------------------------------------------------
323
- check-relevance:
324
- description: "Проверить актуальность тикета перед выполнением"
325
- agent: qwen-code
326
- fallback_agent: claude-sonnet
327
- skill: check-relevance
328
- goto:
329
- relevant:
330
- stage: execute-task
331
- params:
332
- ticket_id: "$context.ticket_id"
333
- irrelevant:
334
- stage: move-ticket
335
- params:
336
- ticket_id: "$context.ticket_id"
337
- target: done
338
- default:
339
- stage: execute-task
340
- params:
341
- ticket_id: "$context.ticket_id"
342
-
343
- # -------------------------------------------------------------------------
344
- # 3. execute-task
345
- # Выполняет выбранную задачу (код, документация, план и т.д.)
346
- # -------------------------------------------------------------------------
347
- execute-task:
348
- description: "Выполнить выбранную задачу"
349
- agent: qwen-code
350
- fallback_agent: kilo-deepseek
351
- skill: execute-task
352
- counter: task_attempts
353
- agent_by_type:
354
- coach:
355
- agent: claude-coach
356
- fallback_model: claude-sonnet
357
- qa:
358
- agent: claude-qa
359
- fallback_model: claude-sonnet
360
- impl:
361
- agent: kilo-minimax
362
- fallback_model: kilo-glm
363
- arch:
364
- agent: claude-opus
365
- fallback_model: claude-sonnet
366
- admin:
367
- agent: kilo-minimax
368
- fallback_model: kilo-glm
369
- agent_by_attempt:
370
- 2: qwen-code
371
- 3: claude-sonnet
372
- 4: claude-opus
373
- 5: kilo-deepseek
374
- goto:
375
- default:
376
- stage: move-to-review
377
- params:
378
- ticket_id: "$context.ticket_id"
379
- attempt: "$counter.task_attempts"
380
- target: review
381
- error:
382
- stage: move-to-review
383
- params:
384
- ticket_id: "$context.ticket_id"
385
- attempt: "$counter.task_attempts"
386
- target: review
387
-
388
- # -------------------------------------------------------------------------
389
- # 3b. move-to-review
390
- # Перемещает тикет в review/ после выполнения задачи
391
- # -------------------------------------------------------------------------
392
- move-to-review:
393
- description: "Переместить тикет в review после выполнения"
394
- agent: script-move-to-review
395
- timeout: 120
396
- goto:
397
- skipped:
398
- stage: pick-next-task
399
- default:
400
- stage: review-result
401
- params:
402
- ticket_id: "$context.ticket_id"
403
- attempt: "$counter.task_attempts"
404
-
405
- # -------------------------------------------------------------------------
406
- # 4. review-result
407
- # Проверяет результат выполнения на соответствие DoD тикета.
408
- # Использует независимый агент (qwen-code) для объективной оценки.
409
- # При failed — переходит на increment-task-attempts для учёта попытки.
410
- # -------------------------------------------------------------------------
411
- review-result:
412
- description: "Проверить результат выполнения на соответствие DoD тикета"
413
- agent: claude-sonnet
414
- fallback_agent: kilo-deepseek
415
- skill: review-result
416
- counter: task_attempts
417
- goto:
418
- passed:
419
- stage: move-ticket
420
- params:
421
- ticket_id: "$context.ticket_id"
422
- target: done
423
- failed:
424
- stage: increment-task-attempts
425
- params:
426
- ticket_id: "$context.ticket_id"
427
- default:
428
- stage: move-ticket
429
- params:
430
- ticket_id: "$context.ticket_id"
431
- target: blocked
432
-
433
- # -------------------------------------------------------------------------
434
- # 4b. increment-task-attempts
435
- # Отдельный стейдж обновления счётчика попыток выполнения тикета.
436
- # При достижении max — блокирует тикет. Иначе — возвращает в очередь.
437
- # -------------------------------------------------------------------------
438
- increment-task-attempts:
439
- description: "Обновить счётчик попыток выполнения тикета"
440
- type: update-counter
441
- counter: task_attempts
442
- max: 6
443
- goto:
444
- default:
445
- stage: move-ticket
446
- params:
447
- ticket_id: "$context.ticket_id"
448
- target: ready
449
- max_reached:
450
- stage: move-ticket
451
- params:
452
- ticket_id: "$context.ticket_id"
453
- target: blocked
454
-
455
- # -------------------------------------------------------------------------
456
- # 5. move-ticket
457
- # Перемещает тикет в целевую директорию (done/ или blocked/)
458
- # -------------------------------------------------------------------------
459
- move-ticket:
460
- description: "Переместить тикет (done / blocked)"
461
- agent: script-move
462
- timeout: 120
463
- goto:
464
- default: pick-next-task
465
- error: pick-next-task
466
-
467
- # -------------------------------------------------------------------------
468
- # 6. create-report
469
- # Создаёт итоговый отчёт по выполненным задачам текущего цикла
470
- # -------------------------------------------------------------------------
471
- create-report:
472
- description: "Создать итоговый отчёт по выполненным задачам"
473
- agent: claude-sonnet
474
- fallback_agent: kilo-deepseek
475
- skill: create-report
476
- goto:
477
- default:
478
- stage: analyze-report
479
- params:
480
- report_id: "$result.report_id"
481
-
482
- # -------------------------------------------------------------------------
483
- # 7. analyze-report
484
- # Анализирует отчёт: план выполнен полностью или есть пробелы?
485
- # При has_gaps — переходит на increment-plan-iterations для учёта итерации.
486
- # -------------------------------------------------------------------------
487
- analyze-report:
488
- description: "Проанализировать отчёт: план выполнен полностью?"
489
- agent: claude-opus
490
- fallback_agent: kilo-deepseek
491
- skill: analyze-report
492
- goto:
493
- completed: end
494
- has_gaps:
495
- stage: increment-plan-iterations
496
- params:
497
- gaps: "$result.gaps"
498
- report_id: "$context.report_id"
499
-
500
- # -------------------------------------------------------------------------
501
- # 7b. increment-plan-iterations
502
- # Отдельный стейдж обновления счётчика итераций анализа плана.
503
- # При достижении max — завершает пайплайн. Иначе — декомпозирует пробелы.
504
- # -------------------------------------------------------------------------
505
- increment-plan-iterations:
506
- description: "Обновить счётчик итераций анализа плана"
507
- type: update-counter
508
- counter: plan_iterations
509
- max: 2
510
- goto:
511
- default:
512
- stage: decompose-gaps
513
- max_reached: end
514
-
515
- # -------------------------------------------------------------------------
516
- # 8. decompose-gaps
517
- # Декомпозирует недочёты из анализа отчёта в новые тикеты (backlog/)
518
- # -------------------------------------------------------------------------
519
- decompose-gaps:
520
- description: "Декомпозировать недочёты из отчёта в новые тикеты"
521
- agent: claude-sonnet
522
- fallback_agent: kilo-deepseek
523
- skill: decompose-gaps
524
- goto:
525
- default: check-conditions
526
-
527
- # ===========================================================================
528
- # Точка входа (entry)
529
- # ===========================================================================
530
- # Stage, с которого начинается выполнение пайплайна.
531
- # ===========================================================================
532
- entry: pick-first-task
533
-
534
- # ===========================================================================
535
- # Контекст (context)
536
- # ===========================================================================
537
- # Переменные, доступные всем stages через $context.*.
538
- # Runner автоматически обновляет context через params в goto-переходах.
539
- # Начальные значения задаются здесь или через CLI:
540
- # node runner.mjs --plan PLAN-003
541
- # ===========================================================================
542
- context:
543
- plan_id: "" # ID плана (задаётся при запуске)
544
-
545
- # ===========================================================================
546
- # Защита файлов (protected_files)
547
- # ===========================================================================
548
- # Glob-паттерны файлов, в которые агентам запрещена запись.
549
- # Runner проверяет эти паттерны и блокирует изменения.
550
- # Пути указываются относительно корня проекта (без префикса .workflow/)
551
- # ===========================================================================
552
- protected_files:
553
- - ".workflow/plans/**" # Планы — только для чтения
554
- - ".workflow/config/**" # Конфигурация
555
- - pattern: ".workflow/tickets/**"
556
- mode: structure # Защита только структуры (создание/удаление файлов)
557
-
558
- # ===========================================================================
559
- # Доверенные агенты (trusted_agents)
560
- # ===========================================================================
561
- # Агенты, для которых FileGuard не откатывает изменения в protected_files.
562
- # Поддерживает glob-паттерны: "script-*" соответствует "script-move" и т.д.
563
- # ===========================================================================
564
- trusted_agents:
565
- - "script-check-templates" # Создаёт планы в plans/current/
566
- - "script-*" # Все скрипты
567
-
568
- # ===========================================================================
569
- # Доверенные стейджи (trusted_stages)
570
- # ===========================================================================
571
- # Стейджи, которые могут создавать/удалять файлы в protected_files.
572
- # Например, decompose-plan и decompose-gaps создают тикеты.
573
- # ===========================================================================
574
- trusted_stages:
575
- - "decompose-plan"
576
- - "decompose-gaps"
577
-
578
- # ===========================================================================
579
- # Настройки выполнения (execution)
580
- # ===========================================================================
581
- # Параметры, управляющие поведением runner'а.
582
- #
583
- # max_steps: — абсолютный лимит шагов за один запуск (защита от зацикливания)
584
- # delay_between_stages: — пауза между этапами в секундах
585
- # timeout_per_stage: — таймаут на один этап в секундах (по истечении — ошибка)
586
- # log_file: — путь к файлу логов (относительно корня проекта)
587
- # ===========================================================================
588
- execution:
589
- max_steps: 1500
590
- delay_between_stages: 5
591
- timeout_per_stage: 1800
592
- log_file: ".workflow/logs/pipeline.log"
@@ -1,80 +0,0 @@
1
- # Конфигурация правил перемещения тикетов
2
- # Версия: 1.0
3
-
4
- version: "1.0"
5
-
6
- # Правила перемещения тикетов на основе статуса ревью
7
- # Каждое правило применяется к указанной директории
8
- # condition: "passed" | "failed" | "skipped" | null
9
- # - "passed" — ревью пройдено
10
- # - "failed" — ревью провалено
11
- # - "skipped" — ревью пропущено
12
- # - null — ревью отсутствует (не заполнено)
13
- # to_dir: целевая директория перемещения
14
- # reason: причина перемещения (для логирования)
15
-
16
- rules:
17
- # Правила для backlog/ — защита от ошибочного перемещения завершённых тикетов
18
- backlog:
19
- - condition: passed
20
- to_dir: done
21
- reason: "review passed"
22
- - condition: skipped
23
- to_dir: done
24
- reason: "review skipped"
25
-
26
- # Правила для blocked/
27
- blocked:
28
- - condition: passed
29
- to_dir: done
30
- reason: "review passed"
31
- - condition: skipped
32
- to_dir: done
33
- reason: "review skipped"
34
- # failed и null — не перемещаем
35
-
36
- # Правила для done/
37
- done:
38
- - condition: failed
39
- to_dir: backlog
40
- reason: "review failed"
41
- - condition: null
42
- to_dir: backlog
43
- reason: "no review"
44
- # passed или skipped — не перемещаем
45
-
46
- # Правила для review/
47
- review:
48
- - condition: passed
49
- to_dir: done
50
- reason: "review passed"
51
- - condition: skipped
52
- to_dir: done
53
- reason: "review skipped"
54
-
55
- # Правила для in-progress/
56
- in_progress:
57
- - condition: passed
58
- to_dir: done
59
- reason: "review passed"
60
- - condition: skipped
61
- to_dir: done
62
- reason: "review skipped"
63
-
64
- # Правила для ready/
65
- ready:
66
- - condition: passed
67
- to_dir: done
68
- reason: "review passed"
69
- - condition: skipped
70
- to_dir: done
71
- reason: "review skipped"
72
-
73
- # Директории тикетов (относительно .workflow/tickets/)
74
- directories:
75
- backlog: backlog
76
- ready: ready
77
- in_progress: in-progress
78
- blocked: blocked
79
- review: review
80
- done: done