Help us improve
Share bugs, ideas, or general feedback.
From git-plugin
Creates GitHub PRs via API without local git operations. Submit file changes for quick fixes, typos, config updates, or clean workflows bypassing local commits and branches.
npx claudepluginhub laurigates/claude-plugins --plugin git-pluginHow this skill is triggered — by the user, by Claude, or both
Slash command
/git-plugin:git-api-prhaikuThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
| Use this skill when... | Use `/git:commit` instead when... |
Creates GitHub Pull Requests using GitHub CLI: detects existing PRs for branches, pushes changes, generates titles/bodies from commits. Handles monorepos/submodules. Use for /create-pr or PR/review requests.
Creates or updates pull requests with conventional commits using GitHub CLI or Graphite. Analyzes diffs, generates titles and descriptions, supports issue linking and Graphite stacks.
Analyzes git diffs and commit history to fill PR templates and create pull requests via gh CLI. Useful for automating PR creation and descriptions.
Share bugs, ideas, or general feedback.
| Use this skill when... | Use /git:commit instead when... |
|---|---|
| Quick fix to 1-3 files (typos, config, docs) | Complex multi-file refactoring |
| Want a clean workflow without local commits | Need local testing before submitting |
| Submitting changes without touching git state | Need pre-commit hooks to run |
| Want to avoid branch creation/switching locally | Need to stage partial file changes |
| File edits are already done, just need the PR | Need interactive staging (git add -p) |
git remote get-url origingit symbolic-ref refs/remotes/origin/HEADgh auth statuspwdParse these from $ARGUMENTS:
| Parameter | Required | Description |
|---|---|---|
$@ (positional) | Yes | One or more file paths to create/update in the repo |
--title <text> | Yes | PR title — use conventional commit format |
--base <branch> | No | Base branch (default: repo default branch from context) |
--branch <name> | No | New branch name (auto-generated from title if omitted) |
--body <text> | No | PR body/description |
--draft | No | Create as draft PR |
--delete | No | Delete the specified files instead of updating them |
Execute this server-side PR creation workflow:
$ARGUMENTS--title is provided — error if missing--delete):
./ or working directory prefix)$REPO)--base if provided, otherwise use default branch from context# Get base branch SHA
BASE_SHA=$(gh api repos/$REPO/git/ref/heads/$BASE_BRANCH -q .object.sha)
# Get base tree SHA
BASE_TREE=$(gh api repos/$REPO/git/commits/$BASE_SHA -q .tree.sha)
If this fails, the base branch doesn't exist — report error and list available branches.
Derive from the --title:
type(scope): )fix/kebab-subject)"fix(api): handle null response" → fix/handle-null-responseFor each file path:
# Base64-encode the file content and create a blob
BLOB_SHA=$(gh api repos/$REPO/git/blobs \
-f content="$(base64 < "$FILE_PATH" | tr -d '\n')" \
-f encoding=base64 \
-q .sha)
Track each {path, blob_sha} pair for the tree creation in Step 5.
For --delete files, skip blob creation — these are handled differently in the tree.
Build a tree JSON payload and create the tree:
# Write tree entries to a temp file
TREE_FILE=$(mktemp)
For each file to update/create, add a tree entry:
{"path": "relative/path/to/file", "mode": "100644", "type": "blob", "sha": "<blob_sha>"}
For each file to delete, add a tree entry:
{"path": "relative/path/to/file", "mode": "100644", "type": "blob", "sha": null}
Create the tree:
TREE_SHA=$(gh api repos/$REPO/git/trees \
-f base_tree="$BASE_TREE" \
--input "$TREE_FILE" \
-q .sha)
Note: The --input file must contain the full JSON body with a tree array. Example:
{
"base_tree": "<BASE_TREE>",
"tree": [
{"path": "src/config.ts", "mode": "100644", "type": "blob", "sha": "<blob1>"},
{"path": "README.md", "mode": "100644", "type": "blob", "sha": "<blob2>"}
]
}
COMMIT_SHA=$(gh api repos/$REPO/git/commits \
-f message="$TITLE" \
-f tree="$TREE_SHA" \
-f "parents[]=$BASE_SHA" \
-q .sha)
gh api repos/$REPO/git/refs \
-f ref="refs/heads/$BRANCH" \
-f sha="$COMMIT_SHA"
If this fails with "Reference already exists", report the error and suggest using a different branch name.
gh pr create \
--repo "$REPO" \
--head "$BRANCH" \
--base "$BASE_BRANCH" \
--title "$TITLE" \
--body "${BODY:-"Created via API — no local git operations."}"
Add --draft if the flag was provided.
Print a summary:
PR created successfully (no local git changes):
PR: <url>
Branch: <branch> → <base>
Files: <count> file(s) changed
Commit: <sha>
Remove any temp files created during execution.
| Error | Recovery |
|---|---|
gh auth status fails | "Run gh auth login first" |
| Base branch SHA lookup fails | List branches: gh api repos/$REPO/branches --jq '.[].name' |
| Blob creation fails | Report which file failed and the API error |
| Branch already exists | Suggest --branch <different-name> |
| Tree creation fails | Check if file paths are valid repo-relative paths |
| PR creation fails | Show the API error — common cause is branch protection |
| Context | Command |
|---|---|
| Single file fix | /git:api-pr file.ts --title "fix: typo" |
| Multi-file fix | /git:api-pr a.ts b.ts --title "fix: update configs" |
| Draft PR | /git:api-pr file.ts --title "feat: wip" --draft |
| Custom branch | /git:api-pr file.ts --title "fix: desc" --branch hotfix/issue-123 |
| Delete file | /git:api-pr old-file.ts --title "chore: remove deprecated" --delete |
| Non-default base | /git:api-pr file.ts --title "fix: desc" --base develop |