workflow-ai 1.0.34 → 1.0.36
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
CHANGED
package/src/runner.mjs
CHANGED
|
@@ -314,7 +314,7 @@ class PromptBuilder {
|
|
|
314
314
|
// Добавляем блок Instructions если поле instructions задано и непустое
|
|
315
315
|
if (stage.instructions && typeof stage.instructions === 'string' && stage.instructions.trim() !== '') {
|
|
316
316
|
parts.push('\n\nInstructions:');
|
|
317
|
-
parts.push(stage.instructions.trim());
|
|
317
|
+
parts.push(this.interpolate(stage.instructions.trim()));
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
return parts.join('\n');
|
|
@@ -841,8 +841,8 @@ class StageExecutor {
|
|
|
841
841
|
// Иначе Claude CLI интерпретирует роль как промпт, а реальный промпт игнорирует
|
|
842
842
|
const lastPIdx = args.lastIndexOf('-p');
|
|
843
843
|
if (lastPIdx !== -1 && lastPIdx < args.length - 1) {
|
|
844
|
-
const
|
|
845
|
-
args[lastPIdx + 1] = `${
|
|
844
|
+
const role = args[lastPIdx + 1];
|
|
845
|
+
args[lastPIdx + 1] = `${prompt}\n\nТвоя роль: ${role}`;
|
|
846
846
|
} else {
|
|
847
847
|
args.push(prompt);
|
|
848
848
|
}
|
|
@@ -131,13 +131,6 @@ async function main() {
|
|
|
131
131
|
|
|
132
132
|
console.log(`[INFO] Found plan file: ${planFile}`);
|
|
133
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
|
-
|
|
141
134
|
if (hasTicketsForPlan(planId)) {
|
|
142
135
|
console.log(`[INFO] Plan ${planId} already has tickets — decomposed`);
|
|
143
136
|
printResult({ status: 'decomposed' });
|
|
@@ -30,6 +30,15 @@ reason: already_skipped
|
|
|
30
30
|
---RESULT---
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
Если последняя запись имеет статус `❌ failed` — тикет был выполнен, но ревью провалилось. Тикету нужна **доработка через execute-task**, а НЕ повторное ревью. Немедленно верни:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
---RESULT---
|
|
37
|
+
status: relevant
|
|
38
|
+
reason: review_failed_needs_rework
|
|
39
|
+
---RESULT---
|
|
40
|
+
```
|
|
41
|
+
|
|
33
42
|
Если последней записи нет или статус другой — переходи к шагу 1.
|
|
34
43
|
|
|
35
44
|
### 1. Прочитать тикет
|
|
@@ -69,7 +78,9 @@ reason: already_skipped
|
|
|
69
78
|
- Все критерии уже отмечены как выполненные `[x]`
|
|
70
79
|
- В секции "Результат выполнения" уже есть заполненные данные
|
|
71
80
|
|
|
72
|
-
|
|
81
|
+
**ВАЖНО:** Если DoD выполнен, но последнее ревью `❌ failed` — тикет **НЕ неактуален**, ему нужна доработка. Верни `relevant` (reason: review_failed_needs_rework). Это предотвращает бесконечный цикл повторного ревью без доработки.
|
|
82
|
+
|
|
83
|
+
**Если DoD полностью выполнен И ревью НЕ failed:** тикет `irrelevant` (задача уже сделана)
|
|
73
84
|
|
|
74
85
|
### 4. Проверить зависимости
|
|
75
86
|
|
|
@@ -122,8 +133,9 @@ reason: already_skipped
|
|
|
122
133
|
|
|
123
134
|
| Проверка | Результат | Статус |
|
|
124
135
|
|----------|-----------|--------|
|
|
136
|
+
| Последнее ревью failed | Needs rework | `relevant` |
|
|
125
137
|
| План неактивен | Plan inactive | `irrelevant` |
|
|
126
|
-
| DoD выполнен | DoD completed | `irrelevant` |
|
|
138
|
+
| DoD выполнен (ревью НЕ failed) | DoD completed | `irrelevant` |
|
|
127
139
|
| Зависимости неактуальны | Dependencies inactive | `irrelevant` |
|
|
128
140
|
| Все проверки пройдены | All checks passed | `relevant` |
|
|
129
141
|
|
|
@@ -13,19 +13,14 @@ description: Декомпозировать план на исполняемые
|
|
|
13
13
|
- Нужно разбить крупную задачу на подзадачи
|
|
14
14
|
- Требуется детальная декомпозиция
|
|
15
15
|
|
|
16
|
-
## ⛔
|
|
16
|
+
## ⛔ ПЕРВЫЙ ШАГ: определи какой план декомпозировать
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Прочитай свой промпт. Если в нём указан `plan_id` или `plan_file` (например `plan_id: PLAN-005` или `plan_file: plans/current/PLAN-005.md`) — ты ОБЯЗАН декомпозировать именно этот план.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
| `active` | **СТОП.** Не декомпозировать. План уже в работе. Выведи `status: decomposed`. |
|
|
25
|
-
| `completed` | **СТОП.** Не декомпозировать. План завершён. Выведи `status: decomposed`. |
|
|
26
|
-
| Другой/пустой | **СТОП.** Не декомпозировать. Выведи `status: decomposed`. |
|
|
27
|
-
|
|
28
|
-
**Почему:** Без этой проверки pipeline автоматически декомпозирует любой план, обнаруженный в `plans/current/`, включая черновики, созданные другими тикетами. Это приводит к неконтролируемому разрастанию backlog (scope creep). Уже дважды происходило.
|
|
20
|
+
**Правила:**
|
|
21
|
+
1. Если указан `plan_file` — открой `.workflow/{plan_file}` и декомпозируй его. Не читай другие планы. Не проверяй статус. Сразу переходи к шагу 1.
|
|
22
|
+
2. Если указан `plan_id` но нет `plan_file` — найди план `plans/current/{plan_id}.md` и декомпозируй его. Не проверяй статус.
|
|
23
|
+
3. Если ни `plan_id`, ни `plan_file` не указаны — сканируй все планы в `plans/current/` и декомпозируй только те, у которых `status: approved`.
|
|
29
24
|
|
|
30
25
|
## Шаги выполнения
|
|
31
26
|
|