@mutmutco/claude-plugin 4.5.150 → 4.5.151
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 +56 -19
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/bootstrap/seeds/suite-guide.template.md +1 -1
- package/skills/bootstrap/seeds/suite-module-package.template.json +1 -1
- package/skills/bootstrap/seeds/suite-files.template.json +0 -1
- package/skills/bootstrap/seeds/suite-screens.template.json +0 -170
- package/skills/bootstrap/seeds/suite-screens.template.yml +0 -63
package/cli/dist/main.cjs
CHANGED
|
@@ -17125,9 +17125,6 @@ function suiteModuleSeeds(seeds, suite, deployModel) {
|
|
|
17125
17125
|
"module/.npmrc": "suite-npmrc.template",
|
|
17126
17126
|
"module/src/module.jsx": "suite-module.template.jsx",
|
|
17127
17127
|
"module/vite.config.mjs": "suite-vite.template.mjs",
|
|
17128
|
-
"module/screens/screens.json": "suite-screens.template.json",
|
|
17129
|
-
"module/screens/files.json": "suite-files.template.json",
|
|
17130
|
-
".github/workflows/screens.yml": "suite-screens.template.yml",
|
|
17131
17128
|
"docs/Guides/mm-work-module.md": "suite-guide.template.md"
|
|
17132
17129
|
};
|
|
17133
17130
|
return [
|
|
@@ -18669,10 +18666,10 @@ var rollout_plan_default = {
|
|
|
18669
18666
|
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)."
|
|
18670
18667
|
},
|
|
18671
18668
|
baseline: {
|
|
18672
|
-
version: "4.5.
|
|
18673
|
-
tag: "v4.5.
|
|
18674
|
-
commit: "
|
|
18675
|
-
npm: "@mutmutco/cli@4.5.
|
|
18669
|
+
version: "4.5.151",
|
|
18670
|
+
tag: "v4.5.151",
|
|
18671
|
+
commit: "c80d8f0f8b26",
|
|
18672
|
+
npm: "@mutmutco/cli@4.5.151"
|
|
18676
18673
|
},
|
|
18677
18674
|
exitCriterion: "fleet-n-of-n",
|
|
18678
18675
|
hubOnlyShortcut: "forbidden",
|
|
@@ -18689,14 +18686,14 @@ var rollout_plan_default = {
|
|
|
18689
18686
|
repo: "mutmutco/mmi-hub",
|
|
18690
18687
|
role: "canary",
|
|
18691
18688
|
schedule: "train",
|
|
18692
|
-
v3Target: "v4.5.
|
|
18689
|
+
v3Target: "v4.5.151"
|
|
18693
18690
|
}
|
|
18694
18691
|
],
|
|
18695
18692
|
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.",
|
|
18696
18693
|
rollback: {
|
|
18697
18694
|
independent: true,
|
|
18698
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
18699
|
-
v3Target: "v4.5.
|
|
18695
|
+
mechanism: "npm dist-tag latest -> 4.5.151 and redeploy the Hub Lambda from tag v4.5.151 (c80d8f0f8b26); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
18696
|
+
v3Target: "v4.5.151 (@mutmutco/cli@4.5.151, tag commit c80d8f0f8b26 \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
18700
18697
|
}
|
|
18701
18698
|
},
|
|
18702
18699
|
{
|
|
@@ -35655,8 +35652,8 @@ function suiteModulePackageAccessCheck(suite, deployModel) {
|
|
|
35655
35652
|
if (suite !== "mm-work" || deployModel !== "tenant-container") return void 0;
|
|
35656
35653
|
return {
|
|
35657
35654
|
ok: true,
|
|
35658
|
-
label: "mmwork-ds
|
|
35659
|
-
detail:
|
|
35655
|
+
label: "mmwork-ds package access (manual org-admin step; unverified)",
|
|
35656
|
+
detail: "An org admin must add this repository with Read under @mutmutco/mmwork-ds \u2192 Package settings \u2192 Manage Actions access (#7984). No GitHub REST API can verify or grant this; without it the image build fails with 403 read_package."
|
|
35660
35657
|
};
|
|
35661
35658
|
}
|
|
35662
35659
|
function attachTrainDoctorVerdicts(report, trainDoctors) {
|
|
@@ -40608,6 +40605,7 @@ var TRAILER_KEY = "Test-Policy-Override";
|
|
|
40608
40605
|
var OVERRIDE_RE = /^Test-Policy-Override:\s*(.+)$/im;
|
|
40609
40606
|
var REC = "";
|
|
40610
40607
|
var FLD = "";
|
|
40608
|
+
var GH_SQUASH_COAUTHORS_RE = /\r?\n(?:[ \t]*\r?\n)+---------\r?\n(?:[ \t]*\r?\n)+(?:Co-authored-by:[ \t]+\S[^\r\n]*(?:\r?\n|$))+[ \t\r\n]*$/i;
|
|
40611
40609
|
var WAIVABLE_KINDS = [
|
|
40612
40610
|
"mandatory-zone-untested",
|
|
40613
40611
|
"unrequested-test-file",
|
|
@@ -40765,6 +40763,21 @@ function isShallowRepository(cwd) {
|
|
|
40765
40763
|
return true;
|
|
40766
40764
|
}
|
|
40767
40765
|
}
|
|
40766
|
+
function readOverrideTrailer(trailer, body, cwd) {
|
|
40767
|
+
const direct = (trailer ?? "").trim();
|
|
40768
|
+
if (direct) return direct;
|
|
40769
|
+
const raw = body ?? "";
|
|
40770
|
+
const stripped = raw.replace(GH_SQUASH_COAUTHORS_RE, "\n");
|
|
40771
|
+
if (stripped === raw) return "";
|
|
40772
|
+
const prefix = `${TRAILER_KEY.toLowerCase()}:`;
|
|
40773
|
+
return (0, import_node_child_process12.execFileSync)("git", ["interpret-trailers", "--parse", "--unfold"], {
|
|
40774
|
+
windowsHide: true,
|
|
40775
|
+
cwd,
|
|
40776
|
+
input: stripped,
|
|
40777
|
+
encoding: "utf8",
|
|
40778
|
+
maxBuffer: 32 * 1024 * 1024
|
|
40779
|
+
}).split(/\r?\n/).filter((line) => line.trim().toLowerCase().startsWith(prefix)).map((line) => line.trim().slice(prefix.length).trim()).join("\n").trim();
|
|
40780
|
+
}
|
|
40768
40781
|
function readOverride(base, cwd) {
|
|
40769
40782
|
const format = `%H${FLD}%(trailers:key=${TRAILER_KEY},valueonly,unfold)${FLD}%B${REC}`;
|
|
40770
40783
|
const refusals = [];
|
|
@@ -40773,7 +40786,7 @@ function readOverride(base, cwd) {
|
|
|
40773
40786
|
const [sha, trailer, body] = record.replace(/^\s+/, "").split(FLD);
|
|
40774
40787
|
if (!sha) continue;
|
|
40775
40788
|
if (override) break;
|
|
40776
|
-
const value = (trailer
|
|
40789
|
+
const value = readOverrideTrailer(trailer, body, cwd);
|
|
40777
40790
|
if (!value) {
|
|
40778
40791
|
const shaped = OVERRIDE_RE.exec(body ?? "");
|
|
40779
40792
|
if (shaped) refusals.push(invisibleTrailer(sha, shaped[0].trim()));
|
|
@@ -53400,27 +53413,51 @@ var COMPARE_RE = new RegExp(`^repos/${NAME}/${NAME}/compare/${FREE}\\.\\.\\.${FR
|
|
|
53400
53413
|
var CONTENTS_BASE_RE = new RegExp(`^repos/${NAME}/${NAME}/contents/${FREE}$`);
|
|
53401
53414
|
var CONTENTS_QUERY_RE = /^ref=[^&\s]+$/;
|
|
53402
53415
|
var ACTIONS_RUNS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/runs$`);
|
|
53416
|
+
var RUNS_QUERY_VALUE = {
|
|
53417
|
+
per_page: /^(?:[1-9]\d?|100)$/,
|
|
53418
|
+
page: /^[1-9]\d{0,5}$/,
|
|
53419
|
+
status: /^[A-Za-z_]+$/,
|
|
53420
|
+
branch: /^[A-Za-z0-9_.\/-]+$/,
|
|
53421
|
+
event: /^[A-Za-z_]+$/,
|
|
53422
|
+
head_sha: /^[0-9a-fA-F]{40}$/,
|
|
53423
|
+
created: /^[0-9:TZ.<>=-]+$/,
|
|
53424
|
+
actor: /^[A-Za-z0-9_.\[\]-]+$/
|
|
53425
|
+
};
|
|
53426
|
+
function validRunsQuery(query) {
|
|
53427
|
+
const seen = /* @__PURE__ */ new Set();
|
|
53428
|
+
for (const pair of query.split("&")) {
|
|
53429
|
+
const eq = pair.indexOf("=");
|
|
53430
|
+
if (eq < 1) return false;
|
|
53431
|
+
const key = pair.slice(0, eq);
|
|
53432
|
+
const value = pair.slice(eq + 1);
|
|
53433
|
+
const re = Object.prototype.hasOwnProperty.call(RUNS_QUERY_VALUE, key) ? RUNS_QUERY_VALUE[key] : void 0;
|
|
53434
|
+
if (!re || seen.has(key) || !re.test(value)) return false;
|
|
53435
|
+
seen.add(key);
|
|
53436
|
+
}
|
|
53437
|
+
return true;
|
|
53438
|
+
}
|
|
53439
|
+
var JSON_MAX_BUFFER = 64 * 1024 * 1024;
|
|
53403
53440
|
var ACTIONS_RUN_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/runs/\\d+$`);
|
|
53404
53441
|
var ACTIONS_JOBS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/runs/\\d+(?:/attempts/\\d+)?/jobs$`);
|
|
53405
53442
|
var ACTIONS_ARTIFACTS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/runs/\\d+/artifacts$`);
|
|
53406
53443
|
var ACTIONS_ARTIFACT_ZIP_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/artifacts/\\d+/zip$`);
|
|
53407
53444
|
var ACTIONS_JOB_LOGS_RE = new RegExp(`^repos/${NAME}/${NAME}/actions/jobs/\\d+/logs$`);
|
|
53408
|
-
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, 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>)";
|
|
53445
|
+
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>)";
|
|
53409
53446
|
function parseApiGetPath(rawPath) {
|
|
53410
53447
|
const path2 = rawPath.trim();
|
|
53411
53448
|
const refuse = () => new Error(`api get: refusing '${rawPath}' \u2014 only these GET reads are allowed (#7219): ${API_GET_ALLOWED_SHAPES}`);
|
|
53412
53449
|
if (/[%#\\]/.test(path2) || path2.split("?")[0].split("/").some((seg) => seg === "." || seg === ".." || seg === "")) throw refuse();
|
|
53450
|
+
const q = path2.indexOf("?");
|
|
53451
|
+
const base = q === -1 ? path2 : path2.slice(0, q);
|
|
53452
|
+
const query = q === -1 ? "" : path2.slice(q + 1);
|
|
53413
53453
|
if (PULL_FILES_RE.test(path2)) return { kind: "pull-files", path: path2, paginate: true };
|
|
53414
53454
|
if (COMPARE_RE.test(path2)) return { kind: "compare", path: path2, paginate: false };
|
|
53415
|
-
if (ACTIONS_RUNS_RE.test(
|
|
53455
|
+
if (ACTIONS_RUNS_RE.test(base) && (q === -1 || validRunsQuery(query))) return { kind: "actions-runs", path: path2, paginate: false };
|
|
53416
53456
|
if (ACTIONS_RUN_RE.test(path2)) return { kind: "actions-run", path: path2, paginate: false };
|
|
53417
53457
|
if (ACTIONS_JOBS_RE.test(path2)) return { kind: "actions-jobs", path: path2, paginate: true };
|
|
53418
53458
|
if (ACTIONS_ARTIFACTS_RE.test(path2)) return { kind: "actions-artifacts", path: path2, paginate: true };
|
|
53419
53459
|
if (ACTIONS_ARTIFACT_ZIP_RE.test(path2)) return { kind: "actions-artifact-zip", path: path2, paginate: false };
|
|
53420
53460
|
if (ACTIONS_JOB_LOGS_RE.test(path2)) return { kind: "actions-job-logs", path: path2, paginate: false };
|
|
53421
|
-
const q = path2.indexOf("?");
|
|
53422
|
-
const base = q === -1 ? path2 : path2.slice(0, q);
|
|
53423
|
-
const query = q === -1 ? "" : path2.slice(q + 1);
|
|
53424
53461
|
if (CONTENTS_BASE_RE.test(base) && (query === "" || CONTENTS_QUERY_RE.test(query))) {
|
|
53425
53462
|
return { kind: "contents", path: path2, paginate: false };
|
|
53426
53463
|
}
|
|
@@ -53439,7 +53476,7 @@ function buildApiGetArgs(path2, accept) {
|
|
|
53439
53476
|
async function runApiGet(run, path2, accept) {
|
|
53440
53477
|
return run(buildApiGetArgs(path2, accept), GIT_TIMEOUT_MS);
|
|
53441
53478
|
}
|
|
53442
|
-
var apiReadRunner = async (args, timeoutMs, env, binary) => (await execFileP("gh", args, { timeout: timeoutMs, ...binary ? { encoding: "latin1", maxBuffer: ZIP_MAX_BUFFER } : {}, ...env ? { env } : {} })).stdout;
|
|
53479
|
+
var apiReadRunner = async (args, timeoutMs, env, binary) => (await execFileP("gh", args, { timeout: timeoutMs, ...binary ? { encoding: "latin1", maxBuffer: ZIP_MAX_BUFFER } : { maxBuffer: JSON_MAX_BUFFER }, ...env ? { env } : {} })).stdout;
|
|
53443
53480
|
async function readAppApi(path2, runner = apiReadRunner) {
|
|
53444
53481
|
const req = parseApiGetPath(path2);
|
|
53445
53482
|
requireBrokerApp("read run log");
|
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -8,4 +8,4 @@ Before the first CI/deploy, an org admin must grant this repo **Read** on `@mutm
|
|
|
8
8
|
|
|
9
9
|
The server exposes `/health` and `/module.js`. Register the module's bundle URL, id, name and capabilities with MM-Work following the GUIDE. The seed deliberately exposes no authenticated product API yet.
|
|
10
10
|
|
|
11
|
-
`gate` installs and checks the backend and module.
|
|
11
|
+
`gate` installs and checks the backend and module. Product repos carry no screenshot or browser tests (owner ruling 2026-10-15, MM-Work#5388).
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "result": { "items": [{ "id": "sample", "name": "Sample brief" }] } }
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"module": {
|
|
3
|
-
"id": "{{REPO_SLUG}}",
|
|
4
|
-
"name": "{{REPO_NAME}}",
|
|
5
|
-
"glyph": "grid",
|
|
6
|
-
"tone": "blue",
|
|
7
|
-
"description": "Offline module screen check",
|
|
8
|
-
"sections": [
|
|
9
|
-
{
|
|
10
|
-
"label": "Home",
|
|
11
|
-
"path": "/"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"label": "Details",
|
|
15
|
-
"path": "/details"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"help": {
|
|
19
|
-
"home": {
|
|
20
|
-
"name": "Example home",
|
|
21
|
-
"howTos": [
|
|
22
|
-
{
|
|
23
|
-
"id": "recent",
|
|
24
|
-
"title": "See recent files",
|
|
25
|
-
"intro": "The module counts the files you opened lately in Google Drive.",
|
|
26
|
-
"steps": [
|
|
27
|
-
{
|
|
28
|
-
"title": "Connect Drive",
|
|
29
|
-
"text": "Connect your Google account in Files to see your recent files.",
|
|
30
|
-
"scene": "connect"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"title": "Come back here",
|
|
34
|
-
"text": "The overview shows how many recent files MM-Work found."
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "details",
|
|
40
|
-
"title": "Open the details page",
|
|
41
|
-
"steps": [
|
|
42
|
-
{
|
|
43
|
-
"title": "Press Open a page inside the module",
|
|
44
|
-
"text": "It is under the overview. Details is also in the section row.",
|
|
45
|
-
"scene": "screen"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"title": "Go back",
|
|
49
|
-
"text": "Press Home in the section row."
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
],
|
|
54
|
-
"faq": [
|
|
55
|
-
{
|
|
56
|
-
"id": "drive",
|
|
57
|
-
"question": "Where are my files?",
|
|
58
|
-
"answer": "Recent files come from your connected Google Drive."
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"id": "job",
|
|
62
|
-
"question": "What is the Review files job?",
|
|
63
|
-
"answer": "A job your admin can give you. The overview says whether you hold it."
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"id": "access",
|
|
67
|
-
"question": "Does this module get my Google password?",
|
|
68
|
-
"answer": "No. It asks MM-Work for your files, and MM-Work uses the access you granted it."
|
|
69
|
-
}
|
|
70
|
-
],
|
|
71
|
-
"tour": [
|
|
72
|
-
{
|
|
73
|
-
"anchor": "example-intro",
|
|
74
|
-
"title": "What this is",
|
|
75
|
-
"text": "A module's own screen, drawn with MM-Work's design system."
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"anchor": "example-overview",
|
|
79
|
-
"title": "Your overview",
|
|
80
|
-
"text": "See your workspace and recent Drive files here."
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"anchor": "example-actions",
|
|
84
|
-
"title": "Where to go next",
|
|
85
|
-
"text": "Open the details page, or go to Files."
|
|
86
|
-
}
|
|
87
|
-
]
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
"privacy": [
|
|
91
|
-
{
|
|
92
|
-
"class": "company-visible",
|
|
93
|
-
"what": {
|
|
94
|
-
"en": "The example reads recent Google Drive file metadata through MM-Work after the person connects Files.",
|
|
95
|
-
"tr": "Örnek modül, kişi Files bağlantısını kurduktan sonra MM-Work üzerinden son Google Drive dosyalarının meta verilerini okur."
|
|
96
|
-
},
|
|
97
|
-
"who": {
|
|
98
|
-
"en": "The signed-in person sees the count on this example screen; no file content is saved by the example.",
|
|
99
|
-
"tr": "Oturum açmış kişi örnek ekranda sayıyı görür; örnek modül dosya içeriğini kaydetmez."
|
|
100
|
-
},
|
|
101
|
-
"evidence": [
|
|
102
|
-
"repo:MM-Work:examples/example-module/src/module.jsx"
|
|
103
|
-
]
|
|
104
|
-
}
|
|
105
|
-
]
|
|
106
|
-
},
|
|
107
|
-
"screens": [
|
|
108
|
-
{
|
|
109
|
-
"name": "home",
|
|
110
|
-
"path": "/m/example",
|
|
111
|
-
"jobs": [
|
|
112
|
-
"files.review"
|
|
113
|
-
],
|
|
114
|
-
"routes": {
|
|
115
|
-
"POST /api/actions/files.list": "files.json"
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
"name": "open details journey",
|
|
120
|
-
"path": "/m/example",
|
|
121
|
-
"steps": [
|
|
122
|
-
{
|
|
123
|
-
"assert": {
|
|
124
|
-
"selector": "[data-tour=example-actions] button",
|
|
125
|
-
"count": 2
|
|
126
|
-
}
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"click": "[data-tour=example-actions] button:first-child"
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
"assert": {
|
|
133
|
-
"url": "/m/example/details"
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
],
|
|
137
|
-
"routes": {
|
|
138
|
-
"POST /api/actions/files.list": "files.json"
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
"name": "details",
|
|
143
|
-
"path": "/m/example/details",
|
|
144
|
-
"routes": {
|
|
145
|
-
"POST /api/actions/files.list": "files.json"
|
|
146
|
-
}
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
"name": "loading",
|
|
150
|
-
"path": "/m/example",
|
|
151
|
-
"query": "state=loading",
|
|
152
|
-
"routes": {
|
|
153
|
-
"POST /api/actions/files.list": "pending"
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
"name": "error",
|
|
158
|
-
"path": "/m/example",
|
|
159
|
-
"query": "state=error",
|
|
160
|
-
"routes": {
|
|
161
|
-
"POST /api/actions/files.list": {
|
|
162
|
-
"status": 500,
|
|
163
|
-
"body": {
|
|
164
|
-
"error": "offline failure"
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
]
|
|
170
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
name: screens
|
|
2
|
-
# A required check (#250): it runs wherever gate runs, so no PR into development, rc or main and no train tag
|
|
3
|
-
# waits on a context that never reports.
|
|
4
|
-
on:
|
|
5
|
-
pull_request:
|
|
6
|
-
merge_group:
|
|
7
|
-
types: [checks_requested]
|
|
8
|
-
push:
|
|
9
|
-
branches: {{GATE_PUSH_BRANCHES_YAML}}
|
|
10
|
-
tags: ['v*']
|
|
11
|
-
# Cancel superseded runs per PR, or per branch for pushes (MMI-Hub#7515, #3001; as MM-Strategy#415).
|
|
12
|
-
concurrency:
|
|
13
|
-
group: screens-${{ github.event.pull_request.number || (github.event_name == 'push' && github.sha) || github.ref }}
|
|
14
|
-
cancel-in-progress: true
|
|
15
|
-
permissions:
|
|
16
|
-
contents: read
|
|
17
|
-
packages: read
|
|
18
|
-
pull-requests: read
|
|
19
|
-
jobs:
|
|
20
|
-
# Owner ruling (#474, 6 Oct 2026): browser checks block nothing, releases included. Every PR, push and tag
|
|
21
|
-
# reports this required context without a browser audit (run: false); screens-sweep.yml audits nightly and
|
|
22
|
-
# on demand (issue-on-red). A development push still reports
|
|
23
|
-
# the required "screens / screens" on the SHA, which the dev deploy needs (MMI-Hub dev-auto-deploy).
|
|
24
|
-
changes:
|
|
25
|
-
runs-on: [self-hosted, linux, x64, mmi-live]
|
|
26
|
-
outputs:
|
|
27
|
-
run: ${{ steps.pick.outputs.run }}
|
|
28
|
-
full: ${{ steps.pick.outputs.full }}
|
|
29
|
-
steps:
|
|
30
|
-
- id: pick
|
|
31
|
-
env:
|
|
32
|
-
GH_TOKEN: ${{ github.token }}
|
|
33
|
-
EVENT: ${{ github.event_name }}
|
|
34
|
-
BASE: ${{ github.base_ref }}
|
|
35
|
-
REF: ${{ github.ref_name }}
|
|
36
|
-
REF_TYPE: ${{ github.ref_type }}
|
|
37
|
-
PR: ${{ github.event.pull_request.number }}
|
|
38
|
-
REPO: ${{ github.repository }}
|
|
39
|
-
run: |
|
|
40
|
-
set -euo pipefail
|
|
41
|
-
# #474: no browser audit on any PR, push or tag; screens-sweep.yml runs it nightly.
|
|
42
|
-
run=false; full=false
|
|
43
|
-
echo "run=$run full=$full"
|
|
44
|
-
{ echo "run=$run"; echo "full=$full"; } >> "$GITHUB_OUTPUT"
|
|
45
|
-
screens:
|
|
46
|
-
needs: changes
|
|
47
|
-
# Fail closed (MMI-Hub, 6 Oct): a SKIPPED required check counts as passing, so this job runs even when
|
|
48
|
-
# `changes` failed, and a missing answer means the full audit, never a skip.
|
|
49
|
-
if: ${{ !cancelled() }}
|
|
50
|
-
uses: mutmutco/MM-Work/.github/workflows/module-screens.yml@development
|
|
51
|
-
with:
|
|
52
|
-
run: ${{ needs.changes.outputs.run != 'false' }}
|
|
53
|
-
audit-sizes: ${{ needs.changes.outputs.full != 'false' && '["phone","768","1024","1280"]' || '["phone"]' }}
|
|
54
|
-
# Pinned to the shell built from the kit this module ships (ds-v0.71.42): the runner MM-Work
|
|
55
|
-
# published with that kit; bump with the kit.
|
|
56
|
-
# 0.1.55+ checks MM-Work #1575: selectedStyle, pageBackground, noJump (#418).
|
|
57
|
-
screens-version: '0.1.113'
|
|
58
|
-
working-directory: 'module'
|
|
59
|
-
build-command: 'npm run build'
|
|
60
|
-
bundle-path: 'dist/module.js'
|
|
61
|
-
fixtures-path: 'screens/screens.json'
|
|
62
|
-
# Every screen in English and Turkish (#369): Turkish words run longer, so they get their own audit.
|
|
63
|
-
languages: 'en,tr'
|