mcpField
S
stack-push

stack-push

github.com/athola开发34375 次安装1 天前更新
代码仓库

关于 stack-push

stack-push 是用于 Git 分支栈的技能,供开发者按顺序推送切片分支,并为每个切片创建或更新 PR。它将每个 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确认已加载。

详细介绍

原文在翻译后有更新,译文可能不是最新。

Stack Push

推送堆栈中的所有分支,并为每个切片打开(或更新)一个 PR,
每个 PR 均以其父分支为目标分支。

适用场景

在 stack-create 初始化分支拓扑且每个切片分支上至少有
一个提交后,运行 stack-push。
向任一切片添加提交后,也要运行此命令以更新
已打开的 PR。

不适用场景

  • 尚无堆栈(使用 sanctum:stack-create)
  • 基分支已合并,堆栈需要跟进(使用
    sanctum:stack-rebase)

前置条件

  • 已完成 stack-create:分支已创建且包含提交
  • gh CLI 已通过身份验证(gh auth status)
  • 每个切片分支相较其基分支至少有一个提交

必需的进度跟踪

开始前创建 TodoWrite 项:

  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)

为每个切片创建一个 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 合并后,运行 Skill(sanctum:stack-rebase),
    先级联变基,再更新下一个 PR 的目标分支

完成标准

  • 所有 4 个 TodoWrite 项(从 stack-push:branches-listed 到
    stack-push:stack-summary-posted)都在开始推送前创建,
    并按顺序标记为已完成
  • 调用 git push 前,已确认每个切片分支相较其基分支至少有 1 个提交;
    有 0 个提交的分支不得推送
  • 每个切片均打开一个草稿 PR,且以其父分支为目标分支
    (根切片以 master/main 为目标分支)
  • 根 PR 收到一条 ## Stack 评论,其中包含一个表格,列为
    #、Branch 和 PR,并列出所有切片
  • 此步骤完成后,gh pr list --head <branch> 对每个已推送分支
    都会返回一个 PR 编号

评论

支持 Markdown