このコマンドは、CHANGELOG.mdから該当バージョンのエントリーを抽出し、annotated tagを自動作成します。
Creates annotated Git tags by extracting version entries from CHANGELOG.md.
/plugin marketplace add sumik5/sumik-claude-plugin/plugin install sumik@sumikこのコマンドは、CHANGELOG.mdから該当バージョンのエントリーを抽出し、annotated tagを自動作成します。
/gittag <タグ名>
<タグ名>: 必須。作成するタグ名を指定します(例: v1.2.0)タグ名は以下の規則に従う必要があります:
v + セマンティックバージョニング(MAJOR.MINOR.PATCH)v1.0.0, v2.1.3, v0.5.0v プレフィックスv1.0.0-beta.1, v2.0.0+20250104)以下の場合はエラーを返します:
エラー: タグ名が指定されていません。使用方法: /gittag <タグ名>エラー: タグ名の形式が不正です。正しい形式: v1.0.0エラー: CHANGELOG.mdが見つかりませんエラー: CHANGELOG.mdに <タグ名> のエントリーが見つかりません警告: タグ '<タグ名>' は既に存在します# 正しい使用例
/gittag v1.2.0
# → CHANGELOG.mdから [v1.2.0] セクションを抽出
# → 内容をメッセージとしてannotated tagを作成
/gittag v2.0.0-beta.1
# → プレリリース版のタグを作成
# 誤った使用例(エラーになる)
/gittag # 引数なし
/gittag 1.2.0 # v プレフィックスなし
/gittag v1.2 # パッチバージョンなし
まず、コマンドに渡された引数を検証してください:
引数の存在確認
引数が存在しない場合:
→ エラーメッセージを表示: "エラー: タグ名が指定されていません。使用方法: /gittag <タグ名>"
→ 処理を終了
タグ名の形式検証
正規表現パターン: ^v\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$
形式が不正な場合:
→ エラーメッセージを表示: "エラー: タグ名の形式が不正です。正しい形式: v1.0.0"
→ 処理を終了
タグ名を変数に保存
検証が成功した場合:
→ 引数で渡されたタグ名を変数 TAG_NAME に保存(例: v1.2.0)
→ 次のステップへ進む
以下を確認してください:
# CHANGELOG.mdの存在確認
test -f CHANGELOG.md && echo "CHANGELOG.md found" || echo "CHANGELOG.md not found"
注意:
既存タグの確認と処理:
# 指定されたタグが既に存在するか確認
git tag -l "<TAG_NAME>"
処理:
AskUserQuestion(
questions=[{
"question": f"タグ '{TAG_NAME}' は既に存在します。上書きしますか?",
"header": "タグ上書き",
"options": [
{"label": "上書きする", "description": "既存タグを削除して新規作成"},
{"label": "キャンセル", "description": "操作を中止"}
],
"multiSelect": False
}]
)
git tag -d <TAG_NAME>CHANGELOG.mdから該当バージョンのエントリーを抽出してください:
バージョンヘッダーの検出
パターン: ^##\s+\[?v?<バージョン番号>\]?
例:
- ## [v1.2.0] - 2025-10-04
- ## v1.2.0 - 2025-10-04
- ## [1.2.0] - 2025-10-04
注意:
v1.2.0 → 1.2.0エントリーの範囲
開始: 該当バージョンのヘッダー行
終了: 次のバージョンヘッダー(^##\s+\[?v?[0-9]+\.[0-9]+)が見つかるまで
または、ファイルの終わりまで
内容の整形
- ヘッダー行を含めて抽出
- 末尾の空行を削除
- セクション全体を文字列として保存
該当するバージョンエントリーが見つからない場合:
→ エラーメッセージを表示: "エラー: CHANGELOG.mdに <TAG_NAME> のエントリーが見つかりません"
→ 処理を終了
以下のbashコマンドでCHANGELOGエントリーを抽出してください:
# バージョン番号を抽出(vプレフィックスを除く)
VERSION_NUMBER=$(echo "$TAG_NAME" | sed 's/^v//')
# CHANGELOGエントリーを抽出
# 該当バージョンの見出しから次の見出しの直前まで抽出
CHANGELOG_ENTRY=$(sed -n "/^## \[v\?${VERSION_NUMBER}\]/,/^## \[v/p" CHANGELOG.md | sed '$d')
# 最後のセクションの場合(次の見出しがない場合)の処理
if [ -z "$CHANGELOG_ENTRY" ]; then
CHANGELOG_ENTRY=$(sed -n "/^## \[v\?${VERSION_NUMBER}\]/,\$p" CHANGELOG.md)
fi
# 末尾の空行を削除
CHANGELOG_ENTRY=$(echo "$CHANGELOG_ENTRY" | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}')
# エントリーが空でないか確認
if [ -z "$CHANGELOG_ENTRY" ]; then
echo "エラー: CHANGELOG.mdに $TAG_NAME のエントリーが見つかりません"
exit 1
fi
# 抽出結果を表示(デバッグ用)
echo "抽出されたエントリー:"
echo "$CHANGELOG_ENTRY"
注意:
sed -n "/^## \[v\?${VERSION_NUMBER}\]/,/^## \[v/p" で該当セクションを抽出\[v\? により、[v1.2.0] と [1.2.0] の両方に対応sed '$d' で最後の行(次のセクションのヘッダー)を削除$)までを抽出${VERSION_NUMBER})を使用して柔軟に対応CHANGELOG.mdの例:
# Changelog
## [v1.2.0] - 2025-10-04
### 追加
- 新しい機能Aを追加
- 機能Bのサポートを追加
### 修正
- バグXを修正
## [v1.1.0] - 2025-09-01
...
抽出結果(TAG_NAME = v1.2.0の場合):
## [v1.2.0] - 2025-10-04
### 追加
- 新しい機能Aを追加
- 機能Bのサポートを追加
### 修正
- バグXを修正
抽出した内容をユーザーに表示して確認してください:
タグ '<TAG_NAME>' を以下の内容で作成します:
----------------------------------------
<抽出したCHANGELOGエントリー>
----------------------------------------
AskUserQuestionで確認を求める:
AskUserQuestion(
questions=[{
"question": "このままタグを作成してよろしいですか?",
"header": "タグ作成",
"options": [
{"label": "作成する", "description": f"タグ '{TAG_NAME}' を作成"},
{"label": "キャンセル", "description": "タグ作成を中止"}
],
"multiSelect": False
}]
)
処理:
抽出したCHANGELOGエントリーをメッセージとしてannotated tagを作成します:
# annotated tagの作成
git tag -a "<TAG_NAME>" -m "<抽出したCHANGELOGエントリー>"
注意:
-a オプションで annotated tag を作成-m オプションで複数行のメッセージを指定タグ作成後、以下の情報をユーザーに表示してください:
✓ タグ '<TAG_NAME>' が正常に作成されました
リモートにプッシュするには:
git push origin <TAG_NAME>
すべてのタグをプッシュするには:
git push --tags
このコマンドは Keep a Changelog 形式のCHANGELOG.mdを想定しています:
# Changelog
## [v1.2.0] - 2025-10-04
### 追加
- 新機能について記載
### 変更
- 既存機能への変更について記載
### 修正
- 修正されたバグについて記載
## [v1.1.0] - 2025-09-01
...
Annotated tagは以下の情報を含みます:
Lightweight tagと異なり、完全なGitオブジェクトとして保存されます。
/changelog <タグ名> コマンドで先にCHANGELOGエントリーを作成