@mutmutco/codex-plugin 4.5.201 → 4.5.202
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/.codex-plugin/plugin.json +1 -1
- package/cli/dist/main.cjs +53 -17
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/bootstrap/seeds/suite-guide.template.md +8 -0
- package/skills/rcand/suite.md +2 -0
- package/skills/release/SKILL.md +1 -1
- package/skills/release/suite.md +2 -0
package/cli/dist/main.cjs
CHANGED
|
@@ -1595,7 +1595,6 @@ __export(index_exports, {
|
|
|
1595
1595
|
argvWantsJson: () => argvWantsJson3,
|
|
1596
1596
|
awsCallerArn: () => awsCallerArn,
|
|
1597
1597
|
ciAuditDeps: () => ciAuditDeps2,
|
|
1598
|
-
classifyParseError: () => classifyParseError,
|
|
1599
1598
|
commandOwnLongFlags: () => commandOwnLongFlags,
|
|
1600
1599
|
envHealLockPath: () => envHealLockPath,
|
|
1601
1600
|
isOrgRegisteredRepo: () => isOrgRegisteredRepo,
|
|
@@ -6299,6 +6298,31 @@ function excessArgumentMessage(extra, corrected) {
|
|
|
6299
6298
|
const head = `unexpected positional argument ${list} \u2014 this command does not take it`;
|
|
6300
6299
|
return corrected ? `${head}. Did you mean \`${corrected}\`?` : head;
|
|
6301
6300
|
}
|
|
6301
|
+
function boardClaimStatusFlagRecovery(flag, canonicalPath, argv) {
|
|
6302
|
+
if (canonicalPath !== "oracle board claim") return void 0;
|
|
6303
|
+
if (flag !== "--status" && !flag.startsWith("--status=")) return void 0;
|
|
6304
|
+
const kept = [];
|
|
6305
|
+
for (let i = 0; i < argv.length; i++) {
|
|
6306
|
+
const tok = argv[i];
|
|
6307
|
+
if (tok.startsWith("--status=")) continue;
|
|
6308
|
+
if (tok === "--status") {
|
|
6309
|
+
if (i + 1 < argv.length && !argv[i + 1].startsWith("-")) i++;
|
|
6310
|
+
continue;
|
|
6311
|
+
}
|
|
6312
|
+
kept.push(tok);
|
|
6313
|
+
}
|
|
6314
|
+
return {
|
|
6315
|
+
message: "unknown option '--status' \u2014 `oracle board claim` automatically sets status to In Progress; retry without --status and its value",
|
|
6316
|
+
corrected: `mmi-cli ${kept.join(" ")}`
|
|
6317
|
+
};
|
|
6318
|
+
}
|
|
6319
|
+
function classifyParseError(plain) {
|
|
6320
|
+
if (/unknown command/i.test(plain)) return "unknown-command";
|
|
6321
|
+
if (/unknown option|missing required argument|too many arguments|argument missing|is invalid\. Allowed choices are|cannot be used with/i.test(plain)) {
|
|
6322
|
+
return "bad-arguments";
|
|
6323
|
+
}
|
|
6324
|
+
return "other";
|
|
6325
|
+
}
|
|
6302
6326
|
|
|
6303
6327
|
// src/released-version-cache.ts
|
|
6304
6328
|
var import_node_fs10 = require("node:fs");
|
|
@@ -19279,10 +19303,10 @@ var rollout_plan_default = {
|
|
|
19279
19303
|
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)."
|
|
19280
19304
|
},
|
|
19281
19305
|
baseline: {
|
|
19282
|
-
version: "4.5.
|
|
19283
|
-
tag: "v4.5.
|
|
19284
|
-
commit: "
|
|
19285
|
-
npm: "@mutmutco/cli@4.5.
|
|
19306
|
+
version: "4.5.202",
|
|
19307
|
+
tag: "v4.5.202",
|
|
19308
|
+
commit: "e1fe495d9b63",
|
|
19309
|
+
npm: "@mutmutco/cli@4.5.202"
|
|
19286
19310
|
},
|
|
19287
19311
|
exitCriterion: "fleet-n-of-n",
|
|
19288
19312
|
hubOnlyShortcut: "forbidden",
|
|
@@ -19299,14 +19323,14 @@ var rollout_plan_default = {
|
|
|
19299
19323
|
repo: "mutmutco/mmi-hub",
|
|
19300
19324
|
role: "canary",
|
|
19301
19325
|
schedule: "train",
|
|
19302
|
-
v3Target: "v4.5.
|
|
19326
|
+
v3Target: "v4.5.202"
|
|
19303
19327
|
}
|
|
19304
19328
|
],
|
|
19305
19329
|
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.",
|
|
19306
19330
|
rollback: {
|
|
19307
19331
|
independent: true,
|
|
19308
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
19309
|
-
v3Target: "v4.5.
|
|
19332
|
+
mechanism: "npm dist-tag latest -> 4.5.202 and redeploy the Hub Lambda from tag v4.5.202 (e1fe495d9b63); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
19333
|
+
v3Target: "v4.5.202 (@mutmutco/cli@4.5.202, tag commit e1fe495d9b63 \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
19310
19334
|
}
|
|
19311
19335
|
},
|
|
19312
19336
|
{
|
|
@@ -57958,13 +57982,7 @@ var DISCOVERY_HINT = "run `mmi-cli commands` for the agentic-coding map, `mmi-cl
|
|
|
57958
57982
|
var STALE_HINT = `(${DISCOVERY_HINT}). If you expected this command to exist, your installed tooling may be stale \u2014 run \`mmi-hub update\`, then retry`;
|
|
57959
57983
|
var lastParseErrorKind = "other";
|
|
57960
57984
|
var lastUnknownCommand;
|
|
57961
|
-
|
|
57962
|
-
if (/unknown command/i.test(plain)) return "unknown-command";
|
|
57963
|
-
if (/unknown option|missing required argument|too many arguments|argument missing|is invalid\. Allowed choices are/i.test(plain)) {
|
|
57964
|
-
return "bad-arguments";
|
|
57965
|
-
}
|
|
57966
|
-
return "other";
|
|
57967
|
-
}
|
|
57985
|
+
var lastParseErrorConflict = false;
|
|
57968
57986
|
function parseInvalidChoiceError(plain) {
|
|
57969
57987
|
const m = /option '([^']+)' argument '([^']*)' is invalid\. Allowed choices are ([^.]+)\./.exec(plain);
|
|
57970
57988
|
if (!m) return void 0;
|
|
@@ -58045,7 +58063,7 @@ function resolveParseHint() {
|
|
|
58045
58063
|
const path2 = canonicalPathFor(commandPath3(cmd));
|
|
58046
58064
|
return [
|
|
58047
58065
|
`Usage: mmi-cli ${path2} ${cmd.usage()}`,
|
|
58048
|
-
"This command exists and your mmi-cli is not the problem \u2014 the ARGUMENTS did not parse.",
|
|
58066
|
+
lastParseErrorConflict ? "This command exists and your mmi-cli is not the problem \u2014 two of the options conflict. Choose one of them and retry." : "This command exists and your mmi-cli is not the problem \u2014 the ARGUMENTS did not parse.",
|
|
58049
58067
|
`Run \`mmi-cli ${path2} --help\` for its signature, \`mmi-cli explain ${path2} --json\` for exact detail, or \`mmi-cli commands\` for the task map.`
|
|
58050
58068
|
].join("\n");
|
|
58051
58069
|
}
|
|
@@ -58101,6 +58119,7 @@ function envelopeAwareWriteErr(str2) {
|
|
|
58101
58119
|
return;
|
|
58102
58120
|
}
|
|
58103
58121
|
lastParseErrorKind = classifyParseError(plain);
|
|
58122
|
+
lastParseErrorConflict = /cannot be used with/i.test(plain);
|
|
58104
58123
|
lastUnknownCommand = /unknown command '?([\w:-]+)'?/.exec(plain)?.[1];
|
|
58105
58124
|
const badChoice = parseInvalidChoiceError(plain);
|
|
58106
58125
|
if (badChoice) {
|
|
@@ -58141,6 +58160,24 @@ function envelopeAwareWriteErr(str2) {
|
|
|
58141
58160
|
const flag = match[1];
|
|
58142
58161
|
const argv = process.argv.slice(2);
|
|
58143
58162
|
const invoked = resolveCommandFromArgv(program2, argv);
|
|
58163
|
+
const claimStatus = invoked ? boardClaimStatusFlagRecovery(flag, canonicalPathFor(commandPath3(invoked)) ?? commandPath3(invoked), canonicalArgvFor(argv)) : void 0;
|
|
58164
|
+
if (claimStatus) {
|
|
58165
|
+
if (argvWantsJson3()) {
|
|
58166
|
+
process.stderr.write(
|
|
58167
|
+
formatErrorEnvelope(claimStatus.message, {
|
|
58168
|
+
code: ERROR_CODES.ERR_UNKNOWN_FLAG,
|
|
58169
|
+
offending_flag: "--status",
|
|
58170
|
+
corrected_command: claimStatus.corrected
|
|
58171
|
+
}) + "\n"
|
|
58172
|
+
);
|
|
58173
|
+
unknownFlagJsonHandled = true;
|
|
58174
|
+
return;
|
|
58175
|
+
}
|
|
58176
|
+
writeHumanParseError(
|
|
58177
|
+
str2.replace(/unknown option '[^']+'/, `${claimStatus.message}: run \`${claimStatus.corrected}\``)
|
|
58178
|
+
);
|
|
58179
|
+
return;
|
|
58180
|
+
}
|
|
58144
58181
|
const positional = TARGET_SELECTOR_FLAGS.has(flag) ? positionalTargetForm(invoked, { flag, argv }) : void 0;
|
|
58145
58182
|
if (argvWantsJson3()) {
|
|
58146
58183
|
const ownFlags = commandOwnLongFlags(invoked);
|
|
@@ -59367,7 +59404,6 @@ program2.parseAsync(process.argv).then(() => finishCliRun()).catch((e) => failGr
|
|
|
59367
59404
|
argvWantsJson,
|
|
59368
59405
|
awsCallerArn,
|
|
59369
59406
|
ciAuditDeps,
|
|
59370
|
-
classifyParseError,
|
|
59371
59407
|
commandOwnLongFlags,
|
|
59372
59408
|
envHealLockPath,
|
|
59373
59409
|
isOrgRegisteredRepo,
|
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -10,6 +10,14 @@ The server exposes `/health` and `/module.js`. Register the module's bundle URL,
|
|
|
10
10
|
|
|
11
11
|
`gate` installs and checks the backend and module, including `mmwork-check-ui` from `@mutmutco/mmwork-ds`. Gates run fast deterministic checks only (owner rulings 2026-10-15, MM-Work#5388, and 2026-10-25, MM-Work#7629).
|
|
12
12
|
|
|
13
|
+
## How the design pipeline reaches this module (owner, 2026-10-25; MM-Work#7651 / MM-Work#7654 / Hub#8827)
|
|
14
|
+
|
|
15
|
+
1. **Single source of truth:** the source folder of `packages/mmwork-ds` in `mutmutco/MM-Work`, owned by the MM-Work Design Lead (tokens, layers, component bundle, component docs, `DESIGN.md` and its `design.json` sidecar). Never edit the kit or its copies here; a missing piece or variant is built there first, or requested via kit MCP `request_piece`.
|
|
16
|
+
2. **MM Artifact on Live Docs:** Live Docs (`Canlı belgeler / MM-Work`) displays document `3a5c79df-5274-40ad-a1b5-a75e67a74dac` (ATOMIC, module `mm-work-kit`), an MM Artifact in the `design-system` format rebuilt from the kit source on every kit release: Overview, Guide (kit README + `DESIGN.md`), Tokens, Atoms, Molecules, Organisms, Templates and Files. Browse it to see every piece live.
|
|
17
|
+
3. **Impeccable knows Atomic Design at boot:** `impeccable context` loads `PRODUCT.md`, `DESIGN.md` and the `design.json` sidecar in `.impeccable`, which carry the Atomic Design contract 1.1.0: `Atoms -> Molecules -> Organisms -> Templates -> Pages`, upward-only composition enforced by `npx mmwork-check-ui --rules=all`. Pages arrange exported `@mutmutco/mmwork-ds` pieces around one template and never paint custom controls, raw `<button>`/`<input>`, `mw-*` classes, inline visual styles or raw hex/px values.
|
|
18
|
+
4. **Automatic propagation:** on every kit release the Hub kit-adopt workflow opens an adoption PR here that bumps `@mutmutco/mmwork-ds`, runs `mmwork-sync-impeccable`, and writes `DESIGN.md`, the `.impeccable` design manifest and `.impeccable/config.json` (`hook.enabled: true`) at the repository root, and deletes any stale copies under `module/`. These files are kit-owned: do not hand-edit them, and keep them committed even if `.impeccable/` is ignored (the adoption PR force-stages them).
|
|
19
|
+
5. **Root only:** `PRODUCT.md`, `DESIGN.md`, the `.impeccable` design manifest and `.impeccable/config.json` live only at this repository's root, never duplicated under `module/`; a copy there makes Impeccable treat `module/` as a separate root without `PRODUCT.md` and the config. Run `impeccable context` from the root. Any suite-wide propagation of these files needs an explicit intercom ACK handshake with the MM-Work Design Lead naming the files written and removed, `impeccable context` + `impeccable doctor --json` verification, and the issue/PR reference.
|
|
20
|
+
|
|
13
21
|
## Mandatory Impeccable workflow (owner, 2026-10-25; Hub#8814 / MM-Work#7629)
|
|
14
22
|
|
|
15
23
|
UI and design verification uses `@mutmutco/mmwork-ds` (`mmwork-check-ui`) plus Impeccable on every design task: inspect the toolkit for applicable capabilities, work directly on the live app, and use our own MM Artifacts A/B canvas only when an owner A/B choice is needed. Functional journeys, where separately permitted, stay opt-in `workflow_dispatch`-only and never act as design checks.
|
package/skills/rcand/suite.md
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: run `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` instead (a lead-only cut needs `--suite-solo --owner-go`). A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync.
|
|
2
2
|
|
|
3
|
+
Support sessions (MMI-Hub, Jerv-Hub, Jerv-JervCode) are not suite members and hold standing owner authorization (2026-10-25) to cut and ship releases at their discretion during suite runs without repeated per-release approval; record this standing rule in every suite session's working note and briefing while keeping all standard release preflight, gate, and verification checks.
|
|
4
|
+
|
package/skills/release/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Ship rc or direct-track development to main and production.
|
|
|
7
7
|
|
|
8
8
|
# /release — ship to main + prod
|
|
9
9
|
|
|
10
|
-
Bare `minor|major|patch` (default `patch`), never a flag; needs Jervaise's yes (principle 12). `minor`: `MMI_BUMP_REASON`. `major`: also `MMI_MAJOR_APPROVED=<exact version>` after the yes ([docs/versioning.md](../../docs/versioning.md)).
|
|
10
|
+
Bare `minor|major|patch` (default `patch`), never a flag; needs Jervaise's yes (principle 12). Support sessions (`MMI-Hub`, `Jerv-Hub`, `Jerv-JervCode`) hold standing owner authorization (2026-10-25) to release at their discretion during active suite runs without repeated per-release approval; record this standing rule in every suite session's working note and briefing ([suite.md](suite.md)). All standard release preflight, gate, and verification checks still apply. `minor`: `MMI_BUMP_REASON`. `major`: also `MMI_MAJOR_APPROVED=<exact version>` after the yes ([docs/versioning.md](../../docs/versioning.md)).
|
|
11
11
|
|
|
12
12
|
## Lane
|
|
13
13
|
|
package/skills/release/suite.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: run `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` instead (a lead-only cut needs `--suite-solo --owner-go`). A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync.
|
|
2
2
|
|
|
3
|
+
Support sessions (MMI-Hub, Jerv-Hub, Jerv-JervCode) are not suite members and hold standing owner authorization (2026-10-25) to cut and ship releases at their discretion during suite runs without repeated per-release approval; record this standing rule in every suite session's working note and briefing while keeping all standard release preflight, gate, and verification checks.
|
|
4
|
+
|
|
3
5
|
Every new mm-work suite Release (including solo and hotfix releases) requires both `--announce-summary-file <path>` (English) and `--announce-summary-file-tr <path>` (Turkish, "sen" form) in the update-notes template. The canonical wording lives in the [MM-Work GUIDE, "Update notes"](https://github.com/mutmutco/MM-Work/blob/development/packages/mmwork-ds/GUIDE.md#update-notes); this repo links it and never copies it. Each file has the section word `Fixed` / `Düzeldi` (what works now, never the problem: "Drive: Scans of large drives now finish without timing out."; a line without now / again / no longer, or artık / yeniden / tekrar / yine, is refused) and/or `New` / `Yeni` (what you can now do) on its own line, Fixed first, each only when it has lines. Under them go 1–8 lines of `<Area>: <sentence>.`, each at most 120 characters, with no issue numbers, versions or commit prefixes. Off-template or missing files refuse before tagging. Do not write the head (app · date · time) or the thanks line: MM-Work renders both from the Release date and credits. Suite release also requires a valid `--member-summary-file <owner/repo=path>` and `--member-summary-file-tr <owner/repo=path>` for every member being released, before promoting any member. Carried, held and already-released members need none, and existing Releases can resume without new files.
|
|
4
6
|
The `/user-releases` feed serves template notes as `updateNotes: {en?, tr?: {fixed[], new[]}}`. Older title-and-notes bodies keep `plainWords` and get `updateNotes: null`.
|
|
5
7
|
|