Spec
機能仕様書: 4層リリースフロー(feature → develop → release/* → main)
機能ID: SPEC-1ac96646
作成日: 2025-11-07
最終更新: 2025-11-09
ステータス: 実装完了
入力: ユーザー説明: "4層リリースフロー(feature → develop → release/* → main)の実装"
ユーザーシナリオ&テスト (必須)
ユーザーストーリー1 - developブランチへのPR自動マージ (優先度: P1)
開発者として、featureブランチでの作業が完了したら、developブランチへのPRを作成し、CI/CDチェックが成功したら自動的にマージされることで、手動マージの手間を削減し、開発速度を向上させたい。
この優先度の理由: これは3層フローの基盤となる機能です。developブランチが正しく機能しなければ、後続のリリースフローが成立しません。最も基本的で重要な機能のため、P1としています。
独立テスト: finish-feature.shスクリプトを実行してdevelopへのPRを作成し、CI/CDチェック成功後に自動マージされることを確認することで完全にテストできます。この機能だけで、開発者はfeatureブランチからdevelopへスムーズに統合できる価値を提供します。
受け入れシナリオ:
- 前提 featureブランチで作業が完了、実行 finish-feature.shを実行、結果 developをベースとしたPRが作成される
- 前提 developへのPRが作成済み、実行 CI/CDチェックがすべて成功、結果 PRが自動的にdevelopにマージされる
- 前提 developへのPRが作成済み、実行 CI/CDチェックが失敗、結果 PRは自動マージされず、コメントで失敗を通知される
ユーザーストーリー2 - /releaseコマンドによる手動リリース (優先度: P2)
プロジェクトマネージャー/リリース担当者として、developブランチの変更を蓄積した後、意図的なタイミングでリリースを開始したい。/releaseコマンドを実行すると、release/vX.Y.Zブランチが作成され、そこでsemantic-releaseが実行されてバージョン決定とCHANGELOG生成が行われる。その後、release/*ブランチからmainへ自動マージされることで、リリースプロセスを自動化したい。
この優先度の理由: リリース頻度の削減という主要な目標を達成するための核心機能です。developブランチへの統合ができた後、次に重要なのは、意図的なタイミングでのリリース実行です。
独立テスト: /releaseコマンドを実行し、release/vX.Y.Zブランチが作成され、semantic-releaseが実行され、mainへ自動マージされることを確認することでテストできます。この機能により、リリース担当者は適切なタイミングでリリースをコントロールできる価値を提供します。
受け入れシナリオ:
- 前提 developブランチに複数のfeatureがマージ済み、実行 /releaseコマンドを実行、結果 release/vX.Y.Zブランチが作成され、developからのPRが作成される
- 前提 release/* PR作成済み、実行 CI/CDチェック成功、結果 semantic-releaseが実行され、バージョン決定とCHANGELOG生成が完了する
- 前提 semantic-release完了、実行 release.ymlワークフロー実行、結果 release/*ブランチがmainに自動マージされる
- 前提 mainマージ完了、実行 バックマージワークフロー実行、結果 mainの変更がdevelopにバックマージされる
ユーザーストーリー3 - 自動リリース成果物配信 (優先度: P3)
エンドユーザー/パッケージ利用者として、mainブランチへのマージ後、自動的にMCPサーバーがnpmjs.comに公開され、LSPサーバーが全プラットフォームでビルドされ、GitHub Releaseが作成されることで、最新バージョンをすぐに利用できるようにしたい。
この優先度の理由: リリースフローの自動化により、手動作業を削減し、リリースの一貫性を保証します。mainへのマージが正しく動作した後に必要となる機能のため、P3としています。
独立テスト: mainブランチへのマージを実行し、semantic-releaseが自動的に実行され、npmjs.comへのpublish、LSPサーバーのビルド、GitHub Releaseの作成がすべて完了することを確認することでテストできます。この機能により、エンドユーザーは最新バージョンを即座に利用できる価値を提供します。
受け入れシナリオ:
- 前提 release/*→ main マージ済み、実行 semantic-releaseが自動実行(release/*ブランチ上)、結果 package.json、Unity Package、CHANGELOG.mdが更新され、タグが作成される
- 前提 semantic-release完了、実行 GitHub Releaseが作成、結果 MCPサーバーがnpmjs.comに自動publishされる
- 前提 GitHub Release作成済み、実行 LSPサーバービルドジョブ実行、結果 全プラットフォーム(linux-x64, osx-x64, osx-arm64, win-x64)のバイナリがGitHub Releaseに添付される
ユーザーストーリー4 - 既存PR移行 (優先度: P4)
開発者として、現在mainベースで作成されている16個のfeature PRを、新しいdevelopブランチベースに一括変更することで、既存の作業を中断せずに新しいフローに移行したい。
この優先度の理由: 既存作業の移行は重要ですが、新しいフローの基盤が整ってから実施すべきです。P1〜P3の機能が動作確認できた後に実施するため、P4としています。
独立テスト: PR移行スクリプトを実行し、16個のPRのベースブランチがすべてdevelopに変更され、変更後のPRが正常に動作することを確認することでテストできます。この機能により、開発者は既存作業を失わずに新フローに移行できる価値を提供します。
受け入れシナリオ:
- 前提 mainベースのfeature PRが16個存在、実行 PR移行スクリプトを実行、結果 すべてのPRのベースブランチがdevelopに変更される
- 前提 PRのベースブランチ変更完了、実行 CI/CDチェック再実行、結果 すべてのPRでチェックが正常に動作する
- 前提 移行後のPRが1つ成功、実行 auto-mergeワークフロー実行、結果 developに正常にマージされる
ユーザーストーリー5 - OpenUPM自動配信 (優先度: P5)
Unity開発者として、mainブランチへのリリース時にOpenUPMパッケージレジストリに自動配信されることで、Unity Package Manager経由で簡単にインストールできるようにしたい。また、OpenUPMのパッケージページで十分な情報(README、homepage)が表示されることで、パッケージの用途と使い方を理解したい。
この優先度の理由: OpenUPM配信はエンドユーザー体験を向上させますが、npm publishとLSPビルドが完了した後に追加する付加価値機能のため、P5としています。
独立テスト: mainブランチへのマージ後、OpenUPM側のビルドパイプラインが自動的にトリガーされ、パッケージがOpenUPMレジストリに公開され、パッケージページにREADMEとhomepageが正しく表示されることを確認することでテストできます。この機能により、Unity開発者はUPM経由で簡単にインストールできる価値を提供します。
受け入れシナリオ:
- 前提 mainブランチにリリースがマージ済み、実行 OpenUPM側がGitHubタグを検出、結果 OpenUPMビルドパイプラインが自動実行される
- 前提 OpenUPMビルド完了、実行 OpenUPMパッケージページを確認、結果 最新バージョンが表示され、README内容とhomepageリンクが正しく表示される
- 前提 OpenUPM配信完了、実行 Unity EditorでUPM経由でインストール、結果 パッケージが正常にインストールされる
エッジケース
-
developブランチがまだ存在しない場合、どのように作成するか?
- 対応: mainブランチの最新コミットからdevelopブランチを作成し、GitHub上でデフォルトブランチをdevelopに変更する
-
/releaseコマンド実行時にdevelopとmainに差分がない場合、何が起こるか?
- 対応: リリースノートプレビューで「変更なし」を表示し、PR作成をスキップする
-
semantic-release実行中にエラーが発生した場合、どのように処理するか?
- 対応: リリースジョブを失敗させ、GitHub上でエラー通知を表示。手動介入が必要
-
LSPサーバービルドが一部のプラットフォームで失敗した場合、どうするか?
- 対応: 成功したプラットフォームのバイナリのみGitHub Releaseに添付し、失敗したプラットフォームはエラーログを残す
-
PR移行スクリプト実行中にネットワークエラーが発生した場合、どうするか?
- 対応: 移行済みPRをログに記録し、リトライ時にスキップする。べき等性を保証
要件 (必須)
機能要件
- FR-001: システムは、finish-feature.shスクリプト実行時にdevelopブランチをベースとしたPRを作成する必要がある
- FR-002: システムは、developへのPRに対してCI/CDチェック成功時に自動マージを実行する必要がある
- FR-003: システムは、mainへのPRに対して自動マージを実行してはならない(手動承認必須)
- FR-004: システムは、/releaseコマンド実行時にrelease/vX.Y.Zブランチを作成し、developからのPRを作成する必要がある
- FR-005: システムは、release/*ブランチ上でsemantic-releaseを自動実行し、package.json、Unity Package、CHANGELOG.mdを更新し、タグを作成する必要がある
- FR-006: システムは、semantic-release完了後にrelease/*ブランチをmainに自動マージする必要がある
- FR-007: システムは、mainマージ後にdevelopへバックマージする必要がある
- FR-008: システムは、GitHub Release作成時にMCPサーバーをnpmjs.comに自動publishする必要がある
- FR-009: システムは、LSPサーバーを全プラットフォーム(linux-x64, osx-x64, osx-arm64, win-x64)でビルドし、GitHub Releaseに添付する必要がある
- FR-010: システムは、PR移行スクリプト実行時に既存16個のfeature PRのベースブランチをdevelopに一括変更する必要がある
- FR-011: システムは、PR移行後もCI/CDチェックが正常に動作することを保証する必要がある
- FR-012: GitHub上のデフォルトブランチはdevelopである必要がある
- FR-013: CLAUDE.md、README.md、quickstart.mdは4層ブランチフロー(feature → develop → release/* → main)を反映した内容に更新される必要がある
- FR-014: システムは、Unity Packageのpackage.jsonに
homepageフィールドを含める必要がある(OpenUPMパッケージページでの情報表示のため)
- FR-015: システムは、Unity PackageルートにREADME.mdを配置する必要がある(OpenUPMパッケージページでのREADME埋め込みのため)
主要エンティティ
- ブランチ: feature, develop, release/*, mainの4層構造。featureはdevelopから派生、release/*はdevelopから作成され、mainは安定版リリース専用
- プルリクエスト: feature → develop(自動マージ)、develop → release/(/releaseコマンドで作成)、release/ → main(自動マージ)、main → develop(バックマージ)の4種類
- リリース成果物: MCPサーバー(npm)、LSPサーバー(全プラットフォームバイナリ)、Unity Package、CHANGELOG、タグ、OpenUPMパッケージ
- CI/CDワークフロー: auto-merge(developのみ)、release(mainのみ)、unity-cli-publish(GitHub Release作成時)
- パッケージメタデータ: package.json(homepage、version)、README.md(パッケージルート配置)
スコープ外 (オプション)
以下の機能は本仕様のスコープ外とし、将来のバージョンで対応予定:
- ホットフィックスブランチ(hotfix → main → develop)
- ロールバック機能(リリース後に問題が発覚した場合の自動ロールバック)
- マルチバージョンサポート(複数のメジャーバージョンの並行保守)
技術制約 (該当する場合)
- GitHub Actionsが利用可能である必要がある
- gh CLI(GitHub CLI)がインストールされている必要がある
- npm publishにはnpmjs.comのアクセストークンが必要
- LSPサーバービルドには.NET SDKが必要
- semantic-releaseはConventional Commits規約に依存する
前提条件 (該当する場合)
この機能は以下を前提とします:
- 既存のGitHub Actionsワークフロー(auto-merge.yml、release.yml、unity-cli-publish.yml)が動作している
- semantic-release設定(.releaserc.json)が存在する
- finish-feature.shスクリプトが存在する
- Conventional Commits規約に従ったコミットメッセージが使用されている
依存関係 (該当する場合)
この機能は以下に依存します:
- GitHub Actions: CI/CD実行基盤
- semantic-release: 自動バージョニング&リリースノート生成
- gh CLI: PR操作の自動化
- npm: MCPサーバーの配信
- .NET SDK: LSPサーバーのビルド
- Unity Recorder: 動画キャプチャ(既存依存関係)
成功基準 (必須)
以下の成功基準を満たす必要があります:
- リリース頻度の削減: featureマージごとのリリースから、意図的なタイミングでのリリース(週1回〜月1回程度)に削減される
- 自動マージの成功率: developへのPRの95%以上がCI/CDチェック成功後に自動マージされる
- リリース成果物の完全性: mainマージ後、100%のケースでMCPサーバー(npm)、LSPサーバー(全プラットフォーム)、GitHub Releaseが正常に作成される
- PR移行の成功率: 既存16個のPRの100%がdevelopベースに移行され、CI/CDチェックが正常に動作する
- リリース所要時間: /releaseコマンド実行からGitHub Release作成まで、平均30分以内に完了する
- ドキュメント整合性: CLAUDE.md、README.md、quickstart.mdが3層フローを正確に反映し、開発者が迷わずフローを理解できる
- OpenUPM配信の信頼性: mainマージ後、OpenUPMビルドが自動的にトリガーされ、パッケージページでREADMEとhomepageが正しく表示される(100%のケース)
成功基準の測定方法:
- リリース頻度: GitHub Releaseの作成間隔を計測(平均7日以上)
- 自動マージ成功率: auto-mergeワークフロー成功回数 ÷ 実行回数 × 100(95%以上)
- リリース成果物: release.ymlとunity-cli-publish.ymlのジョブ成功率(100%)
- PR移行成功率: 移行後のPRのCI/CDチェック成功数 ÷ 16 × 100(100%)
- リリース所要時間: /release実行タイムスタンプ 〜 GitHub Release作成タイムスタンプの差分(30分以内)
- ドキュメント整合性: レビューチェックリストで確認(100%一致)
- OpenUPM配信: OpenUPMパッケージページでREADMEとhomepageが表示されることを手動確認(各リリースで確認)
⚡ クイックガイドライン
- ✅ ユーザーが「何を」必要とし「なぜ」必要なのかに焦点を当てる
- ❌ 「どのように」実装するかを避ける (技術スタック、API、コード構造なし)
- 👥 ビジネス関係者向けに記述 (開発者向けではない)
Plan
実装計画: 3層リリースフロー(feature → develop → main)
機能ID: SPEC-1ac96646 | 日付: 2025-11-07 | 仕様: spec.md
入力: /specs/SPEC-1ac96646/spec.mdの機能仕様
実行フロー (/speckit.plan コマンドのスコープ)
1. 入力パスから機能仕様を読み込み ✅
2. 技術コンテキストを記入 ✅
3. 憲章チェックセクションを評価 ✅
4. Phase 0 を実行 → research.md
5. Phase 1 を実行 → contracts, data-model.md, quickstart.md
6. 憲章チェックセクションを再評価
7. Phase 2 を計画 → タスク生成アプローチを記述
8. 停止 - /speckit.tasks コマンドの準備完了
概要
本機能は、現在の2層ブランチフロー(feature → main)を3層フロー(feature → develop → main)に変更することで、リリース頻度を削減し、リリース品質を向上させます。
主要要件:
- developブランチで変更を蓄積し、意図的なタイミングでmainにリリース
- feature → develop は自動マージ、develop → main は手動トリガー(/releaseコマンド)
- mainマージ時にsemantic-release、MCPサーバー(npm)、LSPサーバー(全プラットフォーム)を自動配信
技術アプローチ:
- GitHub Actionsワークフローの調整(auto-merge, release, unity-cli-publish)
- Bashスクリプトの修正(finish-feature.sh、新規PR移行スクリプト)
- 新規/releaseコマンドの実装(semantic-release dry-run、PR作成)
技術コンテキスト
言語/バージョン: Bash 4.x+, Node.js 18+, YAML(GitHub Actions)
主要依存関係:
- gh CLI(GitHub CLI): PR操作、ブランチ操作
- semantic-release: 自動バージョニング、リリースノート生成
- npm: MCPサーバー配信
- .NET SDK 6.0+: LSPサーバービルド
ストレージ: N/A(ファイルシステムのみ)
テスト: bash-test-framework, GitHub Actions local runner(act)
対象プラットフォーム: Linux(CI/CD)、macOS/Linux/Windows(開発環境)
プロジェクトタイプ: インフラストラクチャ/CI/CD(既存リポジトリの拡張)
パフォーマンス目標:
- /releaseコマンド → GitHub Release作成: 30分以内
- PR自動マージ: CI/CDチェック完了後5分以内
制約:
- GitHub Actionsの実行時間制限(無料プランで6時間)
- semantic-releaseはConventional Commits規約に依存
- gh CLI認証が必要(
gh auth login)
スケール/スコープ:
- 既存16個のfeature PR移行
- GitHub Actionsワークフロー3個の調整
- Bashスクリプト2個の修正・新規作成
- ドキュメント3個の更新
憲章チェック
シンプルさ:
- プロジェクト数: 1(既存unity-cliリポジトリの拡張)✅
- フレームワークを直接使用? はい(GitHub Actions、semantic-release、gh CLIを直接使用)✅
- 単一データモデル? N/A(インフラストラクチャ変更、データモデルなし)✅
- パターン回避? はい(Repository/UoWパターンなし、シンプルなBashスクリプト)✅
アーキテクチャ:
- すべての機能をライブラリとして? N/A(インフラストラクチャ変更)
- ライブラリリスト: N/A
- ライブラリごとのCLI:
/releaseコマンド: Claudeスラッシュコマンド(.claude/commands/release.md)
- finish-feature.sh: 既存スクリプト、修正のみ
- migrate-pr-to-develop.sh: 新規スクリプト、--help/--dry-run提供
- ライブラリドキュメント: CLAUDE.mdに統合(llms.txt形式ではない)
テスト (妥協不可):
- RED-GREEN-Refactorサイクルを強制? はい(契約テスト → 失敗確認 → 実装)✅
- Gitコミットはテストが実装より先に表示? はい(TDD厳守)✅
- 順序: Contract→Integration→E2E→Unitを厳密に遵守? はい✅
- 実依存関係を使用? はい(実GitHub Actions、実gh CLI、実semantic-release)✅
- Integration testの対象: GitHub Actionsワークフロー、Bashスクリプト、PR操作✅
- 禁止: テスト前の実装、REDフェーズのスキップ ✅
可観測性:
- 構造化ロギング含む? はい(GitHub Actionsログ、スクリプトecho出力)
- フロントエンドログ → バックエンド? N/A
- エラーコンテキスト十分? はい(失敗時にPRコメント、エラーログ出力)
バージョニング:
- バージョン番号割り当て済み? はい(semantic-releaseが自動管理、Conventional Commits準拠)
- 変更ごとにBUILDインクリメント? はい(feat/fixコミットごとにバージョン自動更新)
- 破壊的変更を処理? はい(既存PR移行計画、テスト並列実行)
プロジェクト構造
ドキュメント (この機能)
specs/SPEC-1ac96646/
├── spec.md # 機能仕様(完成)
├── plan.md # このファイル(進行中)
├── research.md # Phase 0 出力(未作成)
├── data-model.md # Phase 1 出力(N/A - インフラ変更)
├── quickstart.md # Phase 1 出力(未作成)
├── contracts/ # Phase 1 出力(契約テスト定義)
└── tasks.md # Phase 2 出力(/speckit.tasksで作成)
ソースコード (リポジトリルート)
.github/workflows/
├── auto-merge.yml # 修正: developのみ対象
├── release.yml # 現状維持: mainでsemantic-release
└── unity-cli-publish.yml # 現状維持: GitHub Releaseでnpm publish
.specify/scripts/bash/
├── finish-feature.sh # 修正: --base develop
└── migrate-pr-to-develop.sh # 新規: 既存PR移行
.claude/commands/
└── release.md # 新規: /releaseコマンド実装
tests/
├── contracts/
│ ├── auto-merge.contract.test.sh
│ ├── release-command.contract.test.sh
│ ├── semantic-release.contract.test.sh
│ ├── mcp-publish.contract.test.sh
│ └── lsp-build.contract.test.sh
├── integration/
│ ├── full-release-cycle.test.sh
│ └── pr-migration.test.sh
└── e2e/
└── new-feature-to-release.test.sh
CLAUDE.md # 修正: 3層フロー説明
README.md # 修正: リリースフロー図追加
構造決定: 既存リポジトリ構造を維持、新規ファイル最小限
Phase 0: アウトライン&リサーチ
リサーチタスク:
-
GitHub Actions ブランチフィルタリング:
- 調査:
branches: フィルタで複数ブランチを条件分岐する方法
- 目的: auto-merge.ymlでdevelopのみ対象にする方法確認
-
semantic-release ブランチ設定:
- 調査:
.releaserc.jsonのbranches設定とmainブランチ専用化
- 目的: developブランチでsemantic-releaseが実行されないことを確認
-
gh CLI PR操作:
- 調査:
gh pr createの--baseオプション、PRのベースブランチ変更方法
- 目的: finish-feature.sh修正、PR移行スクリプト実装の前提知識
-
Claudeスラッシュコマンド実装:
- 調査:
.claude/commands/*.mdのフォーマット、semantic-release dry-run実行方法
- 目的: /releaseコマンドの実装仕様決定
-
既存PR一括操作:
- 調査:
gh pr editでベースブランチ変更、複数PR処理のベストプラクティス
- 目的: migrate-pr-to-develop.sh実装の設計
出力: research.md(各調査結果、決定事項、代替案の記録)
Phase 1: 設計&契約
データモデル: N/A(インフラストラクチャ変更のため、エンティティなし)
API契約: N/A(REST/GraphQL APIなし、CI/CDワークフローのみ)
契約テスト (/contracts/):
-
auto-merge.contract.test.sh:
# 契約: developへのPRは自動マージ、mainへのPRは自動マージしない
test_develop_pr_auto_merges()
test_main_pr_does_not_auto_merge()
test_auto_merge_waits_for_checks()
test_auto_merge_comments_on_failure()
-
release-command.contract.test.sh:
# 契約: /releaseコマンドがリリースノートプレビュー、PR作成
test_release_command_exists()
test_release_shows_preview()
test_release_creates_pr_without_auto_merge()
test_release_skips_if_no_changes()
-
semantic-release.contract.test.sh:
# 契約: mainマージ時にsemantic-release実行、成果物生成
test_semantic_release_runs_on_main_merge()
test_package_json_updated()
test_unity_package_version_synced()
test_changelog_generated()
test_tag_created()
-
mcp-publish.contract.test.sh:
# 契約: GitHub Release時にnpm publish実行
test_mcp_publish_on_release()
test_version_matches_tag()
test_npmjs_package_available()
-
lsp-build.contract.test.sh:
# 契約: LSPサーバー全プラットフォームビルド
test_lsp_manifest_exists()
test_all_platforms_built()
test_binaries_attached_to_release()
統合テストシナリオ (/tests/integration/):
-
full-release-cycle.test.sh:
- feature → develop PR → 自動マージ
- /release実行 → develop → main PR
- PRマージ → semantic-release → MCPサーバー → LSPサーバー → GitHub Release
-
pr-migration.test.sh:
- 既存mainベースPRをdevelopベースに変更
- CI/CDチェック再実行確認
- auto-merge動作確認
Quickstart (quickstart.md):
- developブランチ作成手順
- GitHub上でデフォルトブランチ変更手順
- /releaseコマンド使用例
- 既存PR移行手順
エージェントファイル更新: CLAUDE.md
- Worktree&ブランチ運用セクション更新
- リリースフローセクション更新
- /releaseコマンド説明追加
出力: contracts/*, quickstart.md, CLAUDE.md更新
Phase 2: タスク計画アプローチ
タスク生成戦略:
- Setup(5タスク): developブランチ作成、GitHub設定、環境準備
- Test(10タスク): 契約テスト5個、統合テスト2個、E2Eテスト1個実装
- Core(8タスク): GitHub Actions修正、スクリプト修正/新規作成、/releaseコマンド実装
- Integration(3タスク): CLAUDE.md更新、README.md更新、quickstart.md作成
- Polish(4タスク): 既存PR移行、テスト検証、ドキュメント最終確認、完了確認
順序戦略:
- TDD順序: 契約テスト → 実装 → 統合テスト → E2Eテスト
- 依存関係順序: developブランチ作成 → ワークフロー修正 → スクリプト修正 → /releaseコマンド → PR移行
- 並列実行[P]: 契約テスト5個、ワークフロー修正3個、ドキュメント更新3個
推定出力: tasks.mdに30個の番号付き、順序付きタスク
重要: このフェーズは/speckit.tasksコマンドで実行、/speckit.planではない
Phase 3+: 今後の実装
Phase 3: タスク実行 (/speckit.tasksコマンドがtasks.mdを作成)
Phase 4: 実装 (憲章原則に従ってtasks.mdを実行)
Phase 5: 検証 (テスト実行、quickstart.md実行、パフォーマンス検証)
複雑さトラッキング
憲章チェックに正当化が必要な違反なし
| 違反 |
必要な理由 |
より単純な代替案が却下された理由 |
| なし |
- |
- |
進捗トラッキング
フェーズステータス:
ゲートステータス:
憲章 v1.0.0 に基づく - /docs/constitution.md 参照
Tasks
タスク: 3層リリースフロー(feature → develop → main)
入力: /specs/SPEC-1ac96646/の設計ドキュメント
前提条件: plan.md (必須), research.md, quickstart.md
実行フロー (main)
1. 機能ディレクトリからplan.mdを読み込み
→ 見つからない場合: ERROR "実装計画が見つかりません"
→ 抽出: 技術スタック、ライブラリ、構造
2. オプション設計ドキュメントを読み込み:
→ research.md: 決定を抽出 → setupタスク
→ quickstart.md: テストシナリオを確認
3. カテゴリ別にタスクを生成:
→ Setup: developブランチ作成、GitHub設定、環境準備
→ Tests: contract tests (5個), integration tests (2個), e2e tests (1個)
→ Core: GitHub Actionsワークフロー修正、Bashスクリプト修正/新規作成
→ Integration: ドキュメント更新、/releaseコマンド実装
→ Polish: 既存PR移行、テスト検証、完了確認
4. タスクルールを適用:
→ 異なるファイル = [P]をマーク (並列実行可能)
→ 同じファイル = 順次実行 ([P]なし)
→ テストが実装より先 (TDD)
5. タスクを順次番号付け (T001, T002...)
6. 依存関係グラフを生成
7. 並列実行例を作成
8. タスク完全性を検証
9. 戻り値: SUCCESS (タスク実行準備完了)
フォーマット: [ID] [P?] 説明
- [P]: 並列実行可能 (異なるファイル、依存関係なし)
- 説明には正確なファイルパスを含める
Phase 3.1: セットアップ (Setup)
Phase 3.2: テストファースト (TDD) ⚠️ 3.3の前に完了必須
重要: これらのテストは記述され、実装前に失敗する必要がある
契約テスト (Contract Tests)
統合テスト (Integration Tests)
E2Eテスト (End-to-End Tests)
Phase 3.3: コア実装 (テストが失敗した後のみ)
GitHub Actionsワークフロー修正
Bashスクリプト修正/新規作成
/releaseコマンド実装
Phase 3.4: 統合 (Integration)
ドキュメント更新
Phase 3.5: 仕上げ (Polish)
既存PR移行
テスト検証
最終確認
依存関係
- Setup (T001-T005) が Tests (T006-T013) と Core (T014-T019) より先
- Tests (T006-T013) が Core (T014-T019) より先 (TDD)
- Core (T014-T019) が Integration (T020-T022) より先
- Integration (T020-T022) が Polish (T023-T030) より先
- T001 が T002, T003, T004 をブロック
- T006-T010 が T014-T019 をブロック
- T014-T019 が T023 をブロック
並列実行例
# T003-T005 を一緒に起動:
Task: "mainブランチにBranch Protection Rules設定"
Task: "developブランチにBranch Protection Rules設定"
Task: "gh CLI認証確認"
# T006-T010 を一緒に起動:
Task: "specs/SPEC-1ac96646/contracts/auto-merge.contract.test.sh を作成"
Task: "specs/SPEC-1ac96646/contracts/release-command.contract.test.sh を作成"
Task: "specs/SPEC-1ac96646/contracts/semantic-release.contract.test.sh を作成"
Task: "specs/SPEC-1ac96646/contracts/mcp-publish.contract.test.sh を作成"
Task: "specs/SPEC-1ac96646/contracts/lsp-build.contract.test.sh を作成"
# T011-T013 を一緒に起動:
Task: "tests/integration/full-release-cycle.test.sh を作成"
Task: "tests/integration/pr-migration.test.sh を作成"
Task: "tests/e2e/new-feature-to-release.test.sh を作成"
# T014-T016 を一緒に起動:
Task: ".github/workflows/auto-merge.yml を修正"
Task: ".github/workflows/release.yml を確認"
Task: ".github/workflows/unity-cli-publish.yml を確認"
# T020-T022 を一緒に起動:
Task: "CLAUDE.md を更新"
Task: "README.md を更新"
Task: "specs/SPEC-1ac96646/quickstart.md を確認"
注意事項
- [P] タスク = 異なるファイル、依存関係なし
- 実装前にテストが失敗することを確認 (TDD厳守)
- 各タスク後にコミット (Conventional Commits規約)
- 回避: 曖昧なタスク、同じファイルの競合
タスク生成ルール
main()実行中に適用
-
Contractsから:
- 各contractファイル → contract testタスク [P]
- 各endpoint/workflow → 実装タスク
-
User Storiesから:
- 各story → integration test [P]
- クイックスタートシナリオ → 検証タスク
-
順序:
- Setup → Tests → Core → Integration → Polish
- 依存関係は並列実行をブロック
検証チェックリスト
ゲート: 戻る前にmain()でチェック
TDD
TODO
Research
Phase 0: リサーチ&技術調査
SPEC ID: SPEC-1ac96646
日付: 2025-11-07
ステータス: 完了
概要
本ドキュメントは、3層リリースフロー(feature → develop → main)実装に必要な技術調査結果をまとめたものです。
1. GitHub Actions ブランチフィルタリング
調査内容
branches: フィルタで複数ブランチを条件分岐する方法を調査。
調査結果
現状(auto-merge.yml):
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
branches:
- main
- develop
分析:
branches: は**PRのベースブランチ(マージ先)**を指定
- 現在はmainとdevelopの両方でトリガー
- ジョブ内で条件分岐する場合は
if:を使用可能
決定事項
オプションA: ワークフロー分離(推奨)
- developブランチのみ自動マージ
- mainブランチは除外
on:
pull_request:
branches:
- develop # mainを削除
理由:
- シンプル(条件分岐不要)
- 意図が明確(developのみ自動マージ)
- mainへのPRは手動承認を強制
オプションB: 条件分岐
branches:
- main
- develop
jobs:
auto-merge:
if: github.event.pull_request.base.ref == 'develop'
却下理由:
- 複雑化(条件ロジック追加)
- mainブランチへのPRで無駄にワークフロー起動
2. semantic-release ブランチ設定
調査内容
.releaserc.jsonのbranches設定とmainブランチ専用化を確認。
調査結果
現状(.releaserc.json):
{
"branches": ["main"],
"tagFormat": "v${version}",
"plugins": [...]
}
分析:
branches: ["main"]で既にmainブランチ専用
- developブランチでsemantic-releaseは実行されない
- release.ymlは
on.push.branches: [main]でトリガー
決定事項
変更不要:
.releaserc.jsonは現状維持
branches: ["main"]のまま
- release.ymlも
branches: [main]を維持
理由:
- 既に要件を満たしている
- mainへのpushでのみsemantic-release実行
- developブランチは除外済み
3. gh CLI PR操作
調査内容
gh pr createの--baseオプション、PRのベースブランチ変更方法を調査。
調査結果
PR作成(finish-feature.sh):
gh pr create --base main --head "$CURRENT_BRANCH" --title "$PR_TITLE" --body "$PR_BODY"
ベースブランチ変更(PR移行):
gh pr edit <PR番号> --base develop
PRリスト取得:
# mainベースのPR一覧
gh pr list --base main --json number,title,headRefName
# すべてのPR一覧
gh pr list --state open --json number,title,baseRefName,headRefName
決定事項
finish-feature.sh修正:
# 変更前
gh pr create --base main ...
# 変更後
gh pr create --base develop ...
PR移行スクリプト(migrate-pr-to-develop.sh):
#!/bin/bash
# 既存16個のPRをdevelopベースに一括変更
set -euo pipefail
# mainベースのPR取得
pr_list=$(gh pr list --base main --json number,title,headRefName)
pr_count=$(echo "$pr_list" | jq '. | length')
echo "Found $pr_count PRs with base=main"
# 各PRをdevelopベースに変更
echo "$pr_list" | jq -r '.[] | @json' | while IFS= read -r pr_json; do
pr_number=$(echo "$pr_json" | jq -r '.number')
pr_title=$(echo "$pr_json" | jq -r '.title')
echo "Migrating PR #$pr_number: $pr_title"
gh pr edit "$pr_number" --base develop
done
echo "Migration complete!"
代替案(検討したが却下):
- 手動変更: エラーの可能性、時間がかかる
- GitHub API直接呼び出し: gh CLIで十分、複雑化
4. Claudeスラッシュコマンド実装
調査内容
.claude/commands/*.mdのフォーマット、semantic-release dry-run実行方法を調査。
調査結果
スラッシュコマンドフォーマット:
---
description: コマンドの説明(1行)
---
## ユーザー入力
```text
$ARGUMENTS
説明
コマンドの目的と実行内容
実行手順
- ステップ1
- ステップ2
...
**semantic-release dry-run**:
```bash
# dry-runでリリースノートプレビュー
npx semantic-release --dry-run --no-ci
# 出力例:
# [semantic-release] › ℹ The next release version is 2.17.0
# [semantic-release] › ℹ Release note for version 2.17.0:
# ## [2.17.0] (2025-11-07)
# ### Features
# * Add video capture support
決定事項
/releaseコマンド仕様:
ファイル: .claude/commands/release.md
処理フロー:
- developとmainの差分確認(
git log main..develop --oneline)
- 差分がなければスキップ、メッセージ表示
- semantic-release dry-run実行、リリースノートプレビュー取得
- ユーザーに確認プロンプト表示
- 確認後、develop → main PR作成(
gh pr create --base main --head develop)
- PRボディにリリースノート、成果物リスト、マージ後の自動フロー説明
代替案(検討したが却下):
- PRの自動マージ: 手動承認を残すべき(リリースは慎重に)
- mainへの直接push: PRレビューフローを尊重すべき
5. 既存PR一括操作
調査内容
gh pr editでベースブランチ変更、複数PR処理のベストプラクティスを調査。
調査結果
PR情報取得:
# JSON形式で取得(処理しやすい)
gh pr list --base main --json number,title,headRefName,url
# 出力例:
# [
# {"number": 15, "title": "Add feature X", "headRefName": "feature/SPEC-12345678", "url": "..."},
# {"number": 16, "title": "Fix bug Y", "headRefName": "feature/SPEC-87654321", "url": "..."}
# ]
ベースブランチ変更:
# 単一PR
gh pr edit 15 --base develop
# エラーハンドリング
if gh pr edit "$pr_number" --base develop; then
echo "✅ PR #$pr_number migrated successfully"
else
echo "❌ Failed to migrate PR #$pr_number"
fi
べき等性保証:
# 既にdevelopベースの場合はスキップ
current_base=$(gh pr view "$pr_number" --json baseRefName --jq '.baseRefName')
if [ "$current_base" = "develop" ]; then
echo "⏭️ PR #$pr_number already targets develop, skipping"
continue
fi
決定事項
migrate-pr-to-develop.sh 仕様:
機能:
- mainベースのPRを一括取得
- 各PRのベースブランチをdevelopに変更
- べき等性保証(既にdevelopベースならスキップ)
- エラーハンドリング(失敗時もログ記録、続行)
- dry-runモード(
--dry-runで実行せず表示のみ)
オプション:
--help: ヘルプ表示
--dry-run: 変更せずに対象PRリスト表示
--verbose: 詳細ログ出力
代替案(検討したが却下):
- GitHub Web UIで手動変更: 16個は多すぎる、エラーの可能性
- GitHub GraphQL Mutation: gh CLI RESTで十分、複雑化
まとめ
技術スタック(確定)
- GitHub Actions: YAML設定、既存ワークフロー修正のみ
- semantic-release: 現状維持(.releaserc.json変更不要)
- gh CLI: PR操作(create、edit、list、view)
- Bash: スクリプト実装(finish-feature.sh修正、migrate-pr-to-develop.sh新規)
- Markdown: /releaseコマンド実装
変更が必要なファイル
.github/workflows/auto-merge.yml: branches: [develop]のみ
.specify/scripts/bash/finish-feature.sh: --base developに変更
.specify/scripts/bash/migrate-pr-to-develop.sh: 新規作成
.claude/commands/release.md: 新規作成
CLAUDE.md: ブランチフロー説明更新
README.md: リリースフロー図追加
変更不要なファイル
.releaserc.json: 既にmainブランチ専用
.github/workflows/release.yml: mainへのpushでトリガー済み
.github/workflows/unity-cli-publish.yml: GitHub Release作成時にトリガー(ブランチ非依存)
.github/workflows/release-lsp.yml: タグpush時にトリガー(ブランチ非依存)
補足説明:
- unity-cli-publish.yml:
on.release.types: [published]でトリガー。semantic-releaseがmainでGitHub Releaseを作成するため、develop/mainフロー導入後も正常動作。変更不要。
- release-lsp.yml:
on.push.tags: ['v*']でトリガー。semantic-releaseがmainでタグ(v*)を作成するため、develop/mainフロー導入後も正常動作。変更不要。
リスク&対策
| リスク |
対策 |
| 既存PR移行時のエラー |
べき等性保証、エラーハンドリング、dry-runモード |
| mainへのPRが誤って自動マージ |
auto-merge.ymlでmainを除外、契約テストで検証 |
| semantic-releaseがdevelopで実行 |
branches設定で既に防止済み、テストで確認 |
| /releaseコマンド実行ミス |
dry-runプレビュー、ユーザー確認プロンプト |
次のステップ
Phase 1(設計&契約)に進む準備完了:
- すべての技術的不明点を解決
- 実装方針決定
- 変更対象ファイル特定
✅ Phase 0完了
Data Model
データモデル: 3層リリースフロー
機能ID: SPEC-1ac96646 | 日付: 2025-11-07 | 仕様: spec.md
概要
本機能はインフラストラクチャ変更(CI/CDワークフロー、ブランチ戦略)のため、従来のエンティティ・リレーションシップモデルではなく、ワークフロー状態とGit操作のデータフローをモデル化します。
ブランチモデル
ブランチ構造
main (安定版リリース専用)
↑ (手動マージ、PR必須)
develop (統合ブランチ、デフォルトブランチ)
↑ (自動マージ、CI/CD成功時)
feature/SPEC-xxxxxxxx (機能開発ブランチ)
ブランチ状態遷移
[feature作成] → [開発] → [finish-feature.sh実行]
↓
[PR作成: feature→develop]
↓
[CI/CDチェック実行]
↙ ↘
[成功] [失敗]
↓ ↓
[自動マージ] [コメント通知]
↓
[developに統合]
↓
[変更蓄積 (複数feature)]
↓
[/release実行]
↓
[semantic-release dry-run]
↓
[リリースノートプレビュー]
↓
[PR作成: develop→main]
↓
[手動レビュー・承認]
↓
[mainにマージ]
↓
[semantic-release実行]
↓
[GitHub Release作成]
↙ ↘
[npm publish] [LSPビルド]
ワークフロー状態モデル
PR状態 (Pull Request State)
PullRequest:
id: string # PR番号 (例: "65")
title: string # PRタイトル
source_branch: string # feature/SPEC-xxxxxxxx
target_branch: string # develop | main
status: enum # open | merged | closed
auto_merge_enabled: boolean # developへのPRのみtrue
ci_status: enum # pending | success | failure
created_at: datetime
merged_at: datetime | null
状態遷移:
[open] → [CI pending]
↓
[CI success] → (developベース) → [auto-merge] → [merged]
| (mainベース) → [manual review] → [merged]
↓
[CI failure] → [comment added] → [open (待機)]
リリース状態 (Release State)
Release:
version: string # semantic-releaseが決定 (例: "2.32.0")
tag: string # vX.Y.Z (例: "v2.32.0")
branch: string # main
changelog: string # CHANGELOG.mdの内容
artifacts:
mcp_server:
npm_published: boolean
npm_url: string # https://www.npmjs.com/package/...
lsp_server:
platforms:
- rid: string # linux-x64, osx-x64, ...
binary_path: string # GitHub Release添付URL
build_status: enum # success | failure
unity_package:
version_synced: boolean
package_json_path: string
created_at: datetime
status: enum # draft | published | failed
状態遷移:
[/release実行] → [dry-run]
↓
[version算出]
↓
[プレビュー表示]
↓
[PR作成: develop→main]
↓
[手動マージ]
↓
[semantic-release実行]
↓
[GitHub Release draft作成]
↓
[npm publish] + [LSPビルド (並列)]
↓
[Release published]
ワークフロージョブ状態 (Workflow Job State)
WorkflowJob:
workflow_name: string # auto-merge.yml | release.yml | publish.yml
run_id: string # GitHub Actions Run ID
trigger: enum # push | pull_request | release
branch: string # develop | main
status: enum # queued | in_progress | success | failure
steps:
- name: string
status: enum # success | failure | skipped
duration_seconds: number
started_at: datetime
completed_at: datetime | null
logs_url: string # GitHub Actions ログURL
コマンド入出力モデル
/release コマンド
入力: なし(現在のdevelopブランチ状態を使用)
処理フロー:
1. git fetch --tags origin
2. semantic-release --dry-run --no-ci
↓
3. バージョン番号抽出 (例: 2.33.0)
4. CHANGELOG生成プレビュー
5. 成果物リスト生成
↓
6. ユーザーにプレビュー表示
↓
7. release/vX.Y.Z ブランチ作成
8. gh pr create --base main --head release/vX.Y.Z
出力:
ReleasePreview:
next_version: string # "2.33.0"
current_version: string # "2.32.0"
version_bump: enum # major | minor | patch
changelog_preview: string # マークダウン形式
artifacts:
- unity-cli (npm)
- lsp-server (6 platforms)
- Unity Package
- CHANGELOG.md
pr_url: string | null # PRが作成された場合のURL
skipped: boolean # 変更なしの場合true
skip_reason: string | null # "No changes since last release"
finish-feature.sh コマンド
入力:
--base <branch> # develop (デフォルト)
--draft # ドラフトPRとして作成
処理フロー:
1. 現在のブランチ取得 (feature/SPEC-xxxxxxxx)
2. git push origin <current_branch>
3. gh pr create --base develop --fill
↓
4. auto-merge有効化 (--draftでない場合)
出力:
FeatureFinish:
branch: string # feature/SPEC-xxxxxxxx
pr_number: string # "66"
pr_url: string # https://github.com/.../pull/66
auto_merge_enabled: boolean # true | false
base_branch: string # develop
GitHub Actions イベントモデル
auto-merge.yml トリガー
Trigger:
event: pull_request
action: [opened, synchronize, reopened]
branches: [develop] # mainは除外
conditions:
- statusCheckRollup == "success"
release.yml トリガー
Trigger:
event: push
branches: [main, "release/**"]
conditions:
- semantic-release dry-runでバージョン決定可能
publish.yml トリガー
Trigger:
event: release
types: [published]
conditions:
- tagがv*形式
データフロー図
完全リリースサイクル
[開発者] → [feature開発]
↓
[finish-feature.sh]
↓
[GitHub: PR作成]
↓
[GitHub Actions: CI/CD]
↓
[auto-merge.yml: マージ]
↓
[develop: 変更蓄積]
↓
[リリース担当] → [/release実行]
↓
[semantic-release: dry-run]
↓
[プレビュー表示]
↓
[GitHub: PR作成 (develop→main)]
↓
[手動レビュー]
↓
[mainマージ]
↓
[release.yml: semantic-release実行]
↓
[package.json更新]
[CHANGELOG.md生成]
[タグ作成]
↓
[GitHub Release作成]
↓
[publish.yml: 並列実行]
↙ ↘
[npm publish] [LSPビルド (6 platforms)]
↓ ↓
[npmjs.com] [GitHub Release添付]
エラー状態モデル
PR自動マージ失敗
AutoMergeFailure:
pr_number: string
failure_reason: enum
- ci_check_failed
- merge_conflict
- approval_required
- network_error
recovery_action: enum
- notify_comment # PRにコメント追加
- disable_auto_merge # 自動マージ無効化
- manual_intervention # 手動介入必要
notified_at: datetime
semantic-release失敗
SemanticReleaseFailure:
run_id: string
failure_stage: enum
- version_calculation # バージョン決定失敗
- changelog_generation # CHANGELOG生成失敗
- git_push # タグpush失敗
- npm_publish # npm publish失敗
error_message: string
recovery_action: enum
- retry # リトライ
- manual_fix # 手動修正必要
logs_url: string
LSPビルド部分失敗
LspBuildPartialFailure:
platforms_success: [string] # ["linux-x64", "osx-x64"]
platforms_failure: [string] # ["win-x64"]
failure_details:
- platform: string
error_message: string
build_log_url: string
recovery_action: enum
- attach_partial # 成功分のみ添付
- rebuild_failed # 失敗分のみリビルド
制約とバリデーション
ブランチ命名規則
BranchNaming:
feature: "feature/SPEC-[a-f0-9]{8}"
release: "release/v[0-9]+\\.[0-9]+\\.[0-9]+"
main: "main"
develop: "develop"
バージョン形式
VersionFormat:
pattern: "^[0-9]+\\.[0-9]+\\.[0-9]+$"
example: "2.32.0"
tag_pattern: "^v[0-9]+\\.[0-9]+\\.[0-9]+$"
tag_example: "v2.32.0"
Conventional Commits
CommitMessage:
pattern: "^(feat|fix|chore|docs|test|refactor)(\\([a-z]+\\))?: .+$"
version_bump:
"feat:": minor
"fix:": patch
"feat!:": major
"BREAKING CHANGE:": major
永続化
Git リポジトリ (ソース・オブ・トゥルース)
- ブランチ: develop, main, feature/, release/
- タグ: v*
- コミット履歴: Conventional Commits準拠
GitHub (メタデータ)
- Pull Requests: PR状態、CI/CD結果、コメント
- Releases: バージョン、CHANGELOG、成果物添付
- Actions: ワークフロー実行ログ
npm (配信)
- パッケージ: @akiojin/unity-cli
- バージョン履歴: npmjs.com
ローカルファイル (一時)
- .git/: ローカルブランチ、リモート追跡
- CHANGELOG.md: 自動生成、Gitコミット対象
- package.json: バージョン番号、semantic-releaseが更新
注: 本データモデルはステートフルなエンティティではなく、Git/GitHub/CI/CDの状態遷移とデータフローを表現しています。インフラストラクチャ変更の性質上、RDBやORMは使用せず、Gitリポジトリ自体がデータストアとなります。
Quickstart
クイックスタートガイド: 3層リリースフロー
SPEC ID: SPEC-1ac96646
日付: 2025-11-07
概要
このガイドでは、3層リリースフロー(feature → develop → main)の初期セットアップと使用方法を説明します。
初期セットアップ
1. developブランチ作成
mainブランチから新しいdevelopブランチを作成します:
# mainブランチをpullして最新化
git checkout main
git pull origin main
# developブランチを作成してpush
git checkout -b develop
git push -u origin develop
2. GitHubデフォルトブランチ変更
gh CLIでデフォルトブランチをdevelopに変更:
# デフォルトブランチをdevelopに設定
gh repo edit --default-branch develop
または GitHub Web UI:
- リポジトリページ → Settings
- 左メニュー → Branches
- Default branch セクション → スイッチアイコンをクリック
develop を選択 → Update
- 確認ダイアログで I understand, update the default branch をクリック
これにより、新規PRのデフォルトベースがdevelopになります。
3. Branch Protection Rules設定(重要)
develop → main の自動マージを有効化するため、mainブランチにRequired status checksを設定:
# mainブランチのBranch Protection Rules設定
gh api repos/{owner}/{repo}/branches/main/protection \
-X PUT \
--input - <<EOF
{
"required_status_checks": {
"strict": true,
"contexts": ["test"]
},
"enforce_admins": false,
"required_pull_request_reviews": null,
"restrictions": null,
"allow_force_pushes": false,
"allow_deletions": false
}
EOF
{owner}と{repo}を実際の値に置き換えてください(例: akiojin/unity-cli)
設定内容:
required_status_checks.contexts: ["test"]: testチェックが必須
strict: true: PRブランチがベースブランチの最新であることを要求
enforce_admins: false: 管理者は制限をバイパス可能
required_pull_request_reviews: null: レビュー不要
allow_force_pushes: false: force pushを禁止
developブランチも同様に設定(オプション):
# developブランチのBranch Protection Rules設定
gh api repos/{owner}/{repo}/branches/develop/protection \
-X PUT \
--input - <<EOF
{
"required_status_checks": {
"strict": true,
"contexts": ["test"]
},
"enforce_admins": false,
"required_pull_request_reviews": null,
"restrictions": null,
"allow_force_pushes": false,
"allow_deletions": false
}
EOF
4. 既存PRの移行(オプション)
既にmainベースのPRが存在する場合、developベースに変更します:
手動変更(PR数が少ない場合):
- PR詳細ページを開く
- ベースブランチ横の Edit をクリック
develop を選択
- PRが更新される
一括変更(PR数が多い場合):
# migrate-pr-to-develop.shスクリプトを使用(今後実装予定)
.specify/scripts/bash/migrate-pr-to-develop.sh
# または手動で各PRを変更
gh pr list --base main --json number | jq -r '.[].number' | while read pr_number; do
gh pr edit "$pr_number" --base develop
done
通常の開発フロー
1. 新機能開発開始
# 仕様書作成(自動的にfeatureブランチ&Worktree作成)
/speckit.specify
# Worktreeに移動
cd .worktrees/SPEC-xxxxxxxx/
# 実装計画作成
/speckit.plan
# タスク分解
/speckit.tasks
2. 実装とコミット
# TDDサイクル厳守(RED-GREEN-REFACTOR)
# テスト作成 → 実装 → リファクタリング
# 各変更をコミット
git add .
git commit -m "feat: 機能Xを実装"
3. PR作成&自動マージ(developへ)
# finish-featureスクリプト実行
.specify/scripts/bash/finish-feature.sh
# 自動実行される処理:
# 1. featureブランチをリモートにpush
# 2. GitHub PR作成(ベース: develop)
# 3. GitHub Actions Required Checks監視
# 4. すべてのチェック成功 → 自動的にdevelopへマージ
ドラフトPR(自動マージしたくない場合):
.specify/scripts/bash/finish-feature.sh --draft
リリースフロー(develop → main)
1. リリース準備
developブランチに複数のfeatureが蓄積された時点でリリースを実行します。
# /releaseコマンド実行
/release
2. リリースコマンドの処理フロー
/releaseコマンドは以下を自動実行します:
Step 1: 差分確認
# developとmainの差分を表示
git log origin/main..origin/develop --oneline
差分がない場合はスキップメッセージを表示して終了。
Step 2: リリースノートプレビュー
# semantic-release dry-runでリリース内容を取得
cd unity-cli && npx semantic-release --dry-run --no-ci
出力例:
[semantic-release] › ℹ The next release version is 2.17.0
[semantic-release] › ℹ Release note for version 2.17.0:
## [2.17.0] (2025-11-07)
### Features
* Add video capture support
* Implement 3-tier release flow
Step 3: ユーザー確認プロンプト
## 🚀 リリース準備完了
**次のバージョン**: v2.17.0
**リリース内容**:
## [2.17.0] (2025-11-07)
### Features
* Add video capture support
* Implement 3-tier release flow
**リリース成果物**:
- ✅ MCPサーバー(npm) → npmjs.comに自動publish
- ✅ LSPサーバー(全プラットフォーム) → GitHub Releaseに添付
- ✅ Unity Package → バージョン同期
- ✅ CHANGELOG.md → 自動生成
**マージ後の自動フロー**:
1. semantic-release実行 → バージョンアップ&タグ作成
2. GitHub Release作成
3. MCPサーバー npm publish
4. LSPサーバービルド(全プラットフォーム)
---
このリリースを実行しますか? (yes/no)
Step 4: develop → main PR作成
ユーザーが yes を入力すると、PRを自動作成:
gh pr create --base main --head develop \
--title "release: v2.17.0" \
--body "## 🚀 リリース: v2.17.0
このPRは、developブランチの変更をmainブランチにリリースします。
---
## 📋 リリース内容
$(git log origin/main..origin/develop --oneline)
---
## 🎯 リリースノート
[semantic-release dry-runの結果を挿入]
---
## 🤖 自動リリースフロー
このPRをマージすると、以下が自動的に実行されます:
1. **semantic-release**: package.json、Unity Package、CHANGELOG.mdを更新、タグ作成
2. **GitHub Release**: リリースノートと共にリリース作成
3. **npm publish**: MCPサーバーをnpmjs.comに公開
4. **LSPサーバービルド**: 全プラットフォーム(linux-x64, osx-x64, osx-arm64, win-x64)でビルド、GitHub Releaseに添付
---
⚠️ **重要**: このPRは自動マージされません。手動でレビュー&承認が必要です。
📝 **仕様**: specs/SPEC-1ac96646/spec.md を参照してください。"
Step 5: 完了メッセージ
✅ リリースPRが作成されました!
**PR URL**: https://github.com/akiojin/unity-cli/pull/XX
**次のステップ**:
1. PRをレビュー
2. CI/CDチェックの完了を待機
3. PRをマージ → 自動リリース開始
**マージ後の成果物**:
- npmjs.com: @akiojin/unity-cli v2.17.0
- GitHub Release: v2.17.0(LSPバイナリ添付)
- CHANGELOG.md: 自動更新
🎉 リリース準備完了です!
3. PRマージとリリース実行(自動)
- PRのCI/CDチェック(Required checks)の完了を待機
- すべてのRequired checks成功 → 自動的にmainへマージ
- マージ後、自動的にsemantic-releaseが実行される
- GitHub Releaseが作成され、LSPバイナリが添付される
- MCPサーバーがnpmjs.comに公開される
注: 手動マージは不要です。Required checksが通れば自動マージされます。
トラブルシューティング
developとmainに差分がない
ℹ️ developとmainに差分がありません。
リリースする変更がないため、PR作成をスキップします。
developブランチに新しい機能をマージしてから、再度/releaseを実行してください。
→ featureブランチを開発してdevelopにマージしてから再実行
semantic-release dry-run失敗
❌ semantic-release dry-runが失敗しました。
原因:
- Conventional Commits規約に準拠していないコミットがある可能性
- package.jsonやnode_modulesに問題がある可能性
対策:
1. developブランチのコミットメッセージを確認
2. unity-cliディレクトリで `npm ci` を実行
3. エラーログを確認
→ Conventional Commits形式を確認(feat:, fix:, chore: 等)
gh CLI認証エラー
❌ GitHub CLI認証エラー
以下のコマンドで認証してください:
gh auth login
→ gh auth login を実行してGitHub CLIを認証
PRが自動マージされない
原因と対策:
-
Branch Protection Rulesが未設定
# mainブランチのProtection Rules確認
gh api repos/{owner}/{repo}/branches/main/protection
# 設定されていない場合は初期セットアップの手順3を実行
-
Required checksが失敗している
# PRのチェック状態確認
gh pr checks <PR番号>
# 失敗しているチェックを修正してpush
-
PRがdraftモード
# draft状態を解除
gh pr ready <PR番号>
-
GitHub Actions権限不足
- リポジトリ設定 → Actions → General → Workflow permissions
- "Read and write permissions"を選択
参考資料
- 仕様書:
specs/SPEC-1ac96646/spec.md
- 実装計画:
specs/SPEC-1ac96646/plan.md
- 技術調査:
specs/SPEC-1ac96646/research.md
- /releaseコマンド:
.claude/commands/release.md
- finish-featureスクリプト:
.specify/scripts/bash/finish-feature.sh
- auto-mergeワークフロー:
.github/workflows/auto-merge.yml
よくある質問
Q: なぜ3層フローにしたの?
A: 以前のfeature → mainフローでは、featureがマージされるたびにリリースが実行され、リリース頻度が高すぎました。3層フローでは、developで複数のfeatureを蓄積してからmainにリリースできます。
Q: developブランチの役割は?
A: 統合ブランチとして機能します。複数のfeatureブランチをdevelopにマージして統合テストを実行し、問題がなければmainにリリースします。
Q: mainブランチの役割は?
A: リリースブランチとして機能します。mainへのマージでsemantic-releaseが実行され、npm publish、GitHub Release作成、LSPビルドが自動実行されます。
Q: 既存のfeatureブランチはどうなる?
A: 既存のfeatureブランチはそのまま使用できます。PRのベースブランチをdevelopに変更するだけです。
Q: semantic-releaseはいつ実行される?
A: mainブランチへのpushでのみ実行されます。developへのマージでは実行されません(.releaserc.jsonのbranches: ["main"]設定により)。
Q: リリース頻度はどれくらい?
A: プロジェクトの判断に依存します。developに複数のfeatureが蓄積された時点で /release を実行してください。週次、月次、機能区切りなど、チームの方針に従ってください。
Contracts
Migrated from local files. See artifact comments below.
Checklists
Artifact files under checklists/ are managed in issue comments with checklist:<name> entries.
Acceptance Checklist
Spec
機能仕様書: 4層リリースフロー(feature → develop → release/* → main)
機能ID:
SPEC-1ac96646作成日: 2025-11-07
最終更新: 2025-11-09
ステータス: 実装完了
入力: ユーザー説明: "4層リリースフロー(feature → develop → release/* → main)の実装"
ユーザーシナリオ&テスト (必須)
ユーザーストーリー1 - developブランチへのPR自動マージ (優先度: P1)
開発者として、featureブランチでの作業が完了したら、developブランチへのPRを作成し、CI/CDチェックが成功したら自動的にマージされることで、手動マージの手間を削減し、開発速度を向上させたい。
この優先度の理由: これは3層フローの基盤となる機能です。developブランチが正しく機能しなければ、後続のリリースフローが成立しません。最も基本的で重要な機能のため、P1としています。
独立テスト: finish-feature.shスクリプトを実行してdevelopへのPRを作成し、CI/CDチェック成功後に自動マージされることを確認することで完全にテストできます。この機能だけで、開発者はfeatureブランチからdevelopへスムーズに統合できる価値を提供します。
受け入れシナリオ:
ユーザーストーリー2 - /releaseコマンドによる手動リリース (優先度: P2)
プロジェクトマネージャー/リリース担当者として、developブランチの変更を蓄積した後、意図的なタイミングでリリースを開始したい。/releaseコマンドを実行すると、release/vX.Y.Zブランチが作成され、そこでsemantic-releaseが実行されてバージョン決定とCHANGELOG生成が行われる。その後、release/*ブランチからmainへ自動マージされることで、リリースプロセスを自動化したい。
この優先度の理由: リリース頻度の削減という主要な目標を達成するための核心機能です。developブランチへの統合ができた後、次に重要なのは、意図的なタイミングでのリリース実行です。
独立テスト: /releaseコマンドを実行し、release/vX.Y.Zブランチが作成され、semantic-releaseが実行され、mainへ自動マージされることを確認することでテストできます。この機能により、リリース担当者は適切なタイミングでリリースをコントロールできる価値を提供します。
受け入れシナリオ:
ユーザーストーリー3 - 自動リリース成果物配信 (優先度: P3)
エンドユーザー/パッケージ利用者として、mainブランチへのマージ後、自動的にMCPサーバーがnpmjs.comに公開され、LSPサーバーが全プラットフォームでビルドされ、GitHub Releaseが作成されることで、最新バージョンをすぐに利用できるようにしたい。
この優先度の理由: リリースフローの自動化により、手動作業を削減し、リリースの一貫性を保証します。mainへのマージが正しく動作した後に必要となる機能のため、P3としています。
独立テスト: mainブランチへのマージを実行し、semantic-releaseが自動的に実行され、npmjs.comへのpublish、LSPサーバーのビルド、GitHub Releaseの作成がすべて完了することを確認することでテストできます。この機能により、エンドユーザーは最新バージョンを即座に利用できる価値を提供します。
受け入れシナリオ:
ユーザーストーリー4 - 既存PR移行 (優先度: P4)
開発者として、現在mainベースで作成されている16個のfeature PRを、新しいdevelopブランチベースに一括変更することで、既存の作業を中断せずに新しいフローに移行したい。
この優先度の理由: 既存作業の移行は重要ですが、新しいフローの基盤が整ってから実施すべきです。P1〜P3の機能が動作確認できた後に実施するため、P4としています。
独立テスト: PR移行スクリプトを実行し、16個のPRのベースブランチがすべてdevelopに変更され、変更後のPRが正常に動作することを確認することでテストできます。この機能により、開発者は既存作業を失わずに新フローに移行できる価値を提供します。
受け入れシナリオ:
ユーザーストーリー5 - OpenUPM自動配信 (優先度: P5)
Unity開発者として、mainブランチへのリリース時にOpenUPMパッケージレジストリに自動配信されることで、Unity Package Manager経由で簡単にインストールできるようにしたい。また、OpenUPMのパッケージページで十分な情報(README、homepage)が表示されることで、パッケージの用途と使い方を理解したい。
この優先度の理由: OpenUPM配信はエンドユーザー体験を向上させますが、npm publishとLSPビルドが完了した後に追加する付加価値機能のため、P5としています。
独立テスト: mainブランチへのマージ後、OpenUPM側のビルドパイプラインが自動的にトリガーされ、パッケージがOpenUPMレジストリに公開され、パッケージページにREADMEとhomepageが正しく表示されることを確認することでテストできます。この機能により、Unity開発者はUPM経由で簡単にインストールできる価値を提供します。
受け入れシナリオ:
エッジケース
developブランチがまだ存在しない場合、どのように作成するか?
/releaseコマンド実行時にdevelopとmainに差分がない場合、何が起こるか?
semantic-release実行中にエラーが発生した場合、どのように処理するか?
LSPサーバービルドが一部のプラットフォームで失敗した場合、どうするか?
PR移行スクリプト実行中にネットワークエラーが発生した場合、どうするか?
要件 (必須)
機能要件
homepageフィールドを含める必要がある(OpenUPMパッケージページでの情報表示のため)主要エンティティ
スコープ外 (オプション)
以下の機能は本仕様のスコープ外とし、将来のバージョンで対応予定:
技術制約 (該当する場合)
前提条件 (該当する場合)
この機能は以下を前提とします:
依存関係 (該当する場合)
この機能は以下に依存します:
成功基準 (必須)
以下の成功基準を満たす必要があります:
成功基準の測定方法:
⚡ クイックガイドライン
Plan
実装計画: 3層リリースフロー(feature → develop → main)
機能ID:
SPEC-1ac96646| 日付: 2025-11-07 | 仕様: spec.md入力:
/specs/SPEC-1ac96646/spec.mdの機能仕様実行フロー (/speckit.plan コマンドのスコープ)
概要
本機能は、現在の2層ブランチフロー(feature → main)を3層フロー(feature → develop → main)に変更することで、リリース頻度を削減し、リリース品質を向上させます。
主要要件:
技術アプローチ:
技術コンテキスト
言語/バージョン: Bash 4.x+, Node.js 18+, YAML(GitHub Actions)
主要依存関係:
ストレージ: N/A(ファイルシステムのみ)
テスト: bash-test-framework, GitHub Actions local runner(act)
対象プラットフォーム: Linux(CI/CD)、macOS/Linux/Windows(開発環境)
プロジェクトタイプ: インフラストラクチャ/CI/CD(既存リポジトリの拡張)
パフォーマンス目標:
制約:
gh auth login)スケール/スコープ:
憲章チェック
シンプルさ:
アーキテクチャ:
/releaseコマンド: Claudeスラッシュコマンド(.claude/commands/release.md)テスト (妥協不可):
可観測性:
バージョニング:
プロジェクト構造
ドキュメント (この機能)
ソースコード (リポジトリルート)
構造決定: 既存リポジトリ構造を維持、新規ファイル最小限
Phase 0: アウトライン&リサーチ
リサーチタスク:
GitHub Actions ブランチフィルタリング:
branches:フィルタで複数ブランチを条件分岐する方法semantic-release ブランチ設定:
.releaserc.jsonのbranches設定とmainブランチ専用化gh CLI PR操作:
gh pr createの--baseオプション、PRのベースブランチ変更方法Claudeスラッシュコマンド実装:
.claude/commands/*.mdのフォーマット、semantic-release dry-run実行方法既存PR一括操作:
gh pr editでベースブランチ変更、複数PR処理のベストプラクティス出力:
research.md(各調査結果、決定事項、代替案の記録)Phase 1: 設計&契約
データモデル: N/A(インフラストラクチャ変更のため、エンティティなし)
API契約: N/A(REST/GraphQL APIなし、CI/CDワークフローのみ)
契約テスト (
/contracts/):auto-merge.contract.test.sh:
release-command.contract.test.sh:
semantic-release.contract.test.sh:
mcp-publish.contract.test.sh:
lsp-build.contract.test.sh:
統合テストシナリオ (
/tests/integration/):full-release-cycle.test.sh:
pr-migration.test.sh:
Quickstart (
quickstart.md):エージェントファイル更新:
CLAUDE.md出力: contracts/*, quickstart.md, CLAUDE.md更新
Phase 2: タスク計画アプローチ
タスク生成戦略:
順序戦略:
推定出力: tasks.mdに30個の番号付き、順序付きタスク
重要: このフェーズは/speckit.tasksコマンドで実行、/speckit.planではない
Phase 3+: 今後の実装
Phase 3: タスク実行 (/speckit.tasksコマンドがtasks.mdを作成)
Phase 4: 実装 (憲章原則に従ってtasks.mdを実行)
Phase 5: 検証 (テスト実行、quickstart.md実行、パフォーマンス検証)
複雑さトラッキング
憲章チェックに正当化が必要な違反なし
進捗トラッキング
フェーズステータス:
ゲートステータス:
憲章 v1.0.0 に基づく -
/docs/constitution.md参照Tasks
タスク: 3層リリースフロー(feature → develop → main)
入力:
/specs/SPEC-1ac96646/の設計ドキュメント前提条件: plan.md (必須), research.md, quickstart.md
実行フロー (main)
フォーマット:
[ID] [P?] 説明Phase 3.1: セットアップ (Setup)
gh auth status)Phase 3.2: テストファースト (TDD)⚠️ 3.3の前に完了必須
重要: これらのテストは記述され、実装前に失敗する必要がある
契約テスト (Contract Tests)
統合テスト (Integration Tests)
E2Eテスト (End-to-End Tests)
Phase 3.3: コア実装 (テストが失敗した後のみ)
GitHub Actionsワークフロー修正
Bashスクリプト修正/新規作成
/releaseコマンド実装
Phase 3.4: 統合 (Integration)
ドキュメント更新
Phase 3.5: 仕上げ (Polish)
既存PR移行
テスト検証
最終確認
依存関係
並列実行例
注意事項
タスク生成ルール
main()実行中に適用
Contractsから:
User Storiesから:
順序:
検証チェックリスト
ゲート: 戻る前にmain()でチェック
TDD
TODO
Research
Phase 0: リサーチ&技術調査
SPEC ID: SPEC-1ac96646
日付: 2025-11-07
ステータス: 完了
概要
本ドキュメントは、3層リリースフロー(feature → develop → main)実装に必要な技術調査結果をまとめたものです。
1. GitHub Actions ブランチフィルタリング
調査内容
branches:フィルタで複数ブランチを条件分岐する方法を調査。調査結果
現状(auto-merge.yml):
分析:
branches:は**PRのベースブランチ(マージ先)**を指定if:を使用可能決定事項
オプションA: ワークフロー分離(推奨)
理由:
オプションB: 条件分岐
却下理由:
2. semantic-release ブランチ設定
調査内容
.releaserc.jsonのbranches設定とmainブランチ専用化を確認。調査結果
現状(.releaserc.json):
{ "branches": ["main"], "tagFormat": "v${version}", "plugins": [...] }分析:
branches: ["main"]で既にmainブランチ専用on.push.branches: [main]でトリガー決定事項
変更不要:
.releaserc.jsonは現状維持branches: ["main"]のままbranches: [main]を維持理由:
3. gh CLI PR操作
調査内容
gh pr createの--baseオプション、PRのベースブランチ変更方法を調査。調査結果
PR作成(finish-feature.sh):
ベースブランチ変更(PR移行):
PRリスト取得:
決定事項
finish-feature.sh修正:
PR移行スクリプト(migrate-pr-to-develop.sh):
代替案(検討したが却下):
4. Claudeスラッシュコマンド実装
調査内容
.claude/commands/*.mdのフォーマット、semantic-release dry-run実行方法を調査。調査結果
スラッシュコマンドフォーマット:
説明
コマンドの目的と実行内容
実行手順
...
決定事項
/releaseコマンド仕様:
ファイル:
.claude/commands/release.md処理フロー:
git log main..develop --oneline)gh pr create --base main --head develop)代替案(検討したが却下):
5. 既存PR一括操作
調査内容
gh pr editでベースブランチ変更、複数PR処理のベストプラクティスを調査。調査結果
PR情報取得:
ベースブランチ変更:
べき等性保証:
決定事項
migrate-pr-to-develop.sh 仕様:
機能:
--dry-runで実行せず表示のみ)オプション:
--help: ヘルプ表示--dry-run: 変更せずに対象PRリスト表示--verbose: 詳細ログ出力代替案(検討したが却下):
まとめ
技術スタック(確定)
変更が必要なファイル
.github/workflows/auto-merge.yml:branches: [develop]のみ.specify/scripts/bash/finish-feature.sh:--base developに変更.specify/scripts/bash/migrate-pr-to-develop.sh: 新規作成.claude/commands/release.md: 新規作成CLAUDE.md: ブランチフロー説明更新README.md: リリースフロー図追加変更不要なファイル
.releaserc.json: 既にmainブランチ専用.github/workflows/release.yml: mainへのpushでトリガー済み.github/workflows/unity-cli-publish.yml: GitHub Release作成時にトリガー(ブランチ非依存).github/workflows/release-lsp.yml: タグpush時にトリガー(ブランチ非依存)補足説明:
on.release.types: [published]でトリガー。semantic-releaseがmainでGitHub Releaseを作成するため、develop/mainフロー導入後も正常動作。変更不要。on.push.tags: ['v*']でトリガー。semantic-releaseがmainでタグ(v*)を作成するため、develop/mainフロー導入後も正常動作。変更不要。リスク&対策
次のステップ
Phase 1(設計&契約)に進む準備完了:
✅ Phase 0完了
Data Model
データモデル: 3層リリースフロー
機能ID:
SPEC-1ac96646| 日付: 2025-11-07 | 仕様: spec.md概要
本機能はインフラストラクチャ変更(CI/CDワークフロー、ブランチ戦略)のため、従来のエンティティ・リレーションシップモデルではなく、ワークフロー状態とGit操作のデータフローをモデル化します。
ブランチモデル
ブランチ構造
ブランチ状態遷移
ワークフロー状態モデル
PR状態 (Pull Request State)
状態遷移:
リリース状態 (Release State)
状態遷移:
ワークフロージョブ状態 (Workflow Job State)
コマンド入出力モデル
/release コマンド
入力: なし(現在のdevelopブランチ状態を使用)
処理フロー:
出力:
finish-feature.sh コマンド
入力:
処理フロー:
出力:
GitHub Actions イベントモデル
auto-merge.yml トリガー
release.yml トリガー
publish.yml トリガー
データフロー図
完全リリースサイクル
エラー状態モデル
PR自動マージ失敗
semantic-release失敗
LSPビルド部分失敗
制約とバリデーション
ブランチ命名規則
バージョン形式
Conventional Commits
永続化
Git リポジトリ (ソース・オブ・トゥルース)
GitHub (メタデータ)
npm (配信)
ローカルファイル (一時)
注: 本データモデルはステートフルなエンティティではなく、Git/GitHub/CI/CDの状態遷移とデータフローを表現しています。インフラストラクチャ変更の性質上、RDBやORMは使用せず、Gitリポジトリ自体がデータストアとなります。
Quickstart
クイックスタートガイド: 3層リリースフロー
SPEC ID: SPEC-1ac96646
日付: 2025-11-07
概要
このガイドでは、3層リリースフロー(feature → develop → main)の初期セットアップと使用方法を説明します。
初期セットアップ
1. developブランチ作成
mainブランチから新しいdevelopブランチを作成します:
2. GitHubデフォルトブランチ変更
gh CLIでデフォルトブランチをdevelopに変更:
# デフォルトブランチをdevelopに設定 gh repo edit --default-branch developまたは GitHub Web UI:
developを選択 → Updateこれにより、新規PRのデフォルトベースがdevelopになります。
3. Branch Protection Rules設定(重要)
develop → main の自動マージを有効化するため、mainブランチにRequired status checksを設定:
{owner}と{repo}を実際の値に置き換えてください(例:
akiojin/unity-cli)設定内容:
required_status_checks.contexts: ["test"]: testチェックが必須strict: true: PRブランチがベースブランチの最新であることを要求enforce_admins: false: 管理者は制限をバイパス可能required_pull_request_reviews: null: レビュー不要allow_force_pushes: false: force pushを禁止developブランチも同様に設定(オプション):
4. 既存PRの移行(オプション)
既にmainベースのPRが存在する場合、developベースに変更します:
手動変更(PR数が少ない場合):
developを選択一括変更(PR数が多い場合):
通常の開発フロー
1. 新機能開発開始
2. 実装とコミット
3. PR作成&自動マージ(developへ)
ドラフトPR(自動マージしたくない場合):
リリースフロー(develop → main)
1. リリース準備
developブランチに複数のfeatureが蓄積された時点でリリースを実行します。
# /releaseコマンド実行 /release2. リリースコマンドの処理フロー
/releaseコマンドは以下を自動実行します:Step 1: 差分確認
# developとmainの差分を表示 git log origin/main..origin/develop --oneline差分がない場合はスキップメッセージを表示して終了。
Step 2: リリースノートプレビュー
出力例:
Step 3: ユーザー確認プロンプト
Step 4: develop → main PR作成
ユーザーが
yesを入力すると、PRを自動作成:Step 5: 完了メッセージ
3. PRマージとリリース実行(自動)
注: 手動マージは不要です。Required checksが通れば自動マージされます。
トラブルシューティング
developとmainに差分がない
→ featureブランチを開発してdevelopにマージしてから再実行
semantic-release dry-run失敗
→ Conventional Commits形式を確認(
feat:,fix:,chore:等)gh CLI認証エラー
→
gh auth loginを実行してGitHub CLIを認証PRが自動マージされない
原因と対策:
Branch Protection Rulesが未設定
Required checksが失敗している
PRがdraftモード
GitHub Actions権限不足
参考資料
specs/SPEC-1ac96646/spec.mdspecs/SPEC-1ac96646/plan.mdspecs/SPEC-1ac96646/research.md.claude/commands/release.md.specify/scripts/bash/finish-feature.sh.github/workflows/auto-merge.ymlよくある質問
Q: なぜ3層フローにしたの?
A: 以前のfeature → mainフローでは、featureがマージされるたびにリリースが実行され、リリース頻度が高すぎました。3層フローでは、developで複数のfeatureを蓄積してからmainにリリースできます。
Q: developブランチの役割は?
A: 統合ブランチとして機能します。複数のfeatureブランチをdevelopにマージして統合テストを実行し、問題がなければmainにリリースします。
Q: mainブランチの役割は?
A: リリースブランチとして機能します。mainへのマージでsemantic-releaseが実行され、npm publish、GitHub Release作成、LSPビルドが自動実行されます。
Q: 既存のfeatureブランチはどうなる?
A: 既存のfeatureブランチはそのまま使用できます。PRのベースブランチをdevelopに変更するだけです。
Q: semantic-releaseはいつ実行される?
A: mainブランチへのpushでのみ実行されます。developへのマージでは実行されません(
.releaserc.jsonのbranches: ["main"]設定により)。Q: リリース頻度はどれくらい?
A: プロジェクトの判断に依存します。developに複数のfeatureが蓄積された時点で
/releaseを実行してください。週次、月次、機能区切りなど、チームの方針に従ってください。Contracts
Migrated from local files. See artifact comments below.
Checklists
Artifact files under
checklists/are managed in issue comments withchecklist:<name>entries.Acceptance Checklist