リリース手順 (yarn release)
WingStats Manager(broadcast-Overlay)のリリース作業を yarn release 1 コマンドに集約するためのドキュメント。push と tag push は依然として人間の手作業で、CLAUDE.md の「リリース管理」原則を構造的に守る前提で書かれている。
🚧 自動化の範囲: version bump / CHANGELOG 追記 / release commit / annotated tag 作成。 🚫 自動化しない:
git push、git push --tags、package.json直接編集、CHANGELOG.md 直接編集(このスクリプト経由でのみ許可)。
0-A. リリーストラック(git-flow lite)
リリースは 2 トラックに分かれる。どちらも最終的に main で yarn release → tag を打つ。
| トラック | ブランチ | bump | 頻度 | 動線 |
|---|---|---|---|---|
| キャラ追加 | chars/* (off main) | patch | 高頻度 | chars/* → PR(base=main) → merge → yarn release patch → push+tag → 戻しマージ |
| 機能追加 | feature/* → develop | minor(破壊的は major) | 低頻度 | develop に集約 → develop→main PR(base=main) → yarn release minor → push+tag → 戻しマージ |
- バージョン番号で区別できる:
Z増加 = キャラ/修正、Y増加 = 機能。 - キャラは
mainからしか枝を切らないため、開発中(develop)の機能差分がキャラリリースに混ざらない。 - 緊急バグ修正は
fix/*(offmain) で patch リリースできる。
リリース完了後は必ず戻しマージを行う(次節「## 7. リリース後の戻しマージ」参照)。
0. 前提
- ブランチが
main(または--allow-branch <name>で明示的に許可) - working tree がクリーン(既ステージ / 未追跡変更なし)
yarn typecheck/yarn lint/yarn test:unit/yarn buildがローカルで passgit fetch --tagsが走る(スクリプトが自動で叩く)- 直近 tag 〜 HEAD に 少なくとも 1 つの Conventional Commit(
feat:/fix:/perf:等)がある
1. 基本手順
# 1) どの type で bump するかを決めてコマンドを叩く
yarn release patch # 1.2.3 → 1.2.4
yarn release minor # 1.2.3 → 1.3.0
yarn release major # 1.2.3 → 2.0.0
yarn release --version 1.5.0 # 明示指定(現状より大きい値のみ)
# 2) 事前チェックが順に流れる
# ✓ branch / clean tree / fetch / tag duplicate / yarn ci 系
# 3) CHANGELOG.draft.md がエディタで開く
# Conventional Commits を section 別に分類した markdown が入っている
# 必要に応じて文面を整え、エディタを閉じて保存
# 4) スクリプトが続きを実行
# - package.json の version 書き換え
# - CHANGELOG.md の先頭にドラフトを挿入
# - release commit + annotated tag を作成(local のみ)
# 5) 「次のコマンド」が表示される
# git push origin main
# git push origin v1.2.4
# → これは **手動で**実行してください2. オプション
| フラグ | 用途 |
|---|---|
--no-edit | エディタを開かずドラフトをそのまま採用(CI / 自動化時のみ推奨) |
--dry-run | ファイル / commit / tag を一切書き換えず、出力だけ確認 |
--skip-checks | yarn typecheck / lint / test:unit / build を skip(直前に手で全部走らせた前提) |
--allow-branch <name> | main 以外で release を許可(hotfix リハーサル等) |
--draft <path> | ドラフトの出力先を指定(既定: ./CHANGELOG.draft.md) |
-h / --help | ヘルプ |
3. 失敗時の戻し方
スクリプトは 作業内容を消さない設計(git reset --hard を使わない)。各失敗ケースの状態:
| 失敗ポイント | スクリプトがやること | 手動で必要なら |
|---|---|---|
| prechecks 失敗 | 何も書き換えていない、そのまま exit 1 | 警告に従って fix |
| エディタ異常終了 | CHANGELOG.draft.md を消し、何も書き換えていない | — |
| draft が空 | CHANGELOG.draft.md を消し、何も書き換えていない | — |
| ファイル書き換え後の失敗 | git restore --staged --worktree で package.json / CHANGELOG.md を HEAD に戻す | — |
| commit 後の tag 失敗 | git reset --soft HEAD^ で release commit を取消 + ファイル復元 | — |
| Ctrl+C 中断 | 同上(commit があれば soft reset、ファイル変更は restore) | — |
release を完全に取り消したい
push する前なら:
git tag -d vX.Y.Z # local tag を消す
git reset --soft HEAD^ # release commit を取り消し(変更は staging に残る)
git restore --staged --worktree -- package.json CHANGELOG.mdpush 済みで取り消したい場合は、tag を delete + revert commit を別途作成する(ここではフォローしない、慎重に)。
4. push(手動)
スクリプト終了時の表示に従う。必ず両方 push する:
git push origin main
git push origin vX.Y.Ztag を push すると .github/workflows/release.yml が起動し、GitHub Release + NSIS / Portable build が自動で作られる。tag を push しないとビルドは走らない。
4-A. リリース成果物の構成(3 exe)
recording-service-split (Phase F) 以降、インストール先($INSTDIR = win-unpacked と同一構成)には 3 つの起動エントリが並ぶ。実体は同一バイナリのコピーで、モード分岐は起動時の exe 名判定(argv フラグが常に優先)に委ねる。
| exe | 生成方法 | subsystem | 役割 |
|---|---|---|---|
WingStats Manager.exe | electron-builder の原本 | GUI | 既定 = Manager(overlayManager。管理画面 + オーバーレイ) |
WingStats Recorder.exe | afterPack hook がコピー + PE subsystem を Console 化 | Console | 常駐録画サービス(トレイ + ログ監視。UI 抑制) |
WingStats Viewer.exe | afterPack hook がコピー(パッチなし) | GUI | 軽量確認クライアント(戦績ウィンドウ 1 枚) |
- モード判定の優先順位:
--recorder-modeフラグ > exe 名 "recorder" >--viewer-modeフラグ > exe 名 "viewer" > 既定 Manager(detectRecorderMode/detectViewerMode)。 - ショートカット: Desktop = Manager + Recorder の 2 本 / Start Menu = 3 本(Manager は electron-builder 標準、Recorder / Viewer は
build/installer.nshの customInstall)。HKCU Run キー(自動起動)は Recorder のみ。 - portable 版: afterPack は win-unpacked に対して走るため portable にも 3 exe が同梱される(起動 UX は従来どおり Manager のみ)。
- app.asar / DLL / dist は 3 exe で共有(1 セットのみ)。Viewer.exe は Manager.exe とバイト同一(署名・SmartScreen レピュテーションを共有)、Recorder.exe のみ 2 バイトの subsystem パッチでハッシュが異なる。
サイズ目安
| 成果物 | サイズ目安 |
|---|---|
NSIS インストーラ (WingStats Manager Setup x.y.z.exe) | 約 234 MB(実測: 3 exe 世代の初回ビルド。2 exe 世代 5.3.1 は 174.4MB) |
Portable (WingStats Manager x.y.z.exe) | 約 234 MB(実測) |
インストール後 $INSTDIR 合計 | 約 831 MB(実測: exe 3 本 × 約 201MB + 共有 resources) |
| exe 単体(3 本とも同等) | 約 201MB(v5.4.0 世代の実測) |
exe コピー方式のため 2 exe 時代(インストーラ 174.5MB / win-unpacked 629MB)から約 +50MB / +201MB 増える。7z solid 圧縮の LZMA 辞書(≤64MB)は 201MB の同一ファイル重複を除去できないため、インストーラも exe 追加分だけ素直に増える。サイズ最適化(NSIS ハードリンク化 / launcher stub 化)は苦情が出た場合の post-F 候補。
5. CHANGELOG ドラフトの作り方(参考)
scripts/release/generateChangelog.ts の純粋関数で、vX.Y.Z..HEAD の commit を以下のルールで分類する:
| commit type | section |
|---|---|
feat: / feature: | ✨ 新機能・アップデート |
fix: / revert: | 🐛 バグ修正 |
perf: / refactor: / style: | 🔧 改善 |
docs: / test: / build: / ci: / chore: | 🛠 内部 / ドキュメント |
type!: または body に BREAKING CHANGE: | 💥 破壊的変更(最上段に出る) |
Merge pull request / Merge branch で始まるコミットと、release: vX.Y.Z 系の自前リリース commit は CHANGELOG に含めない。
7. リリース後の戻しマージ(main → develop)
yarn release で main にリリース commit + tag が乗ったら、その内容を develop にも反映する。 これを忘れると次の機能リリースでキャラ差分が二重に出たり競合する。
# 確認(副作用なし)
pwsh -NoProfile -File ./scripts/dev/sync-main-to-develop.ps1 -DryRun
# 実行(develop に checkout → main を merge → push)
pwsh -NoProfile -File ./scripts/dev/sync-main-to-develop.ps1- merge のみを使う(rebase / reset --hard / force push は禁止)。
- push したくない場合は
-NoPush。 - 実行後はカレントが
developになるので、続けて作業しないならgit checkout mainで戻る。
6. 関連リンク
CLAUDE.mdリリース管理項 — 自動化禁止事項・原則CHANGELOG.md— 出力先 / 既存書式の参照.spec-workflow/specs/release-workflow-helper/— 設計と実装ログ