spectrum-cli 1.1.0 → 1.2.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 +29 -0
- package/README.md +78 -11
- package/index.js +65 -38
- package/package.json +5 -3
- package/src/changelog.js +130 -51
- package/src/chart.js +821 -0
- package/src/command-executor.js +70 -0
- package/src/development.js +11 -11
- package/src/git.js +59 -40
- package/src/preflight.js +556 -0
- package/src/release.js +102 -55
- package/src/utils.js +47 -9
- package/src/version.js +23 -17
package/CHANGELOG.md
CHANGED
|
@@ -35,6 +35,35 @@ _Список правок для обеспечения безопасност
|
|
|
35
35
|
|
|
36
36
|
_Список правок для обеспечения технической поддержки._
|
|
37
37
|
|
|
38
|
+
## 🚀 [1.2.0] - 2026-03-03
|
|
39
|
+
|
|
40
|
+
### 🆕 Added
|
|
41
|
+
|
|
42
|
+
- Добавлена команда `spectrum chart create <version>` для создания `helm chart`
|
|
43
|
+
- Изменен формат вывода сообщений в консоли
|
|
44
|
+
- Добавлен вывод прямой ссылки на создание Merge Request при `spectrum release start`
|
|
45
|
+
- Добавлена команда `spectrum chart deploy` для обновления `spec.chart.spec.version` в `helmrelease.yaml` до последнего remote chart-тега с интерактивным подтверждением, автокоммитом и пушем
|
|
46
|
+
|
|
47
|
+
### 🛠 Changed
|
|
48
|
+
|
|
49
|
+
- Добавлены новые preflight-проверки для chart deploy: проверка `origin`, доступности remote и наличия `helmrelease.yaml`
|
|
50
|
+
|
|
51
|
+
### 🔐 Security
|
|
52
|
+
|
|
53
|
+
- Обновлены зависимости для устранения CVE в `minmatch`
|
|
54
|
+
|
|
55
|
+
### 📦 Support
|
|
56
|
+
|
|
57
|
+
- Покрытие тестами 100%
|
|
58
|
+
|
|
59
|
+
## 🚀 [1.1.1] - 2025-10-03
|
|
60
|
+
|
|
61
|
+
### 🛠 Changed
|
|
62
|
+
|
|
63
|
+
- Исправлено поведения команды `version`, добавлены флаги `-v`/`--version`
|
|
64
|
+
- Добавлен этап проверки `CHANGELOG.md` через Prettier перед любыми изменениями
|
|
65
|
+
- Команды, изменяющие changelog, останавливаются при отсутствии `prettier` или ошибке `--check`
|
|
66
|
+
|
|
38
67
|
## 🚀 [1.1.0] - 2025-09-30
|
|
39
68
|
|
|
40
69
|
### 🆕 Added
|
package/README.md
CHANGED
|
@@ -33,6 +33,8 @@ npm install
|
|
|
33
33
|
```bash
|
|
34
34
|
# Показать справку
|
|
35
35
|
spectrum --help
|
|
36
|
+
# Показать текущую версию CLI
|
|
37
|
+
spectrum -v | --version
|
|
36
38
|
|
|
37
39
|
# 📦 Управление версиями
|
|
38
40
|
spectrum version up major # Поднять major версию (1.0.0 → 2.0.0)
|
|
@@ -44,6 +46,11 @@ spectrum release start # Полный цикл релиза
|
|
|
44
46
|
spectrum release close # Закрыть релиз и смержить в dev
|
|
45
47
|
spectrum release deploy # Деплой релиза (создать тег)
|
|
46
48
|
|
|
49
|
+
# 📈 Теги chart
|
|
50
|
+
spectrum chart create 1.2.3 # Создать и запушить chart-$name-$version
|
|
51
|
+
spectrum chart deploy # Обновить helmrelease.yaml до последнего chart-тега и запушить
|
|
52
|
+
spectrum chart verify ~/repo # Сравнить ingress paths AS IS vs TO BE для Next.js исходников
|
|
53
|
+
|
|
47
54
|
# 📝 Управление changelog
|
|
48
55
|
spectrum changelog append "Сообщение" # Добавить запись в CHANGELOG.md
|
|
49
56
|
```
|
|
@@ -59,6 +66,9 @@ spectrum version up --help
|
|
|
59
66
|
|
|
60
67
|
# Справка по changelog
|
|
61
68
|
spectrum changelog --help
|
|
69
|
+
|
|
70
|
+
# Справка по chart
|
|
71
|
+
spectrum chart --help
|
|
62
72
|
```
|
|
63
73
|
|
|
64
74
|
## ✨ Особенности
|
|
@@ -85,6 +95,7 @@ spectrum-cli/
|
|
|
85
95
|
│ ├── git.js # 📝 Git операции
|
|
86
96
|
│ ├── version.js # 📦 Управление версиями SemVer
|
|
87
97
|
│ ├── changelog.js # 📋 Работа с CHANGELOG.md
|
|
98
|
+
│ ├── chart.js # 📈 Создание и push chart тегов
|
|
88
99
|
│ ├── development.js # ⚡ Dev команды (внутренние)
|
|
89
100
|
│ └── release.js # 🚀 Release процесс
|
|
90
101
|
├── package.json # 📦 Конфигурация проекта
|
|
@@ -93,17 +104,33 @@ spectrum-cli/
|
|
|
93
104
|
└── README.md # 📖 Документация
|
|
94
105
|
```
|
|
95
106
|
|
|
96
|
-
###
|
|
97
|
-
|
|
98
|
-
| Команда
|
|
99
|
-
|
|
|
100
|
-
| `spectrum release start`
|
|
101
|
-
| `spectrum release deploy`
|
|
102
|
-
| `spectrum release close`
|
|
103
|
-
| `spectrum version up major`
|
|
104
|
-
| `spectrum version up minor`
|
|
105
|
-
| `spectrum version up patch`
|
|
106
|
-
| `spectrum changelog append`
|
|
107
|
+
### Команды
|
|
108
|
+
|
|
109
|
+
| Команда | Описание |
|
|
110
|
+
| --------------------------- | ----------------------------------- |
|
|
111
|
+
| `spectrum release start` | Запустить полный цикл релиза |
|
|
112
|
+
| `spectrum release deploy` | Деплой релиза |
|
|
113
|
+
| `spectrum release close` | Закрыть релиз |
|
|
114
|
+
| `spectrum version up major` | Увеличить major версию |
|
|
115
|
+
| `spectrum version up minor` | Увеличить minor версию |
|
|
116
|
+
| `spectrum version up patch` | Увеличить patch версию |
|
|
117
|
+
| `spectrum changelog append` | Добавить запись в changelog |
|
|
118
|
+
| `spectrum chart create` | Создать и запушить chart тег |
|
|
119
|
+
| `spectrum chart deploy` | Обновить chart версию в helmrelease |
|
|
120
|
+
| `spectrum chart verify` | Проверить ingress paths chart |
|
|
121
|
+
|
|
122
|
+
### 🛡️ Preflight-проверки по командам
|
|
123
|
+
|
|
124
|
+
- `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`).
|
|
125
|
+
- `spectrum release close`: `git-repo`, `clean-working-tree`, `main-and-dev-branches`.
|
|
126
|
+
- `spectrum release deploy`: `git-repo`, `clean-working-tree`, `on-main-branch` (текущая ветка `main`), `package-version`, `tag-missing` (тега `v<version>` нет локально и на `origin`).
|
|
127
|
+
- `spectrum version up major`: `package-json-exists` (есть `package.json`), `package-version`, `clean-working-tree`.
|
|
128
|
+
- `spectrum version up minor`: `package-json-exists`, `package-version`, `clean-working-tree`.
|
|
129
|
+
- `spectrum version up patch`: `package-json-exists`, `package-version`, `clean-working-tree`.
|
|
130
|
+
- `spectrum changelog append <message>`: `changelog-exists`, `prettier-available` (доступен `prettier` или `npx --yes prettier`), `changelog-prettier-check`.
|
|
131
|
+
- `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`).
|
|
132
|
+
- `spectrum chart deploy`: `git-repo`, `clean-working-tree`, `on-main-branch` (текущая ветка `main`), `remote-origin` (настроен `origin`), `remote-reachable` (доступен `origin`), `single-chart`, `helmrelease-files` (найдены `helmrelease.yaml`).
|
|
133
|
+
- `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`.
|
|
107
134
|
|
|
108
135
|
## 🔄 Workflow релиза
|
|
109
136
|
|
|
@@ -116,6 +143,7 @@ spectrum-cli/
|
|
|
116
143
|
5. Добавляет новый блок Unreleased
|
|
117
144
|
6. Коммитит изменения
|
|
118
145
|
7. Пушит release ветку
|
|
146
|
+
8. Выводит прямую ссылку на создание Merge Request
|
|
119
147
|
|
|
120
148
|
### `spectrum release close`
|
|
121
149
|
|
|
@@ -131,6 +159,32 @@ spectrum-cli/
|
|
|
131
159
|
2. Создает тег с текущей версией
|
|
132
160
|
3. Пушит тег в remote
|
|
133
161
|
|
|
162
|
+
### `spectrum chart create <version>`
|
|
163
|
+
|
|
164
|
+
1. Ищет `Chart.yaml` в `charts/<chart-name>/Chart.yaml` и читает поле `name`
|
|
165
|
+
2. Проверяет, что текущая ветка — `main`
|
|
166
|
+
3. Проверяет semver для переданной версии
|
|
167
|
+
4. Собирает тег `chart-<name>-<version>`
|
|
168
|
+
5. Проверяет, что такого тега еще нет
|
|
169
|
+
6. Создает тег и пушит его в `origin`
|
|
170
|
+
|
|
171
|
+
### `spectrum chart deploy`
|
|
172
|
+
|
|
173
|
+
1. Находит последний тег чарта на remote `origin` в формате `chart-<app>-<version>`
|
|
174
|
+
2. Ищет все `helmrelease.yaml` в репозитории
|
|
175
|
+
3. Обновляет `spec.chart.spec.version` до найденной версии и печатает список файлов (`зеленым` обновленные, `серым` без изменений)
|
|
176
|
+
4. Если обновлений нет, завершает выполнение сообщением, что все уже на последней версии
|
|
177
|
+
5. Запрашивает подтверждение публикации через Enter
|
|
178
|
+
6. Делает `git add` обновленных файлов, создает коммит `🚀 Deploy service.` и пушит изменения
|
|
179
|
+
|
|
180
|
+
### `spectrum chart verify <source_path>`
|
|
181
|
+
|
|
182
|
+
1. Находит `charts/**/values.yaml` и читает `ingress.paths.api/pages/assets` как AS IS
|
|
183
|
+
2. Собирает TO BE для Next.js из `.next` артефактов, при необходимости запускает build, затем делает fallback на файловую структуру роутов
|
|
184
|
+
3. Для `assets` использует фиксированный набор regex-путей
|
|
185
|
+
4. Печатает diff только по изменениям: лишние пути (`-`) и недостающие (`+`) с цветовой подсветкой
|
|
186
|
+
5. Завершает команду с ошибкой, если есть расхождения
|
|
187
|
+
|
|
134
188
|
## 📝 Работа с Changelog
|
|
135
189
|
|
|
136
190
|
### `spectrum changelog append "Сообщение"`
|
|
@@ -144,6 +198,7 @@ spectrum-cli/
|
|
|
144
198
|
- 🎯 **Умное определение раздела** по типу ветки
|
|
145
199
|
- 🎨 **Контекстный вывод** с цветовым выделением
|
|
146
200
|
- 🧹 **Автоматическая очистка** дефолтного текста
|
|
201
|
+
- ✅ **Проверка Prettier** перед изменениями `CHANGELOG.md` (команда остановится при ошибке)
|
|
147
202
|
|
|
148
203
|
**📋 Поддерживаемые типы веток:**
|
|
149
204
|
- `feature/` → выбор между Added, Changed, Deprecated, Removed
|
|
@@ -160,6 +215,18 @@ spectrum changelog append "Добавлен новый компонент кно
|
|
|
160
215
|
# - ABC-123 Добавлен новый компонент кнопки. [Ваше Имя](ваш@email.com)
|
|
161
216
|
```
|
|
162
217
|
|
|
218
|
+
### 🔍 Линтинг CHANGELOG с Prettier
|
|
219
|
+
|
|
220
|
+
- Перед любыми изменениями changelog выполняется проверка наличия `prettier` и команда `prettier --check CHANGELOG.md`.
|
|
221
|
+
- Если `prettier` недоступен или проверка не пройдена, выполнение прекращается с ошибкой.
|
|
222
|
+
- Запуск через `npx` поддерживается автоматически: используется `npx --yes prettier` при наличии.
|
|
223
|
+
|
|
224
|
+
> Совет: Приведите файл к нужному формату командой:
|
|
225
|
+
>
|
|
226
|
+
> ```bash
|
|
227
|
+
> npx --yes prettier --write CHANGELOG.md
|
|
228
|
+
> ```
|
|
229
|
+
|
|
163
230
|
## 🎯 Философия
|
|
164
231
|
|
|
165
232
|
- **Простота** - минимум команд, максимум функциональности
|
package/index.js
CHANGED
|
@@ -6,74 +6,101 @@ const git = require("./src/git");
|
|
|
6
6
|
const version = require("./src/version");
|
|
7
7
|
const release = require("./src/release");
|
|
8
8
|
const changelog = require("./src/changelog");
|
|
9
|
+
const chart = require("./src/chart");
|
|
10
|
+
const { version: pkgVersion } = require("./package.json");
|
|
11
|
+
|
|
12
|
+
async function runAction(action, ...args) {
|
|
13
|
+
try {
|
|
14
|
+
const result = await action(...args);
|
|
15
|
+
if (!result) {
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error(`❌ Ошибка: ${error.message}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
9
23
|
|
|
10
24
|
program
|
|
11
25
|
.name("spectrum")
|
|
12
|
-
.description("🚀 Spectrum CLI
|
|
13
|
-
.version("
|
|
26
|
+
.description("🚀 Spectrum CLI для процесса разработки")
|
|
27
|
+
.version(pkgVersion, "-v, --version");
|
|
14
28
|
|
|
15
|
-
//
|
|
29
|
+
// Команды релиза
|
|
16
30
|
const releaseCmd = program
|
|
17
31
|
.command("release")
|
|
18
|
-
.description("
|
|
32
|
+
.description("Команды управления релизом");
|
|
19
33
|
|
|
20
34
|
releaseCmd
|
|
21
35
|
.command("start")
|
|
22
|
-
.description("
|
|
23
|
-
.action(() => release.releaseStart
|
|
36
|
+
.description("Запустить полный процесс релиза")
|
|
37
|
+
.action(() => runAction(release.releaseStart));
|
|
24
38
|
|
|
25
39
|
releaseCmd
|
|
26
40
|
.command("close")
|
|
27
|
-
.description("
|
|
28
|
-
.action(() => release.releaseClose
|
|
41
|
+
.description("Закрыть релиз и влить в dev")
|
|
42
|
+
.action(() => runAction(release.releaseClose));
|
|
29
43
|
|
|
30
44
|
releaseCmd
|
|
31
45
|
.command("deploy")
|
|
32
|
-
.description("
|
|
33
|
-
.action(() => git.gitCreateTagAndPush
|
|
46
|
+
.description("Деплой релиза (создать и отправить тег)")
|
|
47
|
+
.action(() => runAction(git.gitCreateTagAndPush));
|
|
34
48
|
|
|
35
|
-
//
|
|
49
|
+
// Команды обновления версии
|
|
36
50
|
const versionCmd = program
|
|
37
51
|
.command("version")
|
|
38
|
-
.description("
|
|
52
|
+
.description("Обновить версию по semantic versioning");
|
|
39
53
|
|
|
40
54
|
const upCmd = versionCmd
|
|
41
55
|
.command("up")
|
|
42
|
-
.description("
|
|
56
|
+
.description("Обновить версию по semantic versioning");
|
|
43
57
|
|
|
44
58
|
upCmd
|
|
45
59
|
.command("major")
|
|
46
|
-
.description("
|
|
47
|
-
.action(() => version.
|
|
60
|
+
.description("Повысить major версию (x.0.0)")
|
|
61
|
+
.action(() => runAction(() => version.setVersion("major")));
|
|
48
62
|
|
|
49
63
|
upCmd
|
|
50
64
|
.command("minor")
|
|
51
|
-
.description("
|
|
52
|
-
.action(() => version.
|
|
65
|
+
.description("Повысить minor версию (x.y.0)")
|
|
66
|
+
.action(() => runAction(() => version.setVersion("minor")));
|
|
53
67
|
|
|
54
68
|
upCmd
|
|
55
69
|
.command("patch")
|
|
56
|
-
.description("
|
|
57
|
-
.action(() => version.
|
|
70
|
+
.description("Повысить patch версию (x.y.z)")
|
|
71
|
+
.action(() => runAction(() => version.setVersion("patch")));
|
|
58
72
|
|
|
59
|
-
//
|
|
73
|
+
// Команды changelog
|
|
60
74
|
const changelogCmd = program
|
|
61
75
|
.command("changelog")
|
|
62
|
-
.description("
|
|
76
|
+
.description("Команды управления changelog");
|
|
63
77
|
|
|
64
78
|
changelogCmd
|
|
65
79
|
.command("append <message>")
|
|
66
|
-
.description("
|
|
67
|
-
.action(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
.description("Добавить запись в changelog с номером задачи из ветки")
|
|
81
|
+
.action((message) => runAction(() => changelog.changelogAppend(message)));
|
|
82
|
+
|
|
83
|
+
// Команды chart
|
|
84
|
+
const chartCmd = program
|
|
85
|
+
.command("chart")
|
|
86
|
+
.description("Команды управления тегами chart");
|
|
87
|
+
|
|
88
|
+
chartCmd
|
|
89
|
+
.command("create <version>")
|
|
90
|
+
.description("Создать и отправить chart-тег (chart-<name>-<version>)")
|
|
91
|
+
.action((version) => runAction(() => chart.chartCreateTag(version)));
|
|
92
|
+
|
|
93
|
+
chartCmd
|
|
94
|
+
.command("verify <source_path>")
|
|
95
|
+
.description("Проверить пути ingress chart относительно исходников Next.js")
|
|
96
|
+
.action((sourcePath) => runAction(() => chart.chartVerify(sourcePath)));
|
|
97
|
+
|
|
98
|
+
chartCmd
|
|
99
|
+
.command("deploy")
|
|
100
|
+
.description("Задеплоить последнюю версию chart в файлы helmrelease")
|
|
101
|
+
.action(() => runAction(chart.chartDeploy));
|
|
75
102
|
|
|
76
|
-
//
|
|
103
|
+
// Переопределяем help, чтобы показать кастомный формат с алиасами
|
|
77
104
|
program.configureHelp({
|
|
78
105
|
formatHelp: (cmd, helper) => {
|
|
79
106
|
const termWidth = helper.padWidth(cmd, helper);
|
|
@@ -87,19 +114,19 @@ program.configureHelp({
|
|
|
87
114
|
|
|
88
115
|
let output = "";
|
|
89
116
|
|
|
90
|
-
//
|
|
117
|
+
// Использование
|
|
91
118
|
if (cmdUsage) {
|
|
92
|
-
output +=
|
|
119
|
+
output += `Использование: ${cmdUsage}\n\n`;
|
|
93
120
|
}
|
|
94
121
|
|
|
95
|
-
//
|
|
122
|
+
// Описание
|
|
96
123
|
if (cmdDescription) {
|
|
97
124
|
output += `${cmdDescription}\n\n`;
|
|
98
125
|
}
|
|
99
126
|
|
|
100
|
-
//
|
|
127
|
+
// Команды с алиасами
|
|
101
128
|
if (commands.length > 0) {
|
|
102
|
-
output += "
|
|
129
|
+
output += "Команды:\n";
|
|
103
130
|
commands.forEach((cmd) => {
|
|
104
131
|
const nameAndArgs = cmd.name() + cmd.usage().replace(/^[^\s]+\s*/, " ");
|
|
105
132
|
const aliases = cmd.aliases();
|
|
@@ -115,9 +142,9 @@ program.configureHelp({
|
|
|
115
142
|
output += "\n";
|
|
116
143
|
}
|
|
117
144
|
|
|
118
|
-
//
|
|
145
|
+
// Опции
|
|
119
146
|
if (options.length > 0) {
|
|
120
|
-
output += "
|
|
147
|
+
output += "Опции:\n";
|
|
121
148
|
options.forEach((option) => {
|
|
122
149
|
const flags = helper.optionTerm(option);
|
|
123
150
|
const description = helper.optionDescription(option);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spectrum-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "🚀 Modern CLI for development workflow automation - release management, versioning, and changelog generation",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -70,8 +70,10 @@
|
|
|
70
70
|
"jest": {
|
|
71
71
|
"testEnvironment": "node",
|
|
72
72
|
"collectCoverageFrom": [
|
|
73
|
-
"
|
|
74
|
-
"
|
|
73
|
+
"index.js",
|
|
74
|
+
"src/command-executor.js",
|
|
75
|
+
"src/development.js",
|
|
76
|
+
"src/utils.js"
|
|
75
77
|
],
|
|
76
78
|
"testMatch": [
|
|
77
79
|
"**/__tests__/**/*.js",
|