Finishing a Development Branch
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
Syncs a fork branch with its upstream remote using a history-preserving merge commit, with no rebase and no force push.
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install code-yeongyu/senpi merge-upstream --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/code-yeongyu/senpi.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/agent/skills/merge-upstream .claude/skills/merge-upstream && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "merge-upstream" agent skill from https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstream into .claude/skills/merge-upstream/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "merge-upstream", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstreamType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install code-yeongyu/senpi merge-upstream --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/code-yeongyu/senpi.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/agent/skills/merge-upstream .agents/skills/merge-upstream && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "merge-upstream" agent skill from https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstream into .agents/skills/merge-upstream/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "merge-upstream", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install code-yeongyu/senpi merge-upstream --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/code-yeongyu/senpi.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/agent/skills/merge-upstream .cursor/skills/merge-upstream && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "merge-upstream" agent skill from https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstream into .cursor/skills/merge-upstream/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "merge-upstream", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/code-yeongyu/senpi.git --path .github/agent/skills/merge-upstream--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install code-yeongyu/senpi merge-upstream --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/code-yeongyu/senpi.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/agent/skills/merge-upstream .gemini/skills/merge-upstream && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "merge-upstream" agent skill from https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstream into .gemini/skills/merge-upstream/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "merge-upstream", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install code-yeongyu/senpi merge-upstreamInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/code-yeongyu/senpi.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/agent/skills/merge-upstream .github/skills/merge-upstream && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "merge-upstream" agent skill from https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstream into .github/skills/merge-upstream/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "merge-upstream", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install code-yeongyu/senpi merge-upstream --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/code-yeongyu/senpi.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/agent/skills/merge-upstream .opencode/skills/merge-upstream && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "merge-upstream" agent skill from https://github.com/code-yeongyu/senpi/tree/main/.github/agent/skills/merge-upstream into .opencode/skills/merge-upstream/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "merge-upstream", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
merge-upstreamSyncs a fork branch with its upstream remote using a history-preserving merge commit, with no rebase and no force push.
The agent merges the upstream branch into the current fork branch with a merge commit by default, keeping local commit hashes and never rewriting history. It will not run `git rebase`, will not force push or use `--force-with-lease`, will not bypass hooks or signing, and asks before pushing.
The workflow validates the repository, requires a clean worktree, detects the upstream default branch or uses the `--base` option, fetches enough history for a reliable merge base (unshallowing first when needed) and records the exact refs with full SHAs and divergence counts before merging. `--ff-allow` permits a fast-forward when the branch has no unique local commits; without it a no-fast-forward merge leaves an explicit sync commit. The agent aborts on a detached HEAD or a missing `upstream` remote and skips the push when `origin` is missing.
9 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 6073042. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Merge Upstream into Fork loads about 1.6k tokens when it runs. Until then it costs about 64 tokens; SKILL.md has 524 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from code-yeongyu/senpi at commit 6073042, republished under its MIT licence (© code-yeongyu). 524 words, ~1,603 tokens.
.claude/skills/merge-upstream/SKILL.md (or your agent's skills folder).Sync the current fork branch with upstream/<branch> using a merge commit by default. Preserve local commit hashes, keep push non-destructive, and never rewrite history.
Treat these as equivalent triggers:
/merge-upstream [--base=<branch>] [--ff-allow]
merge upstream [--base=<branch>] [--ff-allow]
sync fork with upstreamOptions:
--base=<branch>: use that upstream branch instead of auto-detecting the upstream default branch.--ff-allow: allow git merge --ff-only when the current branch has no unique local commits. Without this, use git merge --no-ff to leave an explicit sync commit.git rebase.git push --force or git push --force-with-lease.--no-verify or --no-gpg-sign.Validate the repository:
git rev-parse --is-inside-work-tree
git branch --show-current
git remote get-url upstream
git remote get-url originAbort on detached HEAD or missing upstream. If origin is missing, continue locally and skip push.
Require a clean worktree:
worktree_status=$(git status --porcelain) || exit 1
test -z "$worktree_status"If dirty, stop and ask the user to clean or commit the changes, or use a clean task worktree.
Detect the upstream target branch:
--base=<branch> is provided, fetch and verify upstream/<branch>.git remote set-head upstream -a, then read refs/remotes/upstream/HEAD.--base=<branch>.Fetch enough history for a reliable merge base:
git rev-parse --is-shallow-repository
git fetch --tags upstream "+refs/heads/${upstream_branch}:refs/remotes/upstream/${upstream_branch}"
origin_branch_exists=false
if git remote get-url origin >/dev/null 2>&1; then
if ! origin_branch=$(git ls-remote --heads origin "refs/heads/${current_branch}"); then
echo "failed to inspect origin/${current_branch}" >&2
exit 1
elif [ -n "$origin_branch" ]; then
git fetch origin "+refs/heads/${current_branch}:refs/remotes/origin/${current_branch}" || exit 1
origin_branch_exists=true
else
echo "origin/${current_branch} does not exist; current branch is unpublished"
fi
fi
git merge-base HEAD "upstream/${upstream_branch}"If the repository is shallow, unshallow origin first when available, then upstream only if still shallow.
Always use the fetched remote-tracking ref as the target; do not decide from a previously cached upstream/<branch> tip.
Record the exact refs and report divergence:
current_head=$(git rev-parse HEAD)
upstream_tip=$(git rev-parse "upstream/${upstream_branch}")
git rev-list --count "upstream/${upstream_branch}..HEAD"
git rev-list --count "HEAD..upstream/${upstream_branch}"
GIT_PAGER=cat git log --oneline "HEAD..upstream/${upstream_branch}"
GIT_PAGER=cat git log --first-parent --oneline "upstream/${upstream_branch}..HEAD"Report HEAD and upstream/${upstream_branch} with their full SHAs.
Merge:
Behind 0 means the fetched upstream_tip is already an ancestor of current_head. Confirm that state with both checks:
git merge-base --is-ancestor "$upstream_tip" "$current_head"
upstream_range=$(git rev-list "$current_head..$upstream_tip") || exit 1
test -z "$upstream_range"This completes upstream integration as a successful no-op. Report the exact refs, SHAs, ancestry result, and empty range; skip the merge, release, and other change-dependent gates. Do not create an empty commit or pull request, or publish a branch solely to represent the sync. If an independent request explicitly approves pushing existing local commits, use step 9's non-destructive push semantics.
If behind is greater than 0 and --ff-allow is set with ahead 0, run:
git merge --ff-only "upstream/${upstream_branch}"Otherwise capture previous_head and upstream_tip, then run:
git merge --no-ff "upstream/${upstream_branch}" -m "merge: sync ${current_branch} with upstream/${upstream_branch}"Resolve conflicts locally when they occur:
git diff --name-only --diff-filter=URead each conflicted file. Auto-resolve only mechanically obvious conflicts such as non-overlapping additions, import unions, formatting-only differences, or generated lockfile refreshes. For semantic conflicts, present the specific conflict and ask whether to keep ours, keep theirs, manually edit, or abort. After resolution:
git add <file>
git -c core.editor=true merge --continueVerify:
git rev-parse --git-path MERGE_HEAD
git rev-parse --git-path rebase-merge
git rev-parse --git-path rebase-apply
git show -s --format=%P HEAD
git rev-list --left-right --count "upstream/${upstream_branch}...HEAD"
if [ "$origin_branch_exists" = true ]; then
git merge-base --is-ancestor "origin/${current_branch}" HEAD
fiIn default mode, verify HEAD has two parents: previous_head as first parent and upstream_tip as second parent. In --ff-allow fast-forward mode, verify HEAD equals upstream_tip.
Push only with explicit approval:
GIT_PAGER=cat git log --oneline --graph --decorate -10
git push origin "${current_branch}"If the remote branch does not exist, use git push -u origin "${current_branch}". If push is rejected as non-fast-forward, re-fetch and offer only non-destructive options: merge origin/<branch> into HEAD and retry, or stop.
Include:
HEAD..upstream/<branch> range© code-yeongyu, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .github/agent/skills/merge-upstream of code-yeongyu/senpi.
Open the folder on GitHubat commit 6073042
Merge Upstream into Fork next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Merge Upstream into Fork this skillcode-yeongyu/senpi | 472 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 296k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Code Design Rationale Investigatorcursor/plugins | 10k | 9 repos | ~2.6k | Automated safety check: Pass | None | |
| Contributor-First PR MergeHKUDS/OpenHarness | 16k | 1 repos | ~847 | Automated safety check: Pass | MIT | |
| Migrate Internal Package into GhostTryGhost/Ghost | 55k | — | ~3.8k | Automated safety check: Pass | MIT | |
| Create Pull Requestcline/cline | 70k | 1 repos | ~1.6k | Automated safety check: Pass | Apache-2.0 |
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
cursor/plugins
Digs into why code is shaped the way it is by checking git history, pull requests and connected tools in parallel, then reporting a cited read on the tradeoffs.
HKUDS/OpenHarness
Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.
TryGhost/Ghost
Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.
cline/cline
Opens a GitHub pull request from your current branch with the gh CLI, after reviewing the commits and diff and gathering the details the PR needs.
tailcallhq/forgecode
Resolves Git merge conflicts with a plan-first workflow that keeps both sides' intent, regenerates lock files and backs up deleted-but-modified files.
code-yeongyu/senpi
Checks changes to the senpi coding agent by driving the real CLI from source in an isolated sandbox, over RPC, terminal UI, mock model and CLI smoke channels.
code-yeongyu/senpi
Points the agent at Bun 1.4 built-in APIs before it installs an npm package, so image, browser, markdown, cron, PTY and test work uses what Bun already ships.
code-yeongyu/senpi
Worker brief for implementing one pre-assigned feature in the senpi todotools built-in extension, with strict scope, typing, testing and git-safety rules.
code-yeongyu/senpi
Prompt-crafting guide for gpt-image-2.5: which image tool to call, which model to pick, and how to write prompts, edit with references and refine over turns.
code-yeongyu/senpi
Walks the canonical CalVer release flow for senpi, from a clean main checkout through changelog audit, checks, tag push, GitHub Release and npm publishing.
code-yeongyu/senpi
Runs one manual QA scenario for the todo continuation feature in the real ./pi-test.sh CLI inside tmux, captures scrollback and checks a deterministic count marker.
Works with
Categories
Syncs a fork branch with its upstream remote using a history-preserving merge commit, with no rebase and no force push. The agent merges the upstream branch into the current fork branch with a merge commit by default, keeping local commit hashes and never rewriting history. It will not run `git rebase`, will not force push or use `--force-with-lease`, will not bypass hooks or signing, and asks before pushing.
Merge Upstream into Fork fits situations like: bringing upstream changes into a fork without rebasing; syncing a fork branch when force-pushing is not allowed; merging upstream's default branch with an explicit sync commit.
Run `npx skills add code-yeongyu/senpi --skill merge-upstream -a claude-code`. Or copy the skill folder (.github/agent/skills/merge-upstream in code-yeongyu/senpi) into .claude/skills/merge-upstream in your project. Claude Code loads it when a task matches its description.
Run `npx skills add code-yeongyu/senpi --skill merge-upstream -a codex`. Or copy the skill folder (.github/agent/skills/merge-upstream in code-yeongyu/senpi) into .agents/skills/merge-upstream in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add code-yeongyu/senpi --skill merge-upstream -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/merge-upstream, .gemini/skills/merge-upstream, .github/skills/merge-upstream and .opencode/skills/merge-upstream in your project.
Going by SKILL.md and its folder, Merge Upstream into Fork needs the command-line tools its instructions call (git). Our summary lists: A Git repository with an `upstream` remote and a clean worktree.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Merge Upstream into Fork is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.6k tokens (SKILL.md is roughly 6.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Merge Upstream into Fork: Finishing a Development Branch (obra/superpowers, 296k stars), Code Design Rationale Investigator (cursor/plugins, 10k stars), Contributor-First PR Merge (HKUDS/OpenHarness, 16k stars) and Migrate Internal Package into Ghost (TryGhost/Ghost, 55k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
code-yeongyu (a GitHub user) maintains it in code-yeongyu/senpi, which has 472 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 8, 2026.
Source: code-yeongyu/senpi on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.