@mirta/cli 0.3.5 → 0.4.1

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/README.ru.md CHANGED
@@ -2,82 +2,136 @@
2
2
 
3
3
  [![en](https://img.shields.io/badge/lang-en-dimgray.svg?style=flat-square)](https://github.com/wb-mirta/core/blob/latest/packages/mirta-cli/README.md)
4
4
  [![ru](https://img.shields.io/badge/lang-ru-olivedrab.svg?style=flat-square)](https://github.com/wb-mirta/core/blob/latest/packages/mirta-cli/README.ru.md)
5
- [![NPM Version](https://img.shields.io/npm/v/@mirta/globals?style=flat-square)](https://npmjs.com/package/@mirta/cli)
5
+ [![NPM Version](https://img.shields.io/npm/v/@mirta/cli?style=flat-square)](https://npmjs.com/package/@mirta/cli)
6
6
  [![NPM Downloads](https://img.shields.io/npm/dm/@mirta/cli?style=flat-square&logo=npm)](https://npmjs.com/package/@mirta/cli)
7
7
 
8
- Утилита для эффективного управления выпуском релизов и автоматизированной публикации пакетов в NPM, поддерживает работу в монорепозиториях.
8
+ > Универсальный CLI-инструмент для версионирования, публикации и деплоя в монорепозиториях с синхронным семантическим версионированием.
9
9
 
10
- ### Ключевые возможности
10
+ `@mirta/cli` оркестратор процессов, который:
11
+ - Синхронно обновляет версии в пакетах монорепозитория,
12
+ - Запускает генерацию `CHANGELOG` (если настроен),
13
+ - Публикует пакеты в NPM с поддержкой `--provenance` в CI,
14
+ - Синхронизирует артефакты с контроллерами Wiren Board через `rsync`.
11
15
 
12
- - Удобная система обновления версий проектов;
13
- - Простая интеграция с существующими процессами CI/CD;
14
- - Доступ ко всем необходимым операциям через интуитивные команды;
15
- - Поддержка кастомизации рабочего потока под специфику вашей инфраструктуры.
16
+ Работает в любых монорепозиториях, использующих `pnpm` и синхронное семантическое версионирование.
16
17
 
17
- ## Установка и начальная настройка
18
+ **Не предназначен для выполнения в среде Duktape на контроллерах Wiren Board.**
18
19
 
19
- Подключите `@mirta/cli` в ваш проект как dev-зависимость следующей командой:
20
+ ## 📦 Установка
20
21
 
21
22
  ```sh
22
23
  pnpm add -wD @mirta/cli
23
24
  ```
24
- Можно настроить дополнительные параметры, добавив файл конфигурации `mirta.config.json` в корень главного проекта. Например:
25
25
 
26
- ```json
27
- {
28
- "scope": "myscope",
29
- "scopeAsPackagePrefix": false
30
- }
31
- ```
32
- ### Основные опции конфигурации
26
+ ✅ Этот пакет разработан для фреймворка Mirta, но работает в любых `pnpm`-монорепозиториях с синхронным версионированием.
33
27
 
34
- - `scope` задаёт соответствие названию аккаунта или организации в реестре NPM
28
+ ## 🚀 Быстрый старт
35
29
 
36
- - `scopeAsPackagePrefix` включает преобразование путей к модулям, добавляя указанный `scope` перед названием пакета. По умолчанию - `false`.
30
+ **Запустите релиз**:
37
31
 
38
- Пример `scopeAsPackagePrefix` для пакета `@myscope/globals`:
39
- - `true` - расположение `packages/myscope-globals`,
40
- - `false` - расположение `packages/globals`.
32
+ ```sh
33
+ pnpm mirta release
34
+ ```
35
+ Выберите тип обновления → версии обновятся.
41
36
 
42
- Активация данной опции позволяет предотвратить коллизии со сторонними NPM-пакетами без `scope`.
37
+ **Опубликуйте CI или локально)**:
43
38
 
44
- Если вам подходит стандартное поведение инструмента, создание отдельного файла конфигурации не требуется. Достаточно указать scope в основном файле `package.json` следующим образом:
39
+ ```sh
40
+ pnpm mirta publish
41
+ ```
42
+ Все публичные пакеты отправятся в NPM.
45
43
 
46
- ```json
47
- {
48
- "name": "@myscope/myproject"
49
- }
44
+ **Разверните на контроллере**:
45
+
46
+ ```sh
47
+ pnpm mirta deploy
50
48
  ```
49
+ Синхронизирует файлы по профилю (по умолчанию — `default`).
51
50
 
52
- ### Специальные опции фреймворка Мирта
51
+ ## 🧰 Команды
53
52
 
54
- - `templates` содержит набор путей к шаблонам мастера генерации проектов. Выполняет рекурсивный поиск файлов `package.json` в перечисленных расположениях.
53
+ ### `mirta [options]`
55
54
 
56
- Пример конфигурации Мирты:
55
+ Эти глобальные опции работают для всех команд:
57
56
 
58
- ```json
59
- {
60
- "scopeAsPackagePrefix": true,
61
- "templates": [
62
- "packages/create-mirta/public/templates"
63
- ]
64
- }
65
- ```
57
+ - `--help` (`-h`) — отображает справку по доступным командам и параметрам.
58
+ - `--version` (`-v`) — выводит версию `@mirta/cli`.
59
+ - `--locale <loc>` — задаёт язык интерфейса (`en`, `ru`).
66
60
 
67
- ## Управление релизами
61
+ ### `pnpm mirta release`
68
62
 
69
- Выполнение процедуры выпуска релиза в интерактивном режиме:
63
+ Подготавливает релиз: определяет текущую версию, предлагает выбрать тип обновления (`patch`, `minor`, `major`, `pre*`) и применяет его ко всем пакетам с полем `version`.
70
64
 
71
- ```sh
72
- pnpm mirta release
73
- ```
74
- Команда предложит выбрать подходящую версию, а если проект управляется Git, то подготовит список изменений в файле `CHANGELOG.md`, проверит CI-статус и создаст коммит.
65
+ <details>
66
+ <summary>Технические подробности</summary>
67
+
68
+ Процесс разделён на этапы:
69
+
70
+ #### Этап 1: Проверка git-состояния (если проект под git)
71
+ - Синхронизация с `origin`.
72
+ - Успешность CI (по workflow `build`).
75
73
 
76
- Во время работы с Git нужный репозиторий распознаётся автоматически, однако выполняются две проверки:
77
- 1. Локальные изменения заранее синхронизированы с удалённым хранилищем;
78
- 2. Процесс CI под названием `Build` для последнего коммита успешно завершён.
74
+ #### Этап 2: Обновление зависимостей
75
+ - Для путей из `mirta.config.json#project.templates`, рекурсивно обнаруживает `package.json`.
76
+ - Зависимости монорепозитория (`dependencies`, `devDependencies`) обновляются до актуальной версии.
77
+
78
+ #### Этап 3: Генерация CHANGELOG
79
+ - Запускает `pnpm run changelog`, если такой скрипт существует.
80
+
81
+ #### Этап 4: Фиксация изменений
82
+ - При доступе к GitHub по `ssh` создаёт коммит и тег:
83
+ ```sh
84
+ git commit -m "release: vX.X.X"
85
+ git tag vX.X.X
86
+ ```
87
+ - При доступе по `https` изменения остаются в рабочей директории для ручной фиксации.
88
+
89
+ </details>
90
+
91
+ #### Поддерживаемые опции
92
+
93
+ `--dry-run` (`--dry`) — симуляция без применения изменений.
94
+
95
+ `--preid` `<id>` — кастомный префикс преверсии (`alpha.0`, `beta.1`).
96
+
97
+ `--skip-prompts` — пропускает интерактивные запросы.
98
+
99
+ `--skip-git` — не создаёт коммит и тег.
100
+
101
+ #### Частые вопросы
102
+
103
+ <details>
104
+ <summary>Почему версионирование синхронное?</summary>
105
+
106
+ Все пакеты получают одинаковую версию при релизе. Это обеспечивает:
107
+ - Гарантированную совместимость (`@mirta/cli@0.4.0` работает с `@mirta/package@0.4.0`),
108
+ - Атомарность релиза,
109
+ - Упрощение управления зависимостями.
110
+
111
+ 💡 При использовании `workspace:*` все ссылки заменяются на конкретную версию при релизе.
112
+
113
+ </details>
114
+
115
+ <details>
116
+ <summary>Что такое «семантическая» версия?</summary>
117
+
118
+ Формат `major.minor.patch`:
119
+ - `major` — breaking changes,
120
+ - `minor` — новые возможности без нарушения,
121
+ - `patch` — исправления ошибок.
122
+
123
+ Версии до `1.0.0` (например, `0.4.0`) считаются экспериментальными:<br/>
124
+ любое обновление может включать breaking changes.
125
+
126
+ Подробнее на сайте [semver.org](https://semver.org/lang/ru/)
127
+
128
+ </details>
129
+
130
+ <details>
131
+ <summary>Как настроить генерацию CHANGELOG.md?</summary>
132
+
133
+ Добавьте в dev-зависимости корневого `package.json` пакет `conventional-changelog-cli` и определите скрипт:
79
134
 
80
- Для генерации файла со списком изменений в dev-зависимости корневого `package.json` нужно добавить пакет [conventional-changelog-cli](https://www.npmjs.com/package/conventional-changelog-cli), а в секции `scripts` должна присутствовать команда `changelog`:
81
135
  ```json
82
136
  {
83
137
  "scripts": {
@@ -86,27 +140,31 @@ pnpm mirta release
86
140
  }
87
141
  ```
88
142
 
89
- Список изменений в автоматически генерируемом Changelog основывается на выполненных в пределах версии коммитах. При этом есть требования к заголовкам:
90
-
91
- 1. Общая длина строки не должна превышать 50 символов;
92
- 2. Использовать префиксы вида `fix:`, `feat:`, `docs:`, `chore:` и т.п.
143
+ Список изменений формируется на основе коммитов. Требования к заголовкам:
144
+ - Длина ≤ 50 символов,
145
+ - Префиксы: `fix:`, `feat:`, `docs:`, `chore:` и др.
93
146
 
94
- Полный список требований смотреть в соглашении [Commit Convention](https://github.com/wb-mirta/core/blob/latest/.github/commit-convention.md) фреймворка.
147
+ Подробнее: [Commit Convention](https://github.com/wb-mirta/core/blob/latest/.github/commit-convention.md)
95
148
 
96
- ### Семантическое версионирование
149
+ </details>
97
150
 
98
- Семантическая версия имеет вид `major.minor.patch` (например, `1.2.3`), где каждый сегмент обозначает разные уровни изменений:
151
+ #### Расширенное управление
99
152
 
100
- - `major` увеличивается, когда вносятся несовместимые изменения;
101
- - `minor` увеличивается, когда добавляется новая функциональность, сохраняющая обратную совместимость;
102
- - `patch` увеличивается при исправлениях багов, сохраняя обратную совместимость.
153
+ <details>
154
+ <summary>Явное указание версии</summary>
103
155
 
104
- Релиз с указанием конкретной версии:
156
+ Установит ровно ту версию, которая передана в качестве аргумента:
105
157
 
106
158
  ```sh
107
159
  pnpm mirta release 1.2.3
108
160
  ```
109
- Релиз с указанием инкрементируемой части:
161
+ ⚠️ **Не перезаписывайте опубликованные версии — NPM это запрещает.**
162
+
163
+ </details>
164
+
165
+
166
+ <details>
167
+ <summary>Инкремент: patch, minor, major</summary>
110
168
 
111
169
  ```sh
112
170
  pnpm mirta release patch
@@ -120,56 +178,222 @@ pnpm mirta release minor
120
178
  pnpm mirta release major
121
179
  # 1.0.0
122
180
  ```
123
- Релиз предварительной версии с указанием типа:
181
+
182
+ </details>
183
+
184
+ <details>
185
+ <summary>Преверсии: alpha, beta, rc</summary>
124
186
 
125
187
  ```sh
126
188
  pnpm mirta release prepatch --preid alpha
127
189
  # 0.0.1-alpha.0
128
190
  ```
191
+
129
192
  ```sh
130
193
  pnpm mirta release preminor --preid alpha
131
194
  # 0.1.0-alpha.0
132
195
  ```
196
+
133
197
  ```sh
134
198
  pnpm mirta release premajor --preid alpha
135
199
  # 1.0.0-alpha.0
136
200
  ```
137
- Инкремент уже существующей предварительной версии осуществляется через
201
+
202
+ #### Инкремент преверсии
138
203
 
139
204
  ```sh
140
205
  pnpm mirta release prerelease --preid alpha
141
206
  # 0.0.1-alpha.1
142
207
  ```
143
208
 
144
- ## Автоматическая публикация
209
+ </details>
210
+
211
+ ---
212
+
213
+ ### `pnpm mirta publish`
214
+
215
+ Публикует пакеты в NPM, пропуская `private: true`.
216
+
217
+ <details>
218
+ <summary>Технические подробности</summary>
219
+
220
+ ⚠️ Обычно запускается в CI после `git push` тега `vX.X.X`.
221
+
222
+ Тег публикации определяется автоматически:
223
+ - `alpha` → `--tag` `alpha`
224
+ - `beta` → `--tag` `beta`
225
+ - `rc` → `--tag` `rc`
226
+
227
+ В CI добавляется `--provenance` для подтверждения происхождения.
228
+
229
+ </details>
230
+
231
+ #### Поддерживаемые опции
232
+
233
+ - `--dry-run` (`--dry`) — симуляция.
234
+ - `--skip-build` — пропускает `pnpm run build`.
235
+ - `--skip-git` — отключает git-проверки (аналог `--no-git-checks` в `pnpm publish`).
236
+
237
+ ---
238
+
239
+ ### `pnpm mirta deploy`
240
+
241
+ Синхронизирует файлы с контроллерами Wiren Board через `rsync` по SSH.
242
+
243
+ <details>
244
+ <summary>Технические подробности</summary>
245
+
246
+ - Транспорт: `rsync -rtzgO` (рекурсивно, сжатие, сохранение времени и группы, без времени на папках).
247
+ - Поддержка WSL2: на Windows команды выполняются внутри WSL.
248
+ - Аутентификация:
249
+ - Через изолированный `ssh-agent`.
250
+ - Поддержка PKCS#11 (Rutoken) и SSH-ключей.
251
+ - `ttl` — время жизни ключа.
252
+ - Режим `--dry-run`: показывает изменения без применения.
253
+ - Симлинки не передаются.
254
+
255
+ </details>
256
+
257
+ #### Поддерживаемые опции
258
+
259
+ - `--config`, `-c <path>` — путь к `mirta.config.json`.
260
+ - `--profile`, `-p <name>` — профиль деплоя (по умолчанию: `default`).
261
+ - `--to <conn>` — переопределение подключения.
262
+ - `--dry-run` — симуляция синхронизации.
263
+
264
+ Параметр `--to` принимает:
265
+ - Название подключения из файла конфигурации `mirta.config.json`,
266
+ - Строку подключения, если она начинается с префикса `ssh://`.
267
+
268
+ #### Переменные окружения и секреты
269
+
270
+ Для безопасного хранения учётных данных используйте файл `.env.local` (игнорируется git):
271
+
272
+ ```sh
273
+ # .env.local
274
+
275
+ SSH_KEY=~/.ssh/id_ed25519
276
+
277
+ # Доступно в конфигурации:
278
+ WB_CONN_OPTIONS=`key=${SSH_KEY};ttl=1h30m`
279
+ WB_CONN_WORK=`ssh://user@mycompany.local;${WB_CONN_OPTIONS}`
280
+ ```
281
+ Поддерживаемые префиксы:
282
+ - `WB_` — переменные, специфичные для CLI
283
+ - `MIRTA_` — переменные для использования в любом контексте Mirta
284
+ - `NODE_ENV` — стандартное значение окружения
285
+
286
+ #### Формат строки подключения
287
+
288
+ ```sh
289
+ ssh://[user@]host[:port][;param1=value1;param2=value2...]
290
+ ```
291
+ Поддерживаемые параметры:
292
+
293
+ | Параметр | Описание | Пример |
294
+ |----------|---------|---------|
295
+ | `pkcs11` | Путь к библиотеке PKCS#11 (Rutoken) | `pkcs11=/usr/lib/librtpkcs11ecp.so` |
296
+ | `key` | Путь к SSH-ключу (ED25519, RSA) | `key=~/.ssh/id_ed25519` |
297
+ | `ttl` | Время жизни ключа в ssh-agent | `ttl=1h` |
298
+ | `wsl` | Дистрибутив WSL2 для Windows | `wsl=Debian` |
145
299
 
146
- Публикуйте готовые пакеты в репозиторий NPM:
300
+ > Примечание: `pkcs11` имеет приоритет над `key`, если указаны одновременно.
301
+
302
+ Примеры:
147
303
 
148
304
  ```sh
149
- pnpm mirta publish
305
+ # SSH-ключ ED25519
306
+ ssh://deploy@192.168.42.1;key=~/.ssh/id_ed25519;ttl=30m
307
+
308
+ # PKCS#11 токен (Rutoken) с WSL2 на Windows
309
+ ssh://deploy@192.168.42.1;pkcs11=/usr/lib/librtpkcs11ecp.so;wsl=Ubuntu-22.04
310
+
311
+ # С переменными окружения
312
+ ssh://deploy@${WB_HOST};key=${MIRTA_SSH_KEY}
150
313
  ```
151
- Операция запустит процедуру сборки и публикации готовых пакетов.
152
314
 
153
- Если процесс запущен через CI на GitHub, то к публикуемому пакету автоматически добавляется [информация о происхождении](https://docs.npmjs.com/generating-provenance-statements) каждого файла внутри пакета - хэш и метаданные, подтверждающие целостность и подлинность.
315
+ <details>
316
+ <summary>Нюансы PKCS#11</summary>
317
+
318
+ Если `ssh-agent` выбрасывает ошибку `agent refused operation`:
319
+
320
+ - Путь к модулю PKCS#11 должен быть реальным — симлинки отклоняются
321
+ - Превышено число попыток ввода PIN-кода, токен заблокирован
154
322
 
155
- Основная цель опции заключается в повышении уровня доверия и безопасности публикуемых пакетов. Если пакет опубликован с использованием этой опции, пользователи смогут проверить, соответствует ли содержимое загруженного пакета оригинальному источнику, указанному автором.
323
+ </details>
324
+
325
+ #### Пример и описание структуры `mirta.config.json`
326
+
327
+ ```jsonc
328
+ {
329
+ // Строки подключений к контроллерам
330
+ "connections": {
331
+ // Без подробностей в публичном репозитории
332
+ "work": "${WB_CONN_WORK}",
333
+ // Частичное сокрытие подробностей
334
+ "home": "ssh://user@192.168.42.1;${WB_CONN_OPTIONS};wsl=Ubuntu",
335
+ },
336
+ "deploy": {
337
+ // Наборы правил синхронизации
338
+ "mappings": {
339
+ "wb-rules-es5": [
340
+ {
341
+ // Локальная папка (относительно корня проекта)
342
+ "from": "dist/es5/wb-rules-rules",
343
+ // Целевая папка на контроллере
344
+ "to": "/mnt/data/etc/wb-rules-rules",
345
+ // Группа пользователей с доступом на контроллере (опционально)
346
+ "toGroup": "developers",
347
+ // Удалять файлы в целевой папке, если их нет в исходной
348
+ "cleanup": true,
349
+ // Список файлов и папок, которые нельзя удалять при cleanup: true
350
+ "protect": ["alarms.conf"]
351
+ },
352
+ // {
353
+ // Следующее правило синхронизации...
354
+ // }
355
+ ]
356
+ },
357
+ // Заранее настроенные сценарии деплоя
358
+ "profiles": {
359
+ "default": {
360
+ // Массив имён наборов правил секции deploy.mappings
361
+ "mappings": ["wb-rules-es5"],
362
+ // Имя или строка подключения
363
+ "connection": "work",
364
+ // Группа пользователей с доступом на контроллере (опционально)
365
+ "toGroup": "developers"
366
+ }
367
+ }
368
+ }
369
+ }
370
+ ```
156
371
 
157
- ## Вспомогательные опции
372
+ ## Тестирование
158
373
 
159
- ### Опции `release`
374
+ Инструмент протестирован вручную и в CI:
375
+ - Интерактивный и автоматический релиз.
376
+ - Обработка ошибок (откат версий при сбое).
377
+ - Проверка git-состояния и CI.
378
+ - Поддержка `--dry-run`.
160
379
 
161
- `--dry` запускает команду в режиме симуляции ("dry run"), показывая изменения, которые будут произведены, но фактически ничего не меняя. Полезно для предварительного просмотра изменений перед применением.
380
+ Дополнительные испытания:
162
381
 
163
- `--preid <custom-pre-release-id>` устанавливает кастомный префикс для предварительной версии, который добавляется к номеру версии пакета (например, beta.1). Эта опция позволяет создавать предварительные версии типа альфа, бета, RC и др. перед официальным стабильным выпуском.
382
+ - Деплой с `Rutoken`, деплой с ключом `ED25519` в WSL2 под Windows и отдельно в Linux Debian (Trixie).
164
383
 
165
- `--skipPrompts` пропускает интерактивные запросы пользователя. Команда выполняется автоматически, используя значения по умолчанию или заданные настройки.
384
+ ## ⚠️ Ограничения
166
385
 
167
- `--skipGit` игнорирует действия, связанные с системой контроля версий Git, такие как фиксация изменений, создание меток коммитов или отправка изменений на удалённый репозиторий. Может пригодиться, если вы хотите самостоятельно управлять операциями с Git позже.
386
+ **Работает только в Node.js** (не в Duktape).<br/>
387
+ Автоматическое создание коммита и тега — только при `ssh`-подключении к GitHub.<br/>
388
+ WSL2 требуется для деплоя под Windows.
168
389
 
169
- ### Опции `publish`
390
+ ## 🛠 Конфигурация Mirta
170
391
 
171
- `--dry` запускает команду в режиме симуляции ("dry run"), показывая изменения, которые будут произведены, но фактически ничего не меняя. Полезно для предварительного просмотра изменений перед применением.
392
+ Файл `mirta.config.json` настраивает поведение `@mirta/cli`.
172
393
 
173
- `--skipBuild` исключает запуск процесса сборки после обновления версий пакетов. Пропускает выполнение заданий, указанных в конвейере сборки, позволяя вам самим решать, необходима ли повторная компиляция после изменения номеров версий.
394
+ Поддерживаемые поля:
174
395
 
175
- `--skipGit` игнорирует действия, связанные с системой контроля версий Git, такие как фиксация изменений, создание меток коммитов или отправка изменений на удалённый репозиторий. Может пригодиться, если вы хотите самостоятельно управлять операциями с Git позже.
396
+ - `project.templates` пути к шаблонам (например, для `create-mirta`).
397
+ - `connections` — именованные подключения.
398
+ - `deploy.mappings` — правила синхронизации.
399
+ - `deploy.profiles` — профили деплоя.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Имя текущего пакета.
3
+ *
4
+ * @since 0.4.0
5
+ *
6
+ **/
7
+ const THIS_PACKAGE_NAME = '@mirta/cli';
8
+
9
+ export { THIS_PACKAGE_NAME as T };