7.8 KiB
name: aleleba-pr description: Full delivery pipeline — creates a branch if needed, commits, pushes, and opens a PR. Auto-detects GitHub vs Gitea and uses the right tool. All output (commits, PR titles, PR bodies) must be written in English. Triggers: "aleleba-pr", "create a PR", "push and PR", "ship this", "crea un PR", "crea una rama". effort: medium argument-hint: "[optional PR description]"
aleleba-pr — Commit, Push and PR
Custom delivery pipeline. Gets work into the remote repository with a well-written PR, regardless of whether the repo is on GitHub or Gitea.
Language rule: ALL output must be in English — commit messages, branch names, PR titles, PR bodies, table content, test plan steps. No exceptions.
Safety rules
NEVER
- Force push (
--force,--force-with-lease) git add -Aorgit add .— always stage specific files- Add ANY Claude attribution —
Co-Authored-By: Claude, "Generated with Claude Code", the 🤖 emoji, "created with Claude" or anything similar — in commit messages, PR titles, PR bodies, code comments, or anywhere else. No Claude signature, ever. - Push without explicit user confirmation
- Use
HEADinstead of the explicit branch name when pushing - Commit on
main,master, ordev— always create a feature branch first withgit checkout -b {branch-name}before any commit
ALWAYS
- Check the branch before any operation
- Ask for confirmation before pushing
- Use HEREDOC for commit messages
- Derive the PR title from the current branch name
- Write everything in English: commit messages, PR title, PR body, branch name slugs
Pre-flight — Branch and platform check
This step runs once at the start.
1. Read repo context
git branch --show-current
git remote get-url origin
git status --short
git log --oneline -5
2. Check if we are on a protected branch
ALWAYS check the current branch before doing ANYTHING else — including commits.
If the current branch is main, master, or dev → STOP and create a feature branch first. NEVER commit on these branches.
2a. Look for PRNameGenerator in the repo root:
ls PRNameGenerator.ts PRNameGenerator.js 2>/dev/null | head -1
- If
PRNameGenerator.tsexists: runnpx ts-node PRNameGenerator.ts. Use the output as the new branch slug. - If
PRNameGenerator.jsexists: runnode PRNameGenerator.js. Use the output as the new branch slug.
2b. If no PRNameGenerator exists → infer the branch name from the current diff:
- Run
git diff --statto understand what changed - Use format
feat/description-with-hyphens(new feature) orfix/description-with-hyphens(bug fix) - All lowercase, hyphen-separated, no special characters, in English
- Examples:
feat/add-user-authentication,fix/null-pointer-on-login
2c. Create the branch — this MUST happen before any commit:
git checkout -b {branch-name}
Verify with git branch --show-current that you are now on the new branch before proceeding.
If already on a feature branch (not main, master, or dev) → proceed directly to Step 1.
3. Detect platform
Read the remote URL:
- Contains
github.com→ GitHub mode (useghCLI) - Contains
gitea.p-lao.com→ Gitea mode (use MCPmcp__gitea__pull_request_write) - Other domain → warn the user and ask which tool to use
4. Detect base branch
git rev-parse --abbrev-ref origin/HEAD 2>/dev/null || echo "UNRESOLVED"
If unresolved, try main, then dev, then master. Store as {base-branch}.
Step 1: Commit (if there are pending changes)
Check working tree state:
- Clean tree AND unpushed commits exist → skip directly to Step 2
- Nothing to commit and nothing to push → report "Nothing to ship" and exit
- Uncommitted changes exist → proceed with the commit
Show the diff for review:
git diff --stat
git diff --name-only
Analyze the changes to write a descriptive conventional commit message in English (feat:, fix:, chore:, refactor:, etc.).
Stage specific files (never git add -A):
git add {file1} {file2} ...
Create the commit with HEREDOC — no Co-Authored-By or any authorship trailer:
git commit -m "$(cat <<'EOF'
type: concise description in imperative mood in English
Explanation of what changed and why (if applicable), in English.
EOF
)"
If a pre-commit hook fails → report the error, do NOT use --no-verify. Ask the user to fix it and retry.
Step 2: Push
Show the commits about to be pushed:
git log origin/{base-branch}..HEAD --oneline 2>/dev/null || git log --oneline -5
Ask for explicit user confirmation before pushing. Show:
- Target:
origin/{branch-name} - Number of commits to push
- List of commits
Once confirmed:
git push origin {branch-name}
If push fails because the branch has no upstream → add -u:
git push -u origin {branch-name}
Step 3: Create PR
Build the title from the current branch name:
- Branch:
feat/add-user-auth→ Title:feat/add-user-auth: Add user authentication - The description after
:must be a readable English summary of the diff changes
Build the PR body by analyzing the full diff. Everything must be written in English. Do NOT append any Claude attribution footer ("Generated with Claude Code", 🤖, etc.) — the PR body ends at the Test Plan:
## Summary
- {bullet 1 describing the main change}
- {bullet 2 if there are more relevant changes}
## Changes
| File | Change |
|------|--------|
| `path/to/file` | Description of the change |
| ... | ... |
## Test Plan
- [ ] {test step 1}
- [ ] {test step 2}
If GitHub:
gh pr create \
--title "{title}" \
--body "$(cat <<'EOF'
{body built above}
EOF
)"
If an open PR already exists for this branch (gh pr view 2>/dev/null), update the body instead of creating a new one:
gh pr edit --body "$(cat <<'EOF'
{body}
EOF
)"
If Gitea:
Extract owner and repo from the remote URL:
- HTTPS:
https://gitea.p-lao.com/owner/repo.git→owner=owner,repo=repo - SSH:
<<EMAIL_2>>:owner/repo.git→ same
Invoke the MCP tool:
mcp__gitea__pull_request_write:
method: "create"
owner: {owner}
repo: {repo}
head: {branch-name}
base: {base-branch}
title: {title}
body: {body built above}
Step 4: Final report
Show a summary of what was done:
═══════════════════════════════════════
ALELEBA-PR — SHIP MANIFEST
═══════════════════════════════════════
Platform: GitHub / Gitea
Branch: {branch-name}
Base: {base-branch}
PR: {pr-url}
Status: DONE
═══════════════════════════════════════
Omit sections that did not apply (e.g., no commit step if the tree was already clean).
Failure modes
| Situation | Behavior |
|---|---|
| On protected branch | Auto-create feature branch using PRNameGenerator or inferred name |
| PRNameGenerator fails | Warn, infer branch name from diff |
| Push rejected (remote ahead) | Report error, suggest git pull --rebase origin {branch} |
gh not authenticated |
Report, suggest gh auth login |
| PR already exists (GitHub) | Update body with gh pr edit instead of creating new |
| Gitea MCP fails | Report error and print the PR body so user can create it manually |
| Nothing to ship | Report cleanly and exit without error |
Usage examples
/aleleba-pr
Full pipeline from any state.
/aleleba-pr adds dark mode support
Uses the provided description as extra context for the PR title and body.