One of my most used commands gets better and better - jj prpr.
When using “jj”, I’m on the squash/changes as TODO workflow:
- Always work on new change
- Squash into previous “described” change via
jj sq, or better: jj absorb
This handles the local part, what about the PRs? I don’t want to repeat my commits
in GitHub PR description. It’s already in my commits! This was how prpr was born.
- Make changes (per above workflow)
jj prpr
first change on top of trunk()?
- Prompt for interactive commit in jj. Title of the commit will be the title of PR
Confirm/skip AI code review for quick sanity check
Push bookmarks in the stack
No PR? Create PR via gh CLI
- Automatically target previous bookmark for stack PRs
- Create description out of commits on given PR
- Snapshot description into local filesystem
PR exists?
- Diff description with snapshot, show diff, ask for resolution
Link to draft PR is now in clipboard. PR description is created out of commit messages.
There’s a lot of asterisks here and little QoL fixes like handling multiple changes,
stacking PRs and more. I freaking love it. At some point hopefully jj sync
will be there and it will get even better.
I asked Claude to describe the full flow in ASCII:
desc - description of the PR
βββββββββββββββββββββββββββββββββββββββββββ
β jj prpr β
ββββββββββββββββββ¬βββββββββββββββββββββββββ
β
ββββββββββ΄βββββββββ
βΌ βΌ
βββββββββββ βββββββββββ
β desc β β prpr β
β command β β command β
ββββββ¬βββββ ββββββ¬βββββ
β β
βΌ βΌ
Show title & ββββββββββββββββ
description β Get Title β
β β (1st line) β
βΌ ββββββββ¬ββββββββ
EXIT β
βΌ
ββββββββββββββββββ
β Title exists? β
βββββββββ¬βββββββββ
NO β YES
ββββββββββββ΄βββββββββββ
βΌ β
βββββββββββββββββββ β
β Working changes β β
β exist? β β
ββββββββββ¬βββββββββ β
YES β NO β
ββββββββ΄βββββββ β
βΌ βΌ β
βββββββββββ βββββββββββ β
β Commit β β EXIT β β
ββββββ¬βββββ βββββββββββ β
β β
ββββββββββββββββββββββββββββββ€
βΌ
ββββββββββββββββββββ
β Bookmark exists? β
ββββββββββ¬ββββββββββ
NO β YES
ββββββββββ΄βββββββββ
βΌ β
βββββββββββββββββββ β
β Create bookmark β β
β + git push β β
ββββββββββ¬βββββββββ β
β β
βΌ β
βββββββββββββββββββ β
β AI Code review? β β
β (optional) β β
ββββββββββ¬βββββββββ β
ββββββββββ¬βββββββββ
βΌ
ββββββββββββββββββββ
β Find PR for β
β bookmark β
ββββββββββ¬ββββββββββ
NO β YES
ββββββββββ΄βββββββββ
βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ
β CREATE PR β β Compare local β
β (draft/ready) β β vs remote desc β
β β ββββββββββ¬βββββββββ
β gh pr create β β
β β βββββββ΄ββββββ
ββββββββββ¬βββββββββ βΌ βΌ
β ββββββββββββ ββββββββββββ
β β Checksumsβ β Checksumsβ
β β DIFFER β β MATCH β
β ββββββ¬ββββββ ββββββ¬ββββββ
β βΌ β
β βββββββββββββββ β
β β Show diff β β
β ββββββββ¬βββββββ β
β βΌ β
β βββββββββββββββ β
β β Overwrite? β β
β ββββββββ¬βββββββ β
β YES β NO β
β ββββββββ΄βββββββ β
β βΌ βΌ β
β Update Skip & β
β PR desc EXIT β
β β β
ββββββ΄βββββββββββ¬βββββββββββ
βΌ
ββββββββββββββββββββ
β Update PR desc β
β (if changed) β
ββββββββββ¬ββββββββββ
βΌ
ββββββββββββββββββββ
β jj git push β
β -b bookmark β
ββββββββββ¬ββββββββββ
βΌ
ββββββββββββββββββββ
β Save checksum β
β to local state β
ββββββββββ¬ββββββββββ
βΌ
ββββββββββββββββββββ
β Copy new PR URL β
β to clipboard β
ββββββββββββββββββββ
Just sharing it out there, little QoL commands that are fun and easy.
I had the initial version working in bash in ~2024 but in 2025 I let Claude rewrite it in fish-shell,
and add all the little improvements that really made it enjoyable.