gitverse-release 3.5.0 → 3.7.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 CHANGED
@@ -17,6 +17,7 @@
17
17
  - ⚙️ **Гибкая конфигурация** через `.gitversereleaserc.json`
18
18
  - 🔧 **Автогенерация commitlint конфига** из release конфигурации
19
19
  - 🪝 **Хуки beforeCommit** для автоматической подготовки файлов перед релизом
20
+ - 📤 **Бинарная дистрибуция** — публикация платформенных npm-пакетов (по паттерну esbuild/biome)
20
21
 
21
22
  ## Установка
22
23
 
@@ -308,6 +309,250 @@ npx gitverse-release generate-commitlint --scope-required
308
309
  ✅ **Меньше ошибок** - нет риска рассинхронизации конфигов
309
310
  ✅ **CI-friendly** - легко интегрируется в pipelines для проверки актуальности конфига
310
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 gitverse-release publish-binaries --dry-run
327
+
328
+ # Только генерация пакетов (без публикации)
329
+ npx gitverse-release generate-binary-packages
330
+
331
+ # Генерация и публикация
332
+ npx gitverse-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 gitverse-release publish-binaries [options]
475
+
476
+ # Generate only (без публикации)
477
+ npx gitverse-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 gitverse-release publish-binaries
552
+ env:
553
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
554
+ ```
555
+
311
556
  ## Конфигурация
312
557
 
313
558
  ### Полный пример
@@ -358,6 +603,17 @@ npx gitverse-release generate-commitlint --scope-required
358
603
  "scopeRequired": false,
359
604
  "headerMaxLength": 100,
360
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
361
617
  }
362
618
  }
363
619
  ```
@@ -467,11 +723,20 @@ env:
467
723
  # Создать релиз
468
724
  npx gitverse-release [package] [options]
469
725
 
726
+ # Инициализировать конфигурацию
727
+ npx gitverse-release init [options]
728
+
470
729
  # Генерировать commitlint конфиг
471
730
  npx gitverse-release generate-commitlint [options]
472
731
 
473
732
  # Создать только GitVerse Release для существующего тега (recovery mode)
474
733
  npx gitverse-release create-only --tag <tag> [--package <name>]
734
+
735
+ # Публикация бинарных пакетов
736
+ npx gitverse-release publish-binaries [options]
737
+
738
+ # Генерация бинарных пакетов (без публикации)
739
+ npx gitverse-release generate-binary-packages [options]
475
740
  ```
476
741
 
477
742
  ### Опции для релиза
@@ -508,6 +773,18 @@ npx gitverse-release create-only --tag <tag> [--package <name>]
508
773
  --verbose Подробный вывод
509
774
  ```
510
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
+
511
788
  ## CI/CD интеграция
512
789
 
513
790
  ### GitVerse Actions
@@ -0,0 +1,74 @@
1
+ import type { BinaryCliOptions, BinaryDistributionResult } from "./types";
2
+ /**
3
+ * Генерирует бинарные пакеты без публикации.
4
+ *
5
+ * Эта функция создаёт платформенные npm-пакеты с бинарниками,
6
+ * но не публикует их. Используйте для подготовки пакетов перед публикацией.
7
+ *
8
+ * Процесс:
9
+ * 1. Загружает и валидирует конфигурацию
10
+ * 2. Проверяет наличие бинарников для каждой платформы
11
+ * 3. Генерирует package.json, README.md для каждого платформенного пакета
12
+ * 4. Копирует бинарники в соответствующие директории
13
+ * 5. Генерирует JS wrapper для основного пакета (если не skipMainPackage)
14
+ *
15
+ * @param options - Опции генерации
16
+ * @param options.config - Путь к конфиг-файлу
17
+ * @param options.version - Версия (по умолчанию из git tags)
18
+ * @param options.platforms - Конкретные платформы для генерации
19
+ * @param options.dryRun - Режим предпросмотра без записи файлов
20
+ * @param options.skipMainPackage - Не генерировать JS wrapper
21
+ * @returns Результат генерации с информацией об успешных и неудачных пакетах
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const result = await generateBinaryPackages({
26
+ * dryRun: true,
27
+ * platforms: ["linux-x64", "darwin-arm64"],
28
+ * });
29
+ *
30
+ * if (result.success) {
31
+ * console.log(`Generated ${result.packages.length} packages`);
32
+ * }
33
+ * ```
34
+ */
35
+ export declare function generateBinaryPackages(options?: BinaryCliOptions): Promise<BinaryDistributionResult>;
36
+ /**
37
+ * Генерирует и публикует бинарные пакеты в npm registry.
38
+ *
39
+ * Выполняет полный цикл бинарной дистрибуции:
40
+ * 1. Загружает и валидирует конфигурацию
41
+ * 2. Проверяет наличие бинарников для каждой платформы
42
+ * 3. Генерирует платформенные npm-пакеты (package.json, README.md, бинарник)
43
+ * 4. Публикует платформенные пакеты с retry при временных ошибках
44
+ * 5. Обновляет основной package.json с optionalDependencies
45
+ * 6. Генерирует JS wrapper для автоматического выбора бинарника
46
+ *
47
+ * Поведение при ошибках контролируется параметром `continueOnError` в конфиге:
48
+ * - `false` (default): останавливается при первой ошибке
49
+ * - `true`: продолжает, собирая ошибки в warnings
50
+ *
51
+ * @param options - Опции публикации
52
+ * @param options.config - Путь к конфиг-файлу
53
+ * @param options.version - Версия (по умолчанию из git tags)
54
+ * @param options.platforms - Конкретные платформы для публикации
55
+ * @param options.dryRun - Режим предпросмотра без записи файлов и публикации
56
+ * @param options.generateOnly - Только генерация, без публикации
57
+ * @param options.skipMainPackage - Не обновлять основной package.json
58
+ * @param options.verbose - Подробный вывод
59
+ * @returns Результат с информацией о сгенерированных и опубликованных пакетах
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // Dry-run для проверки
64
+ * const preview = await publishBinaries({ dryRun: true });
65
+ *
66
+ * // Реальная публикация
67
+ * const result = await publishBinaries({ verbose: true });
68
+ *
69
+ * if (!result.success) {
70
+ * console.error("Errors:", result.errors);
71
+ * }
72
+ * ```
73
+ */
74
+ export declare function publishBinaries(options?: BinaryCliOptions): Promise<BinaryDistributionResult>;