/shipping-changes
End-to-end git orchestrator: branch → commit → push → PR, with a full plan presented before any execution. Detects base branch and scope allowlist once and propagates to all phases. Use when ready to ship a complete unit of work. Skip if only one phase is needed: commit-only →
$ npx -y skills add LerianStudio/ring --skill shipping-changes --agent claude-codeHow 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
/shipping-changes
Context preview
The summary Claude sees to decide when to auto-load this skill.
End-to-end git orchestrator: branch → commit → push → PR, with a full plan presented before any execution. Detects base branch and scope allowlist once and propagates to all phases. Use when ready to ship a complete unit of work. Skip if only one phase is needed: commit-only →
SKILL.md
shipping-changes.SKILL.mdname: ring:shipping-changes
description: >-
End-to-end git orchestrator: branch → commit → push → PR, with a full plan
presented before any execution. Detects base branch and scope allowlist once
and propagates to all phases. Use when ready to ship a complete unit of work.
Skip if only one phase is needed: commit-only → ring:committing-changes,
PR-only → ring:opening-pull-requests.
allowed-tools:
- Bash
- Read
- Glob
- Grep
- AskUserQuestion
End-to-end shipping workflow: detect base branch and scope policy once, present a complete plan, then execute branch → commit → push → PR in sequence, confirming at each phase. Uses `ring:committing-changes` and `ring:opening-pull-requests` internally — their rules and anti-patterns apply in full.
⛔ HARD STOP — PRESENT PLAN BEFORE EXECUTING ANY MUTATING COMMAND
Read-only discovery commands (`git fetch`, `git ls-remote`, `git status`, `git diff`, `git log`) are allowed before approval — they are needed to build the plan.
MUST complete Phase 0 detection, analyze the current state, and present a complete plan to the user before running any **mutating** `git` or `gh` command (`git checkout -b`, `git add`, `git commit`, `git push`, `gh pr create`). Executing mutating commands without approval is FORBIDDEN.
---
Phase 0 — Detect Base Branch and Scope Policy
MUST complete both detections before analyzing changes or drafting anything. These values are resolved once and propagated to all subsequent phases.
0A — Detect Base Branch
# Probe A — GitHub API default (fallback: git remote show origin | grep 'HEAD branch' | awk '{print $NF}')
gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'
# Probe B — PR template hint: read .github/pull_request_template.md for explicit branch name
# Probe C — develop existence
git ls-remote --heads origin developApply precedence in order — first match wins:
| Priority | Source | Rule | |----------|--------|------| | **1 — highest** | PR template | Explicit branch name in `.github/pull_request_template.md` — overrides everything | | **2** | develop + user | Probe C finds `develop` AND differs from Probe A → ask user to confirm which target | | **3 — fallback** | GitHub API | Use value from Probe A | | **4** | Neither | STOP — ask the user |
**Why not develop-first:** a repo may have a stale `develop` branch while the real PR target is `main`. The GitHub API is the authoritative source; `develop` existence triggers a confirmation step instead of a silent assumption.
0B — Detect Scope Policy
Check in this order:
1. `.github/workflows/pr-validation.yml` (primary) 2. `.github/workflows/pr-title.yml` 3. `.github/workflows/commitlint.yml` 4. `.github/workflows/semantic-pull-request.yml` 5. Root configs: `commitlint.config.{js,cjs,mjs,ts}`, `.commitlintrc*`
Extract the allowed `scope` list and any `type` restrictions.
| Situation | Required Action | |-----------|-----------------| | Policy found, scope is clear | Use only scopes from the allowlist | | Policy found, scope is ambiguous | STOP and ask the user which allowed scope to use | | No policy file found | MUST still include a scope — ask the user what scope to use |
---
Phase 0C — Analyze Current State
git status
git branch
git diff
git log --oneline -5
Use this output for the plan.
---
Phase 0D — Present Full Plan for Approval
Present everything before touching git:
Shipping Plan — waiting for your approval
──────────────────────────────────────────
Base branch: develop (from: git ls-remote)
Scope policy: .github/workflows/pr-validation.yml → scopes: [api, auth, docs, ci]
Chosen scope: auth
Phase 1 — Branch
Current branch: main → will create: feat/add-oauth2-refresh
Command: git checkout -b feat/add-oauth2-refresh origin/develop
Phase 2 — Commit
Files to stage:
- src/auth/oauth.ts (modified)
- src/auth/oauth.test.ts (modified)
- docs/auth/oauth-setup.md (modified)
Proposed commits:
1. feat(auth): add OAuth2 refresh token support
2. docs(docs): update OAuth2 setup guide
Phase 3 — Push
Command: git push -u origin feat/add-oauth2-refresh
Phase 4 — Pull Request
Title: feat(auth): add OAuth2 refresh token support
Base: develop
Command: gh pr create --title "..." --body "..." --base develop
Approve and execute? [Yes / Modify / Cancel]MUST wait for explicit user approval. Do NOT begin Phase 1 until approved.
---
Phase 1 — Branch
1.1 — Check current branch
If already on a feature branch (not `$BASE`, not `main` when `$BASE=develop`):
AskUserQuestion({
questions: [{
question: "You're already on a feature branch. How should I proceed?",
header: "Branch",
options: [
{ label: "Use current branch", description: "Continue on this branch" },
{ label: "Create new branch", description: "Create a new branch from origin/$BASE" }
]
}]
});1.2 — Create branch (if needed)
Branch naming convention: `<type>/<description>` in kebab-case.
git fetch origin --quiet
# Check for duplicate
git ls-remote --heads origin <type>/<description>
# If no duplicate:
git checkout -b <type>/<description> origin/$BASE
If a branch with the same name already exists on remote, ask the user for a different name.
Types: `feat`, `fix`, `chore`, `refactor`, `docs`, `test`, `perf`
---
Phase 2 — Commit
Delegate to `ring:committing-changes` with the resolved `$BASE` and scope policy as context.
**MUST propagate `$BASE`** to `ring:committing-changes` — Step 7 of that skill uses `origin/$BASE..HEAD` for commit batch scoping. Without it, the skill falls back to `@{u}` or re-detects the base, which works but is redundant when `$BASE` is already known here.
The following rules from `ring:committing-changes` apply in full:
- `$BASE` is already resolved — pass it explicitly so Step 7 skips re-detection
- Scope MUST come from the allowlist resolved in Phase 0B
- Scope MUST be
Read more
name: ring:shipping-changes description: >- End-to-end git orchestrator: branch → commit → push → PR, with a full plan presented before any execution. Detects base branch and scope allowlist once and propagates to all phases. Use when ready to ship a complete unit of work. Skip if only one phase is needed: commit-only → ring:committing-changes, PR-only → ring:opening-pull-requests. allowed-tools: - Bash - Read - Glob - Grep - AskUserQuestion
End-to-end shipping workflow: detect base branch and scope policy once, present a complete plan, then execute branch → commit → push → PR in sequence, confirming at each phase. Uses `ring:committing-changes` and `ring:opening-pull-requests` internally — their rules and anti-patterns apply in full.
⛔ HARD STOP — PRESENT PLAN BEFORE EXECUTING ANY MUTATING COMMAND
Read-only discovery commands (`git fetch`, `git ls-remote`, `git status`, `git diff`, `git log`) are allowed before approval — they are needed to build the plan.
MUST complete Phase 0 detection, analyze the current state, and present a complete plan to the user before running any **mutating** `git` or `gh` command (`git checkout -b`, `git add`, `git commit`, `git push`, `gh pr create`). Executing mutating commands without approval is FORBIDDEN.
---
Phase 0 — Detect Base Branch and Scope Policy
MUST complete both detections before analyzing changes or drafting anything. These values are resolved once and propagated to all subsequent phases.
0A — Detect Base Branch
# Probe A — GitHub API default (fallback: git remote show origin | grep 'HEAD branch' | awk '{print $NF}')
gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'
# Probe B — PR template hint: read .github/pull_request_template.md for explicit branch name
# Probe C — develop existence
git ls-remote --heads origin developApply precedence in order — first match wins:
| Priority | Source | Rule | |----------|--------|------| | **1 — highest** | PR template | Explicit branch name in `.github/pull_request_template.md` — overrides everything | | **2** | develop + user | Probe C finds `develop` AND differs from Probe A → ask user to confirm which target | | **3 — fallback** | GitHub API | Use value from Probe A | | **4** | Neither | STOP — ask the user |
**Why not develop-first:** a repo may have a stale `develop` branch while the real PR target is `main`. The GitHub API is the authoritative source; `develop` existence triggers a confirmation step instead of a silent assumption.
0B — Detect Scope Policy
Check in this order:
1. `.github/workflows/pr-validation.yml` (primary) 2. `.github/workflows/pr-title.yml` 3. `.github/workflows/commitlint.yml` 4. `.github/workflows/semantic-pull-request.yml` 5. Root configs: `commitlint.config.{js,cjs,mjs,ts}`, `.commitlintrc*`
Extract the allowed `scope` list and any `type` restrictions.
| Situation | Required Action | |-----------|-----------------| | Policy found, scope is clear | Use only scopes from the allowlist | | Policy found, scope is ambiguous | STOP and ask the user which allowed scope to use | | No policy file found | MUST still include a scope — ask the user what scope to use |
---
Phase 0C — Analyze Current State
git status git branch git diff git log --oneline -5
Use this output for the plan.
---
Phase 0D — Present Full Plan for Approval
Present everything before touching git:
Shipping Plan — waiting for your approval
──────────────────────────────────────────
Base branch: develop (from: git ls-remote)
Scope policy: .github/workflows/pr-validation.yml → scopes: [api, auth, docs, ci]
Chosen scope: auth
Phase 1 — Branch
Current branch: main → will create: feat/add-oauth2-refresh
Command: git checkout -b feat/add-oauth2-refresh origin/develop
Phase 2 — Commit
Files to stage:
- src/auth/oauth.ts (modified)
- src/auth/oauth.test.ts (modified)
- docs/auth/oauth-setup.md (modified)
Proposed commits:
1. feat(auth): add OAuth2 refresh token support
2. docs(docs): update OAuth2 setup guide
Phase 3 — Push
Command: git push -u origin feat/add-oauth2-refresh
Phase 4 — Pull Request
Title: feat(auth): add OAuth2 refresh token support
Base: develop
Command: gh pr create --title "..." --body "..." --base develop
Approve and execute? [Yes / Modify / Cancel]MUST wait for explicit user approval. Do NOT begin Phase 1 until approved.
---
Phase 1 — Branch
1.1 — Check current branch
If already on a feature branch (not `$BASE`, not `main` when `$BASE=develop`):
AskUserQuestion({
questions: [{
question: "You're already on a feature branch. How should I proceed?",
header: "Branch",
options: [
{ label: "Use current branch", description: "Continue on this branch" },
{ label: "Create new branch", description: "Create a new branch from origin/$BASE" }
]
}]
});1.2 — Create branch (if needed)
Branch naming convention: `<type>/<description>` in kebab-case.
git fetch origin --quiet # Check for duplicate git ls-remote --heads origin <type>/<description> # If no duplicate: git checkout -b <type>/<description> origin/$BASE
If a branch with the same name already exists on remote, ask the user for a different name.
Types: `feat`, `fix`, `chore`, `refactor`, `docs`, `test`, `perf`
---
Phase 2 — Commit
Delegate to `ring:committing-changes` with the resolved `$BASE` and scope policy as context.
**MUST propagate `$BASE`** to `ring:committing-changes` — Step 7 of that skill uses `origin/$BASE..HEAD` for commit batch scoping. Without it, the skill falls back to `@{u}` or re-detects the base, which works but is redundant when `$BASE` is already known here.
The following rules from `ring:committing-changes` apply in full:
- `$BASE` is already resolved — pass it explicitly so Step 7 skips re-detection
- Scope MUST come from the allowlist resolved in Phase 0B
- Scope MUST be
Proven engineering practices, enforced through skills. Ring is a comprehensive skills library and workflow system for AI agents that transforms how AI assistants approach software development.
Repo: LerianStudio/ring
Other skills on ring.
- /analyzing-options
Analyzing different approaches for a task or problem with structured comparisons, effort estimates, and recommendations. Use when facing strategic decisions, architecture choices, or multiple viable approaches. Skip when there's an obvious single approach or the decision is
Open skill - /auditing-production-readiness
Auditing a service's production readiness against Ring engineering standards across base dimensions plus a conditional multi-tenant dimension, then emitting a scored report and an HTML dashboard. Use before production deploy, periodic review, onboarding, or a major release. Skip
Open skill - /cleaning-comments
Cleaning redundant and obvious comments following clean code principles while preserving meaningful documentation. Supports git scope filtering (staged, unstaged, branch, commit-range). Use when code has excessive comments, during code review, or post-refactor cleanup. Skip when
Open skill - /committing-changes
Commit changes with scope allowlist enforcement, atomic grouping, GPG-signed conventional commits, and trailer management. Detects the repo's PR-validation scope policy before proposing any message. Use when the user asks to commit or has changes ready to record. Skip when the
Open skill - /creating-handoffs
Creating a handoff document that captures session state (completed work, decisions, open items, next steps) and delivering it via Plan Mode so the user gets the native 'clear context and continue implementing' resume option. Use when ending a session, when context grows large,
Open skill - /creating-worktrees
Creating an isolated git worktree for parallel branch work: selects the directory by priority order, verifies/adds .gitignore safety, auto-installs the detected toolchain's dependencies, runs a baseline test, and reports readiness. Use before a feature that needs isolation from
Open skill

