@mutmutco/claude-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.
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
|
|
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
|
|
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.
|
|
18688
|
-
tag: "v4.5.
|
|
18689
|
-
commit: "
|
|
18690
|
-
npm: "@mutmutco/cli@4.5.
|
|
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.
|
|
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.
|
|
18714
|
-
v3Target: "v4.5.
|
|
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) =>
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
package/package.json
CHANGED
|
@@ -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
|