prreviewbuddy 0.12.17 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +665 -0
- package/README.md +35 -12
- package/dist/main.js +773 -109
- package/dist/{log-CFa7EzgZ.js → relative_time-Dh7GvPvk.js} +6071 -4926
- package/dist/server.js +196 -25
- package/package.json +3 -2
- package/static/sidebar.css +10 -0
- package/static/workspace.js +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,665 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.15.2
|
|
4
|
+
|
|
5
|
+
- A review that could not be completed now says so on every tab. The Guide and
|
|
6
|
+
the Assistant were still answering a failed review with "No analysis
|
|
7
|
+
available.", which reads as an absence, while the Issues and Questions tabs
|
|
8
|
+
named the failure. One review told two stories depending on which tab was
|
|
9
|
+
open.
|
|
10
|
+
- The Assistant no longer tells you an analysis is unavailable when you simply
|
|
11
|
+
have not run one yet.
|
|
12
|
+
- The release notes now ship with the CLI, so `prreviewbuddy` carries a
|
|
13
|
+
CHANGELOG.md you can read where it is installed rather than only in a
|
|
14
|
+
repository you may not have.
|
|
15
|
+
|
|
16
|
+
## 0.15.1
|
|
17
|
+
|
|
18
|
+
- **A review that finds nothing now says so.** "No findings" with the analysis's own provenance
|
|
19
|
+
under it, rather than the same grey line a review with no analysis at all produced. A clean
|
|
20
|
+
review is a result, and it used to be rendered as an absence.
|
|
21
|
+
- **An unusable response from a coding agent now reads as a failure.** It ran, exited cleanly and
|
|
22
|
+
returned something PR Review Buddy could not parse, which has no findings in it either. Those two
|
|
23
|
+
outcomes rendered identically, so the worst case looked like the best one. The failure is
|
|
24
|
+
recorded as `agent_output_invalid` rather than left unclassified beside a git error, which is
|
|
25
|
+
also what tells the two apart when deciding whether a retry is worth offering.
|
|
26
|
+
- A review whose analysis failed no longer reports "Analysis in progress" forever. The session was
|
|
27
|
+
left mid-flight when its job died, so the tabs described a run that had already stopped.
|
|
28
|
+
|
|
29
|
+
## 0.15.0
|
|
30
|
+
|
|
31
|
+
*A command says what to review, and what to do to it.*
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
prreviewbuddy review --branch feat/foo review a branch you are not standing on
|
|
35
|
+
prreviewbuddy review --branch feat/foo --update bring that branch's review up to date
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Anything that names a target composes with anything that names an operation. `--branch` takes a
|
|
39
|
+
branch, local or remote, and the review is made in a worktree of its own as always, so nothing
|
|
40
|
+
touches your checkout and you do not have to leave the work you are in the middle of.
|
|
41
|
+
|
|
42
|
+
**Three things break.**
|
|
43
|
+
|
|
44
|
+
**The bare argument is gone.** `prreviewbuddy review <pr-url>` is `prreviewbuddy review --pr <url>`,
|
|
45
|
+
and `prreviewbuddy review develop` is `prreviewbuddy review --base develop`. That second one is why
|
|
46
|
+
the argument had to go rather than be extended: a bare word meant the base, so `review my-feature`
|
|
47
|
+
reviewed the branch you were on, *against* `my-feature`. Adding `--branch my-feature`, which means
|
|
48
|
+
review `my-feature`, would have put two spellings of one word in one command with opposite meanings.
|
|
49
|
+
Both old spellings are refused by name and the message says which flag replaces it.
|
|
50
|
+
|
|
51
|
+
**`prreviewbuddy update` is gone.** It is `prreviewbuddy review --update`, and `update --reanalyse`
|
|
52
|
+
is `prreviewbuddy review --reanalyse`. Typing the old command tells you where it went. The gain is
|
|
53
|
+
the reason it moved: `update` with no review took the newest review of the repository you were
|
|
54
|
+
standing in, so two branches reviewed in a row from one directory could only be updated in the order
|
|
55
|
+
they were made. An operation now acts on the review of the target it was given.
|
|
56
|
+
|
|
57
|
+
**A review follows the ref it was made from.** This is the one nobody notices until it matters, and
|
|
58
|
+
it is the reason it is written here. An update picks up commits you have not pushed, where before it
|
|
59
|
+
waited for the push. It no longer follows somebody else's push to the same branch, where before it
|
|
60
|
+
did. Those were not one behaviour: the freshness strip already read `refs/heads/<branch>` while the
|
|
61
|
+
update button read `<branch>@{upstream}`, so each was wrong in the opposite direction and they could
|
|
62
|
+
disagree with each other on the same page. They now answer the same question, and the shorthand
|
|
63
|
+
means your local branch. `--branch origin/feat/foo` follows the remote ref instead, and keeps
|
|
64
|
+
following it even if a local branch of that name appears later.
|
|
65
|
+
|
|
66
|
+
Two refs are two reviews. `feat/foo` and `origin/feat/foo` get a review each, told apart in the
|
|
67
|
+
listing by the ref each follows, because a review that follows one ref cannot honestly be handed
|
|
68
|
+
back to somebody who asked for the other. Reviews made before this release follow their local
|
|
69
|
+
branch, which is what they already did, so nothing you have is duplicated or lost.
|
|
70
|
+
|
|
71
|
+
**Also fixed.** A pull request is compared against the branch it targets. A PR onto `develop` was
|
|
72
|
+
diffed against `main`, which is not a missing feature but a wrong diff: it produced findings about
|
|
73
|
+
code the pull request does not touch. A branch that exists only on the remote can now be reviewed,
|
|
74
|
+
and the review can then be updated and can show its freshness, none of which worked before. And a
|
|
75
|
+
`--base` that does not exist is refused before the worktree is built rather than tens of seconds
|
|
76
|
+
later, as a job failure with a workspace already on disk.
|
|
77
|
+
|
|
78
|
+
## 0.14.1
|
|
79
|
+
|
|
80
|
+
- `prreviewbuddy agents` said "Run `prreviewbuddy agents <id>`" on its last line, and three other
|
|
81
|
+
messages about agents said `<id>` too. 0.13.1 fixed that placeholder in the help screen and
|
|
82
|
+
nowhere else, so the fix missed the place a person is most likely to be reading about agents when
|
|
83
|
+
they meet it. The guard now covers every string in the module rather than the help alone.
|
|
84
|
+
|
|
85
|
+
## 0.14.0
|
|
86
|
+
|
|
87
|
+
*PR Review Buddy is a command line tool. The Claude Code plugin is withdrawn.*
|
|
88
|
+
|
|
89
|
+
The plugin reviewed the same branches, in the same way, through a second set of commands that had
|
|
90
|
+
to be kept in step with the first. Everything it did is in the CLI:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
npm install -g prreviewbuddy
|
|
94
|
+
prreviewbuddy review
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Nothing you have already reviewed is affected. Reviews live in `~/.prreviewbuddy` and are served by
|
|
98
|
+
the same workspace server whichever way they were made. The plugin releases already published stay
|
|
99
|
+
downloadable, and there will be no further ones.
|
|
100
|
+
|
|
101
|
+
Release notes now live in `CHANGELOG.md` at the top of the repository. They were kept inside the
|
|
102
|
+
plugin's packaging, which made the history of the whole product look like the history of one way of
|
|
103
|
+
reaching it.
|
|
104
|
+
|
|
105
|
+
## 0.13.1
|
|
106
|
+
|
|
107
|
+
- The help screen no longer writes `<id>` for two different things. A review is `<review>`, a
|
|
108
|
+
coding agent is `<agent>`, and the agent lines name what may be typed rather than sending you to
|
|
109
|
+
another command to find out. The names come from the registry, so a new agent cannot leave the
|
|
110
|
+
help behind.
|
|
111
|
+
- The help says where a review ID comes from, and that `update` does not usually need one.
|
|
112
|
+
|
|
113
|
+
## 0.13.0
|
|
114
|
+
|
|
115
|
+
*A review can be made by Claude Code, Codex or Gemini CLI, and says which one made it.*
|
|
116
|
+
|
|
117
|
+
`prreviewbuddy agents` lists the coding agents this version can use and whether you have them.
|
|
118
|
+
`prreviewbuddy review --agent codex` reviews with one by name, and `prreviewbuddy config set agent
|
|
119
|
+
codex` remembers which to use when you do not. With several installed and nothing chosen, the
|
|
120
|
+
command asks you once, and offers to remember your answer rather than saving it quietly.
|
|
121
|
+
|
|
122
|
+
A review is not owned by an agent. It is a workspace that holds analyses, and each analysis names
|
|
123
|
+
the agent that produced it: `prreviewbuddy update <id> --agent gemini --reanalyse` analyses the same
|
|
124
|
+
commit again with a different agent, in the same review, and the analysis it replaces goes on saying
|
|
125
|
+
who made it. "Reviewed with Codex" appears in Analysis details, on the workspace page and in the
|
|
126
|
+
extension alike.
|
|
127
|
+
|
|
128
|
+
An agent is only listed once it can be confined to reading. That is a condition of being offered at
|
|
129
|
+
all rather than a setting: Codex runs under a read-only sandbox the operating system enforces and
|
|
130
|
+
without the MCP servers configured on your machine; Gemini runs with every writing tool removed from
|
|
131
|
+
the set the model is offered, and with a per-run token that blocks every MCP server, because Gemini's
|
|
132
|
+
own "allow none" setting allows everything.
|
|
133
|
+
|
|
134
|
+
Nothing here asks you for a credential, and there is still no account and no API key. Each agent uses
|
|
135
|
+
the authentication it already has, which is also why `agents` says an agent is installed rather than
|
|
136
|
+
saying it is signed in: finding out would mean spending your quota to draw a list.
|
|
137
|
+
|
|
138
|
+
Two fixes worth naming. A question asked of a review whose job had been swept was answered by the
|
|
139
|
+
default agent rather than by the agent that made the review, which on a Codex review meant Claude
|
|
140
|
+
answering as though it were the review's own. And a run that failed because an agent was not signed
|
|
141
|
+
in offered a Retry that would fail in exactly the same way, because a review keeps the profile it
|
|
142
|
+
was created under; it now says what would actually change it.
|
|
143
|
+
|
|
144
|
+
## 0.12.18
|
|
145
|
+
|
|
146
|
+
*A review link from Claude Code now knows its way back to the list.*
|
|
147
|
+
|
|
148
|
+
The reviews index is opened by a credential that no single review page is allowed to carry, and the
|
|
149
|
+
only thing that puts that credential into your browser is arriving at the index with it once. A
|
|
150
|
+
review started from the command line has handed you a link that does that since 0.12.2. A review
|
|
151
|
+
started from Claude Code handed you a plain one, so "All reviews" in the left rail refused you on
|
|
152
|
+
the first click, and whether it worked depended on which surface you happened to have started from.
|
|
153
|
+
Every link the plugin gives you now carries the same way back.
|
|
154
|
+
|
|
155
|
+
## 0.12.17
|
|
156
|
+
|
|
157
|
+
*The packages say which version of Node they need.*
|
|
158
|
+
|
|
159
|
+
Nothing in the product behaves differently. The published command has always declared that it needs
|
|
160
|
+
Node 20, because the release script writes that into the package it ships, but the packages in the
|
|
161
|
+
repository never said so themselves: someone building from source on an older Node got no warning at
|
|
162
|
+
install and a confusing failure somewhere later instead. They now declare it in the one place a
|
|
163
|
+
package manager reads. The version number moves with it so that what is on the registry and what is
|
|
164
|
+
in the repository are the same release.
|
|
165
|
+
|
|
166
|
+
## 0.12.16
|
|
167
|
+
|
|
168
|
+
*Buddy AI can draw the change as a diagram, a question you have thought better of can be stopped,
|
|
169
|
+
updating a review keeps it describing the same change, the counts tell you what is left rather than what was ever found, you can close a
|
|
170
|
+
finding yourself, the notice about a moved branch appears only when that branch has moved and is a
|
|
171
|
+
status line rather than a page of explanation, your reviews list is reachable from the review you
|
|
172
|
+
are reading, and every way back is named for the product you installed.*
|
|
173
|
+
|
|
174
|
+
**You can stop a question.** Asking Buddy AI something committed you to it: the field and the button
|
|
175
|
+
went dead and there was no way out but reloading the page, for up to three minutes. **Ask** now
|
|
176
|
+
becomes **Stop** while an answer is being worked on, and pressing it ends the work rather than
|
|
177
|
+
merely the waiting: the question stops being read, the process reading it is signalled, and your
|
|
178
|
+
subscription stops being spent on an answer you no longer want. The question stays in the panel
|
|
179
|
+
marked `Stopped.` and its words go back into the box, so a question you meant to phrase differently
|
|
180
|
+
takes one edit rather than retyping. Closing the tab or reloading mid-answer stops it too, for the
|
|
181
|
+
same reason.
|
|
182
|
+
|
|
183
|
+
**Buddy AI can draw the change.** Some things are faster to see than to read. **Show implementation
|
|
184
|
+
diagram** on the Overview asks Buddy AI for a diagram of how the change works, and **Diagram this
|
|
185
|
+
theme** on a theme does the same for one slice of it. The drawing opens in the main pane rather than
|
|
186
|
+
in the assistant panel, so it is something to read the review beside rather than a message that
|
|
187
|
+
scrolls away, and it is kept with the review: reopen the review tomorrow and it is still there.
|
|
188
|
+
Buddy AI chooses the shape from the change itself, a flow, a set of modules, a sequence of calls.
|
|
189
|
+
**Regenerate** asks for another whenever the first is not the one you wanted, and the one you have
|
|
190
|
+
stays on screen until the new one arrives. Each diagram folds away from its title, so a review with
|
|
191
|
+
several of them stays readable. Updating a review leaves its diagrams alone and says
|
|
192
|
+
which commit each was drawn from, because a picture you asked for is not ours to delete.
|
|
193
|
+
|
|
194
|
+
**A question keeps the shape you typed it in.** A question written over several lines, or with a
|
|
195
|
+
pasted stack trace in it, came back in the panel as one run-on line: the line breaks were there in
|
|
196
|
+
what was asked and in what was stored, and only the display of them collapsed. Your questions now
|
|
197
|
+
read back exactly as you wrote them, live and after a reload.
|
|
198
|
+
|
|
199
|
+
**The counts say what you still have to do.** A review whose fifteen findings had all been fixed and
|
|
200
|
+
whose seven questions had all been answered still read `Issues 15 · Questions 7` in the sidebar, over
|
|
201
|
+
a page where every card said RESOLVED or ANSWERED, and the Questions heading claimed "7 of 7
|
|
202
|
+
unanswered" above seven answers. The sidebar now counts what is open, and shows a tick where nothing
|
|
203
|
+
is: a theme whose findings are all fixed, a review with nothing left to read. Issues and Questions
|
|
204
|
+
each split into the work still to do and, behind a disclosure below it, what has been dealt with, so
|
|
205
|
+
nothing is thrown away and nothing has to be scrolled past. The Overview keeps both numbers, the open
|
|
206
|
+
count and how many of the original findings were closed, because a review that fixed ten things did
|
|
207
|
+
more than one that found none. On the reviews list, a review with every finding resolved says so.
|
|
208
|
+
|
|
209
|
+
**You can dismiss a finding you have decided is fine.** Until now only a commit could close one, so
|
|
210
|
+
a finding you had read, thought about and decided needed no action sat in your sidebar until the
|
|
211
|
+
author happened to push something. Dismiss is on every finding, and a dismissed one stops counting
|
|
212
|
+
and moves in with the ones the commits fixed. Which of the two closed it is kept: the pile is called
|
|
213
|
+
"Resolved by the new commits" when they did all of it, "Dismissed by you" when you did, and "Dealt
|
|
214
|
+
with" when it is both, and each card says which. Your decisions now survive an update, too, rather
|
|
215
|
+
than coming back the next time you press Analyse new changes. The one thing that reopens a dismissal
|
|
216
|
+
is the analysis reporting that the code underneath it has changed: the finding returns to your list
|
|
217
|
+
marked "Changed since you dismissed this", with your decision still on it, and Dismiss again puts it
|
|
218
|
+
back once you have looked. Questions work the same way and always have, and Mark answered now moves
|
|
219
|
+
the question in with the answered ones rather than leaving it sitting among the open ones, taking the
|
|
220
|
+
theme heading with it when it was the last question under it, and un-answering one puts it back
|
|
221
|
+
under that heading rather than at the bottom of the tab. Answering the last one leaves a single
|
|
222
|
+
divider above the answered pile instead of two with a gap between them.
|
|
223
|
+
|
|
224
|
+
**The Files tab shows the code that was reviewed.** Opening a file said "That file is not in the
|
|
225
|
+
working tree. This change may have deleted it." on a row badged ADDED, which is two claims that
|
|
226
|
+
cannot both be true: the pane was reading your checkout, and a checkout on any other commit does not
|
|
227
|
+
have the files the change created. The subtler half was worse, because nothing announced it. A file
|
|
228
|
+
that still existed but had moved on since the review opened without complaint and showed you today's
|
|
229
|
+
code under the review's line numbers. A review is a description of one commit, so the pane now reads
|
|
230
|
+
that commit, says which version you are looking at, and reads your working tree only where that is
|
|
231
|
+
what was reviewed: a review of uncommitted work, or a commit this repository no longer has. Open in
|
|
232
|
+
editor still opens your own copy of the file, and where the two differ the pane says so, on that
|
|
233
|
+
file, before you press it. Where your working folder has no such file the button is disabled rather
|
|
234
|
+
than opening an empty buffer. A file the change really did delete is named as deleted.
|
|
235
|
+
|
|
236
|
+
**Updating a review no longer swells it to the whole of your default branch.** A pull request of
|
|
237
|
+
four files came back reporting three hundred after one update. The findings were right; everything
|
|
238
|
+
around them described a different change, including the Files tab, the count in the header and the
|
|
239
|
+
diff Buddy AI answers from. A review records what it was compared against by the name you would use
|
|
240
|
+
for it, `main`, and rebuilding it looked that name up again in your own clone, where `main` is your
|
|
241
|
+
local branch and is behind the remote from the first day you do not pull. Every upstream commit you
|
|
242
|
+
had not fetched arrived in the comparison. A review now records the exact ref it was compared
|
|
243
|
+
against and rebuilds against that one, and a review made before this release resolves the remote
|
|
244
|
+
branch first, which is the one it was made from.
|
|
245
|
+
|
|
246
|
+
**The freshness strip measures the branch your review is of, not whatever you have checked out.** A
|
|
247
|
+
pull request is reviewed in a checkout of its own and you never stand on its branch, so the strip was
|
|
248
|
+
comparing the review against some unrelated branch and announcing "Code rewritten", with a file count
|
|
249
|
+
to match, about a review that was exactly current. It now reads the pull request's own branch as this
|
|
250
|
+
repository last saw it, and a review of a local branch reads that branch by name, so wandering off to
|
|
251
|
+
look at something else no longer makes a review look stale. More details says which branch it
|
|
252
|
+
compared against, and where that is a copy fetched from the remote it says so, because Check review
|
|
253
|
+
status re-runs the comparison against what you already have and only Update review goes and fetches
|
|
254
|
+
a newer one. Where the branch is not in this repository at all, which is what a pull request from a fork
|
|
255
|
+
looks like, it says it cannot compare rather than measuring against something else and calling that
|
|
256
|
+
an answer.
|
|
257
|
+
|
|
258
|
+
**Where your own working folder is checked out is no longer treated as review news.** The header
|
|
259
|
+
said "Checkout differs" in amber over a review whose code was exactly current, and opening it showed
|
|
260
|
+
a panel headed "Up to date", which is two parts of the same page disagreeing. It was also
|
|
261
|
+
unanswerable: it compared the commit you personally have open against the pull request's, and
|
|
262
|
+
reading a pull request from your own `main` puts you on an earlier commit by definition, so nothing
|
|
263
|
+
you could press ever cleared it. The freshness panel is about the review now and says nothing about
|
|
264
|
+
your working folder at all. The one moment the difference has a consequence is opening a file in
|
|
265
|
+
your editor, and the Files tab answers that where it happens: it compares that one file, byte for
|
|
266
|
+
byte, and says "your editor will show a different version" only when it is true of the file you are
|
|
267
|
+
looking at. A folder on an earlier commit still holds an identical copy of everything the change did
|
|
268
|
+
not touch, and there was never anything to say about those.
|
|
269
|
+
|
|
270
|
+
**Re-checking the conversation no longer takes the panel with it.** The control is a phrase inside
|
|
271
|
+
a sentence now, and while it ran it was replacing its own words, leaving "Checking... 1s to refresh
|
|
272
|
+
comments and resolved threads" with the status message jammed onto the end of the line. The whole
|
|
273
|
+
line becomes the progress message for as long as the re-check runs, and the panel that control was
|
|
274
|
+
pressed in is open again when the page comes back, with its own fresh "Last checked".
|
|
275
|
+
|
|
276
|
+
**Less furniture between you and the review.** The rule under the count line on Issues and
|
|
277
|
+
Questions, and the one under the pull request title on PR context, are gone: the blocks below them
|
|
278
|
+
were already visibly blocks, so the line was drawing a boundary the layout had drawn. On PR context
|
|
279
|
+
the paragraph explaining Re-check the conversation now runs the full width of the view instead of
|
|
280
|
+
stopping short of its own right edge. And where the note above the Issues list tells you to use
|
|
281
|
+
Re-check the conversation, that phrase is now the control: it takes you to the view that holds it.
|
|
282
|
+
|
|
283
|
+
**The freshness panel says what it means in the words you would use.** The status is **Review up to
|
|
284
|
+
date**, because "Up to date" could have meant your local code was current when what is meant is that
|
|
285
|
+
the review has read the newest commit on the pull request. Check again and Start fresh are **Check
|
|
286
|
+
review status** and **Start a new review**, because the first checks whether the reviewed state
|
|
287
|
+
still matches and the second makes a separate review rather than updating this one. More details
|
|
288
|
+
lost the phrases that described our plumbing rather than your review: a branch "as current as your
|
|
289
|
+
last fetch" is now the version you already have locally, and re-checking the conversation is one
|
|
290
|
+
sentence with the control inside it rather than an explanation followed by a button repeating its
|
|
291
|
+
own name. A review that is current has no More details at all: the two sentences that were behind it,
|
|
292
|
+
the commit the review is of and when the conversation was last read, are simply on the panel, because
|
|
293
|
+
a disclosure over two lines makes a healthy review look like it is holding something back. The
|
|
294
|
+
summary stays where it earns its click, on a review that has changed, where it holds the explanation
|
|
295
|
+
of Update review and the way to dismiss the warning. Every control in the panel is legible without
|
|
296
|
+
being pointed at, Close is an icon at the end of the row rather than a word competing with the
|
|
297
|
+
decisions beside it, More details stays where you clicked it instead of jumping to the next line as
|
|
298
|
+
it opens, and the panel uses the width it has instead of stopping short of its own right edge.
|
|
299
|
+
|
|
300
|
+
**The strip that tells you a branch has moved is a third of the size.** It had one thing to say and
|
|
301
|
+
was taking five rows to say it: what happened, what that means, what you can do, a sentence about
|
|
302
|
+
what the button does, and a block of footnotes about your checkout and the pull request
|
|
303
|
+
conversation. All of that is still there. Only the first three lines are on the screen, ending in
|
|
304
|
+
`More details`, and the rest is one click away when you want it. The heading is bigger, the lines
|
|
305
|
+
are shorter, and the amber no longer runs the full width of the window.
|
|
306
|
+
|
|
307
|
+
**"All reviews" works from a review page now.** The list of your reviews is opened by its own
|
|
308
|
+
credential, separate from the ones that open a single review, and a browser is given that credential
|
|
309
|
+
by opening the list once. Nobody using the command line was ever sent there, so the first click of
|
|
310
|
+
that link refused them, every time. The link `prreviewbuddy review` prints now carries the browser
|
|
311
|
+
through the list on its way to your review, so the way back is already there when you look for it.
|
|
312
|
+
Nothing changed about what a review page can reach: it still holds only its own key.
|
|
313
|
+
|
|
314
|
+
**If you do land on that refusal, it now explains itself.** It used to be a line of raw JSON in the
|
|
315
|
+
address bar. It is a page, it says what happened, and it names the one command that fixes it.
|
|
316
|
+
|
|
317
|
+
**The way back to your reviews is named for the product you are actually running.** Every place that
|
|
318
|
+
told you how to reach your reviews again named a Claude Code slash command, including the places a
|
|
319
|
+
command line user is most likely to end up: the refusal above, the bookmark page, the notice after
|
|
320
|
+
you stop the server, and the confirmation before you stop it. Each of them now names the command
|
|
321
|
+
that exists on your machine.
|
|
322
|
+
|
|
323
|
+
## 0.12.1
|
|
324
|
+
|
|
325
|
+
*Repositories with checkout hooks can be reviewed, and a failed review says why it failed.*
|
|
326
|
+
|
|
327
|
+
**A repository with its own checkout hooks no longer fails every review.** Setting up the isolated
|
|
328
|
+
checkout runs the same git machinery as switching branches, which meant your repository's
|
|
329
|
+
`post-checkout` hook ran inside it. Husky's hook asks git a question that a freshly made checkout
|
|
330
|
+
cannot answer, so it failed, and took the review down with it before any code was read.
|
|
331
|
+
Those hooks are now switched off for the review's checkout. They were written for a person about to
|
|
332
|
+
work in a directory, and nobody works in this one: it is read once and deleted.
|
|
333
|
+
|
|
334
|
+
**A review that stops now tells you what stopped it.** The progress block redraws itself in place,
|
|
335
|
+
and its last redraw was landing on top of the failure message and erasing most of it. What
|
|
336
|
+
disappeared was exactly the useful part: the underlying error, the line saying the review can be
|
|
337
|
+
resumed where it stopped, and the link to it. The block also miscounted its own height whenever a
|
|
338
|
+
line was too long for the window, which is most windows, since one of those lines is the path to
|
|
339
|
+
your repository.
|
|
340
|
+
|
|
341
|
+
**A checkout that failed halfway no longer blocks the next attempt.** Some failures leave the
|
|
342
|
+
directory behind, and the retry then failed on that instead, reporting a second problem that hid the
|
|
343
|
+
first.
|
|
344
|
+
|
|
345
|
+
## 0.12.0
|
|
346
|
+
|
|
347
|
+
*Reviews read the pull request conversation now, and say why when they cannot.*
|
|
348
|
+
|
|
349
|
+
**Pull request conversations are now actually included in reviews.** Fetching one used to take a
|
|
350
|
+
little over four minutes against a budget of two, so it timed out every time, on every review, and
|
|
351
|
+
the review was quietly assembled from the code alone. It now uses the GitHub CLI you are already
|
|
352
|
+
signed in to, and comes back in about two seconds. Measured on four real pull requests: 1.5 to 2.1
|
|
353
|
+
seconds, against 242 seconds before.
|
|
354
|
+
|
|
355
|
+
That changes what a review can tell you. A finding can now say a colleague already raised this, and
|
|
356
|
+
whether their thread is still open, because there is a conversation to check it against.
|
|
357
|
+
|
|
358
|
+
**And it says so when it could not.** If the conversation is unavailable, the review now tells you
|
|
359
|
+
why instead of silently looking complete. A repository with no pull request stays quiet, because
|
|
360
|
+
nothing is missing from it.
|
|
361
|
+
|
|
362
|
+
**A second GitHub account no longer reports you as signed out.** If another account in your keyring
|
|
363
|
+
had an expired token, the check failed on that one, while the account it would really have used was
|
|
364
|
+
working perfectly.
|
|
365
|
+
|
|
366
|
+
**The freshness panel is one panel.** It was three warnings stacked, each with its own amber dot, so
|
|
367
|
+
a rewritten branch and a checkout that is merely behind shouted equally loudly and the action was
|
|
368
|
+
buried in the middle. It now reads as one thing: what the status is, one sentence on what that means
|
|
369
|
+
for the findings below, then **Update review** as the only control wearing a colour. About a third
|
|
370
|
+
shorter.
|
|
371
|
+
|
|
372
|
+
**Following a theme no longer loses the page.** Clicking a theme in the left rail could scroll the
|
|
373
|
+
header and the status banners off the top of the window, with no scrollbar to bring them back. The
|
|
374
|
+
page is one screen tall now and the panes inside it scroll, which is what was always intended.
|
|
375
|
+
|
|
376
|
+
**Reviewing a merged pull request explains itself.** It used to refuse with advice about switching
|
|
377
|
+
branches and committing your work, which is not something a person who pasted a link can act on. It
|
|
378
|
+
now says the request is already merged and there is nothing left to compare.
|
|
379
|
+
|
|
380
|
+
Smaller things: scrollbars are thinner and no longer disappear on macOS until you touch them; the
|
|
381
|
+
workspace and the terminal agree on what to call a paused review, a rewritten branch and starting
|
|
382
|
+
fresh, having drifted into two words for each; and an authentication failure now names which tool
|
|
383
|
+
could not sign in, since a review runs through two of them and only one is ever the problem.
|
|
384
|
+
|
|
385
|
+
## 0.11.10
|
|
386
|
+
|
|
387
|
+
*A list of reviews now says what tells two of them apart.*
|
|
388
|
+
|
|
389
|
+
A review of a branch is titled by the subject of that branch's oldest commit, which is the
|
|
390
|
+
convention a forge uses, and it means a branch cut from the tip of another inherits that branch's
|
|
391
|
+
title. Two entries then read as one review listed twice. Reviewing a branch twice did the same
|
|
392
|
+
thing, and so did two repositories on one machine. Each entry now names the repository, what the
|
|
393
|
+
review was compared against, how big the change is, and which analysis of its branch it is, in the
|
|
394
|
+
terminal and in the list a Claude Code session is handed. The browser index has shown these since
|
|
395
|
+
it was rebuilt around branches; the two lists had not caught up.
|
|
396
|
+
|
|
397
|
+
## 0.11.9
|
|
398
|
+
|
|
399
|
+
*A release now carries only the files its own build produced.*
|
|
400
|
+
|
|
401
|
+
The workspace page is the same on every surface, so every surface built it into one shared
|
|
402
|
+
directory and copied the whole of that directory into its own release. Nothing in there could be
|
|
403
|
+
cleared without one build deleting another's output, so a file left behind by an earlier build, or
|
|
404
|
+
by a different surface, stayed and was shipped, and the workspace server serves whatever it finds
|
|
405
|
+
beside it. Each copy is now built by one thing and cleared before it is written. The page itself is
|
|
406
|
+
unchanged.
|
|
407
|
+
|
|
408
|
+
## 0.11.8
|
|
409
|
+
|
|
410
|
+
*Updates and re-reads use the account that made the review, and a refused prompt says where.*
|
|
411
|
+
|
|
412
|
+
The same fix as the Ask panel had in 0.11.7, applied to the two places that still read the
|
|
413
|
+
workspace server's own environment instead of the review's. Both put their result on the page under
|
|
414
|
+
the review's name, so both owed the reader the review's own agent and account rather than whichever
|
|
415
|
+
shell happened to start the server first. Reviews old enough to have lost their job record are
|
|
416
|
+
unaffected and behave as before.
|
|
417
|
+
|
|
418
|
+
A refused prompt now says where the problem is.
|
|
419
|
+
|
|
420
|
+
A review is refused rather than sent if its prompt names the repository the isolated checkout exists
|
|
421
|
+
to keep the agent away from. The refusal said that it had happened and nothing more, which left
|
|
422
|
+
nowhere to look in a prompt of several hundred kilobytes. It now names the position and quotes the
|
|
423
|
+
surrounding text, which is what says whether the path was written into the prompt or arrived quoted
|
|
424
|
+
inside a pull request comment. The rule itself is unchanged: exactly the same prompts are refused.
|
|
425
|
+
|
|
426
|
+
## 0.11.7
|
|
427
|
+
|
|
428
|
+
*A failing agent no longer closes every open review, and the Ask panel uses the right account.*
|
|
429
|
+
|
|
430
|
+
A review prompt is hundreds of kilobytes, and an agent that exits before reading it closes the pipe
|
|
431
|
+
mid-write. That was an unhandled error in the workspace server, which is one long-lived process
|
|
432
|
+
serving every review on the machine, so a single agent that could not start closed all of them. The
|
|
433
|
+
failure now reports whatever the agent said on its way out, and everything else stays open.
|
|
434
|
+
|
|
435
|
+
Questions in the Ask panel are answered by the account that made the review.
|
|
436
|
+
|
|
437
|
+
Which Claude answers used to depend on which shell happened to start the workspace server first,
|
|
438
|
+
because the panel read the environment from there rather than from the review. A review made under
|
|
439
|
+
one account and asked about under another was answered by a Claude with different access, and
|
|
440
|
+
nothing on the page said so. Older reviews whose job records have aged out are unaffected and
|
|
441
|
+
behave as before.
|
|
442
|
+
|
|
443
|
+
## 0.11.6
|
|
444
|
+
|
|
445
|
+
*`--base` decides which review you get, not only which one is made.*
|
|
446
|
+
|
|
447
|
+
`prreviewbuddy review --base develop` used to hand back the newest review of the branch whatever it
|
|
448
|
+
had been compared against, and say a review of what you asked for already existed. A review is of a
|
|
449
|
+
comparison rather than of a branch, so a base you name is now part of the question: you get the
|
|
450
|
+
review made against that base, or a new one, and never somebody else's comparison under your
|
|
451
|
+
branch's name.
|
|
452
|
+
|
|
453
|
+
Every review now says what it was compared against, in the same line that says how old it is. That
|
|
454
|
+
one is for the far commoner case, the plain command, where the comparison is the one thing about a
|
|
455
|
+
review you cannot see from the outside.
|
|
456
|
+
|
|
457
|
+
## 0.11.5
|
|
458
|
+
|
|
459
|
+
*A finished review records what it actually covered.*
|
|
460
|
+
|
|
461
|
+
The Overview of a review made by the isolated pipeline showed a plain file count, because the
|
|
462
|
+
coverage, the pull request discussion counts and the time the analysis took were never written
|
|
463
|
+
down. The code that knew how to work them out was only ever reached by a preview script. Reviews
|
|
464
|
+
now carry all of it, so "50 of 482 files" reads as what it is, and a review that was given twelve
|
|
465
|
+
unresolved threads says so instead of looking identical to one that was given none.
|
|
466
|
+
|
|
467
|
+
"Update review" recounts the same facts against the change it just re-read, rather than carrying
|
|
468
|
+
forward numbers that described the analysis it replaced.
|
|
469
|
+
|
|
470
|
+
Older reviews are unaffected and keep rendering as they did; run a review again to get the fuller
|
|
471
|
+
Overview.
|
|
472
|
+
|
|
473
|
+
## 0.11.4
|
|
474
|
+
|
|
475
|
+
*One review at a time, known to the machine rather than believed by each process.*
|
|
476
|
+
|
|
477
|
+
A review that had been running quietly for over half an hour was recorded as stopped, which put
|
|
478
|
+
Retry on the page. Pressing it started a second analysis in the checkout the first one was still
|
|
479
|
+
reading. Both are now refused: a review being made holds a claim that every surface can see, and
|
|
480
|
+
nothing offers to restart it while that claim is held. A review whose process really did stop
|
|
481
|
+
releases it, and Retry works exactly as before.
|
|
482
|
+
|
|
483
|
+
## 0.11.3
|
|
484
|
+
|
|
485
|
+
*A review that had finished no longer shows as still being made.*
|
|
486
|
+
|
|
487
|
+
**A finished review opens.** Reviews made by this version's isolated pipeline were stored complete
|
|
488
|
+
but still marked as being made, so the workspace showed the right counts in the rail and "Analysis
|
|
489
|
+
in progress" in every pane, on a review that had actually finished. If you have a review stuck like
|
|
490
|
+
that, this version does not repair it: run the review again.
|
|
491
|
+
|
|
492
|
+
## 0.11.2
|
|
493
|
+
|
|
494
|
+
*The link printed at the end of a review is one that still works.*
|
|
495
|
+
|
|
496
|
+
**The link at the end of a review is the one that works.** The command line printed the address it
|
|
497
|
+
had been given when the review started, and a review takes minutes: if the workspace server had
|
|
498
|
+
been restarted in between, that address no longer went anywhere. It is now worked out again at the
|
|
499
|
+
moment it is printed, on the finished review and on one that stopped.
|
|
500
|
+
|
|
501
|
+
## 0.11.1
|
|
502
|
+
|
|
503
|
+
*Asking for a review while one is being made now says exactly that.*
|
|
504
|
+
|
|
505
|
+
**Asking for a review while one is being made now says so.** Running the review command again on a
|
|
506
|
+
branch whose review is still in progress used to report that a review already existed and offer to
|
|
507
|
+
bring it up to date or start a fresh one. Neither of those is a thing you can do to an analysis
|
|
508
|
+
that has not finished once. It now tells you it is being made right now, gives you the same link,
|
|
509
|
+
and leaves it at that.
|
|
510
|
+
|
|
511
|
+
## 0.11.0
|
|
512
|
+
|
|
513
|
+
*Every review runs in a checkout of its own, made in the background, with a command line alongside.*
|
|
514
|
+
|
|
515
|
+
**Every review now runs in a checkout of its own.** A worktree is made under
|
|
516
|
+
`~/.prreviewbuddy/worktrees`, detached at exactly the commit being reviewed, and the analysis reads
|
|
517
|
+
that and only that. Your own checkout is never read and never written while a review runs, so you
|
|
518
|
+
can keep working, switch branch, rebase, or leave the tree dirty and none of it reaches the review.
|
|
519
|
+
The assistant answers from that same pinned checkout, so its answers describe the code you are
|
|
520
|
+
reviewing rather than whatever you happen to have open.
|
|
521
|
+
|
|
522
|
+
**One command does the whole thing.** `/prreviewbuddy:review` resolves what to review, records the
|
|
523
|
+
job and hands back a link, and the review is made in a separate process. Your session is free the
|
|
524
|
+
moment you have the link. Pass a pull request number or a link to one to review that instead of the
|
|
525
|
+
current branch, and use `/prreviewbuddy:fresh-review` to review a branch again alongside the review
|
|
526
|
+
you already have.
|
|
527
|
+
|
|
528
|
+
**A review that stops now says so.** If whatever was making a review goes away, a session you
|
|
529
|
+
closed or a terminal you killed, the page used to sit on a spinner forever. It now tells you the
|
|
530
|
+
review stopped, and offers Retry, which picks up from the step it had reached rather than starting
|
|
531
|
+
over.
|
|
532
|
+
|
|
533
|
+
**Nothing is left lying around.** The isolated checkouts are kept for six hours after a review
|
|
534
|
+
finishes, because that is what the assistant reads while you are still asking questions, and are
|
|
535
|
+
then removed. Your reviews themselves are untouched by this and are still kept for thirty days.
|
|
536
|
+
|
|
537
|
+
**A command line, if you would rather not open Claude Code.** `prreviewbuddy review` makes the same
|
|
538
|
+
review, through the same engine, into the same workspace, with no plugin loaded. There is still no
|
|
539
|
+
account, no API key and no configuration: it runs through the agent you have already installed and
|
|
540
|
+
signed in to.
|
|
541
|
+
|
|
542
|
+
**Two things are gone on purpose.** Reviewing uncommitted changes has been removed: PR Review Buddy
|
|
543
|
+
reviews committed code. And a dirty, diverged or detached checkout no longer blocks a review, since
|
|
544
|
+
the review is not made from your checkout any more and there is nothing left for that check to
|
|
545
|
+
protect.
|
|
546
|
+
|
|
547
|
+
## 0.3.1
|
|
548
|
+
|
|
549
|
+
*A way back into a review after the server restarts, conversation intact.*
|
|
550
|
+
|
|
551
|
+
**Getting back into a review.** `/prreviewbuddy:start-server` starts the workspace server and lists
|
|
552
|
+
your recent reviews with working links. Stopping the server never deleted anything — the reviews
|
|
553
|
+
have always been on disk — but their links carry the port, and the server takes a new one each time
|
|
554
|
+
it starts, so the old link pointed at nothing. Now there is a way back.
|
|
555
|
+
|
|
556
|
+
**Your conversation comes back with it.** A reopened workspace shows the questions you already
|
|
557
|
+
asked and the answers you got. They were always stored, and the assistant was already using them to
|
|
558
|
+
ground new answers; the page simply was not showing them, which read as forgotten.
|
|
559
|
+
|
|
560
|
+
**Stopping now asks properly.** A dialog that says what happens, instead of a button that relabels
|
|
561
|
+
itself into a confirmation — that version could leave a stale label behind after the server had
|
|
562
|
+
already stopped. `/prreviewbuddy:stop` is now `/prreviewbuddy:stop-server`, to pair with
|
|
563
|
+
`start-server`.
|
|
564
|
+
|
|
565
|
+
## 0.3.0
|
|
566
|
+
|
|
567
|
+
*The Files tab becomes a browser, the assistant resizes, and the server can be stopped.*
|
|
568
|
+
|
|
569
|
+
**The Files tab is now a file browser.** Every changed file, grouped under the theme that owns it,
|
|
570
|
+
with a search box and the finding counts each file carries. Click any file to read it in place —
|
|
571
|
+
the same viewer an issue or a question expands, because the point is that you can go and look at
|
|
572
|
+
whatever you like, not only at what the review pointed to.
|
|
573
|
+
|
|
574
|
+
**The assistant is resizable.** Drag its left edge; it remembers the width between sessions and
|
|
575
|
+
across reviews. Arrow keys move it too, and double-clicking the edge puts it back. It starts wider
|
|
576
|
+
than it used to, which is the honest position: it is a pane of the workspace, not a chat widget
|
|
577
|
+
docked to the side.
|
|
578
|
+
|
|
579
|
+
**A way to stop the workspace server.** It stays running after Claude Code closes, on purpose, so
|
|
580
|
+
your workspace keeps working — but until now nothing ever ended it. **Stop server** in the header,
|
|
581
|
+
or `/prreviewbuddy:stop` once the tab is closed.
|
|
582
|
+
|
|
583
|
+
Smaller things: "Explain in simple terms" now uses the fuller wording the extension uses, analogy
|
|
584
|
+
and all. The workspace has a favicon, so its tab is findable among twenty others.
|
|
585
|
+
|
|
586
|
+
## 0.2.2
|
|
587
|
+
|
|
588
|
+
*Stops instead of building a review of nothing.*
|
|
589
|
+
|
|
590
|
+
**Says so when there is nothing to review.** Running the command on `main` straight after a pull
|
|
591
|
+
compared the branch against itself, found no changes, and went ahead and built a review of nothing
|
|
592
|
+
— a workspace with empty themes, or invented ones. It now stops and tells you what it compared:
|
|
593
|
+
|
|
594
|
+
> No changes found to review — main is the base it would be compared against. Switch to the branch
|
|
595
|
+
> containing your changes, or review uncommitted changes.
|
|
596
|
+
|
|
597
|
+
To review work you have not committed yet, ask for it: *"review my uncommitted changes"*.
|
|
598
|
+
|
|
599
|
+
## 0.2.1
|
|
600
|
+
|
|
601
|
+
*Fixes the command name to `/prreviewbuddy:review`.*
|
|
602
|
+
|
|
603
|
+
**Fixes the command name.** The documented `/prreviewbuddy` never worked: Claude Code namespaces
|
|
604
|
+
plugin commands as `plugin:command`, so it answered `Unknown command`. The command is now
|
|
605
|
+
`/prreviewbuddy:review`, which reads better than the `/prreviewbuddy:prreviewbuddy` the old file
|
|
606
|
+
name would have produced.
|
|
607
|
+
|
|
608
|
+
If you downloaded 0.2.0, this is the only thing that changes for you — the review itself is
|
|
609
|
+
identical. Take 0.2.1 and use the new command.
|
|
610
|
+
|
|
611
|
+
## 0.2.0 — first release
|
|
612
|
+
|
|
613
|
+
*The first release, described by what it does rather than what changed.*
|
|
614
|
+
|
|
615
|
+
> Shipped documenting the command as `/prreviewbuddy`, which does not resolve. Corrected below;
|
|
616
|
+
> 0.2.1 renames it to `/prreviewbuddy:review`.
|
|
617
|
+
|
|
618
|
+
The first build outside the workshop. Everything here is new to you, so this is what it does
|
|
619
|
+
rather than what changed.
|
|
620
|
+
|
|
621
|
+
**A review you work through, not a wall of text.** `/prreviewbuddy:review` in any git repository
|
|
622
|
+
turns the current branch into a workspace: a suggested path through the change in the order
|
|
623
|
+
worth reading it, findings that cite real lines, and questions worth putting to the author.
|
|
624
|
+
Claude Code does the analysing and reads the surrounding repository, so a finding can rest on
|
|
625
|
+
code the diff never showed.
|
|
626
|
+
|
|
627
|
+
**Citations open in place.** Click a file on a theme, or an issue's location, and the code
|
|
628
|
+
opens under it with the cited line marked. **Open in ...** hands it to your editor — VS Code
|
|
629
|
+
by default, configurable.
|
|
630
|
+
|
|
631
|
+
**An assistant that already has the context.** Ask about a finding without explaining the
|
|
632
|
+
change first. It answers from the guide, the diff and the repository, and it keeps working
|
|
633
|
+
after the Claude Code session that produced the review has closed.
|
|
634
|
+
|
|
635
|
+
**Every changed file is accounted for.** Large changes are prioritised, never truncated: the
|
|
636
|
+
review path says where to start, and the Files view lists everything else. On a big change not
|
|
637
|
+
every diff travels inline, and the analysis reads those files from the repository instead.
|
|
638
|
+
|
|
639
|
+
**Several reviews at once.** Two Claude Code sessions, or two worktrees, give you two
|
|
640
|
+
independent workspaces. A workspace opened from a linked worktree names the checkout in its
|
|
641
|
+
header and tab title, so near-identical branches stay tellable apart.
|
|
642
|
+
|
|
643
|
+
**Nothing leaves your machine.** No account, no API key, no server of ours. Reviews live in
|
|
644
|
+
`~/.prreviewbuddy/`, the workspace is served on `127.0.0.1` behind a per-review token, and the
|
|
645
|
+
local usage log has no network path out of it at all — `PRB_TELEMETRY=off` if you'd rather it
|
|
646
|
+
weren't written.
|
|
647
|
+
|
|
648
|
+
### Known limits
|
|
649
|
+
|
|
650
|
+
Worth knowing before you hit them:
|
|
651
|
+
|
|
652
|
+
- **Stopping the workspace server** needs `pkill -f 'dist/server.js'`. There is no command yet.
|
|
653
|
+
- **Built and tested on macOS.** Linux and Windows should work — the browser launch handles
|
|
654
|
+
all three — but neither has been run in anger. Reports welcome.
|
|
655
|
+
- **The assistant needs `claude` on your `PATH`**, since it shells out to `claude -p`. If it
|
|
656
|
+
isn't there, the panel says so rather than failing quietly.
|
|
657
|
+
- **Reviews are local and private, which also means unshareable.** There is no link to send a
|
|
658
|
+
colleague.
|
|
659
|
+
- **The review path is a priority order, not a coverage claim.** A file it doesn't send you to
|
|
660
|
+
was not judged unimportant and was not hidden — it just isn't where you should start.
|
|
661
|
+
|
|
662
|
+
### Feedback
|
|
663
|
+
|
|
664
|
+
**Send feedback** in the workspace header. It carries the version and your OS, and not your
|
|
665
|
+
repository, your code, or the review.
|