⚡ 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)
Run signal-push logic — stages, commits, pushes.
See signal-push/SKILL.md for complete push behavior.
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
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
Open the PR
gh pr create --title "{title}" --body "{body}"
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
## 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 .agents/skills/signal-pr/scripts/pr.sh [--draft] [--dry] [--pr-draft] ["custom message"]
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
1---2name: signal-pr3description: 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.4---56# ⚡ signal-pr — Commit + Push + PR78One command. Stages, commits, pushes, opens a PR. Done.910---1112## Invocation Triggers1314Activate when user says any of:15- `/signal-pr`16- `"open a PR"`, `"create pull request"`, `"ship a PR"`, `"make a PR"`17- `"commit push and PR"`, `"PR this"`1819## Slash command behavior2021If the user's message is **only** `/signal-pr` (optionally with flags like22`--dry`, `--draft`, or `--pr-draft`), treat that as **execute now**.2324- Do **not** stop after acknowledging the skill.25- Do **not** ask for confirmation unless the user explicitly requested review mode.26- Immediately run the ordered steps below in the same turn.27- Respect `--dry`, `--draft`, and `--pr-draft` exactly as defined in this file.2829---3031## Behavior (Ordered Steps)32331. **Run signal-push logic** — stages, commits, pushes.34 See `signal-push/SKILL.md` for complete push behavior.35362. **Generate PR title**37 - Derived from commit message(s)38 - Single commit: use commit message as-is39 - Multiple commits: synthesize a title covering the change set40 - Max 72 chars, same rules as commit messages41423. **Generate PR body** using this exact template:43 ```44 ## Changes45 - {change 1}46 - {change 2}4748 ## Type49 {feat|fix|refactor|chore|docs|test|style|perf}5051 Closes #{issue_number}52 ```53 - Changes: bullet list derived from diff, grouped by type. No fluff.54 - Issue number: extracted from branch name if present (e.g. `feat/PROJ-123-thing` → `Closes #123`)55 - Omit `Closes #` line if no issue number detectable56574. **Open the PR**58 ```bash59 gh pr create --title "{title}" --body "{body}"60 ```61625. **Report**63 ```64 ✓ feat(auth): add JWT refresh token rotation [3 files, +47/-12]65 ✓ pushed → origin/feat/jwt-refresh66 ✓ PR opened → https://github.com/org/repo/pull/14267 ```6869---7071## PR Body Template7273```markdown74## Changes75- {change 1}76- {change 2}7778## Type79{feat|fix|refactor|...}8081Closes #{issue_number if detectable from branch name}82```8384**Rules:**85- Changes are imperative phrases, max 80 chars each: "add JWT refresh token rotation"86- Group by type if multiple types present (feat changes, then fix changes, etc.)87- No prose, no explanation, no "this PR introduces"88- No emoji8990---9192## Flags9394| Flag | Behavior |95|---|---|96| `--draft` | Show generated commit message and PR body, **do not commit, push, or create PR** |97| `--dry` | Explain what would happen — touch nothing |98| `--pr-draft` | Create the PR in GitHub draft state (passes `--draft` to `gh pr create`) |99100**`--draft` output:**101```102Draft commit message:103 feat(auth): add JWT refresh token rotation104105Draft PR title:106 feat(auth): add JWT refresh token rotation107108Draft PR body:109 ## Changes110 - add refresh token endpoint111 - add token rotation logic112113 ## Type114 feat115116 Closes #47117118Run /signal-pr to confirm.119```120121---122123## Output Format124125```126✓ feat(auth): add JWT refresh token rotation [3 files, +47/-12]127✓ pushed → origin/feat/jwt-refresh128✓ PR opened → https://github.com/org/repo/pull/142129```130131---132133## Edge Cases134135| Situation | Behavior |136|---|---|137| `gh` not installed | `✗ gh CLI required — install from cli.github.com` |138| Not authenticated with `gh` | `✗ gh not authenticated — run: gh auth login` |139| PR already exists for branch | `✗ PR already open for this branch → {url}` |140| Push fails | Stop at push error, do not attempt PR creation |141| Nothing to commit | `∅ nothing to commit` — stop |142| Detached HEAD | `✗ cannot push in detached HEAD — checkout a branch first` |143144---145146## Script147148```bash149bash .agents/skills/signal-pr/scripts/pr.sh [--draft] [--dry] [--pr-draft] ["custom message"]150```151```powershell152powershell -NoProfile -ExecutionPolicy Bypass -File "$env:USERPROFILE\.agents\skills\signal-pr\scripts\pr.ps1" [--draft] [--dry] [--pr-draft] ["custom message"]153```154155The 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.156157---158159## Eat Your Own Cooking160161Output must comply with SIGNAL compression rules if SIGNAL is active:162- No preamble before the commit/push/PR lines163- One line per action164- If something goes wrong: one line, TMPL:bug format