@mutmutco/codex-plugin 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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mmi",
3
- "version": "4.5.172",
3
+ "version": "4.5.174",
4
4
  "mmiCompat": "4.x",
5
5
  "description": "MMI workflow skills and org gates delivery.",
6
6
  "author": {
package/cli/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
- for (const bucket of ["userOwned", "claimable", "unownedInFlight", "taken"]) {
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 = await readComments(item).catch(() => void 0);
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.172",
19097
- tag: "v4.5.172",
19098
- commit: "d776fa5eb182",
19099
- npm: "@mutmutco/cli@4.5.172"
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.172"
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.172 and redeploy the Hub Lambda from tag v4.5.172 (d776fa5eb182); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
19123
- v3Target: "v4.5.172 (@mutmutco/cli@4.5.172, tag commit d776fa5eb182 \u2014 last known-good release carrying the repo-index v4-only contract)"
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/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.172",
3
+ "version": "4.5.174",
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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/codex-plugin",
3
- "version": "4.5.172",
3
+ "version": "4.5.174",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",