workflow-ai 1.0.35 → 1.0.37
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');
|
|
@@ -840,11 +840,14 @@ class StageExecutor {
|
|
|
840
840
|
// Если args содержит -p с ролью — объединяем роль и промпт в один аргумент
|
|
841
841
|
// Иначе Claude CLI интерпретирует роль как промпт, а реальный промпт игнорирует
|
|
842
842
|
const lastPIdx = args.lastIndexOf('-p');
|
|
843
|
+
let stdinPrompt = null;
|
|
843
844
|
if (lastPIdx !== -1 && lastPIdx < args.length - 1) {
|
|
844
845
|
const role = args[lastPIdx + 1];
|
|
845
846
|
args[lastPIdx + 1] = `${prompt}\n\nТвоя роль: ${role}`;
|
|
846
847
|
} else {
|
|
847
|
-
|
|
848
|
+
// Передаём промпт через stdin вместо аргумента,
|
|
849
|
+
// т.к. shell: true на Windows обрезает многострочные аргументы
|
|
850
|
+
stdinPrompt = prompt;
|
|
848
851
|
}
|
|
849
852
|
|
|
850
853
|
// Логгируем команду перед запуском (вместо промпта — имя skill)
|
|
@@ -867,7 +870,10 @@ class StageExecutor {
|
|
|
867
870
|
shell: process.platform === 'win32' && agent.command !== 'node'
|
|
868
871
|
});
|
|
869
872
|
|
|
870
|
-
//
|
|
873
|
+
// Передаём промпт через stdin или закрываем если промпт в аргументах
|
|
874
|
+
if (stdinPrompt) {
|
|
875
|
+
child.stdin.write(stdinPrompt);
|
|
876
|
+
}
|
|
871
877
|
child.stdin.end();
|
|
872
878
|
|
|
873
879
|
let stdout = '';
|
|
@@ -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,18 @@ description: Декомпозировать план на исполняемые
|
|
|
13
13
|
- Нужно разбить крупную задачу на подзадачи
|
|
14
14
|
- Требуется детальная декомпозиция
|
|
15
15
|
|
|
16
|
-
## ⛔
|
|
16
|
+
## ⛔ ЗАПРЕЩЕНО сканировать все планы если указан конкретный план
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Ты получаешь промпт с секциями Context и Instructions.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
| Другой/пустой | **СТОП.** Не декомпозировать. Выведи `status: decomposed`. |
|
|
20
|
+
**Если в Context или Instructions есть `plan_id` или `plan_file` или путь к конкретному плану (например `PLAN-005.md`):**
|
|
21
|
+
- Декомпозируй ТОЛЬКО этот план
|
|
22
|
+
- НЕ сканируй `plans/current/` — это ЗАПРЕЩЕНО
|
|
23
|
+
- НЕ проверяй статус плана (`draft`, `active` — неважно) — это ЗАПРЕЩЕНО
|
|
24
|
+
- НЕ читай и не упоминай другие планы — это ЗАПРЕЩЕНО
|
|
25
|
+
- Открой файл плана и сразу переходи к шагу 1
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
**Только если нигде в промпте нет указания на конкретный план** — тогда сканируй `plans/current/` и декомпозируй только планы со статусом `approved`.
|
|
29
28
|
|
|
30
29
|
## Шаги выполнения
|
|
31
30
|
|