@mutmutco/cli 4.5.37 → 4.5.39

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 +35 -9
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -16871,10 +16871,10 @@ var rollout_plan_default = {
16871
16871
  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)."
16872
16872
  },
16873
16873
  baseline: {
16874
- version: "4.5.37",
16875
- tag: "v4.5.37",
16876
- commit: "75086128c3ba",
16877
- npm: "@mutmutco/cli@4.5.37"
16874
+ version: "4.5.39",
16875
+ tag: "v4.5.39",
16876
+ commit: "ad6bde0e522f",
16877
+ npm: "@mutmutco/cli@4.5.39"
16878
16878
  },
16879
16879
  exitCriterion: "fleet-n-of-n",
16880
16880
  hubOnlyShortcut: "forbidden",
@@ -16891,14 +16891,14 @@ var rollout_plan_default = {
16891
16891
  repo: "mutmutco/mmi-hub",
16892
16892
  role: "canary",
16893
16893
  schedule: "train",
16894
- v3Target: "v4.5.37"
16894
+ v3Target: "v4.5.39"
16895
16895
  }
16896
16896
  ],
16897
16897
  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.",
16898
16898
  rollback: {
16899
16899
  independent: true,
16900
- mechanism: "npm dist-tag latest -> 4.5.37 and redeploy the Hub Lambda from tag v4.5.37 (75086128c3ba); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16901
- v3Target: "v4.5.37 (@mutmutco/cli@4.5.37, tag commit 75086128c3ba \u2014 last known-good release carrying the repo-index v4-only contract)"
16900
+ mechanism: "npm dist-tag latest -> 4.5.39 and redeploy the Hub Lambda from tag v4.5.39 (ad6bde0e522f); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16901
+ v3Target: "v4.5.39 (@mutmutco/cli@4.5.39, tag commit ad6bde0e522f \u2014 last known-good release carrying the repo-index v4-only contract)"
16902
16902
  }
16903
16903
  },
16904
16904
  {
@@ -19805,6 +19805,26 @@ function installerPageError(value) {
19805
19805
  if (url.search || url.hash) return "installer.page must not carry a query string or fragment";
19806
19806
  return null;
19807
19807
  }
19808
+ var INSTALLER_VERIFY_HOSTS = ["mutmut.work", "dev.mutmut.work", "rc.mutmut.work"];
19809
+ var INSTALLER_VERIFY_STAGES = ["dev", "rc", "main"];
19810
+ function installerVerifyError(value) {
19811
+ const shape = `installer.verify must be {dev?, rc?, main?} with at least one https URL on ${INSTALLER_VERIFY_HOSTS.join(", ")}`;
19812
+ if (!value || typeof value !== "object" || Array.isArray(value)) return shape;
19813
+ const entries = Object.entries(value);
19814
+ if (entries.length === 0) return shape;
19815
+ for (const [stage, url] of entries) {
19816
+ if (!INSTALLER_VERIFY_STAGES.includes(stage)) return `installer.verify.${stage} is not a stage \u2014 expected dev, rc or main`;
19817
+ let parsed;
19818
+ try {
19819
+ parsed = typeof url === "string" && url.trim() === url ? new URL(url) : null;
19820
+ } catch {
19821
+ parsed = null;
19822
+ }
19823
+ if (!parsed || parsed.protocol !== "https:" || parsed.username || parsed.password || !INSTALLER_VERIFY_HOSTS.includes(parsed.hostname)) return shape;
19824
+ if (parsed.search || parsed.hash) return `installer.verify.${stage} must not carry a query string or fragment`;
19825
+ }
19826
+ return null;
19827
+ }
19808
19828
  function installerVersionUrl(installer) {
19809
19829
  if (typeof installer.gate === "string" && installer.gate) return `${installer.gate.replace(/\/+$/, "")}/release/version`;
19810
19830
  return `https://${INSTALLER_FAMILY_HOSTS[installer.family]}/${installer.product}/release/version`;
@@ -19812,14 +19832,14 @@ function installerVersionUrl(installer) {
19812
19832
  function installerDeclarationError(value, division) {
19813
19833
  if (value === void 0 || value === null) return null;
19814
19834
  if (typeof value !== "object" || Array.isArray(value)) {
19815
- return "installer must be an object {product, family, login?, gate?}";
19835
+ return "installer must be an object {product, family, login?, gate?, page?, verify?}";
19816
19836
  }
19817
19837
  const record = (
19818
19838
  /** @type {Record<string, unknown>} */
19819
19839
  value
19820
19840
  );
19821
19841
  for (const key of Object.keys(record)) {
19822
- if (!["product", "family", "login", "gate", "page"].includes(key)) return `installer.${key} is not a field \u2014 expected product, family and optionally login, gate and page`;
19842
+ if (!["product", "family", "login", "gate", "page", "verify"].includes(key)) return `installer.${key} is not a field \u2014 expected product, family and optionally login, gate, page and verify`;
19823
19843
  }
19824
19844
  if (typeof record.product !== "string" || !PRODUCT_RE.test(record.product)) {
19825
19845
  return "installer.product must be a lowercase kebab name (e.g. mm-strategy) \u2014 it is the /<product> path on the family host";
@@ -19843,6 +19863,10 @@ function installerDeclarationError(value, division) {
19843
19863
  const pageError = installerPageError(record.page);
19844
19864
  if (pageError) return pageError;
19845
19865
  }
19866
+ if (record.verify !== void 0) {
19867
+ const verifyError = installerVerifyError(record.verify);
19868
+ if (verifyError) return verifyError;
19869
+ }
19846
19870
  const expected = expectedInstallerLogin(
19847
19871
  /** @type {'jerv' | 'mmi'} */
19848
19872
  record.family,
@@ -20350,6 +20374,7 @@ function servedChannelRow(product, conclusion, evidence) {
20350
20374
  function servedChannelFor(repo, installer) {
20351
20375
  if (!installer) return void 0;
20352
20376
  if (isHubControlRepo(repo)) return void 0;
20377
+ if (installer.verify) return void 0;
20353
20378
  return {
20354
20379
  product: installer.product,
20355
20380
  url: installerVersionUrl(installer),
@@ -20402,6 +20427,7 @@ async function appendServedChannelProof(deps, input, dispatch) {
20402
20427
  }
20403
20428
  async function appendInstallHomePublish(deps, input, dispatch) {
20404
20429
  if (isHubControlRepo(input.repo) || !input.installer || input.installer.family !== "mmi") return dispatch;
20430
+ if (input.installer.verify) return dispatch;
20405
20431
  const product = input.installer.product;
20406
20432
  const remedy = getPublishDispatchCommand(HUB_REPO2, product);
20407
20433
  const note = (text) => `${dispatch.note}; ${text}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.37",
3
+ "version": "4.5.39",
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",