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