mister-wolf 1.0.3 → 1.1.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.
Files changed (75) hide show
  1. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  2. package/dist/adapters/cli/cli-entry.js +2 -0
  3. package/dist/adapters/cli/cli-entry.js.map +1 -1
  4. package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
  5. package/dist/adapters/cli/commands/memory-init.js +33 -1
  6. package/dist/adapters/cli/commands/memory-init.js.map +1 -1
  7. package/dist/adapters/cli/commands/memory-sync.d.ts +3 -0
  8. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -0
  9. package/dist/adapters/cli/commands/memory-sync.js +28 -0
  10. package/dist/adapters/cli/commands/memory-sync.js.map +1 -0
  11. package/dist/adapters/render/manifest.d.ts +13 -0
  12. package/dist/adapters/render/manifest.d.ts.map +1 -0
  13. package/dist/adapters/render/manifest.js +14 -0
  14. package/dist/adapters/render/manifest.js.map +1 -0
  15. package/dist/adapters/render/opencode/opencode-renderer.d.ts +22 -0
  16. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -0
  17. package/dist/adapters/render/opencode/opencode-renderer.js +125 -0
  18. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -0
  19. package/dist/adapters/render/stamp.d.ts +8 -0
  20. package/dist/adapters/render/stamp.d.ts.map +1 -0
  21. package/dist/adapters/render/stamp.js +23 -0
  22. package/dist/adapters/render/stamp.js.map +1 -0
  23. package/dist/adapters/render/templates-root.d.ts +6 -0
  24. package/dist/adapters/render/templates-root.d.ts.map +1 -0
  25. package/dist/adapters/render/templates-root.js +30 -0
  26. package/dist/adapters/render/templates-root.js.map +1 -0
  27. package/dist/app/use-cases/init-project.d.ts +12 -0
  28. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  29. package/dist/app/use-cases/init-project.js +13 -1
  30. package/dist/app/use-cases/init-project.js.map +1 -1
  31. package/dist/app/use-cases/seed-base-playbooks.d.ts +26 -0
  32. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -0
  33. package/dist/app/use-cases/seed-base-playbooks.js +43 -0
  34. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -0
  35. package/dist/app/use-cases/sync-base-set.d.ts +12 -0
  36. package/dist/app/use-cases/sync-base-set.d.ts.map +1 -0
  37. package/dist/app/use-cases/sync-base-set.js +10 -0
  38. package/dist/app/use-cases/sync-base-set.js.map +1 -0
  39. package/dist/ports/base-set-renderer.port.d.ts +20 -0
  40. package/dist/ports/base-set-renderer.port.d.ts.map +1 -0
  41. package/dist/ports/base-set-renderer.port.js +2 -0
  42. package/dist/ports/base-set-renderer.port.js.map +1 -0
  43. package/package.json +11 -3
  44. package/templates/base/README.md +1 -0
  45. package/templates/base/agents/executor-lead.md +79 -0
  46. package/templates/base/agents/mr-wolf.md +76 -0
  47. package/templates/base/agents/steward.md +56 -0
  48. package/templates/base/agents/worker-implementer.md +58 -0
  49. package/templates/base/agents/worker-researcher.md +59 -0
  50. package/templates/base/agents/worker-reviewer.md +58 -0
  51. package/templates/base/commands/analyze-doc.md +11 -0
  52. package/templates/base/commands/complain.md +13 -0
  53. package/templates/base/commands/doc-review.md +15 -0
  54. package/templates/base/playbooks/complaint-protocol.md +39 -0
  55. package/templates/base/playbooks/steward-nastavnik.md +38 -0
  56. package/templates/base/playbooks/wolf-review-lenses.md +50 -0
  57. package/templates/base/playbooks/worker-implementer-playbook.md +51 -0
  58. package/templates/base/playbooks/worker-researcher-playbook.md +51 -0
  59. package/templates/base/playbooks/worker-reviewer-playbook.md +54 -0
  60. package/templates/base/skills/finishing-a-development-branch/SKILL.md +213 -0
  61. package/templates/base/skills/requesting-code-review/SKILL.md +123 -0
  62. package/templates/base/skills/test-driven-development/SKILL.md +391 -0
  63. package/templates/base/skills/using-git-worktrees/SKILL.md +178 -0
  64. package/templates/base/skills/using-skills/SKILL.md +128 -0
  65. package/templates/base/skills/verification-before-completion/SKILL.md +157 -0
  66. package/templates/base/skills/wolf-brainstorm/SKILL.md +167 -0
  67. package/templates/base/skills/wolf-debug/SKILL.md +293 -0
  68. package/templates/base/skills/wolf-execute/SKILL.md +96 -0
  69. package/templates/base/skills/wolf-handoff/SKILL.md +101 -0
  70. package/templates/base/skills/wolf-plan/SKILL.md +177 -0
  71. package/templates/base/skills/wolf-review/SKILL.md +61 -0
  72. package/templates/base/skills/wolf-sdd/SKILL.md +239 -0
  73. package/templates/opencode/README.md +1 -0
  74. package/templates/opencode/plugins/wolf-router.ts +104 -0
  75. package/templates/opencode/plugins/wolf-session-start.js +144 -0
@@ -0,0 +1,391 @@
1
+ ---
2
+ name: test-driven-development
3
+ description: Используй при реализации любой фичи или багфикса, до написания кода реализации
4
+ ---
5
+
6
+ # Test-Driven Development (TDD)
7
+
8
+ > Источник: ~/.config/opencode/superpowers/skills/test-driven-development/SKILL.md, upstream 6efe32c (2026-04-23).
9
+ > Адресат: worker-implementer — пассивный процесс: читаешь и следуешь в рамках своей единственной задачи, без диспетчеризации.
10
+
11
+ ## Трассировка адаптации
12
+
13
+ | Пункт upstream | Судьба |
14
+ |---|---|
15
+ | Iron Law, цикл RED-GREEN-REFACTOR, обязательные верификации RED/GREEN, dot-диаграмма | **сохранено** дословно (перевод) |
16
+ | Таблица рационализаций (11), red flags (13), «Why Order Matters» (5 аргументов), анти-паттерны тестирования (3), чеклист верификации (8), «When Stuck» (4), примеры Good/Bad, пример багфикса | **сохранено полностью** по смыслу дословно (H7) |
17
+ | `npm test <путь>` | **заменено**: точечный прогон — `npx vitest run <путь>` (стек проекта — vitest); полный — `npm run check` |
18
+ | «Ask your human partner» (исключения из Iron Law) | **заменено**: явное разрешение владельца; воркер эскалирует запрос через executor-lead, сам не решает |
19
+ | Чеклист верификации | **дополнено**: механика {{tool.todowrite}} — один пункт на чекбокс |
20
+ | Ссылка на внешний `@testing-anti-patterns.md` | **отброшено**: reference-файл вне шаблона; суть (3 пункта) встроена в раздел «Анти-паттерны тестирования» |
21
+ | Контур лица | **добавлено**: до задачи — `wolf search "worker-implementer playbook"` (брать наибольшую версию) |
22
+
23
+ ## Обзор
24
+
25
+ Сначала напиши тест. Посмотри, как он падает. Напиши минимальный код, чтобы он прошёл.
26
+
27
+ **Принцип:** если ты не видел, как тест падает, ты не знаешь, проверяет ли он то, что нужно.
28
+
29
+ **Нарушение буквы правил — это нарушение духа правил.**
30
+
31
+ ## Когда применять
32
+
33
+ **Всегда:**
34
+ - Новые фичи
35
+ - Багфиксы
36
+ - Рефакторинг
37
+ - Изменения поведения
38
+
39
+ **Исключения (только с явного разрешения владельца — эскалируй через executor-lead):**
40
+ - Одноразовые прототипы
41
+ - Генерированный код
42
+ - Конфигурационные файлы
43
+
44
+ Думаешь «пропущу TDD только этот раз»? Стоп. Это рационализация.
45
+
46
+ ## Iron Law
47
+
48
+ ```
49
+ НИКАКОГО ПРОДАКШЕН-КОДА БЕЗ ПАДАЮЩЕГО ТЕСТА
50
+ ```
51
+
52
+ Написал код до теста? Удали. Начни заново.
53
+
54
+ **Без исключений:**
55
+ - Не оставляй «как референс»
56
+ - Не «адаптируй» его при написании тестов
57
+ - Не смотри на него
58
+ - Удалить означает удалить
59
+
60
+ Реализуй с нуля из тестов. Точка.
61
+
62
+ ## Красный-Зелёный-Рефакторинг
63
+
64
+ ```dot
65
+ digraph tdd_cycle {
66
+ rankdir=LR;
67
+ red [label="КРАСНЫЙ\nНапиши падающий тест", shape=box, style=filled, fillcolor="#ffcccc"];
68
+ verify_red [label="Падает\nпо правильной причине", shape=diamond];
69
+ green [label="ЗЕЛЁНЫЙ\nМинимальный код", shape=box, style=filled, fillcolor="#ccffcc"];
70
+ verify_green [label="Проходит\nВсё зелёное", shape=diamond];
71
+ refactor [label="РЕФАКТОРИНГ\nПрибраться", shape=box, style=filled, fillcolor="#ccccff"];
72
+ next [label="Дальше", shape=ellipse];
73
+
74
+ red -> verify_red;
75
+ verify_red -> green [label="да"];
76
+ verify_red -> red [label="не та\nпричина"];
77
+ green -> verify_green;
78
+ verify_green -> refactor [label="да"];
79
+ verify_green -> green [label="нет"];
80
+ refactor -> verify_green [label="остаёмся\nзелёными"];
81
+ verify_green -> next;
82
+ next -> red;
83
+ }
84
+ ```
85
+
86
+ ### КРАСНЫЙ — напиши падающий тест
87
+
88
+ Напиши один минимальный тест, показывающий, что должно происходить.
89
+
90
+ <Good>
91
+ ```typescript
92
+ test('повторяет неудачную операцию 3 раза', async () => {
93
+ let attempts = 0;
94
+ const operation = () => {
95
+ attempts++;
96
+ if (attempts < 3) throw new Error('fail');
97
+ return 'success';
98
+ };
99
+
100
+ const result = await retryOperation(operation);
101
+
102
+ expect(result).toBe('success');
103
+ expect(attempts).toBe(3);
104
+ });
105
+ ```
106
+ Ясное имя, тестирует реальное поведение, одно
107
+ </Good>
108
+
109
+ <Bad>
110
+ ```typescript
111
+ test('retry works', async () => {
112
+ const mock = jest.fn()
113
+ .mockRejectedValueOnce(new Error())
114
+ .mockRejectedValueOnce(new Error())
115
+ .mockResolvedValueOnce('success');
116
+ await retryOperation(mock);
117
+ expect(mock).toHaveBeenCalledTimes(3);
118
+ });
119
+ ```
120
+ Расплывчатое имя, тестирует мок, а не код
121
+ </Bad>
122
+
123
+ **Требования:**
124
+ - Одно поведение
125
+ - Ясное имя
126
+ - Реальный код (моки — только при неизбежности)
127
+
128
+ ### Верифицируй КРАСНЫЙ — посмотри, как падает
129
+
130
+ **ОБЯЗАТЕЛЬНО. Никогда не пропускай.**
131
+
132
+ ```bash
133
+ npx vitest run <путь-к-тесту>
134
+ ```
135
+
136
+ Подтверди:
137
+ - Тест падает (а не ошибается)
138
+ - Сообщение об ошибке ожидаемое
139
+ - Падает из-за отсутствия фичи (не из-за опечаток)
140
+
141
+ **Тест проходит?** Ты тестируешь существующее поведение. Почини тест.
142
+
143
+ **Тест ошибается?** Почини ошибку, гоняй, пока не упадёт корректно.
144
+
145
+ ### ЗЕЛЁНЫЙ — минимальный код
146
+
147
+ Напиши простейший код, чтобы тест прошёл.
148
+
149
+ <Good>
150
+ ```typescript
151
+ async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
152
+ for (let i = 0; i < 3; i++) {
153
+ try {
154
+ return await fn();
155
+ } catch (e) {
156
+ if (i === 2) throw e;
157
+ }
158
+ }
159
+ throw new Error('unreachable');
160
+ }
161
+ ```
162
+ Ровно столько, чтобы пройти
163
+ </Good>
164
+
165
+ <Bad>
166
+ ```typescript
167
+ async function retryOperation<T>(
168
+ fn: () => Promise<T>,
169
+ options?: {
170
+ maxRetries?: number;
171
+ backoff?: 'linear' | 'exponential';
172
+ onRetry?: (attempt: number) => void;
173
+ }
174
+ ): Promise<T> {
175
+ // YAGNI
176
+ }
177
+ ```
178
+ Оверинжиниринг
179
+ </Bad>
180
+
181
+ Не добавляй фичи, не рефакторь другой код, не «улучшай» сверх теста.
182
+
183
+ ### Верифицируй ЗЕЛЁНЫЙ — посмотри, как проходит
184
+
185
+ **ОБЯЗАТЕЛЬНО.**
186
+
187
+ ```bash
188
+ npx vitest run <путь-к-тесту>
189
+ ```
190
+
191
+ Подтверди:
192
+ - Тест проходит
193
+ - Остальные тесты всё ещё проходят
194
+ - Вывод чистый (без ошибок и предупреждений)
195
+
196
+ **Тест упал?** Чини код, а не тест.
197
+
198
+ **Другие тесты упали?** Чини сейчас.
199
+
200
+ ### РЕФАКТОРИНГ — приберись
201
+
202
+ Только после зелёного:
203
+ - Убери дублирование
204
+ - Улучши имена
205
+ - Вынеси хелперы
206
+
207
+ Тесты остаются зелёными. Поведение не добавляется.
208
+
209
+ ### Повтори
210
+
211
+ Следующий падающий тест для следующей фичи.
212
+
213
+ ## Хорошие тесты
214
+
215
+ | Качество | Хорошо | Плохо |
216
+ |---------|------|-----|
217
+ | **Минимальность** | Одно поведение. «И» в имени? Раздели. | `test('проверяет email, домен и пробелы')` |
218
+ | **Ясность** | Имя описывает поведение | `test('test1')` |
219
+ | **Намерение** | Демонстрирует желаемый API | Затуманивает, что код должен делать |
220
+
221
+ ## Почему важен порядок
222
+
223
+ **«Я напишу тесты после, чтобы проверить, что работает»**
224
+
225
+ Тесты, написанные после кода, проходят сразу. Прохождение сразу не доказывает ничего:
226
+ - Может тестировать не то
227
+ - Может тестировать реализацию, а не поведение
228
+ - Может упускать пограничные случаи, которые ты забыл
229
+ - Ты никогда не видел, как тест ловит баг
230
+
231
+ Тест-первый заставляет увидеть падение теста — доказательство, что он реально что-то проверяет.
232
+
233
+ **«Я уже вручно протестировал все пограничные случаи»**
234
+
235
+ Ручное тестирование ад-хок. Ты думаешь, что проверил всё, но:
236
+ - Нет записи о том, что проверено
237
+ - Нельзя перезапустить при изменении кода
238
+ - Легко забыть случаи под давлением
239
+ - «Работало, когда я пробовал» ≠ исчерпывающе
240
+
241
+ Автотесты систематичны. Они выполняются одинаково каждый раз.
242
+
243
+ **«Удалить X часов работы расточительно»**
244
+
245
+ Ошибка невозвратных издержек. Время уже потрачено. Выбор сейчас:
246
+ - Удалить и переписать по TDD (ещё X часов, высокая уверенность)
247
+ - Оставить и дописать тесты после (30 минут, низкая уверенность, вероятные баги)
248
+
249
+ «Расточительство» — держать код, которому не можешь доверять. Работающий код без настоящих тестов — техдолг.
250
+
251
+ **«TDD догматично, прагматизм означает адаптацию»**
252
+
253
+ TDD — И есть прагматизм:
254
+ - Находит баги до коммита (быстрее отладки после)
255
+ - Предотвращает регрессии (тесты ловят поломки сразу)
256
+ - Документирует поведение (тесты показывают, как использовать код)
257
+ - Даёт рефакторинг (меняй свободно, тесты ловят поломки)
258
+
259
+ «Прагматичные» сокращения = отладка в проде = медленнее.
260
+
261
+ **«Тесты после достигают тех же целей — важен дух, а не ритуал»**
262
+
263
+ Нет. Тесты-после отвечают «что это делает?». Тесты-первый отвечают «что это должно делать?».
264
+
265
+ Тесты-после смещены твоей реализацией: ты тестируешь то, что построил, а не то, что требуется. Верифицируешь запомненные пограничные случаи, а не обнаруженные.
266
+
267
+ Тест-первый заставляет обнаружить пограничные случаи до реализации. Тесты-после проверяют, что ты всё запомнил (ты не запомнил).
268
+
269
+ 30 минут тестов после ≠ TDD. Получаешь покрытие, теряешь доказательство, что тесты работают.
270
+
271
+ ## Распространённые рационализации
272
+
273
+ | Оправдание | Реальность |
274
+ |--------|---------|
275
+ | «Слишком просто, чтобы тестировать» | Простой код ломается. Тест занимает 30 секунд. |
276
+ | «Напишу тесты после» | Тесты, проходящие сразу, не доказывают ничего. |
277
+ | «Тесты после достигают тех же целей» | Тесты-после = «что это делает?». Тесты-первый = «что это должно делать?» |
278
+ | «Уже протестировал вручную» | Ад-хок ≠ систематично. Нет записи, нельзя перезапустить. |
279
+ | «Удалить X часов работы расточительно» | Ошибка невозвратных издержек. Держать непроверенный код — техдолг. |
280
+ | «Оставлю как референс, напишу тесты с нуля» | Ты его адаптируешь. Это тесты-после. Удалить = удалить. |
281
+ | «Нужно сначала поисследовать» | Ок. Выброси исследование, начни с TDD. |
282
+ | «Тест сложный — дизайн неясен» | Слушай тест. Сложно тестировать = сложно использовать. |
283
+ | «TDD меня замедлит» | TDD быстрее отладки. Прагматизм = тест-первый. |
284
+ | «Ручной тест быстрее» | Ручной не доказывает пограничные случаи. Перепроверять при каждом изменении. |
285
+ | «В существующем коде нет тестов» | Ты его улучшаешь. Добавляй тесты для существующего кода. |
286
+
287
+ ## Red flags — ОСТАНОВИСЬ и начни заново
288
+
289
+ - Код до теста
290
+ - Тест после реализации
291
+ - Тест проходит сразу
292
+ - Не можешь объяснить, почему тест упал
293
+ - Тесты «добавим позже»
294
+ - Рационализация «только этот раз»
295
+ - «Я уже вручную протестировал»
296
+ - «Тесты после достигают той же цели»
297
+ - «Дело в духе, а не в ритуале»
298
+ - «Оставлю как референс» или «адаптирую существующий код»
299
+ - «Уже потратил X часов, удалять расточительно»
300
+ - «TDD догматично, я прагматик»
301
+ - «Это другой случай, потому что...»
302
+
303
+ **Любой из этих пунктов означает: удали код. Начни заново по TDD.**
304
+
305
+ ## Пример: багфикс
306
+
307
+ **Баг:** принимается пустой email
308
+
309
+ **КРАСНЫЙ**
310
+ ```typescript
311
+ test('отклоняет пустой email', async () => {
312
+ const result = await submitForm({ email: '' });
313
+ expect(result.error).toBe('Email required');
314
+ });
315
+ ```
316
+
317
+ **Верифицируй КРАСНЫЙ**
318
+ ```bash
319
+ $ npx vitest run <путь-к-тесту>
320
+ FAIL: expected 'Email required', got undefined
321
+ ```
322
+
323
+ **ЗЕЛЁНЫЙ**
324
+ ```typescript
325
+ function submitForm(data: FormData) {
326
+ if (!data.email?.trim()) {
327
+ return { error: 'Email required' };
328
+ }
329
+ // ...
330
+ }
331
+ ```
332
+
333
+ **Верифицируй ЗЕЛЁНЫЙ**
334
+ ```bash
335
+ $ npx vitest run <путь-к-тесту>
336
+ PASS
337
+ ```
338
+
339
+ **РЕФАКТОРИНГ**
340
+ Вынеси валидацию для нескольких полей, если нужно.
341
+
342
+ ## Чеклист верификации
343
+
344
+ Перед отметкой работы как завершённой размести пункты в {{tool.todowrite}} (один пункт — один чекбокс) и отметь по факту:
345
+
346
+ - [ ] У каждой новой функции/метода есть тест
347
+ - [ ] Видел каждый тест падающим до реализации
348
+ - [ ] Каждый тест падал по ожидаемой причине (фича отсутствует, не опечатка)
349
+ - [ ] Написал минимальный код для прохождения каждого теста
350
+ - [ ] Все тесты проходят
351
+ - [ ] Вывод чистый (без ошибок и предупреждений)
352
+ - [ ] Тесты используют реальный код (моки — только при неизбежности)
353
+ - [ ] Пограничные случаи и ошибки покрыты
354
+
355
+ Не можешь отметить все пункты? Ты пропустил TDD. Начни заново.
356
+
357
+ ## Когда застрял
358
+
359
+ | Проблема | Решение |
360
+ |---------|----------|
361
+ | Не знаю, как тестировать | Напиши желаемый API. Сначала напиши assertion. Запроси подсказку владельца через executor-lead. |
362
+ | Тест слишком сложный | Дизайн слишком сложный. Упрости интерфейс. |
363
+ | Приходится мокать всё | Код слишком связан. Используй внедрение зависимостей. |
364
+ | Подготовка теста огромная | Вынеси хелперы. Всё ещё сложно? Упрости дизайн. |
365
+
366
+ ## Интеграция с отладкой
367
+
368
+ Найден баг? Напиши падающий тест, воспроизводящий его. Пройди цикл TDD. Тест доказывает фикс и предотвращает регрессию.
369
+
370
+ Никогда не чини баги без теста.
371
+
372
+ ## Анти-паттерны тестирования
373
+
374
+ - Тестирование поведения мока вместо реального поведения
375
+ - Тест-методы в продакшен-классах
376
+ - Моки без понимания зависимостей
377
+
378
+ ## Интеграция с Wolf
379
+
380
+ - **Контур лица**: до задачи — `wolf search "worker-implementer playbook"` (наибольшая версия); методика эволюционирует в памяти, этот файл — только процесс.
381
+ - **Полная верификация** в конце задачи — `npm run check`.
382
+ - **Урок**: наткнулся на нетривиальную ловушку TDD-цикла — зафиксируй `wolf add --type lesson`, чтобы следующий воркер её обошёл.
383
+
384
+ ## Финальное правило
385
+
386
+ ```
387
+ Продакшен-код → тест существует и упал первым
388
+ Иначе → не TDD
389
+ ```
390
+
391
+ Без исключений — кроме явного разрешения владельца.
@@ -0,0 +1,178 @@
1
+ ---
2
+ name: using-git-worktrees
3
+ description: Используй при старте фичи, которой нужна изоляция от текущего workspace, или перед исполнением планов — создаёт изолированные git-worktree с проверкой безопасности
4
+ ---
5
+
6
+ # Using Git Worktrees
7
+
8
+ > Источник: ~/.config/opencode/superpowers/skills/using-git-worktrees/SKILL.md, upstream 6efe32c (2026-04-23).
9
+ > Владелец шага: executor-lead — worktree создаётся ДО старта исполнения (REQUIRED-предусловие wolf-sdd и wolf-execute, H5).
10
+
11
+ ## Трассировка адаптации
12
+
13
+ | Пункт upstream | Судьба |
14
+ |---|---|
15
+ | Верификация gitignore (`git check-ignore`), автодетект сетапа, бейзлайн-тесты, механика `git worktree add`, отчёт о готовности, частые ошибки (4), red flags Never/Always (5/4) | **сохранено** (red flags — дословно по смыслу, H7) |
16
+ | Приоритет каталогов upstream (`.worktrees` / `worktrees` / глобальный / опрос) | **заменено** правилом проекта: worktree всегда ВНУТРИ проекта — `.worktrees/<имя-задачи>` |
17
+ | `grep CLAUDE.md` | **заменено**: чтение AGENTS.md |
18
+ | Бейзлайн `npm test` | **заменено**: `npm run check` (верификационный примитив проекта) |
19
+ | Глобальный путь `~/.config/superpowers/worktrees/` | **отброшено**: противоречит правилу проекта (worktree внутри проекта) и непереносим (research §1: «глобальный путь worktrees») |
20
+ | Ветка-альтернатива `worktrees/` (без точки), персоналия upstream («Jesse's rule») | **отброшено**: единая конвенция `.worktrees/`; правило «чинить сломанное сразу» сохранено как механика без имени |
21
+
22
+ ## Обзор
23
+
24
+ Git worktree создаёт изолированное рабочее пространство с общим репозиторием: работа в нескольких ветках одновременно без переключений.
25
+
26
+ **Принцип:** систематический выбор каталога + верификация безопасности = надёжная изоляция.
27
+
28
+ **Анонс в начале:** «Использую скилл using-git-worktrees для настройки изолированного workspace».
29
+
30
+ ## Выбор каталога
31
+
32
+ Правило проекта: worktree — **внутри проекта**, `.worktrees/<имя-задачи>` (никаких глобальных путей).
33
+
34
+ Приоритет:
35
+
36
+ 1. **Существует `.worktrees/`** → использовать его.
37
+ 2. **AGENTS.md проекта** → прочитать; если указана иная конвенция — следовать ей без вопросов.
38
+ 3. **Ничего не указано** → создать `.worktrees/` внутри проекта; при сомнениях спросить владельца.
39
+
40
+ `<имя-задачи>` берётся из брифа executor-lead'а (слаг задачи/фичи).
41
+
42
+ ## Верификация безопасности
43
+
44
+ Каталог project-local → **ОБЯЗАТЕЛЬНО проверить игнор до создания worktree:**
45
+
46
+ ```bash
47
+ # Учитывает локальный, глобальный и системный gitignore
48
+ git check-ignore -q .worktrees
49
+ ```
50
+
51
+ **НЕ игнорируется?** Правило «почини сломанное сразу»:
52
+
53
+ 1. Добавь строку в `.gitignore`
54
+ 2. Закоммить изменение
55
+ 3. Продолжай создание worktree
56
+
57
+ **Почему критично:** предотвращает случайный коммит содержимого worktree в репозиторий.
58
+
59
+ ## Шаги создания
60
+
61
+ ### 1. Создать worktree
62
+
63
+ ```bash
64
+ git worktree add .worktrees/<имя-задачи> -b <имя-ветки>
65
+ cd .worktrees/<имя-задачи>
66
+ ```
67
+
68
+ ### 2. Запустить сетап проекта
69
+
70
+ Автодетект по файлам проекта:
71
+
72
+ ```bash
73
+ # Node.js
74
+ if [ -f package.json ]; then npm install; fi
75
+
76
+ # Rust
77
+ if [ -f Cargo.toml ]; then cargo build; fi
78
+
79
+ # Python
80
+ if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
81
+ if [ -f pyproject.toml ]; then poetry install; fi
82
+
83
+ # Go
84
+ if [ -f go.mod ]; then go mod download; fi
85
+ ```
86
+
87
+ ### 3. Верифицировать чистый бейзлайн
88
+
89
+ Прогнать тесты, чтобы worktree стартовал с чистого состояния (в проектах Wolf — `npm run check`):
90
+
91
+ ```bash
92
+ npm run check # или тестовая команда проекта
93
+ ```
94
+
95
+ **Упали?** Доложить о падениях, спросить: продолжать или исследовать.
96
+
97
+ **Зелёные?** Доложить о готовности.
98
+
99
+ ### 4. Отчитаться о расположении
100
+
101
+ ```
102
+ Worktree готов: <полный-путь>
103
+ Тесты проходят (<N> тестов, 0 падений)
104
+ Готов к реализации <имя-фичи>
105
+ ```
106
+
107
+ ## Быстрая шпаргалка
108
+
109
+ | Ситуация | Действие |
110
+ |-----------|--------|
111
+ | `.worktrees/` существует | Использовать (проверить игнор) |
112
+ | Не существует | Создать внутри проекта `.worktrees/` (правило проекта) |
113
+ | Каталог не игнорируется | Добавить в .gitignore + коммит |
114
+ | Тесты падают на бейзлайне | Доложить о падениях + спросить |
115
+ | Нет package.json / Cargo.toml и т.п. | Скипнуть установку зависимостей |
116
+
117
+ ## Частые ошибки
118
+
119
+ ### Пропуск проверки игнора
120
+
121
+ - **Проблема:** содержимое worktree попадает под трекинг, замусоривает git status
122
+ - **Фикс:** всегда `git check-ignore` перед созданием project-local worktree
123
+
124
+ ### Предположение о расположении каталога
125
+
126
+ - **Проблема:** неконсистентность, нарушение конвенций проекта
127
+ - **Фикс:** следовать приоритету: существующий `.worktrees/` → AGENTS.md → правило проекта (внутри проекта)
128
+
129
+ ### Продолжение с падающими тестами
130
+
131
+ - **Проблема:** не отличить новые баги от существующих
132
+ - **Фикс:** доложить о падениях, получить явное разрешение на продолжение
133
+
134
+ ### Хардкод команд сетапа
135
+
136
+ - **Проблема:** ломается на проектах с другими инструментами
137
+ - **Фикс:** автодетект по файлам проекта (package.json и т.д.)
138
+
139
+ ## Пример workflow
140
+
141
+ ```
142
+ Ты: Использую скилл using-git-worktrees для настройки изолированного workspace.
143
+
144
+ [Проверяю .worktrees/ — существует]
145
+ [Верифицирую игнор — git check-ignore подтверждает: .worktrees/ игнорируется]
146
+ [Создаю: git worktree add .worktrees/auth -b feature/auth]
147
+ [npm install]
148
+ [npm run check — 47 passing]
149
+
150
+ Worktree готов: /путь/к/проекту/.worktrees/auth
151
+ Тесты проходят (47 тестов, 0 падений)
152
+ Готов к реализации фичи auth
153
+ ```
154
+
155
+ ## Red flags
156
+
157
+ **Никогда:**
158
+ - Не создавать worktree без проверки игнора (project-local)
159
+ - Не пропускать бейзлайн-верификацию тестов
160
+ - Не продолжать с падающими тестами без вопроса
161
+ - Не предполагать расположение каталога при неоднозначности
162
+ - Не пропускать проверку AGENTS.md
163
+
164
+ **Всегда:**
165
+ - Следовать правилу проекта: worktree внутри проекта, `.worktrees/<имя-задачи>`
166
+ - Верифицировать игнор для project-local каталогов
167
+ - Автодетектить и запускать сетап проекта
168
+ - Верифицировать чистый тестовый бейзлайн
169
+
170
+ ## Интеграция
171
+
172
+ **Вызывается из:**
173
+ - **wolf-sdd** — REQUIRED до старта исполнения задач (H5)
174
+ - **wolf-execute** — REQUIRED до старта исполнения задач (H5)
175
+ - Любого скилла, которому нужен изолированный workspace
176
+
177
+ **Пара с:**
178
+ - **finishing-a-development-branch** — REQUIRED для уборки после завершения работы