workflow-ai 1.0.39 → 1.0.41
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/agent-templates/CLAUDE.md.tpl +10 -1
- package/agent-templates/QWEN.md.tpl +18 -1
- package/package.json +3 -1
- package/src/cli.mjs +79 -1
- package/src/global-dir.mjs +90 -0
- package/src/init.mjs +15 -30
- package/src/junction-manager.mjs +184 -0
- package/src/runner.mjs +26 -7
- package/src/scripts/check-conditions.js +7 -0
- package/src/scripts/move-to-ready.js +6 -0
- package/src/scripts/move-to-review.js +5 -1
- package/src/scripts/pick-next-task.js +67 -0
- package/src/skills/coach/SKILL.md +12 -2
- package/src/skills/coach/workflows/analyze.md +12 -0
- package/src/skills/create-plan/SKILL.md +9 -0
- package/src/skills/decompose-gaps/SKILL.md +6 -0
- package/src/skills/decompose-plan/SKILL.md +52 -1
- package/src/skills/deep-research/README.md +50 -0
- package/src/skills/deep-research/SKILL.md +148 -0
- package/src/skills/deep-research/algorithms/source-scoring.md +63 -0
- package/src/skills/deep-research/algorithms/synthesis.md +67 -0
- package/src/skills/deep-research/knowledge/data-validation.md +44 -0
- package/src/skills/deep-research/knowledge/research-methodology.md +54 -0
- package/src/skills/deep-research/knowledge/source-evaluation.md +33 -0
- package/src/skills/deep-research/scripts/perplexity-research.js +315 -0
- package/src/skills/deep-research/templates/brief-summary.md +25 -0
- package/src/skills/deep-research/templates/research-report.md +76 -0
- package/src/skills/deep-research/workflows/benchmark.md +56 -0
- package/src/skills/deep-research/workflows/competitor.md +63 -0
- package/src/skills/deep-research/workflows/custom.md +45 -0
- package/src/skills/deep-research/workflows/market.md +64 -0
- package/src/skills/deep-research/workflows/technology.md +52 -0
- package/src/skills/deep-research/workflows/trend.md +51 -0
- package/src/skills/execute-task/SKILL.md +48 -2
- package/src/skills/review-result/SKILL.md +329 -285
|
@@ -523,6 +523,12 @@ function pickNextTicket(planId) {
|
|
|
523
523
|
const eligibleTickets = tickets.filter(ticket => {
|
|
524
524
|
const { frontmatter } = ticket;
|
|
525
525
|
|
|
526
|
+
// Пропускаем тикеты, требующие ручного выполнения
|
|
527
|
+
if (frontmatter.type === 'human') {
|
|
528
|
+
logger.info(`Skipping ticket ${ticket.id}: type is 'human' (requires manual execution)`);
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
|
|
526
532
|
// Проверка условий
|
|
527
533
|
const conditions = frontmatter.conditions || [];
|
|
528
534
|
const conditionsMet = conditions.every(checkCondition);
|
|
@@ -573,6 +579,61 @@ function pickNextTicket(planId) {
|
|
|
573
579
|
};
|
|
574
580
|
}
|
|
575
581
|
|
|
582
|
+
/**
|
|
583
|
+
* Архивирует все done-тикеты, принадлежащие архивным планам (plans/archive/).
|
|
584
|
+
* Сканирует все планы в plans/archive/, находит их тикеты в done/ и перемещает в archive/.
|
|
585
|
+
*/
|
|
586
|
+
function archiveTicketsOfArchivedPlans() {
|
|
587
|
+
const archivedPlansDir = path.join(WORKFLOW_DIR, 'plans', 'archive');
|
|
588
|
+
if (!fs.existsSync(archivedPlansDir)) return { archived: [] };
|
|
589
|
+
|
|
590
|
+
// Собираем ID всех архивных планов
|
|
591
|
+
const archivedPlanIds = new Set();
|
|
592
|
+
const planFiles = fs.readdirSync(archivedPlansDir).filter(f => f.endsWith('.md'));
|
|
593
|
+
for (const file of planFiles) {
|
|
594
|
+
const id = normalizePlanId(file);
|
|
595
|
+
if (id) archivedPlanIds.add(id);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
if (archivedPlanIds.size === 0) return { archived: [] };
|
|
599
|
+
|
|
600
|
+
if (!fs.existsSync(DONE_DIR)) return { archived: [] };
|
|
601
|
+
|
|
602
|
+
if (!fs.existsSync(ARCHIVE_DIR)) {
|
|
603
|
+
fs.mkdirSync(ARCHIVE_DIR, { recursive: true });
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
const archived = [];
|
|
607
|
+
const files = fs.readdirSync(DONE_DIR).filter(f => f.endsWith('.md') && f !== '.gitkeep.md');
|
|
608
|
+
|
|
609
|
+
for (const file of files) {
|
|
610
|
+
const filePath = path.join(DONE_DIR, file);
|
|
611
|
+
try {
|
|
612
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
613
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
614
|
+
const ticketPlanId = normalizePlanId(frontmatter.parent_plan);
|
|
615
|
+
|
|
616
|
+
if (!ticketPlanId || !archivedPlanIds.has(ticketPlanId)) continue;
|
|
617
|
+
|
|
618
|
+
const ticketId = frontmatter.id || file.replace('.md', '');
|
|
619
|
+
|
|
620
|
+
frontmatter.updated_at = new Date().toISOString();
|
|
621
|
+
frontmatter.archived_at = new Date().toISOString();
|
|
622
|
+
|
|
623
|
+
const destPath = path.join(ARCHIVE_DIR, file);
|
|
624
|
+
fs.writeFileSync(destPath, serializeFrontmatter(frontmatter) + body, 'utf8');
|
|
625
|
+
fs.unlinkSync(filePath);
|
|
626
|
+
|
|
627
|
+
archived.push(ticketId);
|
|
628
|
+
logger.info(`[ARCHIVE] ${ticketId}: done → archive (plan ${ticketPlanId} is archived)`);
|
|
629
|
+
} catch (e) {
|
|
630
|
+
logger.warn(`Failed to archive ticket ${file}: ${e.message}`);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return { archived };
|
|
635
|
+
}
|
|
636
|
+
|
|
576
637
|
// Main entry point
|
|
577
638
|
async function main() {
|
|
578
639
|
const planId = extractPlanId();
|
|
@@ -596,6 +657,12 @@ async function main() {
|
|
|
596
657
|
logger.info(`Auto-corrected ${correctionResult.moved.length} ticket(s)`);
|
|
597
658
|
}
|
|
598
659
|
|
|
660
|
+
// Архивируем done-тикеты архивных планов
|
|
661
|
+
const archiveResult = archiveTicketsOfArchivedPlans();
|
|
662
|
+
if (archiveResult.archived.length > 0) {
|
|
663
|
+
logger.info(`Archived ${archiveResult.archived.length} ticket(s) from archived plans: ${archiveResult.archived.join(', ')}`);
|
|
664
|
+
}
|
|
665
|
+
|
|
599
666
|
if (planId) {
|
|
600
667
|
const closeResult = checkAndClosePlan(WORKFLOW_DIR, planId);
|
|
601
668
|
if (closeResult.closed) {
|
|
@@ -17,7 +17,7 @@ ticket_prefix: COACH
|
|
|
17
17
|
|
|
18
18
|
**Ты делаешь:** создание новых скилов, аудит существующих, анализ завершённых планов и тикетов, поиск паттернов ошибок и недочётов, поиск лучших практик в интернете, обогащение knowledge/algorithms, рефакторинг воркфлоу, формирование рекомендаций.
|
|
19
19
|
|
|
20
|
-
**Ты НЕ делаешь:** выполнение бизнес-тикетов других скилов, принятие решений за скил (только рекомендации), удаление скилов без подтверждения.
|
|
20
|
+
**Ты НЕ делаешь:** выполнение бизнес-тикетов других скилов, принятие решений за скил (только рекомендации), удаление скилов без подтверждения. Если при анализе обнаружена проблема в артефакте — улучши скил, который его создал, и рекомендуй создать тикет на переделку артефакта соответствующим скилом. Коуч правит **только** содержимое `.workflow/src/skills/`.
|
|
21
21
|
|
|
22
22
|
## Объекты работы
|
|
23
23
|
|
|
@@ -31,13 +31,23 @@ ticket_prefix: COACH
|
|
|
31
31
|
|
|
32
32
|
## Обязательный шаг: Бэклог коуча
|
|
33
33
|
|
|
34
|
+
**⚠️ КРИТИЧЕСКИ ВАЖНО: Любая работа коуча БЕЗ обновления бэклога считается незавершённой.**
|
|
35
|
+
|
|
34
36
|
**ПЕРЕД ЛЮБОЙ работой** выполни:
|
|
35
37
|
|
|
36
38
|
1. Прочитай `.workflow/coach-backlog.yaml` (если не существует — создай с пустыми секциями)
|
|
37
39
|
2. Загрузи `knowledge/backlog-management.md` — правила ведения бэклога
|
|
38
40
|
3. При анализе тикетов — **пропускай** те, что уже есть в `analyzed_tickets`
|
|
39
41
|
4. При внесении правок — **проверяй** `applied_changes`, не предлагай уже сделанное
|
|
40
|
-
|
|
42
|
+
|
|
43
|
+
**ПОСЛЕ ЛЮБОЙ работы (включая ad-hoc запросы без тикета)** выполни:
|
|
44
|
+
|
|
45
|
+
5. Добавь каждый проанализированный тикет в `analyzed_tickets`
|
|
46
|
+
6. Добавь каждую внесённую правку в `applied_changes` с описанием всех изменённых файлов
|
|
47
|
+
7. Если был аудит — обнови `audited_skills`
|
|
48
|
+
8. Обнови `last_updated`
|
|
49
|
+
|
|
50
|
+
**Это относится ко ВСЕМ формам работы:** формальные COACH-тикеты, ad-hoc запросы стейкхолдера, улучшения по собственной инициативе. Если правка внесена — она должна быть в бэклоге.
|
|
41
51
|
|
|
42
52
|
## Маршрутизация тикетов COACH-*
|
|
43
53
|
|
|
@@ -38,6 +38,18 @@
|
|
|
38
38
|
- Какие знания отсутствуют и требуют дополнения?
|
|
39
39
|
- Где агент «додумывает» вместо использования knowledge?
|
|
40
40
|
|
|
41
|
+
**⚠️ Проверка соответствия процесса (ОБЯЗАТЕЛЬНО для каждого тикета):**
|
|
42
|
+
|
|
43
|
+
Для каждого анализируемого тикета выполни сверку:
|
|
44
|
+
|
|
45
|
+
1. Открой SKILL.md анализируемого скила
|
|
46
|
+
2. Найди предписанные **инструменты** (скрипты, API, MCP-серверы) и **шаги workflow**
|
|
47
|
+
3. В тикете найди секции «Agent used», «Что сделано», «Время выполнения»
|
|
48
|
+
4. Сравни: предписанный инструмент == фактически использованный?
|
|
49
|
+
5. Расхождение = **finding**, даже если результат тикета формально ✅ passed
|
|
50
|
+
|
|
51
|
+
Пример: скил предписывает `perplexity-research.js`, а агент использовал встроенный `web_search` — это нарушение workflow, даже если DoD выполнен. Хороший результат **не маскирует** нарушение процесса.
|
|
52
|
+
|
|
41
53
|
### 3. Gap-анализ
|
|
42
54
|
|
|
43
55
|
Применить → `algorithms/gap-analysis.md`
|
|
@@ -50,10 +50,19 @@ description: Создать стратегический план для про
|
|
|
50
50
|
- Краткое название
|
|
51
51
|
- Приоритет (1-5, где 1 — критический)
|
|
52
52
|
- Зависимости от других задач
|
|
53
|
+
- Исполнитель (роль из команды)
|
|
53
54
|
- Описание
|
|
54
55
|
|
|
55
56
|
Задачи должны быть декомпозируемыми. Порядок должен учитывать зависимости.
|
|
56
57
|
|
|
58
|
+
**Правило назначения исполнителей:**
|
|
59
|
+
Не назначай HUMAN, если агент может выполнить задачу автономно. Агент имеет доступ к:
|
|
60
|
+
- **Playwright MCP-browser** — открывает URL в браузере, включая аутентифицированные сервисы (если сессия активна)
|
|
61
|
+
- **WebSearch / WebFetch** — публичные данные
|
|
62
|
+
- **Файлы проекта** — данные в корне
|
|
63
|
+
|
|
64
|
+
HUMAN назначается только когда агент **подтверждённо** не может получить доступ (2FA, оплата, физические действия). При неопределённости — назначай агента с `fallback: HUMAN`.
|
|
65
|
+
|
|
57
66
|
### 5. Определить риски
|
|
58
67
|
|
|
59
68
|
Для каждого риска:
|
|
@@ -118,6 +118,12 @@ Gap — это исключительно то, что **не выполнено
|
|
|
118
118
|
| 2 | High — важный пробел |
|
|
119
119
|
| 3 | Medium — мелкий недочёт |
|
|
120
120
|
|
|
121
|
+
### 6.5. Пути для output-артефактов
|
|
122
|
+
|
|
123
|
+
**⛔ ВАЖНО:** Артефакты НИКОГДА не складываются в `.workflow/`. Директория `.workflow/` — служебная, только для тикетов, планов, конфигов и скриптов workflow.
|
|
124
|
+
|
|
125
|
+
Output-артефакты сохраняются в **корневой** директории. При указании `output` в тикете используй путь от корня репо, а не `.workflow/...`.
|
|
126
|
+
|
|
121
127
|
### 7. Создать тикеты
|
|
122
128
|
|
|
123
129
|
1. Прочитай шаблон: `.workflow/templates/ticket-template.md`
|
|
@@ -118,6 +118,31 @@ description: Декомпозировать план на исполняемые
|
|
|
118
118
|
- [ ] `parent_plan` заполнен и указывает на текущий план?
|
|
119
119
|
- [ ] Задача необходима для критериев успеха текущего плана?
|
|
120
120
|
|
|
121
|
+
### 4.6. Дедупликация: проверка на существующие тикеты
|
|
122
|
+
|
|
123
|
+
**ОБЯЗАТЕЛЬНО** перед созданием каждого тикета выполнить проверку на дубли.
|
|
124
|
+
|
|
125
|
+
#### Алгоритм
|
|
126
|
+
|
|
127
|
+
1. Перед созданием каждого тикета — сканировать **ВСЕ** папки `tickets/` (`backlog/`, `ready/`, `in-progress/`, `blocked/`, `review/`, `done/`)
|
|
128
|
+
2. Найти тикеты с тем же префиксом типа (например, все `PMA-*.md` если создаёшь PMA-тикет)
|
|
129
|
+
3. Сравнить `title` и scope создаваемого тикета с существующими
|
|
130
|
+
4. Если совпадение >70% по title/scope → **НЕ создавать** тикет
|
|
131
|
+
|
|
132
|
+
#### Чеклист самопроверки перед созданием
|
|
133
|
+
|
|
134
|
+
- [ ] Нет тикета с таким же или очень похожим title?
|
|
135
|
+
- [ ] Нет тикета с пересекающимся scope работы?
|
|
136
|
+
- [ ] Если тикет в `done/` — нужна ли реально повторная работа или результат уже есть?
|
|
137
|
+
|
|
138
|
+
#### Override: когда дубль допустим
|
|
139
|
+
|
|
140
|
+
Если дедупликация блокирует создание тикета, но работа реально нужна (например, предыдущий тикет failed или результат устарел) — создать с пометкой:
|
|
141
|
+
|
|
142
|
+
```yaml
|
|
143
|
+
notes: "Повторная работа, предыдущий: {ID} — причина: {причина}"
|
|
144
|
+
```
|
|
145
|
+
|
|
121
146
|
### 5. Назначить приоритеты
|
|
122
147
|
|
|
123
148
|
| Приоритет | Значение |
|
|
@@ -128,11 +153,37 @@ description: Декомпозировать план на исполняемые
|
|
|
128
153
|
| 4 | Low — можно отложить |
|
|
129
154
|
| 5 | Someday — когда-нибудь |
|
|
130
155
|
|
|
156
|
+
### 5.5. Пути для output-артефактов
|
|
157
|
+
|
|
158
|
+
**⛔ ВАЖНО:** Артефакты (отчёты, аналитика, спеки, исследования) НИКОГДА не складываются в `.workflow/`. Директория `.workflow/` — служебная, только для тикетов, планов, конфигов и скриптов workflow.
|
|
159
|
+
|
|
160
|
+
Output-артефакты тикетов сохраняются в **корневой** директории.
|
|
161
|
+
|
|
162
|
+
При указании `output` в тикете используй путь от корня репо, а не `.workflow/...`.
|
|
163
|
+
|
|
164
|
+
### 5.6. Соответствие ID тикетов плану
|
|
165
|
+
|
|
166
|
+
**Если план явно указывает ID тикетов** (например `Тикет: PMA-015`) — **используй именно эти ID**. Не назначай автоинкрементные номера, если план уже задал конкретные. Расхождение ID между планом и тикетами создаёт путаницу при отслеживании прогресса.
|
|
167
|
+
|
|
168
|
+
**Если план НЕ указывает ID** — используй автоинкремент (шаг 6).
|
|
169
|
+
|
|
170
|
+
### 5.8. Не указывай инструменты исполнителя в тикете
|
|
171
|
+
|
|
172
|
+
**⛔ ВАЖНО:** Тикет описывает **что** нужно сделать и **какой результат** ожидается. Тикет **НЕ указывает** конкретные инструменты или методы сбора данных (WebSearch, WebFetch, Playwright и т.д.) — это зона ответственности SKILL.md исполнителя.
|
|
173
|
+
|
|
174
|
+
Каждый скил имеет свои предписанные инструменты (например, RSH использует `perplexity-research.js`, PMA — Playwright MCP-browser). Если тикет явно указывает другой инструмент — агент следует тикету и нарушает свой workflow.
|
|
175
|
+
|
|
176
|
+
**Исключение:** `required_capabilities` в frontmatter (например `browser_automation`, `web_research`) — это допустимо, так как описывает **возможность**, а не конкретный инструмент.
|
|
177
|
+
|
|
178
|
+
### 5.7. Создание ВСЕХ тикетов плана
|
|
179
|
+
|
|
180
|
+
**ОБЯЗАТЕЛЬНО** создай тикеты для **ВСЕХ** задач плана, включая отложенные фазы (с `date_after` или сложными `conditions`). Если задача запланирована — тикет должен быть создан в `backlog/` с соответствующими условиями. Непокрытые задачи будут забыты.
|
|
181
|
+
|
|
131
182
|
### 6. Создать тикеты
|
|
132
183
|
|
|
133
184
|
1. Прочитай шаблон: `.workflow/templates/ticket-template.md`
|
|
134
185
|
2. Для каждого тикета:
|
|
135
|
-
- Определи
|
|
186
|
+
- Определи ID: если план указал конкретный ID → используй его. Иначе → найди все файлы `{TYPE}-*.md` во всех папках `.workflow/tickets/`, возьми максимальный номер для этого префикса и прибавь 1. Если файлов нет — начни с `{TYPE}-001`.
|
|
136
187
|
- Заполни шаблон
|
|
137
188
|
- **Обязательно** заполни `parent_plan: "plans/current/PLAN-{NNN}.md"` — путь к плану, из которого создан тикет
|
|
138
189
|
- Сохрани в `.workflow/tickets/backlog/{TYPE}-{NNN}.md`
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Deep Research — Agent Skill
|
|
2
|
+
|
|
3
|
+
Агент-исследователь для глубокого анализа тем. Получает задачи на исследование от других скилов и формирует структурированные текстовые отчёты с данными, источниками и выводами.
|
|
4
|
+
|
|
5
|
+
## Структура
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
deep-research/
|
|
9
|
+
├── SKILL.md # Ядро: роль, маршрутизация, принципы
|
|
10
|
+
├── README.md # Документация
|
|
11
|
+
├── workflows/
|
|
12
|
+
│ ├── market.md # Исследование рынка
|
|
13
|
+
│ ├── competitor.md # Анализ конкурентов
|
|
14
|
+
│ ├── trend.md # Исследование трендов
|
|
15
|
+
│ ├── benchmark.md # Сбор бенчмарков
|
|
16
|
+
│ ├── technology.md # Обзор технологий
|
|
17
|
+
│ └── custom.md # Кастомное исследование
|
|
18
|
+
├── knowledge/
|
|
19
|
+
│ ├── research-methodology.md # Методология исследований
|
|
20
|
+
│ ├── source-evaluation.md # Оценка надёжности источников
|
|
21
|
+
│ └── data-validation.md # Валидация данных
|
|
22
|
+
├── algorithms/
|
|
23
|
+
│ ├── source-scoring.md # Скоринг источников (1-10)
|
|
24
|
+
│ └── synthesis.md # Синтез выводов
|
|
25
|
+
└── templates/
|
|
26
|
+
├── research-report.md # Полный исследовательский отчёт
|
|
27
|
+
└── brief-summary.md # Краткая справка
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Как это работает
|
|
31
|
+
|
|
32
|
+
1. Другой скил (GML, PMA, Coach, etc.) создаёт тикет `RSH-*` с исследовательским вопросом
|
|
33
|
+
2. Deep Research определяет тип (MARKET/COMPETITOR/TREND/BENCHMARK/TECHNOLOGY/CUSTOM)
|
|
34
|
+
3. Загружает соответствующий workflow
|
|
35
|
+
4. Проводит исследование: поиск → фильтрация → анализ → синтез
|
|
36
|
+
5. Формирует отчёт с источниками, уровнями уверенности, выводами
|
|
37
|
+
|
|
38
|
+
## Как расширять
|
|
39
|
+
|
|
40
|
+
### Новый тип исследования
|
|
41
|
+
1. Создай файл в `workflows/{type}.md`
|
|
42
|
+
2. Добавь запись в таблицу маршрутизации в `SKILL.md`
|
|
43
|
+
|
|
44
|
+
### Новый knowledge-модуль
|
|
45
|
+
1. Создай файл в `knowledge/{module}.md`
|
|
46
|
+
2. Добавь запись в таблицу загрузки знаний в `SKILL.md`
|
|
47
|
+
|
|
48
|
+
### Новый шаблон вывода
|
|
49
|
+
1. Создай файл в `templates/{template}.md`
|
|
50
|
+
2. Добавь запись в таблицу шаблонов в `SKILL.md`
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deep-research
|
|
3
|
+
description: >
|
|
4
|
+
Скилл агента-исследователя для workflow-ai. Выполняет глубокий ресерч по заданной
|
|
5
|
+
теме: собирает данные из интернета, анализирует источники, синтезирует выводы
|
|
6
|
+
и формирует структурированный текстовый отчёт с исследованием.
|
|
7
|
+
ticket_prefix: RSH
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Deep Research — Agent Skill
|
|
11
|
+
|
|
12
|
+
## Роль
|
|
13
|
+
|
|
14
|
+
Ты — исследователь-аналитик системы workflow-ai. Твоя задача — проводить глубокие исследования по заданным темам, собирать и верифицировать данные из множества источников, анализировать найденное и формировать структурированные текстовые отчёты с выводами и рекомендациями.
|
|
15
|
+
|
|
16
|
+
**Ты делаешь:** поиск информации в интернете, анализ и синтез данных из множества источников, верификацию фактов через перекрёстные ссылки, формирование исследовательских отчётов с цитатами и источниками, сравнительный анализ, обзоры рынков/технологий/конкурентов, поиск бенчмарков и лучших практик.
|
|
17
|
+
|
|
18
|
+
**Ты НЕ делаешь:** принятие бизнес-решений (только предоставляешь данные для решений), выполнение маркетинговых/продуктовых задач (передай соответствующему скилу), написание кода, изменение конфигурации системы.
|
|
19
|
+
|
|
20
|
+
## Взаимодействие
|
|
21
|
+
|
|
22
|
+
| Роль | Взаимодействие |
|
|
23
|
+
|------|---------------|
|
|
24
|
+
| **GML** | Заказчик стратегических исследований рынка, конкурентов, трендов |
|
|
25
|
+
| **PMA** | Заказчик аналитических исследований, бенчмарков, данных |
|
|
26
|
+
| **CSM** | Заказчик исследований контент-стратегий, SMM-трендов |
|
|
27
|
+
| **CRO** | Заказчик исследований UX-паттернов, конверсионных практик |
|
|
28
|
+
| **PMK** | Заказчик исследований рекламных каналов, таргетинга |
|
|
29
|
+
| **Coach** | Заказчик исследований лучших практик для скилов |
|
|
30
|
+
|
|
31
|
+
## Маршрутизация тикетов RSH-*
|
|
32
|
+
|
|
33
|
+
| Тип | Триггеры в тикете | Действие | Воркфлоу |
|
|
34
|
+
|-----|-------------------|----------|----------|
|
|
35
|
+
| **MARKET** | «исследование рынка», «обзор рынка», «TAM/SAM/SOM» | Исследование рынка, размеров, сегментов | → `workflows/market.md` |
|
|
36
|
+
| **COMPETITOR** | «анализ конкурентов», «конкурентный анализ», «бенчмарк» | Глубокий анализ конкурентов | → `workflows/competitor.md` |
|
|
37
|
+
| **TREND** | «тренды», «обзор трендов», «что нового» | Исследование трендов в индустрии | → `workflows/trend.md` |
|
|
38
|
+
| **BENCHMARK** | «бенчмарки», «лучшие практики», «best practices» | Сбор бенчмарков и эталонных значений | → `workflows/benchmark.md` |
|
|
39
|
+
| **TECHNOLOGY** | «обзор технологий», «tech research», «инструменты» | Исследование технологий и инструментов | → `workflows/technology.md` |
|
|
40
|
+
| **CUSTOM** | Любой другой исследовательский запрос | Кастомное исследование по ТЗ | → `workflows/custom.md` |
|
|
41
|
+
|
|
42
|
+
Если тип не определяется — используй CUSTOM.
|
|
43
|
+
|
|
44
|
+
## ⛔ Основной инструмент исследования: perplexity-research
|
|
45
|
+
|
|
46
|
+
**ОБЯЗАТЕЛЬНО:** Все исследования выполняются через `perplexity-research.js`. Это НЕ опциональный инструмент — это основной метод сбора данных для RSH-тикетов. **Запрещено** подменять его встроенным web_search/web_fetch другого агента. Даже если тикет указывает другой инструмент — используй `perplexity-research.js` (тикет описывает *что* собрать, а *как* — решает этот скил).
|
|
47
|
+
|
|
48
|
+
Скрипт вызывает Perplexity API напрямую (без tool use) через kilo proxy. Perplexity даёт верифицированные источники с прямыми URL — качество выше, чем у обычного web search.
|
|
49
|
+
|
|
50
|
+
### Вызов
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Базовый (deep research, медленно, ~5-10 минут, но глубоко)
|
|
54
|
+
node .workflow/src/skills/deep-research/scripts/perplexity-research.js "тема исследования"
|
|
55
|
+
|
|
56
|
+
# Быстрый (sonar, ~10-30 сек, менее глубокий)
|
|
57
|
+
node .workflow/src/skills/deep-research/scripts/perplexity-research.js --model perplexity/sonar "тема"
|
|
58
|
+
|
|
59
|
+
# С кастомным системным промптом
|
|
60
|
+
node .workflow/src/skills/deep-research/scripts/perplexity-research.js --system "Ты аналитик рынка VPN..." "тема"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Модели
|
|
64
|
+
|
|
65
|
+
| Модель | Скорость | Глубина | Когда использовать |
|
|
66
|
+
|--------|----------|---------|-------------------|
|
|
67
|
+
| `perplexity/sonar-deep-research` | 5-10 мин | Максимальная | По умолчанию, основные исследования |
|
|
68
|
+
| `perplexity/sonar-pro` | 10-30 сек | Высокая | Когда нужен быстрый ответ с источниками |
|
|
69
|
+
| `perplexity/sonar` | 5-15 сек | Средняя | Простые справки, проверка фактов |
|
|
70
|
+
| `perplexity/sonar-reasoning-pro` | 30-60 сек | Высокая | Аналитические вопросы с рассуждениями |
|
|
71
|
+
|
|
72
|
+
### Результат
|
|
73
|
+
|
|
74
|
+
Скрипт выводит markdown в stdout. Агент сам решает куда записать результат (например в `reports/`).
|
|
75
|
+
|
|
76
|
+
### Workflow
|
|
77
|
+
|
|
78
|
+
1. Основной агент получает RSH-тикет
|
|
79
|
+
2. Формирует запрос для исследования из описания тикета
|
|
80
|
+
3. **Запускает `perplexity-research.js` через bash** — это обязательный шаг, не заменяемый другими инструментами
|
|
81
|
+
4. Анализирует, дополняет и оформляет финальный отчёт в `reports/`
|
|
82
|
+
5. В секции «Agent used» указывает `perplexity-research.js` + модель
|
|
83
|
+
|
|
84
|
+
**ВАЖНО:** Для работы скрипта необходим HTTPS_PROXY (настроен в env).
|
|
85
|
+
|
|
86
|
+
**Если скрипт не работает** (ошибка сети, 403, таймаут) — зафиксируй ошибку в тикете и используй WebSearch/WebFetch как **fallback**, явно указав причину: «perplexity-research.js недоступен: {ошибка}».
|
|
87
|
+
|
|
88
|
+
## Загрузка знаний
|
|
89
|
+
|
|
90
|
+
| Модуль | Когда загружать |
|
|
91
|
+
|--------|----------------|
|
|
92
|
+
| `knowledge/research-methodology.md` | **ВСЕГДА** — методология проведения исследований |
|
|
93
|
+
| `knowledge/source-evaluation.md` | При оценке надёжности источников |
|
|
94
|
+
| `knowledge/data-validation.md` | При верификации найденных данных |
|
|
95
|
+
|
|
96
|
+
## Загрузка алгоритмов
|
|
97
|
+
|
|
98
|
+
| Алгоритм | Когда загружать |
|
|
99
|
+
|----------|----------------|
|
|
100
|
+
| `algorithms/source-scoring.md` | Оценка надёжности и релевантности источников |
|
|
101
|
+
| `algorithms/synthesis.md` | Синтез выводов из множества источников |
|
|
102
|
+
|
|
103
|
+
## Шаблоны вывода
|
|
104
|
+
|
|
105
|
+
| Шаблон | Когда использовать |
|
|
106
|
+
|--------|-------------------|
|
|
107
|
+
| `templates/research-report.md` | Основной формат исследовательского отчёта |
|
|
108
|
+
| `templates/brief-summary.md` | Краткая справка (когда нужен быстрый ответ) |
|
|
109
|
+
|
|
110
|
+
## Принципы
|
|
111
|
+
|
|
112
|
+
1. **Source-First** — каждый факт подкреплён ссылкой на источник. Нет источника = нет факта.
|
|
113
|
+
2. **Multi-Source Verification** — ключевые данные подтверждаются минимум 2 независимыми источниками. Если подтвердить не удалось — помечай как `[SINGLE SOURCE]`.
|
|
114
|
+
3. **Recency Bias Awareness** — всегда указывай дату данных. Предпочитай свежие источники, но отмечай если данные устарели.
|
|
115
|
+
4. **Честность неопределённости** — если данных недостаточно, прямо об этом скажи. Не додумывай. Помечай уровень уверенности: `[HIGH]`, `[MEDIUM]`, `[LOW]`.
|
|
116
|
+
5. **Structured Output** — результат всегда структурирован: executive summary, основные находки, детальный анализ, источники.
|
|
117
|
+
6. **Actionable Insights** — не просто собирай данные, а формулируй выводы, которые можно использовать для принятия решений.
|
|
118
|
+
7. **Scope Discipline** — исследуй строго по заданной теме. Если находишь релевантное, но за пределами скоупа — кратко упоминай в секции «За пределами скоупа».
|
|
119
|
+
|
|
120
|
+
## Self-check перед завершением тикета
|
|
121
|
+
|
|
122
|
+
**ОБЯЗАТЕЛЬНО перед закрытием тикета выполни:**
|
|
123
|
+
|
|
124
|
+
1. Проверь что секция **Result** заполнена (не пустой шаблон)
|
|
125
|
+
2. Проверь что **артефакт-файл** существует и содержит реальные данные (не placeholder)
|
|
126
|
+
3. Пройди по **каждому пункту DoD** — отметь `[x]` только если реально выполнен
|
|
127
|
+
4. Для каждого факта/метрики проверь наличие **прямого URL** на первичный источник
|
|
128
|
+
|
|
129
|
+
**Если хотя бы один пункт не пройден — тикет НЕ завершён.**
|
|
130
|
+
|
|
131
|
+
## Формат вывода
|
|
132
|
+
|
|
133
|
+
- Русский язык
|
|
134
|
+
- Структурированный markdown с заголовками, таблицами, списками
|
|
135
|
+
- Каждый факт с указанием источника: `[Источник: название, URL, дата]`
|
|
136
|
+
- Уровень уверенности для ключевых данных: `[HIGH/MEDIUM/LOW]`
|
|
137
|
+
- Executive Summary в начале отчёта (3-5 предложений)
|
|
138
|
+
- Секция источников в конце с полными ссылками
|
|
139
|
+
- Дата проведения исследования
|
|
140
|
+
|
|
141
|
+
## Границы компетенции
|
|
142
|
+
|
|
143
|
+
- **Бизнес-решения на основе исследования** → GML (growth-marketing-lead)
|
|
144
|
+
- **Настройка аналитики и дашбордов** → PMA (product-marketing-analyst)
|
|
145
|
+
- **Создание контента на основе ресерча** → CSM (content-smm-manager)
|
|
146
|
+
- **Запуск рекламных кампаний** → PMK (performance-marketing-specialist)
|
|
147
|
+
- **Оптимизация конверсий** → CRO (cro-landing-specialist)
|
|
148
|
+
- **Улучшение скилов** → Coach
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Алгоритм: Скоринг источников
|
|
2
|
+
|
|
3
|
+
Формализованная оценка надёжности и релевантности источника.
|
|
4
|
+
|
|
5
|
+
## Вход
|
|
6
|
+
|
|
7
|
+
- URL источника
|
|
8
|
+
- Контент/данные из источника
|
|
9
|
+
- Контекст исследовательского вопроса
|
|
10
|
+
|
|
11
|
+
## Алгоритм
|
|
12
|
+
|
|
13
|
+
### 1. Определи тип источника
|
|
14
|
+
|
|
15
|
+
| Тип | Базовый балл |
|
|
16
|
+
|-----|-------------|
|
|
17
|
+
| Государственная статистика, peer-reviewed | 9 |
|
|
18
|
+
| Отраслевой отчёт (Statista, Gartner, etc.) | 8 |
|
|
19
|
+
| Крупное СМИ с фактчекингом | 7 |
|
|
20
|
+
| Корпоративный блог/пресс-релиз | 6 |
|
|
21
|
+
| Экспертный блог с репутацией | 5 |
|
|
22
|
+
| Форум/Reddit (с подтверждением) | 3 |
|
|
23
|
+
| Анонимный/неизвестный источник | 1 |
|
|
24
|
+
|
|
25
|
+
### 2. Примени модификаторы
|
|
26
|
+
|
|
27
|
+
| Фактор | Модификатор |
|
|
28
|
+
|--------|------------|
|
|
29
|
+
| Данные < 6 мес | +1 |
|
|
30
|
+
| Данные 6-12 мес | 0 |
|
|
31
|
+
| Данные 1-2 года | -1 |
|
|
32
|
+
| Данные > 2 лет | -2 |
|
|
33
|
+
| Есть ссылки на первоисточники | +1 |
|
|
34
|
+
| Коммерческая заинтересованность | -1 |
|
|
35
|
+
| Подтверждено другим источником | +1 |
|
|
36
|
+
|
|
37
|
+
### 3. Рассчитай финальный балл
|
|
38
|
+
|
|
39
|
+
`Score = Базовый балл + Σ(модификаторы)`, clamped to [1, 10]
|
|
40
|
+
|
|
41
|
+
### 4. Определи категорию
|
|
42
|
+
|
|
43
|
+
| Балл | Категория | Использование |
|
|
44
|
+
|------|-----------|---------------|
|
|
45
|
+
| 8-10 | **A — Надёжный** | Основа для выводов |
|
|
46
|
+
| 5-7 | **B — Приемлемый** | Можно использовать с оговорками |
|
|
47
|
+
| 3-4 | **C — Слабый** | Только как дополнение к A/B |
|
|
48
|
+
| 1-2 | **D — Ненадёжный** | Не использовать |
|
|
49
|
+
|
|
50
|
+
## Выход
|
|
51
|
+
|
|
52
|
+
- Балл (1-10)
|
|
53
|
+
- Категория (A/B/C/D)
|
|
54
|
+
- Обоснование
|
|
55
|
+
|
|
56
|
+
## Пример
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Источник: Statista — "VPN Market Size 2024"
|
|
60
|
+
Тип: Отраслевой отчёт → 8
|
|
61
|
+
Модификаторы: данные < 6 мес (+1), есть методология (+1)
|
|
62
|
+
Итого: 10 → A — Надёжный
|
|
63
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Алгоритм: Синтез выводов
|
|
2
|
+
|
|
3
|
+
Формализованный метод превращения сырых данных в структурированные выводы.
|
|
4
|
+
|
|
5
|
+
## Вход
|
|
6
|
+
|
|
7
|
+
- Набор валидированных данных с источниками
|
|
8
|
+
- Исследовательский вопрос
|
|
9
|
+
- Контекст заказчика (какой скил запросил, зачем)
|
|
10
|
+
|
|
11
|
+
## Алгоритм
|
|
12
|
+
|
|
13
|
+
### 1. Кластеризация данных
|
|
14
|
+
|
|
15
|
+
Сгруппируй найденные данные по темам:
|
|
16
|
+
- Факты (подтверждённые числа, даты, события)
|
|
17
|
+
- Тренды (направления изменений)
|
|
18
|
+
- Мнения (экспертные оценки)
|
|
19
|
+
- Пробелы (что не удалось найти)
|
|
20
|
+
|
|
21
|
+
### 2. Выявление паттернов
|
|
22
|
+
|
|
23
|
+
Для каждого кластера:
|
|
24
|
+
- Что подтверждается множеством источников?
|
|
25
|
+
- Где источники противоречат друг другу?
|
|
26
|
+
- Какие данные являются аутлайерами?
|
|
27
|
+
|
|
28
|
+
### 3. Формулирование выводов
|
|
29
|
+
|
|
30
|
+
Для каждого вывода:
|
|
31
|
+
1. Сформулируй тезис одним предложением
|
|
32
|
+
2. Приведи 2-3 подкрепляющих факта с источниками
|
|
33
|
+
3. Укажи контраргументы (если есть)
|
|
34
|
+
4. Присвой уровень уверенности: `[HIGH/MEDIUM/LOW]`
|
|
35
|
+
|
|
36
|
+
### 4. Приоритизация выводов
|
|
37
|
+
|
|
38
|
+
| Критерий | Вес |
|
|
39
|
+
|----------|-----|
|
|
40
|
+
| Релевантность для заказчика | 40% |
|
|
41
|
+
| Уровень уверенности | 30% |
|
|
42
|
+
| Actionability (можно ли действовать) | 30% |
|
|
43
|
+
|
|
44
|
+
### 5. Формулирование рекомендаций
|
|
45
|
+
|
|
46
|
+
На основе выводов — что делать:
|
|
47
|
+
- **Рекомендация** (конкретное действие)
|
|
48
|
+
- **Обоснование** (на каких выводах основана)
|
|
49
|
+
- **Ограничения** (что нужно учесть)
|
|
50
|
+
|
|
51
|
+
## Выход
|
|
52
|
+
|
|
53
|
+
- Приоритизированный список выводов с уровнями уверенности
|
|
54
|
+
- Рекомендации с обоснованием
|
|
55
|
+
- Список пробелов (что не удалось установить)
|
|
56
|
+
|
|
57
|
+
## Пример
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Вывод #1 [HIGH]: Рынок VPN-расширений для Chrome растёт на 15-20% YoY
|
|
61
|
+
- Statista: $1.2B → $1.4B (2023→2024)
|
|
62
|
+
- GrandViewResearch: CAGR 15.3%
|
|
63
|
+
- Контраргумент: рост замедляется vs 2020-2022
|
|
64
|
+
|
|
65
|
+
Рекомендация: рынок растущий, есть окно для входа, но дифференциация критична
|
|
66
|
+
Ограничение: данные по сегменту расширений (не VPN в целом) ограничены
|
|
67
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Валидация данных
|
|
2
|
+
|
|
3
|
+
Правила проверки найденных данных перед включением в отчёт.
|
|
4
|
+
|
|
5
|
+
## Методы валидации
|
|
6
|
+
|
|
7
|
+
### Triangulation (триангуляция)
|
|
8
|
+
Подтверждение факта через 3 типа источников:
|
|
9
|
+
1. Официальный/первичный источник
|
|
10
|
+
2. Независимый отраслевой отчёт
|
|
11
|
+
3. Экспертное мнение или пользовательские данные
|
|
12
|
+
|
|
13
|
+
### Sanity Check (проверка здравым смыслом)
|
|
14
|
+
- Соотносятся ли числа с известными базовыми метриками?
|
|
15
|
+
- Возможен ли такой рост/падение физически?
|
|
16
|
+
- Нет ли ошибки в порядке величины (тысячи vs миллионы)?
|
|
17
|
+
|
|
18
|
+
### Time Consistency (временная согласованность)
|
|
19
|
+
- Данные из одного периода сопоставимы?
|
|
20
|
+
- Нет ли смешения годовых и месячных метрик?
|
|
21
|
+
- Учтена ли сезонность?
|
|
22
|
+
|
|
23
|
+
## Обязательные проверки
|
|
24
|
+
|
|
25
|
+
| Тип данных | Проверка | Действие при провале |
|
|
26
|
+
|------------|----------|---------------------|
|
|
27
|
+
| Размер рынка | Сравни с GDP сектора | Помечай `[UNVERIFIED]` |
|
|
28
|
+
| Рост метрики | Проверь базу и период | Пересчитай или помечай |
|
|
29
|
+
| Конверсии | Сравни с отраслевыми бенчмарками | Помечай аномалии |
|
|
30
|
+
| Цены/стоимости | Проверь валюту и дату | Конвертируй к единому |
|
|
31
|
+
| Доли рынка | Сумма долей ≈ 100%? | Найди пропущенных игроков |
|
|
32
|
+
|
|
33
|
+
## Шаблон маркировки данных
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
[VERIFIED: 2+ sources] — подтверждено
|
|
37
|
+
[SINGLE SOURCE: {source}] — один источник
|
|
38
|
+
[UNVERIFIED] — не удалось подтвердить
|
|
39
|
+
[ESTIMATED] — расчётная оценка на основе {метод}
|
|
40
|
+
[OUTDATED: {year}] — данные старше 1 года
|
|
41
|
+
[CONFLICTING] — источники противоречат друг другу
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
<!-- РАСШИРЕНИЕ: добавляй правила валидации для специфических доменов ниже -->
|