mergestorm 0.3.50 → 0.3.51

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/README.md CHANGED
@@ -45,7 +45,7 @@ On a TTY, bare `mergestorm` (or `mergestorm shell`) opens a branded REPL: a comp
45
45
 
46
46
  ```
47
47
  ╭──────────────────────────────────────────────────────────────────────────────╮
48
- │ ▀▀▀▀▀▀▀▀▀▀▘ mergestorm v0.3.50 │
48
+ │ ▀▀▀▀▀▀▀▀▀▀▘ mergestorm v0.3.51 │
49
49
  │ ▀▀▀▀▀▀▀▀▀ ● msk_live_… · maelstrom │
50
50
  │ ▀▀▀▀▀▀ [████████░░░░░░░░░░░░░░░░░░░░░░] 25% used │
51
51
  │ ▝▀▀▀▀▀ local reviews + stacked PRs · mergestorm.ai │
@@ -63,11 +63,14 @@ function coreReviewDoneAtHead(layer) {
63
63
  return review?.status === "done" && sameHead(review.head_sha, layer.headSha);
64
64
  }
65
65
  export const VORTEX_FINDINGS_NEED_PERSON = "Vortex findings need a person";
66
- function vortexChangesRequestedAtHead(layer) {
66
+ function vortexFindingsRestAtHead(layer) {
67
67
  const review = layer.vortexReview;
68
68
  if (review && !(review.status === "done" && sameHead(review.head_sha, layer.headSha)))
69
69
  return false;
70
- return layer.vortexStatus === "findings" && layer.reviewStatus === "changes_requested";
70
+ return layer.vortexStatus === "findings" || layer.vortexStatus === "throttled";
71
+ }
72
+ function vortexChangesRequestedAtHead(layer) {
73
+ return vortexFindingsRestAtHead(layer) && layer.reviewStatus === "changes_requested";
71
74
  }
72
75
  function cycloneHandoffAtHead(stack, layer) {
73
76
  if (sameHead(layer.cycloneHandoff?.headSha, layer.headSha))
@@ -149,9 +152,24 @@ function ciHandoffNote(stack, layer) {
149
152
  }
150
153
  return null;
151
154
  }
155
+ const CYCLONE_HELD_FINDINGS_REASONS = [
156
+ "failed",
157
+ "left_for_human",
158
+ "infra_failure",
159
+ "pr_state_unavailable",
160
+ "vortex_patch_cap",
161
+ "patch_job_lost",
162
+ ];
163
+ function vortexImportantFindingsHeldAtHead(layer) {
164
+ return vortexFindingsRestAtHead(layer) && layer.reviewStatus === "reviewed" &&
165
+ sameHead(layer.cycloneHandoff?.headSha, layer.headSha) &&
166
+ CYCLONE_HELD_FINDINGS_REASONS.includes(layer.cycloneHandoff.reason);
167
+ }
152
168
  function vortexFindingsLeftForPerson(stack, layer) {
153
- return vortexChangesRequestedAtHead(layer) && !layerAgentsBusy(layer).cyclone &&
154
- cycloneHandoffAtHead(stack, layer) !== null;
169
+ if (layerAgentsBusy(layer).cyclone)
170
+ return false;
171
+ return vortexImportantFindingsHeldAtHead(layer) ||
172
+ (vortexChangesRequestedAtHead(layer) && cycloneHandoffAtHead(stack, layer) !== null);
155
173
  }
156
174
  function quotaSkippedReview(layer) {
157
175
  const review = layer.vortexReview;
@@ -776,7 +794,7 @@ export function stackRepair(stack, attention, layer, bounce, queueWait = null) {
776
794
  branch: layer.branch,
777
795
  handoff,
778
796
  findings,
779
- steps: `Vortex requested changes on ${layer.branch} at ${layer.headSha ?? "its live head"} and Cyclone left them for a person${handoff ? ` (${cycloneHandoffWords(handoff)})` : ""}, so nothing will patch them and Auto land waits. Read the newest Vortex review and its inline comments (${findings}), verify each finding against ${layer.branch} at its live remote head, fix the real ones with the smallest patch, run the tests, confirm the remote head is still ${layer.headSha ?? "the head you started from"}, then an ordinary git push (no force). If a finding is wrong, tell the human; mg dismiss ${stack.owner}/${stack.repo}#${layer.prNumber} --head <sha> --review <id> dismisses that review. Do not retarget the PR base.`,
797
+ steps: `Vortex ${vortexImportantFindingsHeldAtHead(layer) ? "left Important findings" : "requested changes"} on ${layer.branch} at ${layer.headSha ?? "its live head"} and Cyclone left them for a person${handoff ? ` (${cycloneHandoffWords(handoff)})` : ""}, so nothing will patch them and Auto land waits. Read the newest Vortex review and its inline comments (${findings}), verify each finding against ${layer.branch} at its live remote head, fix the real ones with the smallest patch, run the tests, confirm the remote head is still ${layer.headSha ?? "the head you started from"}, then an ordinary git push (no force). If a finding is wrong, tell the human; mg dismiss ${stack.owner}/${stack.repo}#${layer.prNumber} --head <sha> --review <id> dismisses that review. Do not retarget the PR base.`,
780
798
  };
781
799
  }
782
800
  if (reason === "ci_failed" || attention.bounceKind === "ci_failure") {
package/dist/ui/banner.js CHANGED
@@ -188,6 +188,9 @@ const WHATS_NEW = {
188
188
  "0.3.50": [
189
189
  "Agent sign-in: login --start, --finish",
190
190
  ],
191
+ "0.3.51": [
192
+ "Watch names findings held on a throttled head",
193
+ ],
191
194
  };
192
195
  function densityFromVariant(variant) {
193
196
  if (variant === "mini" || variant === "nano")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mergestorm",
3
- "version": "0.3.50",
3
+ "version": "0.3.51",
4
4
  "description": "Mergestorm CLI (mg) — local reviews & stacked PRs. MIT; build from source: https://github.com/marginsystems/mergestorm-cli",
5
5
  "license": "MIT",
6
6
  "type": "module",