@mutmutco/cli 4.5.172 → 4.5.174
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 +44 -11
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -14725,12 +14725,23 @@ async function markStaleClaimStamps(scope, readComments, options = {}) {
|
|
|
14725
14725
|
const actor = options.actor ?? describeSessionIdentity();
|
|
14726
14726
|
const now = options.now ?? Date.now();
|
|
14727
14727
|
const promoted = [];
|
|
14728
|
-
|
|
14728
|
+
const buckets = ["userOwned", "claimable", "unownedInFlight", "taken"];
|
|
14729
|
+
const issues = buckets.flatMap((bucket) => scope[bucket]).filter((item) => item.contentType === "Issue");
|
|
14730
|
+
const read = /* @__PURE__ */ new Map();
|
|
14731
|
+
let next = 0;
|
|
14732
|
+
const worker = async () => {
|
|
14733
|
+
while (next < issues.length) {
|
|
14734
|
+
const item = issues[next++];
|
|
14735
|
+
read.set(item, await readComments(item).catch(() => void 0));
|
|
14736
|
+
}
|
|
14737
|
+
};
|
|
14738
|
+
await Promise.all(Array.from({ length: Math.min(WRITE_PROBE_CONCURRENCY, issues.length) }, () => worker()));
|
|
14739
|
+
for (const bucket of buckets) {
|
|
14729
14740
|
const kept = [];
|
|
14730
14741
|
for (const item of scope[bucket]) {
|
|
14731
14742
|
kept.push(item);
|
|
14732
14743
|
if (item.contentType !== "Issue") continue;
|
|
14733
|
-
const comments =
|
|
14744
|
+
const comments = read.get(item);
|
|
14734
14745
|
const marker = comments ? latestClaimMarker(comments) : void 0;
|
|
14735
14746
|
if (!marker) continue;
|
|
14736
14747
|
const prs = (options.pullRequests ?? []).filter((pr) => pr.closesIssues.some((ref) => ref.toLowerCase() === item.ref.toLowerCase()));
|
|
@@ -19093,10 +19104,10 @@ var rollout_plan_default = {
|
|
|
19093
19104
|
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)."
|
|
19094
19105
|
},
|
|
19095
19106
|
baseline: {
|
|
19096
|
-
version: "4.5.
|
|
19097
|
-
tag: "v4.5.
|
|
19098
|
-
commit: "
|
|
19099
|
-
npm: "@mutmutco/cli@4.5.
|
|
19107
|
+
version: "4.5.174",
|
|
19108
|
+
tag: "v4.5.174",
|
|
19109
|
+
commit: "2db083c19203",
|
|
19110
|
+
npm: "@mutmutco/cli@4.5.174"
|
|
19100
19111
|
},
|
|
19101
19112
|
exitCriterion: "fleet-n-of-n",
|
|
19102
19113
|
hubOnlyShortcut: "forbidden",
|
|
@@ -19113,14 +19124,14 @@ var rollout_plan_default = {
|
|
|
19113
19124
|
repo: "mutmutco/mmi-hub",
|
|
19114
19125
|
role: "canary",
|
|
19115
19126
|
schedule: "train",
|
|
19116
|
-
v3Target: "v4.5.
|
|
19127
|
+
v3Target: "v4.5.174"
|
|
19117
19128
|
}
|
|
19118
19129
|
],
|
|
19119
19130
|
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.",
|
|
19120
19131
|
rollback: {
|
|
19121
19132
|
independent: true,
|
|
19122
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
19123
|
-
v3Target: "v4.5.
|
|
19133
|
+
mechanism: "npm dist-tag latest -> 4.5.174 and redeploy the Hub Lambda from tag v4.5.174 (2db083c19203); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
19134
|
+
v3Target: "v4.5.174 (@mutmutco/cli@4.5.174, tag commit 2db083c19203 \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
19124
19135
|
}
|
|
19125
19136
|
},
|
|
19126
19137
|
{
|
|
@@ -33199,7 +33210,7 @@ init_hub_auth();
|
|
|
33199
33210
|
init_github_client();
|
|
33200
33211
|
|
|
33201
33212
|
// src/project-set.ts
|
|
33202
|
-
var UNSET_KEYS = ["projectAdmins", "installer", "oauth", "requiredRuntimeSecrets", "requiredBuildSecrets", "tenantTasks", "secrets", "edgeDomains", "requiredGcpApis", "publishRequired", "publishDir", "releaseChannel", "releaseLanguage", "ci", "requiredChecks", "requiredCheckBranches", "ciExemptReason", "gate", "seedCanary", "notifyOnDeploy", "vercelVersionEnv", "stageAllowlist", "suiteHold", "internalPeers"];
|
|
33213
|
+
var UNSET_KEYS = ["projectAdmins", "installer", "oauth", "requiredRuntimeSecrets", "requiredBuildSecrets", "tenantTasks", "secrets", "edgeDomains", "requiredGcpApis", "publishRequired", "publishDir", "releaseChannel", "releaseLanguage", "ci", "requiredChecks", "requiredCheckBranches", "ciExemptReason", "gate", "seedCanary", "notifyOnDeploy", "vercelVersionEnv", "stageAllowlist", "suiteHold", "internalPeers", "previews"];
|
|
33203
33214
|
var UNSET_KEY_SET = new Set(UNSET_KEYS);
|
|
33204
33215
|
var RUNTIME_SECRET_STAGES = ["dev", "rc", "main"];
|
|
33205
33216
|
var SECRET_CONSUMERS = ["runtime", "build", "lambda", "actions", "agent", "box"];
|
|
@@ -33589,6 +33600,24 @@ function parseStageAllowlistVar(raw) {
|
|
|
33589
33600
|
}
|
|
33590
33601
|
return { key: row.key, stages: row.stages };
|
|
33591
33602
|
}
|
|
33603
|
+
function parsePreviewsVar(raw) {
|
|
33604
|
+
let parsed;
|
|
33605
|
+
try {
|
|
33606
|
+
parsed = JSON.parse(raw);
|
|
33607
|
+
} catch {
|
|
33608
|
+
throw new Error('org project set: previews must be JSON, e.g. {"seed":"deploy/preview-seed.sh"}');
|
|
33609
|
+
}
|
|
33610
|
+
const shape = "org project set: previews must be { seed, secrets? } \u2014 seed a repo-relative script path (no leading / or ..) and secrets a non-empty array (max 40) of env key names";
|
|
33611
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error(shape);
|
|
33612
|
+
const row = parsed;
|
|
33613
|
+
const unknown = Object.keys(row).filter((key) => key !== "seed" && key !== "secrets");
|
|
33614
|
+
if (unknown.length > 0) throw new Error(`org project set: previews has unknown field(s): ${unknown.join(", ")}`);
|
|
33615
|
+
const { seed, secrets } = row;
|
|
33616
|
+
if (typeof seed !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._/-]{0,199}$/.test(seed) || seed.includes("..")) throw new Error(shape);
|
|
33617
|
+
if (secrets === void 0) return { seed };
|
|
33618
|
+
if (!Array.isArray(secrets) || secrets.length === 0 || secrets.length > 40 || !secrets.every((k) => typeof k === "string" && /^[A-Z_][A-Z0-9_]*$/.test(k))) throw new Error(shape);
|
|
33619
|
+
return { seed, secrets };
|
|
33620
|
+
}
|
|
33592
33621
|
function parseCiExemptReasonVar(raw) {
|
|
33593
33622
|
const trimmed = raw.trim();
|
|
33594
33623
|
if (!trimmed) throw new Error("org project set: ciExemptReason must be a non-empty reason (or use --unset ciExemptReason to clear it)");
|
|
@@ -33743,7 +33772,8 @@ var SETTABLE_VAR_KEYS = [
|
|
|
33743
33772
|
"installer",
|
|
33744
33773
|
"notifyOnDeploy",
|
|
33745
33774
|
"vercelVersionEnv",
|
|
33746
|
-
"stageAllowlist"
|
|
33775
|
+
"stageAllowlist",
|
|
33776
|
+
"previews"
|
|
33747
33777
|
];
|
|
33748
33778
|
var SETTABLE_VAR_KEY_SET = new Set(SETTABLE_VAR_KEYS);
|
|
33749
33779
|
var SETTABLE_VAR_HINTS = {
|
|
@@ -33775,6 +33805,7 @@ var SETTABLE_VAR_HINTS = {
|
|
|
33775
33805
|
notifyOnDeploy: 'JSON stage array, e.g. ["dev"] \u2014 successful tenant-deploy sends <stage>-deployed to the project repo (#7358)',
|
|
33776
33806
|
vercelVersionEnv: "JSON {project,key,team?} \u2014 train sets this Vercel env to the release tag before the main/rc push (#7362)",
|
|
33777
33807
|
stageAllowlist: "JSON {key,stages[]} \u2014 `org access sync` writes the developer/admin company-email allowlist to <stage>/<key> for each listed stage (#7678)",
|
|
33808
|
+
previews: "JSON {seed,secrets?} \u2014 per-PR preview contract; absent means previews off; clear with --unset previews (#8405)",
|
|
33778
33809
|
ciExemptReason: "non-empty string \u2014 declares this deployable repo has no CI surface (#4265)",
|
|
33779
33810
|
gate: "JSON {runtime,cmd,affectedCmd,workdir,cacheDepPath,pyVersion}"
|
|
33780
33811
|
};
|
|
@@ -33970,6 +34001,8 @@ function buildProjectSetPatch(input) {
|
|
|
33970
34001
|
patch[key] = parseVercelVersionEnvVar(raw);
|
|
33971
34002
|
} else if (key === "stageAllowlist") {
|
|
33972
34003
|
patch[key] = parseStageAllowlistVar(raw);
|
|
34004
|
+
} else if (key === "previews") {
|
|
34005
|
+
patch[key] = parsePreviewsVar(raw);
|
|
33973
34006
|
} else if (key === "ciExemptReason") {
|
|
33974
34007
|
patch[key] = parseCiExemptReasonVar(raw);
|
|
33975
34008
|
} else if (key === "gate") {
|
package/package.json
CHANGED