workflow-ai 1.0.64 → 1.0.65

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 (135) hide show
  1. package/README.md +239 -145
  2. package/configs/agent-health-rules.yaml +64 -0
  3. package/configs/pipeline.yaml +18 -1
  4. package/package.json +1 -1
  5. package/src/init.mjs +20 -3
  6. package/src/lib/agent-health-registry.mjs +245 -0
  7. package/src/lib/artifact-snapshot.mjs +233 -0
  8. package/src/lib/error-classifier.mjs +274 -0
  9. package/src/lib/test-error-classifier.mjs +60 -0
  10. package/src/lib/test-extends.mjs +58 -0
  11. package/src/lib/test-version.mjs +21 -0
  12. package/src/scripts/move-to-review.js +5 -7
  13. package/src/scripts/reset-agent-health.js +62 -0
  14. package/src/skills/coach/SKILL.md +1 -0
  15. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +2 -3
  16. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +2 -3
  17. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +23 -31
  18. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +20 -35
  19. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +36 -19
  20. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +1 -1
  21. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +11 -5
  22. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +12 -16
  23. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +15 -9
  24. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +15 -14
  25. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +22 -18
  26. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +24 -16
  27. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +13 -20
  28. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +2 -2
  29. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +14 -19
  30. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +24 -14
  31. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +20 -19
  32. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +16 -17
  33. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -7
  34. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +9 -10
  35. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +5 -5
  36. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +20 -4
  37. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +36 -9
  38. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +9 -6
  39. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +4 -12
  40. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +6 -8
  41. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +8 -4
  42. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +10 -11
  43. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +30 -0
  44. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +30 -0
  45. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +30 -0
  46. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +165 -0
  47. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +5 -0
  48. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +26 -0
  49. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +5 -0
  50. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +39 -0
  51. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +37 -0
  52. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +45 -0
  53. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +26 -0
  54. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +27 -0
  55. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +7 -0
  56. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +117 -0
  57. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +41 -0
  58. package/src/skills/decompose-gaps/tests/index.yaml +5 -0
  59. package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +22 -0
  60. package/src/skills/decompose-gaps/workflows/decompose.md +5 -2
  61. package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +31 -5
  62. package/src/skills/decompose-plan/knowledge/capabilities.md +29 -5
  63. package/src/skills/decompose-plan/knowledge/human-task-rules.md +15 -0
  64. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +55 -0
  65. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +49 -0
  66. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +49 -0
  67. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +163 -0
  68. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +104 -0
  69. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +45 -0
  70. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +58 -0
  71. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +193 -0
  72. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +202 -0
  73. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +155 -0
  74. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +52 -0
  75. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +17 -0
  76. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-3.md +0 -0
  77. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/meta.json +115 -0
  78. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +64 -0
  79. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +59 -0
  80. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +204 -0
  81. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +213 -0
  82. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +163 -0
  83. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-1.md +0 -0
  84. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-2.md +57 -0
  85. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +54 -0
  86. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +147 -0
  87. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +165 -0
  88. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +133 -0
  89. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +81 -0
  90. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +108 -0
  91. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +3 -0
  92. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +114 -0
  93. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +78 -0
  94. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +225 -0
  95. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +66 -0
  96. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +36 -0
  97. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +163 -0
  98. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +42 -0
  99. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +67 -0
  100. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +40 -0
  101. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +122 -0
  102. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +131 -0
  103. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +138 -0
  104. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +41 -0
  105. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +88 -0
  106. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-3.md +0 -0
  107. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/meta.json +115 -0
  108. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +72 -0
  109. package/src/skills/decompose-plan/tests/index.yaml +15 -0
  110. package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +21 -0
  111. package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +21 -0
  112. package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +21 -0
  113. package/src/skills/decompose-plan/workflows/decompose.md +38 -5
  114. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +3 -4
  115. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +3 -4
  116. package/src/skills/manual-testing/SKILL.md +6 -4
  117. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +29 -16
  118. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +21 -54
  119. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +18 -23
  120. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +17 -17
  121. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +19 -19
  122. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +27 -30
  123. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +16 -23
  124. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +35 -28
  125. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +13 -13
  126. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +15 -15
  127. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +76 -0
  128. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +71 -0
  129. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +85 -0
  130. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +46 -0
  131. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +36 -0
  132. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +65 -0
  133. package/src/skills/manual-testing/tests/index.yaml +5 -0
  134. package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +31 -0
  135. package/src/skills/review-result/scripts/verify-artifacts.js +42 -12
package/README.md CHANGED
@@ -1,134 +1,163 @@
1
1
  # workflow-ai
2
2
 
3
- AI Agent Workflow Coordinatorkanban-based pipeline for AI coding agents.
3
+ Координатор воркфлоу для AI-агентовконвейер на основе канбан-доски для AI-агентов, пишущих код.
4
4
 
5
5
  Система координации AI-агентов через файловую канбан-доску. Автоматически оркестрирует выполнение задач: берёт тикеты из очереди, запускает нужного агента, проверяет результат и генерирует отчёты.
6
6
 
7
- ## Install
7
+ ## Установка
8
8
 
9
9
  ```bash
10
10
  npm install -g workflow-ai
11
11
  ```
12
12
 
13
- ## Quick Start
13
+ ## Быстрый старт
14
14
 
15
15
  ```bash
16
- # Initialize workflow in your project
16
+ # 1. Инициализировать воркфлоу в вашем проекте
17
17
  workflow init
18
+ ```
19
+
20
+ ```text
21
+ # 2. Открыть проект в AI-агенте (Claude Code, Kilo, и т.д.) и попросить создать план через скил:
22
+ Создай план <описание задачи> используя скил .workflow/src/skills/create-plan/SKILL.md
23
+ ```
18
24
 
19
- # Run the workflow pipeline
25
+ ```bash
26
+ # 3. Запустить конвейер — он декомпозирует план на тикеты и начнёт исполнение
20
27
  workflow run
21
28
  ```
22
29
 
23
- ## Commands
30
+ ## Команды
24
31
 
25
- | Command | Description |
26
- |---------|-------------|
27
- | `workflow init [path] [--force]` | Initialize `.workflow/` directory with kanban board structure |
28
- | `workflow run [options]` | Execute the AI pipeline |
29
- | `workflow update [path]` | Update global dir and recreate junctions |
30
- | `workflow eject <skill> [path]` | Eject a skill (copy from global to project) |
31
- | `workflow eject-scripts [path]` | Eject scripts (copy from global to project) |
32
- | `workflow eject-configs [path]` | Eject configs (copy from global to project) |
33
- | `workflow list [path]` | List skills with status (shared/ejected/project-only) |
34
- | `workflow help` | Show help |
35
- | `workflow version` | Show version |
32
+ | Команда | Описание |
33
+ |---------|----------|
34
+ | `workflow init [path] [--force]` | Инициализировать директорию `.workflow/` со структурой канбан-доски |
35
+ | `workflow run [options]` | Запустить AI-конвейер |
36
+ | `workflow update [path]` | Обновить глобальную директорию и пересоздать junctions |
37
+ | `workflow eject <skill> [path]` | Извлечь скил (скопировать из глобальной директории в проект) |
38
+ | `workflow eject-scripts [path]` | Извлечь скрипты (скопировать из глобальной директории в проект) |
39
+ | `workflow eject-configs [path]` | Извлечь конфиги (скопировать из глобальной директории в проект) |
40
+ | `workflow list [path]` | Вывести список скилов со статусом (shared/ejected/project-only) |
41
+ | `workflow help` | Показать справку |
42
+ | `workflow version` | Показать версию |
36
43
 
37
- ### Run Options
44
+ ### Опции команды `run`
38
45
 
39
- | Option | Description |
40
- |--------|-------------|
41
- | `--plan <plan>` | Plan ID to execute |
42
- | `--config <path>` | Config file path |
43
- | `--project <path>` | Project root (default: auto-detect) |
46
+ | Опция | Описание |
47
+ |-------|----------|
48
+ | `--plan <plan>` | ID плана для выполнения |
49
+ | `--config <path>` | Путь к конфиг-файлу |
50
+ | `--project <path>` | Корень проекта (по умолчанию: автоопределение) |
44
51
 
45
- ## Init
52
+ ## Инициализация
46
53
 
47
- The `workflow init` command creates the `.workflow/` directory structure:
54
+ Команда `workflow init` создаёт структуру директории `.workflow/`:
48
55
 
49
56
  ```
50
57
  .workflow/
51
- ├── config/ # → junction to ~/.workflow/configs/ (eject to customize)
58
+ ├── config/ # → junction на ~/.workflow/configs/ (eject для кастомизации)
52
59
  ├── plans/
53
- │ ├── current/ # Current development plans
54
- │ ├── templates/ # Plan templates with triggers (recurring plans)
55
- │ └── archive/ # Archived plans
60
+ │ ├── current/ # Текущие планы разработки
61
+ │ ├── templates/ # Шаблоны планов с триггерами (повторяющиеся планы)
62
+ │ └── archive/ # Архивные планы
56
63
  ├── tickets/
57
- │ ├── backlog/ # Awaiting conditions
58
- │ ├── ready/ # Ready to execute
59
- │ ├── in-progress/ # Currently active
60
- │ ├── blocked/ # Blocked by dependencies
61
- │ ├── review/ # Awaiting review
62
- │ └── done/ # Completed
63
- ├── reports/ # Generated reports
64
- ├── logs/ # Pipeline execution logs
65
- ├── metrics/ # Performance metrics
66
- ├── templates/ # Ticket/plan/report templates
64
+ │ ├── backlog/ # Ожидают условий
65
+ │ ├── ready/ # Готовы к выполнению
66
+ │ ├── in-progress/ # В работе
67
+ │ ├── blocked/ # Заблокированы зависимостями
68
+ │ ├── review/ # Ожидают ревью
69
+ │ └── done/ # Завершены
70
+ ├── reports/ # Сгенерированные отчёты
71
+ ├── logs/ # Логи выполнения конвейера
72
+ ├── metrics/ # Метрики производительности
73
+ ├── templates/ # Шаблоны тикетов/планов/отчётов
67
74
  └── src/
68
- ├── skills/ # Skill instructions (junctions to global, per-skill)
69
- └── scripts/ # Automation scripts (junction to global)
75
+ ├── skills/ # Инструкции скилов (junctions на глобальные, по каждому скилу)
76
+ └── scripts/ # Скрипты автоматизации (junction на глобальные)
70
77
  ```
71
78
 
72
- ## Pipeline
73
-
74
- The `workflow run` command executes a multi-stage pipeline:
75
-
76
- 1. **pick-first-task** — select ticket from ready queue
77
- 2. **check-plan-templates** — evaluate plan template triggers, create plans if fired
78
- 3. **check-plan-decomposition** — verify plan is decomposed into tickets
79
- 4. **decompose-plan** — break down plan into tickets (if needed)
80
- 5. **check-conditions** — validate ticket readiness conditions
81
- 6. **move-to-ready** — move tickets from backlog to ready
82
- 7. **pick-next-task** — select next ticket for execution
83
- 8. **move-to-in-progress** — start execution
84
- 9. **check-relevance** — verify ticket is still relevant (script-based, no LLM)
85
- 10. **execute-task** — perform the work via AI agent
86
- 11. **move-to-review** — submit for review
87
- 12. **review-result** — validate results against Definition of Done
88
- 13. **increment-task-attempts** — track retry attempts
89
- 14. **move-ticket** — move to done/blocked based on review
90
- 15. **create-report** — generate execution report
91
- 16. **analyze-report / decompose-gaps** — analyze results and iterate
92
-
93
- ### Supported Agents
94
-
95
- | Agent | Description |
96
- |-------|-------------|
97
- | `claude-sonnet` | Claude Sonnetfast model for simple tasks |
98
- | `claude-opus` | Claude Opuspowerful model for complex tasks |
99
- | `qwen-code` | Qwen Code — alternative agent |
100
- | `kilo-code` | Kilo Code — multi-mode agent |
101
-
102
- Agents are configured in `configs/pipeline.yaml`.
103
-
104
- ## Skills
105
-
106
- Built-in skills for different task types:
79
+ ## Конвейер
80
+
81
+ Команда `workflow run` исполняет многоэтапный конвейер:
82
+
83
+ 1. **pick-first-task** — выбрать тикет из очереди ready
84
+ 2. **check-plan-templates** — проверить триггеры шаблонов планов, создать планы при срабатывании
85
+ 3. **check-plan-decomposition** — проверить, что план декомпозирован на тикеты
86
+ 4. **decompose-plan** — разбить план на тикеты (при необходимости)
87
+ 5. **check-conditions** — проверить условия готовности тикета
88
+ 6. **move-to-ready** — переместить тикеты из backlog в ready
89
+ 7. **pick-next-task** — выбрать следующий тикет для выполнения
90
+ 8. **move-to-in-progress** — начать выполнение
91
+ 9. **check-relevance** — проверить, что тикет всё ещё актуален (на скриптах, без LLM)
92
+ 10. **execute-task** — выполнить работу через AI-агента
93
+ 11. **move-to-review** — отправить на ревью
94
+ 12. **review-result** — проверить результаты по Definition of Done
95
+ 13. **increment-task-attempts** — учесть попытки повторов
96
+ 14. **move-ticket** — переместить в done/blocked по результатам ревью
97
+ 15. **create-report** — сгенерировать отчёт о выполнении
98
+ 16. **analyze-report / decompose-gaps** — проанализировать результаты и итерировать
99
+
100
+ ### Поддерживаемые агенты
101
+
102
+ | Агент | Описание |
103
+ |-------|----------|
104
+ | `claude-code` | Claude Opusмощная модель для сложных задач |
105
+ | `qwen-code` | Qwen Codeальтернативный агент |
106
+ | `kilo-code` | Kilo Code — мультирежимный агент |
107
+ ...
108
+
109
+ Агенты настраиваются в `configs/pipeline.yaml`.
110
+
111
+ ## Скилы
112
+
113
+ Встроенные скилы для разных типов задач:
114
+
115
+ | Скил | Описание |
116
+ |------|----------|
117
+ | `analyze-report` | Анализ отчёта |
118
+ | `coach` | Управление и улучшение скилов |
119
+ | `create-plan` | Создание плана |
120
+ | `create-report` | Генерация отчёта |
121
+ | `decompose-gaps` | Декомпозиция пробелов |
122
+ | `decompose-plan` | Декомпозиция плана на тикеты |
123
+ | `deep-research` | Глубокий ресерч |
124
+ | `execute-task` | Выполнение задачи |
125
+ | `review-result` | Ревью результата по DoD |
126
+
127
+ Скилы хранятся глобально в `~/.workflow/skills/` и подключаются в проекты через junctions.
128
+
129
+ Используйте `workflow eject <skill>` для копирования скила в проект для кастомизации.
130
+
131
+ ### Как работать с коучем
132
+
133
+ Коуч — мета-скил для создания и улучшения остальных скилов. Правки в `.workflow/src/skills/` делаются **только** через него.
134
+
135
+ ```text
136
+ # Запрос к AI-агенту:
137
+ Загрузи коуча из .workflow/src/skills/coach/SKILL.md и <действие>
138
+ ```
107
139
 
108
- | Skill | Description |
109
- |-------|-------------|
110
- | `analyze-report` | Report analysis |
111
- | `coach` | Skill management and improvement |
112
- | `create-plan` | Plan creation |
113
- | `create-report` | Report generation |
114
- | `decompose-gaps` | Gap decomposition |
115
- | `decompose-plan` | Plan decomposition into tickets |
116
- | `deep-research` | Deep research |
117
- | `execute-task` | Task execution |
118
- | `review-result` | Result review against DoD |
140
+ Варианты `<действия>`:
119
141
 
120
- Skills are stored globally in `~/.workflow/skills/` and linked into projects via junctions.
142
+ | Тип задачи | Пример запроса |
143
+ |------------|----------------|
144
+ | Создать новый скил | `создай скил <имя> для <назначение>` |
145
+ | Аудит существующего | `сделай аудит скила <имя>` |
146
+ | Анализ эффективности | `проанализируй результаты скила <имя> по завершённым тикетам` |
147
+ | Точечное улучшение | `улучши скил <имя>: <что именно>` |
148
+ | Ресерч практик | `найди лучшие практики для <тема> и обогати скил <имя>` |
149
+ | Ревью скила | `сделай ревью скила <имя>` |
121
150
 
122
- Use `workflow eject <skill>` to copy a skill into the project for customization.
151
+ Коуч сам определит тип задачи, загрузит нужный воркфлоу, внесёт правку, прогонит тест скила и запишет результат в `.workflow/coach-backlog.yaml`. Коммит делает пользователь.
123
152
 
124
- ## Skill regression tests
153
+ ## Регрессионные тесты скилов
125
154
 
126
155
  Трёхуровневая система тестирования скилов для проверки качества AI-агентов.
127
156
 
128
157
  ### Три слоя тестирования
129
158
 
130
- | Level | Name | Description |
131
- |-------|------|-------------|
159
+ | Уровень | Название | Описание |
160
+ |---------|----------|----------|
132
161
  | L0 | Static | Базовая проверка синтаксиса и структуры: YAML-валидация, проверка обязательных полей, линтер |
133
162
  | L1 | Deterministic | Детерминированные тесты: эталонные входные данные → ожидаемый результат (strict match) |
134
163
  | L2 | Rubric | Гибкая оценка по критериям: scorer выставляет баллы на основе качества результата |
@@ -157,18 +186,18 @@ npm run test:skills
157
186
 
158
187
  ### CLI-флаги
159
188
 
160
- | Flag | Description |
161
- |------|-------------|
189
+ | Флаг | Описание |
190
+ |------|----------|
162
191
  | `--skill <name>` | Запустить тесты только для указанного скила |
163
192
  | `--relevant` | Запустить только тесты, соответствующие изменённым файлам |
164
193
  | `--establish-baseline` | Запустить тесты и сохранить результаты как baseline |
165
194
  | `--baseline-ref <ref>` | Использовать конкретный baseline (коммит, тег) |
166
195
  | `--yes` | Автоматически подтверждать все действия |
167
196
 
168
- ### Verdict-режимы
197
+ ### Режимы вердикта
169
198
 
170
- | Mode | Description |
171
- |------|-------------|
199
+ | Режим | Описание |
200
+ |-------|----------|
172
201
  | `no-baseline` | Первый запуск — результаты сохраняются как baseline без сравнения |
173
202
  | `no-regression` | Сравнение с baseline — тест считается пройденным, если результат не хуже baseline |
174
203
 
@@ -176,29 +205,29 @@ npm run test:skills
176
205
 
177
206
  Runner и коуч **не выполняют git write-операций**. Все изменения в кодовой базе делает исключительно пользователь. Runner только анализирует и рекомендует, но не коммитит.
178
207
 
179
- ### First run on a new project
208
+ ### Первый запуск на новом проекте
180
209
 
181
210
  1. Запустить тесты с флагом `--establish-baseline`
182
211
  2. Проверить результаты: красные тесты — ожидаемы для нового проекта
183
212
  3. Зафиксировать baseline: `git commit current/` как baseline-коммит
184
213
 
185
- ## Scripts
214
+ ## Скрипты
186
215
 
187
- Scripts are stored globally in `~/.workflow/scripts/` and linked as a single junction into `.workflow/src/scripts/`.
216
+ Скрипты хранятся глобально в `~/.workflow/scripts/` и подключаются одним junction в `.workflow/src/scripts/`.
188
217
 
189
- Use `workflow eject-scripts` to copy scripts into the project for customization.
218
+ Используйте `workflow eject-scripts` для копирования скриптов в проект для кастомизации.
190
219
 
191
- ## Configs
220
+ ## Конфиги
192
221
 
193
- Configs are stored globally in `~/.workflow/configs/` and linked as a single junction into `.workflow/config/`.
222
+ Конфиги хранятся глобально в `~/.workflow/configs/` и подключаются одним junction в `.workflow/config/`.
194
223
 
195
- Use `workflow eject-configs` to copy configs into the project for customization.
224
+ Используйте `workflow eject-configs` для копирования конфигов в проект для кастомизации.
196
225
 
197
- ## Plan Templates
226
+ ## Шаблоны планов
198
227
 
199
- Plan templates allow recurring plans to be created automatically. Templates live in `.workflow/plans/templates/` and contain trigger conditions in their frontmatter.
228
+ Шаблоны планов позволяют автоматически создавать повторяющиеся планы. Шаблоны лежат в `.workflow/plans/templates/` и содержат условия триггеров во frontmatter.
200
229
 
201
- ### Template Format
230
+ ### Формат шаблона
202
231
 
203
232
  ```yaml
204
233
  id: "TMPL-001"
@@ -206,72 +235,137 @@ title: "Daily manual testing"
206
235
  type: template
207
236
  trigger:
208
237
  type: daily # daily | weekly | date_after | interval_days
209
- params: {} # type-specific params
210
- last_triggered: "" # auto-updated on trigger
238
+ params: {} # параметры, зависящие от типа
239
+ last_triggered: "" # обновляется автоматически при срабатывании
211
240
  enabled: true
212
241
  ```
213
242
 
214
- ### Trigger Types
243
+ ### Типы триггеров
244
+
245
+ | Тип | Параметры | Описание |
246
+ |-----|-----------|----------|
247
+ | `daily` | — | Раз в день |
248
+ | `weekly` | `days_of_week: [1,3,5]` (0=вс) | В указанные дни недели |
249
+ | `date_after` | `date: "2026-04-01"` | Один раз после указанной даты |
250
+ | `interval_days` | `days: 3` | Каждые N дней |
251
+
252
+ При срабатывании триггера конвейер создаёт план в `plans/current/` со статусом `approved`, далее идёт обычный поток декомпозиции.
253
+
254
+ ## Типы задач
255
+
256
+ | Тип | Префикс | Описание |
257
+ |-----|---------|----------|
258
+ | `arch` | ARCH | Архитектура и планирование |
259
+ | `impl` | IMPL | Реализация кода |
260
+ | `fix` | FIX | Исправления ошибок |
261
+ | `review` | REVIEW | Ревью кода/документации |
262
+ | `docs` | DOCS | Документация |
263
+ | `admin` | ADMIN | Административные задачи |
264
+
265
+ ## Fallback агентов и правила здоровья
266
+
267
+ Система включает механизм in-stage fallback и health-мониторинг агентов.
215
268
 
216
- | Type | Params | Description |
217
- |------|--------|-------------|
218
- | `daily` | — | Once per day |
219
- | `weekly` | `days_of_week: [1,3,5]` (0=Sun) | On specific weekdays |
220
- | `date_after` | `date: "2026-04-01"` | Once after a specific date |
221
- | `interval_days` | `days: 3` | Every N days |
269
+ ### Механика fallback
222
270
 
223
- When a trigger fires, the pipeline creates a plan in `plans/current/` with status `approved`, then the normal decomposition flow proceeds.
271
+ Когда агент падает во время выполнения задачи, система использует **artifact-snapshot** для принятия решения:
272
+ - Если snapshot пустой (нет записанных файлов) → выполняется fallback на следующего агента
273
+ - Если snapshot непустой (есть изменения) → задача переходит в состояние `goto.error`
224
274
 
225
- ## Task Types
275
+ **Пример сценария:** Qwen превысил quota и упал без записи файлов → Kilo вызван в той же попытке, task_attempts не инкрементирован.
226
276
 
227
- | Type | Prefix | Description |
228
- |------|--------|-------------|
229
- | `arch` | ARCH | Architecture & planning |
230
- | `impl` | IMPL | Code implementation |
231
- | `fix` | FIX | Bug fixes |
232
- | `review` | REVIEW | Code/documentation review |
233
- | `docs` | DOCS | Documentation |
234
- | `admin` | ADMIN | Administrative tasks |
277
+ Конфигурация snapshot:
278
+ ```yaml
279
+ execution:
280
+ artifact_snapshot_enabled: false # по умолчанию выключено
281
+ snapshot_paths: ["src/", "configs/"] # что мониторить
282
+ snapshot_max_file_size: 524288 # файлы >512KB только mtime+size
283
+ ```
284
+
285
+ **Baseline производительности:** `p50=169ms p95=299ms files=598` (из QA-20 benchmark).
286
+
287
+ ### Классификатор ошибок и health-реестр
288
+
289
+ Ошибки классифицируются по классам:
290
+ - `unavailable` — агент временно недоступен (quota, rate limit)
291
+ - `transient` — временная ошибка сети (timeout, 5xx)
292
+ - `misconfigured` — ошибка конфигурации (401, 403, отсутствует API key)
293
+ - `unmatched` — ошибка не распознана
294
+
295
+ **Семантика TTL:**
296
+ - `5m` — 5 минут
297
+ - `1h` — 1 час
298
+ - `until_utc_midnight` — до полуночи UTC (минимум 30 минут)
299
+ - `infinite` — навсегда
300
+
301
+ Файл конфигурации: `configs/agent-health-rules.yaml`. Файл состояния: `.workflow/state/agent-health.json`.
302
+
303
+ ### Команда сброса
304
+
305
+ ```bash
306
+ # показать текущее состояние
307
+ node .workflow/src/scripts/reset-agent-health.js
308
+
309
+ # сбросить конкретного агента
310
+ node .workflow/src/scripts/reset-agent-health.js --agent qwen-code
311
+
312
+ # сбросить всех агентов
313
+ node .workflow/src/scripts/reset-agent-health.js --all
314
+ ```
315
+
316
+ ### Пример добавления правила
317
+
318
+ ```yaml
319
+ # В configs/agent-health-rules.yaml:
320
+ agents:
321
+ my-new-agent:
322
+ rules:
323
+ - id: "my-agent-quota"
324
+ class: "unavailable"
325
+ ttl: "until_utc_midnight"
326
+ pattern: "quota exceeded|daily limit reached"
327
+ exit_codes: "any"
328
+ ```
235
329
 
236
- ## Configuration
330
+ ## Конфигурация
237
331
 
238
332
  ### `configs/config.yaml`
239
333
 
240
- Main workflow configuration: project info, task types, priorities, statuses, condition types, paths, reporting settings.
334
+ Основная конфигурация воркфлоу: информация о проекте, типы задач, приоритеты, статусы, типы условий, пути, настройки отчётности.
241
335
 
242
336
  ### `configs/pipeline.yaml`
243
337
 
244
- Pipeline definition: agents, stages, flow control, goto-logic, retry strategies.
338
+ Определение конвейера: агенты, стадии, управление потоком, goto-логика, стратегии повторов.
245
339
 
246
340
  ### `configs/ticket-movement-rules.yaml`
247
341
 
248
- Rules for automated ticket movement based on review status.
342
+ Правила автоматического перемещения тикетов на основе статуса ревью.
249
343
 
250
- ## Project Structure
344
+ ## Структура проекта
251
345
 
252
346
  ```
253
347
  workflow-ai/
254
- ├── bin/ # CLI entry point
348
+ ├── bin/ # Точка входа CLI
255
349
  ├── src/
256
- │ ├── cli.mjs # Command parsing
257
- │ ├── runner.mjs # Core pipeline orchestrator
258
- │ ├── init.mjs # Project initialization
259
- │ ├── global-dir.mjs # Global ~/.workflow/ management
260
- │ ├── junction-manager.mjs # Junction/symlink management
261
- │ ├── wf-loader.mjs # Config loader
262
- │ ├── lib/ # Utility libraries
263
- │ └── tests/ # Test suite
264
- ├── configs/ # Configuration files (source)
265
- ├── templates/ # Workflow templates (source)
266
- ├── agent-templates/ # AI agent instruction templates
350
+ │ ├── cli.mjs # Парсинг команд
351
+ │ ├── runner.mjs # Оркестратор конвейера
352
+ │ ├── init.mjs # Инициализация проекта
353
+ │ ├── global-dir.mjs # Управление глобальной ~/.workflow/
354
+ │ ├── junction-manager.mjs # Управление junction/symlink
355
+ │ ├── wf-loader.mjs # Загрузчик конфигов
356
+ │ ├── lib/ # Библиотеки утилит
357
+ │ └── tests/ # Набор тестов
358
+ ├── configs/ # Файлы конфигурации (источник)
359
+ ├── templates/ # Шаблоны воркфлоу (источник)
360
+ ├── agent-templates/ # Шаблоны инструкций для AI-агентов
267
361
  └── package.json
268
362
  ```
269
363
 
270
- ## Requirements
364
+ ## Требования
271
365
 
272
366
  - Node.js >= 18.0.0
273
367
  - npm
274
368
 
275
- ## License
369
+ ## Лицензия
276
370
 
277
371
  MIT
@@ -0,0 +1,64 @@
1
+ version: "1.0"
2
+
3
+ common:
4
+ - id: "net-econnreset"
5
+ class: "transient"
6
+ ttl: "5m"
7
+ pattern: "ECONNRESET|ETIMEDOUT|EAI_AGAIN|connection reset by peer|socket hang up"
8
+ exit_codes: "any"
9
+ - id: "http-5xx-transient"
10
+ class: "transient"
11
+ ttl: "5m"
12
+ pattern: "\\b(502|503|504)\\b.*(Bad Gateway|Service Unavailable|Gateway Timeout)"
13
+ exit_codes: "any"
14
+ - id: "http-auth"
15
+ class: "misconfigured"
16
+ ttl: "1h"
17
+ pattern: "\\b(401|403)\\b|Unauthorized|Forbidden|API key (not found|invalid|missing)"
18
+ exit_codes: "any"
19
+
20
+ agents:
21
+ qwen-code:
22
+ rules:
23
+ - id: "qwen-quota"
24
+ class: "unavailable"
25
+ ttl: "until_utc_midnight"
26
+ pattern: "Qwen OAuth quota exceeded|qwen.*quota.*exceed|Daily limit.*reached"
27
+ exit_codes: "any"
28
+ - id: "qwen-oauth-required"
29
+ class: "misconfigured"
30
+ ttl: "1h"
31
+ pattern: "Please run `qwen login`|qwen OAuth flow"
32
+ exit_codes: "any"
33
+
34
+ claude-sonnet:
35
+ rules:
36
+ - id: "claude-overloaded"
37
+ class: "unavailable"
38
+ ttl: "10m"
39
+ pattern: "overloaded_error|\\b529\\b|Overloaded"
40
+ exit_codes: "any"
41
+ - id: "claude-rate-limit"
42
+ class: "unavailable"
43
+ ttl: "1h"
44
+ pattern: "rate_limit_error|\\b429\\b.*rate|usage limit"
45
+ exit_codes: "any"
46
+
47
+ claude-opus:
48
+ extends: claude-sonnet
49
+
50
+ kilo-free:
51
+ rules:
52
+ - id: "kilo-free-tier-exhausted"
53
+ class: "unavailable"
54
+ ttl: "until_utc_midnight"
55
+ pattern: "free tier.*exhaust|daily limit|too many requests"
56
+ exit_codes: "any"
57
+
58
+ kilo-deepseek:
59
+ rules:
60
+ - id: "kilo-deepseek-provider-down"
61
+ class: "transient"
62
+ ttl: "15m"
63
+ pattern: "deepseek.*unavailable|upstream error"
64
+ exit_codes: "any"
@@ -350,7 +350,7 @@ pipeline:
350
350
  # -------------------------------------------------------------------------
351
351
  decompose-plan:
352
352
  description: "Декомпозировать план на тикеты"
353
- agents: [claude-sonnet, kilo-glm, kilo-deepseek]
353
+ agents: [claude-sonnet, kilo-glm]
354
354
  skill: decompose-plan
355
355
  instructions: "Декомпозируй план .workflow/$context.plan_file на тикеты. ID тикетов бери ТОЛЬКО из JSON-карты id_ranges_json=$context.id_ranges_json — это стартовые номера по префиксам в формате {\"PREFIX\":N_start,...}, уже выделенные стадией allocate-ticket-ids. Распарси JSON, используй значения как есть. НЕ вызывай get-next-id.js и НЕ изобретай номера самостоятельно. Подробности: см. шаг 9.0 в workflows/decompose.md. При наличии $context.atomicity_failures — учти их при декомпозиции: исправь неатомарные тикеты."
356
356
  goto:
@@ -593,6 +593,17 @@ pipeline:
593
593
  ticket_id: "$context.ticket_id"
594
594
  attempt: "$counter.task_attempts"
595
595
  target: review
596
+ # Runner возвращает status=blocked при no_capable_agent / attempts_exhausted
597
+ # (resolveAgent в runner.mjs, строка ~926). Направляем тикет сразу в blocked/,
598
+ # минуя move-to-review → verify-artifacts → increment-task-attempts: иначе
599
+ # тикет крутится 6 итераций вхолостую (execute-task не может его взять,
600
+ # verify-artifacts фейлится с пустым result, счётчик достигает max → blocked
601
+ # всё равно). Прямой маршрут экономит ~6 пустых итераций на тикет.
602
+ blocked:
603
+ stage: move-ticket
604
+ params:
605
+ ticket_id: "$context.ticket_id"
606
+ target: blocked
596
607
  error:
597
608
  stage: move-to-review
598
609
  params:
@@ -728,6 +739,10 @@ pipeline:
728
739
  stage: analyze-report
729
740
  params:
730
741
  report_id: "$result.report_id"
742
+ # blocked означает, что required_capabilities из контекста (от предыдущего
743
+ # тикета) не покрыты ни одним агентом create-report. Это не фатально —
744
+ # завершаем пайплайн, отчёт не создан, но данные не теряются.
745
+ blocked: end
731
746
  error:
732
747
  stage: increment-create-report-attempts
733
748
 
@@ -758,6 +773,8 @@ pipeline:
758
773
  params:
759
774
  gaps: "$result.gaps"
760
775
  report_id: "$context.report_id"
776
+ # blocked по тем же причинам, что и в create-report — завершаем пайплайн.
777
+ blocked: end
761
778
  error:
762
779
  stage: increment-analyze-report-attempts
763
780
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workflow-ai",
3
- "version": "1.0.64",
3
+ "version": "1.0.65",
4
4
  "description": "AI Agent Workflow Coordinator — kanban-based pipeline for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {