pr-shepherd 0.32.4 → 0.32.5

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pr-shepherd",
3
3
  "description": "Autonomous PR CI monitor and review-comment resolver for agentic coding tools",
4
- "version": "0.32.4",
4
+ "version": "0.32.5",
5
5
  "author": {
6
6
  "name": "Jonathan Ong",
7
7
  "email": "jonathanrichardong@gmail.com"
@@ -14,16 +14,21 @@ function dedupeIds(ids) {
14
14
  }
15
15
  export function classifyReviewSummaries(summaries, approvals, minimizeApprovals, minimizeComments = "all", botUsernames = new Set(), unresolvedThreads = [], ruleAutoResolveIds = []) {
16
16
  const blockedReviewIds = new Set(unresolvedThreads.flatMap((t) => (t.reviewId !== undefined ? [t.reviewId] : [])));
17
- // First-look and seen summaries go into the minimize mutation; edited summaries do NOT —
18
- // they are already minimized server-side (body changed after minimize was applied).
19
- // First-look bodies are rendered so the agent sees them before the minimize happens.
20
- const minimizeIds = [...summaries.firstLook, ...summaries.seen]
21
- .filter((r) => shouldMinimizeAuthor(r.authorType, minimizeComments, r.author, botUsernames))
22
- .filter((r) => !blockedReviewIds.has(r.id))
23
- .map((r) => r.id);
24
- // Rule-matched summaries are already suppressed from agent output; bypass normal policy gates.
17
+ const eligible = (r) => shouldMinimizeAuthor(r.authorType, minimizeComments, r.author, botUsernames) &&
18
+ !blockedReviewIds.has(r.id);
19
+ // First-look summaries still need one tick to surface their body to the agent,
20
+ // so their minimize IDs ride in the agent-facing resolve command. Seen summaries
21
+ // (already surfaced in a prior tick) have no new content to show — the CLI
22
+ // self-minimizes them in-process (selfMinimizeIds) instead of routing a
23
+ // cosmetic-only mutation through fix_code (issue #313). Edited summaries are
24
+ // excluded entirely: they are already minimized server-side (body changed after
25
+ // minimize was applied).
26
+ const minimizeIds = summaries.firstLook.filter(eligible).map((r) => r.id);
27
+ const selfMinimizeIds = summaries.seen.filter(eligible).map((r) => r.id);
28
+ // Rule-matched summaries are already suppressed from agent output; bypass normal
29
+ // policy gates. Keep the two sets disjoint.
25
30
  for (const id of ruleAutoResolveIds) {
26
- if (!minimizeIds.includes(id))
31
+ if (!minimizeIds.includes(id) && !selfMinimizeIds.includes(id))
27
32
  minimizeIds.push(id);
28
33
  }
29
34
  if (minimizeApprovals) {
@@ -36,6 +41,7 @@ export function classifyReviewSummaries(summaries, approvals, minimizeApprovals,
36
41
  }
37
42
  return {
38
43
  minimizeIds,
44
+ selfMinimizeIds,
39
45
  firstLookSummaries: summaries.firstLook,
40
46
  editedSummaries: summaries.edited,
41
47
  surfacedApprovals,
@@ -43,6 +49,7 @@ export function classifyReviewSummaries(summaries, approvals, minimizeApprovals,
43
49
  }
44
50
  return {
45
51
  minimizeIds,
52
+ selfMinimizeIds,
46
53
  firstLookSummaries: summaries.firstLook,
47
54
  editedSummaries: summaries.edited,
48
55
  surfacedApprovals: approvals,
@@ -10,6 +10,7 @@ import { applyStallGuard } from "./stall.mjs";
10
10
  import { clearStallState } from "../../state/iterate-stall.mjs";
11
11
  import { handleFixCode } from "./fix-code.mjs";
12
12
  import { normalizeBotUsernames } from "../../comments/authors.mjs";
13
+ import { autoMinimizeComments } from "../../comments/resolve.mjs";
13
14
  export async function runIterate(opts) {
14
15
  const config = loadConfig();
15
16
  const botUsernames = normalizeBotUsernames(config.botUsernames);
@@ -35,11 +36,25 @@ export async function runIterate(opts) {
35
36
  await clearStallState(stallKey);
36
37
  return buildTerminalCancelResult(report);
37
38
  }
38
- const { minimizeIds: reviewSummaryIds, firstLookSummaries, editedSummaries, surfacedApprovals, } = classifyReviewSummaries({
39
+ const { minimizeIds, selfMinimizeIds, firstLookSummaries, editedSummaries, surfacedApprovals } = classifyReviewSummaries({
39
40
  firstLook: report.firstLookSummaries,
40
41
  seen: report.reviewSummaries,
41
42
  edited: report.editedSummaries,
42
43
  }, report.approvedReviews, config.iterate.minimizeApprovals, config.iterate.minimizeComments, botUsernames, [...report.threads.actionable, ...report.threads.resolutionOnly], report.ruleAutoResolveReviewSummaryIds);
44
+ // Already-seen review summaries have no new content to surface — minimize them
45
+ // in-process so they never register as agent-facing actionable work (#313).
46
+ // GitHub can still return a null/error/rate-limit result per ID without
47
+ // throwing (autoMinimizeComments reports this via `errors`, not a rejection);
48
+ // any ID it did not confirm minimized falls back into the agent-facing set so
49
+ // the resolve command remains a working fallback instead of silently dropping it.
50
+ let reviewSummaryIds = minimizeIds;
51
+ if (selfMinimizeIds.length > 0) {
52
+ const { minimized } = await autoMinimizeComments(selfMinimizeIds);
53
+ const minimizedIds = new Set(minimized);
54
+ const unminimized = selfMinimizeIds.filter((id) => !minimizedIds.has(id));
55
+ if (unminimized.length > 0)
56
+ reviewSummaryIds = [...reviewSummaryIds, ...unminimized];
57
+ }
43
58
  const hasActionableWork = report.threads.actionable.length > 0 ||
44
59
  report.threads.resolutionOnly.length > 0 ||
45
60
  report.threads.firstLook.length > 0 ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pr-shepherd",
3
- "version": "0.32.4",
3
+ "version": "0.32.5",
4
4
  "description": "Autonomous PR CI monitor and review-comment resolver for agentic coding tools",
5
5
  "license": "MIT",
6
6
  "author": "Jonathan Ong",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pr-shepherd",
3
- "version": "0.32.4",
3
+ "version": "0.32.5",
4
4
  "description": "Autonomous PR CI monitor and review-comment resolver for Codex.",
5
5
  "author": {
6
6
  "name": "Jonathan Ong",