mcpField
U
update-branch

update-branch

github.com/patinaproject開発189 回インストール1 日前に更新
リポジトリ

update-branch について

ローカルの作業ブランチに適切なターゲットブランチをマージして更新するリポジトリ向けスキルです。プルリクエストの情報または指定引数からターゲットを選び、競合や検証、リモート更新に安全策を設けています。

主な機能

  1. 01プルリクエストまたは引数からターゲットを選択
  2. 02自動コミットせずにフェッチとマージ
  3. 03リポジトリ状態とブランチ識別情報の確認
  4. 04指定スキルを使った競合処理
  5. 05関連するリポジトリチェックの実行
  6. 06既定ではリモートブランチを変更しない

活用シーン

  1. 01作業ブランチをプルリクエストの対象に更新
  2. 02指定したターゲットをローカルブランチにマージ
  3. 03競合解決後の変更を検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/patinaproject/skills --skill update-branch

インストール後、Claude Code で/update-branchを入力して読み込まれたか確認します。

同梱ファイルscripts/update-context.sh

詳細

ブランチを更新する

ローカルの作業ブランチから実行します。

/update-branch
/update-branch release/1.x

現在のブランチにオープンなプルリクエストが1つある場合は、ユーザーが別のターゲットを指定していても、そのプルリクエストのターゲットブランチを必ず使用します。オープンなプルリクエストがない場合は、指定されたターゲットを使用し、指定がなければ origin/HEAD を使用します。

フェッチとマージには git を使用します。gh はプルリクエストのデータを読み取る場合にのみ使用します。同梱の scripts/update-context.sh がターゲットを選択し、プルリクエストのコンテキストを検証します。プルリクエストのないブランチはローカルにとどまります。オペレーターがヘルパーの push コマンドを使ってリモート更新を明示的に要求しない限り、この実行ではリモートブランチにプッシュしません。

要件

  • ターゲット引数は0個または1個を受け付けます。
  • detached HEAD または origin リモートがない場合は停止します。
  • プルリクエストの検索には gh が必要です。検索に失敗した場合はエラーとし、プルリクエストが存在しない証拠とは見なしません。
  • プルリクエストも明示的なターゲットもない場合は、origin/HEAD が必要です。存在しない場合は、ユーザーに git remote set-head origin -a の実行を案内します。
  • デフォルトブランチ名が main または master だと決めつけてはいけません。
  • ユーザーがターゲットを指定し、デフォルトブランチを変更することを明示的に確認した場合を除き、リポジトリのデフォルトブランチを更新してはいけません。
  • すべてのマージコンフリクトに fix-merge-conflicts を使用します。コンフリクトを編集する前に、"$UPDATE_BRANCH_HELPER" require-conflict-skill を実行します。ヘルパーがスキルが見つからないと通知した場合は、スキルをインストールするか停止します。

ワークフロー

  1. コミット、チェック、保護されたブランチに関するリポジトリの指示を読みます。

  2. git branch --show-current の結果を記録し、リポジトリのデフォルトブランチと比較します。ユーザーが明示的に許可していない場合は、デフォルトブランチ上で停止します。

  3. 作業ディレクトリにはコンシューマーリポジトリを使用します。このスキルのインストール先ディレクトリを絶対パスで解決してから、次を実行します。

    UPDATE_BRANCH_HELPER="<absolute installed skill directory>/scripts/update-context.sh"
    "$UPDATE_BRANCH_HELPER" resolve [target]
    

    返されたモード、現在のブランチ、正規化されたターゲット、プルリクエスト番号と URL、プルリクエストのヘッド、両方のリポジトリの識別情報を記録します。ヘルパーは、プルリクエストのベースリポジトリと一致するフェッチリモート、およびプッシュ URL がプルリクエストのヘッドリポジトリと一致する設定済みアップストリームを必要とします。ワークフローがローカルまたはリモートの状態を変更する前に、識別情報がない場合、曖昧な場合、または一致しない場合は処理を拒否します。pull-request モードではプルリクエストのターゲットを使用します。local-only モードでは、明示的なターゲットまたは origin/HEAD を使用します。

  4. 選択したターゲットを最初の / で分割し、リモートとブランチを取得します。そのブランチをそのリモートからフェッチします。フォークのプルリクエストでは upstream などのベースリモートを選択できます。local-only のターゲットでは origin を使用します。git rev-parse <target> の結果をターゲットの正確なコミットとして記録します。

  5. git status --short を実行し、ステージ済み、未ステージ、未追跡のファイルを確認します。変更されたすべてのファイルが1つの明確な変更に属し、秘密情報である可能性が高い内容を含まず、リポジトリで必須のコミット形式を使用できる場合に限り、既存の作業を自動的にコミットします。コミット前に、正確なファイル名とコミットメッセージをユーザーに伝えます。変更が混在している、または内容が不明確な場合、生成ファイルの出所が不明な場合、秘密情報の可能性がある場合、あるいは必須の課題参照を特定できない場合は停止します。

  6. コミットせずにマージを開始します。

    git merge --no-commit --no-ff <target>
    

    Git が Already up to date と表示した場合は、マージコミットは不要です。

  7. コンフリクトが発生した場合は、必要なスキルの確認を実行し、この変更において正しい結果が明確で検証可能なコンフリクトには fix-merge-conflicts を使用します。コンフリクトの解決にプロダクト上の判断、無関係な作業、利用できないアクセス、秘密情報の取り扱い、生成ファイルに関する知識、または動作の推測が必要な場合は、マージを中止してユーザーに確認します。コンシューマーリポジトリからスキルの確認を実行します。

    "$UPDATE_BRANCH_HELPER" require-conflict-skill
    
  8. マージによってパッケージマニフェスト、ロックファイル、ワークスペースファイル、またはツールチェーンのバージョンが変更されたか確認します。変更されている場合は、検証の前にリポジトリの手順に記載されたインストールまたはセットアップコマンドを実行します。コマンドが記載されていない場合は中止します。生成された依存関係の変更は、記載されたコマンドによって生成され、かつこのブランチの更新に属する場合に限り含めます。

  9. 変更されたコード、解決した競合、および影響を受ける依存関係を対象とする、リポジトリに記載されたチェックを実行します。該当するローカルチェックがない場合は、その旨を明記します。

    リポジトリの手順でこの変更に必要とされている場合に限り、リポジトリ全体を対象とする追加チェックが必要です。必要なチェックまたは関連するチェックが失敗した場合は、マージを中止して停止します。

    関連するチェックに合格しても、リポジトリ全体を対象とする追加チェックに失敗した場合、同じ問題が取得したターゲットコミットにすでに存在していたことを証明した後に限り、続行できます。次のいずれかを示して証明してください。

    • 失敗の原因となるソースとルール、設定、または入力が、ターゲットコミットから変更されていないこと
    • ターゲットコミットでコマンドを実行した場合にも、同じ失敗が発生すること

    ターゲットコミット、コマンド、失敗したチェック、および比較結果を記録します。ブランチによって失敗に関与する入力が変更されている場合、マージによる相互作用で失敗が発生した場合、またはリポジトリの手順でリポジトリ全体を対象とするコマンドが必要とされている場合は、続行しないでください。後の実行で比較結果を再利用できるのは、ターゲットコミット、コマンド、失敗したチェック、および比較結果が変わっていない場合に限ります。

  10. 検証後もマージが未完了の場合は、リポジトリで通常使用されているコミット形式とフックを使って、マージコミットを作成します。

  11. リモートを変更せずに完了します。pull-request モードでは、ローカルのマージ内容と取得したプルリクエストのコンテキストを報告します。オペレーターがリモートの更新を明示的に依頼した場合は、次を実行します。

    "$UPDATE_BRANCH_HELPER" push <pr-number> <target> <pr-head> <base-repository> <head-repository>
    

    resolve で取得した識別情報を変更せずに渡します。このヘルパーはプルリクエストと両方のリモート識別情報を検証し、設定済みのアップストリームにプッシュした後、プルリクエストを再度検証します。プッシュ中にプルリクエストが変更された場合、またはその検索に失敗した場合は、リモートブランチは更新されましたが、プルリクエストの結果は不確かであると伝えます。失敗した場合は、ヘルパーのメッセージまたは失敗した git push の出力を報告し、プルリクエストが更新されたと主張しないでください。local-only モードでは、ブランチが未プッシュのままであることを報告し、任意のコマンド git push origin HEAD を記載します。

マージの安全性

このブランチの更新に含まれる明確な競合を解決している間に限り、マージを未完了のままにします。停止する前に git merge --abort を実行し、ブランチをマージ前の状態に戻します。リベース、強制プッシュ、履歴の書き換え、無関係なファイルの追加は行わないでください。

最終報告

現在のブランチ、選択したターゲット、正確なターゲットコミット、およびターゲットの選択方法を報告します。既存の作業をコミットしたか、マージコミットを作成したか、依存関係を更新したか、競合を解決したか、チェックに合格したか、リモートブランチをプッシュしたかを明記します。更新を中止せずにリポジトリ全体を対象とする追加チェックが失敗した場合は、ターゲットコミット、コマンド、失敗したチェック、および比較結果を記載します。ローカルのみの作業の場合は、ブランチが未プッシュのままであることを伝え、git push origin HEAD を記載します。

コメント