Changelog / Release Notes
Собирает релиз-ноты из git-истории: парсит Conventional Commits, группирует по типам
в человекочитаемые секции, отбрасывает шум. Умеет печатать текст и допендивать новую
секцию сверху в существующий CHANGELOG.md.
Что на входе ($ARGUMENTS)
- Диапазон
v1.2.0..HEAD— явный git-range. --since <tag>— от тега доHEAD.- Пусто → автоматически последний тег →
HEAD:git describe --tags --abbrev=0 # последний тег; если тегов нет — взять всю историю - Опц.
--write— допендить вCHANGELOG.md(иначе только напечатать).
Шаги
Собрать коммиты по диапазону (subject + body для footer'ов):
git log <range> --no-merges --pretty=format:'%H%x09%s%x09%b%x1e'Распарсить Conventional Commits
type(scope)!: subjectи сгруппировать:feat→ Featuresfix→ Bug Fixesperf→ Performancerefactor→ Refactoringdocs→ Documentation- прочие типы (
build,ci,test,style) → Other (по желанию). - Пропустить шум:
chore, merge-коммиты, бамп версий, мелочь без смысла для читателя. - Breaking changes (
!после типа илиBREAKING CHANGE:в body) → отдельная верхняя секция ⚠ BREAKING CHANGES. - В строке пункта: subject, scope в скобках если есть, короткий хеш. Группировать одинаковые/дублирующиеся.
Сформировать markdown-секцию:
## <version> — YYYY-MM-DD ### ⚠ BREAKING CHANGES - ... ### Features - **scope:** описание (`abc1234`) ### Bug Fixes - ...- version: из аргумента/целевого тега; иначе предложить по semver (feat → minor, fix-only → patch, breaking → major) или взять из
package.json. - дата: сегодняшняя (или дата тега).
- version: из аргумента/целевого тега; иначе предложить по semver (feat → minor, fix-only → patch, breaking → major) или взять из
Вывод/запись.
- Всегда напечатать готовую секцию пользователю.
- При
--write: вставить секцию сверху вCHANGELOG.md(после возможного заголовка# Changelog), не трогая старые записи; создать файл с заголовком, если его нет.
Выход
- Текст релиз-нот (markdown-секция, готовая к вставке).
- При
--write— обновлённыйCHANGELOG.md(новая секция сверху) + путь к файлу. - Короткая сводка: диапазон, сколько коммитов учтено / отброшено как шум.