Release Manager
Превращает «накопились коммиты» в оформленный релиз: версия по semver,
CHANGELOG, аннотированный тег, GitHub Release, чеклист перед выкаткой.
Деплой-модель владельца: git pull на VPS + рестарт systemd-сервиса.
Когда применять
- Накопились изменения, пора выпускать: нужна версия, changelog, тег.
- Спор с самим собой «это minor или patch».
- Настроить релизный процесс в проекте с нуля (первый тег, CHANGELOG.md).
Контекст — установить ПЕРВЫМ делом
- Источник версии — где она живёт:
pyproject.toml (project.version),
__version__, plugin.json, нигде (тогда только теги). Если версия
продублирована в нескольких файлах — все места обновляются одним коммитом;
предложи единый источник.
- История —
git describe --tags --abbrev=0 (последний тег);
его нет → это первый релиз (см. «Первый релиз»).
- Конвенция коммитов — Conventional Commits или вольная. Вольная →
классифицируй изменения по диффу и смыслу, не по префиксам.
- Remote — GitHub есть?
gh доступен? Иначе — только локальный тег.
Процесс
1. Собрать изменения с последнего релиза
git log <last-tag>..HEAD --oneline
git diff <last-tag>..HEAD --stat
2. Решить версию (semver)
| В диффе есть… |
Бамп |
Ломающее изменение: API/CLI/формат данных/схема БД несовместимы, BREAKING CHANGE: в коммитах |
major |
Новая функциональность (feat:), новые эндпоинты/команды/навыки |
minor |
Только фиксы, доки, рефакторинг без смены поведения (fix:, docs:, chore:) |
patch |
- Версия
0.x.y: ломающие изменения допустимы в minor (0.x → 0.(x+1)) —
но скажи пользователю, если проект «дорос» до 1.0.0.
- Сомнение major/minor → покажи конкретные ломающие места и спроси: решение
о breaking change принимает владелец.
3. CHANGELOG.md (формат Keep a Changelog)
- Секция
## [X.Y.Z] — YYYY-MM-DD со списками Added / Changed / Fixed / Removed / Security (только непустые).
- Пиши для пользователя проекта, не пересказ коммитов: «Добавлен экспорт в
CSV», а не «feat(export): add csv writer».
- Мелкие внутренние правки агрегируй одной строкой; ломающие изменения — с
инструкцией миграции.
- Файла нет → создай с текущим релизом (историю задним числом не выдумывай).
4. Пре-релизный чеклист (гейт — не пожелание)
5. Коммит, тег, публикация
git commit -m "chore(release): v1.4.0"
git tag -a v1.4.0 -m "v1.4.0 — краткая суть релиза"
git push && git push origin v1.4.0
gh release create v1.4.0 --title "v1.4.0" --notes-file <(секция из CHANGELOG)
Тег — всегда аннотированный (-a); префикс v — по существующей конвенции
проекта (посмотри прошлые теги, не меняй стиль).
6. После деплоя — smoke
На сервере после git pull + рестарта: сервис active (systemctl status),
/healthz отвечает 200 (или бот отвечает на команду), в journalctl -u app -n 50 нет трейсбеков, версия в приложении = тегу (если экспонируется).
Полный runbook живого деплоя — vps-ops.
Первый релиз
Нет тегов → предложи 0.1.0 (или 1.0.0, если API стабилен и им пользуются),
создай CHANGELOG.md с одной секцией, теги начинай сразу аннотированные.
Быстрый чеклист
Связь с библиотекой навыков
git-commit-planner — навести порядок в коммитах ДО релиза (атомарность
упрощает и semver-решение, и changelog).
migration-safety-auditor — гейт на миграции, уходящие в релиз.
vps-ops — выкатка релиза на сервер.
dependency-auditor — обновление зависимостей отдельным релизом/коммитом,
не вперемешку с фичами.
1---2name: release-manager3description: Выпуск версии проекта: определить semver из диффа, собрать CHANGELOG из Conventional Commits, проставить git-тег и GitHub Release, пройти пре-релизный чеклист (миграции, зависимости, конфиги) и smoke-проверку после `git pull` на сервере. Используй когда пользователь говорит «сделай релиз», «подними версию», «обнови changelog», «затегируй», «проверь мои коммиты за неделю и поправь деплой гайд», спрашивает «какая версия должна быть». Разложить изменения на коммиты — git-commit-planner; сама выкатка и конфиги сервера — vps-ops.4---56# Release Manager78Превращает «накопились коммиты» в оформленный релиз: версия по semver,9CHANGELOG, аннотированный тег, GitHub Release, чеклист перед выкаткой.10Деплой-модель владельца: git pull на VPS + рестарт systemd-сервиса.1112## Когда применять1314- Накопились изменения, пора выпускать: нужна версия, changelog, тег.15- Спор с самим собой «это minor или patch».16- Настроить релизный процесс в проекте с нуля (первый тег, CHANGELOG.md).1718## Контекст — установить ПЕРВЫМ делом19201. **Источник версии** — где она живёт: `pyproject.toml` (`project.version`),21 `__version__`, `plugin.json`, нигде (тогда только теги). Если версия22 продублирована в нескольких файлах — все места обновляются одним коммитом;23 предложи единый источник.242. **История** — `git describe --tags --abbrev=0` (последний тег);25 его нет → это первый релиз (см. «Первый релиз»).263. **Конвенция коммитов** — Conventional Commits или вольная. Вольная →27 классифицируй изменения по диффу и смыслу, не по префиксам.284. **Remote** — GitHub есть? `gh` доступен? Иначе — только локальный тег.2930## Процесс3132### 1. Собрать изменения с последнего релиза3334```bash35git log <last-tag>..HEAD --oneline36git diff <last-tag>..HEAD --stat37```3839### 2. Решить версию (semver)4041| В диффе есть… | Бамп |42|---|---|43| Ломающее изменение: API/CLI/формат данных/схема БД несовместимы, `BREAKING CHANGE:` в коммитах | **major** |44| Новая функциональность (`feat:`), новые эндпоинты/команды/навыки | **minor** |45| Только фиксы, доки, рефакторинг без смены поведения (`fix:`, `docs:`, `chore:`) | **patch** |4647- Версия `0.x.y`: ломающие изменения допустимы в minor (`0.x` → `0.(x+1)`) —48 но скажи пользователю, если проект «дорос» до 1.0.0.49- Сомнение major/minor → покажи конкретные ломающие места и спроси: решение50 о breaking change принимает владелец.5152### 3. CHANGELOG.md (формат Keep a Changelog)5354- Секция `## [X.Y.Z] — YYYY-MM-DD` со списками `Added / Changed / Fixed /55 Removed / Security` (только непустые).56- Пиши **для пользователя проекта, не пересказ коммитов**: «Добавлен экспорт в57 CSV», а не «feat(export): add csv writer».58- Мелкие внутренние правки агрегируй одной строкой; ломающие изменения — с59 инструкцией миграции.60- Файла нет → создай с текущим релизом (историю задним числом не выдумывай).6162### 4. Пре-релизный чеклист (гейт — не пожелание)6364- [ ] CI зелёный на релизном коммите (тесты/линт/типы).65- [ ] Непримененных миграций нет или они идут в этот релиз — прогнаны через66 `migration-safety-auditor`, порядок «код совместим со старой схемой» соблюдён.67- [ ] Зависимости запинены (lockfile обновлён и закоммичен).68- [ ] Новые переменные окружения отражены в `.env.example` и заметках релиза.69- [ ] Версия обновлена во всех местах-источниках.7071### 5. Коммит, тег, публикация7273```bash74git commit -m "chore(release): v1.4.0"75git tag -a v1.4.0 -m "v1.4.0 — краткая суть релиза"76git push && git push origin v1.4.077gh release create v1.4.0 --title "v1.4.0" --notes-file <(секция из CHANGELOG)78```7980Тег — всегда аннотированный (`-a`); префикс `v` — по существующей конвенции81проекта (посмотри прошлые теги, не меняй стиль).8283### 6. После деплоя — smoke8485На сервере после `git pull` + рестарта: сервис active (`systemctl status`),86`/healthz` отвечает 200 (или бот отвечает на команду), в `journalctl -u app87-n 50` нет трейсбеков, версия в приложении = тегу (если экспонируется).88Полный runbook живого деплоя — `vps-ops`.8990## Первый релиз9192Нет тегов → предложи `0.1.0` (или `1.0.0`, если API стабилен и им пользуются),93создай CHANGELOG.md с одной секцией, теги начинай сразу аннотированные.9495## Быстрый чеклист9697- [ ] Версия обоснована содержимым диффа (могу назвать, что дало bump).98- [ ] CHANGELOG написан для читателя, ломающие изменения — с миграцией.99- [ ] Пре-релизный гейт пройден (CI, миграции, lockfile, env).100- [ ] Аннотированный тег запушен, GitHub Release создан.101- [ ] Smoke после деплоя зафиксирован.102103## Связь с библиотекой навыков104105- `git-commit-planner` — навести порядок в коммитах ДО релиза (атомарность106 упрощает и semver-решение, и changelog).107- `migration-safety-auditor` — гейт на миграции, уходящие в релиз.108- `vps-ops` — выкатка релиза на сервер.109- `dependency-auditor` — обновление зависимостей отдельным релизом/коммитом,110 не вперемешку с фичами.