Skip to content
Development
Skill

/stack-push

Pushes all branches in a stack and opens or updates one dependent PR per slice. Use after stack-create to publish the stack or after adding commits to a slice.

From plugin
claude-night-market
337200 skills59 agents162 commands1 MCP
Install
$ npx -y skills add athola/claude-night-market --skill stack-push --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/stack-push

Context preview

The summary Claude sees to decide when to auto-load this skill.

Pushes all branches in a stack and opens or updates one dependent PR per slice. Use after stack-create to publish the stack or after adding commits to a slice.

SKILL.md

stack-push.SKILL.md
name: stack-push
description: Pushes all branches in a stack and opens or updates one dependent PR per slice. Use after stack-create to publish the stack or after adding commits to a slice.
alwaysApply: false
category: workflow-automation
tags:
- git
- stacked-diffs
- pr
- push
- github
tools: []
complexity: medium
model_hint: standard
estimated_tokens: 900
dependencies:
- sanctum:stack-create
- sanctum:pr-prep
- sanctum:git-workspace-review

Stack Push

Push all branches in a stack and open (or update) one PR per slice, with each PR targeting its parent branch as base.

When To Use

Run `stack-push` after `stack-create` has initialized the branch topology and at least one commit exists on each slice branch. Also run it after adding commits to any slice to update open PRs.

When NOT To Use

  • No stack exists yet (use `sanctum:stack-create`)
  • The base merged and the stack must catch up (use

`sanctum:stack-rebase`)

Prerequisites

  • `stack-create` completed: branches exist with commits
  • `gh` CLI authenticated (`gh auth status`)
  • Each slice branch has at least one commit beyond its base

Required Progress Tracking

Create `TodoWrite` items before starting:

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

Step 1: List Stack Branches (`branches-listed`)

Identify all branches in the stack. By convention they share a `stack/<feature-name>/` prefix:

STACK=stack/my-feature
BASE=master

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

Verify each branch has commits beyond the base:

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

Any branch showing `0 commits` must have work added before pushing.

Step 2: Push Branches (`branches-pushed`)

Push every slice branch to the remote in stack order (base slice first):

for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//' | sort); do
  git push --set-upstream origin "${branch}"
  echo "pushed: ${branch}"
done

jj Accelerator (if available)

jj git push --all

Step 3: Open or Update PRs (`prs-opened`)

Create one PR per slice, targeting its parent branch. For the first slice the parent is `master`; for subsequent slices the parent is the previous slice's branch.

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

Fill in the actual PR titles and bodies before removing the `--draft` flag. Run `Skill(sanctum:pr-prep)` on each slice to generate quality-gated descriptions.

Step 4: Post Stack Summary (`stack-summary-posted`)

After all PRs are open, post a summary comment on the first PR (the root of the stack) listing the full chain:

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}")"

Notes

  • Always push in stack order so GitHub sees the parent

branch before the child PR is opened

  • Use `--draft` by default; promote slices to ready

individually as they pass review

  • After any `git rebase --update-refs` run, re-push with

`git push --force-with-lease` (never `--force`)

  • When a base PR merges, run `Skill(sanctum:stack-rebase)`

to cascade the rebase before updating the next PR's base

Exit Criteria

  • [ ] All 4 TodoWrite items (`stack-push:branches-listed` through

`stack-push:stack-summary-posted`) are created before pushing starts and marked complete in order

  • [ ] Each slice branch confirmed to have ≥ 1 commit beyond its base

before `git push` is called; branches with 0 commits are blocked

  • [ ] One draft PR opened per slice, each targeting its parent branch

as base (root slice targets `master`/`main`)

  • [ ] Root PR receives a `## Stack` comment containing a table with

columns `#`, `Branch`, and `PR` listing all slices

  • [ ] `gh pr list --head <branch>` returns a PR number for each

pushed branch after the step completes

Read more
Ships withclaude-night-market

A plugin marketplace for Claude Code. Install only the plugins you need to run git workflows, code review, spec-driven development, and autonomous agents from inside your Claude Code session.

Get the whole plugin

Other skills on claude-night-market.