@gian-tiaga/eda 0.5.4 → 0.6.0

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > Поточная разработка с AI-агентами — на русском языке.
4
4
  > Набор готовых скилов для **Claude Code** и **Codex CLI**, которые ведут тебя через весь цикл: от исследования до коммита.
5
5
 
6
- `eda` — это одиннадцать скилов, каждый отвечает за свой кусок работы. Вместо того чтобы каждый раз объяснять модели, как делать ревью или как исполнять план, ты говоришь одно слово — и она следует чёткой инструкции на русском, со всеми правилами, проверками и артефактами в нужных папках.
6
+ `eda` — это тринадцать скилов, каждый отвечает за свой кусок работы. Вместо того чтобы каждый раз объяснять модели, как делать ревью или как исполнять план, ты говоришь одно слово — и она следует чёткой инструкции на русском, со всеми правилами, проверками и артефактами в нужных папках.
7
7
 
8
8
  ---
9
9
 
@@ -36,6 +36,8 @@ eda init
36
36
  | `eda-fix-by-review` | Применяет замечания из ревью. Обязательные — сразу. Спорные — спрашивает. В конце ссылается на отчёт прямо в файле ревью | `docs/review-fixes/` |
37
37
  | `eda-send-review` | Отправляет ревью на GitHub PR через `gh` — как комментарий, review, approve или request-changes. Сам определяет PR по текущей ветке | (комментарий в PR) |
38
38
  | `eda-commit` | Делает один аккуратный коммит в стиле проекта. В конце спрашивает: push, merge в main + удалить ветку, или ничего | (git) |
39
+ | `eda-worktree` | Создаёт git worktree рядом с основным проектом в папке `{name}-work-{n}` и одноимённую ветку. Базу берёт из аргумента или спрашивает | соседняя папка `{name}-work-{n}` |
40
+ | `eda-merge-worktree` | Мержит ветку из соседнего worktree в текущую ветку. Принимает номер `1`, короткое имя `work-1` или полное имя `{name}-work-1`. Worktree и ветку после merge не удаляет | (git) |
39
41
  | `eda-docs` | Создаёт или обновляет `docs/rules.md` (максимально строгие правила для твоего стека), `docs/arch.md` (архитектура проекта) и шапку `AGENTS.md`. Может предлагать инструменты, которых ещё нет в проекте | `docs/rules.md`, `docs/arch.md`, `AGENTS.md` |
40
42
  | `eda-automate` | Анализирует историю ревью и фиксов. Если какое-то замечание встречается раз за разом — предлагает кастомное правило линтера или статанализатора, чтобы ловить это автоматически | `docs/automations/` |
41
43
 
@@ -119,7 +121,7 @@ roadmap ────────> explore ─────> plan ───> execu
119
121
  automate может запускаться от review, fix-by-review или fix.
120
122
  ```
121
123
 
122
- Использовать всю цепочку не обязательно — каждый скил самодостаточен. Можно начать с `eda-roadmap`, `eda-explore`, или сразу с `eda-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны.
124
+ Использовать всю цепочку не обязательно — каждый скил самодостаточен. Можно начать с `eda-roadmap`, `eda-explore`, или сразу с `eda-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны. Для параллельной работы есть `eda-worktree`, а для возврата ветки из worktree в текущую ветку — `eda-merge-worktree`.
123
125
 
124
126
  ---
125
127
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gian-tiaga/eda",
3
- "version": "0.5.4",
4
- "description": "Набор скилов eda-* для Claude Code и Codex CLI: roadmap, explore, plan, execute, fix, review, fix-by-review, send-review, commit, docs, automate",
3
+ "version": "0.6.0",
4
+ "description": "Набор скилов eda-* для Claude Code и Codex CLI: roadmap, explore, plan, execute, fix, review, fix-by-review, send-review, commit, worktree, merge-worktree, docs, automate",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "eda": "bin/cli.js"
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: eda-merge-worktree
3
+ description: 'Мержит ветку из соседнего git worktree `{name}-work-{n}` в текущую ветку. Аргумент принимает как номер `1`, короткое имя `work-1` или полное имя `{name}-work-1`. Перед merge проверяет текущий worktree и исходный worktree на незакоммиченные изменения. После успешного merge не удаляет worktree и ветку.'
4
+ ---
5
+
6
+ # Скил: Merge из worktree (eda-merge-worktree)
7
+
8
+ Мержишь ветку из соседнего worktree в текущую ветку. Этот скил не чистит worktree после merge: папка и ветка остаются на месте.
9
+
10
+ ## Режимы вызова
11
+
12
+ | Режим | Запуск | Что делает |
13
+ |---|---|---|
14
+ | По номеру | `eda-merge-worktree 1` | Мержит ветку из `{name}-work-1` |
15
+ | По короткому имени | `eda-merge-worktree work-1` | Мержит ветку из `{name}-work-1` |
16
+ | По полному имени | `eda-merge-worktree app-work-1` | Мержит ветку из указанного worktree |
17
+
18
+ ## Вход из сообщения пользователя
19
+
20
+ Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: номер worktree, короткое имя `work-<n>`, полное имя `{name}-work-<n>`, ограничения и прямые указания.
21
+
22
+ Если входа достаточно, продолжай без вопроса. `AskUserQuestion` задавай только если аргумент не указан, он противоречивый, найдено несколько равных вариантов или есть риск смержить не ту ветку. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
23
+
24
+ ## Главные правила
25
+
26
+ 1. **Merge только в текущую ветку.** Не переключайся на другую целевую ветку без явного указания пользователя.
27
+ 2. **Аргумент worktree обязателен.** Принимай `1`, `work-1` или полное имя `{name}-work-1`.
28
+ 3. **Не удаляй worktree и ветку после merge.** Даже при успешном merge cleanup не выполняется.
29
+ 4. **Не правь код вручную.** Если merge дал конфликт, остановись и покажи, какие файлы требуют ручного решения.
30
+ 5. **Не коммить и не пушь.** Merge-коммит создаёт только сам `git merge`, если Git решит, что он нужен.
31
+ 6. **Простой язык** в сообщениях пользователю.
32
+
33
+ ## Интерактивные вопросы
34
+
35
+ Когда инструкция говорит `AskUserQuestion`, это означает блокирующий интерактивный вопрос.
36
+ - Claude Code: используй `AskUserQuestion`.
37
+ - Codex interactive: если доступен `request_user_input`, используй его. Если tool недоступен, задай один короткий вопрос в чат, дай варианты 1–3, напиши «Ответь номером или своим вариантом. Я продолжу только после ответа.» и остановись.
38
+ - Codex exec / неинтерактивный запуск: не задавай вопросы и не пытайся читать stdin. Если без ответа нельзя безопасно продолжать, заверши работу со статусом `blocked: нужен ответ пользователя`, перечисли вопросы и варианты, не выполняй рискованные действия.
39
+ - Не запускай команды, которые ждут интерактивного ввода в терминале.
40
+
41
+ ## Этапы
42
+
43
+ ### 1. Проверить git-репозиторий
44
+
45
+ Выполни:
46
+
47
+ ```bash
48
+ git rev-parse --show-toplevel
49
+ git worktree list --porcelain
50
+ git rev-parse --abbrev-ref HEAD
51
+ ```
52
+
53
+ Если это не git-репозиторий — остановись и сообщи. Если текущий worktree в detached HEAD — остановись: merge должен идти в именованную ветку.
54
+
55
+ Определи основной worktree по первой записи `worktree <path>` из `git worktree list --porcelain`. Из его basename получи `$PROJECT_NAME`.
56
+
57
+ ### 2. Нормализовать аргумент
58
+
59
+ Пусть `$ARG` — значение рядом с вызовом.
60
+
61
+ Правила:
62
+ - `1` → `$WORKTREE_NAME=$PROJECT_NAME-work-1`;
63
+ - `work-1` → `$WORKTREE_NAME=$PROJECT_NAME-work-1`;
64
+ - `$PROJECT_NAME-work-1` → `$WORKTREE_NAME=$ARG`;
65
+ - другое значение → попробуй найти worktree с basename `$ARG`; если не найден — остановись и покажи доступные worktree.
66
+
67
+ Если `$ARG` не указан, спроси через `AskUserQuestion` и предложи найденные worktree с именами по шаблону `$PROJECT_NAME-work-<n>`.
68
+
69
+ ### 3. Найти исходный worktree и ветку
70
+
71
+ Из `git worktree list --porcelain` найди запись, у которой basename пути равен `$WORKTREE_NAME`.
72
+
73
+ Для найденной записи определи:
74
+ - `$SOURCE_WORKTREE_PATH`;
75
+ - `$SOURCE_BRANCH` из строки `branch refs/heads/<name>`.
76
+
77
+ Если worktree не найден — остановись и покажи доступные варианты. Если исходный worktree в detached HEAD или ветку определить нельзя — остановись: нечего безопасно мержить по имени ветки.
78
+
79
+ Если `$SOURCE_WORKTREE_PATH` совпадает с текущим worktree — остановись: нужно запускать merge из целевого worktree, а не из исходного.
80
+
81
+ ### 4. Проверить чистоту
82
+
83
+ Проверь текущий worktree:
84
+
85
+ ```bash
86
+ git status --porcelain
87
+ ```
88
+
89
+ Проверь исходный worktree:
90
+
91
+ ```bash
92
+ git -C "$SOURCE_WORKTREE_PATH" status --porcelain
93
+ ```
94
+
95
+ Если где-то есть незакоммиченные изменения — остановись и объясни, где именно. Нельзя мержить, пока изменения не закоммичены, не застешены или не убраны пользователем.
96
+
97
+ Если текущая ветка уже содержит `$SOURCE_BRANCH`, сообщи, что merge не нужен, и выйди без действий.
98
+
99
+ ### 5. Выполнить merge
100
+
101
+ Выполни:
102
+
103
+ ```bash
104
+ git merge "$SOURCE_BRANCH"
105
+ ```
106
+
107
+ Если Git сообщает `Already up to date`, это успешный результат.
108
+
109
+ Если появились конфликты, остановись. Покажи:
110
+ - что merge начат и требует ручного решения;
111
+ - список конфликтных файлов из `git status --short`;
112
+ - что пользователь должен разрешить конфликты и завершить merge вручную.
113
+
114
+ Не пытайся автоматически разрешать конфликты.
115
+
116
+ ### 6. Финал
117
+
118
+ Короткое сообщение:
119
+ - какая ветка смержена;
120
+ - в какую текущую ветку;
121
+ - из какого worktree;
122
+ - статус результата (`merged`, `already up to date` или `conflict`);
123
+ - явно: worktree и исходная ветка не удалялись.
124
+
125
+ ## Чего НЕ делать
126
+
127
+ - Удалять worktree через `git worktree remove`.
128
+ - Удалять исходную ветку через `git branch -d` или `git branch -D`.
129
+ - Делать push.
130
+ - Править файлы для решения конфликтов.
131
+ - Мержить грязный исходный worktree, потому что незакоммиченные изменения не попадут в merge.
@@ -5,7 +5,7 @@ description: 'Ревью изменений (незакоммиченный diff
5
5
 
6
6
  # Скил: Ревьюер (eda-review)
7
7
 
8
- Делаешь ревью изменений: сверяешь diff с планом работ, правилами и архитектурой, пишешь только найденные проблемы, ставишь оценку, сохраняешь файл. Не перечисляешь, что выполнено хорошо или без замечаний. Затем проверяешь ревью параллельными специализированными агентами; в `strict` — ещё и через соседний CLI. После каждой проверки **сам корректируешь** своё ревью: что-то добавляешь, что-то убираешь, что-то переформулируешь.
8
+ Делаешь ревью изменений: сверяешь diff с планом работ, правилами и архитектурой, пишешь только найденные проблемы, ставишь оценку, сохраняешь файл. Каждый пункт начинаешь с короткого человеческого объяснения риска, без технической перегрузки; файлы, строки, детали кода и способ исправления даёшь ниже в блоке «Технические детали». Не перечисляешь, что выполнено хорошо или без замечаний. Затем проверяешь ревью параллельными специализированными агентами; в `strict` — ещё и через соседний CLI. После каждой проверки **сам корректируешь** своё ревью: что-то добавляешь, что-то убираешь, что-то переформулируешь.
9
9
 
10
10
  ## Режимы вызова
11
11
 
@@ -40,8 +40,33 @@ description: 'Ревью изменений (незакоммиченный diff
40
40
  6. **Главный ревьюер — ты.** Мета-ревьюеры дают подсказки; решение — добавить, убрать или оставить пункт — за тобой. Не вставляй чужие пункты механически.
41
41
  7. **Простой язык** в формулировках замечаний и рекомендаций. Технические термины — только если без них нельзя, и сразу с пояснением.
42
42
  8. **Ревью содержит только проблемы.** Не пиши отчёт о выполненной работе, список успешно сделанных пунктов, похвалу или нейтральное перечисление изменений. В файл попадают только ошибки, недоделки, неточности, спорные решения, нарушения правил/архитектуры, риски и недостающие проверки. Если проблем нет, напиши коротко: «Явных проблем не найдено», без пересказа diff.
43
- 9. **Формат файла ревью — Markdown-блоки по шаблону из этапа 2.** Проблемы сверки с планом, каждое замечание и рекомендации пиши отдельными блоками с подзаголовками. Между заголовком блока, статусом/типом, контекстом, риском, локациями, деталями и исправлением всегда оставляй одну пустую строку.
44
- 10. **В каждом замечании сначала объясняй контекст без привязки к коду**, чтобы читатель понял проблему и риск. Только после этого давай конкретные файлы/строки. Исправление оформляй так же: сначала общий подход, затем конкретные шаги по коду.
43
+ 9. **Формат файла ревью — Markdown-блоки по шаблону из этапа 2.** Проблемы сверки с планом, каждое замечание и рекомендации пиши отдельными блоками с подзаголовками. Внутри каждого пункта сначала идёт основная часть простым языком, затем блок `Технические детали`.
44
+ 10. **Основная часть замечания главный ответ.** Пиши 2–4 коротких абзаца: что происходит, почему это проблема, какой практический риск, когда риск проявится. Не начинай с имён классов, методов, строк, SQL, DTO, конфигов и внутренних деталей.
45
+ 11. **Технические детали — ниже основной части.** Там укажи тип, рекомендацию, файлы/строки, что в коде подтверждает проблему, общий подход к исправлению и конкретные шаги. Если деталь не помогает понять или исправить проблему — не пиши её.
46
+
47
+ ## Стиль замечаний
48
+
49
+ Пиши так, чтобы первый экран пункта можно было прочитать без глубокого знания кода. Хороший пункт похож на короткое объяснение ревьюера человеку:
50
+
51
+ ```markdown
52
+ ### 1. Может быть слишком много запросов во внешний сервис
53
+
54
+ Сейчас проверка идёт по одному ответу за раз: один ответ в нашей системе — один запрос во внешний сервис.
55
+
56
+ Если таких ответов 50, задача может сделать 50 запросов подряд. У внешнего сервиса на такие методы обычно есть ограничения по частоте. Если общая защита от лимитов реально разруливает это снаружи, пункт можно ослабить. Но по самому PR этого не видно.
57
+
58
+ Риск такой: внешний сервис начнёт отвечать ошибками, а ответы в нашей системе продолжат висеть «на проверке».
59
+
60
+ Технические детали:
61
+
62
+ - **Тип:** `performance`
63
+ - **Рекомендация:** `править обязательно`
64
+ - **Где:** `path/to/file.ts:42` — цикл с запросом на каждый ответ.
65
+ - **Как исправить:** добавить батчинг, ограничение параллелизма или явную обработку rate limit.
66
+ - **Тесты:** проверить несколько ответов, ошибку внешнего сервиса и повторный запуск задачи.
67
+ ```
68
+
69
+ Это ориентир по стилю, а не текст для копирования. Не растягивай пункт: основная часть должна быть короче технических деталей или сопоставима с ними, без канцелярита и без пересказа всего diff.
45
70
 
46
71
  ## Интерактивные вопросы
47
72
 
@@ -80,17 +105,12 @@ description: 'Ревью изменений (незакоммиченный diff
80
105
 
81
106
  Каждое замечание должно быть самостоятельным блоком:
82
107
  - заголовок с номером и коротким смыслом;
83
- - тип и рекомендация: `править обязательно` или `на усмотрение автора`;
84
- - контекст: объяснение проблемы без привязки к конкретному коду;
85
- - риск: почему это важно для поведения, сопровождения, денег, безопасности или эксплуатации;
86
- - где: конкретные файлы/строки;
87
- - детали: что именно в коде подтверждает проблему;
88
- - как исправить: сначала общий подход без привязки к коду;
89
- - конкретные шаги: что поменять в файлах/тестах.
108
+ - основная часть простым языком: контекст, проблема и риск без привязки к конкретному коду;
109
+ - `Технические детали`: тип, рекомендация, конкретные файлы/строки, что именно в коде подтверждает проблему, как исправить и какие тесты добавить или обновить.
90
110
 
91
111
  Поставь оценку 0–100 (100 — идеально, 0 — переделывать).
92
112
 
93
- Сохрани в `docs/reviews/{YYYY-MM-DD}_{HH-MM}_{slug}.md`. Соблюдай этот формат буквально: смысловые части идут отдельными блоками, между соседними блоками всегда есть одна пустая строка.
113
+ Сохрани в `docs/reviews/{YYYY-MM-DD}_{HH-MM}_{slug}.md`. Соблюдай этот формат буквально: каждый пункт сначала читается как короткий человеческий ответ, а технические детали идут ниже отдельным блоком.
94
114
 
95
115
  ```markdown
96
116
  ---
@@ -115,20 +135,14 @@ meta_reviewers: []
115
135
 
116
136
  ### 1. <недоделка, отклонение или непроверенный пункт>
117
137
 
118
- Статус: <частично | не выполнено | не проверялось | отклонение>
138
+ <2–4 коротких абзаца: что требовал план, что не сделано или не подтверждено, почему это важно. Без имён файлов, строк и внутренних деталей в начале пункта.>
119
139
 
120
- Контекст:
121
- <что требовал план простыми словами, без привязки к коду>
140
+ Технические детали:
122
141
 
123
- Проблема:
124
- <что не сделано, сделано неточно или не подтверждено>
125
-
126
- Риск:
127
- <почему это важно>
128
-
129
- Где:
130
-
131
- - `<path/file.ts:42>` — <что смотреть>
142
+ - **Статус:** <частично | не выполнено | не проверялось | отклонение>
143
+ - **Где:** `<path/file.ts:42>` <что смотреть>
144
+ - **Что подтверждает проблему:** <конкретная деталь по коду, diff или плану>
145
+ - **Как исправить:** <общий подход и конкретные шаги по коду/тестам>
132
146
 
133
147
  ## Замечания
134
148
 
@@ -136,30 +150,16 @@ meta_reviewers: []
136
150
 
137
151
  ### 1. <короткий заголовок проблемы>
138
152
 
139
- Тип: `bug`
140
-
141
- Рекомендация: `править обязательно`
142
-
143
- Контекст:
144
- <объясни проблему и предметную причину без привязки к конкретному коду>
145
-
146
- Риск:
147
- <что сломается или почему это важно>
148
-
149
- Где:
150
-
151
- - `<path/file.py:42>` — <что смотреть>
152
-
153
- Детали:
154
- <конкретное объяснение по коду>
155
-
156
- Как исправить:
157
- <общий подход без привязки к конкретному файлу>
153
+ <2–4 коротких абзаца: что происходит, почему это проблема, какой практический риск, когда он проявится. Без технической перегрузки и без пересказа diff.>
158
154
 
159
- Конкретные шаги:
155
+ Технические детали:
160
156
 
161
- - <что поменять в коде>
162
- - <какой тест добавить или обновить>
157
+ - **Тип:** `bug | security | performance | architecture | rules | tests | quality | docs`
158
+ - **Рекомендация:** `править обязательно | на усмотрение автора`
159
+ - **Где:** `<path/file.py:42>` — <что смотреть>
160
+ - **Что подтверждает проблему:** <конкретное объяснение по коду>
161
+ - **Как исправить:** <общий подход, затем конкретные шаги по файлам>
162
+ - **Тесты:** <какой тест добавить или обновить; если тест не нужен, почему>
163
163
 
164
164
  ## Рекомендации
165
165
 
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: eda-worktree
3
+ description: 'Создаёт новый git worktree рядом с основным проектом в папке `{name}-work-{n}` и одноимённую ветку. Базовую ветку берёт из текста рядом с вызовом, если она указана, иначе спрашивает интерактивно. Не правит код, не коммитит, не мержит обратно. В финале показывает путь worktree, имя ветки и команду перехода в новую папку.'
4
+ ---
5
+
6
+ # Скил: Создатель worktree (eda-worktree)
7
+
8
+ Создаёшь отдельный git worktree для параллельной работы. Worktree всегда появляется рядом с основным проектом, а имя выбирается автоматически.
9
+
10
+ ## Режимы вызова
11
+
12
+ | Режим | Запуск | Что делает |
13
+ |---|---|---|
14
+ | С выбранной базой | `eda-worktree main` | Создаёт worktree от указанной ветки, тега или commit-ref |
15
+ | С вопросом | `eda-worktree` | Спрашивает, от какой базы создать worktree |
16
+
17
+ ## Вход из сообщения пользователя
18
+
19
+ Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: базовую ветку или ref, ограничения и прямые указания.
20
+
21
+ Если вход содержит ветку, tag, commit hash или выражение вроде `от main` / `from main` / `base main`, используй это как `$BASE_REF`. Если входа нет или база не указана, спроси через `AskUserQuestion`. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
22
+
23
+ ## Главные правила
24
+
25
+ 1. **Только git worktree.** Не правь код, docs, конфиги и зависимости.
26
+ 2. **Имя строго по шаблону.** Папка и ветка называются `{name}-work-{n}`, где `{name}` — имя папки основного worktree проекта, а `{n}` — первый свободный положительный номер.
27
+ 3. **Папка рядом с основным проектом.** Если основной worktree лежит в `/path/app`, новый путь: `/path/app-work-1`, `/path/app-work-2` и так далее.
28
+ 4. **Базу не додумывай молча.** Если пользователь не указал `$BASE_REF`, спроси интерактивно.
29
+ 5. **Не удаляй и не мержь.** Этот скил только создаёт worktree. Обратный merge — `eda-merge-worktree`.
30
+ 6. **Простой язык** в сообщениях пользователю.
31
+
32
+ ## Интерактивные вопросы
33
+
34
+ Когда инструкция говорит `AskUserQuestion`, это означает блокирующий интерактивный вопрос.
35
+ - Claude Code: используй `AskUserQuestion`.
36
+ - Codex interactive: если доступен `request_user_input`, используй его. Если tool недоступен, задай один короткий вопрос в чат, дай варианты 1–3, напиши «Ответь номером или своим вариантом. Я продолжу только после ответа.» и остановись.
37
+ - Codex exec / неинтерактивный запуск: не задавай вопросы и не пытайся читать stdin. Если без ответа нельзя безопасно продолжать, заверши работу со статусом `blocked: нужен ответ пользователя`, перечисли вопросы и варианты, не выполняй рискованные действия.
38
+ - Не запускай команды, которые ждут интерактивного ввода в терминале.
39
+
40
+ ## Этапы
41
+
42
+ ### 1. Проверить git-репозиторий
43
+
44
+ Выполни:
45
+
46
+ ```bash
47
+ git rev-parse --show-toplevel
48
+ git worktree list --porcelain
49
+ ```
50
+
51
+ Если это не git-репозиторий — остановись и сообщи. Основной worktree бери из первой записи `worktree <path>` в `git worktree list --porcelain`. Если список не удалось прочитать, используй `git rev-parse --show-toplevel`.
52
+
53
+ Определи:
54
+ - `$MAIN_WORKTREE` — путь основного worktree;
55
+ - `$PROJECT_NAME` — basename от `$MAIN_WORKTREE`;
56
+ - `$PROJECT_PARENT` — родительская папка `$MAIN_WORKTREE`.
57
+
58
+ ### 2. Выбрать базу
59
+
60
+ Если `$BASE_REF` указан в сообщении пользователя, проверь его:
61
+
62
+ ```bash
63
+ git rev-parse --verify "$BASE_REF^{commit}"
64
+ ```
65
+
66
+ Если ref не найден — остановись и сообщи, что база не существует.
67
+
68
+ Если `$BASE_REF` не указан, спроси через `AskUserQuestion`, откуда создавать worktree. Предлагай реальные варианты:
69
+ - текущая ветка или `HEAD`;
70
+ - default branch из `origin/HEAD`, если она есть;
71
+ - `main` или `master`, если такая ветка существует.
72
+
73
+ Если пользователь выбирает свой ref, проверь его через `git rev-parse --verify "$BASE_REF^{commit}"`.
74
+
75
+ Если текущий worktree содержит незакоммиченные изменения, коротко предупреди: они не попадут в новый worktree. Это не блокер, если база выбрана явно или подтверждена через вопрос.
76
+
77
+ ### 3. Найти свободное имя
78
+
79
+ Начиная с `n = 1`, найди первый номер, для которого одновременно свободны:
80
+ - соседняя папка `$PROJECT_PARENT/$PROJECT_NAME-work-$n`;
81
+ - локальная ветка `$PROJECT_NAME-work-$n`.
82
+
83
+ Проверяй ветку так:
84
+
85
+ ```bash
86
+ git show-ref --verify --quiet "refs/heads/$BRANCH_NAME"
87
+ ```
88
+
89
+ Результат:
90
+ - `$WORKTREE_NAME=$PROJECT_NAME-work-$n`;
91
+ - `$BRANCH_NAME=$WORKTREE_NAME`;
92
+ - `$WORKTREE_PATH=$PROJECT_PARENT/$WORKTREE_NAME`.
93
+
94
+ Если папка уже есть, не перезаписывай её и не удаляй. Просто бери следующий номер.
95
+
96
+ ### 4. Создать worktree
97
+
98
+ Выполни:
99
+
100
+ ```bash
101
+ git worktree add -b "$BRANCH_NAME" "$WORKTREE_PATH" "$BASE_REF"
102
+ ```
103
+
104
+ Если команда упала, покажи понятную причину и не пытайся чистить вручную. Если ошибка говорит, что ветка или папка уже существует, вернись к шагу 3 и выбери следующий номер.
105
+
106
+ ### 5. Финал
107
+
108
+ Короткое сообщение:
109
+ - созданный путь worktree;
110
+ - имя ветки;
111
+ - выбранная база;
112
+ - готовая команда:
113
+
114
+ ```bash
115
+ cd "$WORKTREE_PATH"
116
+ ```
117
+
118
+ Напомни, что обратный merge выполняет `eda-merge-worktree <n>` или `eda-merge-worktree work-<n>`.
119
+
120
+ ## Чего НЕ делать
121
+
122
+ - Править файлы проекта.
123
+ - Создавать docs-артефакты.
124
+ - Коммитить, пушить, мержить.
125
+ - Удалять существующие worktree, ветки или папки.
126
+ - Создавать worktree внутри текущего проекта вместо соседней папки.