Single-verb branch-to-PR quality gate pipeline. Use when the user wants to gate, push, and open a PR for a branch in one command.
Scanned 9/12/2026
Install to Claude Code
npx -y skills add Jamie-BitFlight/claude_skills --skill gate-push --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Gate Push?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/jamie-bitflight-gate-push)More formats (shields.io, HTML) on the badges page.
---
name: gate-push
description: "Single-verb branch-to-PR quality gate pipeline. Use when the user wants to gate, push, and open a PR for a branch in one command."
argument-hint: <branch-name>
user-invocable: true
---
# Gate Push
Run `/dh:gate-push <branch-name>` to resolve branch context into a `/dh:complete-implementation` input and execute that quality-gate pipeline.
## Required input
- `branch_name = $ARGUMENTS` (must be non-empty)
If empty: stop with:
```text
COMPLETION BLOCKED — Missing required argument <branch-name>.
Then re-run:
/dh:gate-push <branch-name>
```
## Branch → backlog lookup algorithm
1. Normalize `branch_name` into a lookup slug:
- Strip leading branch type prefix when present (`feature/`, `fix/`, `chore/`, etc.) by removing only the prefix up to and including the first `/` character
- Then replace any remaining `/`, `_`, and `-` with spaces (for example `feature/auth/login-fix` → `auth login fix`)
- Trim whitespace
- Store the result as `normalized_slug`
- Expected pattern is `type/slug` (e.g., `feature/foo-bar`); multi-segment branches (`type/segment1/segment2`) are supported and normalize with the same replacement rule
2. Strategy 1 (title match):
- `uv run "${CLAUDE_PLUGIN_ROOT}/sam_schema/cli.py" backlog list --title "<normalized_slug>"`
3. Strategy 2 (topic match fallback, only if Strategy 1 has zero results):
- `uv run "${CLAUDE_PLUGIN_ROOT}/sam_schema/cli.py" backlog list --topic "<normalized_slug>"`
4. If exactly one item is returned, use it as `match`.
5. If multiple items are returned, do not guess — stop and follow the No-match / unresolved fallback procedure below.
## Resolve complete-implementation input
From `match`, resolve in this order:
1. If `match.issue` exists (issue number field from backlog output) → `target = #<match.issue>`
2. Else if `match.plan` exists and non-empty → `target = <match.plan>` (use the backlog item's plan field directly)
3. Else no resolvable target
## Execute gate pipeline
If `target` is resolved:
```text
Skill(skill: "dh:complete-implementation", args: "<target>")
```
`/dh:complete-implementation` is the source of truth for the quality-gate phases and final push/PR behavior. Do not duplicate its gate logic here.
## No-match / unresolved fallback
If no backlog match is found, a match exists but has neither `issue` nor `plan`, or multiple matches are found:
- Do not prompt mid-loop.
- Stop with:
```text
COMPLETION BLOCKED — Branch cannot be resolved to a single backlog issue/plan.
Required precondition:
- Ensure branch-to-backlog mapping is decided at workflow start (for example via `/dh:work-backlog-item --auto ...`) or at the start of `/dh:implement-feature`.
- Ensure the matched backlog item has either an issue number or a linked plan.
Then re-run:
/dh:gate-push <branch-name>
```
## Success check
After successful completion, verify PR visibility for the branch.
**GitHub backend only** — this step requires a GitHub remote configured with the `gh` CLI.
For beads and other non-GitHub backends, skip this step and verify via your backend's native
tooling (e.g., `bd show <issue-id>` for merge-request state).
```bash
if gh repo view --json name >/dev/null 2>&1; then
gh pr list --head <branch-name>
else
echo "Remote is not a GitHub repository — PR visibility check not applicable for this backend."
fi
```
Use the original input branch (`branch_name`), not `normalized_slug`, for `--head`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!