spectrum-cli 2.1.1 → 3.0.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.
package/CHANGELOG.md CHANGED
@@ -5,39 +5,29 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## 🚀 [3.0.0] - 2026-08-31
9
9
 
10
10
  ### 💥 Breaking change
11
11
 
12
- _Список обратно несовместимых изменений._
12
+ - Команда `spectrum changelog append` создает независимый fragment в `.changelog/` вместо изменения общего `CHANGELOG.md`; для проверки добавлена команда `spectrum changelog check`, а `spectrum release start` собирает и удаляет fragments автоматически.
13
+ - Источник правды о версии — git-теги `vX.Y.Z`: CLI больше не читает и не изменяет `package.json`, lock-файлы, не создает и не проверяет `release/*`-ветки; команда `spectrum version up` удалена.
14
+ - `spectrum release start` вычисляет target от максимального стабильного тега, достижимого из stable-ветки, схлопывает fragments в `CHANGELOG.md` одним коммитом в dev и атомарно пушит release commit напрямую в dev и main/master без MR.
15
+ - `spectrum release start` блокирует новый релиз, пока `CHANGELOG.md` содержит одну или несколько версий новее последнего стабильного тега, не позволяя повторному запуску понизить версию.
16
+ - `spectrum release deploy` и `spectrum release close` читают версию релиза из верхнего заголовка `## 🚀 [X.Y.Z]` файла `CHANGELOG.md`.
17
+ - Changelog task ID принимается только из веток `<type>/<YOUTRACK-ID>` или `<type>/<YOUTRACK-ID>-<slug>`.
13
18
 
14
19
  ### 🆕 Added
15
20
 
16
- _Список новой функциональности._
21
+ - Команда `spectrum chart create` требует запись о версии в `CHANGELOG.md` чарта и запрещает версию не больше последней опубликованной (обход через `--force`).
22
+ - Флаг `--wait` команды `spectrum chart create` дожидается публикации версии чарта в Helm-registry GitLab.
23
+ - Команда `spectrum chart deploy` проверяет наличие версии чарта в Helm-registry перед обновлением helmrelease-файлов (требуется `GITLAB_PRIVATE_TOKEN`).
24
+ - Флаг `--instances` команды `spectrum chart deploy` ограничивает деплой выбранными инстансами; в сообщение коммита добавлены версия чарта и список инстансов.
17
25
 
18
- ### 🛠 Changed
19
-
20
- _Список изменившейся функциональности._
21
-
22
- ### 📜 Deprecated
23
-
24
- _Список устаревшей функциональности._
25
-
26
- ### 🗑 Removed
27
-
28
- _Список удаленной функциональности._
26
+ ## 🚀 [2.1.2] - 2026-08-17
29
27
 
30
- ### 🪲 Fixed
31
-
32
- _Список исправлений багов._
33
-
34
- ### 🔐 Security
35
-
36
- _Список правок для обеспечения безопасности._
37
-
38
- ### 📦 Support
28
+ ### 🛠 Changed
39
29
 
40
- _Список правок для обеспечения технической поддержки._
30
+ - Команда `spectrum token rotate` запрашивает два токена: owner PAT для работы с CI variables и `GITLAB_PRIVATE_TOKEN` для записи в переменные.
41
31
 
42
32
  ## 🚀 [2.1.1] - 2026-08-17
43
33
 
package/README.md CHANGED
@@ -36,23 +36,22 @@ spectrum --help
36
36
  # Показать текущую версию CLI
37
37
  spectrum -v | --version
38
38
 
39
- # 📦 Управление версиями
40
- spectrum version up major # Поднять major версию (1.0.0 → 2.0.0)
41
- spectrum version up minor # Поднять minor версию (1.0.0 → 1.1.0)
42
- spectrum version up patch # Поднять patch версию (1.0.0 → 1.0.1)
43
-
44
39
  # 🚀 Управление релизами
45
- spectrum release start # Полный цикл релиза
46
- spectrum release close # Закрыть релиз и смержить в dev
47
- spectrum release deploy # Деплой релиза (создать тег)
40
+ spectrum release start # Схлопнуть fragments и атомарно отправить release commit в dev и main/master
41
+ spectrum release deploy # Создать стабильный тег vX.Y.Z из заголовка CHANGELOG
42
+ spectrum release close # Свести stable main/master в dev
48
43
 
49
44
  # 📈 Теги chart
50
- spectrum chart create 1.2.3 # Создать и запушить chart-$name-$version
45
+ spectrum chart create 1.2.3 # Создать и запушить chart-$name-$version (требует запись в CHANGELOG.md чарта)
46
+ spectrum chart create 1.2.3 --wait # После пуша тега дождаться публикации версии в Helm-registry
47
+ spectrum chart create 1.2.2 --force # Разрешить версию не больше последней опубликованной
51
48
  spectrum chart deploy # Обновить helmrelease.yaml до последнего chart-тега и запушить
49
+ spectrum chart deploy --instances sd,cbch # Обновить только выбранные инстансы instances/<name>
52
50
  spectrum chart verify ~/repo # Сравнить ingress paths AS IS vs TO BE для Next.js исходников
53
51
 
54
52
  # 📝 Управление changelog
55
- spectrum changelog append "Сообщение" # Добавить запись в CHANGELOG.md
53
+ spectrum changelog append "Сообщение" # Создать fragment в .changelog/
54
+ spectrum changelog check # Проверить CHANGELOG.md и все fragments
56
55
 
57
56
  # 🔑 GitLab токены
58
57
  spectrum token rotate # Пролить GITLAB_PRIVATE_TOKEN в CI variables
@@ -64,9 +63,6 @@ spectrum token rotate # Пролить GITLAB_PRIVATE_TOKEN в CI variables
64
63
  # Справка по релизам
65
64
  spectrum release --help
66
65
 
67
- # Справка по версиям
68
- spectrum version up --help
69
-
70
66
  # Справка по changelog
71
67
  spectrum changelog --help
72
68
 
@@ -96,11 +92,13 @@ spectrum token --help
96
92
  ```
97
93
  spectrum-cli/
98
94
  ├── index.js # 🚀 Главный CLI интерфейс
95
+ ├── .changelog/ # 🧩 Независимые записи для следующего релиза
99
96
  ├── src/ # 📁 Исходный код
100
97
  │ ├── utils.js # 🛠️ Утилиты и логирование
101
98
  │ ├── git.js # 📝 Git операции
102
- │ ├── version.js # 📦 Управление версиями SemVer
103
- │ ├── changelog.js # 📋 Работа с CHANGELOG.md
99
+ │ ├── version.js # 📦 SemVer-хелперы (парсинг, сравнение, бамп)
100
+ │ ├── changelog-config.js # 🧩 Типы и правила changelog fragments
101
+ │ ├── changelog.js # 📋 Создание и сборка changelog fragments
104
102
  │ ├── chart.js # 📈 Создание и push chart тегов
105
103
  │ ├── token.js # 🔑 Ротация GitLab PAT и CI variables
106
104
  │ ├── development.js # ⚡ Dev команды (внутренние)
@@ -115,13 +113,11 @@ spectrum-cli/
115
113
 
116
114
  | Команда | Описание |
117
115
  | --------------------------- | ----------------------------------- |
118
- | `spectrum release start` | Запустить полный цикл релиза |
119
- | `spectrum release deploy` | Деплой релиза |
116
+ | `spectrum release start` | Схлопнуть и опубликовать fragments |
117
+ | `spectrum release deploy` | Создать стабильный тег vX.Y.Z |
120
118
  | `spectrum release close` | Закрыть релиз |
121
- | `spectrum version up major` | Увеличить major версию |
122
- | `spectrum version up minor` | Увеличить minor версию |
123
- | `spectrum version up patch` | Увеличить patch версию |
124
- | `spectrum changelog append` | Добавить запись в changelog |
119
+ | `spectrum changelog append` | Создать changelog fragment |
120
+ | `spectrum changelog check` | Проверить changelog и fragments |
125
121
  | `spectrum chart create` | Создать и запушить chart тег |
126
122
  | `spectrum chart deploy` | Обновить chart версию в helmrelease |
127
123
  | `spectrum chart verify` | Проверить ingress paths chart |
@@ -129,44 +125,61 @@ spectrum-cli/
129
125
 
130
126
  ### 🛡️ Preflight-проверки по командам
131
127
 
132
- - `spectrum release start`: `git-repo` (внутри git-репозитория), `clean-working-tree` (нет незакоммиченных изменений), `main-and-dev-branches` (есть `origin/main` и `origin/develop`), `package-version` (версия в `package.json` существует и валидный semver), `changelog-exists` (есть `CHANGELOG.md`), `changelog-prettier-check` (`prettier --check CHANGELOG.md`).
133
- - `spectrum release close`: `git-repo`, `clean-working-tree`, `main-and-dev-branches`.
134
- - `spectrum release deploy`: `git-repo`, `clean-working-tree`, `on-main-branch` (текущая ветка `main`), `package-version`, `tag-missing` (тега `v<version>` нет локально и на `origin`).
135
- - `spectrum version up major`: `package-json-exists` (есть `package.json`), `package-version`, `clean-working-tree`.
136
- - `spectrum version up minor`: `package-json-exists`, `package-version`, `clean-working-tree`.
137
- - `spectrum version up patch`: `package-json-exists`, `package-version`, `clean-working-tree`.
138
- - `spectrum changelog append <message>`: `changelog-exists`, `prettier-available` (доступен `prettier` или `npx --yes prettier`), `changelog-prettier-check`.
128
+ - `spectrum release start`: чистая и актуальная dev-ветка, стабильный тег, достижимый из `origin/main` или `origin/master`, отсутствие в `CHANGELOG.md` незакрытых версий новее этого тега, валидные fragments и отсутствие целевых hotfix-веток и тега. Версия вычисляется только из тегов и fragments — `package.json` не читается.
129
+ - `spectrum release deploy`: чистая и актуальная main/master, стабильная версия `X.Y.Z` из верхнего заголовка `CHANGELOG.md`, отсутствие локального и remote-тега `vX.Y.Z`. Команда не создает RC-теги.
130
+ - `spectrum release close`: чистая и актуальная main/master, версия из верхнего заголовка `CHANGELOG.md` и remote-тег `vX.Y.Z`, указывающий на текущий commit.
131
+ - `spectrum changelog append <message>`: `git-repo`, `changelog-exists`, валидные ID задачи, git identity и тип fragment. Команда не изменяет общий `CHANGELOG.md`.
132
+ - `spectrum changelog check`: `git-repo`, `changelog-exists`, `changelog-prettier-check`, наличие и формат всех changelog fragments.
139
133
  - `spectrum chart create <version>`: `git-repo`, `clean-working-tree`, `on-main-branch`, `valid-semver` (переданный `<version>` — semver), `single-chart` (ровно один `charts/<chart-name>/Chart.yaml`), `tag-missing` (тега `chart-<name>-<version>` нет локально и на `origin`).
140
134
  - `spectrum chart deploy`: `git-repo`, `clean-working-tree`, `on-main-branch` (текущая ветка `main`), `remote-origin` (настроен `origin`), `remote-reachable` (доступен `origin`), `single-chart`, `helmrelease-files` (найдены `helmrelease.yaml`).
141
135
  - `spectrum chart verify <source_path>`: `git-repo`, `single-values-yaml` (ровно один `charts/**/values.yaml`), `values-ingress-sections` (есть `ingress.paths.api/pages/assets`), `source-path-directory`, `next-project`, `build-command-support`.
142
- - `spectrum token rotate`: `load-config` (есть валидный `~/.config/spectrum-cli/config.yaml`), `ask-private-token` (`GITLAB_PRIVATE_TOKEN` только в памяти), `check-access` (все группы и проекты из конфига доступны).
136
+ - `spectrum token rotate`: `load-config` (есть валидный `~/.config/spectrum-cli/config.yaml`), `ask-tokens` (owner PAT и `GITLAB_PRIVATE_TOKEN` только в памяти), `check-access` (все группы и проекты доступны owner PAT).
143
137
 
144
138
  ## 🔄 Workflow релиза
145
139
 
146
140
  ### `spectrum release start`
147
141
 
148
- 1. Переключается на dev ветку
149
- 2. Создает release/X.Y.Z ветку
150
- 3. Обновляет заголовок в CHANGELOG.md
151
- 4. Удаляет пустые секции из changelog
152
- 5. Добавляет новый блок Unreleased
153
- 6. Коммитит изменения
154
- 7. Пушит release ветку
155
- 8. Выводит прямую ссылку на создание Merge Request
142
+ Выполняется на `dev`:
143
+
144
+ 1. Проверяет `CHANGELOG.md`, отсутствие релизов новее последнего стабильного тега и все файлы `.changelog/<name>.<type>.md`. Новый релиз нельзя начать, пока предыдущий не получил stable-тег.
145
+ 2. После `git fetch origin --prune --tags` находит максимальный стабильный тег `vX.Y.Z`, достижимый из stable-ветки, и применяет к нему максимальное повышение: `breaking` → major, `added` → minor, остальные типы → patch.
146
+ 3. Собирает новый релизный блок `## 🚀 [X.Y.Z]` в `CHANGELOG.md` из fragments в стабильном порядке разделов.
147
+ 4. Удаляет использованные fragments.
148
+ 5. Повторно проверяет формат `CHANGELOG.md`.
149
+ 6. Коммитит схлопнутый changelog одним коммитом в `dev` и атомарно пушит этот commit напрямую в `origin/dev` и `origin/main` или `origin/master`, без Merge Request.
150
+
151
+ Команда не изменяет `package.json`, lock-файлы и не создает `release/*`-веток. Прямой push в stable-ветку должен быть разрешен правилами защиты репозитория; non-fast-forward обновление не выполняется.
156
152
 
157
153
  ### `spectrum release close`
158
154
 
159
- 1. Переключается на main ветку
160
- 2. Обновляет main ветку
161
- 3. Переключается на dev ветку
162
- 4. Мержит main в dev
163
- 5. Пушит dev ветку
155
+ 1. Читает версию из верхнего заголовка `CHANGELOG.md` и проверяет, что стабильный `vX.Y.Z` уже указывает на текущий commit main/master.
156
+ 2. Обновляет main/master и dev.
157
+ 3. Мержит main/master в dev.
158
+ 4. Пушит синхронизированный `dev`.
164
159
 
165
160
  ### `spectrum release deploy`
166
161
 
167
- 1. Переключается на main ветку
168
- 2. Создает тег с текущей версией
169
- 3. Пушит тег в remote
162
+ 1. Проверяет актуальную main/master и читает версию `X.Y.Z` из верхнего заголовка `CHANGELOG.md`.
163
+ 2. Создает единственный release-тег `vX.Y.Z`.
164
+ 3. Пушит тег в `origin`. RC-теги CLI не создает.
165
+
166
+ ### Цикл версий и CI
167
+
168
+ Источник правды о версии — git-тег `vX.Y.Z`. Файлы версий (`package.json`, `Makefile`) не читаются ни CLI, ни CI:
169
+
170
+ | Событие | Источник версии | Артефакт |
171
+ | --- | --- | --- |
172
+ | stable-тег `v1.0.0` | git-тег | `1.0.0` |
173
+ | коммиты в dev | тег `v1.0.0` + бамп из `.changelog/` | `1.1.0-alpha.SHORTSHA` |
174
+ | `release start` на dev | fragments схлопнуты в `## 🚀 [1.1.0]` | release commit в `dev` и `main/master` |
175
+ | merge в main/master | заголовок CHANGELOG `1.1.0` | `1.1.0-rc.1`, затем `rc.2`, ... |
176
+ | stable-тег `v1.1.0` | git-тег | проверенный RC продвигается в `1.1.0` |
177
+ | merge stable в dev (`release close`) | тег `v1.1.0` + бамп fragments | `X.Y.Z-alpha.SHORTSHA` |
178
+
179
+ Номер RC хранится в registry и переиспользуется при retry того же commit SHA.
180
+ Git содержит только стабильные теги `vX.Y.Z`. Stable pipeline проверяет OCI
181
+ revision обязательных образов и копирует точные RC digest без пересборки. Эту
182
+ CI-часть реализует подключенный release component, а не Spectrum CLI.
170
183
 
171
184
  ### `spectrum chart create <version>`
172
185
 
@@ -210,50 +223,74 @@ projects: []
210
223
  ```
211
224
 
212
225
  - `bot` и `token_ttl_months` читаются только из конфига.
213
- - `GITLAB_PRIVATE_TOKEN` запрашивается скрытым вводом и живет только в памяти на время команды. Им же ходим в API.
226
+ - Скрытым вводом запрашиваются два токена. Оба живут только в памяти.
227
+ - Owner PAT: ходит в API, проверяет доступ, читает/удаляет/создает CI variables. Для групп нужен Owner, для проектов — Maintainer+.
228
+ - `GITLAB_PRIVATE_TOKEN`: только значение, которое пишется в CI variable.
214
229
  - Для каждой группы и проекта CI variable `GITLAB_PRIVATE_TOKEN` удаляется (если есть) и создается заново как masked and hidden.
215
230
  - Description переменной: `PAT от бота <bot>, владелец Колосов. Истекает YYYY-MM-DD.` Дата = сегодня + `token_ttl_months`.
216
231
 
217
232
  1. Загружает или создает конфиг
218
- 2. Запрашивает `GITLAB_PRIVATE_TOKEN`
219
- 3. Проверяет доступ ко всем группам и проектам
220
- 4. Обновляет CI variables во всех целях
233
+ 2. Запрашивает owner PAT
234
+ 3. Запрашивает `GITLAB_PRIVATE_TOKEN`
235
+ 4. Проверяет доступ ко всем группам и проектам owner PAT
236
+ 5. Обновляет CI variables во всех целях
221
237
 
222
238
  ## 📝 Работа с Changelog
223
239
 
224
240
  ### `spectrum changelog append "Сообщение"`
225
241
 
226
- Умная команда для добавления записей в CHANGELOG.md с автоматическим определением контекста:
242
+ Команда создает независимый файл `.changelog/<task>-<branch>.<type>.md`. Разработчики больше не редактируют общий блок `Unreleased`, поэтому параллельные ветки не конфликтуют в `CHANGELOG.md`.
243
+
244
+ Рабочая ветка должна полностью соответствовать `<type>/<YOUTRACK-ID>` или
245
+ `<type>/<YOUTRACK-ID>-<slug>`, например `feature/AR-123` или
246
+ `bugfix/ABBVJSOP-1-timeout`. YouTrack ID начинается сразу после первого `/` и
247
+ соответствует `[A-Z]+-[0-9]+`; отсутствующий ID больше не запрашивается
248
+ интерактивно и не придумывается.
227
249
 
228
250
  **✨ Основные возможности:**
229
251
  - 🔍 **Автоматическое извлечение** номера задачи из названия ветки
230
- - 🤔 **Интерактивный запрос** номера задачи если не найден
252
+ - 🧭 **Строгая проверка** GitFlow-префикса и YouTrack ID в имени ветки
231
253
  - 👤 **Проверка Git config** с подсказками по настройке
232
254
  - 🎯 **Умное определение раздела** по типу ветки
233
- - 🎨 **Контекстный вывод** с цветовым выделением
234
- - 🧹 **Автоматическая очистка** дефолтного текста
235
- - ✅ **Проверка Prettier** перед изменениями `CHANGELOG.md` (команда остановится при ошибке)
255
+ - 🧩 **Дополнение существующего fragment** той же задачи без дублирования строк
256
+ - 🔀 **Автоматическая сборка** общего changelog во время `spectrum release start`
236
257
 
237
258
  **📋 Поддерживаемые типы веток:**
238
- - `feature/` → выбор между Added, Changed, Deprecated, Removed
259
+ - `feature/`, `feat/` → выбор между Breaking change, Added, Changed, Deprecated, Removed
239
260
  - `bugfix/`, `fix/` → автоматически Fixed
240
261
  - `support/` → выбор между Support, Security
241
262
  - другие → показ всех разделов
242
263
 
264
+ **📋 Типы fragment и SemVer:**
265
+
266
+ | Суффикс | Раздел | Повышение версии |
267
+ | --- | --- | --- |
268
+ | `breaking` | Breaking change | major |
269
+ | `added` | Added | minor |
270
+ | `changed`, `deprecated`, `removed` | Соответствующий раздел | patch |
271
+ | `fixed`, `security`, `support` | Соответствующий раздел | patch |
272
+
243
273
  **📌 Пример использования:**
274
+
244
275
  ```bash
245
276
  # На ветке feature/ABC-123-new-component
246
277
  spectrum changelog append "Добавлен новый компонент кнопки"
247
278
 
248
- # Результат в CHANGELOG.md:
279
+ # Результат:
280
+ # .changelog/ABC-123-feature-new-component.added.md
249
281
  # - ABC-123 Добавлен новый компонент кнопки. [Ваше Имя](ваш@email.com)
250
282
  ```
251
283
 
252
- ### 🔍 Линтинг CHANGELOG с Prettier
284
+ Fragment должен содержать только непустые Markdown-строки, начинающиеся с `- `. Один fragment может содержать несколько записей одного типа. Fragment коммитится вместе с изменением и удаляется только автоматикой релиза.
285
+
286
+ ### `spectrum changelog check`
287
+
288
+ Команда предназначена для локальной и CI-проверки перед merge:
253
289
 
254
- - Перед любыми изменениями changelog выполняется проверка наличия `prettier` и команда `prettier --check CHANGELOG.md`.
255
- - Если `prettier` недоступен или проверка не пройдена, выполнение прекращается с ошибкой.
256
- - Запуск через `npx` поддерживается автоматически: используется `npx --yes prettier` при наличии.
290
+ - проверяет формат `CHANGELOG.md` через Prettier;
291
+ - требует хотя бы один fragment в `.changelog/`;
292
+ - проверяет имя `<name>.<type>.md`, поддерживаемый тип и формат каждой строки;
293
+ - не изменяет файлы.
257
294
 
258
295
  > Совет: Приведите файл к нужному формату командой:
259
296
  >
package/index.js CHANGED
@@ -3,7 +3,6 @@ const { Command } = require("commander");
3
3
  const program = new Command();
4
4
 
5
5
  const git = require("./src/git");
6
- const version = require("./src/version");
7
6
  const release = require("./src/release");
8
7
  const changelog = require("./src/changelog");
9
8
  const chart = require("./src/chart");
@@ -34,53 +33,34 @@ const releaseCmd = program
34
33
 
35
34
  releaseCmd
36
35
  .command("start")
37
- .description("Запустить полный процесс релиза")
36
+ .description("Схлопнуть changelog fragments в dev и создать MR в main/master")
38
37
  .action(() => runAction(release.releaseStart));
39
38
 
40
39
  releaseCmd
41
40
  .command("close")
42
- .description("Закрыть релиз и влить в dev")
41
+ .description("Свести стабильный релиз из main/master в dev")
43
42
  .action(() => runAction(release.releaseClose));
44
43
 
45
44
  releaseCmd
46
45
  .command("deploy")
47
- .description("Деплой релиза (создать и отправить тег)")
46
+ .description("Создать и отправить только стабильный тег vX.Y.Z")
48
47
  .action(() => runAction(git.gitCreateTagAndPush));
49
48
 
50
- // Команды обновления версии
51
- const versionCmd = program
52
- .command("version")
53
- .description("Обновить версию по semantic versioning");
54
-
55
- const upCmd = versionCmd
56
- .command("up")
57
- .description("Обновить версию по semantic versioning");
58
-
59
- upCmd
60
- .command("major")
61
- .description("Повысить major версию (x.0.0)")
62
- .action(() => runAction(() => version.setVersion("major")));
63
-
64
- upCmd
65
- .command("minor")
66
- .description("Повысить minor версию (x.y.0)")
67
- .action(() => runAction(() => version.setVersion("minor")));
68
-
69
- upCmd
70
- .command("patch")
71
- .description("Повысить patch версию (x.y.z)")
72
- .action(() => runAction(() => version.setVersion("patch")));
73
-
74
49
  // Команды changelog
75
50
  const changelogCmd = program
76
51
  .command("changelog")
77
- .description("Команды управления changelog");
52
+ .description("Команды управления changelog fragments");
78
53
 
79
54
  changelogCmd
80
55
  .command("append <message>")
81
- .description("Добавить запись в changelog с номером задачи из ветки")
56
+ .description("Создать changelog fragment с номером задачи из ветки")
82
57
  .action((message) => runAction(() => changelog.changelogAppend(message)));
83
58
 
59
+ changelogCmd
60
+ .command("check")
61
+ .description("Проверить CHANGELOG.md и changelog fragments")
62
+ .action(() => runAction(changelog.changelogCheck));
63
+
84
64
  // Команды chart
85
65
  const chartCmd = program
86
66
  .command("chart")
@@ -89,7 +69,9 @@ const chartCmd = program
89
69
  chartCmd
90
70
  .command("create <version>")
91
71
  .description("Создать и отправить chart-тег (chart-<name>-<version>)")
92
- .action((version) => runAction(() => chart.chartCreateTag(version)));
72
+ .option("--force", "Разрешить версию не больше последней опубликованной")
73
+ .option("--wait", "Дождаться публикации версии чарта в Helm-registry")
74
+ .action((version, options) => runAction(() => chart.chartCreateTag(version, options)));
93
75
 
94
76
  chartCmd
95
77
  .command("verify <source_path>")
@@ -99,7 +81,8 @@ chartCmd
99
81
  chartCmd
100
82
  .command("deploy")
101
83
  .description("Задеплоить последнюю версию chart в файлы helmrelease")
102
- .action(() => runAction(chart.chartDeploy));
84
+ .option("--instances <names>", "Список инстансов через запятую (по умолчанию все)")
85
+ .action((options) => runAction(() => chart.chartDeploy(options)));
103
86
 
104
87
  const tokenCmd = program
105
88
  .command("token")
@@ -107,7 +90,7 @@ const tokenCmd = program
107
90
 
108
91
  tokenCmd
109
92
  .command("rotate")
110
- .description("Пролить GITLAB_PRIVATE_TOKEN в CI variables групп и проектов")
93
+ .description("Пролить GITLAB_PRIVATE_TOKEN в CI variables через owner PAT")
111
94
  .action(() => runAction(token.tokenRotate));
112
95
 
113
96
  // Переопределяем help, чтобы показать кастомный формат с алиасами
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spectrum-cli",
3
- "version": "2.1.1",
3
+ "version": "3.0.0",
4
4
  "description": "🚀 Modern CLI for development workflow automation - release management, versioning, and changelog generation",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+
3
+ const CHANGELOG_FILE = 'CHANGELOG.md';
4
+ const CHANGELOG_DIR = '.changelog';
5
+
6
+ const FRAGMENT_TYPES = Object.freeze({
7
+ breaking: Object.freeze({ section: '### 💥 Breaking change', bump: 'major' }),
8
+ added: Object.freeze({ section: '### 🆕 Added', bump: 'minor' }),
9
+ changed: Object.freeze({ section: '### 🛠 Changed', bump: 'patch' }),
10
+ deprecated: Object.freeze({ section: '### 📜 Deprecated', bump: 'patch' }),
11
+ removed: Object.freeze({ section: '### 🗑 Removed', bump: 'patch' }),
12
+ fixed: Object.freeze({ section: '### 🪲 Fixed', bump: 'patch' }),
13
+ security: Object.freeze({ section: '### 🔐 Security', bump: 'patch' }),
14
+ support: Object.freeze({ section: '### 📦 Support', bump: 'patch' })
15
+ });
16
+
17
+ const SECTION_TO_TYPE = Object.freeze(
18
+ Object.fromEntries(Object.entries(FRAGMENT_TYPES).map(([type, config]) => [config.section, type]))
19
+ );
20
+
21
+ const FRAGMENT_TYPE_PATTERN = Object.keys(FRAGMENT_TYPES).join('|');
22
+ const FRAGMENT_FILE_PATTERN = new RegExp(`^(.+)\\.(${FRAGMENT_TYPE_PATTERN})\\.md$`);
23
+
24
+ function getFragmentType(filePath) {
25
+ const normalizedPath = String(filePath || '').replace(/\\/g, '/');
26
+ const fileName = normalizedPath.split('/').pop();
27
+ const match = fileName.match(FRAGMENT_FILE_PATTERN);
28
+ return match ? match[2] : null;
29
+ }
30
+
31
+ module.exports = {
32
+ CHANGELOG_FILE,
33
+ CHANGELOG_DIR,
34
+ FRAGMENT_TYPES,
35
+ SECTION_TO_TYPE,
36
+ FRAGMENT_FILE_PATTERN,
37
+ getFragmentType
38
+ };