cargo build --releaseParley separates two things:
- a diff source you are reviewing
- a review session stored under
.parley/
The diff source is the code you see in the TUI:
- the current working tree by default
- a specific commit with
--commit - a base/head range with
--baseand--head
The review session is the structured review state Parley keeps locally:
- named reviews such as
my-review - line-anchored comment threads
- thread statuses:
open,pending,addressed - review states:
open,under_review,done
That matters because comments are not just free-form notes. Each thread is attached to a file path and line reference, and replies update the parent thread status.
./target/release/parley review create my-review
./target/release/parley review start my-reviewreview create creates the local session. review start moves it into under_review, but the moment you add an open thread, the review state automatically becomes open again.
./target/release/parley tui --review my-reviewIf your terminal or SSH session mishandles mouse reporting, disable mouse capture:
./target/release/parley tui --review my-review --no-mouseIf only one review exists, Parley can resolve that review automatically, but using --review is the clearest form.
By default, the TUI opens the current working tree diff. You can also open historical revisions:
./target/release/parley tui --commit HEAD~2
./target/release/parley tui --base main --head feature/my-branch
./target/release/parley tui --base v0.1.0
# everything after HEAD~2 (exclude that commit)
./target/release/parley tui --base HEAD~2 --head HEAD
# everything after and including HEAD~2
./target/release/parley tui --base HEAD~2^ --head HEAD--commit <rev>shows that commit against its first parent.--base <rev>defaultsheadtoHEAD.--base <rev> --head <rev>shows an explicit range.- Use
--base <rev> --head HEADto review everything after<rev>. - Use
--base <rev>^ --head HEADto include<rev>itself in that cumulative range.
Refresh (R) keeps using the same source while the TUI session stays open, and AI prompt context follows that same diff source.
Current limitation:
- reopening the review later does not restore the revision source automatically; pass the same flags again.
Think of the normal flow like this:
- Open a diff.
- Move to a changed line.
- Create a thread on that line.
- Reply until the issue is resolved.
- Mark the thread addressed.
- When nothing unresolved remains, move the review to
done.
Say you open a diff and find a risky change in src/lib.rs.
- Move to the line with
j/k,PgUp/PgDn, or search. - Press
morcto open a draft on that line. - Write a comment such as:
This branch drops the error context. Can we keep the original cause here?
- Save with
Ctrl+s.
That creates a thread anchored to the selected diff line, and the thread starts as open.
If someone else replies, for example:
I pushed a fix and kept the original error chain.
the thread becomes pending.
If the original commenter replies again, the thread goes back to open.
When the original commenter is satisfied, they mark it addressed.
Only the original commenter can normally change a thread to open, pending, or addressed. That is enforced by the review model.
xruns AI refactor on the selectedopenthreadXruns AI reply on the selected threadAruns AI refactor across all eligible threads in the review
Typical pattern:
- Leave a thread
open. - Press
xon that thread. - AI adds a reply to the thread.
- Because AI is a different author, the thread becomes
pending. - You inspect the code changes and either reopen the thread or mark it addressed.
If the review is already done, AI runs are skipped.
h/l: previous or next filej/k: move line cursor down or upPgUp/PgDn: page scrollCtrl+u/Ctrl+d: half-page scrollg/G: jump to first or last linezz: center active line
:<line>: go to line/query: set diff search queryn/p: next or previous search hit
morc: create thread on selected liner: reply to selected threadN/P: jump next or previous thread[/]: select previous or next thread in current filee: toggle selected thread expansionShift+E: cycle thread density (compact/expanded)a/o/f: addressed/open/force-address selected thread
- Type
@inside the comment or reply box to open file matching. - Use
EnterorTabon a file match to open that file in the active diff pane and switch into line-picker mode. - The comment editor explicitly tells you to select a diff line before the reference is confirmed.
- In line-picker mode, use
↑/↓,j/k,PgUp/PgDn, org/Gto move the diff cursor, thenEnterorTabto insert@path:line. - If mouse support is enabled, clicking a diff line during line-picker mode inserts that line immediately.
- After inserting the reference, Parley restores the file, pane, and diff line where the draft started.
Esccancels the line picker and leaves the bare@pathreference in the comment buffer.
Alt+b: move backward one whitespace-delimited word in the draftAlt+d: delete forward through the next whitespace-delimited word in the draft
s: set reviewopenw: set reviewunder_reviewd: set reviewdone(blocked if unresolved threads exist)Shift+D: force set reviewdone
Review state mostly follows thread state:
- any
openthread means the review isopen - no
openthreads means the review isunder_review doneis explicit and guarded
done is blocked while unresolved threads remain. In practice, that means both open and pending threads prevent a normal transition to done.
x: AI refactor selected threadX: AI reply selected threadA: AI refactor full reviewK: cancel current AI runH: toggle AI stream popupL: open log file inlessCtrl+k: open command paletteCtrl+f: focus files filter input?: open in-app docs/help overlay
./target/release/parley review create parser-cleanup
./target/release/parley review start parser-cleanup
./target/release/parley tui --review parser-cleanupInside the TUI:
- move through changed files with
h/l - move inside the diff with
j/k - press
con a changed line to leave a thread - press
ron that thread to reply later - press
Rafter editing code in another terminal - press
awhen the original reviewer considers the issue resolved - press
dwhen the review is actually complete
For a historical review:
./target/release/parley tui --review parser-cleanup --base main --head feature/parser-cleanupThat lets you keep one named review session while pointing the TUI at an explicit base/head diff.
Parley stores its local state in .parley/ and reads configuration from .parley/config.toml.
By default, Parley ignores its own .parley/ files when building the review diff so that review metadata and logs do not show up in the file list.
To include .parley/ in the diff again, set:
ignore_parley_dir = false- For
refactor(xorA): thread must beopen. - For
reply(X): thread should beopenorpending. - If review is
done, AI runs are skipped. - Use explicit thread selection from MCP if you need reply mode on an
addressedthread.
Inside TUI:
R
This reloads review metadata and the active diff source.
- For the normal workflow, that means the current working tree diff.
- If you opened the TUI with
--commitor--base/--head, refresh keeps using that same historical source.