stack-push について
stack-push は、Git ブランチスタックを公開するためのスキルです。スライスブランチを順にプッシュし、親ブランチをベースとする PR を各スライスに作成または更新して、ルート PR にスタック概要を投稿します。
主な機能
- 01スタック順にブランチを一覧表示してプッシュ
- 02各ブランチにコミットがあることを確認
- 03スライスごとに PR を作成または更新
- 04各 PR のベースを親ブランチに設定
- 05ルート PR にスタック概要表を投稿
活用シーン
- 01stack-create 後、各スライスにコミットがあるスタックを公開
- 02スライスへのコミット追加後に PR を更新
- 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が完了しており、ブランチが存在し、コミットがあるghCLI が認証済み(gh auth status)- 各スライスブランチに、ベースより先行するコミットが少なくとも 1 つある
必須の進捗トラッキング
開始前に、次の進捗項目を作成します。
stack-push:branches-listedstack-push:branches-pushedstack-push:prs-openedstack-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 番号を返す