git.backport

작성자: coinbase

특정 커밋을 master에서 릴리스 브랜치로 체리픽을 통해 백포트합니다. 전용 백포트 브랜치를 생성하고, 체리픽을 시도하며, 푸시하고…

npx skills add https://github.com/coinbase/cds --skill git.backport

Your task

Back-port the commit given in $ARGUMENTS to a release branch using git cherry-pick. Your arguments are in the format <commit-sha> <target-branch>.

Parse $ARGUMENTS now: the first token is COMMIT_SHA, the second is TARGET_BRANCH.


Step 0 — Record the starting branch

Before touching anything, capture where the user currently is so you can return them there at the end:

git rev-parse --abbrev-ref HEAD

Store this as ORIGINAL_BRANCH. You will check out this branch at the very end, regardless of whether the backport succeeds or fails.


Step 1 — Validate inputs

  1. Fetch from origin to ensure remote refs are up to date:

    git fetch origin
    
  2. Confirm COMMIT_SHA resolves using the remote ref (do NOT check it out locally):

    git rev-parse --verify <COMMIT_SHA>^{commit}
    

    If it still fails after fetching, stop and tell the user the SHA could not be resolved. Checkout ORIGINAL_BRANCH before stopping.

  3. Confirm origin/<TARGET_BRANCH> exists on the remote:

    git rev-parse --verify origin/<TARGET_BRANCH>
    

    Always use the remote ref (origin/<TARGET_BRANCH>) as the source of truth — do not rely on a local checkout of the target branch. If the remote ref does not exist, stop and tell the user. Checkout ORIGINAL_BRANCH before stopping.

  4. Check the working tree is clean (git status --porcelain). If it is not clean, stop and tell the user to stash or commit their in-progress work before proceeding. Do NOT checkout ORIGINAL_BRANCH in this case (they're already on it and have local changes).


Step 2 — Summarize the commit

Show the user what they are about to cherry-pick. Use the remote ref for all inspection — never check out the source commit locally:

git show --stat <COMMIT_SHA>

Print:

  • The commit subject
  • The author and date
  • The list of files changed with their stat line

Step 3 — Derive source links

Extract the repo's GitHub URL from the remote:

git remote get-url origin

Convert SSH form (git@github.com:org/repo.git) or HTTPS form to a base URL: https://github.com/org/repo.

Build two links:

  • Commit link: https://github.com/org/repo/commit/<COMMIT_SHA>
  • Original PR link: Look for a (#NNN) pattern in the commit subject line. If found, build https://github.com/org/repo/pull/NNN. If the pattern is absent, omit the PR link and note that it could not be determined automatically.

Step 4 — Create the backport branch

Derive SHORT_SHA = first 8 chars of COMMIT_SHA. Check the backport branch does not already exist:

git rev-parse --verify backport/<SHORT_SHA>-to-<TARGET_BRANCH>

If it exists locally or on origin, stop and tell the user rather than overwriting it. Checkout ORIGINAL_BRANCH before stopping.

Create the backport branch directly from the remote ref (no local checkout of target branch needed):

git checkout -b backport/<SHORT_SHA>-to-<TARGET_BRANCH> origin/<TARGET_BRANCH>

Tell the user the branch name.


Step 5 — Apply the patch (source files only)

5a — Classify changed files

git show --name-only <COMMIT_SHA>

Separate all changed files into two buckets:

  • Versioning files (always exclude): any path matching **/package.json or **/CHANGELOG.md
  • Source files (apply these): everything else

If the commit only touches versioning files, stop and tell the user — there is nothing meaningful to backport. Return to ORIGINAL_BRANCH before stopping.

5b — Apply source-file patch

Extract and apply only the source-file diffs as a patch against the current TARGET_BRANCH state:

git show <COMMIT_SHA> -- <source-file1> <source-file2> ... | git apply --index

CRITICAL: Never use git checkout <COMMIT_SHA> -- <file>. That replaces the entire file with the master version, bringing in all unrelated changes that have accumulated between the two branches. Always use git show | git apply --index so only the diff lines from the commit are applied.

5c — If git apply succeeds — commit and proceed to Step 6

git apply --index stages the changes automatically. Commit:

git commit -m "<original commit subject> (backport to <TARGET_BRANCH>)

Backport of <commit-link> from master[, originally merged via <pr-link>].

Code-only backport — versioning and changelog applied separately.

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>"

Then proceed to Step 6 (versioning reminder).

5d — If git apply fails — CONFLICT PATH

The source-file patch does not apply cleanly. This usually means one of:

  • TARGET_BRANCH has a structurally different version of the code that the patch's context lines no longer match
  • The fix depends on a refactor or API change that exists in master but not in TARGET_BRANCH — making the backport potentially impossible without additional work

Do NOT attempt to modify files or force the patch. Return to ORIGINAL_BRANCH and report (see Step 7).


Step 6 — Versioning reminder, then push and open PR

6a — Pause for versioning

Before pushing or opening a PR, tell the user:

The code changes have been committed. You'll need to add the version bump and changelog entry yourself before I open the PR, since the versioning files (package.json, CHANGELOG.md) are intentionally excluded from the backport.

Run the changelog script with the release branch as the base so it detects your changes correctly:

GITHUB_BASE_REF=origin/<TARGET_BRANCH> yarn changelog

Let me know when you're done and I'll push the branch and open the PR.

Then stop and wait for the user to confirm versioning is complete before continuing.

6b — Push the backport branch

Once the user confirms:

git push -u origin backport/<SHORT_SHA>-to-<TARGET_BRANCH>

6c — Build the PR body

## Summary

Backport of commit [`<SHORT_SHA>`](commit-link) from `master`[, originally merged via [#NNN](pr-link)].

<one or two plain-language bullet points summarising what the commit does, derived from the commit message and changed files — do not just copy the commit message verbatim>

## Test plan

- [ ] Verify no CI steps in the `<TARGET_BRANCH>` pipeline depend on anything removed or changed by this commit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Omit the "originally merged via" clause if the original PR number could not be determined.

6d — Open the PR

gh pr create \
  --base <TARGET_BRANCH> \
  --head backport/<SHORT_SHA>-to-<TARGET_BRANCH> \
  --title "<original commit subject> (backport to <TARGET_BRANCH>)" \
  --body "<body from 6b>"

If gh pr create fails due to missing authentication:

  • Tell the user that gh is not authenticated for this host
  • Print the URL that git push echoed (looks like https://github.com/org/repo/pull/new/<branch>) so they can open the PR manually
  • Print the suggested PR title and body so they can paste them in

6e — Return to original branch

git checkout <ORIGINAL_BRANCH>

Then report to the user:

  • The new commit SHA on the backport branch (git rev-parse backport/<SHORT_SHA>-to-<TARGET_BRANCH>)
  • The PR URL (or the manual URL + body if gh was not authenticated)
  • That they are back on <ORIGINAL_BRANCH>

Step 7 — Diagnose the patch failure (do NOT resolve it)

Your goal here is to explain why the patch didn't apply so the user can resolve it themselves. Do NOT attempt to modify any files or retry the apply. Use remote refs for all file inspection — never check out anything locally.

7a — Identify what the commit changed

git show --name-only <COMMIT_SHA>

Collect the list of files the commit touches.

7b — Find the merge base

git merge-base <COMMIT_SHA> origin/<TARGET_BRANCH>

This gives you MERGE_BASE.

7c — Compare the relevant files across three points in history

For each file in the cherry-picked commit, inspect using remote refs only:

  1. What the commit changed (the patch being applied):

    git show <COMMIT_SHA> -- <file>
    
  2. How the file looks on TARGET_BRANCH (the destination — use remote ref):

    git show origin/<TARGET_BRANCH>:<file>
    
  3. How the file looked at the merge base:

    git show <MERGE_BASE>:<file>
    
  4. What has diverged on TARGET_BRANCH since the merge base:

    git diff <MERGE_BASE>..origin/<TARGET_BRANCH> -- <file>
    

7d — Reason about the conflict

Determine the most likely cause:

CauseSigns
Code deleted on TARGET_BRANCHThe lines the commit modifies no longer exist in the target file
Code moved or refactoredThe lines exist but in a different function, class, or file
Conflicting parallel changeTARGET_BRANCH already modified the same lines differently
File renamed or deletedThe file does not exist on TARGET_BRANCH at all
API / import changeThe commit references a symbol that was renamed or removed on the release branch

7e — Return to original branch, then report

git checkout <ORIGINAL_BRANCH>

Then write the conflict report:

## Backport patch failed

Patch from <COMMIT_SHA> did not apply cleanly onto <TARGET_BRANCH>.
You are back on `<ORIGINAL_BRANCH>`.

### Conflicting files
<list each file>

### Diagnosis

For each file:
- What the cherry-picked commit was trying to do to this file
- What the current state of this file is on TARGET_BRANCH
- Why those two things conflict (pick the most precise cause from the table above)
- A concrete suggested approach for manual resolution (e.g., "the function was renamed from X to Y on release-8.x — apply the logic change to the renamed function")

Be specific. Quote relevant line ranges or symbol names. Give the user enough context to know exactly where to look and what to do.


Important rules

  • Record ORIGINAL_BRANCH at the very start and always return to it at the end — success, failure, or early stop (except when stopping due to a dirty working tree, since you haven't moved).
  • Never use git checkout <sha> -- <file> to apply changes from a commit. This replaces the whole file with the master version and brings in unrelated changes. Always use git show <sha> -- <files> | git apply --index.
  • Never apply package.json or CHANGELOG.md changes. Always exclude versioning files from the patch. Remind the user to run GITHUB_BASE_REF=origin/<TARGET_BRANCH> yarn changelog and wait for them to confirm before pushing or opening the PR.
  • Never resolve patch conflicts autonomously. If git apply fails, diagnose and explain only.
  • Always push and open a PR after the user confirms versioning — this is the default, not optional.
  • Never check out the source commit or the target branch locally. Use origin/<TARGET_BRANCH> and inspect commits via git show / git diff. The only local branches you should create or switch to are the backport branch and the return to ORIGINAL_BRANCH.
  • If the backport branch already exists, stop and return to ORIGINAL_BRANCH rather than overwriting.

coinbase의 다른 스킬

git.repo-manager
coinbase
git.repo-manager — AI 에이전트를 위한 설치 가능한 스킬로, coinbase/cds에서 게시했습니다.
official
agentic-wallet
coinbase
awal CLI를 통한 암호화폐 지갑 작업 — 로그인, 잔액 확인, USDC/ETH/POL/SOL 전송, 토큰 거래, 지갑 충전, x402 결제 프로토콜 사용 등
official
authenticate-wallet
coinbase
이메일 OTP 기반 지갑 인증으로 검증 및 상태 확인을 제공합니다. 2단계 로그인 절차: 이메일로 6자리 OTP를 받기 위해 시작한 후, flowId와 코드로 인증을 완료합니다. 명령어 실행 전 셸 인젝션을 방지하기 위해 이메일, flowId, OTP에 대한 입력 검증 규칙이 포함되어 있습니다. 동반 CLI 명령어를 통해 상태 확인, 잔액 조회, 주소 검색 및 지갑 창 접근을 제공합니다. 모든 명령어는 기계 판독 가능한 출력을 위해 --json을 지원합니다...
official
fund
coinbase
Coinbase Onramp 또는 직접 전송을 통해 USDC를 지갑에 입금합니다. 사용자가 사전 설정된 금액($10, $20, $50) 또는 사용자 지정 값을 선택하고 Apple Pay, 직불카드, 은행 송금 또는 Coinbase 계정 자금 조달 중에서 선택할 수 있는 보조 UI를 엽니다. 다양한 결제 수단을 지원하며 정산 시간이 다릅니다: 카드 및 Apple Pay는 즉시, ACH 은행 송금은 1~3일 소요됩니다. Base 네트워크에서 USDC로 자금을 입금하며, 또는 사용자는 npx awal@2.0.3...을 통해 지갑 주소로 직접 USDC를 보낼 수 있습니다.
official
monetize-service
coinbase
x402 프로토콜을 통해 다른 에이전트가 발견하고 결제할 수 있는 유료 API 엔드포인트를 배포합니다. HTTP 402 결제 프로토콜을 사용하여 Base에서 요청당 USDC를 청구하며, 클라이언트는 서명된 트랜잭션으로 결제하고 API 키나 계정이 필요하지 않습니다. 검색 확장을 선언하면 엔드포인트를 x402 Bazaar에 자동으로 등록하여 에이전트가 발견할 수 있도록 합니다. Express 미들웨어를 사용하여 엔드포인트당 여러 가격 계층, 와일드카드 경로 및 여러 결제 옵션을 지원합니다. @x402/express 및 @x402/core 기반으로 구축되었습니다...
official
pay-for-service
coinbase
Base에서 x402 프로토콜을 통해 자동 USDC 결제로 유료 API를 호출합니다. x402 지원 엔드포인트에 HTTP 요청(GET, POST 등)을 실행하며, USDC 결제가 자동으로 처리됩니다. 메서드, JSON 본문, 쿼리 매개변수 및 사용자 정의 헤더를 통해 요청을 사용자 지정할 수 있습니다. 결제 제어 기능이 포함되어 있어 요청당 최대 USDC 금액을 설정하고 상관 ID로 관련 작업을 그룹화할 수 있습니다. 지갑 인증과 충분한 USDC 잔액이 필요하며, 셸을 방지하기 위해 모든 사용자 입력을 검증합니다...
official
query-blockchain-data
coinbase
Base에서 CDP SQL API를 통해 x402로 온체인 블록체인 데이터를 조회합니다. 사용자나 본인이 디코딩된 블록에 대한 온체인 정보를 확인하고자 할 때 사용하세요.
official
query-onchain-data
coinbase
Base에서 SQL을 사용하여 온체인 데이터를 쿼리하고, 쿼리당 x402 결제를 적용합니다. CoinbaseQL을 통해 디코딩된 이벤트, 트랜잭션 및 블록에 접근할 수 있습니다. CoinbaseQL은 조인, CTE, 서브쿼리 및 표준 함수를 지원하는 ClickHouse 기반 SQL 방언입니다. 세 가지 주요 테이블을 사용할 수 있습니다: base.events(디코딩된 스마트 컨트랙트 로그), base.transactions(전체 트랜잭션 데이터), base.blocks(블록 메타데이터). 이벤트 쿼리에서 전체 테이블 스캔을 피하기 위해 인덱싱된 필드(event_signature, address, block_timestamp)에 대한 필터링이 필요합니다.
official