# TDD Skill

Строгий цикл RED-GREEN-REFACTOR. Тест первым, потом минимальный код, потом рефакторинг.

## Когда использовать автоматически
- Даня говорит «tdd», «test-first», «через тесты», «напиши тест первым»
- Даня просит реализовать фичу и в проекте есть тестовый фреймворк
- При реализации задач из `/plan` (каждая задача следует TDD)

## Когда НЕ использовать
- Даня явно говорит «без тестов», «просто сделай»
- Одноразовые скрипты, эксперименты, прототипы
- Конфигурационные файлы, документация

## Алгоритм

### 1. Определение тестового фреймворка
Сканируй проект:
- `jest.config.*`, `vitest.config.*` → jest/vitest
- `pytest.ini`, `pyproject.toml` [tool.pytest] → pytest
- `Cargo.toml` → `cargo test`
- `go.mod` → `go test`
- `*.test.*`, `*_test.*` → определи по расширению

Определи команду запуска тестов. Если фреймворк не найден — спроси у Даня.

### 2. RED — напиши падающий тест
- Один тест на одно поведение
- Имя теста описывает **поведение**, не реализацию:
  - Хорошо: `test_retries_on_timeout`
  - Плохо: `test_retry_function`
- Запусти тест, убедись что он **ПАДАЕТ по ожидаемой причине**
  - Если тест прошёл сразу — тест неправильный, удали и переписывай
  - Если упал по синтаксической ошибке — почини тест, не код

Покажи Дане:
```
RED: test_retries_on_timeout
Ожидание: RetryError после 3 попыток
Результат: NameError — функция retry не существует ✓
```

### 3. GREEN — минимальный код
- Напиши **ровно столько кода**, чтобы тест прошёл
- Никаких «пока я тут» улучшений, доп. фич, рефакторинга
- Запусти тест — должен пройти
- Запусти **все** тесты — регрессий быть не должно

Покажи Дане:
```
GREEN: test_retries_on_timeout ✓
Все тесты: 47 passed, 0 failed ✓
```

### 4. REFACTOR — чисти код
- Убери дублирование, улучши имена, выдели хелперы
- После **каждого** изменения — запусти тесты
- Тесты должны оставаться зелёными на каждом шаге
- Если тест упал — откати последнее изменение

### 5. Следующее поведение
- Новый тест → новый RED → новый GREEN → REFACTOR
- Каждый цикл — один коммит (или предложи коммит)

## Рационализации (НЕ ПОДДАВАЙСЯ)

| Мысль | Почему неправильно |
|-------|-------------------|
| «Это тривиальная функция, тест не нужен» | Тривиальные функции усложняются. Тест — страховка |
| «Я сначала напишу код, потом тесты» | Это не TDD, это "тесты как формальность" |
| «Я уже знаю реализацию, тест будет проходить» | Если да — отлично, ты это докажешь за 10 секунд |
| «Мок сложнее настроить чем реальный код» | Значит интерфейс слишком сложный — упрости |

## Правила
- Код написанный до теста — удалить, начать с теста
- Моки — только для внешних сервисов и I/O. Предпочитай реальный код
- Если тест сложно написать — дизайн неправильный, упрости интерфейс
- Один тест = одно утверждение (assert). Не тестировать 5 вещей в одном тесте
- При работе с `/debug` фаза 4 — всегда начинай с RED теста воспроизводящего баг

## Запрос: $ARGUMENTS
