このドキュメントでは、CommandMateのバージョンアップとリリース手順を説明します。
本プロジェクトはセマンティックバージョニングに従います。
MAJOR.MINOR.PATCH
| 種別 | 更新タイミング | 例 |
|---|---|---|
| MAJOR | 破壊的変更(後方互換性のない変更) | v1.0.0 → v2.0.0 |
| MINOR | 後方互換性のある機能追加 | v1.0.0 → v1.1.0 |
| PATCH | 後方互換性のあるバグ修正 | v1.0.0 → v1.0.1 |
| 変更内容 | バージョン種別 |
|---|---|
| APIの削除・変更 | MAJOR |
| 設定ファイル形式の変更 | MAJOR |
| 環境変数名の変更(フォールバックなし) | MAJOR |
| 新機能の追加 | MINOR |
| 新APIの追加 | MINOR |
| 新しい設定オプションの追加 | MINOR |
| バグ修正 | PATCH |
| ドキュメント修正 | PATCH |
| リファクタリング(動作変更なし) | PATCH |
| 依存関係のアップデート(動作変更なし) | PATCH |
develop でバージョン更新(package.json / package-lock.json / CHANGELOG.md)
↓ chore: release vX.Y.Z
PR "release: vX.Y.Z"(develop → main)※レビュー承認必須
↓ squash マージ
main にタグ vX.Y.Z(annotated)
↓
GitHub Release 作成 ──→ publish.yml が発火 ──→ npm publish(自動・OIDC)
↓
main を develop へマージバック(-s ours・祖先復元)
| 前提 | 根拠 |
|---|---|
| main へ直接 push できない | .git/hooks/pre-push が protected_branch='main' で拒否する。PR が唯一の経路 |
| GitHub Release の作成 = npm への公開 | .github/workflows/publish.yml が release: [published] で発火し npm publish する。Release 作成は公開の実行と等価 |
| マージバックが必須 | develop → main の PR は squash されるため develop の祖先が切れる。放置すると次回 PR で幻コンフリクトが出る |
-
developを最新化(リリースは develop 基点。main 基点ではない)git checkout develop git pull origin develop git rev-list --left-right --count develop...origin/develop # 0 0 であること -
未コミットの変更がないことを確認
git status --porcelain # 空であることgit stashは避けてください。他のエージェントが同じ作業ツリーで稼働している場合、作業内容を破損させます。 -
品質チェックが全てパスすることを確認
npm run lint npx tsc --noEmit npm run test:unit npm run build
-
main に未反映の変更が実際にあることを確認
git fetch origin git diff --stat origin/main..origin/develop
注意:
git log origin/main..origin/developは squash の影響で実態より遥かに多くのコミットを表示します(実差分15ファイルに対し136コミット等)。tree 差分(git diff)が正です。
node -p "require('./package.json').version"上記の判断基準に従って次バージョンを決定します。
npm version 0.10.1 --no-git-tag-versionnpm version は package.json と package-lock.json の2箇所(root と packages[""])を同時に整合させます。手で書き換えないでください。
--no-git-tag-version は必須です。これが無いと npm がタグを打ち、後段の PR フローと衝突します。
## [Unreleased] の直後に新セクションを挿入します。
## [Unreleased]
## [0.10.1] - 2026-07-17
> **Highlight**: このリリースの中心を2〜4文で。何が問題で、何を変えたか。実測値があれば入れる。
### Added
- feat(scope): **要点を太字で**。補足説明 (#1234)
### Changed
- fix(docs): **要点**。補足説明 (#1234)
### Fixed
- fix(cli): **要点**。補足説明 (#1234)
## [0.10.0] - 2026-07-16規約:
- 比較リンク(
[X.Y.Z]: https://github.com/.../compare/...)は追加しない。0.5.2で止まっており、以降のリリースでは付けていません(既存の古いリンクはそのまま残す) - Issue 番号は
(#1234)形式。(Issue #1234)は v0.9.1 以前の旧表記 - conventional prefix(
feat(scope):/fix(scope):等)を付ける - 日付は JST 基準
- 該当が無いカテゴリの見出しは書かない
詳細は templates/changelog-entry.md を参照。
git add package.json package-lock.json CHANGELOG.md
git commit -m "chore: release v0.10.1"
git push origin develop変更はこの3ファイルのみであることを git diff --stat で確認してください。
gh pr create --repo Kewton/CommandMate --base main --head develop \
--title "release: v0.10.1" \
--body-file <(...)PR 本文に含める要素:
- リリース概要: 何のためのリリースか
- バージョン:
0.10.0 → 0.10.1(patch/minor/major の別) - DB マイグレーション: 有無(有る場合は
CURRENT_SCHEMA_VERSIONの遷移) - 実差分:
git diff --stat origin/main..origin/developの実数。「squash 履歴のためmain..developのコミット数は実態より多く表示される」旨を注記 - 対応 Issue 一覧
- 主な変更: Added / Changed / Fixed
- 品質チェック結果
CI 通過を確認します。
gh pr checks <PR番号> --repo Kewton/CommandMate --watchmain 向け PR はレビュー1名以上の承認が必須です(CLAUDE.md のルール)。承認後に squash でマージします。
マージ後に実行します。
git fetch origin --tags
MERGE_SHA=$(gh pr view <PR番号> --repo Kewton/CommandMate --json mergeCommit -q '.mergeCommit.oid')
# main と develop の tree が一致していること(内容ドリフトが無いことの証明)
[ "$(git rev-parse origin/main^{tree})" = "$(git rev-parse origin/develop^{tree})" ] && echo "tree 一致 OK"
git tag -a "v0.10.1" "$MERGE_SHA" -m "v0.10.1"
git push origin "v0.10.1"**annotated タグ(-a)**であること。過去のタグは全て annotated です。
リリースノートは CHANGELOG の該当セクションを転記します(--generate-notes は v0.9.1 までの形式)。
awk '/^## \[0\.10\.1\]/{f=1} /^## \[0\.10\.0\]/{f=0} f' CHANGELOG.md > /tmp/release-notes.md
gh release create "v0.10.1" --repo Kewton/CommandMate \
--title "v0.10.1" \
--notes-file /tmp/release-notes.md
⚠️ この時点でpublish.ymlが発火し npm publish が始まります。 Release の作成は「npm への公開を実行する」ことと等価です。取り消しは効きません(後述)。
gh run list --repo Kewton/CommandMate --workflow=publish.yml --limit 1
# status=completed conclusion=success になるまで待つ
npm view commandmate version # 新バージョンになること必須。 squash により main のコミットは develop の祖先ではなくなっています。放置すると次回の develop → main PR で幻コンフリクトが出ます。
git checkout develop
git pull origin develop
git merge -s ours origin/main -m "chore: merge release v0.10.1 to develop (restore ancestry)"
# tree が壊れていないことを検証(-s ours は develop の tree を保持する)
[ "$(git rev-parse origin/main^{tree})" = "$(git rev-parse develop^{tree})" ] && echo "tree 一致 OK"
git push origin develop効果を確認します。
git fetch origin
git merge-base --is-ancestor origin/main origin/develop && echo "祖先切れ解消 OK"npm publish を手元で実行しないでください。
.github/workflows/publish.yml が GitHub Release の published を契機に、npm Trusted Publishers(OIDC 認証)で npm publish --provenance --access public を実行します。
- ローカルには publish 用の認証がありません
- OIDC は GitHub Actions 実行時にしか成立しません
- ローカル実行では provenance(来歴証明)が付きません
ワークフローが失敗した場合も、ローカル publish で回避せず、原因を修正してください。
npm ci → npm audit --audit-level=critical → npm run test:unit → npm run build → npm run build:cli → npm run build:server → パッケージサイズ確認 → npm publish --provenance --access public
# タグ一覧の確認
git tag -l --sort=-v:refname | head -3
# GitHub Releases の確認
gh release view v0.10.1
# npm の反映確認
npm view commandmate version
npm view commandmate@0.10.1 dist --json # サイズ・provenance
# クリーンな環境で実際に取得できるか(中立ディレクトリで実行すること)
cd $(mktemp -d) && npx --yes commandmate@latest --version
npxの検証はリポジトリ外の中立ディレクトリで行ってください。CommandMate のリポジトリ内で実行すると、npx がローカルのbinを解決してしまい、公開物を検証したことになりません。
/release スキルを使用すると、上記の手順を実行できます。
/release patch # パッチバージョンアップ (0.10.0 → 0.10.1)
/release minor # マイナーバージョンアップ (0.10.0 → 0.11.0)
/release major # メジャーバージョンアップ (0.10.0 → 1.0.0)
/release 1.0.0 # 直接バージョン指定スキルも PR のマージは行いません(承認が必須のため)。
❌ Error: Direct push to 'main' is not allowed.
Please create a Pull Request instead.
.git/hooks/pre-push による正しい拒否です。--no-verify で回避しないでください。 Step 5 の PR フローに戻ってください。
# エラー: fatal: tag 'v0.10.1' already exists
# 対処: 別のバージョンを指定する既存タグの削除は、npm へ publish 済みの場合は無意味です(下記参照)。
gh run view <run-id> --repo Kewton/CommandMate --log-failed原因を修正し、新しいパッチバージョンでリリースし直してください。同一バージョン番号での再公開はできません。
⚠️ npm へ publish 済みの場合、実質的にロールバックできません。
- npm は公開済みバージョンの unpublish を厳しく制限しています(72時間以内などの条件付き)
- 一度使ったバージョン番号は、unpublish しても再利用できません
- GitHub Release やタグを削除しても、npm 上のパッケージは消えません
したがって、問題が見つかった場合の正しい対処は 修正して新しいパッチバージョンをリリースすることです。
publish 前(Release 作成前)であれば、以下で巻き戻せます。
git tag -d v0.10.1
git push origin :refs/tags/v0.10.1publish 後は、修正後に次のパッチバージョンでリリースしてください。
/releaseスキル — 手順の自動化- CHANGELOGエントリテンプレート
.github/workflows/publish.yml— Release 契機の自動 publish(OIDC).git/hooks/pre-push— main 直 push の拒否- Keep a Changelog
- Semantic Versioning
- CHANGELOG.md