onreza-release 1.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/README.md ADDED
@@ -0,0 +1,881 @@
1
+ # ONREZA Release
2
+
3
+ [![npm version](https://img.shields.io/npm/v/onreza-release.svg)](https://www.npmjs.com/package/onreza-release)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+ [![Test Coverage](https://img.shields.io/badge/coverage-99.85%25-brightgreen.svg)](https://gitverse.ru/onreza/release-tool)
6
+
7
+ Инструмент автоматизации релизов с поддержкой Conventional Commits, семантического версионирования и интеграцией с GitVerse.
8
+
9
+ ## Возможности
10
+
11
+ - ✅ **Автоматическое версионирование** на основе Conventional Commits
12
+ - 📝 **Генерация CHANGELOG** с группировкой по типам коммитов
13
+ - 🌐 **Интеграция с GitVerse API** для создания релизов
14
+ - 📦 **Поддержка монорепозиториев** с независимым версионированием
15
+ - 🏷️ **Автоматические git теги и коммиты**
16
+ - 🔍 **Режим dry-run** для безопасного тестирования
17
+ - ⚙️ **Гибкая конфигурация** через `.gitversereleaserc.json`
18
+ - 🔧 **Автогенерация commitlint конфига** из release конфигурации
19
+ - 🪝 **Хуки beforeCommit** для автоматической подготовки файлов перед релизом
20
+ - 📤 **Бинарная дистрибуция** — публикация платформенных npm-пакетов (по паттерну esbuild/biome)
21
+
22
+ ## Установка
23
+
24
+ ```bash
25
+ # npm
26
+ npm install -D onreza-release
27
+
28
+ # bun
29
+ bun add -d onreza-release
30
+
31
+ # yarn
32
+ yarn add -D onreza-release
33
+
34
+ # pnpm
35
+ pnpm add -D onreza-release
36
+ ```
37
+
38
+ ## Быстрый старт
39
+
40
+ > ⚠️ **Важно:** Для создания релизов в GitVerse необходимо настроить `GVR_TOKEN`. Без токена инструмент работает в урезанном режиме (только локальные теги и CHANGELOG). См. [Настройка GVR_TOKEN](#️-настройка-gitverse_token)
41
+
42
+ ### 1. Базовое использование
43
+
44
+ ```bash
45
+ # Создать релиз (dry-run для тестирования)
46
+ npx onreza-release --dry-run
47
+
48
+ # Создать и опубликовать релиз
49
+ npx onreza-release
50
+ ```
51
+
52
+ ### 2. Конфигурация
53
+
54
+ Создайте `.gitversereleaserc.json` в корне проекта:
55
+
56
+ ```json
57
+ {
58
+ "git": {
59
+ "commitMessage": "chore(release): v{version} [skip ci]",
60
+ "tagMessage": "Release {version}",
61
+ "push": true,
62
+ "commitChanges": true
63
+ },
64
+ "changelog": {
65
+ "types": {
66
+ "feat": "✨ Новые возможности",
67
+ "fix": "🐛 Исправления",
68
+ "perf": "⚡ Производительность",
69
+ "docs": "📝 Документация"
70
+ },
71
+ "showHash": true,
72
+ "showAuthor": true
73
+ },
74
+ "gitverse": {
75
+ "createRelease": true
76
+ }
77
+ }
78
+ ```
79
+
80
+ ### 3. Добавьте в package.json
81
+
82
+ ```json
83
+ {
84
+ "scripts": {
85
+ "release": "onreza-release",
86
+ "release:dry": "onreza-release --dry-run"
87
+ }
88
+ }
89
+ ```
90
+
91
+ ## Использование
92
+
93
+ ### Conventional Commits
94
+
95
+ Инструмент автоматически определяет тип версии на основе коммитов:
96
+
97
+ ```bash
98
+ # Patch (1.0.0 → 1.0.1)
99
+ git commit -m "fix: исправлена ошибка валидации"
100
+
101
+ # Minor (1.0.0 → 1.1.0)
102
+ git commit -m "feat: добавлен новый API эндпоинт"
103
+
104
+ # Major (1.0.0 → 2.0.0)
105
+ git commit -m "feat!: изменен формат ответа API"
106
+ # или
107
+ git commit -m "feat: новая функция
108
+
109
+ BREAKING CHANGE: изменен формат конфигурации"
110
+ ```
111
+
112
+ ### Pre-Major режим (0.x.x проекты)
113
+
114
+ Для проектов в стадии разработки (версии `0.x.x`) доступен режим `preMajorMode`, который контролирует поведение BREAKING CHANGES:
115
+
116
+ ```json
117
+ {
118
+ "versioning": {
119
+ "preMajorMode": "auto" // Режим по умолчанию
120
+ }
121
+ }
122
+ ```
123
+
124
+ **Режимы работы:**
125
+
126
+ - `"auto"` (default) - версии `< 1.0.0` → **minor bump**, `>= 1.0.0` → **major bump**
127
+ - `"enabled"` - BREAKING CHANGE всегда делает **minor bump** (для experimental проектов)
128
+ - `"disabled"` - стандартное semver поведение (BREAKING → major bump)
129
+ - `"2.0.0"` - порог версии (minor bump пока версия < порога)
130
+
131
+ **Примеры:**
132
+
133
+ ```bash
134
+ # Режим "auto" (рекомендуется)
135
+ # 0.5.0 + "feat!: breaking change" → 0.6.0
136
+ # 1.5.0 + "feat!: breaking change" → 2.0.0
137
+
138
+ # Режим "enabled" (experimental проект)
139
+ # 1.5.0 + "feat!: breaking change" → 1.6.0
140
+
141
+ # Режим с порогом "2.0.0"
142
+ # 1.5.0 + "feat!: breaking change" → 1.6.0
143
+ # 2.0.0 + "feat!: breaking change" → 3.0.0
144
+ ```
145
+
146
+ > **Зачем это нужно?** По спецификации semver версии `0.x.x` находятся в pre-release фазе, где minor bump уже означает breaking change. Режим `auto` автоматически применяет правильную семантику.
147
+
148
+ ### Программное использование
149
+
150
+ ```typescript
151
+ import { release } from "onreza-release";
152
+
153
+ // Простой релиз
154
+ const result = await release();
155
+
156
+ console.log(result.success); // true
157
+ console.log(result.newVersion); // "1.1.0"
158
+ console.log(result.tag); // "v1.1.0"
159
+
160
+ // С опциями
161
+ const result = await release(undefined, {
162
+ dryRun: true,
163
+ version: "2.0.0",
164
+ skipGitStatusCheck: false,
165
+ });
166
+
167
+ // Для монорепозитория
168
+ const result = await release("my-package", {
169
+ dryRun: false,
170
+ });
171
+ ```
172
+
173
+ > **Примечание для GitVerse Actions:**
174
+ > В GitVerse Actions автоматически доступны переменные окружения:
175
+ > - `GVR_TOKEN` - должен быть настроен в Secrets (см. [Настройка](#️-настройка-gitverse_token))
176
+ > - `GITVERSE_PUBLIC_API_URL` - автоматически доступен (`https://api.gitverse.ru/`)
177
+ > - `GITHUB_REPOSITORY` - имя репозитория в формате `owner/repo`
178
+
179
+ ## Поддержка монорепозиториев
180
+
181
+ ### Конфигурация
182
+
183
+ ```json
184
+ {
185
+ "monorepo": {
186
+ "enabled": true,
187
+ "packages": [
188
+ {
189
+ "name": "core",
190
+ "packageName": "@myorg/core",
191
+ "path": "./packages/core",
192
+ "tagPrefix": "core@",
193
+ "changelog": "CHANGELOG.md"
194
+ },
195
+ {
196
+ "name": "ui",
197
+ "packageName": "@myorg/ui",
198
+ "path": "./packages/ui",
199
+ "tagPrefix": "ui@",
200
+ "changelog": "CHANGELOG.md"
201
+ }
202
+ ]
203
+ }
204
+ }
205
+ ```
206
+
207
+ ### Использование
208
+
209
+ ```bash
210
+ # Релиз конкретного пакета
211
+ npx onreza-release core
212
+
213
+ # Dry-run для пакета
214
+ npx onreza-release ui --dry-run
215
+ ```
216
+
217
+ ### Фильтрация коммитов по scope
218
+
219
+ ```bash
220
+ # Коммиты для пакета "core"
221
+ git commit -m "feat(core): добавлена новая функция"
222
+
223
+ # Коммиты для пакета "ui"
224
+ git commit -m "fix(ui): исправлена ошибка компонента"
225
+
226
+ # Общие коммиты (влияют на все пакеты)
227
+ git commit -m "chore: обновлены зависимости"
228
+ ```
229
+
230
+ ## Генерация Commitlint конфига
231
+
232
+ Инструмент может автоматически генерировать `commitlint.config.ts` из вашей release конфигурации, обеспечивая синхронизацию между форматом коммитов и генерацией релизов.
233
+
234
+ ### Быстрый старт
235
+
236
+ ```bash
237
+ # Генерировать commitlint конфиг
238
+ npx onreza-release generate-commitlint
239
+
240
+ # Preview без записи файла
241
+ npx onreza-release generate-commitlint --dry-run
242
+
243
+ # С кастомными параметрами
244
+ npx onreza-release generate-commitlint --format js --output .commitlintrc.js
245
+ ```
246
+
247
+ ### Что генерируется?
248
+
249
+ Команда автоматически извлекает:
250
+ - **Типы коммитов** из `changelog.types` (feat, fix, docs, etc.)
251
+ - **Scopes** из названий пакетов в монорепо + дополнительные scopes
252
+ - **Правила валидации** (max length, case, required fields)
253
+
254
+ ### Конфигурация defaults
255
+
256
+ Добавьте секцию `commitlint` в `.gitversereleaserc.json`:
257
+
258
+ ```json
259
+ {
260
+ "commitlint": {
261
+ "output": "commitlint.config.ts",
262
+ "format": "ts",
263
+ "scopes": ["deps", "ci", "docs"],
264
+ "scopeRequired": false,
265
+ "headerMaxLength": 100,
266
+ "comments": true
267
+ }
268
+ }
269
+ ```
270
+
271
+ Теперь можно просто запускать `npx onreza-release generate-commitlint` без параметров!
272
+
273
+ ### CLI опции
274
+
275
+ ```bash
276
+ --output <path> Путь для вывода (default: из конфига)
277
+ --format <ts|js|json> Формат файла (default: из конфига)
278
+ --scopes <list> Дополнительные scopes через запятую
279
+ --scope-required Требовать обязательный scope
280
+ --header-max-length <n> Максимальная длина header
281
+ --no-comments Отключить комментарии в файле
282
+ --dry-run Preview без записи
283
+ --verbose Подробный вывод
284
+ ```
285
+
286
+ ### Примеры использования
287
+
288
+ ```bash
289
+ # Использовать настройки из конфига
290
+ npx onreza-release generate-commitlint
291
+
292
+ # Preview сгенерированного файла
293
+ npx onreza-release generate-commitlint --dry-run --verbose
294
+
295
+ # Генерировать JS вместо TS
296
+ npx onreza-release generate-commitlint --format js --output .commitlintrc.js
297
+
298
+ # Добавить дополнительные scopes
299
+ npx onreza-release generate-commitlint --scopes api,cli,tests
300
+
301
+ # Требовать обязательный scope
302
+ npx onreza-release generate-commitlint --scope-required
303
+ ```
304
+
305
+ ### Преимущества
306
+
307
+ ✅ **Единый источник истины** - типы и scopes определяются в одном месте
308
+ ✅ **Автоматическая синхронизация** - изменения в release конфиге автоматически отражаются в commitlint
309
+ ✅ **Меньше ошибок** - нет риска рассинхронизации конфигов
310
+ ✅ **CI-friendly** - легко интегрируется в pipelines для проверки актуальности конфига
311
+
312
+ ## Бинарная дистрибуция
313
+
314
+ Инструмент поддерживает создание и публикацию платформенных npm-пакетов по паттерну, используемому esbuild, biome, bun и другими инструментами.
315
+
316
+ ### Как это работает
317
+
318
+ 1. **Платформенные пакеты** (`@scope/name-linux-x64`, `@scope/name-darwin-arm64`, ...) содержат только бинарник для конкретной платформы с фильтрами `os`/`cpu` в package.json
319
+ 2. **Основной пакет** объявляет их в `optionalDependencies` и содержит JS wrapper, который находит и запускает нужный бинарник
320
+ 3. npm автоматически устанавливает только подходящий платформенный пакет
321
+
322
+ ### Быстрый старт
323
+
324
+ ```bash
325
+ # Preview без публикации
326
+ npx onreza-release publish-binaries --dry-run
327
+
328
+ # Только генерация пакетов (без публикации)
329
+ npx onreza-release generate-binary-packages
330
+
331
+ # Генерация и публикация
332
+ npx onreza-release publish-binaries
333
+ ```
334
+
335
+ ### Конфигурация
336
+
337
+ Добавьте секцию `binaries` в `.gitversereleaserc.jsonc`:
338
+
339
+ ```jsonc
340
+ {
341
+ "binaries": {
342
+ "enabled": true,
343
+ "scope": "@rainypixel", // npm scope (опционально)
344
+ "name": "yougile", // базовое имя пакетов
345
+ "binName": "yougile", // имя бинарника в $PATH (опционально)
346
+ "distDir": "./dist", // директория с бинарниками
347
+ "outDir": "./npm", // куда генерировать пакеты
348
+ "platforms": [
349
+ "linux-x64",
350
+ "linux-arm64",
351
+ "darwin-x64",
352
+ "darwin-arm64",
353
+ "win32-x64"
354
+ ],
355
+ "publishCommand": "npm publish --access public",
356
+ "mainPackage": "./package.json", // основной package.json
357
+ "continueOnError": false, // продолжать при ошибке
358
+ "retryAttempts": 3 // retry для публикации
359
+ }
360
+ }
361
+ ```
362
+
363
+ ### Пакеты без scope
364
+
365
+ `scope` опционален. Без него пакеты публикуются как `myapp-linux-x64` вместо `@org/myapp-linux-x64`:
366
+
367
+ ```jsonc
368
+ {
369
+ "binaries": {
370
+ "enabled": true,
371
+ "name": "myapp", // без scope!
372
+ "distDir": "./dist",
373
+ "platforms": ["linux-x64", "darwin-arm64"]
374
+ }
375
+ }
376
+ // Результат: myapp-linux-x64, myapp-darwin-arm64
377
+ ```
378
+
379
+ ### Кастомный шаблон имени пакета
380
+
381
+ Используйте `packageNameTemplate` для гибкой настройки имён:
382
+
383
+ ```jsonc
384
+ {
385
+ "binaries": {
386
+ "name": "myapp",
387
+ "packageNameTemplate": "{{name}}-bin-{{platform}}"
388
+ }
389
+ }
390
+ // Результат: myapp-bin-linux-x64
391
+ ```
392
+
393
+ ```jsonc
394
+ {
395
+ "binaries": {
396
+ "name": "myapp",
397
+ "scope": "@org",
398
+ "packageNameTemplate": "@{{scope}}/{{name}}-cli-{{platform}}"
399
+ }
400
+ }
401
+ // Результат: @org/myapp-cli-linux-x64
402
+ ```
403
+
404
+ **Плейсхолдеры:** `{{scope}}`, `{{name}}`, `{{platform}}`
405
+
406
+ **Дефолтные шаблоны:**
407
+ - Без scope: `{{name}}-{{platform}}`
408
+ - Со scope: `@{{scope}}/{{name}}-{{platform}}`
409
+
410
+ ### Структура бинарников
411
+
412
+ #### Формат "directory" (по умолчанию)
413
+
414
+ Бинарники в директориях:
415
+
416
+ ```
417
+ dist/
418
+ yougile-linux-x64/
419
+ yougile # бинарник для linux x64
420
+ yougile-darwin-arm64/
421
+ yougile # бинарник для macOS ARM
422
+ yougile-win32-x64/
423
+ yougile.exe # бинарник для Windows
424
+ ```
425
+
426
+ #### Формат "tar.gz"
427
+
428
+ Бинарники в tar.gz архивах (удобно для CI артефактов):
429
+
430
+ ```jsonc
431
+ {
432
+ "binaries": {
433
+ "inputFormat": "tar.gz",
434
+ "sourceBinName": "cli", // имя бинарника внутри архива
435
+ "platformMap": { // маппинг имён архивов на платформы
436
+ "linux-amd64": "linux-x64",
437
+ "darwin-arm64": "darwin-arm64",
438
+ "windows-x64": "win32-x64"
439
+ }
440
+ }
441
+ }
442
+ ```
443
+
444
+ Структура архивов:
445
+ ```
446
+ dist/
447
+ myapp-linux-amd64.tar.gz # содержит cli (или cli внутри поддиректории)
448
+ myapp-darwin-arm64.tar.gz
449
+ myapp-windows-x64.tar.gz
450
+ ```
451
+
452
+ **Опции для tar.gz:**
453
+ - `inputFormat: "tar.gz"` — включает режим архивов
454
+ - `sourceBinName` — имя бинарника внутри архива (если отличается от `name`)
455
+ - `platformMap` — маппинг ключей в именах архивов на npm платформы
456
+
457
+ ### Генерируемая структура
458
+
459
+ ```
460
+ npm/
461
+ @rainypixel/
462
+ yougile-linux-x64/
463
+ package.json # { "os": ["linux"], "cpu": ["x64"], "bin": {...} }
464
+ bin/yougile # скопированный бинарник
465
+ README.md
466
+ yougile-darwin-arm64/
467
+ ...
468
+ ```
469
+
470
+ ### CLI опции
471
+
472
+ ```bash
473
+ # Publish binaries
474
+ npx onreza-release publish-binaries [options]
475
+
476
+ # Generate only (без публикации)
477
+ npx onreza-release generate-binary-packages [options]
478
+
479
+ Опции:
480
+ --dry-run Preview без изменений
481
+ --version <ver> Override версии
482
+ --platforms <list> Конкретные платформы (comma-separated)
483
+ --generate-only Только генерация (для publish-binaries)
484
+ --skip-main-package Не обновлять основной package.json
485
+ --verbose Подробный вывод
486
+ ```
487
+
488
+ ### Кастомная команда публикации
489
+
490
+ Команда публикации поддерживает плейсхолдеры:
491
+
492
+ ```jsonc
493
+ {
494
+ "binaries": {
495
+ "publishCommand": "npm publish --access public --registry https://registry.npmjs.org"
496
+ // Доступные плейсхолдеры:
497
+ // {{packageDir}} - путь к пакету
498
+ // {{version}} - версия
499
+ // {{platform}} - платформа (linux-x64, etc.)
500
+ // {{scope}} - npm scope
501
+ // {{name}} - имя пакета
502
+ }
503
+ }
504
+ ```
505
+
506
+ ### Пример dry-run вывода
507
+
508
+ ```
509
+ 🔍 DRY RUN MODE
510
+
511
+ 📦 Binary Distribution:
512
+ Scope: @rainypixel
513
+ Name: yougile
514
+ Version: 1.2.3
515
+ Platforms: linux-x64, darwin-arm64
516
+
517
+ 📁 Packages to generate:
518
+ npm/@rainypixel/yougile-linux-x64/
519
+ npm/@rainypixel/yougile-darwin-arm64/
520
+
521
+ 📝 Main package updates:
522
+ optionalDependencies:
523
+ "@rainypixel/yougile-linux-x64": "1.2.3"
524
+ "@rainypixel/yougile-darwin-arm64": "1.2.3"
525
+ bin:
526
+ "yougile": "bin/yougile.js"
527
+
528
+ 🚀 Publish command: npm publish --access public
529
+ ```
530
+
531
+ ### Интеграция с CI/CD
532
+
533
+ ```yaml
534
+ jobs:
535
+ publish-binaries:
536
+ runs-on: ubuntu-latest
537
+ steps:
538
+ - uses: actions/checkout@v4
539
+
540
+ # Скачать бинарники из других jobs или артефактов
541
+ - name: Download binaries
542
+ uses: actions/download-artifact@v4
543
+ with:
544
+ name: binaries
545
+ path: dist/
546
+
547
+ - uses: oven-sh/setup-bun@v2
548
+ - run: bun install
549
+
550
+ - name: Publish platform packages
551
+ run: npx onreza-release publish-binaries
552
+ env:
553
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
554
+ ```
555
+
556
+ ## Конфигурация
557
+
558
+ ### Полный пример
559
+
560
+ ```json
561
+ {
562
+ "git": {
563
+ "beforeCommit": "bun run lint:fix",
564
+ "commitMessage": "chore(release): v{version} [skip ci]",
565
+ "tagMessage": "Release {version}",
566
+ "push": true,
567
+ "commitChanges": true
568
+ },
569
+ "changelog": {
570
+ "types": {
571
+ "feat": "✨ Новые возможности",
572
+ "fix": "🐛 Исправления",
573
+ "perf": "⚡ Улучшения производительности",
574
+ "refactor": "♻️ Рефакторинг",
575
+ "docs": "📝 Документация",
576
+ "style": "💄 Стили",
577
+ "test": "✅ Тесты",
578
+ "build": "🔧 Сборка",
579
+ "ci": "👷 CI/CD",
580
+ "chore": "🧹 Прочее"
581
+ },
582
+ "showHash": true,
583
+ "showAuthor": true
584
+ },
585
+ "versioning": {
586
+ "tagPrefix": "v",
587
+ "prereleasePrefix": "beta",
588
+ "allowPrerelease": false,
589
+ "preMajorMode": "auto"
590
+ },
591
+ "gitverse": {
592
+ "createRelease": true,
593
+ "token": "${GVR_TOKEN}"
594
+ },
595
+ "monorepo": {
596
+ "enabled": false,
597
+ "packages": []
598
+ },
599
+ "commitlint": {
600
+ "output": "commitlint.config.ts",
601
+ "format": "ts",
602
+ "scopes": ["deps", "ci", "docs"],
603
+ "scopeRequired": false,
604
+ "headerMaxLength": 100,
605
+ "comments": true
606
+ },
607
+ "binaries": {
608
+ "enabled": false,
609
+ "scope": "@myorg",
610
+ "name": "myapp",
611
+ "distDir": "./dist",
612
+ "outDir": "./npm",
613
+ "platforms": ["linux-x64", "linux-arm64", "darwin-x64", "darwin-arm64", "win32-x64"],
614
+ "publishCommand": "npm publish --access public",
615
+ "continueOnError": false,
616
+ "retryAttempts": 3
617
+ }
618
+ }
619
+ ```
620
+
621
+ ### beforeCommit хук
622
+
623
+ Хук `beforeCommit` запускается **перед проверкой чистоты working tree** и позволяет автоматически подготовить файлы перед созданием релиза:
624
+
625
+ ```json
626
+ {
627
+ "git": {
628
+ "beforeCommit": "bun run lint:fix"
629
+ }
630
+ }
631
+ ```
632
+
633
+ **Как это работает:**
634
+ 1. Запускается команда `beforeCommit` (например, линтер)
635
+ 2. Если команда выполнилась успешно (exit code 0):
636
+ - Все измененные файлы добавляются в staging area (`git add -A`)
637
+ - Эти изменения войдут в коммит релиза вместе с version/changelog
638
+ 3. Проверяется чистота working tree (только unstaged изменения)
639
+
640
+ **Примеры использования:**
641
+ ```json
642
+ // Форматирование кода
643
+ "beforeCommit": "bun run format"
644
+
645
+ // Линтинг и автофикс
646
+ "beforeCommit": "bun run lint:fix"
647
+
648
+ // Обновление lock файлов
649
+ "beforeCommit": "bun install --frozen-lockfile=false"
650
+
651
+ // Несколько команд
652
+ "beforeCommit": "bun run lint:fix && bun run format"
653
+ ```
654
+
655
+ **Важно:** Если хук завершается с ошибкой (exit code ≠ 0), изменения НЕ добавляются в staging area и релиз продолжается как обычно.
656
+
657
+ ### Переменные окружения
658
+
659
+ ```bash
660
+ # Токен GitVerse для создания релизов
661
+ export GVR_TOKEN="your-token-here"
662
+
663
+ # Или через .env файл
664
+ echo "GVR_TOKEN=your-token" >> .env
665
+ ```
666
+
667
+ ### ⚠️ Настройка GVR_TOKEN
668
+
669
+ **КРИТИЧЕСКИ ВАЖНО:** Без настройки `GVR_TOKEN` инструмент работает в **урезанном режиме**:
670
+
671
+ ✅ **С токеном (полный режим):**
672
+ - Автоматическое создание релизов в GitVerse
673
+ - Публикация changelog в релиз
674
+ - Загрузка ассетов релиза
675
+ - Push тегов и коммитов в удаленный репозиторий
676
+
677
+ ⚠️ **Без токена (урезанный режим):**
678
+ - ❌ НЕТ создания релизов в GitVerse
679
+ - ✅ Генерация CHANGELOG локально
680
+ - ✅ Создание git тегов локально
681
+ - ✅ Коммиты изменений локально
682
+
683
+ #### Настройка токена для GitVerse Actions
684
+
685
+ **Важно:** `GVR_TOKEN` **НЕ предоставляется автоматически** в GitVerse Actions!
686
+
687
+ **Шаг 1: Создайте Personal Access Token**
688
+ 1. Перейдите в GitVerse: **Settings** → **Applications** → **Generate New Token**
689
+ 2. Выберите необходимые права:
690
+ - `repo` - полный доступ к репозиториям (обязательно для релизов)
691
+ 3. Скопируйте токен (показывается только один раз!)
692
+
693
+ **Шаг 2: Добавьте токен в Secrets репозитория**
694
+ 1. В репозитории: **Settings** → **Secrets and Variables** → **Actions**
695
+ 2. Нажмите **New repository secret**
696
+ 3. **Name:** `GVR_TOKEN`
697
+ 4. **Value:** ваш Personal Access Token
698
+ 5. Сохраните
699
+
700
+ **Шаг 3: Используйте в workflow**
701
+ ```yaml
702
+ env:
703
+ GVR_TOKEN: ${{ secrets.GVR_TOKEN }}
704
+ ```
705
+
706
+ **Шаг 4: Проверка (рекомендуется)**
707
+ ```yaml
708
+ - name: Validate GVR_TOKEN
709
+ run: |
710
+ if [ -z "$GVR_TOKEN" ]; then
711
+ echo "❌ ERROR: GVR_TOKEN is not set!"
712
+ echo "Please add GVR_TOKEN to repository secrets."
713
+ exit 1
714
+ fi
715
+ echo "✅ GVR_TOKEN is configured"
716
+ ```
717
+
718
+ ## CLI опции
719
+
720
+ ### Основные команды
721
+
722
+ ```bash
723
+ # Создать релиз
724
+ npx onreza-release [package] [options]
725
+
726
+ # Инициализировать конфигурацию
727
+ npx onreza-release init [options]
728
+
729
+ # Генерировать commitlint конфиг
730
+ npx onreza-release generate-commitlint [options]
731
+
732
+ # Создать только GitVerse Release для существующего тега (recovery mode)
733
+ npx onreza-release create-only --tag <tag> [--package <name>]
734
+
735
+ # Публикация бинарных пакетов
736
+ npx onreza-release publish-binaries [options]
737
+
738
+ # Генерация бинарных пакетов (без публикации)
739
+ npx onreza-release generate-binary-packages [options]
740
+ ```
741
+
742
+ ### Опции для релиза
743
+
744
+ ```
745
+ Аргументы:
746
+ package Имя пакета для релиза (для монорепозиториев)
747
+
748
+ Опции:
749
+ --dry-run Запуск без внесения изменений
750
+ --config <path> Путь к конфиг файлу (default: .gitversereleaserc.json)
751
+ --package <name> Имя пакета для релиза (для монорепо)
752
+ --version <version> Указать конкретную версию
753
+ --prerelease [tag] Создать prerelease версию (beta, alpha, rc)
754
+ --no-commit Не создавать git коммит
755
+ --no-tag Не создавать git тег
756
+ --no-push Не пушить в remote
757
+ --no-release Не создавать GitVerse Release
758
+ --verbose Подробный вывод
759
+ --help Показать справку
760
+ ```
761
+
762
+ ### Опции для generate-commitlint
763
+
764
+ ```
765
+ Опции:
766
+ --output <path> Путь для вывода (default: commitlint.config.ts)
767
+ --format <ts|js|json> Формат файла (default: ts)
768
+ --scopes <scopes> Дополнительные scopes (comma-separated)
769
+ --scope-required Требовать обязательный scope
770
+ --header-max-length <n> Максимальная длина header (default: 100)
771
+ --no-comments Отключить комментарии в файле
772
+ --dry-run Preview без записи
773
+ --verbose Подробный вывод
774
+ ```
775
+
776
+ ### Опции для publish-binaries / generate-binary-packages
777
+
778
+ ```
779
+ Опции:
780
+ --dry-run Preview без изменений
781
+ --version <ver> Override версии (default: из package.json)
782
+ --platforms <list> Конкретные платформы (comma-separated)
783
+ --generate-only Только генерация, без публикации
784
+ --skip-main-package Не обновлять основной package.json
785
+ --verbose Подробный вывод
786
+ ```
787
+
788
+ ## CI/CD интеграция
789
+
790
+ ### GitVerse Actions
791
+
792
+ ⚠️ **Перед использованием:** Убедитесь, что `GVR_TOKEN` добавлен в Secrets репозитория (см. [Настройка GVR_TOKEN](#️-настройка-gitverse_token))
793
+
794
+ ```yaml
795
+ name: Release
796
+
797
+ on:
798
+ workflow_dispatch:
799
+
800
+ env:
801
+ # ОБЯЗАТЕЛЬНО: Добавьте GVR_TOKEN в Secrets репозитория!
802
+ GVR_TOKEN: ${{ secrets.GVR_TOKEN }}
803
+
804
+ jobs:
805
+ release:
806
+ runs-on: ubuntu-latest
807
+ steps:
808
+ - uses: actions/checkout@v4
809
+ with:
810
+ fetch-depth: 0
811
+
812
+ - uses: oven-sh/setup-bun@v2
813
+
814
+ - run: bun install
815
+
816
+ # ВАЖНО: Проверка наличия токена перед релизом
817
+ - name: Validate GVR_TOKEN
818
+ run: |
819
+ if [ -z "$GVR_TOKEN" ]; then
820
+ echo "❌ ERROR: GVR_TOKEN is not set!"
821
+ echo "Please add GVR_TOKEN to repository secrets."
822
+ echo "See: Settings → Secrets and Variables → Actions"
823
+ exit 1
824
+ fi
825
+ echo "✅ GVR_TOKEN is configured"
826
+
827
+ - name: Configure Git
828
+ run: |
829
+ git config user.name "GitVerse CI"
830
+ git config user.email "ci@gitverse.ru"
831
+
832
+ - name: Create Release
833
+ run: bun run release
834
+ ```
835
+
836
+ **Что происходит в этом workflow:**
837
+ 1. ✅ Проверяет наличие `GVR_TOKEN` (workflow упадет с ошибкой, если токен не настроен)
838
+ 2. ✅ Устанавливает зависимости
839
+ 3. ✅ Настраивает git для создания коммитов
840
+ 4. ✅ Создает релиз с полным функционалом (CHANGELOG, теги, GitVerse release)
841
+ 5. ✅ Автоматически публикует в GitVerse
842
+
843
+ ## Разработка
844
+
845
+ ```bash
846
+ # Установка зависимостей
847
+ bun install
848
+
849
+ # Запуск тестов
850
+ bun test
851
+
852
+ # Проверка покрытия
853
+ bun test:coverage
854
+
855
+ # Сборка проекта
856
+ bun run build
857
+
858
+ # Линтинг
859
+ bun run lint
860
+ bun run lint:fix
861
+ ```
862
+
863
+ ## Лицензия
864
+
865
+ MIT © [ONREZA](https://onreza.ru)
866
+
867
+ ## Полезные ссылки
868
+
869
+ - [GitVerse SDK](https://gitverse.ru/onreza/release-tool) - Основной репозиторий
870
+ - [Conventional Commits](https://www.conventionalcommits.org/ru/) - Спецификация
871
+ - [Keep a Changelog](https://keepachangelog.com/ru/) - Руководство по CHANGELOG
872
+ - [Semantic Versioning](https://semver.org/lang/ru/) - Семантическое версионирование
873
+ - [npm пакет](https://www.npmjs.com/package/onreza-release)
874
+
875
+ ## Сообщить об ошибке
876
+
877
+ Создайте issue на [GitVerse](https://gitverse.ru/onreza/release-tool/tasktracker)
878
+
879
+ ---
880
+
881
+ Сделано с ❤️ для GitVerse