prreviewbuddy 0.91.1 → 0.93.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 +53 -0
- package/dist/main.js +9 -4
- package/dist/{mcp_tools-BR7_XprF.js → mcp_tools-DbFR9Z90.js} +311 -55
- package/dist/server.js +252 -71
- package/package.json +1 -1
- package/static/{chunk-DMxtqzNj.js → chunk-Cg4cN8Vk.js} +1 -1
- package/static/reviews.js +1 -1
- package/static/runs.js +1 -1
- package/static/shell.css +31 -10
- package/static/sidebar.css +25 -6
- package/static/workspace.js +76 -63
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,58 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.93.0
|
|
4
|
+
|
|
5
|
+
**Re-check reconciles your findings with the PR discussion.** **Re-check in PR context** used to
|
|
6
|
+
fetch the latest comments and correct who raised what, and leave every issue and question as it
|
|
7
|
+
was until Update or a card's own Reassess ran. It now runs the same discussion pass as Update,
|
|
8
|
+
against the commit the review read: a comment that answers a question answers it, a comment that
|
|
9
|
+
settles an issue resolves it, and a concern a comment raises becomes a new issue once it is
|
|
10
|
+
confirmed in the reviewed code. A claim that something was fixed is never taken on trust, and a
|
|
11
|
+
thread resolved on the forge is not, by itself, a fix: either stays open for Update to check against
|
|
12
|
+
newer commits, which remain Update's job. Reassess on a single card is unchanged.
|
|
13
|
+
|
|
14
|
+
The steps show while it runs (fetching the discussion, preparing the reviewed code, reassessing
|
|
15
|
+
issues and questions), and Cancel stops it. The result says what happened: the findings that
|
|
16
|
+
changed, that no findings changed, or, when the comments were fetched but the reassessment failed,
|
|
17
|
+
that the discussion was refreshed and the findings were not, with **Try again**. When nothing in
|
|
18
|
+
the discussion is new since the findings were last assessed, no model is asked.
|
|
19
|
+
|
|
20
|
+
The discussion counts as analysed only once a Re-check or an Update has finished reassessing it,
|
|
21
|
+
and only as far as it read, so a comment that arrives during a Re-check is still new to the next
|
|
22
|
+
one. A Re-check never stands in for an Update, and the last update's outcome is left as it was.
|
|
23
|
+
|
|
24
|
+
## 0.92.0
|
|
25
|
+
|
|
26
|
+
**Older issues catch up on Update.** An issue from an earlier review that is still outstanding now
|
|
27
|
+
gains its summary the next time Update finds new commits or new discussion. The summary is written
|
|
28
|
+
from the evidence the review already holds plus what the update read, and may land in any of the
|
|
29
|
+
four groups. It is a rewording, not a re-check: confidence, severity and the technical account stay
|
|
30
|
+
as they were. Resolved, dismissed and closed issues keep the card they had, and an Update that finds
|
|
31
|
+
nothing new still makes no analysis and changes nothing.
|
|
32
|
+
|
|
33
|
+
**To fix.** Besides **To verify** and **To decide**, a card can now name the change that would
|
|
34
|
+
correct it, marked **To fix**, when the evidence supports one. The line above the issues counts
|
|
35
|
+
fixes separately. Issues are grouped by what they cause and how well that is shown, never by the
|
|
36
|
+
kind of file: a wrong step in a recovery runbook can be a failure.
|
|
37
|
+
|
|
38
|
+
**Questions lead with what they mean.** Each question from a new analysis opens with the question in
|
|
39
|
+
plain terms, why the answer matters, and what is needed. The original question, its reasoning and its
|
|
40
|
+
files are under **Technical context** on the card. Answers so far, including a partial one, stay in
|
|
41
|
+
view. Updates keep each question's framing true, restate it to name only what is still open when part
|
|
42
|
+
of it is answered, and write one for an older question still open.
|
|
43
|
+
|
|
44
|
+
**No leftover notes.** When an update answers a question or changes an issue's status without
|
|
45
|
+
saying anything new about it, the card no longer shows the previous round's note beside the new
|
|
46
|
+
status. Before, a question could read as answered with "this commit did not change it" underneath.
|
|
47
|
+
|
|
48
|
+
**Quieter cards.** The age of the pull request discussion is one line, "PR discussion checked 2 days
|
|
49
|
+
ago", with its explanation one click away and **Re-check in PR context** beside it. Cards are
|
|
50
|
+
tighter, and **Technical details** shares a row with the card's actions.
|
|
51
|
+
|
|
52
|
+
For coding agents, `list_findings` and `findings --json` now carry each issue's `confidence` and
|
|
53
|
+
each question's `framing`, and `next.kind` may be `fix`. `get_finding` carries the same, beside the
|
|
54
|
+
original technical text.
|
|
55
|
+
|
|
3
56
|
## 0.91.1
|
|
4
57
|
|
|
5
58
|
**Issues lead with what they mean.** Each issue from a new analysis now opens with its consequence:
|
package/dist/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { $ as readAskRequest,
|
|
2
|
+
import { $ as readAskRequest, Br as progressSteps, Dt as parkedUpdateRefusal, E as relativeTime, Ea as resolveTarget, F as spawnRunner, Fa as git, Ft as failureOf, G as reviewTag, Ga as AGENT_IDS, Gt as stamp, H as findingRef, Ha as writeAgentPreference, Hi as isIssueOutstanding, Hr as clearClaim, Ht as append, I as applyUpdate, Ir as PHASES, J as forgetAskRequest, Ja as agentIdentityOf, Ji as verdictClosure, Jt as telemetryUploadConsent, Ka as agentById, Kt as deliver, L as modelProvenanceOf, La as resolveAgent, Lt as prepareReview, Ma as AmbiguousRefError, Mr as isTerminal$1, Mt as UpdateAlreadyRunningError, Nr as loadJob, Nt as liveUpdateFor, Or as allJobs, P as runDetached, Pt as runningJobs, Qa as runnableAgents, Qi as explanationOf, Ra as resolveModel, Rt as settleReview, T as runBatch, Ta as kissOutcome, Tr as forgeResolver, Ua as CONFIG_PATH, Ui as isQuestionOutstanding, Ur as driverGone, Va as readAgentPreference, Vr as purposeOf, Vt as startJob, Wa as STORE_ROOT, Wr as isClaimed, Xa as isAgentId, Xt as BUILD_VERSION, Y as interruption, Ya as detectAgents, Yt as telemetryUploadEnabled, Z as isTerminalAsk, Za as parkedReason, Zt as PACKAGE_NAME, _r as describeMovement, _t as parseWorkspacePort, ai as positionInLineage, at as healthyPort, bt as writePortPreference, ci as recentWorkspaces, di as summarise, dt as stopServer, et as recordAskAccepted, ft as workspaceUrl, gt as MIN_WORKSPACE_PORT, hr as removeWorktree, ht as MAX_WORKSPACE_PORT, i as deleteReview$1, it as ensureServer, j as RUNNER_KINDS, k as queueForReview, ka as TargetError, kr as attemptIdOf, la as findingStatus, li as reviewedCommit, mr as readMarker, mt as DEFAULT_WORKSPACE_PORT, ni as loadWorkspace, nt as bootstrapUrl, o as liveJobsFor, or as modelHelpLines, ot as readServerRecord, pi as workspaceRevision, q as endAskRequest, qi as reviewerDispositions, qr as followedRefName, qt as recordTelemetryUploadConsent, ri as matchingWorkspaceIds, s as wasBlocked, sa as findingAssessment, st as reviewsUrl, t as MCP_SERVER_INFO_NAME, ti as lineagePosition, tt as readIndexToken, u as recordKissRun, ui as reviewedRepositories, ur as MANAGED_ROOT, vr as describeSubject, wa as WITHHELD_REASON, x as batchIdentity, xt as COMMIT_REVIEW_CANNOT_UPDATE, yr as findExistingReview, yt as statedWorkspacePort, za as agentIdOf, zt as reanalyseReview } from "./mcp_tools-DbFR9Z90.js";
|
|
3
3
|
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { existsSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
@@ -1051,7 +1051,13 @@ function summaryOf(tag, entry, judge) {
|
|
|
1051
1051
|
...issue.consequence.group ? { group: issue.consequence.group } : {},
|
|
1052
1052
|
...issue.consequence.next ? { next: { ...issue.consequence.next } } : {}
|
|
1053
1053
|
} } : {},
|
|
1054
|
-
...issue?.resolvedBehaviour && status === "resolved" ? { resolved_behaviour: issue.resolvedBehaviour } : {}
|
|
1054
|
+
...issue?.resolvedBehaviour && status === "resolved" ? { resolved_behaviour: issue.resolvedBehaviour } : {},
|
|
1055
|
+
...issue?.confidence ? { confidence: issue.confidence } : {},
|
|
1056
|
+
...question?.framing ? { framing: {
|
|
1057
|
+
question: question.framing.question,
|
|
1058
|
+
why: question.framing.why,
|
|
1059
|
+
...question.framing.needed ? { needed: question.framing.needed } : {}
|
|
1060
|
+
} } : {}
|
|
1055
1061
|
};
|
|
1056
1062
|
}
|
|
1057
1063
|
/** A question can run to a paragraph. The list carries its first line; `get_finding` has the rest. */
|
|
@@ -1088,7 +1094,6 @@ function detailOf(workspace, tag, entry, judge) {
|
|
|
1088
1094
|
...section ? { title: section.title } : {}
|
|
1089
1095
|
} } : {},
|
|
1090
1096
|
...finding.relatedFiles?.length ? { related_files: finding.relatedFiles } : {},
|
|
1091
|
-
...issue?.confidence ? { confidence: issue.confidence } : {},
|
|
1092
1097
|
...question?.category ? { category: question.category } : {},
|
|
1093
1098
|
...issue?.existingDiscussion ? { existing_discussion: {
|
|
1094
1099
|
thread_id: issue.existingDiscussion.threadId,
|
|
@@ -1521,7 +1526,7 @@ async function requestUpdate(id, source, deps = defaultDeps) {
|
|
|
1521
1526
|
};
|
|
1522
1527
|
const latest = loadWorkspace(workspace.id)?.lastUpdate;
|
|
1523
1528
|
if (latest && latest.at !== before) {
|
|
1524
|
-
const finished = jobsOf(workspace.id).find((candidate) => purposeOf(candidate) === "update" && candidate.startedAt >= (before ?? 0));
|
|
1529
|
+
const finished = jobsOf(workspace.id).find((candidate) => purposeOf(candidate) === "update" && !candidate.scope && candidate.startedAt >= (before ?? 0));
|
|
1525
1530
|
return {
|
|
1526
1531
|
review: await getReview(workspace.id, deps),
|
|
1527
1532
|
job: finished ? toJobRecord(finished, false) : null,
|