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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workflow-ai",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "description": "AI Agent Workflow Coordinator — kanban-based pipeline for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
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
- args.push(prompt);
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
- // Закрываем stdin чтобы агент не ждал дополнительного ввода
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
- **Если DoD полностью выполнен:** тикет `irrelevant` (задача уже сделана)
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
- **ПЕРЕД любой работой** прочитай frontmatter плана и проверь поле `status`.
18
+ Ты получаешь промпт с секциями Context и Instructions.
19
19
 
20
- | Статус плана | Действие |
21
- |-------------|----------|
22
- | `approved` | Декомпозировать. Продолжай к шагу 1. |
23
- | `draft` | **СТОП.** Не декомпозировать. Выведи `status: decomposed` и завершись. Draft-план ещё не одобрен человеком. |
24
- | `active` | **СТОП.** Не декомпозировать. План уже в работе. Выведи `status: decomposed`. |
25
- | `completed` | **СТОП.** Не декомпозировать. План завершён. Выведи `status: decomposed`. |
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
- **Почему:** Без этой проверки pipeline автоматически декомпозирует любой план, обнаруженный в `plans/current/`, включая черновики, созданные другими тикетами. Это приводит к неконтролируемому разрастанию backlog (scope creep). Уже дважды происходило.
27
+ **Только если нигде в промпте нет указания на конкретный план** тогда сканируй `plans/current/` и декомпозируй только планы со статусом `approved`.
29
28
 
30
29
  ## Шаги выполнения
31
30