@mutmutco/claude-plugin 4.5.219 → 4.5.221
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/.claude-plugin/plugin.json +1 -1
- package/cli/dist/main.cjs +19 -11
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/board/SKILL.md +2 -2
- package/skills/epic/SKILL.md +1 -1
package/cli/dist/main.cjs
CHANGED
|
@@ -27056,10 +27056,10 @@ var rollout_plan_default = {
|
|
|
27056
27056
|
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)."
|
|
27057
27057
|
},
|
|
27058
27058
|
baseline: {
|
|
27059
|
-
version: "4.5.
|
|
27060
|
-
tag: "v4.5.
|
|
27061
|
-
commit: "
|
|
27062
|
-
npm: "@mutmutco/cli@4.5.
|
|
27059
|
+
version: "4.5.221",
|
|
27060
|
+
tag: "v4.5.221",
|
|
27061
|
+
commit: "874331d0251d",
|
|
27062
|
+
npm: "@mutmutco/cli@4.5.221"
|
|
27063
27063
|
},
|
|
27064
27064
|
exitCriterion: "fleet-n-of-n",
|
|
27065
27065
|
hubOnlyShortcut: "forbidden",
|
|
@@ -27076,14 +27076,14 @@ var rollout_plan_default = {
|
|
|
27076
27076
|
repo: "mutmutco/mmi-hub",
|
|
27077
27077
|
role: "canary",
|
|
27078
27078
|
schedule: "train",
|
|
27079
|
-
v3Target: "v4.5.
|
|
27079
|
+
v3Target: "v4.5.221"
|
|
27080
27080
|
}
|
|
27081
27081
|
],
|
|
27082
27082
|
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.",
|
|
27083
27083
|
rollback: {
|
|
27084
27084
|
independent: true,
|
|
27085
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
27086
|
-
v3Target: "v4.5.
|
|
27085
|
+
mechanism: "npm dist-tag latest -> 4.5.221 and redeploy the Hub Lambda from tag v4.5.221 (874331d0251d); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
27086
|
+
v3Target: "v4.5.221 (@mutmutco/cli@4.5.221, tag commit 874331d0251d \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
27087
27087
|
}
|
|
27088
27088
|
},
|
|
27089
27089
|
{
|
|
@@ -47101,6 +47101,10 @@ async function suiteRcandRun(deps, opts) {
|
|
|
47101
47101
|
if (opts.dryRun) {
|
|
47102
47102
|
const existing = readSuiteCut(deps.recordPath);
|
|
47103
47103
|
if (existing) plan.push(`existing cut record: ${deps.recordPath} (${existingCutDescription(existing)})`);
|
|
47104
|
+
if (existing && !existing.leadReleased && (existing.pinPr || existing.leadRcTag || existing.members.some((m) => m.tag))) {
|
|
47105
|
+
const why = !heldMatches(existing.heldMembers ?? [], held) ? "suite hold changed since cut began" : existing.members.length !== active.length || active.some((m) => !existing.members.some((r) => r.repo === m.repo && r.id === m.id)) ? "suite roster changed since cut began" : "";
|
|
47106
|
+
if (why) plan.push(`the real run resumes that record and refuses (${why}); retire it first with mmi-cli devops suite abandon --owner-go`);
|
|
47107
|
+
}
|
|
47104
47108
|
plan.push(...await Promise.all(modules.map(async (m) => `${m.repo}: ${heldById.has(m.id) ? "HELD" : await dryRunStatus(deps, m)}`)));
|
|
47105
47109
|
return { plan };
|
|
47106
47110
|
}
|
|
@@ -58806,9 +58810,9 @@ function suiteTrainIo(root, summaryFile, memberSummaryFiles = {}, summaryFileTr,
|
|
|
58806
58810
|
bundleKit: async (url) => {
|
|
58807
58811
|
try {
|
|
58808
58812
|
const res = await fetch(url, { signal: AbortSignal.timeout(GH_TIMEOUT) });
|
|
58809
|
-
return res.ok ? kitFromBundle(await res.text()) :
|
|
58813
|
+
return res.ok ? kitFromBundle(await res.text()) : `unreadable (HTTP ${res.status})`;
|
|
58810
58814
|
} catch {
|
|
58811
|
-
return
|
|
58815
|
+
return "unreadable (unreachable)";
|
|
58812
58816
|
}
|
|
58813
58817
|
},
|
|
58814
58818
|
// #7738: a member hotfixes as suite-solo; the lead hotfixes under its suite-lead capability (inTrain sets it).
|
|
@@ -62380,7 +62384,11 @@ async function readRunLog(id, o, runner) {
|
|
|
62380
62384
|
const jobs = pages.flatMap((page) => page.jobs);
|
|
62381
62385
|
const selected = jobs.filter((job) => jobName === void 0 ? FAILED2.has(job.conclusion ?? "") : job.name === jobName);
|
|
62382
62386
|
const result = { runId, repo, jobs: [] };
|
|
62383
|
-
if (!selected.length) return { result, exitCode: 1, message: `read run log: no matching job for run ${runId} in ${repo}; conclusions seen: ${[...new Set(jobs.map((j) => j.conclusion ?? "pending"))].join(", ") || "none"}` };
|
|
62387
|
+
if (!selected.length && jobName === void 0) return { result, exitCode: 1, message: `read run log: no matching job for run ${runId} in ${repo}; conclusions seen: ${[...new Set(jobs.map((j) => j.conclusion ?? "pending"))].join(", ") || "none"}` };
|
|
62388
|
+
if (!selected.length) {
|
|
62389
|
+
const listed = jobs.slice(0, 30).map((j) => `${j.name} (${j.id})`).join(", ");
|
|
62390
|
+
return { result, exitCode: 1, message: `read run log: --job takes the exact job name, not its id; jobs in run ${runId}: ${listed || "none"}${jobs.length > 30 ? `, \u2026+${jobs.length - 30} more` : ""}` };
|
|
62391
|
+
}
|
|
62384
62392
|
for (const job of selected) {
|
|
62385
62393
|
const text = await readAppApi(`repos/${repo}/actions/jobs/${parseBrokerId(String(job.id), "job id")}/logs`, runner);
|
|
62386
62394
|
result.jobs.push({ id: job.id, name: job.name, conclusion: job.conclusion, failedStep: job.steps?.find((s) => s.conclusion === "failure")?.name ?? null, ...sliceRunLog(text, tail) });
|
|
@@ -66466,7 +66474,7 @@ async function runProjectDeployGet(repoOrSlug, o) {
|
|
|
66466
66474
|
const stage = o.stage?.trim();
|
|
66467
66475
|
if (stage && !["dev", "rc", "main"].includes(stage)) return fail("org project deploy get: --stage must be dev, rc, or main");
|
|
66468
66476
|
const payload = stage ? { slug: out.slug, stage, deploy: out.stages[stage] ?? null } : out;
|
|
66469
|
-
console.log(JSON.stringify(payload));
|
|
66477
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
66470
66478
|
}
|
|
66471
66479
|
var projectDeploy = project.command("deploy").description("read nonsecret DEPLOY# facts (domain, port, deploy path, substrate, host presence)").argument("[ownerRepo]", "shorthand for `get <owner/repo>`").addOption(new Option("--stage <stage>", "dev | rc | main").choices(["dev", "rc", "main"])).option("--json", "machine-readable output").action(async (ownerRepo, o) => runProjectDeployGet(ownerRepo, o));
|
|
66472
66480
|
projectDeploy.command("get [owner/repo]").description("read nonsecret DEPLOY# facts for one project; defaults to the current repo").addOption(new Option("--stage <stage>", "dev | rc | main").choices(["dev", "rc", "main"])).option("--json", "machine-readable output").action(async (repoOrSlug, o) => runProjectDeployGet(repoOrSlug, { stage: projectDeploy.opts().stage, json: o.json }));
|
package/cli/package.json
CHANGED
package/package.json
CHANGED
package/skills/board/SKILL.md
CHANGED
|
@@ -21,7 +21,7 @@ accepts an incomplete board. The CLI partitions rows into **Yours**, **Free to c
|
|
|
21
21
|
stamps (4 hours without work) hold nothing. Partition rules, stamp details and `--out` rationale:
|
|
22
22
|
[reference.md](reference.md).
|
|
23
23
|
|
|
24
|
-
**Under the App pool, never type raw `gh` for a read** (`gh issue list/view --jq`, `gh run view --jq`, `gh api -q` all bounce). Use `MMI_ACTOR=app mmi-cli devops read issue view <n> --repo <owner/repo> --json <fields>` (or `issue list`, `pr view`, `run view`); `--jq '<expr>'` on that typed read filters locally. Filter in a pipe or save output (`>`, `2>&1`, `--out`) under this worktree's `.jerv/tmp/` (`mkdir -p .jerv/tmp` first), never `../` or a sibling path: the workspace output guard refuses those.
|
|
24
|
+
**Under the App pool, never type raw `gh` for a read** (`gh issue list/view --jq`, `gh run view --jq`, `gh api -q` all bounce). Use `MMI_ACTOR=app mmi-cli devops read issue view <n> --repo <owner/repo> --json <fields>` (or `issue list`, `pr view`, `run view`); `--jq '<expr>'` on that typed read filters locally. Filter in a pipe or save output (`>`, `2>&1`, `--out`) under this worktree's `.jerv/tmp/` (`mkdir -p .jerv/tmp` first), never `../` or a sibling path: the workspace output guard refuses those. Body edits are read-then-edit: `MMI_ACTOR=app mmi-cli devops read issue view <n> --repo <owner/repo> --json body > .jerv/tmp/issue-body.json`, append or filter the JSON locally (`node -e`; the typed read's own `--jq` also filters locally), then write back with `gh issue edit <n> --repo <owner/repo> --body-file .jerv/tmp/issue-body.md` — `gh` writes pass under the pool.
|
|
25
25
|
|
|
26
26
|
## Step 2 — render it
|
|
27
27
|
|
|
@@ -62,7 +62,7 @@ Announce issue/PR counts; refresh `mmi-cli oracle board read` this session and s
|
|
|
62
62
|
|
|
63
63
|
Follow printed owner rulings; record new ones with `mmi-cli oracle issue decision`. One concurrent worktree per batch: [reference.md](reference.md).
|
|
64
64
|
|
|
65
|
-
With several task lanes in one session, pass `worktree: <the mmi-worktrees/<Repo>/<issue>-<slug> path jerv_worktree_create reported>` to `jerv_worktree_exec` / `jerv_worktree_land` every time; they refuse to guess (#5629).
|
|
65
|
+
With several task lanes in one session, pass `worktree: <the mmi-worktrees/<Repo>/<issue>-<slug> path jerv_worktree_create reported>` to `jerv_worktree_exec` / `jerv_worktree_land` every time; they refuse to guess (#5629). While any mmi-worktrees lane is registered for this repo, run focused tests/gates from the task-worktree root `jerv_worktree_create` reported — never the primary checkout; the test policy refuses it (`test-command-untrusted-worktree-cwd`).
|
|
66
66
|
|
|
67
67
|
A fresh mmi worktree has no `.jerv/`: run `mkdir -p .jerv/tmp` before writing scratch files there (PR bodies, batches) or listing it.
|
|
68
68
|
|
package/skills/epic/SKILL.md
CHANGED
|
@@ -70,7 +70,7 @@ This JSON is the placement authority: every intended child must be linked and on
|
|
|
70
70
|
mmi-cli oracle issue link-child <parent> <child>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
Each child is now a parallel item: one worktree + PR each. With several task lanes in one session, pass `worktree: <the mmi-worktrees/<Repo>/<issue>-<slug> path jerv_worktree_create reported>` to `jerv_worktree_exec` / `jerv_worktree_land` every time; they refuse to guess (#5629). On Windows set `git config core.longpaths true` on the main checkout before the first `git worktree add`. When linked worktrees share a clone, serialize `git branch -m` and other ref renames (or retry serially on `.tmp-renamed-log`). **When the last child merges, close the umbrella** (board `Done` follows).
|
|
73
|
+
Each child is now a parallel item: one worktree + PR each. With several task lanes in one session, pass `worktree: <the mmi-worktrees/<Repo>/<issue>-<slug> path jerv_worktree_create reported>` to `jerv_worktree_exec` / `jerv_worktree_land` every time; they refuse to guess (#5629). While any mmi-worktrees lane is registered for this repo, run focused tests/gates from the task-worktree root `jerv_worktree_create` reported — never the primary checkout; the test policy refuses it (`test-command-untrusted-worktree-cwd`). On Windows set `git config core.longpaths true` on the main checkout before the first `git worktree add`. When linked worktrees share a clone, serialize `git branch -m` and other ref renames (or retry serially on `.tmp-renamed-log`). **When the last child merges, close the umbrella** (board `Done` follows).
|
|
74
74
|
|
|
75
75
|
Never free-type children with raw `gh issue create`: the batch path carries validation, board attach and structured output.
|
|
76
76
|
|