@mutmutco/claude-plugin 4.6.3 → 4.6.5
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 +665 -131
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/board/SKILL.md +12 -11
- package/skills/board/reference.md +5 -1
- package/skills/bootstrap/SKILL.md +5 -5
- package/skills/bootstrap/reference.md +16 -77
- package/skills/epic/SKILL.md +3 -3
- package/skills/hotfix/SKILL.md +10 -12
- package/skills/hotfix/recovery.md +3 -7
- package/skills/intercom-guest/SKILL.md +6 -7
- package/skills/mmi-help/SKILL.md +5 -4
- package/skills/org-guide/SKILL.md +18 -27
- package/skills/org-guide/references/design.md +301 -0
- package/skills/org-guide/references/vault.md +2 -9
- package/skills/org-guide/references/work-and-releases.md +11 -298
- package/skills/rcand/SKILL.md +5 -9
- package/skills/rcand/recovery.md +1 -10
- package/skills/rcand/suite.md +1 -1
- package/skills/release/SKILL.md +7 -11
- package/skills/release/recovery.md +1 -2
- package/skills/release/suite.md +1 -1
- package/skills/release/train-common.md +28 -0
- package/skills/release/verification.md +11 -46
- package/skills/secrets/SKILL.md +6 -5
- package/skills/secrets/reference.md +5 -47
package/cli/package.json
CHANGED
package/package.json
CHANGED
package/skills/board/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: board
|
|
3
|
-
description: Show the repo workboard and clear it in the fewest PRs.
|
|
3
|
+
description: Show the repo workboard and clear it in the fewest PRs. Use to see, plan or claim work, not to file one issue or release.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /board — your workboard, and the fastest way through it
|
|
@@ -12,16 +12,20 @@ permission to take anything.
|
|
|
12
12
|
## Step 1 — read the board
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
+
mkdir -p .jerv/tmp
|
|
15
16
|
mmi-cli oracle board read --json --out .jerv/tmp/board.json
|
|
16
17
|
```
|
|
17
18
|
|
|
18
19
|
One call; the JSON carries `viewer`, `repo` and the project title. Use `primary` for this repo and
|
|
19
|
-
`secondary` for other repos on the Project.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
`secondary` for other repos on the Project. Without `--flat`, `board read --json` returns an object
|
|
21
|
+
`{project, viewer, repo, primary, secondary, warnings, partial}` whose `primary` and `secondary` are bucket
|
|
22
|
+
objects `{userOwned, claimable, taken, unownedInFlight}` of item arrays (no top-level `items` array), so filter
|
|
23
|
+
a bucket (e.g. `report.primary.claimable`) or pass `--json --flat`, never `(j.items||j).filter`. Partial reads
|
|
24
|
+
exit nonzero; `--allow-partial` only when the dev accepts an incomplete board. The CLI partitions rows into
|
|
25
|
+
**Yours**, **Free to claim** and **Taken**; stale stamps (4 hours without work) hold nothing. Partition rules,
|
|
26
|
+
stamp details and `--out` rationale: [reference.md](reference.md).
|
|
23
27
|
|
|
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. Those typed reads take **one** number per call, exactly like native gh: a second number is refused as `too many arguments`, so read several issues by repeating the typed read once per number (one `--jq` each, joined `&&`). 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 `
|
|
28
|
+
**Under the App pool, never type raw `gh` for a read** (`gh issue list/view --jq`, `gh run list --event`/`--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`, `run list --event <event>`, or `MMI_ACTOR=app mmi-cli devops api get "repos/<owner>/<repo>/actions/runs?event=<event>&per_page=<n>"`); `--jq '<expr>'` on that typed read filters locally. Those typed reads take **one** number per call, exactly like native gh: a second number is refused as `too many arguments`, so read several issues by repeating the typed read once per number (one `--jq` each, joined `&&`). 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 `mmi-cli oracle issue edit <ref> --body-file .jerv/tmp/issue-body.md`. When `node -e` reads saved JSON, pass an absolute path or use `JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'))`: `require()` of a relative path (e.g. `tmp\board.json` from `cygpath -w`) throws MODULE_NOT_FOUND.
|
|
25
29
|
|
|
26
30
|
## Step 2 — render it
|
|
27
31
|
|
|
@@ -73,9 +77,7 @@ so the file form is the one that always works.
|
|
|
73
77
|
|
|
74
78
|
Follow printed owner rulings; record new ones with `mmi-cli oracle issue decision`. One concurrent worktree per batch: [reference.md](reference.md). Always pass `--surface <value>` explicitly on every `mmi-cli oracle issue create` (surface inference is strict and bounces when the body merely mentions a path); use `--no-surface` only for genuinely exempt filings.
|
|
75
79
|
|
|
76
|
-
With several task lanes in one session,
|
|
77
|
-
|
|
78
|
-
A fresh mmi worktree has no `.jerv/`: run `mkdir -p .jerv/tmp` before writing scratch files there (PR bodies, batches) or listing it.
|
|
80
|
+
With several task lanes in one session, name the lane's worktree path (the `mmi-worktrees/<Repo>/<issue>-<slug>` path your host reported when it created the worktree) on every worktree exec or land call; the host refuses to guess (#5629). While any mmi-worktrees lane is registered for this repo, run focused tests/gates from the task-worktree root your host reported — never the primary checkout; the test policy refuses it (`test-command-untrusted-worktree-cwd`). A fresh worktree has no `.jerv/`, so `mkdir -p .jerv/tmp` before writing scratch files there (PR bodies, batches).
|
|
79
81
|
|
|
80
82
|
## Step 5 — land one PR per batch
|
|
81
83
|
|
|
@@ -93,8 +95,7 @@ open: `Part of #N` or `Refs #N`, never `Does not close #N`. Guidance-learning ga
|
|
|
93
95
|
ref and OID, clean worktree); otherwise retain and report. Watch the merge by PR number (`state` reaching
|
|
94
96
|
`MERGED`) or by the closing issue's `state` — never by the head branch or its remote ref: GitHub deletes a
|
|
95
97
|
merged head, so a missing branch is not an unmerged verdict and a same-name branch recreated by a later
|
|
96
|
-
push is not a second chance to land on it (docs/Guides/train-troubleshooting.md
|
|
97
|
-
`merged-pr-head-reuse`). Show any `gh` / `mmi-cli` error verbatim.
|
|
98
|
+
push is not a second chance to land on it ([`merged-pr-head-reuse`](https://github.com/mutmutco/MMI-Hub/blob/development/docs/Guides/train-troubleshooting.md#merged-pr-head-reuse)). Show any `gh` / `mmi-cli` error verbatim.
|
|
98
99
|
|
|
99
100
|
## Retro — one check before you finish
|
|
100
101
|
|
|
@@ -17,7 +17,11 @@ UTF-16LE with a BOM (#5802); Bash redirects preserve the CLI's UTF-8 output.
|
|
|
17
17
|
|
|
18
18
|
One call. Its JSON carries `viewer`, `repo` and the project title — do not spend extra calls on
|
|
19
19
|
`gh api user` or `gh repo view`. Use `primary` for this repo and `secondary` for other repos on the same
|
|
20
|
-
Project.
|
|
20
|
+
Project. Without `--flat`, `board read --json` returns an object
|
|
21
|
+
`{project, viewer, repo, primary, secondary, warnings, partial}` whose `primary` and `secondary` are bucket
|
|
22
|
+
objects `{userOwned, claimable, taken, unownedInFlight}` of item arrays (no top-level `items` array), so filter
|
|
23
|
+
a bucket (e.g. `report.primary.claimable`) or pass `--json --flat`, never `(j.items||j).filter`. Partial reads
|
|
24
|
+
exit nonzero; pass `--allow-partial` only when the dev accepts an incomplete board.
|
|
21
25
|
|
|
22
26
|
Partition, as the CLI computes it:
|
|
23
27
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bootstrap
|
|
3
|
-
description: Provision an org repo with board, registry, rules, and plugin setup.
|
|
3
|
+
description: Provision an org repo with board, registry, rules, and plugin setup. Use when onboarding a new repo as master, not for day-to-day changes to a repo already provisioned.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
**Host-native invocation:** Claude `/mmi:bootstrap` · Codex `$mmi:bootstrap` · jervcode `/bootstrap` · OpenBot the `bootstrap` skill (loaded by name). A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
@@ -16,8 +16,8 @@ Read [reference.md](reference.md) for create vs upgrade, seed refresh, propagati
|
|
|
16
16
|
Before Step 0a, state a recommended default per axis and confirm all four with Jervaise through the orchestrator; never default silently.
|
|
17
17
|
|
|
18
18
|
- **`class`** — `deployable` (full or direct train) · `content` (trunk, `main` only); sets the branch model.
|
|
19
|
-
- **`project-type`** —
|
|
20
|
-
- **`deploy-model`** —
|
|
19
|
+
- **`project-type`** — the capability shape; `mmi-cli devops bootstrap apply --help` lists the values. Sets Hub services.
|
|
20
|
+
- **`deploy-model`** — how it deploys; `bootstrap apply --help` lists the values. Sets the deploy path.
|
|
21
21
|
- **`release-track`** — `full` (development·rc·main) · `direct` (development·main) · `trunk` (`main`); sets the branch set.
|
|
22
22
|
|
|
23
23
|
A **deployable** repo also needs gate runtime (`node` default, `python` for a Python app), check command and working directory: `--var GATE_RUNTIME=`, `GATE_CMD=`, `GATE_WORKDIR=`, and `GATE_CACHE_DEP_PATH=` for a non-root Node lockfile.
|
|
@@ -42,7 +42,7 @@ For board selection/creation, access, gate setup or manual provisioning of a new
|
|
|
42
42
|
|
|
43
43
|
## Step 6 — register Hub META
|
|
44
44
|
|
|
45
|
-
No product repo control-plane file; `mmi-cli` resolves state from the Hub registry. For flag combinations or an MM-Work module, read [reference.md](reference.md) first. Apply with the board variables discovered earlier (or `mmi-cli oracle org project set`):
|
|
45
|
+
No product repo control-plane file; `mmi-cli` resolves state from the Hub registry. For flag combinations or an MM-Work module, read [reference.md](reference.md) first. Apply with the board variables discovered earlier (or `mmi-cli oracle org project set`). Without `--execute` it is a dry run; show it to Jervaise and get his yes before adding `--execute`, which writes to GitHub and the Hub registry:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
48
|
mmi-cli devops bootstrap apply "$OWNER/$REPO" --class deployable \
|
|
@@ -69,7 +69,7 @@ Repo, default branch, ruleset, push allowlist, Environments per track, project (
|
|
|
69
69
|
mmi-cli devops train doctor --lane release --repo "$OWNER/$REPO" --json # full track: also --lane rcand
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
`ready: true` is the train-readiness proof (
|
|
72
|
+
`ready: true` is the train-readiness proof (open a finding's `anchor` URL). A `bootstrap-gap` finding names the missing apply row (blocker: train branch absent on origin; warning: stage with no required status check). Read warnings too: `ready: true` alone does not prove the product ruleset is active.
|
|
73
73
|
|
|
74
74
|
## Retro
|
|
75
75
|
|
|
@@ -94,8 +94,8 @@ gh api -X PUT "repos/$OWNER/$REPO/contents/.gitkeep" \
|
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
`--disable-wiki` seeds `has_wiki=false` at creation: wikis are retired org-wide (compute-at-read, #4206),
|
|
97
|
-
GitHub defaults new repos to `has_wiki=true`, and `bootstrap apply --execute`
|
|
98
|
-
|
|
97
|
+
GitHub defaults new repos to `has_wiki=true`, and `bootstrap apply --execute` enforces the same rule
|
|
98
|
+
afterwards while `bootstrap verify` checks it.
|
|
99
99
|
|
|
100
100
|
On an empty repo that PUT creates `$FIRST` **and leaves it the default branch**, so no `gh repo edit
|
|
101
101
|
--default-branch` is needed here. Skip this step when the repo already exists with the track's default branch.
|
|
@@ -147,7 +147,7 @@ next dry-run `bootstrap apply`.
|
|
|
147
147
|
## Step 2 — authority (org Ruleset)
|
|
148
148
|
|
|
149
149
|
Confirm the org-level rulesets already target this repo (they apply org-wide): **`mmi-branch-protection`**
|
|
150
|
-
PR-gates `development` and blocks force-push/deletion there (bypass = org admins + the
|
|
150
|
+
PR-gates `development` and blocks force-push/deletion there (bypass = org admins + the org App),
|
|
151
151
|
and **`mmi-train-floor`** blocks force-push/deletion on `rc`/`main` (no PR rule — the train pushes merges and
|
|
152
152
|
tags directly; no bypass). (Definitions mirror live in `.github/rulesets/mmi-branch-protection.json` and
|
|
153
153
|
`.github/rulesets/mmi-train-floor.json`.) MMI-Hub additionally has its own repository ruleset,
|
|
@@ -291,12 +291,12 @@ collaborator list + the per-branch allowlist are the record — no separate rost
|
|
|
291
291
|
labels are allowed on every OS (`ubuntu-*`, `windows-*`, `macos-*` and their ARM variants, #8977), and
|
|
292
292
|
only larger/paid images, GPU shapes and custom runner groups stay refused. Jobs needing system
|
|
293
293
|
packages
|
|
294
|
-
run in a `container:`.
|
|
295
|
-
|
|
296
|
-
|
|
294
|
+
run in a `container:`. Independent checks belong in separate parallel jobs
|
|
295
|
+
(each with its own `runs-on`), never chained into one serial job or throttled with unneeded
|
|
296
|
+
`concurrency` groups. See `docs/Guides/gh-runner-runbook.md`.
|
|
297
297
|
- **Product gate + required checks (#1333, stack-aware #1550)** — deployable repos bootstrap-seed
|
|
298
298
|
`.github/workflows/gate.yml` (single `gate` job — the simple default for one check command; a repo
|
|
299
|
-
that grows several independent suites splits them into parallel jobs
|
|
299
|
+
that grows several independent suites splits them into parallel jobs,
|
|
300
300
|
as MMI-Hub's `cli`/`infra`/`docs` gate does) and a ruleset reference at
|
|
301
301
|
`.github/rulesets/mmi-product-required-checks.json`. The gate is stack-aware: capture the repo's
|
|
302
302
|
**runtime** (`node` | `python`), its **check command**, and its **working directory** at interview time
|
|
@@ -327,7 +327,7 @@ collaborator list + the per-branch allowlist are the record — no separate rost
|
|
|
327
327
|
`strict_required_status_checks_policy: false`. Bootstrap and CI reconciliation preserve that policy
|
|
328
328
|
when updating contexts, and converge the live ruleset to the committed setting. Repositories may
|
|
329
329
|
explicitly require an up-to-date head. `pr merge` / `pr land` still update a BEHIND head from the base
|
|
330
|
-
with a merge commit and re-wait once — see
|
|
330
|
+
with a merge commit and re-wait once — see [head-behind-base](https://github.com/mutmutco/MMI-Hub/blob/development/docs/Guides/train-troubleshooting.md#head-behind-base).
|
|
331
331
|
- **A brand-new repo cannot pass the gate you just installed — its first commit must carry a real project
|
|
332
332
|
(#2928).** The seeded `gate.yml` runs `GATE_INSTALL_CMD` + `GATE_CMD` (`npm ci` + `npm run check` by
|
|
333
333
|
default) **unconditionally**. An empty repo has no `package.json`, so the gate **fails on the seed PR
|
|
@@ -371,8 +371,7 @@ collaborator list + the per-branch allowlist are the record — no separate rost
|
|
|
371
371
|
## Step 5 — install the plugin + seed docs
|
|
372
372
|
|
|
373
373
|
- Bootstrap does **not** seed `.claude/settings.json` or any agent guide (hub-v3 WS4). The developer installs
|
|
374
|
-
the org
|
|
375
|
-
`superpowers@claude-plugins-official` (Anthropic's skills framework — TDD, debugging, subagent dev).
|
|
374
|
+
the org plugin per machine: `mmi@mutmutco` (it carries the org tooling and skills).
|
|
376
375
|
Personal agent guides (`AGENTS.md`/`CLAUDE.md`) are developer-owned and gitignored — MMI never delivers,
|
|
377
376
|
overwrites, or deletes them; Jervaise's guide rides Jerv PowerTools.
|
|
378
377
|
- Seed `README.md` + `architecture.md` from the templates, then **fill them before finishing** — `bootstrap
|
|
@@ -398,12 +397,14 @@ collaborator list + the per-branch allowlist are the record — no separate rost
|
|
|
398
397
|
guides stay developer-owned and gitignored, carried per machine by each developer's own plugins.
|
|
399
398
|
|
|
400
399
|
Choose the v2 shape explicitly. Use `--project-type web-app --deploy-model tenant-container` for ordinary
|
|
401
|
-
web tenants, `--project-type desktop-game --deploy-model none
|
|
402
|
-
`--project-type desktop-app --deploy-model none
|
|
400
|
+
web tenants, `--project-type desktop-game --deploy-model none` for a desktop game,
|
|
401
|
+
`--project-type desktop-app --deploy-model none` for a packaged desktop application
|
|
403
402
|
(swap in `--deploy-model registry-publish` when it also publishes a package alongside its installer),
|
|
404
|
-
`--project-type mobile-app --deploy-model none
|
|
405
|
-
|
|
406
|
-
|
|
403
|
+
`--project-type mobile-app --deploy-model none` for a phone app distributed through the app stores, and
|
|
404
|
+
`--class content --project-type content --deploy-model content` for a content/KB repo. A non-web repo
|
|
405
|
+
carries no web profile: clear the leftover web-only registry fields with
|
|
406
|
+
`mmi-cli oracle org project set <owner/repo> --clear-web-profile` (the flag belongs to `oracle org project set`,
|
|
407
|
+
not to `bootstrap apply`).
|
|
407
408
|
An **MM-Work module** adds `--var SUITE=mm-work` (#7944): it registers `suite: mm-work` and derives its
|
|
408
409
|
own `dev.<sub>.mutmut.work` + `<sub>.mutmut.work` hosts, with no rc host (the suite serves its rc from the
|
|
409
410
|
live host). Without it, apply derives the `*.mutatismutandis.co` web-app hosts, which a module never uses.
|
|
@@ -427,65 +428,3 @@ mmi-cli vault org oauth set-creds --repo "$OWNER/$REPO" < client.json # the Co
|
|
|
427
428
|
The keys are the one stageless pair `GOOGLE_CLIENT_ID` + `GOOGLE_CLIENT_SECRET` at the slug root — every
|
|
428
429
|
stage reads it (#2244/#2528). Never a staged `{dev,rc,main}/GOOGLE_*`, `GOOGLE_OAUTH_CLIENT_*`, or `prod/`
|
|
429
430
|
variant; the runtime reads only the canonical names and declare-first rejects the rest.
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
## Detail moved from SKILL.md (verbatim)
|
|
434
|
-
|
|
435
|
-
For a **deployable** repo, also capture the **gate runtime** (`node` | `python`), the **check command**, and
|
|
436
|
-
the **working directory** — these feed the product gate (`--var GATE_RUNTIME=`, `--var GATE_CMD=`,
|
|
437
|
-
`--var GATE_WORKDIR=`, and `--var GATE_CACHE_DEP_PATH=` for a non-root Node lockfile; see Step 5 / the
|
|
438
|
-
"Product gate + required checks" note below). Default to `node` at the repo root; recommend `python` when the
|
|
439
|
-
repo's app is Python.
|
|
440
|
-
|
|
441
|
-
A **content/trunk** choice provisions: `main`-only (no `rc`), **no** `.github/workflows/gate.yml` and **no**
|
|
442
|
-
product required-check ruleset, and a `projects.json` entry with `branch: main` (which marks it a content-class
|
|
443
|
-
repo). A clean content repo then verifies green — `bootstrap verify --class content` no longer reports
|
|
444
|
-
the deployable gate checks as FAIL (#1450).
|
|
445
|
-
|
|
446
|
-
Record the confirmed axes; Step 0a runs `verify --class <confirmed>`, Step 0b creates the repo on the
|
|
447
|
-
track's default branch, and the apply flags (`--project-type` / `--deploy-model` / `--release-track`) carry
|
|
448
|
-
the confirmed values — no silent defaulting.
|
|
449
|
-
|
|
450
|
-
Run it again after Step 7. A repo is not ready for real developers until every check is green, or the report
|
|
451
|
-
names an explicitly manual-only item that the master has accepted for that repo. For a deployable repo the
|
|
452
|
-
report ends with the train doctor verdict per lane (`release`; plus `rcand` on a full track) — the same
|
|
453
|
-
`mmi-cli devops train doctor` door `/release` and `/rcand` open (#6070); a `ready: false` there is an
|
|
454
|
-
unfinished repo, **with one expected exception**: a full track's two lanes start from different branches
|
|
455
|
-
(`release` from `rc`, `rcand` from `development`) and one checkout stands on one branch, so the lane you
|
|
456
|
-
are not standing on reports the never-healed `branch-mismatch` blocker (#6432). Verify is read-only and
|
|
457
|
-
does not check the other branch out: a lane whose ONLY finding is that mismatch is printed `NOT EVALUATED
|
|
458
|
-
from this branch` and does not fail the verify (#6677). That is the finished state, not a gap — run
|
|
459
|
-
`mmi-cli devops train doctor --lane <lane> --json` from that lane's own branch for its verdict. Any other
|
|
460
|
-
blocker in that lane, or an unread origin, still makes the report red.
|
|
461
|
-
|
|
462
|
-
Tenant-container repos must carry a `docker-compose.yml` and Dockerfile that build from the shipped source
|
|
463
|
-
archive; the train does not ship a prebuilt `dist/`. **Bootstrap seeds both files** for
|
|
464
|
-
`deployModel: tenant-container` from `skills/bootstrap/seeds/` (rendered from
|
|
465
|
-
the bootstrap seed Dockerfile and compose templates). The seeded compose is fileless: its service carries
|
|
466
|
-
`labels: { mmi.runtime-env: "true" }`, no `env_file`, and a loopback-only port; the deploy injects the stage's
|
|
467
|
-
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`.
|
|
468
|
-
|
|
469
|
-
**Stage port block (required for central-container):** run `mmi-cli stage port-range <Repo>` to assign
|
|
470
|
-
(idempotently) the repo's local port block from the central registry. `tenant-container` and
|
|
471
|
-
`solo-container` **must** have Hub registry `portRange` — `mmi-cli devops bootstrap verify` fails without
|
|
472
|
-
it (#5539), and `mmi-cli stage` cannot derive a local preview until the block exists. `bootstrap apply
|
|
473
|
-
--execute` assigns the block automatically after DDB register for those models; for older META holes,
|
|
474
|
-
run `stage port-range` explicitly. The block keeps local ports collision-free across projects and versions.
|
|
475
|
-
|
|
476
|
-
Repo, default branch, ruleset applied, train branches locked (push allowlist), repository Environments
|
|
477
|
-
provisioned per track (plan-gated protections named in apply output), project attached/created
|
|
478
|
-
(+ info seeded, Status lanes and Labels field verified), secrets set (names only), developer access, plugin
|
|
479
|
-
installed, docs seeded, registry META written, issue templates committed, org App credentials registered,
|
|
480
|
-
org-managed `.gitignore` block seeded, the final `mmi-cli devops bootstrap verify "$OWNER/$REPO" --class ... --json` result,
|
|
481
|
-
and — for a deployable repo — the train door itself, run from the repo's own checkout on `development`:
|
|
482
|
-
|
|
483
|
-
```bash
|
|
484
|
-
mmi-cli devops train doctor --lane release --repo "$OWNER/$REPO" --json
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
`ready: true` is the bootstrap's train-readiness proof; every finding carries `code`, `severity`, `source`,
|
|
488
|
-
`remedy` and a `docs/Guides/train-troubleshooting.md#<code>` anchor. A full-track repo runs
|
|
489
|
-
`--lane rcand` as well. A `bootstrap-gap` finding names the apply row still missing — a blocker for a
|
|
490
|
-
train branch absent on origin, a warning for a stage with no required status check (#6136): read the
|
|
491
|
-
warnings too, `ready: true` alone does not prove the product ruleset is active.
|
package/skills/epic/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: epic
|
|
3
|
-
description: Split a vision or umbrella issue into linked child issues in one batch.
|
|
3
|
+
description: Split a vision or umbrella issue into linked child issues in one batch. Use for an umbrella with several deliverables, not for a single issue.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /epic — decompose an umbrella into children
|
|
@@ -9,7 +9,7 @@ Turn one large item (vision, epic, umbrella issue) into native sub-issues in one
|
|
|
9
9
|
|
|
10
10
|
## Opening branch — no umbrella yet
|
|
11
11
|
|
|
12
|
-
For a product intent rather than an existing issue: gather the intent, read the repo's live issue templates, draft the umbrella from the matching feature/task template and show the draft for the user's go. Then create one issue with the `epic` label
|
|
12
|
+
For a product intent rather than an existing issue: gather the intent, read the repo's live issue templates, draft the umbrella from the matching feature/task template and show the draft for the user's go. Then create one issue with `mmi-cli oracle issue create --type task --label epic --priority <urgent|high|medium|low>` (the `epic` label is explicit, never implied by the type); re-read it from the board to prove body, label and priority landed. Stop there unless child decomposition was also asked for and approved.
|
|
13
13
|
|
|
14
14
|
## Step 0 — load the umbrella whole
|
|
15
15
|
|
|
@@ -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.
|
|
73
|
+
Each child is now a parallel item: one worktree + PR each. Worktree mechanics (lane paths, tests from the lane root, Windows longpaths) are in the [board skill](../board/SKILL.md). **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
|
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hotfix
|
|
3
|
-
description: Promote a merged development fix to main and production via the Hub train.
|
|
3
|
+
description: Promote a merged development fix to main and production via the Hub train. Use for an urgent already-merged fix, not for a normal release (release) or a candidate (rcand).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
**Host-native invocation:** Claude `/mmi:hotfix` · Codex `$mmi:hotfix` · jervcode `/hotfix` · OpenBot the `hotfix` skill (loaded by name).
|
|
@@ -11,6 +11,8 @@ description: Promote a merged development fix to main and production via the Hub
|
|
|
11
11
|
|
|
12
12
|
The fix lands on `development` first; Hub ports that merged PR or SHA onto a main-base branch (cherry-pick with `-x`) and releases the PATCH. Never author the fix on a branch off `main`. The fix is NOT a back-merge (`rc` absorbs it next `/rcand`; the hotfix-coverage guard blocks a candidate omitting it).
|
|
13
13
|
|
|
14
|
+
Pushing to `main` and production needs Jervaise's yes unless a standing authorization covers this repo (the support-session authorization in [release suite.md](../release/suite.md)).
|
|
15
|
+
|
|
14
16
|
## Lane
|
|
15
17
|
|
|
16
18
|
MM-Work suite seats: read [suite.md](suite.md). Lane from META:
|
|
@@ -19,7 +21,7 @@ MM-Work suite seats: read [suite.md](suite.md). Lane from META:
|
|
|
19
21
|
mmi-cli oracle org project get {owner}/{repo} --json
|
|
20
22
|
```
|
|
21
23
|
|
|
22
|
-
A hotfix skips rc on every track; `deployModel: vercel` waits for the Production Deployment, then probes it. Unreadable META → stop; never infer the lane.
|
|
24
|
+
A hotfix skips rc on every track; `deployModel: vercel` waits for the Production Deployment, then probes it (a leg left pending settles on the next doctor `--heal`). Unreadable META → stop; never infer the lane.
|
|
23
25
|
|
|
24
26
|
## Preflight
|
|
25
27
|
|
|
@@ -27,7 +29,7 @@ A hotfix skips rc on every track; `deployModel: vercel` waits for the Production
|
|
|
27
29
|
mmi-cli devops train doctor --lane hotfix --heal --json
|
|
28
30
|
```
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
Read it per [train-common.md](../release/train-common.md#doctor).
|
|
31
33
|
|
|
32
34
|
Piping `mmi-cli devops api get` into a JSON parser: a refusal exits 1 with empty stdout, so guard both exit status and nonempty output. For one job's runner and timestamps, read the allowlisted `repos/{owner}/{repo}/actions/runs/{id}/jobs` and filter `jobs[]` by `id`; `actions/jobs/{id}` is refused (only its `/logs`, with `--out`). Do not retry that refused endpoint or broaden the allowlist.
|
|
33
35
|
|
|
@@ -50,7 +52,7 @@ mkdir -p .jerv/tmp && r1=$(mktemp .jerv/tmp/hotfix-start.XXXXXX)
|
|
|
50
52
|
mmi-cli devops hotfix start --from <pr|sha>[,<pr|sha>…] --json --out "$r1"
|
|
51
53
|
```
|
|
52
54
|
|
|
53
|
-
2. Verify: local gate, required review, acceptance criteria. Merge with `mmi-cli devops pr merge <number> --squash` (waits for CI and review; keep the `-x` trailer). Because Hub's default branch is `development`, it closes no issue; no raw GitHub issue operations.
|
|
55
|
+
2. Verify: local gate, required review, acceptance criteria. Merge with `mmi-cli devops pr merge <number> --squash --wait` (waits for CI and review; keep the `-x` trailer). Because Hub's default branch is `development`, it closes no issue; no raw GitHub issue operations.
|
|
54
56
|
|
|
55
57
|
3. Release:
|
|
56
58
|
|
|
@@ -60,7 +62,7 @@ mmi-cli devops hotfix status --json
|
|
|
60
62
|
mmi-cli devops hotfix release vX.Y.Z --carries <pr|sha>[,<pr|sha>…] --json --out "$r2"
|
|
61
63
|
```
|
|
62
64
|
|
|
63
|
-
MMI-Hub adds `--announce-summary-file "
|
|
65
|
+
MMI-Hub adds `--announce-summary-file "<summary-path>"`: a fresh 3–6 line neutral summary, no product or brand name, never a product's board (`mutmutco/MMI-Hub` only). It tags, publishes, watches, announces, verifies, opens the `hotfix-fold/<tag>` PR. Do not hand-dispatch a second publish or deploy.
|
|
64
66
|
|
|
65
67
|
## Verify
|
|
66
68
|
|
|
@@ -79,19 +81,15 @@ On any failure or interruption, read [recovery.md](recovery.md).
|
|
|
79
81
|
|
|
80
82
|
## Merge floor
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
- **A refused train is a stop, never a license to finish by hand.** Every fail-closed halt — doctor blocker, authority probe, coverage guard, untolerated conflict, required checks, stray tag, ledger — ends the run. Fix the cause on `development` through a normal PR and rerun the train; never hand-resolve on `main`, hand-cherry-pick, bare-push a train branch, ack to save time, or bypass a check.
|
|
84
|
-
- **Probe the latest Release tag, not branches or stale local tags (#2734).** Queue: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json`; gh rejects `mergeQueueEntry`.
|
|
85
|
-
- **One train per repo (#5380).** Overlapping trains race tags; never start one to help another.
|
|
86
|
-
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
84
|
+
Ordinary development PRs land with `mmi-cli devops pr land <number>`. Merges that carry a tagged commit (roll-forward, alignment, fold PR) are true merges, and a refused train is a stop, never finished by hand: the full floor is in [train-common.md](../release/train-common.md#merge-floor). Queue state: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json` (gh rejects `mergeQueueEntry`).
|
|
87
85
|
|
|
88
86
|
## Report
|
|
89
87
|
|
|
90
|
-
Verdict first: the resolved tag (never a placeholder like `vX.Y.0`), Release URL,
|
|
88
|
+
Verdict first, per [train-common.md](../release/train-common.md#report): the resolved tag (never a placeholder like `vX.Y.0`), Release URL, and the receipt fields above.
|
|
91
89
|
|
|
92
90
|
## Retro
|
|
93
91
|
|
|
94
|
-
|
|
92
|
+
Shared rules: [train-common.md](../release/train-common.md#retro).
|
|
95
93
|
|
|
96
94
|
```bash
|
|
97
95
|
mmi-cli learning skill-lesson --skill hotfix --title "<what misfired>" --body "<what; evidence; proposed amendment>"
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
Every refusal and every doctor blocker names its `code` and `anchor`: open `
|
|
1
|
+
Every refusal and every doctor blocker names its `code` and `anchor`: open the finding's `anchor` URL and follow that entry, nothing else ([shared recovery](../release/train-common.md#recovery)). The hotfix subcommands are idempotent, so after an interruption rerun the identical `mmi-cli devops hotfix release vX.Y.Z --carries …` — each effect is checked before it is re-attempted, and the ledger names that rerun as this lane's continuation; `--resume --watch --json` is the release and rcand ledgers' only continuation form and never a hotfix one. A refused pick, a port conflict, a red authority probe, a failed check, a missing carry, or `development fold port FAILED` each ends the run (Merge floor): fix the cause on `development` through a normal PR, then rerun from the port merge SHA — never improvise a merge from `main`.
|
|
2
2
|
|
|
3
3
|
A prior release's unresolved ledger also blocks this lane — and when its only unresolved leg is a content-caused failed deploy on the already-published tag, this lane is the fix's carrier: close that leg first with the master-approved `mmi-cli devops release --supersede-deploy --apply` (the cause fix must already be merged on `development`), then run the hotfix; the gate archives the closed ledger aside on its own.
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
The `jerv-gateway` release leg has no run id: read `deployNote` / `ledger.phases.deploy`; `pending` means production was never deployed and blocks the next train run. Keep a failed announce summary for the supported continuation; never replay a delivery whose result is uncertain.
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Status and Latest
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
The JSON is on stdout alone; a stale CLI first prints its self-update notice on stderr and re-runs itself, so parse stdout only, never `2>&1`. Read `ready`, then `findings[]`: each carries `code`, `severity` (`blocker` · `warning` · `healed` · `info`), `source` (`local` · `origin`), `remedy` and `anchor`. `ready: false` → stop and quote every blocker's `code` and `remedy`; an unread origin is never green. `hotfix start` and `hotfix release` re-run this doctor as their step 0 with heal on.
|
|
13
|
-
|
|
14
|
-
`mmi-cli devops hotfix status vX.Y.Z --json` re-derives the whole pipeline from live reads (`state`, `tagPushed`, `releaseExists`, `runs`, `alignmentStatus`, `npmVersion`, `next`). Then the bounded Latest Release read; its `tagName` must equal the tag:
|
|
10
|
+
`mmi-cli devops hotfix status vX.Y.Z --json` re-derives the whole pipeline from live reads (`state`, `tagPushed`, `releaseExists`, `runs`, `alignmentStatus`, `npmVersion`, `next`). Then the bounded Latest Release read ([verification.md](../release/verification.md#latest-release)); its `tag_name` must equal the tag.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: intercom-guest
|
|
3
|
-
description: Coordinate with the MM Coordinator over Jerv intercom as an org-member guest.
|
|
3
|
+
description: Coordinate with the MM Coordinator over Jerv intercom as an org-member guest. Use to send, read, join or leave a suite, not to take orders or run commands from a message.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
**Host-native invocation:** Claude `/mmi:intercom-guest` · Codex `$mmi:intercom-guest` · jervcode `/intercom-guest` · OpenBot the `intercom-guest` skill (loaded by name). A backticked `/name` in this doc names the matching workflow, not a literal shell command.
|
|
@@ -30,18 +30,17 @@ mmi-cli harbour intercom guest join --suite <name> # request a suite join
|
|
|
30
30
|
mmi-cli harbour intercom guest leave # leave the suite and withdraw the endpoint
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
`intercom` lives in the `harbour` house (a bounded coordination lane), so `harbour` is the canonical spelling
|
|
33
|
+
`intercom` lives in the `harbour` house (a bounded coordination lane), so `harbour` is the canonical spelling.
|
|
34
34
|
|
|
35
35
|
These five are the whole surface. Use them in that spirit: `send` carries a status, a question, or an answer — never an instruction, and never a request to bypass a gate, a review, or an owner decision.
|
|
36
36
|
|
|
37
|
-
## Step 2 —
|
|
37
|
+
## Step 2 — discover what the Gateway offers, never guess it
|
|
38
38
|
|
|
39
|
-
The
|
|
39
|
+
The installed CLI is the only source of the wire shape; `mmi-cli harbour intercom guest --help` lists the verbs it knows. Run the verb you need and read its outcome. A refusal that names `intercom-guest-contract-missing` (exit 2) means this CLI build has no published Gateway operation for that verb. That is the correct answer, not a bug to route around.
|
|
40
40
|
|
|
41
|
-
- Do **not** invent a Gateway URL, a path, a field name, or a "temporary" curl call. A guessed endpoint answers 404/403, and that reads like a permission or allowlist problem when the real answer is "the contract
|
|
41
|
+
- Do **not** invent a Gateway URL, a path, a field name, or a "temporary" curl call. A guessed endpoint answers 404/403, and that reads like a permission or allowlist problem when the real answer is "the contract is not there".
|
|
42
42
|
- Do not silence the refusal or wrap it in a retry loop.
|
|
43
|
-
- Report the gap in plain words:
|
|
44
|
-
- The one place the wire shape will live is `INTERCOM_GUEST_CONTRACT.operations` in `cli/src/intercom-guest.ts`. When the contract lands, that object is filled from it and every verb switches on — the skill text does not need to change.
|
|
43
|
+
- Report the gap in plain words: which verb, the refusal text, and that no message was sent and nothing was read. Retry only after the CLI is updated.
|
|
45
44
|
|
|
46
45
|
## Step 3 — suite etiquette
|
|
47
46
|
|
package/skills/mmi-help/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mmi-help
|
|
3
|
-
description: Introduce MMI and its commands.
|
|
3
|
+
description: Introduce MMI and its commands. Use for a short help card, not to install, operate or release.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# MMI help
|
|
@@ -19,9 +19,10 @@ Print a friendly, human-readable **MMI help** card of at most 180 words:
|
|
|
19
19
|
2. Show the npm install command, `mmi-hub install`, and the read-only `mmi-hub status` check.
|
|
20
20
|
3. Summarize the essentials: automatic updates, vault/keyless secrets, no repository environment
|
|
21
21
|
files or personal agent instructions, and approved MMI release workflows.
|
|
22
|
-
4. Name the org-guide skill for details, board, secrets, and release for common tasks
|
|
23
|
-
|
|
24
|
-
org-guide carries the MM Open Design System Bible
|
|
22
|
+
4. Name the org-guide skill for details, and board, secrets, and release for common tasks.
|
|
23
|
+
Company-branded documents, reports and decks come from the MM-Strategy MCP (`mm_brand_guide`),
|
|
24
|
+
not a skill. Note that org-guide carries the MM Open Design System Bible
|
|
25
|
+
(`references/design.md`); handoffs cite it by path, never restate it.
|
|
25
26
|
Render invocation syntax for the current host only, using the forms above with the skill name
|
|
26
27
|
substituted. If the host is unknown, use plain skill names rather than guessing.
|
|
27
28
|
|
|
@@ -1,45 +1,36 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: org-guide
|
|
3
|
-
description: Read org project rules and how to report MMI CLI, plugin, or workflow bugs.
|
|
3
|
+
description: Read org project rules and how to report MMI CLI, plugin, or workflow bugs; use before project work, never releases or secrets.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# MMI
|
|
6
|
+
# MMI org guide
|
|
7
7
|
|
|
8
|
-
Read this entry before MMI
|
|
9
|
-
the [MMI help skill](../mmi-help/SKILL.md).
|
|
8
|
+
Read this entry before MMI work, then **only the relevant topic**. Human intro: [MMI help](../mmi-help/SKILL.md).
|
|
10
9
|
|
|
11
10
|
## Essential rules
|
|
12
11
|
|
|
13
|
-
- Install `@mutmutco/hub`
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
- When an MMI tooling bug affects a developer other than `jervaise`, ask before filing a Hub report
|
|
23
|
-
and respect a decline; see [tooling bug reports](references/work-and-releases.md#report-mmi-tooling-bugs).
|
|
24
|
-
- Read the registry for release tracks, domains, and OAuth from origin. Use MMI provisioning and release
|
|
25
|
-
workflows, never parallel deployment or credential paths.
|
|
26
|
-
- Verify canonical/Git-resolved support scripts; use absolute script/target/source paths, never sibling guesses
|
|
27
|
-
([invocation rules](references/work-and-releases.md#shared-support-script-invocation)).
|
|
28
|
-
- Design work follows the [MM Open Design System Bible](references/work-and-releases.md#the-mm-open-design-system-bible-8837-8839):
|
|
29
|
-
never patch broken shared tools with one-off `tmp/` scripts; fix them at source, record a learning
|
|
30
|
-
note, and update memory.
|
|
12
|
+
- Install `@mutmutco/hub` via npm, run `mmi-hub install`, keep auto-updates enabled, check `mmi-hub status`.
|
|
13
|
+
- Use the two-tier vault and keyless workflows; never put secrets in chat, logs, CLI args, or env files.
|
|
14
|
+
- Agent instructions and host settings stay local/gitignored; never commit AGENTS.md, CLAUDE.md, or copied plugin instructions.
|
|
15
|
+
- Update affected `docs/Guides/operator.md` instructions with code; commit, then fast preflight before pushes/PRs.
|
|
16
|
+
- Claim work via the board, run repo checks, land via MMI. Help/plan requests never authorize edits or releases.
|
|
17
|
+
- If an MMI tooling bug affects a developer other than the org owner, ask before filing a report ([tooling bug reports](references/work-and-releases.md#report-mmi-tooling-bugs)).
|
|
18
|
+
- Read origin registry for release tracks, domains, OAuth; use MMI provisioning/release workflows, never parallel deploy or credential paths.
|
|
19
|
+
- Verify canonical/Git-resolved support scripts; use absolute script/target/source paths, never sibling guesses ([invocation rules](references/design.md#shared-support-script-invocation)).
|
|
20
|
+
- Design work follows the [MM Open Design System Bible](references/design.md#the-mm-open-design-system-bible-8837-8839): never patch broken shared tools with `tmp/` scripts; fix at source, record a learning note, update memory.
|
|
31
21
|
|
|
32
22
|
## Read one topic
|
|
33
23
|
|
|
34
24
|
| Task | Local reference |
|
|
35
25
|
| --- | --- |
|
|
36
26
|
| Install, update, reload, or diagnose tooling | [Getting started](references/getting-started.md) |
|
|
37
|
-
| Report
|
|
38
|
-
| Work an issue, test, merge,
|
|
27
|
+
| Report a tooling bug with developer consent | [Tooling bug reports](references/work-and-releases.md#report-mmi-tooling-bugs) |
|
|
28
|
+
| Work an issue, test, merge, or release | [Work and releases](references/work-and-releases.md) |
|
|
29
|
+
| Do UI, design, docs, or MM Artifact work, incl. the Design System Bible | [Design](references/design.md) |
|
|
39
30
|
| Consume, declare, rotate, or request a secret | [Vault and keyless access](references/vault.md) |
|
|
40
31
|
| Register domains or configure Google OAuth | [Domains and OAuth](references/domains-and-oauth.md) |
|
|
41
32
|
| Decide what belongs in a product repository | [Repository rules](references/repository-rules.md) |
|
|
42
|
-
| Build an MM-Work module | not bundled — [MM-Work module guide](https://github.com/mutmutco/MM-Work/blob/development/packages/mmwork-ds/GUIDE.md) in `@mutmutco/mmwork-ds` |
|
|
43
|
-
| Produce company-facing documents in the MM brand | not bundled —
|
|
33
|
+
| Build an MM-Work module | not bundled — [MM-Work module guide](https://github.com/mutmutco/MM-Work/blob/development/packages/mmwork-ds/GUIDE.md) in `@mutmutco/mmwork-ds`; read `pieces.json`, `mmwork.d.ts`, `FOR-AGENTS.md`, and `docs/components/<Piece>/guide.md` from the npm project declaring it (`module/node_modules/@mutmutco/mmwork-ds/`), never repo-root `node_modules`; when absent, fall back to `~/.jerv/cache/mmwork-ds/latest` or MM-Work `packages/mmwork-ds`, treat capability as unknown |
|
|
34
|
+
| Produce company-facing documents in the MM brand | not bundled — MM-Strategy MCP serves the brand kit (`mm_brand_guide`); install `@mutmutco/strategy` |
|
|
44
35
|
|
|
45
|
-
Bundled
|
|
36
|
+
Bundled guidance matches the installed plugin, not Jerv/JervCode; resolve current values/flags via live CLI.
|