@gian-tiaga/eda 0.8.6 → 1.0.1
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/MIGRATION.md +119 -0
- package/README.md +324 -71
- package/agents/eda-aim-executor/agent.json +15 -0
- package/agents/eda-aim-executor/prompt.md +61 -0
- package/agents/eda-aim-planner/agent.json +15 -0
- package/agents/eda-aim-planner/prompt.md +43 -0
- package/agents/eda-aim-verifier/agent.json +15 -0
- package/agents/eda-aim-verifier/prompt.md +57 -0
- package/agents/eda-commit-context/agent.json +15 -0
- package/agents/eda-commit-context/prompt.md +58 -0
- package/agents/eda-commit-executor/agent.json +15 -0
- package/agents/eda-commit-executor/prompt.md +87 -0
- package/agents/eda-merge-worktree-executor/agent.json +15 -0
- package/agents/eda-merge-worktree-executor/prompt.md +57 -0
- package/agents/eda-review-api/agent.json +15 -0
- package/agents/eda-review-api/prompt.md +34 -0
- package/agents/eda-review-architecture/agent.json +15 -0
- package/agents/eda-review-architecture/prompt.md +34 -0
- package/agents/eda-review-code-quality/agent.json +15 -0
- package/agents/eda-review-code-quality/prompt.md +34 -0
- package/agents/eda-review-correctness/agent.json +15 -0
- package/agents/eda-review-correctness/prompt.md +34 -0
- package/agents/eda-review-database/agent.json +15 -0
- package/agents/eda-review-database/prompt.md +34 -0
- package/agents/eda-review-documentation/agent.json +15 -0
- package/agents/eda-review-documentation/prompt.md +34 -0
- package/agents/eda-review-frontend/agent.json +15 -0
- package/agents/eda-review-frontend/prompt.md +34 -0
- package/agents/eda-review-performance/agent.json +15 -0
- package/agents/eda-review-performance/prompt.md +34 -0
- package/agents/eda-review-plan-alignment/agent.json +15 -0
- package/agents/eda-review-plan-alignment/prompt.md +34 -0
- package/agents/eda-review-previous-reviews/agent.json +15 -0
- package/agents/eda-review-previous-reviews/prompt.md +44 -0
- package/agents/eda-review-references/agent.json +15 -0
- package/agents/eda-review-references/prompt.md +34 -0
- package/agents/eda-review-rules/agent.json +15 -0
- package/agents/eda-review-rules/prompt.md +34 -0
- package/agents/eda-review-security/agent.json +15 -0
- package/agents/eda-review-security/prompt.md +34 -0
- package/agents/eda-review-tests/agent.json +15 -0
- package/agents/eda-review-tests/prompt.md +34 -0
- package/agents/eda-worktree-executor/agent.json +15 -0
- package/agents/eda-worktree-executor/prompt.md +49 -0
- package/bin/cli.js +4 -4
- package/lib/catalog.js +118 -0
- package/lib/install.js +921 -119
- package/lib/renderers/claude-agent.js +24 -0
- package/lib/renderers/claude-skill.js +11 -0
- package/lib/renderers/codex-agent.js +24 -0
- package/lib/renderers/codex-skill.js +3 -0
- package/package.json +5 -3
- package/skills/eda-aim/SKILL.md +212 -0
- package/skills/eda-commit/SKILL.md +124 -0
- package/skills/eda-commit/skill.json +6 -0
- package/skills/eda-discover-automations/SKILL.md +184 -0
- package/skills/{eda-explore.md → eda-explore/SKILL.md} +11 -8
- package/skills/{eda-fix.md → eda-fix/SKILL.md} +7 -6
- package/skills/{eda-fix-by-review.md → eda-fix-by-review/SKILL.md} +5 -4
- package/skills/{eda-manual-test.md → eda-manual-test/SKILL.md} +1 -1
- package/skills/eda-merge-worktree/SKILL.md +72 -0
- package/skills/eda-merge-worktree/skill.json +7 -0
- package/skills/eda-new-project/SKILL.md +163 -0
- package/skills/eda-orhestra/SKILL.md +146 -0
- package/skills/{eda-plan.md → eda-plan/SKILL.md} +39 -29
- package/skills/eda-plan-execute/SKILL.md +186 -0
- package/skills/{eda-plan-polish.md → eda-plan-polish/SKILL.md} +14 -13
- package/skills/eda-polish/SKILL.md +80 -0
- package/skills/eda-prepare-ai/SKILL.md +227 -0
- package/skills/eda-review/SKILL.md +212 -0
- package/skills/{eda-send-review.md → eda-send-review/SKILL.md} +66 -19
- package/skills/eda-send-review/skill.json +7 -0
- package/skills/eda-worktree/SKILL.md +73 -0
- package/skills/eda-worktree/skill.json +7 -0
- package/skills/eda-automate.md +0 -185
- package/skills/eda-commit.md +0 -91
- package/skills/eda-docs.md +0 -123
- package/skills/eda-execute.md +0 -140
- package/skills/eda-merge-worktree.md +0 -116
- package/skills/eda-polish.md +0 -113
- package/skills/eda-review-check.md +0 -149
- package/skills/eda-review.md +0 -173
- package/skills/eda-start.md +0 -233
- package/skills/eda-worktree.md +0 -113
- /package/skills/{eda-roadmap.md → eda-roadmap/SKILL.md} +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function yamlString(value) {
|
|
2
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function renderClaudeAgent(agent, prompt) {
|
|
6
|
+
const tools = agent.access === 'workspace-write'
|
|
7
|
+
? 'Read, Glob, Grep, Bash, Write, Edit, NotebookEdit'
|
|
8
|
+
: 'Read, Glob, Grep, Bash';
|
|
9
|
+
const lines = [
|
|
10
|
+
'---',
|
|
11
|
+
`name: ${agent.name}`,
|
|
12
|
+
`description: ${yamlString(agent.description)}`,
|
|
13
|
+
`tools: ${tools}`
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
if (agent.access !== 'workspace-write') lines.push('disallowedTools: Write, Edit, NotebookEdit');
|
|
17
|
+
lines.push(`model: ${agent.models.claude}`);
|
|
18
|
+
if (agent.reasoning?.claude) lines.push(`effort: ${agent.reasoning.claude}`);
|
|
19
|
+
if (agent.access === 'read-only') lines.push('permissionMode: plan');
|
|
20
|
+
if (agent.maxTurns) lines.push(`maxTurns: ${agent.maxTurns}`);
|
|
21
|
+
|
|
22
|
+
lines.push('---', '', prompt.trimEnd(), '');
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function renderClaudeSkill(content, config = {}) {
|
|
2
|
+
const model = config.models?.claude;
|
|
3
|
+
if (!model) return content;
|
|
4
|
+
|
|
5
|
+
const closingMarker = content.indexOf('\n---', 4);
|
|
6
|
+
if (!content.startsWith('---\n') || closingMarker === -1) {
|
|
7
|
+
throw new Error('Не удалось добавить Claude model override: некорректный front matter скила.');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return `${content.slice(0, closingMarker)}\nmodel: ${model}${content.slice(closingMarker)}`;
|
|
11
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function tomlString(value) {
|
|
2
|
+
return JSON.stringify(value);
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function renderCodexAgent(agent, prompt) {
|
|
6
|
+
if (prompt.includes('"""')) {
|
|
7
|
+
throw new Error(`Промпт агента ${agent.name} содержит неподдерживаемую последовательность тройных кавычек.`);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const lines = [
|
|
11
|
+
`name = ${tomlString(agent.name)}`,
|
|
12
|
+
`description = ${tomlString(agent.description)}`,
|
|
13
|
+
`model = ${tomlString(agent.models.codex)}`
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
if (agent.reasoning?.codex) {
|
|
17
|
+
lines.push(`model_reasoning_effort = ${tomlString(agent.reasoning.codex)}`);
|
|
18
|
+
}
|
|
19
|
+
if (agent.access === 'read-only') lines.push('sandbox_mode = "read-only"');
|
|
20
|
+
if (agent.access === 'workspace-write') lines.push('sandbox_mode = "workspace-write"');
|
|
21
|
+
|
|
22
|
+
lines.push('developer_instructions = """', prompt.trimEnd(), '"""', '');
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gian-tiaga/eda",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Пакет скилов и специализированных агентов eda-* для Claude Code и Codex CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"eda": "bin/cli.js"
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
"bin",
|
|
11
11
|
"lib",
|
|
12
12
|
"skills",
|
|
13
|
-
"
|
|
13
|
+
"agents",
|
|
14
|
+
"README.md",
|
|
15
|
+
"MIGRATION.md"
|
|
14
16
|
],
|
|
15
17
|
"engines": {
|
|
16
18
|
"node": ">=18"
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-aim
|
|
3
|
+
description: 'Согласует с пользователем одну или несколько простых проверяемых целей, сохраняет их в компактном файле `docs/aims/` и ведёт работу до достижения. Планирование, выполнение и итоговая проверка идут через отдельных пакетных субагентов; основной агент только оркестрирует вопросы и передачи. Поддерживает automatic/manual из `aim.mode` или текущего вызова; при необходимости использует установленные скилы в изолированных субагентах.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Достижение цели (eda-aim)
|
|
7
|
+
|
|
8
|
+
Оркестрируй полный цикл: согласовать цель → выполнить работу → независимо проверить результат → при необходимости продолжить. Не выполняй содержательную работу основным агентом.
|
|
9
|
+
|
|
10
|
+
## Настройки
|
|
11
|
+
|
|
12
|
+
Прочитай только раздел `aim` из `docs/settings.yaml`, если файл есть. Применяй только `version: 2`.
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
aim:
|
|
16
|
+
mode: automatic
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`aim.mode` принимает только `automatic` или `manual`; при отсутствующем или невалидном значении используй `automatic`. Прямое указание режима в текущем сообщении всегда важнее настройки. Файл настроек не изменяй.
|
|
20
|
+
|
|
21
|
+
## Вход из сообщения пользователя
|
|
22
|
+
|
|
23
|
+
Сохрани весь текст текущего сообщения в `$USER_REQUEST`. Извлеки описание результата, ограничения, указанный файл цели и режим:
|
|
24
|
+
|
|
25
|
+
- `automatic`, `auto`, `автоматически`, `автоматический`, `автономно`, `без вопросов` → `$MODE=automatic`;
|
|
26
|
+
- `manual`, `вручную`, `ручной`, `спрашивай` → `$MODE=manual`;
|
|
27
|
+
- без явного режима → `$MODE=aim.mode` из валидных настроек, иначе `$MODE=automatic`.
|
|
28
|
+
|
|
29
|
+
В автоматическом режиме основной агент сам выбирает ответ на рабочие вопросы по рекомендации субагента и фактам проекта. Это не отменяет одно обязательное подтверждение человеком точного списка целей до создания нового файла.
|
|
30
|
+
|
|
31
|
+
Если пользователь передал существующий файл из `docs/aims/`, продолжай его с текущего статуса. Не создавай второй файл для той же цели.
|
|
32
|
+
|
|
33
|
+
## Пакетные агенты
|
|
34
|
+
|
|
35
|
+
| Этап | Агент | Claude Code | Codex | Доступ |
|
|
36
|
+
|---|---|---|---|---|
|
|
37
|
+
| Согласование | `eda-aim-planner` | `opus` | `gpt-5.6-sol` | workspace-write |
|
|
38
|
+
| Выполнение | `eda-aim-executor` | `opus` | `gpt-5.6-sol` | workspace-write |
|
|
39
|
+
| Проверка | `eda-aim-verifier` | `opus` | `gpt-5.6-sol` | workspace-write |
|
|
40
|
+
|
|
41
|
+
- В Claude Code запускай установленного пакетного агента через инструмент `Agent` по имени.
|
|
42
|
+
- В Codex запускай установленного пакетного агента через `spawn_agent` или аналог по имени.
|
|
43
|
+
- Не копируй системный промпт агента в сообщение с заданием.
|
|
44
|
+
- Если нужный агент или нативные субагенты недоступны, остановись: `blocked: нужен установленный агент <имя>`. Не выполняй его роль основным агентом и не заменяй отдельным CLI-процессом.
|
|
45
|
+
|
|
46
|
+
## Вопросы и автоматический режим
|
|
47
|
+
|
|
48
|
+
Агент может вернуть один конкретный `question`, 1–3 взаимоисключающих `options` и `recommended_answer`.
|
|
49
|
+
|
|
50
|
+
В ручном режиме передай вопрос пользователю:
|
|
51
|
+
|
|
52
|
+
- Claude Code: используй `AskUserQuestion`;
|
|
53
|
+
- Интерактивный Codex: используй `request_user_input`, если доступен; иначе задай короткий вопрос с вариантами и остановись до ответа;
|
|
54
|
+
- Неинтерактивный Codex: не читай stdin; заверши `blocked: нужен ответ пользователя` и перечисли вопрос с вариантами.
|
|
55
|
+
|
|
56
|
+
В автоматическом режиме не спрашивай пользователя: выбери `recommended_answer`, если он не противоречит исходному запросу, правилам или безопасности; иначе выбери лучший безопасный вариант по фактам проекта. Запиши автоматический ответ в данные продолжения и передай тому же агенту. Не принимай автоматически необратимые внешние действия, расширение цели, публикацию, расходы, удаление данных или ослабление проверок — для них нужен человек.
|
|
57
|
+
|
|
58
|
+
Подтверждение точного списка новых целей — отдельный обязательный вопрос человеку в обоих режимах. До ответа файл цели не существует.
|
|
59
|
+
|
|
60
|
+
## Файл цели
|
|
61
|
+
|
|
62
|
+
После подтверждения `eda-aim-planner` создаёт `docs/aims/{YYYY-MM-DD}_{HH-MM}_{slug}.md`. Файл должен оставаться коротким и содержать только цель и фактический журнал:
|
|
63
|
+
|
|
64
|
+
```markdown
|
|
65
|
+
# <Короткое название>
|
|
66
|
+
|
|
67
|
+
Режим: <ручной | автоматический>
|
|
68
|
+
Статус: <согласована | выполняется | проверяется | достигнута | заблокирована>
|
|
69
|
+
|
|
70
|
+
## Цели
|
|
71
|
+
|
|
72
|
+
- [ ] A1 — <ясный наблюдаемый результат>; проверка: <критерий>.
|
|
73
|
+
- [ ] A2 — <результат>; проверка: <критерий>.
|
|
74
|
+
|
|
75
|
+
## Журнал
|
|
76
|
+
|
|
77
|
+
- `<YYYY-MM-DD HH:MM>` — цели согласованы пользователем.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Правила файла:
|
|
81
|
+
|
|
82
|
+
- один пункт допустим и предпочтителен, если задача едина;
|
|
83
|
+
- не превращай цели в план реализации, бэклог, исследование или длинную спецификацию;
|
|
84
|
+
- каждый пункт описывает результат, а не действие агента;
|
|
85
|
+
- новые разделы не добавляй;
|
|
86
|
+
- журнал только дополняй, старые записи не переписывай;
|
|
87
|
+
- используй относительные Markdown-ссылки на изменённые файлы и созданные артефакты;
|
|
88
|
+
- отметку `[x]` ставит только `eda-aim-verifier`, когда критерий подтверждён фактами.
|
|
89
|
+
|
|
90
|
+
Если применён другой `eda-*`-скил, журнал обязательно содержит его имя, итог и ссылку на каждый созданный им артефакт. Если отдельный артефакт этим скилом не создаётся, явно напиши `артефакт не создаётся`. Без отдельного скила запиши, что выполнено, и дай ссылки на затронутые файлы или иной проверяемый результат.
|
|
91
|
+
|
|
92
|
+
## Использование установленных скилов
|
|
93
|
+
|
|
94
|
+
В случае необходимости `eda-aim` может использовать установленные скилы в изолированных субагентах. Субагенты `eda-aim` не запускают их сами: исполнитель или проверяющий возвращает `needs_skill` со структурированным `skill_request`, а основной агент:
|
|
95
|
+
|
|
96
|
+
1. Приостанавливает запросившего агента и сохраняет его полный YAML.
|
|
97
|
+
2. Запускает новый изолированный субагент с чистым контекстом и поручает ему применить указанный установленный скил к `skill_request`.
|
|
98
|
+
3. Дожидается результата скила и собирает `skill`, `status`, полный результат, пути к артефактам и проверки.
|
|
99
|
+
4. Передаёт эти данные как `SKILL_RESULTS` тому же исполнителю или проверяющему; именно он дополняет общий журнал и продолжает свою роль.
|
|
100
|
+
|
|
101
|
+
Каждый такой вызов использует отдельного субагента. Основной агент не применяет запрошенный скил сам, не копирует его процедуру и не выполняет его содержательную работу. Субагент следует установленной инструкции скила целиком, включая её правила вопросов и делегации. Если изолированный запуск или обязательные для скила нативные субагенты недоступны, остановись с конкретным `blocked`, не заменяя их работой основного агента или CLI-fallback.
|
|
102
|
+
|
|
103
|
+
## Процесс
|
|
104
|
+
|
|
105
|
+
### 1. Согласовать цели
|
|
106
|
+
|
|
107
|
+
Запусти `eda-aim-planner` и передай:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
Рабочая директория: <cwd>
|
|
111
|
+
USER_REQUEST:
|
|
112
|
+
<полный дословный запрос>
|
|
113
|
+
|
|
114
|
+
MODE: <manual | automatic>
|
|
115
|
+
GOAL_FILE: <путь | none>
|
|
116
|
+
ANSWERS: <предыдущие вопросы и ответы | none>
|
|
117
|
+
APPROVAL: <approved | rejected | pending>
|
|
118
|
+
|
|
119
|
+
Верни результат строго по YAML-контракту агента.
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Для нового запуска обрабатывай ответы так:
|
|
123
|
+
|
|
124
|
+
- `needs_input` — получи или самостоятельно выбери ответ по режиму, затем продолжи того же planner;
|
|
125
|
+
- `needs_approval` — покажи человеку точный список целей и задай один вопрос: подтверждает ли он этот список; автоматический режим это подтверждение не пропускает;
|
|
126
|
+
- после подтверждения передай `APPROVAL: approved` тому же planner;
|
|
127
|
+
- `ready` — сохрани `$GOAL_FILE` и переходи к выполнению;
|
|
128
|
+
- `blocked` — назови конкретный блокер.
|
|
129
|
+
|
|
130
|
+
Если человек отклонил список, передай причину planner и повтори согласование. Основной агент сам цели не формулирует и файл не пишет.
|
|
131
|
+
|
|
132
|
+
Для существующего файла возьми `pending_goals` из результата планировщика: если список непуст, передай его исполнителю; если все пункты уже отмечены, сразу запусти нового независимого проверяющего и не повторяй выполненную работу.
|
|
133
|
+
|
|
134
|
+
### 2. Выполнить цели
|
|
135
|
+
|
|
136
|
+
Раздели независимые пункты между одним или несколькими последовательными вызовами `eda-aim-executor`. Не запускай одновременную запись нескольких агентов в общий файл цели. Связанные пункты передавай одному агенту вместе.
|
|
137
|
+
|
|
138
|
+
Каждому executor передай:
|
|
139
|
+
|
|
140
|
+
```text
|
|
141
|
+
Рабочая директория: <cwd>
|
|
142
|
+
GOAL_FILE: <путь>
|
|
143
|
+
ASSIGNED_GOALS: <идентификаторы>
|
|
144
|
+
USER_REQUEST: <полный дословный запрос>
|
|
145
|
+
ANSWER_HISTORY: <вопросы и ответы этого запуска | none>
|
|
146
|
+
PREVIOUS_RESULT: <полный результат предыдущей попытки | none>
|
|
147
|
+
SKILL_RESULTS: <результаты запрошенных скилов и артефакты | none>
|
|
148
|
+
|
|
149
|
+
Запрашивай установленные eda-* скилы через `needs_skill`, когда они нужны для достижения назначенных целей.
|
|
150
|
+
Дополни журнал после каждого завершённого результата и верни YAML-контракт.
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Исполнитель сам выбирает необходимые скилы. Например, он может запросить `eda-explore`, `eda-plan`, `eda-plan-polish`, `eda-plan-execute`, `eda-fix`, `eda-fix-by-review`, `eda-manual-test` или `eda-review`, соблюдая их границы и вопросы. Скил, который только планирует или проверяет, не считается выполнением цели без последующей реализации.
|
|
154
|
+
|
|
155
|
+
Обработай результат:
|
|
156
|
+
|
|
157
|
+
- `completed` — передай следующую группу целей или переходи к проверке;
|
|
158
|
+
- `needs_input` — ответь по общим правилам режима и продолжи того же executor;
|
|
159
|
+
- `needs_skill` — запусти `skill_request` по правилам выше и продолжи того же executor с полным `SKILL_RESULTS`;
|
|
160
|
+
- `failed` — не завершай цель: передай полный результат следующему вызову executor для тех же пунктов, чтобы он учёл диагностику и выбрал другую безопасную попытку;
|
|
161
|
+
- `blocked` — остановись только при явно названном внешнем неустранимом препятствии; если блокер требует ответа или изменения среды, продолжи после него.
|
|
162
|
+
|
|
163
|
+
Не считай отчёт исполнителя доказательством достижения и не ставь отметку `[x]`.
|
|
164
|
+
|
|
165
|
+
### 3. Независимо проверить
|
|
166
|
+
|
|
167
|
+
После каждого полного круга выполнения запусти отдельного `eda-aim-verifier`:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
Рабочая директория: <cwd>
|
|
171
|
+
GOAL_FILE: <путь>
|
|
172
|
+
USER_REQUEST: <полный дословный запрос>
|
|
173
|
+
ANSWER_HISTORY: <вопросы и ответы проверки | none>
|
|
174
|
+
SKILL_RESULTS: <результаты запрошенных проверочных скилов | none>
|
|
175
|
+
|
|
176
|
+
Независимо проверь каждый критерий по текущим файлам и фактическому поведению.
|
|
177
|
+
При необходимости запроси проверочные eda-* скилы через `needs_skill`.
|
|
178
|
+
Обнови только статусы, отметки `[x]` и журнал файла цели. Верни YAML-контракт.
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Проверяющий не чинит реализацию. Он перепроверяет результат, запускает применимые тесты и при необходимости использует `eda-manual-test` или `eda-review`; созданные отчёты связывает в журнале. Если журнал ссылается на план, проверяющий также подтверждает, что в нём не осталось обязательных невыполненных пунктов.
|
|
182
|
+
|
|
183
|
+
- `reached` — все пункты подтверждены, статус файла `достигнута`, цикл завершён;
|
|
184
|
+
- `needs_work` — передай исполнителю только неподтверждённые пункты вместе с найденными пробелами и снова запусти проверяющего после исправлений;
|
|
185
|
+
- `needs_input` — ответь по режиму и продолжи того же verifier;
|
|
186
|
+
- `needs_skill` — запусти проверочный `skill_request` и продолжи того же verifier с полным `SKILL_RESULTS`;
|
|
187
|
+
- `blocked` — сохрани статус `заблокирована` и сообщи, что именно мешает проверке.
|
|
188
|
+
|
|
189
|
+
Продолжай цикл исполнитель → проверяющий без произвольного лимита, пока все цели не подтверждены либо не возник внешний неустранимый блокер. После повторного сбоя executor обязан использовать накопленную диагностику и изменить способ выполнения либо вернуть доказанный внешний блокер; повтор одного и того же сбоя не является достижением цели.
|
|
190
|
+
|
|
191
|
+
### 4. Финал
|
|
192
|
+
|
|
193
|
+
Сообщи:
|
|
194
|
+
|
|
195
|
+
- достигнута ли цель;
|
|
196
|
+
- путь к файлу цели;
|
|
197
|
+
- какие пункты подтверждены;
|
|
198
|
+
- главные изменённые файлы;
|
|
199
|
+
- использованные скилы и ссылки на их артефакты;
|
|
200
|
+
- выполненные проверки;
|
|
201
|
+
- конкретный блокер и оставшиеся пункты, если работа не завершена.
|
|
202
|
+
|
|
203
|
+
## Чего НЕ делать
|
|
204
|
+
|
|
205
|
+
- Формулировать цели, применять запрошенные скилы, менять код, выполнять реализацию или ставить финальную отметку основным агентом.
|
|
206
|
+
- Создавать файл до подтверждения точного списка целей человеком.
|
|
207
|
+
- Раздувать файл деталями реализации или повторять в нём содержимое других артефактов.
|
|
208
|
+
- Считать план, diff или самоотчёт исполнителя доказательством результата.
|
|
209
|
+
- Отмечать цель выполненной без отдельного проверяющего.
|
|
210
|
+
- Давать нескольким агентам параллельно редактировать общий журнал.
|
|
211
|
+
- Терять вопросы, ответы, ссылки на артефакты или причины блокировки при продолжении.
|
|
212
|
+
- Коммитить, пушить, создавать PR или выполнять другие внешние действия без явного запроса пользователя.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-commit
|
|
3
|
+
description: 'Оркестрирует один логический коммит через двух последовательных пакетных агентов. `eda-commit-context` на `haiku` / `gpt-5.6-luna` собирает read-only контекст; `eda-commit-executor` на `sonnet` / `gpt-5.6-terra` формирует сообщение, коммитит и выполняет явно указанные push, PR или merge-действия. Учитывает весь текст текущего сообщения: если пользователь уже попросил отправить ветку, создать PR и дать ссылку, не задаёт общий вопрос после коммита. Не правит код и не отключает hooks.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Коммитер (eda-commit)
|
|
7
|
+
|
|
8
|
+
Работай как лёгкий оркестратор двух установленных агентов. Сам не исследуй diff, не выбирай файлы, не составляй commit message и не выполняй git/GitHub-команды.
|
|
9
|
+
|
|
10
|
+
## Вход из сообщения пользователя
|
|
11
|
+
|
|
12
|
+
Сохрани весь текст текущего сообщения дословно в `$USER_REQUEST`. Это главный вход, а не только слова после имени скила или последний вопрос.
|
|
13
|
+
|
|
14
|
+
Извлеки `$REQUESTED_ACTIONS`: ограничения и цепочку действий после коммита — `push`, отправить ветку, создать или обновить PR, вернуть ссылку, merge, переключить или удалить ветку. Поздний общий вопрос не отменяет конкретную команду из более ранней части того же сообщения.
|
|
15
|
+
|
|
16
|
+
Пример: `eda-commit сразу отправь ветку и создай PR и дай ссылку` означает `commit → push → create-or-find PR → return URL`. После коммита не спрашивай, что делать дальше.
|
|
17
|
+
|
|
18
|
+
При последующих уточнениях более поздняя явная команда или запрет имеют приоритет, но короткий ответ не заменяет остальной `$USER_REQUEST`. Историю прошлых сообщений используй только если пользователь явно связал её с текущим вызовом.
|
|
19
|
+
|
|
20
|
+
## Агенты
|
|
21
|
+
|
|
22
|
+
Запускай строго последовательно:
|
|
23
|
+
|
|
24
|
+
| Этап | Агент | Claude Code | Codex |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| Контекст | `eda-commit-context` | `haiku` | `gpt-5.6-luna` |
|
|
27
|
+
| Коммит и продолжение | `eda-commit-executor` | `sonnet` | `gpt-5.6-terra` |
|
|
28
|
+
|
|
29
|
+
- В Claude Code запускай установленный custom agent через `Agent` tool по имени.
|
|
30
|
+
- В Codex запускай установленный custom agent через `spawn_agent` или аналог по имени.
|
|
31
|
+
- Не копируй в task-сообщение системный промпт агента: он уже установлен в `.claude/agents/` или `.codex/agents/`.
|
|
32
|
+
- Передавай агенту только рабочую директорию, данные текущего запуска и требуемый формат результата.
|
|
33
|
+
- Если custom agent или инструмент субагентов недоступен, остановись: `blocked: нужен установленный агент <имя>`; не выполняй его роль основным агентом и не заменяй отдельным CLI-процессом.
|
|
34
|
+
|
|
35
|
+
## Интерактивные вопросы
|
|
36
|
+
|
|
37
|
+
Когда агент вернул `blocked`, задай его один конкретный вопрос пользователю.
|
|
38
|
+
|
|
39
|
+
- Claude Code: используй `AskUserQuestion`.
|
|
40
|
+
- Codex interactive: используй `request_user_input`, если доступен; иначе задай короткий вопрос с вариантами 1–3 и остановись до ответа.
|
|
41
|
+
- Codex exec / неинтерактивный запуск: не читай stdin; заверши со статусом `blocked: нужен ответ пользователя`, перечисли вопрос и варианты.
|
|
42
|
+
- Никогда не задавай общий вопрос о дальнейших действиях, если `$REQUESTED_ACTIONS` уже содержит их.
|
|
43
|
+
|
|
44
|
+
После ответа сохрани исходный `$USER_REQUEST`, добавь новый ответ и продолжи того же агента, если хост это поддерживает. Иначе запусти этого же custom agent заново с предыдущим результатом, актуальным состоянием и ответом.
|
|
45
|
+
|
|
46
|
+
## Процесс
|
|
47
|
+
|
|
48
|
+
### 1. Собрать контекст
|
|
49
|
+
|
|
50
|
+
Запусти `eda-commit-context`. Передай:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
Рабочая директория: <cwd>
|
|
54
|
+
USER_REQUEST:
|
|
55
|
+
<полный дословный запрос>
|
|
56
|
+
|
|
57
|
+
REQUESTED_ACTIONS:
|
|
58
|
+
<цепочка действий>
|
|
59
|
+
|
|
60
|
+
Верни результат строго по YAML-контракту агента.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Обработай `status`:
|
|
64
|
+
|
|
65
|
+
- `empty` — сообщи, что коммитить нечего, и закончи;
|
|
66
|
+
- `blocked` — задай возвращённый вопрос и после ответа повтори контекстный этап;
|
|
67
|
+
- `ready` — передай полный YAML следующему агенту без пересказа и потери полей.
|
|
68
|
+
|
|
69
|
+
### 2. Сделать коммит и продолжение
|
|
70
|
+
|
|
71
|
+
Запусти `eda-commit-executor`. Передай:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
Рабочая директория: <cwd>
|
|
75
|
+
USER_REQUEST:
|
|
76
|
+
<полный дословный запрос>
|
|
77
|
+
|
|
78
|
+
REQUESTED_ACTIONS:
|
|
79
|
+
<цепочка действий>
|
|
80
|
+
|
|
81
|
+
CONTEXT_RESULT:
|
|
82
|
+
<полный YAML первого агента>
|
|
83
|
+
|
|
84
|
+
Верни результат строго по YAML-контракту агента.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Явная команда пользователя разрешает обычные ожидаемые действия и безопасные предпосылки в её рамках. Например, «создай PR» разрешает обычный push текущей ветки, если без него PR создать нельзя. Она не разрешает force-push, публикацию секретов или другое не названное рискованное действие.
|
|
88
|
+
|
|
89
|
+
Если executor вернул `blocked`, задай только его конкретный вопрос. Не теряй commit hash и уже выполненные действия при продолжении.
|
|
90
|
+
|
|
91
|
+
### 3. Решить, нужен ли вопрос после коммита
|
|
92
|
+
|
|
93
|
+
Если `$REQUESTED_ACTIONS` не пуст и агент выполнил всю цепочку, сразу переходи к финалу.
|
|
94
|
+
|
|
95
|
+
Если `$REQUESTED_ACTIONS` пуст и статус `committed`, спроси пользователя, используя только применимые варианты, которые вернул executor:
|
|
96
|
+
|
|
97
|
+
- push;
|
|
98
|
+
- создать PR и дать ссылку;
|
|
99
|
+
- merge в основную ветку, переключение и удаление текущей ветки;
|
|
100
|
+
- ничего больше.
|
|
101
|
+
|
|
102
|
+
Передай выбор тому же `eda-commit-executor`. Основной агент команды не выполняет.
|
|
103
|
+
|
|
104
|
+
### 4. Финал
|
|
105
|
+
|
|
106
|
+
Коротко сообщи из результата executor:
|
|
107
|
+
|
|
108
|
+
- hash и заголовок коммита;
|
|
109
|
+
- какие действия выполнены после коммита;
|
|
110
|
+
- номер и фактический URL PR, если есть;
|
|
111
|
+
- текущую ветку;
|
|
112
|
+
- оставшиеся незакоммиченные файлы.
|
|
113
|
+
|
|
114
|
+
Для `partial` сначала назови выполненные действия, затем ошибку и следующий безопасный шаг.
|
|
115
|
+
|
|
116
|
+
## Чего НЕ делать
|
|
117
|
+
|
|
118
|
+
- Выполнять работу `eda-commit-context` или `eda-commit-executor` основным агентом.
|
|
119
|
+
- Запускать executor до готового результата context-agent.
|
|
120
|
+
- Пересказывать YAML между агентами вместо передачи полного результата.
|
|
121
|
+
- Терять начало `$USER_REQUEST` из-за последующего вопроса или ответа.
|
|
122
|
+
- Спрашивать про push или PR, если пользователь уже явно приказал выполнить их.
|
|
123
|
+
- Отключать hooks, использовать `--amend`, делать force-push в `main`/`master` или создавать дубликат PR.
|
|
124
|
+
- Делать ревью или править логику кода — это другие скилы.
|