workflow-ai 1.0.13 → 1.0.15

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.
@@ -474,7 +474,7 @@ pipeline:
474
474
  # log_file: — путь к файлу логов (относительно корня проекта)
475
475
  # ===========================================================================
476
476
  execution:
477
- max_steps: 100
478
- delay_between_stages: 5
477
+ max_steps: 1500
478
+ delay_between_stages: 1
479
479
  timeout_per_stage: 1800
480
480
  log_file: ".workflow/logs/pipeline.log"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workflow-ai",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "AI Agent Workflow Coordinator — kanban-based pipeline for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/src/lib/utils.mjs CHANGED
@@ -133,17 +133,8 @@ export function getLastReviewStatus(content) {
133
133
  });
134
134
 
135
135
  if (dataRows.length > 0) {
136
- // Ищем строку с самой поздней датой (при равных последняя по позиции)
137
- let latestRow = dataRows[0];
138
- let latestDate = '';
139
- for (const row of dataRows) {
140
- const cells = row.split('|').map(c => c.trim()).filter(c => c);
141
- const dateStr = cells[0] || '';
142
- if (dateStr >= latestDate) {
143
- latestDate = dateStr;
144
- latestRow = row;
145
- }
146
- }
136
+ // Последняя строка таблицы = самое свежее ревью (записи ведутся хронологически сверху вниз)
137
+ const latestRow = dataRows[dataRows.length - 1];
147
138
  const cells = latestRow.split('|').map(c => c.trim()).filter(c => c);
148
139
  const statusRaw = cells[1]?.toLowerCase() || '';
149
140
  if (statusRaw.includes('passed')) return 'passed';
@@ -154,16 +145,8 @@ export function getLastReviewStatus(content) {
154
145
  // Пробуем распарсить текстовый формат (список)
155
146
  const listItems = reviewSection.split('\n').filter(line => line.trim().match(/^[-*]\s/));
156
147
  if (listItems.length > 0) {
157
- // Ищем элемент с самой поздней датой (при равных — последний по позиции)
158
- let latestItem = listItems[0].trim();
159
- let latestDate = '';
160
- for (const item of listItems) {
161
- const dateMatch = item.match(/(\d{4}-\d{2}-\d{2})/);
162
- if (dateMatch && dateMatch[1] >= latestDate) {
163
- latestDate = dateMatch[1];
164
- latestItem = item.trim();
165
- }
166
- }
148
+ // Последний элемент списка = самое свежее ревью (записи ведутся хронологически)
149
+ const latestItem = listItems[listItems.length - 1].trim();
167
150
  const statusMatch = latestItem.match(/:\s*(passed|failed)\b/i);
168
151
  if (statusMatch) return statusMatch[1].toLowerCase();
169
152
  }
@@ -19,11 +19,13 @@ description: Проверить результат выполнения зада
19
19
 
20
20
  ## Шаги проверки
21
21
 
22
- ### 0. Проверить наличие предыдущего успешного ревью
22
+ ### 0. Проверить последний статус ревью
23
23
 
24
24
  **До любых проверок** найди в тикете секцию `## Ревью`.
25
25
 
26
- Если секция существует и содержит запись со статусом `passed` (в виде `✅ passed` или просто `passed`) ревью уже пройдено успешно ранее. Немедленно верни результат без выполнения дальнейших проверок:
26
+ Если секция существует и содержит записипосмотри на **последнюю запись** (последняя строка таблицы или последний элемент списка):
27
+
28
+ - Если последняя запись имеет статус `passed` — ревью уже пройдено. Немедленно верни результат:
27
29
 
28
30
  ```
29
31
  ---RESULT---
@@ -32,9 +34,9 @@ issues: []
32
34
  ---RESULT---
33
35
  ```
34
36
 
35
- > Логика: повторная проверка уже прошедшего ревьюлишняя работа. Если задача была одобрена — она одобрена.
37
+ - Если последняя запись имеет статус `failed`**необходима повторная проверка**. Переходи к шагу 1.
36
38
 
37
- Только если ни одной успешной записи нетпереходи к шагу 1.
39
+ > **ВАЖНО:** Проверяй именно ПОСЛЕДНЮЮ запись, а не любую. Если после `passed` появилась `failed` задача требует повторной проверки. Только если последний статус `passed` — можно пропустить.
38
40
 
39
41
  ### 1. Прочитать тикет
40
42
 
@@ -114,7 +116,8 @@ issues:
114
116
  0. Быстрый выход:
115
117
  - Прочитать тикет
116
118
  - Найти секцию "## Ревью"
117
- - Если есть запись с "passed" → вернуть status: passed, остановиться
119
+ - Если последняя запись "passed" → вернуть status: passed, остановиться
120
+ - Если последняя запись "failed" → перейти к шагу 1 (повторная проверка)
118
121
 
119
122
  1. Парсинг тикета:
120
123
  - Извлечь DoD (список критериев)
@@ -138,7 +141,8 @@ issues:
138
141
  5. Вывод результата в формате ---RESULT---
139
142
 
140
143
  6. Пометка тикета о результате ревью:
141
- - Добавить/обновить секцию `## Ревью` в тикете
144
+ - Добавить секцию `## Ревью` в тикете (если её нет — создать с заголовком таблицы)
145
+ - **ВАЖНО: новую запись добавлять В КОНЕЦ таблицы** (последней строкой). Не вставлять перед существующими записями!
142
146
  - Указать:
143
147
  - Дата ревью
144
148
  - Статус: passed/failed
@@ -233,26 +237,18 @@ issues:
233
237
 
234
238
  ## Формат секции ревью в тикете
235
239
 
236
- После проверки skill добавляет в тикет секцию:
240
+ После проверки skill добавляет в тикет секцию. **Новые записи всегда добавляются В КОНЕЦ таблицы** (хронологический порядок: старые сверху, новые снизу):
237
241
 
238
242
  ```markdown
239
243
  ## Ревью
240
244
 
241
245
  | Дата | Статус | Самари |
242
246
  |------|--------|--------|
243
- | 2026-03-03 14:30 | passed | Все критерии DoD выполнены |
244
- | 2026-03-03 15:45 | failed | Не пройдены тесты, отсутствует файл logger.py |
247
+ | 2026-03-03 14:30 | failed | Не пройдены тесты, отсутствует файл logger.py |
248
+ | 2026-03-03 15:45 | passed | Все критерии DoD выполнены после исправления |
245
249
  ```
246
250
 
247
- Или в текстовом формате:
248
-
249
- ```markdown
250
- ## Ревью
251
-
252
- **Дата:** 2026-03-03 14:30
253
- **Статус:** passed/failed
254
- **Самари:** Краткое описание результата (что не так, если failed)
255
- ```
251
+ > **Порядок записей:** хронологический сверху вниз. Последняя строка = последнее ревью. Код `getLastReviewStatus()` определяет статус по последней строке.
256
252
 
257
253
  ## Интеграция с пайплайном
258
254