Agent skill
release-workflow
バージョン整合性チェック→提案→承認→GitHub Release作成までの標準リリースフロー(マルチエコシステム対応)
Stars
163
Forks
31
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/release-workflow
SKILL.md
リリースワークフロー
バージョン提案 → ユーザー承認 → リリース作成までの標準フローを定義する。
フロー概要
0.5. バージョン整合性チェック(ハードコード検出)
↓
1. バージョン提案(Sisyphusが自動計算)
↓
2. ユーザーがバージョンを承認/変更
↓
3. リリース実行(自動)
- ハードコードバージョン修正(検出時)
- バージョンファイル更新
- CHANGELOG.md更新
- コミット & タグ作成
- push
- GitHub Release作成
- Release Workflow完了待機
実装環境
container-use不要
リリースワークフローではcontainer-useは不要です。
| 理由 | 説明 |
|---|---|
| コード変更なし | バージョンファイル(Cargo.toml等)とCHANGELOG.mdのみ更新 |
| ドキュメント操作のみ | 実行可能コードの変更を伴わない |
| タグ・リリース操作 | Gitタグ作成とGitHub Release操作のみ |
ホスト環境で直接実行
bash
# リリース作業はホスト環境で直接実行
git add Cargo.toml CHANGELOG.md
git commit -m "chore: release v<version>"
git tag -a v<version> -m "Release v<version>"
git push origin <default-branch> --tags
gh release create v<version> ...
対応エコシステム
| エコシステム | バージョンファイル | 検出条件 |
|---|---|---|
| Rust | Cargo.toml |
Cargo.toml 存在 |
| Node.js | package.json |
package.json 存在 |
| Python (pyproject) | pyproject.toml |
pyproject.toml 存在 |
| Python (setup.py) | setup.py |
setup.py 存在 |
| Go | タグのみ | go.mod 存在 |
| Generic | VERSION |
VERSION ファイル存在 |
| Tag-only | なし | 上記いずれも該当しない |
自動検出の優先順位
Cargo.toml→ Rustpackage.json→ Node.jspyproject.toml→ Python (pyproject)setup.py→ Python (setup.py)go.mod→ GoVERSION→ Generic- いずれもなし → Tag-only
Note: 複数のエコシステムファイルが存在する場合、上記の優先順位で最初にマッチしたものを使用します。 スクリプトは検出時に警告を表示します。
Phase 0.5: バージョン整合性チェック
リリース前にコードベース内のハードコードされたバージョンを検出し、修正を提案する。
0.5.1 目的
- ハードコードされたバージョン文字列の検出
- 推奨パターン(動的バージョン取得)への移行提案
- リリース時のバージョン不整合を防止
0.5.2 エコシステム別チェックパターン
Rust
| パターン | 検索コマンド | 問題 | 推奨修正 |
|---|---|---|---|
#[command(version = "x.x.x")] |
rg '#\[command\(version\s*=' --type rust |
clap属性にハードコード | #[command(version)] |
const VERSION: &str = "x.x.x" |
rg 'const\s+VERSION.*=.*"\d+\.\d+' --type rust |
定数定義 | env!("CARGO_PKG_VERSION") |
static VERSION |
rg 'static\s+VERSION.*=.*"\d+\.\d+' --type rust |
static定義 | env!("CARGO_PKG_VERSION") |
Node.js
| パターン | 検索コマンド | 問題 | 推奨修正 |
|---|---|---|---|
const version = "x.x.x" |
rg 'const\s+version\s*=\s*["\x27]\d+\.\d+' --type js --type ts |
定数定義 | require('./package.json').version |
VERSION = "x.x.x" |
rg 'VERSION\s*=\s*["\x27]\d+\.\d+' --type js --type ts |
大文字定数 | process.env.npm_package_version |
.version("x.x.x") |
rg '\.version\(["\x27]\d+\.\d+' --type js --type ts |
メソッドチェーン | 動的取得に変更 |
Python
| パターン | 検索コマンド | 問題 | 推奨修正 |
|---|---|---|---|
__version__ = "x.x.x" |
rg '__version__\s*=\s*["\x27]\d+\.\d+' --type py |
モジュールバージョン | importlib.metadata.version("pkg") |
VERSION = "x.x.x" |
rg 'VERSION\s*=\s*["\x27]\d+\.\d+' --type py |
定数定義 | importlib.metadata.version("pkg") |
version="x.x.x" in setup() |
rg 'version\s*=\s*["\x27]\d+\.\d+' setup.py |
setup.py内 | pyproject.tomlに移行 |
Go
| パターン | 検索コマンド | 問題 | 推奨修正 |
|---|---|---|---|
var Version = "x.x.x" |
rg 'var\s+[Vv]ersion\s*=\s*"\d+\.\d+' --type go |
変数定義 | -ldflags "-X main.Version=..." |
const Version = "x.x.x" |
rg 'const\s+[Vv]ersion\s*=\s*"\d+\.\d+' --type go |
定数定義 | -ldflagsでビルド時注入 |
0.5.3 共通チェックパターン(全エコシステム)
| パターン | 検索コマンド | 対応 |
|---|---|---|
| READMEバッジ | rg 'badge/v?\d+\.\d+\.\d+' README.md |
新バージョンに更新 |
| シールドバッジ | rg 'shields\.io.*\d+\.\d+\.\d+' README.md |
新バージョンに更新 |
| インストール例 | rg '@\d+\.\d+\.\d+' README.md |
新バージョンに更新 |
| ドキュメント内バージョン | rg 'v\d+\.\d+\.\d+' docs/ |
警告表示(確認必要) |
0.5.4 スクリプト実行
バージョン整合性チェックは release.sh に統合されています:
bash
# Phase 0.5 のみ実行
.opencode/skill/release-workflow/scripts/release.sh --version-check <new-version>
# 完全リリースフロー内で自動実行(デフォルト)
.opencode/skill/release-workflow/scripts/release.sh --version 1.2.3
# Phase 0.5 をスキップして実行
.opencode/skill/release-workflow/scripts/release.sh --version 1.2.3 --skip-version-check
依存:
rg(ripgrep)がインストールされている場合は高速検索を使用。 未インストールの場合はgrep -Eにフォールバック。
0.5.5 出力フォーマット
markdown
## バージョン整合性チェック結果
### ⚠️ 検出されたハードコードバージョン
| ファイル | 行 | 現在の値 | 種別 | 推奨対応 |
|---------|-----|---------|------|---------|
| src/cli/args.rs | 5 | `version = "0.1.0"` | Rust/clap | `#[command(version)]` に変更 |
| README.md | 12 | `badge/v0.1.0` | バッジ | `v{NEW_VERSION}` に更新 |
### 対応オプション
1. **自動修正を適用** → 推奨パターンに変換(コード変更あり)
2. **バージョン番号のみ更新** → 現在のパターンを維持し値のみ更新
3. **スキップ** → 警告のみ、修正なし
> 番号を選択してください(1-3):
0.5.6 自動修正ルール
| 種別 | 自動修正可能 | 修正内容 |
|---|---|---|
| Rust clap属性 | ✅ | version = "x.x.x" → version |
| Rust定数 | ✅ | "x.x.x" → env!("CARGO_PKG_VERSION") |
| READMEバッジ | ✅ | バージョン番号を新バージョンに置換 |
| Node.js定数 | ⚠️ 確認必要 | 使用箇所により異なる |
Python __version__ |
⚠️ 確認必要 | importlib使用可否による |
| Go変数 | ❌ 手動 | ビルドスクリプト修正が必要 |
| ドキュメント内 | ⚠️ 確認必要 | コンテキストによる |
0.5.7 Phase 0.5 スキップ条件
以下の場合はPhase 0.5をスキップ可能:
--skip-version-checkフラグ指定時- 前回リリースからコード変更がない場合(CHANGELOG.mdのみ等)
- ユーザーが明示的にスキップを選択
Phase 1: バージョン提案
1.1 エコシステム検出とバージョン取得
bash
# スクリプトを使用(推奨)
.opencode/skill/release-workflow/scripts/release.sh --detect
# または手動で検出
# Rust
grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/'
# Node.js
jq -r '.version' package.json
# Python (pyproject.toml)
grep '^version = ' pyproject.toml | head -1 | sed 's/version = "\(.*\)"/\1/'
# Python (setup.py)
grep -o "version=['\"][^'\"]*['\"]" setup.py | sed "s/version=['\"]\\([^'\"]*\\)['\"/\\1/"
# Go / Tag-only
git tag --sort=-version:refname | head -1 | sed 's/^v//'
# Generic
cat VERSION
1.2 変更内容の分析
bash
# 前回リリースからのコミットを取得
git log <last-tag>..HEAD --oneline
1.3 セマンティックバージョニング判定
| 変更種別 | バージョン変更 | 例 |
|---|---|---|
| Breaking Change | MAJOR (x.0.0) | API変更、後方互換性なし |
| 新機能追加 | MINOR (0.x.0) | 機能追加、後方互換性あり |
| バグ修正 | PATCH (0.0.x) | バグ修正、リファクタリング |
1.4 提案フォーマット
markdown
## リリース提案
### エコシステム
<detected-ecosystem>
### 現在のバージョン
v0.4.0
### 前回リリースからの変更
- feat: 新機能追加(#XX)
- fix: バグ修正(#YY)
### 提案バージョン
**v0.5.0** (MINOR: 新機能追加)
### 変更種別
- ✨ 新機能: N件
- 🐛 バグ修正: N件
- 📝 ドキュメント: N件
---
**このバージョンでリリースしますか?**
1. **提案バージョンで続行** → v0.5.0 でリリース開始
2. **バージョン変更** → 手動でバージョンを入力
3. **キャンセル** → リリース中止
> 番号を選択してください(1-3):
参照: {{skill:approval-gate}} 形式に準拠
Phase 2: ユーザー承認
ユーザーがバージョンを承認または変更するまで待機。
| 選択 | アクション |
|---|---|
| 1 | 提案バージョンでリリース |
| 2 | 指定バージョンでリリース(入力プロンプト) |
| 3 | リリース中止 |
Phase 3: リリース実行
3.1 バージョンファイル更新
bash
# スクリプトを使用(推奨)
.opencode/skill/release-workflow/scripts/release.sh --update-version <new-version>
# または手動で更新(エコシステム別)
Rust (Cargo.toml)
bash
sed -i '' 's/^version = ".*"/version = "<new-version>"/' Cargo.toml
Node.js (package.json)
bash
npm version <new-version> --no-git-tag-version
# または
jq '.version = "<new-version>"' package.json > tmp.json && mv tmp.json package.json
Python (pyproject.toml)
bash
sed -i '' 's/^version = ".*"/version = "<new-version>"/' pyproject.toml
Python (setup.py)
bash
sed -i '' "s/version=['\"][^'\"]*['\"]/version='<new-version>'/" setup.py
Generic (VERSION)
bash
echo "<new-version>" > VERSION
Go / Tag-only
バージョンファイル更新なし(タグのみ)
3.2 CHANGELOG.md更新
変更内容を ## [Unreleased] の下に追加:
markdown
## [<new-version>] - <YYYY-MM-DD>
### Added
- 機能追加項目
### Fixed
- バグ修正項目
### Changed
- 変更項目
3.3 コミット & タグ作成
bash
# スクリプトを使用(推奨)
.opencode/skill/release-workflow/scripts/release.sh --commit <new-version>
# または手動
git add -A
git commit -m "chore: release v<new-version>"
git tag -a v<new-version> -m "Release v<new-version> - <summary>"
git push origin <default-branch> --tags
3.4 GitHub Release作成
bash
# スクリプトを使用(推奨)
.opencode/skill/release-workflow/scripts/release.sh --create-release <new-version> "<release-notes>"
# または手動
gh release create v<new-version> \
--title "v<new-version> - <summary>" \
--notes "<release-notes>"
3.5 Release Workflow完了待機
bash
# スクリプトを使用(推奨)
.opencode/skill/release-workflow/scripts/release.sh --watch
# または手動
gh run list --workflow=Release --limit 1
gh run watch <run-id>
3.6 リリースアセット確認
bash
gh release view v<new-version> --json tagName,assets --jq '.tagName, (.assets[].name)'
スクリプト使用方法
.opencode/skill/release-workflow/scripts/release.sh を使用することで、上記の処理を自動化できます。
基本コマンド
bash
# エコシステム検出とバージョン表示
.opencode/skill/release-workflow/scripts/release.sh --detect
# 完全自動リリース(対話モード)
.opencode/skill/release-workflow/scripts/release.sh
# バージョン指定リリース
.opencode/skill/release-workflow/scripts/release.sh --version 1.2.3
# ドライラン(実行せずに確認)
.opencode/skill/release-workflow/scripts/release.sh --dry-run --version 1.2.3
個別操作
bash
# バージョン更新のみ
.opencode/skill/release-workflow/scripts/release.sh --update-version 1.2.3
# コミット & タグのみ
.opencode/skill/release-workflow/scripts/release.sh --commit 1.2.3
# GitHub Release作成のみ
.opencode/skill/release-workflow/scripts/release.sh --create-release 1.2.3 "Release notes here"
# Workflow監視
.opencode/skill/release-workflow/scripts/release.sh --watch
リリースノートテンプレート
markdown
## <project-name> v<version>
### ✨ 新機能
#### <機能名>
<説明>
### 🐛 バグ修正
- <修正内容> (#<issue-number>)
### 📝 ドキュメント
- <ドキュメント変更>
---
### インストール方法
```bash
# エコシステムに応じたインストールコマンド
動作確認
bash
<command> --version
システム要件
- <要件>
---
## CHANGELOG.md テンプレート
```markdown
## [<version>] - <YYYY-MM-DD>
### Added
- **<機能名>**: <説明> (#<issue>)
- <詳細1>
- <詳細2>
### Fixed
- **<修正名>**: <説明> (#<issue>, #<pr>)
### Changed
- **<変更名>**: <説明>
### Deprecated
- **<非推奨名>**: <説明>
### Removed
- **<削除名>**: <説明>
### Security
- **<セキュリティ修正>**: <説明>
エラーハンドリング
タグが既に存在する場合
bash
# エラー: tag 'v0.5.0' already exists
git tag -d v<version> # ローカル削除
git push origin :refs/tags/v<version> # リモート削除
# 再度タグ作成
Release Workflow失敗時
bash
# ワークフロー再実行
gh run rerun <run-id>
# または手動でリリースアセットをアップロード
gh release upload v<version> <asset-file>
チェックリスト
リリース前
- 全テスト通過
- Lint通過
- デフォルトブランチが最新
- 未マージのPRなし
- バージョン整合性チェック完了(Phase 0.5)
リリース中
- ハードコードバージョン修正(検出時)
- バージョンファイル更新
- CHANGELOG.md更新
- コミット & タグ作成
- push完了
- GitHub Release作成
リリース後
- Release Workflow完了
- アセットが正しくアップロード
- リリースノートの内容確認
関連ドキュメント
| ドキュメント | 内容 |
|---|---|
| Keep a Changelog | CHANGELOG形式の標準 |
| Semantic Versioning | バージョニング規約 |
| release.sh スクリプト | リリース自動化スクリプト |
| {{skill:workflow-phase-convention}} | Phase番号体系(release-workflowセクション参照) |
| {{skill:approval-gate}} | 承認ゲートの共通フォーマット |
変更履歴
| 日付 | バージョン | 変更内容 |
|---|---|---|
| 2026-01-17 | 3.1.0 | 承認ゲート形式を番号形式に統一。workflow-phase-convention参照を追加。複数エコシステム警告を追加 |
| 2026-01-17 | 3.0.0 | Phase 0.5(バージョン整合性チェック)追加。エコシステム別ハードコード検出パターン定義。自動修正ルール追加 |
| 2026-01-10 | 2.0.0 | マルチエコシステム対応(Rust, Node.js, Python, Go, Generic)。release.sh スクリプト追加 |
| 2026-01-09 | 1.0.0 | 初版作成(Rust専用) |
Didn't find tool you were looking for?