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