@mutmutco/cli 4.5.110 → 4.5.111

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.
Files changed (2) hide show
  1. package/dist/main.cjs +17 -16
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -6072,7 +6072,7 @@ function waitReadFailureMessage(e) {
6072
6072
  const stderr = typeof err?.stderr === "string" ? err.stderr.trim() : "";
6073
6073
  return (stderr || err?.message || String(e)).replace(/\s+/g, " ").slice(0, 300);
6074
6074
  }
6075
- var PR_CHECKS_POLL_MS = 3e4;
6075
+ var PR_CHECKS_POLL_MS = 6e4;
6076
6076
  function pollIntervalMs(elapsedMs) {
6077
6077
  return Math.min(4 * PR_CHECKS_POLL_MS, PR_CHECKS_POLL_MS * 2 ** Math.floor(Math.max(0, elapsedMs) / 3e5));
6078
6078
  }
@@ -16926,7 +16926,7 @@ function foldPortManualCommand(model, version) {
16926
16926
  return model === "hub-serverless" ? `node scripts/release-distribution.mjs prepare ${version}` : `npm version ${version} --no-git-tag-version --allow-same-version`;
16927
16927
  }
16928
16928
  var HUB_REPO2 = "mutmutco/MMI-Hub";
16929
- var GH_RUN_WATCH_INTERVAL_S = 30;
16929
+ var GH_RUN_WATCH_INTERVAL_S = 60;
16930
16930
  function ghRunWatchArgs(runId, repo) {
16931
16931
  return ["run", "watch", String(runId), "--repo", repo, "--exit-status", "--interval", String(GH_RUN_WATCH_INTERVAL_S)];
16932
16932
  }
@@ -17716,10 +17716,10 @@ var rollout_plan_default = {
17716
17716
  note: "The v4.0.0 stamp happens at cut time (D6e #4463); until then the candidate is the origin/development head artifacts (built cli/dist + npm pack), identity proven by dist content hash (D6a)."
17717
17717
  },
17718
17718
  baseline: {
17719
- version: "4.5.110",
17720
- tag: "v4.5.110",
17721
- commit: "b27eb42f5d5e",
17722
- npm: "@mutmutco/cli@4.5.110"
17719
+ version: "4.5.111",
17720
+ tag: "v4.5.111",
17721
+ commit: "7794d236f8bd",
17722
+ npm: "@mutmutco/cli@4.5.111"
17723
17723
  },
17724
17724
  exitCriterion: "fleet-n-of-n",
17725
17725
  hubOnlyShortcut: "forbidden",
@@ -17736,14 +17736,14 @@ var rollout_plan_default = {
17736
17736
  repo: "mutmutco/mmi-hub",
17737
17737
  role: "canary",
17738
17738
  schedule: "train",
17739
- v3Target: "v4.5.110"
17739
+ v3Target: "v4.5.111"
17740
17740
  }
17741
17741
  ],
17742
17742
  rollbackTrigger: "Any red inside the post-contract soak window: `devops train gate` FAIL attributable to the v4 doors, Hub endpoint health probe failure, a pre-v4 client admitted instead of receiving actionable HTTP 426, or npm consumer install/doctor failure on the v4-only dist.",
17743
17743
  rollback: {
17744
17744
  independent: true,
17745
- mechanism: "npm dist-tag latest -> 4.5.110 and redeploy the Hub Lambda from tag v4.5.110 (b27eb42f5d5e); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
17746
- v3Target: "v4.5.110 (@mutmutco/cli@4.5.110, tag commit b27eb42f5d5e \u2014 last known-good release carrying the repo-index v4-only contract)"
17745
+ mechanism: "npm dist-tag latest -> 4.5.111 and redeploy the Hub Lambda from tag v4.5.111 (7794d236f8bd); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
17746
+ v3Target: "v4.5.111 (@mutmutco/cli@4.5.111, tag commit 7794d236f8bd \u2014 last known-good release carrying the repo-index v4-only contract)"
17747
17747
  }
17748
17748
  },
17749
17749
  {
@@ -23731,7 +23731,7 @@ function deriveReleasePhaseStatus(ledger) {
23731
23731
  return { phaseStatus: worst === 0 ? "phases-failed" : worst === 1 ? "phases-pending" : "phases-green", legs };
23732
23732
  }
23733
23733
  function safeRunAction(runId, runRepo, state) {
23734
- return state === "failed" ? `next: diagnose with gh run view ${runId} --repo ${runRepo} --log-failed; rerun by hand only when the cause is fixed: gh run rerun ${runId} --repo ${runRepo} --failed (never re-tag)` : `next: gh run watch ${runId} --repo ${runRepo} --exit-status --interval 30`;
23734
+ return state === "failed" ? `next: diagnose with gh run view ${runId} --repo ${runRepo} --log-failed; rerun by hand only when the cause is fixed: gh run rerun ${runId} --repo ${runRepo} --failed (never re-tag)` : `next: gh run watch ${runId} --repo ${runRepo} --exit-status --interval 60`;
23735
23735
  }
23736
23736
  function formatReleaseLedgerReport(report) {
23737
23737
  const lines2 = [`release phase ledger${report.lane ? ` [${report.lane}]` : ""}: ${report.phaseStatus.toUpperCase()} (${report.path}) \u2014 phase status of the recorded boundaries, NOT the release verdict`];
@@ -24029,7 +24029,7 @@ async function transientRecoveryForFailedPhase(deps, input) {
24029
24029
  recovered: false,
24030
24030
  runId: candidate.runId,
24031
24031
  runRepo,
24032
- note: `the automatic rerun of ${failedRunIdentity(candidate, runRepo)} did not resolve within the bounded watch \u2014 typed PENDING (the one automatic rerun is spent); safe next action: gh run watch ${candidate.runId} --repo ${runRepo} --exit-status --interval 30`
24032
+ note: `the automatic rerun of ${failedRunIdentity(candidate, runRepo)} did not resolve within the bounded watch \u2014 typed PENDING (the one automatic rerun is spent); safe next action: gh run watch ${candidate.runId} --repo ${runRepo} --exit-status --interval 60`
24033
24033
  };
24034
24034
  }
24035
24035
  async function transientRecoveryEnumerate(deps, repo, sha) {
@@ -31748,7 +31748,8 @@ function parseTenantTasksVar(raw) {
31748
31748
  if (typeof task.service !== "string" || !serviceRe.test(task.service)) throw new Error(`org project set: tenantTasks.${name}.service has an unsafe shape`);
31749
31749
  if (!Array.isArray(task.command) || task.command.length < 1 || task.command.length > 32 || task.command.some((arg) => typeof arg !== "string" || arg.length < 1 || arg.length > 256 || /[\u0000\r\n]/.test(arg))) throw new Error(`org project set: tenantTasks.${name}.command must be 1-32 bounded argv strings`);
31750
31750
  if (!Array.isArray(task.stages) || task.stages.length < 1 || task.stages.length > 3 || task.stages.some((stage) => typeof stage !== "string" || !validStages.has(stage)) || new Set(task.stages).size !== task.stages.length) throw new Error(`org project set: tenantTasks.${name}.stages must be unique dev/rc/main values`);
31751
- if (task.timeoutSeconds !== void 0 && (!Number.isInteger(task.timeoutSeconds) || task.timeoutSeconds < 1 || task.timeoutSeconds > 3600)) throw new Error(`org project set: tenantTasks.${name}.timeoutSeconds must be an integer 1..3600`);
31751
+ const maxTimeout = task.secretOutput !== void 0 ? 3600 : 7200;
31752
+ if (task.timeoutSeconds !== void 0 && (!Number.isInteger(task.timeoutSeconds) || task.timeoutSeconds < 1 || task.timeoutSeconds > maxTimeout)) throw new Error(`org project set: tenantTasks.${name}.timeoutSeconds must be an integer 1..${maxTimeout}`);
31752
31753
  const artifact = task.artifact ?? "none";
31753
31754
  if (artifact !== "none" && artifact !== "required") throw new Error(`org project set: tenantTasks.${name}.artifact must be none or required`);
31754
31755
  const carriesPlaceholder = task.command.some((arg) => arg.includes("{artifact}"));
@@ -39148,7 +39149,7 @@ async function updatePrHeadFromBase(input) {
39148
39149
  }
39149
39150
  throw new Error(`GitHub accepted the update of ${input.head} from ${input.base} but the head did not move \u2014 check the PR, then rerun`);
39150
39151
  }
39151
- var PR_LAND_POLL_MS = 3e4;
39152
+ var PR_LAND_POLL_MS = 6e4;
39152
39153
  var PR_LAND_ENQUEUE_TIMEOUT_MS = 10 * 6e4;
39153
39154
  var PR_LAND_STATE_READ_RETRIES = 3;
39154
39155
  var PR_LAND_STATE_READ_DELAY_MS = 2e3;
@@ -46896,7 +46897,7 @@ function renderDeployLine(d) {
46896
46897
  else if (d.runUrl) parts.push(`run ${d.runUrl}`);
46897
46898
  if (d.deployStatus === "success") parts.push("deploy: SUCCEEDED");
46898
46899
  else if (d.deployStatus === "failure") parts.push(`deploy: FAILED (${TRAIN_DEPLOY_FAILED_NOTE})`);
46899
- else if (d.runId != null) parts.push(`deploy: UNVERIFIED \u2014 dispatched, not resolved (watch: gh run watch ${d.runId} --repo mutmutco/MMI-Hub --exit-status --interval 30)`);
46900
+ else if (d.runId != null) parts.push(`deploy: UNVERIFIED \u2014 dispatched, not resolved (watch: gh run watch ${d.runId} --repo mutmutco/MMI-Hub --exit-status --interval 60)`);
46900
46901
  else if (d.workflowRuns?.length) parts.push("deploy: UNVERIFIED \u2014 the runs above are enumerated, not resolved; watch each to conclusion before calling this release healthy (#3322)");
46901
46902
  else parts.push("deploy: UNVERIFIED \u2014 no run correlated or watched; resolve every workflow run on the release SHA before calling this release healthy (#3322)");
46902
46903
  return parts.join("; ");
@@ -47930,7 +47931,7 @@ function suiteTrainIo(root, summaryFile, memberSummaryFiles = {}, summaryFileTr,
47930
47931
  }
47931
47932
  if (!candidate) throw new Error(`workflow dispatch outcome ambiguous for "${title}"; inspect Actions before retrying`);
47932
47933
  try {
47933
- await exec("gh", ["run", "watch", String(candidate.databaseId), "--repo", "mutmutco/MMI-Hub", "--exit-status"], void 0, WATCH_TIMEOUT);
47934
+ await exec("gh", ghRunWatchArgs(candidate.databaseId, "mutmutco/MMI-Hub"), void 0, WATCH_TIMEOUT);
47934
47935
  } catch {
47935
47936
  }
47936
47937
  const verdict = JSON.parse(await gh(["run", "view", String(candidate.databaseId), "--repo", "mutmutco/MMI-Hub", "--json", "conclusion"]));
@@ -55166,7 +55167,7 @@ ${filelessTransitionGuide(target, o.stage)}`
55166
55167
  return reportWrite("org project set-deploy", res);
55167
55168
  });
55168
55169
  var projectTenantTasks = project.command("tenant-tasks").description("project-admin self-declare of tenant tasks for every stage of your own repo \u2014 new-task-only; editing an existing task stays master-only (`org project set --var tenantTasks=...`)");
55169
- projectTenantTasks.command("declare <name>").description("register a NEW tenant task \u2014 becomes runnable via `runtime tenant control \u2026 run-task` on its declared dev/rc/main stages. Body shape {service,command[],stages[],timeoutSeconds?,artifact?}; required artifact tasks must carry {artifact} in the command argv.").option("--service <name>", "service in the tenant runtime the task runs in (required unless --var carries it)").option("--command <argv...>", `task command as argv (repeatable; required unless --var carries it). An argv token that starts with "-" (python -m mod) is read as an option and the whole call fails to parse: declare such a command with --var '{"service":"<svc>","command":["python","-m","mod"],"stages":["dev"]}' instead (#7668)`).option("--stages <list>", "comma-separated dev,rc,main stages this task may run on (required unless --var carries it)").option("--timeout-seconds <n>", "optional wall-clock ceiling 1..3600").option("--artifact <none|required>", "artifact contract (default none; required tasks must contain {artifact} in argv)").option("--var <json>", "full task object {service,command[],stages[],timeoutSeconds?,artifact?} \u2014 use instead of the individual flags. A task carrying secretOutput:{path,vault:{repo,key},overwrite?} is master-only; declare that via `org project set --var tenantTasks=...`").option("--repo <owner/repo>", "target repo (defaults to the current repo)").option("--json", "machine-readable output").action(async (name, o) => {
55170
+ projectTenantTasks.command("declare <name>").description("register a NEW tenant task \u2014 becomes runnable via `runtime tenant control \u2026 run-task` on its declared dev/rc/main stages. Body shape {service,command[],stages[],timeoutSeconds?,artifact?}; required artifact tasks must carry {artifact} in the command argv.").option("--service <name>", "service in the tenant runtime the task runs in (required unless --var carries it)").option("--command <argv...>", `task command as argv (repeatable; required unless --var carries it). An argv token that starts with "-" (python -m mod) is read as an option and the whole call fails to parse: declare such a command with --var '{"service":"<svc>","command":["python","-m","mod"],"stages":["dev"]}' instead (#7668)`).option("--stages <list>", "comma-separated dev,rc,main stages this task may run on (required unless --var carries it)").option("--timeout-seconds <n>", "optional wall-clock ceiling 1..7200 (1..3600 with a secretOutput)").option("--artifact <none|required>", "artifact contract (default none; required tasks must contain {artifact} in argv)").option("--var <json>", "full task object {service,command[],stages[],timeoutSeconds?,artifact?} \u2014 use instead of the individual flags. A task carrying secretOutput:{path,vault:{repo,key},overwrite?} is master-only; declare that via `org project set --var tenantTasks=...`").option("--repo <owner/repo>", "target repo (defaults to the current repo)").option("--json", "machine-readable output").action(async (name, o) => {
55170
55171
  const cfg = await loadConfig();
55171
55172
  let target;
55172
55173
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.110",
3
+ "version": "4.5.111",
4
4
  "description": "MMI Future CLI — the org dev toolbox and shared cross-IDE engine for every registry-declared MMI coding surface.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",