pr-create
Create Pull Request
Commit current changes (if any), push the branch, and open a pull request.
Read and follow all conventions in .rulesync/skills/git-conventions/SKILL.md.
Help
If the user provides a command option of help:
- Explain how to use this command.
- DO NOT proceed, exit the command immediately after these steps.
Prerequisites
- Git CLI and GitHub CLI (
gh) must be available. - The user must be authenticated with
gh(gh auth status). - The repository must have a remote named
origin.
Workflow
STEP 1: Assess Current State
Gather all necessary context in parallel:
git status
git log --oneline -10
git branch --show-current
git remote -v
Determine:
- Current branch name (
CURRENT_BRANCH). - Whether there are uncommitted changes (staged, unstaged, or untracked).
- Whether there are unpushed commits on this branch.
STEP 2: Check Symlinked Repos
Scan the external/ directory for symlinked directories that resolve to separate git repos with changes. These need their own branches and PRs before the outer repo's PR is created.
-
Identify symlinked repo candidates:
for dir in external/*/; do [ -L "${dir%/}" ] && [ -d "$(readlink -f "${dir%/}")/.git" ] && echo "${dir%/}" doneSkip any directory that is NOT a symlink (e.g.,
external/ag-sharedis a real directory tracked in the outer repo — ignore it). -
For each symlinked repo found, check for uncommitted or unpushed changes:
RESOLVED_PATH="$(readlink -f "<symlink>")" git -C "$RESOLVED_PATH" status --porcelain git -C "$RESOLVED_PATH" log --oneline @{upstream}..HEAD 2>/dev/nullIf there are no uncommitted changes AND no unpushed commits, skip that repo silently.
-
For each symlinked repo WITH changes, create a matching branch, commit, push, and open a PR:
- Use the same branch name as the outer repo (
CURRENT_BRANCHor the topic branch name determined in STEP 4) for traceability. - If the repo is not already on that branch, create and switch to it:
git -C "$RESOLVED_PATH" checkout -b <branch-name> 2>/dev/null || git -C "$RESOLVED_PATH" checkout <branch-name> - Stage and commit changes with a message referencing the outer repo's work:
git -C "$RESOLVED_PATH" add -A git -C "$RESOLVED_PATH" commit -m "$(cat <<'EOF' Update for <outer-repo-name>: <brief description> EOF )" - Push and create a PR:
git -C "$RESOLVED_PATH" push -u origin <branch-name> cd "$RESOLVED_PATH" && gh pr create --title "<title>" --body "$(cat <<'EOF' Companion PR for changes in <outer-repo-name>. EOF )" - Record each created PR URL in
SYMLINKED_REPO_PRSfor the final report.
- Use the same branch name as the outer repo (
-
If no symlinked repos have changes, proceed to the next step without comment.
Note: This step may execute before the outer repo's topic branch is fully determined (STEP 4). If a topic branch has not yet been created, defer symlinked repo processing until after STEP 4 and execute it between STEP 4 and STEP 5. The key requirement is that symlinked repo PRs are created BEFORE the outer repo's PR (STEP 7).
STEP 3: Identify Base Branch
Determine the correct base branch for the PR:
- Check if the current branch was created from a
bX.Y.Zrelease branch:git log --oneline --decorate --all | head -30 git merge-base --is-ancestor origin/latest HEAD && echo "descends from latest" - Default base:
latest(the main branch). - Release base: If the branch clearly descends from a
bX.Y.Zbranch (and notlatest), use that release branch as the base. - If ambiguous, ask the user which base branch to target.
Store the result as BASE_BRANCH.
STEP 4: Ensure Topic Branch
If currently on latest or a bX.Y.Z branch, a new topic branch is required:
- Determine the branch name following git-conventions:
- If
${ARGUMENTS}contains a JIRA ticket (e.g.,AG-12345): useag-12345/<descriptive-slug> - Otherwise: use
<initials>/<descriptive-slug>(derive initials fromgit config user.name, or ask the user) - Derive the slug from the change description or
${ARGUMENTS}.
- If
- Create and switch to the new branch:
git checkout -b <branch-name>
If already on a topic branch (not latest or bX.Y.Z), continue on the current branch.
STEP 5: Commit Changes (If Any)
If there are uncommitted changes:
- Review the changes:
git diff git diff --staged git status - Stage relevant files (prefer specific files over
git add -A). - Write a commit message following git-conventions (see Commits section).
- Commit:
git commit -m "$(cat <<'EOF' <commit message> EOF )"
If there are no uncommitted changes and no unpushed commits, inform the user there is nothing to submit and STOP.
STEP 6: Push Branch
Push the branch to the remote, setting the upstream:
git push -u origin <branch-name>
STEP 7: Create Pull Request
Create the PR using gh:
gh pr create --base <BASE_BRANCH> --title "<title>" --body "$(cat <<'EOF'
<body>
EOF
)"
Follow git-conventions (see Pull Requests section). If JIRA-linked, include "Fix #AG-XXXX" in the body.
STEP 8: Report Result
Output the PR URL and a brief summary. If any symlinked repo PRs were created in STEP 2, include them as well:
PR created: <URL>
Base: <BASE_BRANCH> ← Head: <branch-name>
Title: <title>
If SYMLINKED_REPO_PRS is non-empty, also report:
Companion PRs (symlinked repos):
<repo-name>: <URL>
<repo-name>: <URL>
Arguments
${ARGUMENTS} can optionally include:
- A JIRA ticket number (e.g.,
AG-12345) - used for branch naming, commit prefix, and PR title. - A description of the change - used for branch slug, commit message, and PR title.
--base <branch>- override the base branch detection.
Examples:
/pr-create- infer everything from current state and changes./pr-create AG-12345 Add tooltip delay support- JIRA-linked PR./pr-create Fix axis label overlap for long text- no-JIRA PR./pr-create --base b13.0.0- target a specific release branch.