@mutmutco/claude-plugin 4.5.20 → 4.5.21
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/package.json
CHANGED
|
@@ -310,15 +310,17 @@ Provision the repo's vault namespace and deploy substrate from the Hub, not from
|
|
|
310
310
|
secrets. Runtime config names live in the two-tier vault (`/mmi-future/<slug>/dev|rc|main/*`) and are
|
|
311
311
|
managed through `/secrets`; never use `gh secret set` for product runtime config.
|
|
312
312
|
|
|
313
|
-
The default `tenant-container` substrate is a **Hetzner box** (`hetzner-ssh`): the
|
|
314
|
-
|
|
313
|
+
The default `tenant-container` substrate is a **Hetzner box** (`hetzner-ssh`): the deploy streams the stage's
|
|
314
|
+
vault values into a tmpfs runtime env (no `.env` file) and runs the container via docker-compose, deployed over the Hub's bounded
|
|
315
315
|
SSH lane. Do **not** create an AWS OIDC deploy role or a repo deploy Action for it. **Ask the master for the
|
|
316
316
|
box assignment** — the `sshHost` (and the loopback port) per stage — then write the `DEPLOY#<stage>` rows with
|
|
317
317
|
`mmi-cli oracle org project set-deploy <owner/repo> --stage <dev|rc|main> --ssh-host <host> [--port <p>]` (defaults:
|
|
318
318
|
`substrate: hetzner-ssh`, deploy path `/opt/mmi/<slug>/<stage>`, service = slug, ssh-user `root`). Without those
|
|
319
319
|
rows the tenant cannot deploy (`tenant-deploy.yml` errors on missing `DEPLOY#` coords), so do not skip this.
|
|
320
320
|
`bootstrap apply` prints one `deploy-row` row per track stage for container models (#6070): `SKIP` when the
|
|
321
|
-
registry row exists, `GAP` (`bootstrap-gap`) with the exact `set-deploy` command otherwise
|
|
321
|
+
registry row exists, `GAP` (`bootstrap-gap`) with the exact `set-deploy` command otherwise (for
|
|
322
|
+
`tenant-container` it carries `--no-env-file true`, matching the fileless compose seed; run it from the tenant
|
|
323
|
+
checkout once that compose is on the stage branch) — a box
|
|
322
324
|
assignment cannot be invented, so this row is the one train-readiness fact the apply never writes itself.
|
|
323
325
|
Keep every runtime config value in the vault; never paste secret values into logs.
|
|
324
326
|
|
|
@@ -485,9 +487,9 @@ mmi-cli devops bootstrap apply "$OWNER/$REPO" --class deployable \
|
|
|
485
487
|
Tenant-container repos must carry a `docker-compose.yml` and Dockerfile that build from the shipped source
|
|
486
488
|
archive; the train does not ship a prebuilt `dist/`. **Bootstrap seeds both files** for
|
|
487
489
|
`deployModel: tenant-container` from `skills/bootstrap/seeds/` (rendered from
|
|
488
|
-
the bootstrap seed Dockerfile and compose templates). The
|
|
489
|
-
|
|
490
|
-
and the app reads plain env vars — it must **not** self-load SSM and must **not** ship a committed `.env`.
|
|
490
|
+
the bootstrap seed Dockerfile and compose templates). The seeded compose is fileless: its service carries
|
|
491
|
+
`labels: { mmi.runtime-env: "true" }`, no `env_file`, and a loopback-only port; the deploy injects the stage's
|
|
492
|
+
vault values at runtime (`DEPLOY#<stage>.noEnvFile: true`) and the app reads plain env vars — it must **not** self-load SSM and must **not** ship a committed `.env`.
|
|
491
493
|
|
|
492
494
|
For a `web-app` that declares `oauth` META, print the canonical OAuth surface and provision the client once:
|
|
493
495
|
|
|
@@ -7,9 +7,11 @@ services:
|
|
|
7
7
|
# secrets:
|
|
8
8
|
# - NODE_AUTH_TOKEN
|
|
9
9
|
restart: unless-stopped
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
|
|
10
|
+
# Fileless deploy (DEPLOY#<stage>.noEnvFile: true): no .env exists. tenant-deploy.yml streams the
|
|
11
|
+
# stage-scoped vault values over SSH into a tmpfs (/dev/shm) runtime env, and the box injects them
|
|
12
|
+
# into every service labelled mmi.runtime-env. Never add env_file.
|
|
13
|
+
labels:
|
|
14
|
+
mmi.runtime-env: "true"
|
|
13
15
|
environment:
|
|
14
16
|
NODE_ENV: production
|
|
15
17
|
MMI_STAGE: ${MMI_STAGE:-dev}
|
|
@@ -17,7 +19,8 @@ services:
|
|
|
17
19
|
PORT: ${PORT:-3000}
|
|
18
20
|
MMI_EDGE_DOMAIN: ${MMI_EDGE_DOMAIN:-}
|
|
19
21
|
ports:
|
|
20
|
-
|
|
22
|
+
# Loopback only: the box Caddy is the one public door (TLS), never the bare port.
|
|
23
|
+
- "127.0.0.1:${MMI_PORT:-3000}:${PORT:-3000}"
|
|
21
24
|
|
|
22
25
|
# Build-time secret opt-in. Requires registry META:
|
|
23
26
|
# requiredBuildSecrets: ["NODE_AUTH_TOKEN=@github-packages-token"]
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -68,7 +68,7 @@ for the supported continuation; never replay a delivery whose result is uncertai
|
|
|
68
68
|
|
|
69
69
|
Read the receipts, never the exit code (exit `1` = a follow-up failed after the tag; a pending follow-up exits `0`, so a clean exit alone never means every leg resolved):
|
|
70
70
|
|
|
71
|
-
- `runs[]` — the release-triggered runs on the tagged SHA (workflow, conclusion, url). Watch each non-success entry to conclusion: `gh run watch <run-id> --repo {owner}/{repo} --exit-status`. Name which run is red: `deploy.yml` / `publish.yml` / `tenant-deploy.yml` / `jerv-gateway` is a deploy or publish verdict; a `gate` push run is ordinary CI sharing the SHA. `jerv-gateway` is the operator-host deploy leg: it has no run id to watch, so read its `deployNote` / `ledger.phases.deploy` — `pending` there means production was never deployed and blocks the next train run.
|
|
71
|
+
- `runs[]` — the release-triggered runs on the tagged SHA (workflow, conclusion, url). Watch each non-success entry to conclusion: `gh run watch <run-id> --repo {owner}/{repo} --exit-status --interval 30`. Name which run is red: `deploy.yml` / `publish.yml` / `tenant-deploy.yml` / `jerv-gateway` is a deploy or publish verdict; a `gate` push run is ordinary CI sharing the SHA. `jerv-gateway` is the operator-host deploy leg: it has no run id to watch, so read its `deployNote` / `ledger.phases.deploy` — `pending` there means production was never deployed and blocks the next train run.
|
|
72
72
|
- `foldStatus` + `foldNote` — the `hotfix-fold/<tag>` development PR; land it by true merge (Merge floor) and say whether it landed.
|
|
73
73
|
- `announceNote` (Hub), `verifyNote`, `checkout`, `localSync`, `ledger` — the durable phase legs; a pending or failed leg is unresolved, never done.
|
|
74
74
|
|
package/skills/rcand/SKILL.md
CHANGED
|
@@ -49,7 +49,7 @@ Read the receipt at `$r`, never the exit code (exit `1` = the deploy failed afte
|
|
|
49
49
|
|
|
50
50
|
- `promoted` — `true` even when the deploy failed; promotion and deploy are separate outcomes.
|
|
51
51
|
- `tag` — the minted `vX.Y.0-rc.N`; `resumeNote` says an existing rc tag was resumed rather than minted.
|
|
52
|
-
- `deployStatus` — `pending` is never terminal. `runId` / `runUrl` / `workflowRuns` name the run: the dispatched `tenant-deploy.yml` for tenant-container, the auto-fired `deploy.yml` for serverless. Watch each non-success entry to conclusion: `gh run watch <run-id> --repo {owner}/{repo} --exit-status`.
|
|
52
|
+
- `deployStatus` — `pending` is never terminal. `runId` / `runUrl` / `workflowRuns` name the run: the dispatched `tenant-deploy.yml` for tenant-container, the auto-fired `deploy.yml` for serverless. Watch each non-success entry to conclusion: `gh run watch <run-id> --repo {owner}/{repo} --exit-status --interval 30`.
|
|
53
53
|
- `releaseVerdict` — `followUpStatus` (`complete` · `pending` · `failed`) and one `legs` row per follow-up; a failed row carries its error.
|
|
54
54
|
- `checkout`, `localSync`, `ledger` — `checkout.status: returned` to `development` and phases-green, or the named reason it is not.
|
|
55
55
|
|
package/skills/release/SKILL.md
CHANGED
|
@@ -76,7 +76,7 @@ Read the saved result, never the exit code (exit `1` = a follow-up failed after
|
|
|
76
76
|
- `releaseVerdict.releaseStatus` + `followUpStatus` — `succeeded` + `pending` is shipped with the follow-up unresolved: neither failed nor done. A `--resume` receipt carries the same `releaseVerdict` (`command: release-resume`), plus its own `mode` and `state`.
|
|
77
77
|
- `deployStatus` — `pending` is never terminal; `promoted: true` holds even when a deploy failed.
|
|
78
78
|
- `served-channel(<product>)` row — the release's proof that new installs get it: the public `/release/version` pointer of the releasing repo's OWN channel (the Hub's `mmi`, or the product its registry `installer` declaration names; no declaration → no row), read after deploy and publish are green. `success` names the version read. `failure` is either a channel still on the previous version or a stale served process (the route answers 401/404): the note names what moves that channel and the exact remedy; run it, then re-read the pointer. `pending` means not probed (legs not green) or unreadable, never proof. The row is receipt evidence only, never a ledger leg, so it never blocks the next train.
|
|
79
|
-
- `workflowRuns` — every run on the release SHA (deploy-model runs, any `push: main` deploy, the repo's own `gate`). Watch each non-success entry to conclusion: `gh run watch <run-id> --repo {owner}/{repo} --exit-status`. Name which run is red: `deploy.yml` / `publish.yml` / `tenant-deploy.yml` / `jerv-gateway` is a deploy or publish verdict; a `gate` push run is ordinary CI sharing the SHA.
|
|
79
|
+
- `workflowRuns` — every run on the release SHA (deploy-model runs, any `push: main` deploy, the repo's own `gate`). Watch each non-success entry to conclusion: `gh run watch <run-id> --repo {owner}/{repo} --exit-status --interval 30`. Name which run is red: `deploy.yml` / `publish.yml` / `tenant-deploy.yml` / `jerv-gateway` is a deploy or publish verdict; a `gate` push run is ordinary CI sharing the SHA.
|
|
80
80
|
- With `--watch` the train waits for its own alignment PR to land (true merge) and folds the ledger in the same run, so the receipt ends `succeeded` / `complete`. An external `gh run watch` never folds anything: if the receipt still shows a `pending` leg (no `--watch`, the alignment PR outlived the bounded wait, or a release-event `publish.yml` run on a registry-publish repo had not been correlated by the time the receipt was written — `--watch` waits for the alignment PR, not for that run, so a `publish` leg `pending` with no run URL after `--watch` is the expected direct-track shape, not a failure), fold it live before declaring the cut done or starting any new train: `mmi-cli devops release --resume --watch --json --out <fresh-receipt>`; the NEXT train's doctor otherwise refuses with `ledger-pending`.
|
|
81
81
|
- `announceNote` — `announced` (to the alerts channel for the Hub, to the project release channel for a product repo), `skipped`, `not announced` (deploy or publish not green; the note says whether a `--resume` carrying the same `--announce-summary-file` will post it), or the failure note. The channel id itself is never printed.
|
|
82
82
|
- `devRollForward` / `rcAlignment` — `pushed`, or `pr-pending` with the alignment PR to land by true merge (Merge floor). An enqueued auto-merge is not evidence of the method; before reporting, read the enqueued method back — `gh pr view <n> --json autoMergeRequest --jq .autoMergeRequest.mergeMethod` — and prove it is `MERGE`. An enqueued `SQUASH` is a stop under the Merge floor, not something to wait out.
|