mergestorm 0.3.31 → 0.3.33

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.31 │
48
+ │ ▀▀▀▀▀▀▀▀▀▀▘ mergestorm v0.3.33 │
49
49
  │ ▀▀▀▀▀▀▀▀▀ ● msk_live_… · maelstrom │
50
50
  │ ▀▀▀▀▀▀ [████████░░░░░░░░░░░░░░░░░░░░░░] 25% used │
51
51
  │ ▝▀▀▀▀▀ local reviews + stacked PRs · mergestorm.ai │
package/dist/api.js CHANGED
@@ -570,6 +570,12 @@ async function queueMutation(route, failLabel, cfg) {
570
570
  }
571
571
  throw new CommandError("Merge queue API is not available on this server yet. Deploy the API update or use the dashboard.");
572
572
  }
573
+ if (status === 409) {
574
+ const refusal = body;
575
+ if (refusal?.error === "conflict_unchanged" && typeof refusal.message === "string") {
576
+ throw new CommandError(refusal.message);
577
+ }
578
+ }
573
579
  if (status < 200 || status >= 300) {
574
580
  throw new CommandError(`${failLabel} (HTTP ${status}): ${JSON.stringify(body)}`);
575
581
  }
@@ -76,6 +76,11 @@ function seamGateBlocker(stack, layer) {
76
76
  return SEAM_REVIEW_NOT_RUNNING;
77
77
  return null;
78
78
  }
79
+ function headChecksAllGreen(layer) {
80
+ const checks = layer.checks;
81
+ return layer.ciStatus === "success" && !!checks && checks.total > 0 &&
82
+ checks.failure === 0 && checks.pending === 0 && checks.success > 0;
83
+ }
79
84
  /** Shared live-fact precedence; bounce history is only passed for the candidate. */
80
85
  function layerAttention(stack, layer, queue, cursor) {
81
86
  const none = { blocker: null, bounceKind: null };
@@ -138,6 +143,8 @@ function layerAttention(stack, layer, queue, cursor) {
138
143
  if (!sameHead(bounce.bounceDetail?.headSha ?? bounce.verifyHeadSha, layer.headSha) ||
139
144
  (bounce.bounceDetail?.prNumber != null && bounce.bounceDetail.prNumber !== layer.prNumber))
140
145
  return none;
146
+ if (kind === "ci_failure" && !bounce.bounceDetail?.batch && headChecksAllGreen(layer))
147
+ return none;
141
148
  return { blocker: mergeQueueBounceLabel(bounce), bounceKind: kind, bounce };
142
149
  }
143
150
  const AUTO_LAND_DISARMING_BOUNCE_KINDS = ["merge_failed", "gh_error", "ci_timeout"];
@@ -390,6 +390,8 @@ export type MergeQueueBounceDetail = {
390
390
  conflictBranch?: string;
391
391
  conflictDetail?: string;
392
392
  conflictPaths?: string[];
393
+ baseBranch?: string;
394
+ baseSha?: string;
393
395
  message?: string;
394
396
  warning?: string;
395
397
  batch?: MergeQueueBounceBatch;
package/dist/ui/banner.js CHANGED
@@ -126,6 +126,12 @@ const WHATS_NEW = {
126
126
  "0.3.31": [
127
127
  "every stack Next line offers mg stack watch",
128
128
  ],
129
+ "0.3.32": [
130
+ "queue add explains a held merge conflict",
131
+ ],
132
+ "0.3.33": [
133
+ "stack watch clears a CI failure rerun green",
134
+ ],
129
135
  };
130
136
  function densityFromVariant(variant) {
131
137
  if (variant === "mini" || variant === "nano")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mergestorm",
3
- "version": "0.3.31",
3
+ "version": "0.3.33",
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",