mcpField
S
stack-push

stack-push

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

stack-push について

stack-push は、Git ブランチスタックを公開するためのスキルです。スライスブランチを順にプッシュし、親ブランチをベースとする PR を各スライスに作成または更新して、ルート PR にスタック概要を投稿します。

主な機能

  1. 01スタック順にブランチを一覧表示してプッシュ
  2. 02各ブランチにコミットがあることを確認
  3. 03スライスごとに PR を作成または更新
  4. 04各 PR のベースを親ブランチに設定
  5. 05ルート PR にスタック概要表を投稿

活用シーン

  1. 01stack-create 後、各スライスにコミットがあるスタックを公開
  2. 02スライスへのコミット追加後に PR を更新
  3. 03親子関係に沿ってスタックのドラフト PR を作成

インストール

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

$npx skills add https://github.com/athola/claude-night-market --skill stack-push

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

詳細

スタックをプッシュする

スタック内のすべてのブランチをプッシュし、スライスごとに 1 つの PR を開く(または更新する)。各 PR のベースには、親ブランチを指定します。

使用するタイミング

stack-create でブランチのトポロジーを初期化し、各スライスブランチに少なくとも 1 つのコミットがある状態になったら、stack-push を実行します。 また、いずれかのスライスにコミットを追加した後、開いている PR を更新するためにも実行します。

使用しないタイミング

  • まだスタックがない場合(sanctum:stack-create を使用)
  • ベースがマージされ、スタックを追従させる必要がある場合(sanctum:stack-rebase を使用)

前提条件

  • stack-create が完了しており、ブランチが存在し、コミットがある
  • gh CLI が認証済み(gh auth status)
  • 各スライスブランチに、ベースより先行するコミットが少なくとも 1 つある

必須の進捗トラッキング

開始前に、次の進捗項目を作成します。

  1. stack-push:branches-listed
  2. stack-push:branches-pushed
  3. stack-push:prs-opened
  4. stack-push:stack-summary-posted

ステップ 1:スタックブランチを一覧表示する(branches-listed)

スタック内のすべてのブランチを特定します。 慣例として、ブランチ名には共通の stack/<feature-name>/ プレフィックスが付きます。

STACK=stack/my-feature
BASE=master

git branch --list "${STACK}/*" | sed 's/^[* ]*//'

各ブランチがベースより先行するコミットを持つことを確認します。

for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//'); do
  count=$(git rev-list --count \
    "$(git merge-base ${BASE} ${branch})..${branch}")
  echo "${branch}: ${count} commit(s)"
done

0 commits と表示されるブランチは、プッシュする前に作業を追加する必要があります。

ステップ 2:ブランチをプッシュする(branches-pushed)

すべてのスライスブランチを、スタックの順序(ベーススライスを最初)でリモートにプッシュします。

for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//' | sort); do
  git push --set-upstream origin "${branch}"
  echo "pushed: ${branch}"
done
jj による高速化(利用可能な場合)
jj git push --all

ステップ 3:PR を開く、または更新する(prs-opened)

スライスごとに 1 つの PR を作成し、親ブランチをターゲットにします。 最初のスライスの親は master です。以降のスライスの親は、直前のスライスのブランチです。

PREV_BASE=master

for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//' | sort); do

  # Check if a PR already exists for this branch
  existing=$(gh pr list \
    --head "${branch}" \
    --json number \
    --jq '.[0].number' 2>/dev/null)

  if [ -n "${existing}" ]; then
    echo "PR #${existing} already open for ${branch} -- skipping"
  else
    gh pr create \
      --base "${PREV_BASE}" \
      --head "${branch}" \
      --title "[$(echo ${branch} | sed 's|.*/||')] <title>" \
      --body "Part of stack \`${STACK}\`." \
      --draft
    echo "opened PR for ${branch} (base: ${PREV_BASE})"
  fi

  PREV_BASE="${branch}"
done

--draft フラグを削除する前に、実際の PR タイトルと本文を入力します。 各スライスで Skill(sanctum:pr-prep) を実行し、品質基準を満たした説明を生成します。

ステップ 4:スタックの概要を投稿する(stack-summary-posted)

すべての PR を開いたら、スタックのルートである最初の PR に、全体のチェーンを記載した概要コメントを投稿します。

ROOT_PR=$(gh pr list \
  --head "${STACK}/$(git branch --list \
    "${STACK}/*" | sed 's/^[* ]*//' | sort | head -1 \
    | sed 's|.*/||')" \
  --json number --jq '.[0].number')

# Build the stack table
BODY="## Stack\n\n| # | Branch | PR |\n|---|--------|----|\n"
N=1
for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//' | sort); do
  pr_num=$(gh pr list --head "${branch}" \
    --json number --jq '.[0].number')
  BODY="${BODY}| ${N} | \`${branch}\` | #${pr_num} |\n"
  N=$((N+1))
done

gh pr comment "${ROOT_PR}" --body "$(printf "${BODY}")"

注意事項

  • GitHub が子 PR を開く前に親ブランチを認識できるよう、必ずスタックの順序でプッシュします
  • デフォルトでは --draft を使用し、レビューを通過したスライスを個別にレディ状態にします
  • git rebase --update-refs を実行した後は、git push --force-with-lease で再プッシュします(--force は使用しないでください)
  • ベース PR がマージされたら、次の PR のベースを更新する前に Skill(sanctum:stack-rebase) を実行し、連鎖的にリベースします

完了条件

  • 4 つすべての進捗項目(stack-push:branches-listed から stack-push:stack-summary-posted まで)がプッシュ開始前に作成され、 順番どおりに完了としてマークされている
  • git push を実行する前に、各スライスブランチがベースより先行する コミットを 1 つ以上持つことを確認している。コミットが 0 個のブランチはブロックされている
  • スライスごとに 1 つのドラフト PR が開かれ、それぞれのベースに親ブランチが指定されている (ルートスライスのターゲットは master/main)
  • ルート PR に、すべてのスライスを一覧表示する #、Branch、PR 列を含む表を含んだ ## Stack コメントが投稿されている
  • ステップ完了後、プッシュした各ブランチについて gh pr list --head <branch> が PR 番号を返す

コメント