mergestorm 0.3.47 → 0.3.48

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.47 │
48
+ │ ▀▀▀▀▀▀▀▀▀▀▘ mergestorm v0.3.48 │
49
49
  │ ▀▀▀▀▀▀▀▀▀ ● msk_live_… · maelstrom │
50
50
  │ ▀▀▀▀▀▀ [████████░░░░░░░░░░░░░░░░░░░░░░] 25% used │
51
51
  │ ▝▀▀▀▀▀ local reviews + stacked PRs · mergestorm.ai │
@@ -165,6 +165,8 @@ export declare const SEAM_VERDICT_STALE = "Seam verdict is for an older head, no
165
165
  export declare const VORTEX_FINDINGS_NEED_PERSON = "Vortex findings need a person";
166
166
  export declare function autoResolveActive(stack: StackDto, layer: StackLayerDto): boolean;
167
167
  export declare function autoFixCiActive(stack: StackDto, layer: StackLayerDto): boolean;
168
+ export declare const CI_DID_NOT_FINISH_BLOCKER = "CI did not finish \u2014 left for a person";
169
+ export declare function pendingCiLeftForPerson(stack: StackDto, layer: StackLayerDto): boolean;
168
170
  export declare const VORTEX_AUTO_REVIEW_OFF = "Vortex auto-review is off, so this head was not reviewed";
169
171
  export declare const VORTEX_BILLING_SKIPPED = "Vortex skipped this head: it could not confirm billing";
170
172
  export declare const VORTEX_REVIEW_INCOMPLETE = "Vortex reviewed only part of this PR";
@@ -131,6 +131,11 @@ export function autoFixCiActive(stack, layer) {
131
131
  return !stack.cycloneCiOff && !isLandPrLayer(stack, layer) &&
132
132
  !sameHead(layer.cycloneCiHandoff?.headSha, layer.headSha);
133
133
  }
134
+ export const CI_DID_NOT_FINISH_BLOCKER = "CI did not finish — left for a person";
135
+ export function pendingCiLeftForPerson(stack, layer) {
136
+ return layer.ciStatus === "pending" && !isLandPrLayer(stack, layer) &&
137
+ sameHead(layer.cycloneCiHandoff?.headSha, layer.headSha);
138
+ }
134
139
  function ciHandoffNote(stack, layer) {
135
140
  if (isLandPrLayer(stack, layer))
136
141
  return null;
@@ -272,6 +277,8 @@ function layerAttention(stack, layer, queue, cursor) {
272
277
  const name = layer.checks?.failingName?.trim();
273
278
  return hardBlock(`CI failed${name ? ` — ${name}` : ""}`, "ci_failed");
274
279
  }
280
+ if (pendingCiLeftForPerson(stack, layer))
281
+ return hardBlock(CI_DID_NOT_FINISH_BLOCKER, "ci_failed");
275
282
  if (layer.vortexStatus === "failed" && !vortexRetryScheduled(layer) &&
276
283
  (!layer.vortexReview?.head_sha || sameHead(layer.vortexReview.head_sha, layer.headSha))) {
277
284
  return hardBlock(VORTEX_REVIEW_FAILED, "vortex_failed");
@@ -780,7 +787,9 @@ export function stackRepair(stack, attention, layer, bounce, queueWait = null) {
780
787
  headSha: layer.headSha ?? null,
781
788
  branch: layer.branch,
782
789
  failingCheck,
783
- steps: `Read the failing ${failingCheck ? `check ${failingCheck}` : "checks"} on ${layer.branch} (gh run list --branch ${layer.branch}, then gh run view <run-id> --log-failed), fix it on ${layer.branch} with the smallest patch, run that check locally, confirm the remote head is still ${layer.headSha ?? "the head you started from"}, then an ordinary git push. Do not retarget the PR base.`,
790
+ steps: pendingCiLeftForPerson(stack, layer)
791
+ ? `CI on ${layer.branch} at ${layer.headSha ?? "its live head"} ended cancelled or interrupted and did not finish after Cyclone's one re-run. Find the cancelled run (gh run list --branch ${layer.branch}), read why it stopped (gh run view <run-id>), and re-run it (gh run rerun <run-id>) if it was a runner or infrastructure stop. If the job itself cancels, fix that on ${layer.branch} and push. Do not retarget the PR base.`
792
+ : `Read the failing ${failingCheck ? `check ${failingCheck}` : "checks"} on ${layer.branch} (gh run list --branch ${layer.branch}, then gh run view <run-id> --log-failed), fix it on ${layer.branch} with the smallest patch, run that check locally, confirm the remote head is still ${layer.headSha ?? "the head you started from"}, then an ordinary git push. Do not retarget the PR base.`,
784
793
  ...(note ? { note } : {}),
785
794
  };
786
795
  }
@@ -427,12 +427,25 @@ export type MergeQueueBounceBatch = {
427
427
  withPrNumbers: number[];
428
428
  };
429
429
  export type MergeQueueBatchState = "verifying" | "landing" | "landed" | "stopped" | "bounced" | "abandoned";
430
+ export type MergeQueueBatchCiCheckState = "passed" | "skipped" | "failed" | "running" | "queued";
431
+ export type MergeQueueBatchCiCheckDto = {
432
+ name: string;
433
+ state: MergeQueueBatchCiCheckState;
434
+ startedAt: string | null;
435
+ completedAt: string | null;
436
+ };
437
+ export type MergeQueueBatchCiDto = {
438
+ sha: string;
439
+ observedAt: string;
440
+ checks: MergeQueueBatchCiCheckDto[];
441
+ };
430
442
  export type MergeQueueEntryBatchDto = {
431
443
  id: string;
432
444
  position: number;
433
445
  size: number;
434
446
  state: MergeQueueBatchState;
435
447
  landedCount: number;
448
+ ci?: MergeQueueBatchCiDto | null;
436
449
  };
437
450
  export type MergeQueueAheadDto = {
438
451
  stackId: string | null;
package/dist/ui/banner.js CHANGED
@@ -179,6 +179,9 @@ const WHATS_NEW = {
179
179
  "0.3.47": [
180
180
  "New stack PRs are adopted on Work at submit",
181
181
  ],
182
+ "0.3.48": [
183
+ "Watch names CI Cyclone could not finish",
184
+ ],
182
185
  };
183
186
  function densityFromVariant(variant) {
184
187
  if (variant === "mini" || variant === "nano")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mergestorm",
3
- "version": "0.3.47",
3
+ "version": "0.3.48",
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",