---
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 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 `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

```bash
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:**

```bash
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:**
```bash
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 (use `gh` CLI)
- Contains `gitea.p-lao.com` → **Gitea** mode (use MCP `mcp__gitea__pull_request_write`)
- Other domain → warn the user and ask which tool to use

### 4. Detect base branch

```bash
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:**
```bash
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`):
```bash
git add {file1} {file2} ...
```

**Create the commit with HEREDOC** — no Co-Authored-By or any authorship trailer:
```bash
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:
```bash
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:
```bash
git push origin {branch-name}
```

If push fails because the branch has no upstream → add `-u`:
```bash
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:

```bash
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:
```bash
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.
