@mutmutco/codex-plugin 4.5.152 → 4.5.154

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.152",
3
+ "version": "4.5.154",
4
4
  "mmiCompat": "4.x",
5
5
  "description": "MMI workflow skills and org gates delivery.",
6
6
  "author": {
package/cli/dist/main.cjs CHANGED
@@ -7081,6 +7081,12 @@ var APP_ELIGIBLE_COMMANDS = /* @__PURE__ */ new Set([
7081
7081
  "read run watch",
7082
7082
  "read run log",
7083
7083
  // #8136: bounded jobs/logs REST read, same polling credential.
7084
+ "read pr list",
7085
+ // #8347: stored-field PR list; author/viewer-dependent filters refused.
7086
+ "read pr diff",
7087
+ // #8347: fixed PR diff read; no viewer fields.
7088
+ "read pr queue",
7089
+ // #8347: fixed mergeQueueEntry query; no generic GraphQL or viewer resolution.
7084
7090
  "read pr view",
7085
7091
  "read pr checks",
7086
7092
  "read issue view",
@@ -7157,6 +7163,27 @@ async function readAppVaultSecret(read) {
7157
7163
  }
7158
7164
  }
7159
7165
  async function mintInstallationToken(deps) {
7166
+ return mintScopedInstallationToken(deps, APP_POLL_PERMISSIONS);
7167
+ }
7168
+ async function mintStatusWriteToken(deps) {
7169
+ return mintScopedInstallationToken(deps, { metadata: "read", statuses: "write" });
7170
+ }
7171
+ var statusWriteTokenProvider;
7172
+ function setStatusWriteTokenProvider(provider) {
7173
+ statusWriteTokenProvider = provider;
7174
+ }
7175
+ async function fleetStatusWriteEnv(args) {
7176
+ if (args[0] !== "api" || args[1] !== "-X" || args[2] !== "POST" || !/^repos\/[^/]+\/[^/]+\/statuses\/[^/]+$/.test(args[3] ?? "") || !args.some((arg, i) => arg === "context=fleet-lockstep" && args[i - 1] === "-f")) return void 0;
7177
+ if (!statusWriteTokenProvider) throw new AppActorError("app actor: status-write provider not installed");
7178
+ try {
7179
+ const { token } = await statusWriteTokenProvider();
7180
+ return { ...process.env, GH_TOKEN: token };
7181
+ } catch (e) {
7182
+ if (e instanceof AppActorError && e.code === "vault-denied") return void 0;
7183
+ throw e;
7184
+ }
7185
+ }
7186
+ async function mintScopedInstallationToken(deps, permissions) {
7160
7187
  const [appId, installationId, privateKey] = await Promise.all(APP_VAULT_KEYS.map((k) => deps.fetchSecret(k)));
7161
7188
  if (!appId || !installationId || !privateKey) {
7162
7189
  const missing = APP_VAULT_KEYS.filter((_, i) => ![appId, installationId, privateKey][i]);
@@ -7183,7 +7210,7 @@ async function mintInstallationToken(deps) {
7183
7210
  "content-type": "application/json",
7184
7211
  "user-agent": "mmi-cli-app-actor"
7185
7212
  },
7186
- body: JSON.stringify({ permissions: APP_POLL_PERMISSIONS })
7213
+ body: JSON.stringify({ permissions })
7187
7214
  });
7188
7215
  } catch (e) {
7189
7216
  if (e instanceof AppActorError) throw e;
@@ -16415,6 +16442,33 @@ function defaultTrackedFirstSegments(root, firstSegments, exec3 = import_node_ch
16415
16442
  throw error;
16416
16443
  }
16417
16444
  }
16445
+ function mergeGroupRunbookMessages(root, deps, readFile10, warnings) {
16446
+ const env = deps.env ?? process.env;
16447
+ if (env.GITHUB_EVENT_NAME !== "merge_group") return "";
16448
+ let source = "merge_group event payload";
16449
+ try {
16450
+ const event = JSON.parse(readFile10(env.GITHUB_EVENT_PATH ?? "") ?? "");
16451
+ const match = /^refs\/heads\/gh-readonly-queue\/.+\/pr-([1-9]\d*)-[a-f0-9]+$/.exec(event.merge_group?.head_ref ?? "");
16452
+ const repo = env.GITHUB_REPOSITORY;
16453
+ if (!match || !repo || !/^[\w.-]+\/[\w.-]+$/.test(repo)) throw new Error("invalid queue source");
16454
+ source = `repos/${repo}/pulls/${match[1]}/commits`;
16455
+ const gh2 = deps.gh ?? ((args) => (0, import_node_child_process6.execFileSync)("gh", args, {
16456
+ cwd: root,
16457
+ encoding: "utf8",
16458
+ windowsHide: true,
16459
+ timeout: 3e4,
16460
+ maxBuffer: CHECK_IGNORE_MAX_BUFFER,
16461
+ env: { ...env, GH_TOKEN: env.GH_TOKEN || env.GITHUB_TOKEN },
16462
+ stdio: ["ignore", "pipe", "pipe"]
16463
+ }));
16464
+ const pages = JSON.parse(gh2(["api", source, "--paginate", "--slurp"]));
16465
+ if (!Array.isArray(pages) || !pages.every((page) => Array.isArray(page) && page.every((commit) => typeof commit?.commit?.message === "string"))) throw new Error("invalid commit response");
16466
+ return pages.flat().map((commit) => commit.commit.message).join("\n");
16467
+ } catch {
16468
+ warnings.push({ kind: "runbook-source-unverified", doc: source, line: 0, detail: `failed to read ${source}; using git-log Runbook-Unaffected declarations only` });
16469
+ return "";
16470
+ }
16471
+ }
16418
16472
  function runDocRefs(root, deps = {}) {
16419
16473
  const readFile10 = deps.readFile ?? readFileOrNull;
16420
16474
  const exists = deps.exists ?? import_node_fs17.existsSync;
@@ -16451,7 +16505,10 @@ function runDocRefs(root, deps = {}) {
16451
16505
  if (deps.base) {
16452
16506
  const git3 = deps.git ?? ((args) => (0, import_node_child_process6.execFileSync)("git", args, { cwd: root, encoding: "utf8", maxBuffer: CHECK_IGNORE_MAX_BUFFER, windowsHide: true }));
16453
16507
  const stale = checkRunbookCoverage(runbooks, deps.base, git3);
16454
- const override = /^Runbook-Unaffected:[ \t]*\S.*$/m.test(git3(["log", "--format=%B", `${deps.base}..HEAD`]));
16508
+ const messages = git3(["log", "--format=%B", `${deps.base}..HEAD`]);
16509
+ const sourceMessages = stale.length ? mergeGroupRunbookMessages(root, deps, readFile10, warnings) : "";
16510
+ const override = /^Runbook-Unaffected:[ \t]*\S.*$/m.test(`${messages}
16511
+ ${sourceMessages}`);
16455
16512
  (override ? warnings : findings).push(...stale);
16456
16513
  }
16457
16514
  return {
@@ -18684,10 +18741,10 @@ var rollout_plan_default = {
18684
18741
  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)."
18685
18742
  },
18686
18743
  baseline: {
18687
- version: "4.5.152",
18688
- tag: "v4.5.152",
18689
- commit: "8437cd11d3f1",
18690
- npm: "@mutmutco/cli@4.5.152"
18744
+ version: "4.5.154",
18745
+ tag: "v4.5.154",
18746
+ commit: "045e47363357",
18747
+ npm: "@mutmutco/cli@4.5.154"
18691
18748
  },
18692
18749
  exitCriterion: "fleet-n-of-n",
18693
18750
  hubOnlyShortcut: "forbidden",
@@ -18704,14 +18761,14 @@ var rollout_plan_default = {
18704
18761
  repo: "mutmutco/mmi-hub",
18705
18762
  role: "canary",
18706
18763
  schedule: "train",
18707
- v3Target: "v4.5.152"
18764
+ v3Target: "v4.5.154"
18708
18765
  }
18709
18766
  ],
18710
18767
  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.",
18711
18768
  rollback: {
18712
18769
  independent: true,
18713
- mechanism: "npm dist-tag latest -> 4.5.152 and redeploy the Hub Lambda from tag v4.5.152 (8437cd11d3f1); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
18714
- v3Target: "v4.5.152 (@mutmutco/cli@4.5.152, tag commit 8437cd11d3f1 \u2014 last known-good release carrying the repo-index v4-only contract)"
18770
+ mechanism: "npm dist-tag latest -> 4.5.154 and redeploy the Hub Lambda from tag v4.5.154 (045e47363357); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
18771
+ v3Target: "v4.5.154 (@mutmutco/cli@4.5.154, tag commit 045e47363357 \u2014 last known-good release carrying the repo-index v4-only contract)"
18715
18772
  }
18716
18773
  },
18717
18774
  {
@@ -19646,9 +19703,12 @@ async function resolveBoardProjectId(repoOption) {
19646
19703
  return void 0;
19647
19704
  }
19648
19705
  }
19649
- function queryDeps() {
19706
+ function queryDeps(readEnv) {
19650
19707
  return {
19651
- ghJson: async (args, timeoutMs = GH_LIST_TIMEOUT_MS) => JSON.parse((await execFileP("gh", args, { timeout: timeoutMs })).stdout),
19708
+ ghJson: async (args, timeoutMs = GH_LIST_TIMEOUT_MS) => {
19709
+ const env = await readEnv?.();
19710
+ return JSON.parse((await execFileP("gh", args, { timeout: timeoutMs, ...env ? { env } : {} })).stdout);
19711
+ },
19652
19712
  viewer: () => githubLogin(),
19653
19713
  resolveRepo
19654
19714
  };
@@ -20034,7 +20094,8 @@ function defaultFleetTrackInventoryDeps(consistent = false) {
20034
20094
  if (!projects) throw new Error("live Hub registry roster is unavailable \u2014 a committed inventory is never current truth, so there is no fallback; retry when the Hub API is reachable");
20035
20095
  return projects;
20036
20096
  },
20037
- query: queryDeps(),
20097
+ // #8350: gate inventory probes bypass the train runner, so supply its App read env here too.
20098
+ query: queryDeps(ghReadEnv),
20038
20099
  now: () => /* @__PURE__ */ new Date()
20039
20100
  };
20040
20101
  }
@@ -48150,7 +48211,7 @@ function trainApplyDeps() {
48150
48211
  trainWriter: (verb, cwd) => acquireTrainWriterLock(cwd, `mmi-cli devops ${verb}`),
48151
48212
  run: async (file, args) => {
48152
48213
  const timeout = file === "node" && args[1] === "prepare" ? NODE_PREPARE_TIMEOUT_MS : file === "node" && args[1] === "verify" ? NODE_VERIFY_TIMEOUT_MS : file === "npm" && (args[0] === "version" || args[0] === "ci" || args[0] === "install") ? NPM_FOLD_TIMEOUT_MS : file === "npm" ? NPM_TRAIN_TIMEOUT_MS : file === "bash" && /jerv-gateway-release-deploy\.sh$/.test(args[0] ?? "") ? JERV_GATEWAY_DEPLOY_TIMEOUT_MS : file === "git" && args[0] === "commit" ? GIT_COMMIT_TIMEOUT_MS : file !== "gh" ? GIT_TIMEOUT_MS : args[0] === "run" && args[1] === "watch" ? GH_RUN_WATCH_TIMEOUT_MS : GH_TRAIN_TIMEOUT_MS;
48153
- const readEnv = file === "gh" && isAppRoutableGhReadArgs(args) ? await ghReadEnv() : void 0;
48214
+ const readEnv = file !== "gh" ? void 0 : isAppRoutableGhReadArgs(args) ? await ghReadEnv() : await fleetStatusWriteEnv(args);
48154
48215
  try {
48155
48216
  return isWin3 && file === "npm" ? (await execFileP("cmd.exe", ["/c", "npm", ...args], { timeout })).stdout : (await execFileP(file, file === "git" ? trainGitArgs(args) : args, { timeout, ...readEnv ? { env: readEnv } : {} })).stdout;
48156
48217
  } catch (e) {
@@ -53140,6 +53201,46 @@ function parseBrokerAssignee(raw) {
53140
53201
  return v;
53141
53202
  }
53142
53203
  var SINGLE_SHOT_TIMEOUT_MS = 6e4;
53204
+ var BROKER_MAX_BUFFER = 64 * 1024 * 1024;
53205
+ var PR_QUEUE_QUERY = "query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){mergeQueueEntry{state position enqueuedAt estimatedTimeToMerge headCommit{oid}}}}}";
53206
+ function buildPrQueueSpec(number, o) {
53207
+ const repo = parseBrokerRepo(o.repo, "--repo");
53208
+ if (!repo) throw new Error("read pr queue: --repo is required");
53209
+ const [owner, name] = repo.split("/");
53210
+ return { program: "gh", args: ["api", "graphql", "-f", `query=${PR_QUEUE_QUERY}`, "-f", `owner=${owner}`, "-f", `name=${name}`, "-F", `number=${parseBrokerId(number, "PR number")}`], timeoutMs: SINGLE_SHOT_TIMEOUT_MS };
53211
+ }
53212
+ function buildPrDiffSpec(number, o) {
53213
+ const args = withRepo(["pr", "diff", parseBrokerId(number, "PR number")], parseBrokerRepo(o.repo, "--repo"));
53214
+ if (o.nameOnly) args.push("--name-only");
53215
+ return { program: "gh", args, timeoutMs: SINGLE_SHOT_TIMEOUT_MS };
53216
+ }
53217
+ function parseBrokerPrSearch(raw) {
53218
+ const search = parseBrokerSearch(raw);
53219
+ if (search && /@me/i.test(search)) throw new Error("read: --search resolves the viewer \u2014 viewer-scoped reads stay personal");
53220
+ return search;
53221
+ }
53222
+ function parseBrokerPrState(raw) {
53223
+ if (raw === void 0) return void 0;
53224
+ if (!["open", "closed", "merged", "all"].includes(raw)) throw new Error("read: --state must be one of: open, closed, merged, all");
53225
+ return raw;
53226
+ }
53227
+ function buildPrListSpec(o) {
53228
+ const args = withJson(withRepo(["pr", "list"], parseBrokerRepo(o.repo, "--repo")), parseBrokerJsonFields(o.json), o.json);
53229
+ const state = parseBrokerPrState(o.state);
53230
+ if (state) args.push("--state", state);
53231
+ for (const flag of ["base", "head"]) {
53232
+ const branch = parseBrokerBranch(o[flag]);
53233
+ if (branch) args.push(`--${flag}`, branch);
53234
+ }
53235
+ const label = parseBrokerLabel(o.label);
53236
+ if (label !== void 0) args.push("--label", label);
53237
+ const search = parseBrokerPrSearch(o.search);
53238
+ if (search !== void 0) args.push("--search", search);
53239
+ const assignee = parseBrokerAssignee(o.assignee);
53240
+ if (assignee) args.push("--assignee", assignee);
53241
+ if (o.limit !== void 0) args.push("--limit", String(parseBrokerInt(o.limit, "--limit", 1, 100)));
53242
+ return { program: "gh", args, timeoutMs: SINGLE_SHOT_TIMEOUT_MS };
53243
+ }
53143
53244
  function withRepo(args, repo) {
53144
53245
  return repo ? [...args, "--repo", repo] : args;
53145
53246
  }
@@ -53332,7 +53433,7 @@ async function dispatchRestChecksRead(deps, resolveRepo2, label, spec, json) {
53332
53433
  process.exitCode = result.exitCode;
53333
53434
  }
53334
53435
  function registerAppReadBrokerCommands(program3, resolveRepo2, overrides) {
53335
- const ghRun = overrides?.ghRunner ?? (async (args, opts) => (await execFileP("gh", args, { timeout: opts.timeoutMs, env: opts.env })).stdout);
53436
+ const ghRun = overrides?.ghRunner ?? (async (args, opts) => (await execFileP("gh", args, { timeout: opts.timeoutMs, env: opts.env, maxBuffer: BROKER_MAX_BUFFER })).stdout);
53336
53437
  const restGhApi = overrides?.restGhApi ?? ((env) => ghApiWithEnv(env));
53337
53438
  const deps = { readRequired: readRequiredCheckRows, fetchSnapshot: fetchRestPrSnapshot, fetchRows: fetchHeadCheckRows, restGhApi };
53338
53439
  const dispatchGh = (spec, label) => (async () => {
@@ -53385,7 +53486,28 @@ function registerAppReadBrokerCommands(program3, resolveRepo2, overrides) {
53385
53486
  }
53386
53487
  await dispatchGh(spec, "read run watch");
53387
53488
  });
53388
- const pr = read.command("pr").description("pull-request reads \u2014 view rides gh; checks is REST-backed (deterministic closed-custody adapter; native was EMPTY only on the historical #3035 fixture)");
53489
+ const pr = read.command("pr").description("pull-request reads \u2014 view/list/diff ride gh; queue uses fixed GraphQL; checks is REST-backed (deterministic closed-custody adapter; native was EMPTY only on the historical #3035 fixture)");
53490
+ pr.command("list").description("list viewer-free PRs (author/viewer filters stay personal)").requiredOption("--repo <owner/repo>", "target repo", repoOpt).option("--json [fields]", "native gh JSON fields", jsonOpt).addOption(new Option("--state <state>", "open|closed|merged|all").choices(["open", "closed", "merged", "all"])).option("--base <branch>", "base branch", branchOpt).option("--head <branch>", "head branch", branchOpt).option("--label <label>", "filter by label", labelOpt).option("--search <query>", "viewer-free search", (v) => parseBrokerPrSearch(v)).option("--assignee <login>", "explicit assignee (viewer refused)", assigneeOpt).option("--limit <n>", "maximum PRs (1-100)", intOpt("--limit", 1, 100)).action(async (o) => {
53491
+ await dispatchGh(buildPrListSpec(o), "read pr list");
53492
+ });
53493
+ pr.command("diff").description("read a bounded PR diff on the App pool").requiredOption("--repo <owner/repo>", "target repo", repoOpt).option("--name-only", "only changed file names").argument("<number>", "PR number", idOpt("PR number")).action(async (number, o) => {
53494
+ await dispatchGh(buildPrDiffSpec(number, o), "read pr diff");
53495
+ });
53496
+ pr.command("queue").description("read one PR mergeQueueEntry (fixed GraphQL query, no permission widening)").requiredOption("--repo <owner/repo>", "target repo", repoOpt).option("--json", "machine-readable mergeQueueEntry (null when not queued)").argument("<number>", "PR number", idOpt("PR number")).action(async (number, o) => {
53497
+ const spec = buildPrQueueSpec(number, o);
53498
+ requireBrokerApp("read pr queue");
53499
+ try {
53500
+ process.exitCode = await runBrokerGh(async (args, opts) => {
53501
+ const result = JSON.parse(await ghRun(args, opts));
53502
+ if (result.errors?.length) throw new Error(JSON.stringify(result.errors));
53503
+ const pr2 = result.data?.repository?.pullRequest;
53504
+ if (!pr2) throw new Error("PR not found or not accessible on the App pool");
53505
+ return JSON.stringify(pr2.mergeQueueEntry) + "\n";
53506
+ }, spec);
53507
+ } catch (e) {
53508
+ return fail(`read pr queue: ${e.message}`);
53509
+ }
53510
+ });
53389
53511
  pr.command("view").description("read a PR as gh JSON (comments/json; --json supports statusCheckRollup selection; formatters refused)").option("--repo <owner/repo>", "target repo (defaults to the current repo)", repoOpt).option("--json [fields]", "machine-readable output (comma-separated gh fields)", jsonOpt).option("--comments", "include PR comments").argument("<number>", "PR number", idOpt("PR number")).action(async (number, o) => {
53390
53512
  let spec;
53391
53513
  try {
@@ -53456,14 +53578,14 @@ var RUNS_QUERY_VALUE = {
53456
53578
  created: /^[0-9:TZ.<>=-]+$/,
53457
53579
  actor: /^[A-Za-z0-9_.\[\]-]+$/
53458
53580
  };
53459
- function validRunsQuery(query) {
53581
+ function validRunsQuery(query, allowed = RUNS_QUERY_VALUE) {
53460
53582
  const seen = /* @__PURE__ */ new Set();
53461
53583
  for (const pair of query.split("&")) {
53462
53584
  const eq = pair.indexOf("=");
53463
53585
  if (eq < 1) return false;
53464
53586
  const key = pair.slice(0, eq);
53465
53587
  const value = pair.slice(eq + 1);
53466
- const re = Object.prototype.hasOwnProperty.call(RUNS_QUERY_VALUE, key) ? RUNS_QUERY_VALUE[key] : void 0;
53588
+ const re = Object.prototype.hasOwnProperty.call(allowed, key) ? allowed[key] : void 0;
53467
53589
  if (!re || seen.has(key) || !re.test(value)) return false;
53468
53590
  seen.add(key);
53469
53591
  }
@@ -53475,10 +53597,12 @@ var ACTIONS_JOBS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/runs/\\d+(?:/at
53475
53597
  var ACTIONS_ARTIFACTS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/runs/\\d+/artifacts$`);
53476
53598
  var ACTIONS_ARTIFACT_ZIP_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/artifacts/\\d+/zip$`);
53477
53599
  var ACTIONS_JOB_LOGS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/jobs/\\d+/logs$`);
53600
+ var RELEASE_LIST_RE = new RegExp(`^repos/${NAME}/${NAME}/releases$`);
53601
+ var RELEASE_LIST_QUERY_VALUE = { per_page: RUNS_QUERY_VALUE.per_page, page: RUNS_QUERY_VALUE.page };
53478
53602
  var RELEASE_LATEST_RE = new RegExp(`^repos/${NAME}/${NAME}/releases/latest$`);
53479
53603
  var RELEASE_TAG_RE = new RegExp(`^repos/${NAME}/${NAME}/releases/tags/(${NAME})$`);
53480
53604
  var RELEASE_ASSET_RE = new RegExp(`^repos/${NAME}/${NAME}/releases/assets/\\d+$`);
53481
- var API_GET_ALLOWED_SHAPES = "repos/{owner}/{repo}/pulls/{n}/files, repos/{owner}/{repo}/compare/{a}...{b}, repos/{owner}/{repo}/contents/{path}[?ref=<branch>], repos/{owner}/{repo}/actions/runs[?per_page=1-100&page=<n>&status=&branch=&event=&head_sha=<40-hex>&created=<date-range>&actor=, each key at most once], repos/{owner}/{repo}/actions/runs/{id}, repos/{owner}/{repo}/actions/runs/{id}/jobs, repos/{owner}/{repo}/actions/runs/{id}/attempts/{n}/jobs, repos/{owner}/{repo}/actions/runs/{id}/artifacts, repos/{owner}/{repo}/actions/artifacts/{id}/zip (needs --out <file>), repos/{owner}/{repo}/actions/jobs/{id}/logs (needs --out <file>), repos/{owner}/{repo}/releases/latest, repos/{owner}/{repo}/releases/tags/{tag}, repos/{owner}/{repo}/releases/assets/{id} (needs --out <file>)";
53605
+ var API_GET_ALLOWED_SHAPES = "repos/{owner}/{repo}/pulls/{n}/files, repos/{owner}/{repo}/compare/{a}...{b}, repos/{owner}/{repo}/contents/{path}[?ref=<branch>], repos/{owner}/{repo}/actions/runs[?per_page=1-100&page=<n>&status=&branch=&event=&head_sha=<40-hex>&created=<date-range>&actor=, each key at most once], repos/{owner}/{repo}/actions/runs/{id}, repos/{owner}/{repo}/actions/runs/{id}/jobs, repos/{owner}/{repo}/actions/runs/{id}/attempts/{n}/jobs, repos/{owner}/{repo}/actions/runs/{id}/artifacts, repos/{owner}/{repo}/actions/artifacts/{id}/zip (needs --out <file>), repos/{owner}/{repo}/actions/jobs/{id}/logs (needs --out <file>), repos/{owner}/{repo}/releases[?per_page=1-100&page=<n>, each key at most once], repos/{owner}/{repo}/releases/latest, repos/{owner}/{repo}/releases/tags/{tag}, repos/{owner}/{repo}/releases/assets/{id} (needs --out <file>)";
53482
53606
  function parseApiGetPath(rawPath) {
53483
53607
  const path2 = rawPath.trim();
53484
53608
  const refuse = () => new Error(`api get: refusing '${rawPath}' \u2014 only these GET reads are allowed (#7219): ${API_GET_ALLOWED_SHAPES}`);
@@ -53494,6 +53618,7 @@ function parseApiGetPath(rawPath) {
53494
53618
  if (ACTIONS_ARTIFACTS_RE.test(path2)) return { kind: "actions-artifacts", path: path2, paginate: true };
53495
53619
  if (ACTIONS_ARTIFACT_ZIP_RE.test(path2)) return { kind: "actions-artifact-zip", path: path2, paginate: false };
53496
53620
  if (ACTIONS_JOB_LOGS_RE.test(path2)) return { kind: "actions-job-logs", path: path2, paginate: false };
53621
+ if (RELEASE_LIST_RE.test(base) && (q === -1 || validRunsQuery(query, RELEASE_LIST_QUERY_VALUE))) return { kind: "release-list", path: path2, paginate: false };
53497
53622
  if (RELEASE_LATEST_RE.test(path2)) return { kind: "release-latest", path: path2, paginate: false };
53498
53623
  const tag = RELEASE_TAG_RE.exec(path2)?.[1];
53499
53624
  if (tag && !tag.includes("..")) return { kind: "release-tag", path: path2, paginate: false };
@@ -56651,6 +56776,7 @@ function appActorDeps() {
56651
56776
  };
56652
56777
  }
56653
56778
  setPollTokenProvider(async () => activeAppToken() ?? pollTokenOrUndefined(appActorDeps()));
56779
+ setStatusWriteTokenProvider(() => mintStatusWriteToken(appActorDeps()));
56654
56780
  var registerPreAction = Reflect.get(program2, ["h", "ook"].join(""));
56655
56781
  registerPreAction.call(program2, "preAction", async (_thisCommand, actionCommand) => {
56656
56782
  const commandPath3 = commandPathOf(actionCommand);
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.152",
3
+ "version": "4.5.154",
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.152",
3
+ "version": "4.5.154",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -54,6 +54,7 @@ concurrency:
54
54
  permissions:
55
55
  actions: read # #8206: exact-SHA development workflow verdict
56
56
  contents: read
57
+ pull-requests: read # #8343: source commit declarations omitted by queue squashes
57
58
  # MMI-Hub#7542: the product image build below reads org private packages with the workflow's
58
59
  # own ephemeral token (NODE_AUTH_TOKEN) — the same reader the central deploy uses.
59
60
  packages: read
@@ -12,6 +12,7 @@ concurrency:
12
12
  permissions:
13
13
  actions: read # #8206: exact-SHA development workflow verdict
14
14
  contents: read
15
+ pull-requests: read # #8343: source commit declarations omitted by queue squashes
15
16
  packages: read
16
17
  jobs:
17
18
  gate: