@mutmutco/codex-plugin 4.5.61 → 4.5.62

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.61",
3
+ "version": "4.5.62",
4
4
  "mmiCompat": "4.x",
5
5
  "description": "MMI workflow skills and org gates delivery.",
6
6
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/codex-plugin",
3
- "version": "4.5.61",
3
+ "version": "4.5.62",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -383,7 +383,8 @@ collaborator list + the per-branch allowlist are the record — no separate rost
383
383
  under the org **wall-clock budget** (#3178): the render pins `run-with-budget` to the CLI's blessed SHA
384
384
  with `--var GATE_MAX_SECONDS=` (300s onboarding default — tighten once the gate is measured, via
385
385
  `--var` or `org project set <repo> --var gate={"maxSeconds":N}`); `ci audit` and the release train
386
- both enforce the step, so do not remove it. Every trigger runs the full `GATE_CMD`. A repo whose checks
386
+ both enforce the step, so do not remove it. The tenant-container product image build (#7542)
387
+ shares that ceiling — no separate knob. Every trigger runs the full `GATE_CMD`. A repo whose checks
387
388
  need a service container or an extra budgeted step declares them in its registry gate config, never by
388
389
  hand-editing the rendered gate (#7407): `gate.services` is keyed by service name with `image`, `env`,
389
390
  `ports`, one-line `options` and `tmpfs` paths; `gate.steps` is a list of `{name, command, env,
@@ -48,6 +48,9 @@ concurrency:
48
48
 
49
49
  permissions:
50
50
  contents: read
51
+ # MMI-Hub#7542: the product image build below reads org private packages with the workflow's
52
+ # own ephemeral token (NODE_AUTH_TOKEN) — the same reader the central deploy uses.
53
+ packages: read
51
54
 
52
55
  jobs:
53
56
  gate:
@@ -94,6 +97,39 @@ jobs:
94
97
  done < "$offenders"
95
98
  exit 1
96
99
  fi
100
+ # MMI-Hub#7542: build the product image in the gate. The post-merge deploy builds the
101
+ # product's own docker-compose.yml (`docker compose up --build` on the box); nothing in the
102
+ # gate did, so MMI-Scout#301 merged green and turned the next dev deploy red (exit 70) when
103
+ # its Dockerfile ran a test-only entry the image never received. `docker compose build`
104
+ # reuses the deploy's OWN build definition — context, dockerfile, args, target — so a
105
+ # Dockerfile/compose break fails this required `gate` job before the merge instead of the dev
106
+ # deploy after it. Tenant-container only: repos without the deploy's pre-flighted runtime
107
+ # files (Dockerfile + docker-compose.yml) skip in a second — no new job, no new required
108
+ # context, no ruleset or registry change (#7012 needs nothing to cover).
109
+ - name: Product image build (tenant-container only)
110
+ env:
111
+ # The documented build-secret opt-in (compose `build.secrets` + registry
112
+ # requiredBuildSecrets `NODE_AUTH_TOKEN=@github-packages-token`): the workflow's own
113
+ # ephemeral token reads org private packages — the same reader the central deploy
114
+ # uses. Repos whose compose never references it never consume it.
115
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
116
+ uses: mutmutco/MMI-Hub/.github/actions/run-with-budget@{{GATE_BUDGET_SHA}}
117
+ with:
118
+ # Build-only: no push, no run, no published ports. The absolute -f keeps a non-root
119
+ # GATE_WORKDIR building the repo-root compose the deploy ships; relative build contexts
120
+ # inside that file resolve against its own directory, exactly as on the box. Layer cache
121
+ # is the runner-local dockerd shared across the host's mmi-live lanes — the same
122
+ # local-cache model the box-side `up --build` relies on, so warm PRs pay seconds.
123
+ command: |
124
+ if [ ! -f "$GITHUB_WORKSPACE/Dockerfile" ] || [ ! -f "$GITHUB_WORKSPACE/docker-compose.yml" ]; then
125
+ echo "no tenant-container runtime files (Dockerfile + docker-compose.yml) — skipping product image build"
126
+ exit 0
127
+ fi
128
+ docker compose version >/dev/null 2>&1 || { echo "::error title=CI runner toolchain::RUNNER NOT PROVISIONED — 'docker compose' not on PATH. This is the runner, not your diff; no image was built. Re-run the job; if it persists the mmi-runner docker toolchain needs attention (docs/Guides/gh-runner-runbook.md in MMI-Hub)."; exit 1; }
129
+ docker compose -f "$GITHUB_WORKSPACE/docker-compose.yml" build
130
+ max-seconds: {{GATE_MAX_SECONDS}}
131
+ label: product image build
132
+ working-directory: {{GATE_WORKDIR}}
97
133
  # #5660: self-hosted gates opt OUT of setup-node automatic npm cache restore unless a bounded
98
134
  # cache policy is declared on runner-node-toolchain (cache + cache-restore-max-mb). Per-job
99
135
  # NPM_CONFIG_CACHE above is the org default; unbounded Actions cache blobs can exhaust mmi-live