name: releasing description: Dayopt の release 作業を end-to-end で実行する時に発動。明示的な release 意図(「v0.X.0 をリリース」「リリースしたい」「タグを切る」)を契機に、現在の git state(feature branch / main / tag 状態)を自動判定し、適切な Phase(version bump → 品質チェック → PR merge → tag → GitHub Release → リリースノート)から開始する。明示的な release 意図がない限り他のトリガーでは発動しない。 effort: high maxTurns: 25
Releasing Skill
Dayoptプロジェクトのリリース作業を安全かつ確実に実行するためのスキルです。
When to Use
明示発動型 — この skill はユーザーの explicit な release 意図のみを契機に発動する(コード変化や他 skill からの handoff では発動しない)。
- 「v{n}.{n}.{n} をリリースしたい」「リリース作業を進める」等、明確な release 意図が発話された時
- tag 作成(
git tag v...)や GitHub Release 作成を明示的に指示された時 package.jsonのversionフィールドを bump する作業を指示された時- 既存タグに対応する GitHub Release / リリースノートを更新・作成する指示時
When NOT to Use
この skill は explicit release 意図のみを契機とする。暗黙的な invocation ケースは該当なし(型の穴埋めとして明記)。参考として近接するが発動しないケース:
- 単なる
mainへの merge(tag / release を伴わない)→ 通常の git 操作 - commit 作成のみで version bump を含まない時 → 通常の development flow
- Breaking change を含む変更が release 作業と分離されている時 →
docs-writingskill で ADR / 技術ドキュメント更新を先行
状態自動判定
スキル起動時、まず現在の状態を判定して適切なフェーズから開始する:
ユーザー: 「v0.17.0リリースしたい」
│
├─ featureブランチにいる?(PRがオープン)
│ └─ Phase 0 から: version bump → 品質チェック → PRマージを促す → タグ → リリースノート
│
├─ mainにいてタグがまだ?
│ └─ Phase 1 から: promote 完了確認 → 観察 → タグ作成・push → リリースノート
│ (Production Release status が success になるまでタグを打たない)
│
├─ タグはあるがReleaseがまだ?
│ └─ Phase 2 から: GitHub Actions確認 → リリースノート
│
└─ タグもReleaseも既にある?
└─ Phase 3 から: リリースノート上書きのみ
判定コマンド
# 1. 現在のブランチを確認
git branch --show-current
# 2. タグの存在確認
git tag -l "v${VERSION}"
# 3. GitHub Releaseの存在確認
gh release view v${VERSION} 2>/dev/null && echo "exists" || echo "not found"
# 4. package.json の現在バージョン
node -p "require('./package.json').version"
リリースワークフロー
Phase 0: 準備(featureブランチにいる場合)
├── 0.1 バージョン番号決定・重複チェック ← 最重要
├── 0.2 package.json バージョン更新(このPRに含める)
└── 0.3 コード品質確認(lint, typecheck, test, build)
→ ユーザーにPRマージを促す
Phase 1: Production公開の確認とタグ作成(mainブランチ)
├── 1.1 mainブランチ最新取得
├── 1.2 Production Release の promote 完了を待つ
├── 1.3 Production を観察する(主要route / Sentry)
├── 1.4 Gitタグ作成・プッシュ(promote成功の証跡)
└── 1.5 GitHub Release作成の確認(auto-generated notes)
Phase 2: リリースノート反映
├── 2.1 前回リリース以降の全PRを取得
├── 2.2 詳細なリリースノートを作成
└── 2.3 gh release edit で GitHub Release に反映
Phase 3: リリース後作業
├── 3.1 デプロイ確認
└── 3.2 Sentry監視
必須チェック項目
Phase 0.1: バージョン重複チェック(スキップ厳禁)
# 1. 既存リリースを確認
gh release list
# 2. 重複チェック
VERSION="0.X.0" # リリースするバージョン
gh release view v${VERSION} 2>/dev/null && echo "❌ Already exists!" || echo "✅ OK"
重複が見つかった場合: 必ず「v0.X.0ではなくv0.Y.0じゃないですか?」と確認する
Phase 0.2: package.json バージョン更新
# 現在のPRブランチでバージョンを更新
npm version ${VERSION} --no-git-tag-version
# → コミットに含める(タグ打ち前にmainのpackage.jsonが正しい状態になる)
ポイント: リリース前の最後のPRにversion bumpを含めることで、タグ打ち後の後片付けがゼロになる。
Phase 0.3: コード品質
pnpm lint && pnpm typecheck && pnpm test:run && pnpm build
Phase 1.1: mainブランチ最新取得
git checkout main
git pull origin main
Phase 1.2: Production promote の完了を待つ
main への merge は Product / Web の Production build を作るだけで、Production domain は切り替わらない。Production Release workflow が同一 SHA の両 candidate を smoke・監査してから promote する。
# promote の実行状況を確認
gh run list --workflow=release.yml --limit 1
gh run watch --exit-status
# 対象 SHA が Production に出たことを確認
gh api "repos/Dayopt/dayopt/commits/$(git rev-parse HEAD)/status" \
--jq '.statuses[] | select(.context == "Production Release") | .state'
success にならないうちはタグを打たない。失敗時は docs/operations/runbook.md の Playbook 2 に従う。
Phase 1.3: Production を観察する
promote 直後に主要 route と監視を確認する。異常があればタグを打たず、runbook の rollback 手順へ移る。
curl -s -o /dev/null -w "%{http_code}\n" https://dayopt.app/
curl -s -o /dev/null -w "%{http_code}\n" https://app.dayopt.app/api/health
Sentry の新規 issue と Vercel の runtime log も確認する。
Phase 1.4: Gitタグ作成・プッシュ
観察まで終わってからタグを打つ。タグは deploy trigger ではなく、Production 公開が成功した証跡である。
git tag v${VERSION}
git push origin v${VERSION}
create-release.yml はタグ SHA の Production Release status が success であることを確認してから GitHub Release を作成する。未 promote の SHA にタグを打つと、この検証で止まる。
Phase 1.5: Release 作成の確認
gh run list --workflow=create-release.yml --limit 1
gh release view v${VERSION}
Phase 2: リリースノート反映(詳細化必須)
Step 1: PRとコミット情報を取得
# 前回リリース以降の全PRを取得
gh pr list --state merged --base main --limit 100 --json number,title,mergedAt
# 各PRのコミット詳細を取得(重要:PRタイトルだけでは不十分)
for pr in <PR番号リスト>; do
echo "=== PR #$pr ==="
gh pr view $pr --json title,body --jq '.title + "\n" + .body'
echo "--- Commits ---"
gh pr view $pr --json commits --jq '.commits[].messageHeadline'
done
Step 2: 詳細なリリースノートを作成
粒度の基準: 第三者が見ても「何が変わったか」がわかるレベル
構造テンプレート: docs/operations/runbook.md を参照
❌ 悪い例(抽象的):
- タグ機能リファクタリング
- パフォーマンス改善
✅ 良い例(具体的):
#### タグ機能の大幅強化 ([#910])
**データモデル変更**
- タグの親子階層モデルへ移行(`tag_groups` テーブル → `parent_id` カラム)
- 子タグの昇格処理を含むタグマージ機能
**UI/UX改善**
- タグ作成モーダルをポータルで実装(モーダル内でも正常動作)
- カレンダーサイドバーでのタグドラッグ&ドロップ並び替え
- 未タグ付けフィルターにアイコンと件数表示
**楽観的更新**
- タグ作成・編集・削除・マージ・並び替えに楽観的更新を実装
Step 3: 必須セクション
カテゴリは docs/operations/runbook.md 第4部「リリースノート執筆規約」の5分類に従う(Web版リリースノート docs-writing skill とも共通のタクソノミー。ここでは再定義しない):
- 新機能: 機能名 + 具体的な実装内容
- 改善: 何がどう変わったか + 影響範囲(パフォーマンス最適化を含む)
- バグ修正: 問題の原因 + 修正内容
- 破壊的変更: DB変更、削除されたAPI/コンポーネント
- セキュリティ: セキュリティ関連の対応
Step 4: GitHub Release に反映
# 一時ファイルにリリースノートを書き出してから反映
gh release edit v${VERSION} --notes-file /tmp/release-notes-v${VERSION}.md
Step 5: Web 公開リリースノート
エンドユーザー向けの Web 版リリースノートは、docs-writing skill で apps/web/content/blog/{en,ja}/ に category: 'release' の blog 記事として作成する(/blog/release タブに表示。独立した releases ページは持たない)。GitHub Release 本文と同じ5分類タクソノミーを使い、PR リンクを含めず平易な言葉で書く。
チェックリスト
- [ ] 各PRのコミットを確認した
- [ ] 抽象的な記述を具体化した
- [ ] データモデル変更を明記した
- [ ] 削除されたコンポーネント/機能をリストした
- [ ] Full Changelogリンクがある
Phase 3: リリース後作業
# デプロイ確認
# Vercel Dashboard で本番環境の動作確認
# Sentryでエラー監視
# エラーが急増していないことを確認
よくある失敗
| 失敗 | 対策 |
| ---------------------- | ---------------------------------------------- |
| バージョン重複 | Phase 0.1で必ず gh release view |
| リリースノートが抽象的 | 各PRのコミットを取得して具体的な変更内容を記載 |
| 破壊的変更の記載漏れ | DB変更、削除コンポーネントを明記 |
| 一部PRのみ記載 | gh pr list --state merged で全件取得 |
| Full Changelog抜け | template.mdの構造を参考にする |
| version bump忘れ | Phase 0.2でPRに含める(タグ前に完了) |
スクリプト
バージョン重複チェック
.claude/skills/releasing/scripts/check-version.sh 0.X.0
マージ済みPR取得
.claude/skills/releasing/scripts/get-merged-prs.sh
詳細ドキュメント
完全なチェックリスト: docs/operations/runbook.md
Architecte Docker Compose
DevOps
Concoit des configurations Docker Compose optimisees.
Rapport de Post-Mortem
DevOps
Rédige des rapports post-mortem d'incidents structurés et blameless.
Créateur de Runbooks
DevOps
Crée des runbooks opérationnels clairs pour les procédures DevOps courantes.