Files

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 -A or git add . — always stage specific files
  • Add ANY Claude attributionCo-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 HEAD instead of the explicit branch name when pushing
  • Commit on main, master, or dev — always create a feature branch first with git 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 devSTOP 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.ts exists: run npx ts-node PRNameGenerator.ts. Use the output as the new branch slug.
  • If PRNameGenerator.js exists: run node 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 --stat to understand what changed
  • Use format feat/description-with-hyphens (new feature) or fix/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.comGitHub mode (use gh CLI)
  • Contains gitea.p-lao.comGitea mode (use MCP mcp__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.gitowner=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.