@mutmutco/cli 4.5.37 → 4.5.38
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/dist/main.cjs +33 -9
- 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.
|
|
16875
|
-
tag: "v4.5.
|
|
16876
|
-
commit: "
|
|
16877
|
-
npm: "@mutmutco/cli@4.5.
|
|
16874
|
+
version: "4.5.38",
|
|
16875
|
+
tag: "v4.5.38",
|
|
16876
|
+
commit: "94bd7909821f",
|
|
16877
|
+
npm: "@mutmutco/cli@4.5.38"
|
|
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.
|
|
16894
|
+
v3Target: "v4.5.38"
|
|
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.
|
|
16901
|
-
v3Target: "v4.5.
|
|
16900
|
+
mechanism: "npm dist-tag latest -> 4.5.38 and redeploy the Hub Lambda from tag v4.5.38 (94bd7909821f); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
16901
|
+
v3Target: "v4.5.38 (@mutmutco/cli@4.5.38, tag commit 94bd7909821f \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
|
|
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,
|
package/package.json
CHANGED