prreviewbuddy 0.14.1 → 0.18.0

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