workflow-ai 1.0.31 → 1.0.33
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.
- package/package.json +1 -1
- package/src/runner.mjs +22 -3
- package/src/scripts/check-plan-decomposed.js +32 -2
- package/src/skills/check-relevance/SKILL.md +224 -224
- package/src/skills/coach/README.md +100 -0
- package/src/skills/coach/SKILL.md +97 -0
- package/src/skills/coach/algorithms/gap-analysis.md +69 -0
- package/src/skills/coach/algorithms/improvement-prioritization.md +62 -0
- package/src/skills/coach/algorithms/skill-scoring.md +79 -0
- package/src/skills/coach/knowledge/common-antipatterns.md +56 -0
- package/src/skills/coach/knowledge/prompt-engineering.md +86 -0
- package/src/skills/coach/knowledge/skill-anatomy.md +71 -0
- package/src/skills/coach/templates/audit-report.md +54 -0
- package/src/skills/coach/templates/improvement-plan.md +54 -0
- package/src/skills/coach/templates/new-skill.md +137 -0
- package/src/skills/coach/workflows/analyze.md +57 -0
- package/src/skills/coach/workflows/audit.md +54 -0
- package/src/skills/coach/workflows/create.md +66 -0
- package/src/skills/coach/workflows/improve.md +56 -0
- package/src/skills/coach/workflows/research.md +55 -0
- package/src/skills/coach/workflows/review.md +68 -0
- package/src/skills/decompose-gaps/SKILL.md +43 -0
- package/src/skills/decompose-plan/SKILL.md +175 -103
- package/src/skills/execute-task/SKILL.md +161 -119
package/package.json
CHANGED
package/src/runner.mjs
CHANGED
|
@@ -289,7 +289,19 @@ class PromptBuilder {
|
|
|
289
289
|
* @returns {string} Промпт для агента
|
|
290
290
|
*/
|
|
291
291
|
build(stage, stageId) {
|
|
292
|
-
const
|
|
292
|
+
const skillName = stage.skill || stageId;
|
|
293
|
+
const ticketId = this.context.ticket_id;
|
|
294
|
+
const parts = [];
|
|
295
|
+
|
|
296
|
+
// Директивная первая строка — агент сразу понимает задание
|
|
297
|
+
if (ticketId) {
|
|
298
|
+
const skillPath = `.workflow/src/skills/${skillName}/SKILL.md`;
|
|
299
|
+
parts.push(`Выполни скилл "${skillName}" для тикета ${ticketId}.`);
|
|
300
|
+
parts.push(`Инструкция скилла: ${skillPath}`);
|
|
301
|
+
parts.push(`Прочитай инструкцию и выполни все шаги.`);
|
|
302
|
+
} else {
|
|
303
|
+
parts.push(skillName);
|
|
304
|
+
}
|
|
293
305
|
|
|
294
306
|
// Добавляем контекст если есть непустые значения
|
|
295
307
|
const contextEntries = Object.entries(this.context)
|
|
@@ -837,8 +849,15 @@ class StageExecutor {
|
|
|
837
849
|
const timeout = this.pipeline.execution?.timeout_per_stage || 300;
|
|
838
850
|
const args = [...agent.args];
|
|
839
851
|
|
|
840
|
-
//
|
|
841
|
-
|
|
852
|
+
// Если args содержит -p с ролью — объединяем роль и промпт в один аргумент
|
|
853
|
+
// Иначе Claude CLI интерпретирует роль как промпт, а реальный промпт игнорирует
|
|
854
|
+
const lastPIdx = args.lastIndexOf('-p');
|
|
855
|
+
if (lastPIdx !== -1 && lastPIdx < args.length - 1) {
|
|
856
|
+
const rolePrompt = args[lastPIdx + 1];
|
|
857
|
+
args[lastPIdx + 1] = `${rolePrompt}\n\n${prompt}`;
|
|
858
|
+
} else {
|
|
859
|
+
args.push(prompt);
|
|
860
|
+
}
|
|
842
861
|
|
|
843
862
|
// Логгируем команду перед запуском (вместо промпта — имя skill)
|
|
844
863
|
if (this.logger) {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* B) Если plan_id НЕ задан — сканирует все планы в plans/current/
|
|
9
9
|
*
|
|
10
10
|
* Для каждого плана:
|
|
11
|
-
* 1. Если есть тикеты (backlog/, ready/, in-progress/, review/) с parent_plan == planId — decomposed
|
|
11
|
+
* 1. Если есть тикеты (backlog/, ready/, in-progress/, review/, done/, blocked/) с parent_plan == planId — decomposed
|
|
12
12
|
* 2. Иначе — needs_decomposition
|
|
13
13
|
*
|
|
14
14
|
* Результат:
|
|
@@ -31,7 +31,25 @@ const WORKFLOW_DIR = path.join(PROJECT_DIR, '.workflow');
|
|
|
31
31
|
const TICKETS_DIR = path.join(WORKFLOW_DIR, 'tickets');
|
|
32
32
|
const PLANS_DIR = path.join(WORKFLOW_DIR, 'plans', 'current');
|
|
33
33
|
|
|
34
|
-
const TICKET_DIRS = ['backlog', 'ready', 'in-progress', 'review'];
|
|
34
|
+
const TICKET_DIRS = ['backlog', 'ready', 'in-progress', 'review', 'done', 'blocked'];
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Читает статус плана из frontmatter.
|
|
38
|
+
* Только планы со статусом "approved" могут быть декомпозированы автоматически.
|
|
39
|
+
* Планы со статусом "draft", "active" или без статуса — пропускаются.
|
|
40
|
+
*/
|
|
41
|
+
function getPlanStatus(planFile) {
|
|
42
|
+
const fullPath = path.join(WORKFLOW_DIR, planFile);
|
|
43
|
+
if (!fs.existsSync(fullPath)) return null;
|
|
44
|
+
try {
|
|
45
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
46
|
+
const { frontmatter } = parseFrontmatter(content);
|
|
47
|
+
return frontmatter.status || null;
|
|
48
|
+
} catch (e) {
|
|
49
|
+
console.error(`[WARN] Failed to read plan status from ${planFile}: ${e.message}`);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
35
53
|
|
|
36
54
|
/**
|
|
37
55
|
* Проверяет, есть ли тикеты, привязанные к данному плану
|
|
@@ -113,6 +131,13 @@ async function main() {
|
|
|
113
131
|
|
|
114
132
|
console.log(`[INFO] Found plan file: ${planFile}`);
|
|
115
133
|
|
|
134
|
+
const planStatus = getPlanStatus(planFile);
|
|
135
|
+
if (planStatus !== 'approved') {
|
|
136
|
+
console.log(`[INFO] Plan ${planId} has status "${planStatus}" (not "approved") — skipping decomposition`);
|
|
137
|
+
printResult({ status: 'decomposed' });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
116
141
|
if (hasTicketsForPlan(planId)) {
|
|
117
142
|
console.log(`[INFO] Plan ${planId} already has tickets — decomposed`);
|
|
118
143
|
printResult({ status: 'decomposed' });
|
|
@@ -137,6 +162,11 @@ async function main() {
|
|
|
137
162
|
console.log(`[INFO] Found ${allPlans.length} plan(s) in plans/current/`);
|
|
138
163
|
|
|
139
164
|
for (const { planId: pid, planFile } of allPlans) {
|
|
165
|
+
const planStatus = getPlanStatus(planFile);
|
|
166
|
+
if (planStatus !== 'approved') {
|
|
167
|
+
console.log(`[INFO] Plan ${pid} has status "${planStatus}" (not "approved") — skipping`);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
140
170
|
if (!hasTicketsForPlan(pid)) {
|
|
141
171
|
console.log(`[INFO] Plan ${pid} has no tickets — needs decomposition`);
|
|
142
172
|
printResult({ status: 'needs_decomposition', plan_file: planFile });
|
|
@@ -1,224 +1,224 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: check-relevance
|
|
3
|
-
description: Проверить актуальность тикета перед выполнением. Используется для предотвращения выполнения устаревших или уже завершённых задач.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Проверка актуальности тикета
|
|
7
|
-
|
|
8
|
-
> **ЗАПРЕТ:** НЕ перемещай, НЕ удаляй, НЕ переименовывай файлы тикетов. Твоя задача — ТОЛЬКО прочитать, при irrelevant добавить запись в таблицу ревью, и вернуть вердикт. Перемещение выполняет отдельный stage пайплайна. Проверяй ТОЛЬКО тикет из `ticket_id` контекста, игнорируй остальные поля (`ready_tickets` и т.д.).
|
|
9
|
-
|
|
10
|
-
Этот skill проверяет актуальность тикета перед его выполнением. Предотвращает выполнение устаревших/неактуальных задач.
|
|
11
|
-
|
|
12
|
-
## Когда использовать
|
|
13
|
-
|
|
14
|
-
- Тикет только что перемещён в `in-progress/`
|
|
15
|
-
- Перед выполнением основной задачи (execute-task)
|
|
16
|
-
- Для фильтрации задач с неактивными планами или выполненными DoD
|
|
17
|
-
|
|
18
|
-
## Шаги проверки
|
|
19
|
-
|
|
20
|
-
### 0. Быстрый выход по существующему ревью
|
|
21
|
-
|
|
22
|
-
**До любых проверок** найди в тикете секцию `## Ревью`.
|
|
23
|
-
|
|
24
|
-
Если последняя запись имеет статус `⏭ skipped` — тикет уже был проверен и пропущен. **Повторно проверять НЕ НАДО**, новую запись skipped добавлять НЕ НАДО. Немедленно верни:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
---RESULT---
|
|
28
|
-
status: irrelevant
|
|
29
|
-
reason: already_skipped
|
|
30
|
-
---RESULT---
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Если последней записи нет или статус другой — переходи к шагу 1.
|
|
34
|
-
|
|
35
|
-
### 1. Прочитать тикет
|
|
36
|
-
|
|
37
|
-
**ОБЯЗАТЕЛЬНО:** Используй `ticket_id` из секции Context промпта.
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
Путь: .workflow/tickets/in-progress/{TICKET-ID}.md
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Извлечь:
|
|
44
|
-
- `parent_plan` — ссылка на родительский план
|
|
45
|
-
- `dependencies` — зависимости тикета
|
|
46
|
-
- `conditions` — условия выполнения
|
|
47
|
-
- Критерии готовности (Definition of Done)
|
|
48
|
-
|
|
49
|
-
### 2. Проверить родительский план
|
|
50
|
-
|
|
51
|
-
Проверить статус родительского плана:
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
Путь: .workflow/plans/current/{PARENT_PLAN}.md
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**Критерии неактуальности:**
|
|
58
|
-
- План имеет `status: completed` — план уже завершён
|
|
59
|
-
- План имеет `status: archived` — план заархивирован
|
|
60
|
-
- План имеет `status: cancelled` — план отменён
|
|
61
|
-
|
|
62
|
-
**Если план неактивен:** тикет `irrelevant`
|
|
63
|
-
|
|
64
|
-
### 3. Проверить выполнение DoD
|
|
65
|
-
|
|
66
|
-
Проверить все критерии из Definition of Done тикета:
|
|
67
|
-
|
|
68
|
-
**Критерии неактуальности:**
|
|
69
|
-
- Все критерии уже отмечены как выполненные `[x]`
|
|
70
|
-
- В секции "Результат выполнения" уже есть заполненные данные
|
|
71
|
-
|
|
72
|
-
**Если DoD полностью выполнен:** тикет `irrelevant` (задача уже сделана)
|
|
73
|
-
|
|
74
|
-
### 4. Проверить зависимости
|
|
75
|
-
|
|
76
|
-
Проверить тикеты из секции `dependencies`:
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
Путь: .workflow/tickets/{status}/{DEP-TICKET}.md
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
**Критерии неактуальности:**
|
|
83
|
-
- Зависимый тикет находится в `blocked/` с причиной "неактуально"
|
|
84
|
-
- Зависимый тикет был удалён или перемещён в архив
|
|
85
|
-
|
|
86
|
-
**Если критические зависимости неактуальны:** тикет `irrelevant`
|
|
87
|
-
|
|
88
|
-
### 5. Проверить статус blocked
|
|
89
|
-
|
|
90
|
-
**Проверить секцию `## Блокировки` или frontmatter:**
|
|
91
|
-
|
|
92
|
-
Если тикет помечен как заблокированный → **неактуален**.
|
|
93
|
-
|
|
94
|
-
### 6. При irrelevant — записать в таблицу ревью тикета
|
|
95
|
-
|
|
96
|
-
Если вердикт `irrelevant`, **ОБЯЗАТЕЛЬНО** добавь запись в секцию `## Ревью` тикета:
|
|
97
|
-
|
|
98
|
-
- Если секции `## Ревью` нет — создай её в конце файла
|
|
99
|
-
- Если таблица уже есть — добавь строку в конец таблицы
|
|
100
|
-
|
|
101
|
-
Формат записи:
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
| {текущая дата} | ⏭️ skipped | {причина irrelevant: plan_inactive / dod_completed / dependencies_inactive} |
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Пример:
|
|
108
|
-
|
|
109
|
-
```markdown
|
|
110
|
-
## Ревью
|
|
111
|
-
|
|
112
|
-
| Дата | Статус | Самари |
|
|
113
|
-
|------|--------|--------|
|
|
114
|
-
| 2026-03-10 | ⏭️ skipped | DoD уже выполнен, тикет неактуален |
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Это единственная допустимая запись в файл — только добавление строки в таблицу ревью.
|
|
118
|
-
|
|
119
|
-
### 7. Принять решение
|
|
120
|
-
|
|
121
|
-
На основе проверок вывести результат:
|
|
122
|
-
|
|
123
|
-
| Проверка | Результат | Статус |
|
|
124
|
-
|----------|-----------|--------|
|
|
125
|
-
| План неактивен | Plan inactive | `irrelevant` |
|
|
126
|
-
| DoD выполнен | DoD completed | `irrelevant` |
|
|
127
|
-
| Зависимости неактуальны | Dependencies inactive | `irrelevant` |
|
|
128
|
-
| Все проверки пройдены | All checks passed | `relevant` |
|
|
129
|
-
|
|
130
|
-
## Fail-safe дизайн
|
|
131
|
-
|
|
132
|
-
**Важно:** При неизвестном статусе или ошибке проверки использовать fallback → `relevant`
|
|
133
|
-
|
|
134
|
-
Это гарантирует что тикет будет выполнен даже при проблемах с проверкой. Лучше выполнить лишний тикет, чем пропустить нужный.
|
|
135
|
-
|
|
136
|
-
## Формат результата
|
|
137
|
-
|
|
138
|
-
Обязательно выведи блок результата:
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
---RESULT---
|
|
142
|
-
status: relevant
|
|
143
|
-
---RESULT---
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
Или для неактуальных:
|
|
147
|
-
|
|
148
|
-
```
|
|
149
|
-
---RESULT---
|
|
150
|
-
status: irrelevant
|
|
151
|
-
reason: <причина: plan_inactive / dod_completed / dependencies_inactive>
|
|
152
|
-
---RESULT---
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
## Примеры
|
|
156
|
-
|
|
157
|
-
### Пример 1: Тикет актуален
|
|
158
|
-
|
|
159
|
-
```markdown
|
|
160
|
-
## Result
|
|
161
|
-
|
|
162
|
-
### Что проверено
|
|
163
|
-
- Родительский план PLAN-001: status: active ✓
|
|
164
|
-
- DoD: не все критерии выполнены ✓
|
|
165
|
-
- Зависимости: все активны ✓
|
|
166
|
-
|
|
167
|
-
### Решение
|
|
168
|
-
Тикет актуален, можно выполнять
|
|
169
|
-
|
|
170
|
-
---RESULT---
|
|
171
|
-
status: relevant
|
|
172
|
-
---RESULT---
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Пример 2: План завершён
|
|
176
|
-
|
|
177
|
-
```markdown
|
|
178
|
-
## Result
|
|
179
|
-
|
|
180
|
-
### Что проверено
|
|
181
|
-
- Родительский план PLAN-001: status: completed ✗
|
|
182
|
-
|
|
183
|
-
### Решение
|
|
184
|
-
План уже завершён, тикет неактуален
|
|
185
|
-
|
|
186
|
-
---RESULT---
|
|
187
|
-
status: irrelevant
|
|
188
|
-
reason: plan_inactive
|
|
189
|
-
---RESULT---
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### Пример 3: DoD выполнен
|
|
193
|
-
|
|
194
|
-
```markdown
|
|
195
|
-
## Result
|
|
196
|
-
|
|
197
|
-
### Что проверено
|
|
198
|
-
- Родительский план PLAN-001: status: active ✓
|
|
199
|
-
- DoD: все критерии отмечены [x] ✗
|
|
200
|
-
- Секция "Результат выполнения": заполнена ✗
|
|
201
|
-
|
|
202
|
-
### Решение
|
|
203
|
-
Задача уже выполнена, тикет неактуален
|
|
204
|
-
|
|
205
|
-
---RESULT---
|
|
206
|
-
status: irrelevant
|
|
207
|
-
reason: dod_completed
|
|
208
|
-
---RESULT---
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
## Интеграция с pipeline
|
|
212
|
-
|
|
213
|
-
Этот skill используется в stage `check-relevance` который размещается между:
|
|
214
|
-
- `move-to-in-progress` → `check-relevance` → `execute-task`
|
|
215
|
-
|
|
216
|
-
Переходы:
|
|
217
|
-
- `relevant` → перейти к `execute-task`
|
|
218
|
-
- `irrelevant` → переместить тикет в `done/` с пометкой
|
|
219
|
-
- `default` (fallback) → `execute-task` (fail-safe)
|
|
220
|
-
|
|
221
|
-
## Связанные skills
|
|
222
|
-
|
|
223
|
-
- `execute-task` — выполняет задачу после проверки актуальности
|
|
224
|
-
- `move-ticket` — перемещает неактуальные тикеты в done/
|
|
1
|
+
---
|
|
2
|
+
name: check-relevance
|
|
3
|
+
description: Проверить актуальность тикета перед выполнением. Используется для предотвращения выполнения устаревших или уже завершённых задач.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Проверка актуальности тикета
|
|
7
|
+
|
|
8
|
+
> **ЗАПРЕТ:** НЕ перемещай, НЕ удаляй, НЕ переименовывай файлы тикетов. Твоя задача — ТОЛЬКО прочитать, при irrelevant добавить запись в таблицу ревью, и вернуть вердикт. Перемещение выполняет отдельный stage пайплайна. Проверяй ТОЛЬКО тикет из `ticket_id` контекста, игнорируй остальные поля (`ready_tickets` и т.д.).
|
|
9
|
+
|
|
10
|
+
Этот skill проверяет актуальность тикета перед его выполнением. Предотвращает выполнение устаревших/неактуальных задач.
|
|
11
|
+
|
|
12
|
+
## Когда использовать
|
|
13
|
+
|
|
14
|
+
- Тикет только что перемещён в `in-progress/`
|
|
15
|
+
- Перед выполнением основной задачи (execute-task)
|
|
16
|
+
- Для фильтрации задач с неактивными планами или выполненными DoD
|
|
17
|
+
|
|
18
|
+
## Шаги проверки
|
|
19
|
+
|
|
20
|
+
### 0. Быстрый выход по существующему ревью
|
|
21
|
+
|
|
22
|
+
**До любых проверок** найди в тикете секцию `## Ревью`.
|
|
23
|
+
|
|
24
|
+
Если последняя запись имеет статус `⏭ skipped` — тикет уже был проверен и пропущен. **Повторно проверять НЕ НАДО**, новую запись skipped добавлять НЕ НАДО. Немедленно верни:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
---RESULT---
|
|
28
|
+
status: irrelevant
|
|
29
|
+
reason: already_skipped
|
|
30
|
+
---RESULT---
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Если последней записи нет или статус другой — переходи к шагу 1.
|
|
34
|
+
|
|
35
|
+
### 1. Прочитать тикет
|
|
36
|
+
|
|
37
|
+
**ОБЯЗАТЕЛЬНО:** Используй `ticket_id` из секции Context промпта.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Путь: .workflow/tickets/in-progress/{TICKET-ID}.md
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Извлечь:
|
|
44
|
+
- `parent_plan` — ссылка на родительский план
|
|
45
|
+
- `dependencies` — зависимости тикета
|
|
46
|
+
- `conditions` — условия выполнения
|
|
47
|
+
- Критерии готовности (Definition of Done)
|
|
48
|
+
|
|
49
|
+
### 2. Проверить родительский план
|
|
50
|
+
|
|
51
|
+
Проверить статус родительского плана:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Путь: .workflow/plans/current/{PARENT_PLAN}.md
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Критерии неактуальности:**
|
|
58
|
+
- План имеет `status: completed` — план уже завершён
|
|
59
|
+
- План имеет `status: archived` — план заархивирован
|
|
60
|
+
- План имеет `status: cancelled` — план отменён
|
|
61
|
+
|
|
62
|
+
**Если план неактивен:** тикет `irrelevant`
|
|
63
|
+
|
|
64
|
+
### 3. Проверить выполнение DoD
|
|
65
|
+
|
|
66
|
+
Проверить все критерии из Definition of Done тикета:
|
|
67
|
+
|
|
68
|
+
**Критерии неактуальности:**
|
|
69
|
+
- Все критерии уже отмечены как выполненные `[x]`
|
|
70
|
+
- В секции "Результат выполнения" уже есть заполненные данные
|
|
71
|
+
|
|
72
|
+
**Если DoD полностью выполнен:** тикет `irrelevant` (задача уже сделана)
|
|
73
|
+
|
|
74
|
+
### 4. Проверить зависимости
|
|
75
|
+
|
|
76
|
+
Проверить тикеты из секции `dependencies`:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Путь: .workflow/tickets/{status}/{DEP-TICKET}.md
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Критерии неактуальности:**
|
|
83
|
+
- Зависимый тикет находится в `blocked/` с причиной "неактуально"
|
|
84
|
+
- Зависимый тикет был удалён или перемещён в архив
|
|
85
|
+
|
|
86
|
+
**Если критические зависимости неактуальны:** тикет `irrelevant`
|
|
87
|
+
|
|
88
|
+
### 5. Проверить статус blocked
|
|
89
|
+
|
|
90
|
+
**Проверить секцию `## Блокировки` или frontmatter:**
|
|
91
|
+
|
|
92
|
+
Если тикет помечен как заблокированный → **неактуален**.
|
|
93
|
+
|
|
94
|
+
### 6. При irrelevant — записать в таблицу ревью тикета
|
|
95
|
+
|
|
96
|
+
Если вердикт `irrelevant`, **ОБЯЗАТЕЛЬНО** добавь запись в секцию `## Ревью` тикета:
|
|
97
|
+
|
|
98
|
+
- Если секции `## Ревью` нет — создай её в конце файла
|
|
99
|
+
- Если таблица уже есть — добавь строку в конец таблицы
|
|
100
|
+
|
|
101
|
+
Формат записи:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
| {текущая дата} | ⏭️ skipped | {причина irrelevant: plan_inactive / dod_completed / dependencies_inactive} |
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Пример:
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
## Ревью
|
|
111
|
+
|
|
112
|
+
| Дата | Статус | Самари |
|
|
113
|
+
|------|--------|--------|
|
|
114
|
+
| 2026-03-10 | ⏭️ skipped | DoD уже выполнен, тикет неактуален |
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Это единственная допустимая запись в файл — только добавление строки в таблицу ревью.
|
|
118
|
+
|
|
119
|
+
### 7. Принять решение
|
|
120
|
+
|
|
121
|
+
На основе проверок вывести результат:
|
|
122
|
+
|
|
123
|
+
| Проверка | Результат | Статус |
|
|
124
|
+
|----------|-----------|--------|
|
|
125
|
+
| План неактивен | Plan inactive | `irrelevant` |
|
|
126
|
+
| DoD выполнен | DoD completed | `irrelevant` |
|
|
127
|
+
| Зависимости неактуальны | Dependencies inactive | `irrelevant` |
|
|
128
|
+
| Все проверки пройдены | All checks passed | `relevant` |
|
|
129
|
+
|
|
130
|
+
## Fail-safe дизайн
|
|
131
|
+
|
|
132
|
+
**Важно:** При неизвестном статусе или ошибке проверки использовать fallback → `relevant`
|
|
133
|
+
|
|
134
|
+
Это гарантирует что тикет будет выполнен даже при проблемах с проверкой. Лучше выполнить лишний тикет, чем пропустить нужный.
|
|
135
|
+
|
|
136
|
+
## Формат результата
|
|
137
|
+
|
|
138
|
+
Обязательно выведи блок результата:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
---RESULT---
|
|
142
|
+
status: relevant
|
|
143
|
+
---RESULT---
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Или для неактуальных:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
---RESULT---
|
|
150
|
+
status: irrelevant
|
|
151
|
+
reason: <причина: plan_inactive / dod_completed / dependencies_inactive>
|
|
152
|
+
---RESULT---
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Примеры
|
|
156
|
+
|
|
157
|
+
### Пример 1: Тикет актуален
|
|
158
|
+
|
|
159
|
+
```markdown
|
|
160
|
+
## Result
|
|
161
|
+
|
|
162
|
+
### Что проверено
|
|
163
|
+
- Родительский план PLAN-001: status: active ✓
|
|
164
|
+
- DoD: не все критерии выполнены ✓
|
|
165
|
+
- Зависимости: все активны ✓
|
|
166
|
+
|
|
167
|
+
### Решение
|
|
168
|
+
Тикет актуален, можно выполнять
|
|
169
|
+
|
|
170
|
+
---RESULT---
|
|
171
|
+
status: relevant
|
|
172
|
+
---RESULT---
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Пример 2: План завершён
|
|
176
|
+
|
|
177
|
+
```markdown
|
|
178
|
+
## Result
|
|
179
|
+
|
|
180
|
+
### Что проверено
|
|
181
|
+
- Родительский план PLAN-001: status: completed ✗
|
|
182
|
+
|
|
183
|
+
### Решение
|
|
184
|
+
План уже завершён, тикет неактуален
|
|
185
|
+
|
|
186
|
+
---RESULT---
|
|
187
|
+
status: irrelevant
|
|
188
|
+
reason: plan_inactive
|
|
189
|
+
---RESULT---
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Пример 3: DoD выполнен
|
|
193
|
+
|
|
194
|
+
```markdown
|
|
195
|
+
## Result
|
|
196
|
+
|
|
197
|
+
### Что проверено
|
|
198
|
+
- Родительский план PLAN-001: status: active ✓
|
|
199
|
+
- DoD: все критерии отмечены [x] ✗
|
|
200
|
+
- Секция "Результат выполнения": заполнена ✗
|
|
201
|
+
|
|
202
|
+
### Решение
|
|
203
|
+
Задача уже выполнена, тикет неактуален
|
|
204
|
+
|
|
205
|
+
---RESULT---
|
|
206
|
+
status: irrelevant
|
|
207
|
+
reason: dod_completed
|
|
208
|
+
---RESULT---
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Интеграция с pipeline
|
|
212
|
+
|
|
213
|
+
Этот skill используется в stage `check-relevance` который размещается между:
|
|
214
|
+
- `move-to-in-progress` → `check-relevance` → `execute-task`
|
|
215
|
+
|
|
216
|
+
Переходы:
|
|
217
|
+
- `relevant` → перейти к `execute-task`
|
|
218
|
+
- `irrelevant` → переместить тикет в `done/` с пометкой
|
|
219
|
+
- `default` (fallback) → `execute-task` (fail-safe)
|
|
220
|
+
|
|
221
|
+
## Связанные skills
|
|
222
|
+
|
|
223
|
+
- `execute-task` — выполняет задачу после проверки актуальности
|
|
224
|
+
- `move-ticket` — перемещает неактуальные тикеты в done/
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Coach — Модульный скилл
|
|
2
|
+
|
|
3
|
+
Скилл для агента workflow-ai, обрабатывающего тикеты `COACH-*`.
|
|
4
|
+
Мета-скил для создания, аудита и совершенствования других скилов.
|
|
5
|
+
|
|
6
|
+
## Структура
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
coach/
|
|
10
|
+
├── SKILL.md # Ядро: роль, маршрутизация, принципы
|
|
11
|
+
│
|
|
12
|
+
├── workflows/ # Пошаговые воркфлоу по типам тикетов
|
|
13
|
+
│ ├── create.md # COACH-*: CREATE — создание нового скила
|
|
14
|
+
│ ├── audit.md # COACH-*: AUDIT — полный аудит скила
|
|
15
|
+
│ ├── analyze.md # COACH-*: ANALYZE — анализ эффективности
|
|
16
|
+
│ ├── improve.md # COACH-*: IMPROVE — точечное улучшение
|
|
17
|
+
│ ├── research.md # COACH-*: RESEARCH — поиск знаний
|
|
18
|
+
│ └── review.md # COACH-*: REVIEW — ревью структуры и качества
|
|
19
|
+
│
|
|
20
|
+
├── knowledge/ # Экспертные знания (подгружаются по запросу)
|
|
21
|
+
│ ├── skill-anatomy.md # Эталонная структура скила
|
|
22
|
+
│ ├── common-antipatterns.md # Типичные ошибки в скилах
|
|
23
|
+
│ └── prompt-engineering.md # Принципы написания инструкций
|
|
24
|
+
│
|
|
25
|
+
├── algorithms/ # Формализованные методы принятия решений
|
|
26
|
+
│ ├── skill-scoring.md # Оценка качества скила (0–100)
|
|
27
|
+
│ ├── gap-analysis.md # Поиск пробелов в покрытии скила
|
|
28
|
+
│ └── improvement-prioritization.md # Приоритизация улучшений (ICE)
|
|
29
|
+
│
|
|
30
|
+
├── templates/ # Шаблоны вывода
|
|
31
|
+
│ ├── new-skill.md # Структура нового скила
|
|
32
|
+
│ ├── audit-report.md # Результат аудита
|
|
33
|
+
│ └── improvement-plan.md # План улучшений
|
|
34
|
+
│
|
|
35
|
+
└── README.md # Этот файл
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Как это работает
|
|
39
|
+
|
|
40
|
+
1. Агент получает тикет `COACH-*` из `in-progress/`
|
|
41
|
+
2. **SKILL.md** — всегда в контексте: роль, маршрутизация, принципы
|
|
42
|
+
3. По типу тикета агент подгружает нужный **workflow**
|
|
43
|
+
4. Воркфлоу ссылается на **knowledge** и **algorithms** по необходимости
|
|
44
|
+
5. Результат оформляется по **template**
|
|
45
|
+
|
|
46
|
+
## Типичные сценарии
|
|
47
|
+
|
|
48
|
+
| Задача | Тикет | Воркфлоу |
|
|
49
|
+
|--------|-------|----------|
|
|
50
|
+
| Создать скил для новой роли | COACH-001: CREATE | `workflows/create.md` |
|
|
51
|
+
| Проверить качество GML-скила | COACH-002: AUDIT | `workflows/audit.md` |
|
|
52
|
+
| Понять почему тикеты GML выполняются плохо | COACH-003: ANALYZE | `workflows/analyze.md` |
|
|
53
|
+
| Добавить знания в скил | COACH-004: IMPROVE | `workflows/improve.md` |
|
|
54
|
+
| Найти лучшие практики для домена | COACH-005: RESEARCH | `workflows/research.md` |
|
|
55
|
+
| Быстро проверить новый скил | COACH-006: REVIEW | `workflows/review.md` |
|
|
56
|
+
|
|
57
|
+
## Как расширять
|
|
58
|
+
|
|
59
|
+
### Добавить новый тип тикета
|
|
60
|
+
|
|
61
|
+
1. Создай `workflows/new-type.md` с алгоритмом выполнения
|
|
62
|
+
2. Добавь строку в таблицу маршрутизации в `SKILL.md`
|
|
63
|
+
3. Если нужен шаблон вывода — добавь в `templates/`
|
|
64
|
+
|
|
65
|
+
### Добавить новые знания
|
|
66
|
+
|
|
67
|
+
1. Создай файл в `knowledge/` (например `knowledge/skill-versioning.md`)
|
|
68
|
+
2. Добавь строку в таблицу «Загрузка знаний» в `SKILL.md`
|
|
69
|
+
3. Укажи в каких воркфлоу его подгружать
|
|
70
|
+
|
|
71
|
+
### Добавить новый алгоритм
|
|
72
|
+
|
|
73
|
+
1. Создай файл в `algorithms/` (например `algorithms/complexity-estimation.md`)
|
|
74
|
+
2. Добавь строку в таблицу «Загрузка алгоритмов» в `SKILL.md`
|
|
75
|
+
3. Укажи в каких воркфлоу его использовать
|
|
76
|
+
|
|
77
|
+
### Добавить новый шаблон
|
|
78
|
+
|
|
79
|
+
1. Создай файл в `templates/`
|
|
80
|
+
2. Укажи в соответствующем воркфлоу ссылку на шаблон
|
|
81
|
+
|
|
82
|
+
### Расширить существующие модули
|
|
83
|
+
|
|
84
|
+
Каждый файл в `knowledge/` содержит маркер:
|
|
85
|
+
```
|
|
86
|
+
<!-- РАСШИРЕНИЕ: добавляй ... ниже -->
|
|
87
|
+
```
|
|
88
|
+
Дописывай новую информацию после этого маркера.
|
|
89
|
+
|
|
90
|
+
## Примеры расширений
|
|
91
|
+
|
|
92
|
+
**Новый антипаттерн:** допиши в `knowledge/common-antipatterns.md` строку в таблицу по формату существующих.
|
|
93
|
+
|
|
94
|
+
**Новый критерий scoring:** допиши в `algorithms/skill-scoring.md` строку в нужную категорию (пересчитай максимум баллов).
|
|
95
|
+
|
|
96
|
+
**Новый тип исследования:** допиши в `workflows/research.md` строку в таблицу поисковых запросов.
|
|
97
|
+
|
|
98
|
+
**Новый воркфлоу (пример — миграция скила на новую версию):**
|
|
99
|
+
1. Создай `workflows/migrate.md`
|
|
100
|
+
2. В `SKILL.md` добавь строку: `| MIGRATE | «миграция», «обновить формат» | ... | → workflows/migrate.md |`
|