Agent skill

Merge Upstream into Fork

by code-yeongyu in code-yeongyu/senpi

Syncs a fork branch with its upstream remote using a history-preserving merge commit, with no rebase and no force push.

MITAuto-check passedDevelopment

Install Merge Upstream into Fork

skills CLI
$ npx skills add code-yeongyu/senpi --skill merge-upstream -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install code-yeongyu/senpi merge-upstream --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
merge-upstream
GitHub stars
472
Token cost
~1.6k tokens
SKILL.md length
524 words
Files
1
Skills in repo
7
Repo updated
First seen
Licence
MIT

At a glance

Syncs a fork branch with its upstream remote using a history-preserving merge commit, with no rebase and no force push.

  • Works in 9 steps: Validate the repository → Require a clean worktree → Detect the upstream target branch → …
  • Bringing upstream changes into a fork without rebasing
  • SKILL.md covers Usage, Invariants, Workflow and Final Report
  • Calls git

What it does

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.

When your agent uses it

  • 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

Example prompts

  • “Sync my fork with upstream, and ask me before you push anything.”
  • “Merge upstream main into my branch with --ff-allow.”
  • “Sync my fork with upstream but leave a merge commit so the history stays intact.”

Requirements

  • A Git repository with an `upstream` remote and a clean worktree

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. Validate the repository
  2. Require a clean worktree
  3. Detect the upstream target branch
  4. Fetch enough history for a reliable merge base
  5. Record the exact refs and report divergence
  6. Merge
  7. Resolve conflicts locally when they occur
  8. Verify
  9. Push only with explicit approval

What it can do on your machine

Read from SKILL.md and the folder at commit 6073042. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~64
When it runs · the whole SKILL.md, loaded when a task matches
~1.6k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from code-yeongyu/senpi at commit 6073042, republished under its MIT licence (© code-yeongyu). 524 words, ~1,603 tokens.

Download SKILL.mdSave it as .claude/skills/merge-upstream/SKILL.md (or your agent's skills folder).
name
merge-upstream
description
Sync a fork branch with an upstream remote using a history-preserving merge. Use this whenever the user says /merge-upstream, merge upstream, sync upstream, sync fork, or wants upstream changes integrated without rebasing or force-pushing.

Merge Upstream

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.

Usage

Treat these as equivalent triggers:

text
/merge-upstream [--base=<branch>] [--ff-allow]
merge upstream [--base=<branch>] [--ff-allow]
sync fork with upstream

Options:

  • --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.

Invariants

  • Do not run git rebase.
  • Do not run git push --force or git push --force-with-lease.
  • Do not bypass hooks or signing with --no-verify or --no-gpg-sign.
  • Ask before pushing.

Workflow

  1. Validate the repository:

    bash
    git rev-parse --is-inside-work-tree
    git branch --show-current
    git remote get-url upstream
    git remote get-url origin

    Abort on detached HEAD or missing upstream. If origin is missing, continue locally and skip push.

  2. Require a clean worktree:

    bash
    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.

  3. Detect the upstream target branch:

    • If --base=<branch> is provided, fetch and verify upstream/<branch>.
    • Otherwise run git remote set-head upstream -a, then read refs/remotes/upstream/HEAD.
    • If detection fails, ask the user for --base=<branch>.
  4. Fetch enough history for a reliable merge base:

    bash
    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.

  5. Record the exact refs and report divergence:

    bash
    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.

  6. Merge:

    • Behind 0 means the fetched upstream_tip is already an ancestor of current_head. Confirm that state with both checks:

      bash
      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:

      bash
      git merge --ff-only "upstream/${upstream_branch}"
    • Otherwise capture previous_head and upstream_tip, then run:

      bash
      git merge --no-ff "upstream/${upstream_branch}" -m "merge: sync ${current_branch} with upstream/${upstream_branch}"
  7. Resolve conflicts locally when they occur:

    bash
    git diff --name-only --diff-filter=U

    Read 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:

    bash
    git add <file>
    git -c core.editor=true merge --continue
  8. Verify:

    bash
    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
    fi

    In 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.

  9. Push only with explicit approval:

    bash
    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.

Show full SKILL.md (42 more words)Show less

Final Report

Include:

  • branch and upstream target, including their full SHAs
  • whether merge, fast-forward, or no-op happened
  • for a no-op, confirmed ancestry and the empty HEAD..upstream/<branch> range
  • fork commits preserved
  • upstream commits integrated
  • push status
  • any conflicts and how they were resolved

© 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

Files

Just SKILL.md in .github/agent/skills/merge-upstream of code-yeongyu/senpi.

Open the folder on GitHubat commit 6073042

Compare with similar skills

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.

Merge Upstream into Fork compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Merge Upstream into Fork this skillcode-yeongyu/senpi472—~1.6kAutomated safety check: PassMIT
Finishing a Development Branchobra/superpowers296k5 repos~1.9kAutomated safety check: PassMIT
Code Design Rationale Investigatorcursor/plugins10k9 repos~2.6kAutomated safety check: PassNone
Contributor-First PR MergeHKUDS/OpenHarness16k1 repos~847Automated safety check: PassMIT
Migrate Internal Package into GhostTryGhost/Ghost55k—~3.8kAutomated safety check: PassMIT
Create Pull Requestcline/cline70k1 repos~1.6kAutomated safety check: PassApache-2.0

Similar skills

  • 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.

    296k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Official

    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.

    10k GitHub starsUsed in 9 repos~2.6k tokens
    DevelopmentAuto-check passed
  • Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.

    16k GitHub starsUsed in 1 repo~847 tokens
    DevelopmentAuto-check passed
  • 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.

    55k GitHub stars~3.8k tokensUpdated today
    DevelopmentAuto-check passed
  • 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.

    70k GitHub starsUsed in 1 repo~1.6k tokens
    DevelopmentAuto-check passed
  • Git Merge Conflict Resolver

    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.

    7.6k GitHub starsUsed in 1 repo~4.5k tokens
    DevelopmentAuto-check passed

More from code-yeongyu/senpi

  • Senpi Agent QA Harness

    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.

    472 GitHub stars~2.7k tokensUpdated today
    Auto-check: notes
  • Bun 1.4 Builtins Guide

    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.

    472 GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • Worker brief for implementing one pre-assigned feature in the senpi todotools built-in extension, with strict scope, typing, testing and git-safety rules.

    472 GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • GPT Image Prompt Guide

    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.

    472 GitHub stars~2.3k tokensUpdated today
    Auto-check passed
  • Senpi Release Publishing

    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.

    472 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Tmux Manual QA Worker

    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.

    472 GitHub stars~1.6k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Merge Upstream into Fork

What does Merge Upstream into Fork do?

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.

When should I use Merge Upstream into Fork?

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.

How do I install Merge Upstream into Fork in Claude Code?

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.

How do I install Merge Upstream into Fork in Codex?

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.

Can I use Merge Upstream into Fork in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Merge Upstream into Fork need to run?

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.

Does Merge Upstream into Fork access the network?

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.

Is Merge Upstream into Fork safe to install?

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.

What licence does Merge Upstream into Fork use?

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.

How many tokens does Merge Upstream into Fork use?

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.

What are the alternatives to Merge Upstream into Fork?

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.

Who maintains Merge Upstream into Fork?

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.