# Signal Pr

> Stage all changes, commit, push, then open a pull request. Title and body are generated from the diff and commit history. Use when user types /signal-pr, "open a PR", "create pull request", "ship a PR", or "make a PR". Requires gh CLI.

- Skill: `mattbaconz/signal-pr` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add mattbaconz/signal-pr`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mattbaconz/signal-pr/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: mattbaconz (https://skillmd.com/u/mattbaconz)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mattbaconz/signal-pr

---


# ⚡ signal-pr — Commit + Push + PR

One command. Stages, commits, pushes, opens a PR. Done.

---

## Invocation Triggers

Activate when user says any of:
- `/signal-pr`
- `"open a PR"`, `"create pull request"`, `"ship a PR"`, `"make a PR"`
- `"commit push and PR"`, `"PR this"`

## Slash command behavior

If the user's message is **only** `/signal-pr` (optionally with flags like
`--dry`, `--draft`, or `--pr-draft`), treat that as **execute now**.

- Do **not** stop after acknowledging the skill.
- Do **not** ask for confirmation unless the user explicitly requested review mode.
- Immediately run the ordered steps below in the same turn.
- Respect `--dry`, `--draft`, and `--pr-draft` exactly as defined in this file.

---

## Behavior (Ordered Steps)

1. **Run signal-push logic** — stages, commits, pushes.
   See `signal-push/SKILL.md` for complete push behavior.

2. **Generate PR title**
   - Derived from commit message(s)
   - Single commit: use commit message as-is
   - Multiple commits: synthesize a title covering the change set
   - Max 72 chars, same rules as commit messages

3. **Generate PR body** using this exact template:
   ```
   ## Changes
   - {change 1}
   - {change 2}

   ## Type
   {feat|fix|refactor|chore|docs|test|style|perf}

   Closes #{issue_number}
   ```
   - Changes: bullet list derived from diff, grouped by type. No fluff.
   - Issue number: extracted from branch name if present (e.g. `feat/PROJ-123-thing` → `Closes #123`)
   - Omit `Closes #` line if no issue number detectable

4. **Open the PR**
   ```bash
   gh pr create --title "{title}" --body "{body}"
   ```

5. **Report**
   ```
   ✓ feat(auth): add JWT refresh token rotation [3 files, +47/-12]
   ✓ pushed → origin/feat/jwt-refresh
   ✓ PR opened → https://github.com/org/repo/pull/142
   ```

---

## PR Body Template

```markdown
## Changes
- {change 1}
- {change 2}

## Type
{feat|fix|refactor|...}

Closes #{issue_number if detectable from branch name}
```

**Rules:**
- Changes are imperative phrases, max 80 chars each: "add JWT refresh token rotation"
- Group by type if multiple types present (feat changes, then fix changes, etc.)
- No prose, no explanation, no "this PR introduces"
- No emoji

---

## Flags

| Flag | Behavior |
|---|---|
| `--draft` | Show generated commit message and PR body, **do not commit, push, or create PR** |
| `--dry` | Explain what would happen — touch nothing |
| `--pr-draft` | Create the PR in GitHub draft state (passes `--draft` to `gh pr create`) |

**`--draft` output:**
```
Draft commit message:
  feat(auth): add JWT refresh token rotation

Draft PR title:
  feat(auth): add JWT refresh token rotation

Draft PR body:
  ## Changes
  - add refresh token endpoint
  - add token rotation logic

  ## Type
  feat

  Closes #47

Run /signal-pr to confirm.
```

---

## Output Format

```
✓ feat(auth): add JWT refresh token rotation [3 files, +47/-12]
✓ pushed → origin/feat/jwt-refresh
✓ PR opened → https://github.com/org/repo/pull/142
```

---

## Edge Cases

| Situation | Behavior |
|---|---|
| `gh` not installed | `✗ gh CLI required — install from cli.github.com` |
| Not authenticated with `gh` | `✗ gh not authenticated — run: gh auth login` |
| PR already exists for branch | `✗ PR already open for this branch → {url}` |
| Push fails | Stop at push error, do not attempt PR creation |
| Nothing to commit | `∅ nothing to commit` — stop |
| Detached HEAD | `✗ cannot push in detached HEAD — checkout a branch first` |

---

## Script

```bash
bash .agents/skills/signal-pr/scripts/pr.sh [--draft] [--dry] [--pr-draft] ["custom message"]
```
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File "$env:USERPROFILE\.agents\skills\signal-pr\scripts\pr.ps1" [--draft] [--dry] [--pr-draft] ["custom message"]
```

The script wraps `push` (`push.sh` / `push.ps1`) and adds the `gh pr create` step. PR title and body are generated by the agent and passed as arguments or via heredoc.

---

## Eat Your Own Cooking

Output must comply with SIGNAL compression rules if SIGNAL is active:
- No preamble before the commit/push/PR lines
- One line per action
- If something goes wrong: one line, TMPL:bug format

