@mutmutco/opencode-mmi 2.48.0
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/dist/index.d.ts +35 -0
- package/dist/index.js +194 -0
- package/package.json +44 -0
- package/skills/_shared/doctrine.md +238 -0
- package/skills/bootstrap/SKILL.md +419 -0
- package/skills/bootstrap/seeds/Dockerfile.template +25 -0
- package/skills/bootstrap/seeds/README.template.md +36 -0
- package/skills/bootstrap/seeds/architecture.template.md +19 -0
- package/skills/bootstrap/seeds/components.json.template +31 -0
- package/skills/bootstrap/seeds/cursor-environment.template.json +3 -0
- package/skills/bootstrap/seeds/cursor-rules.template.mdc +11 -0
- package/skills/bootstrap/seeds/design-system.paths.template.json +8 -0
- package/skills/bootstrap/seeds/docker-compose.template.yml +17 -0
- package/skills/bootstrap/seeds/gate.template.yml +42 -0
- package/skills/bootstrap/seeds/google-login.template.md +35 -0
- package/skills/bootstrap/seeds/manifest.json +32 -0
- package/skills/bootstrap/seeds/mcp-playwright.template.json +13 -0
- package/skills/bootstrap/seeds/mmi-product-required-checks.template.json +23 -0
- package/skills/browser-automation/SKILL.md +137 -0
- package/skills/build/SKILL.md +237 -0
- package/skills/build/references/halt-report.md +38 -0
- package/skills/build/references/loops.md +13 -0
- package/skills/build/references/worked-example.md +18 -0
- package/skills/build/templates/campaign-northstar.md +40 -0
- package/skills/coop/SKILL.md +77 -0
- package/skills/grind/SKILL.md +469 -0
- package/skills/grind/references/auto.md +107 -0
- package/skills/grind/references/build-notes.md +56 -0
- package/skills/grind/references/routing.md +76 -0
- package/skills/grind/references/verify.md +83 -0
- package/skills/grind/templates/saga-snapshot.md +28 -0
- package/skills/grind/templates/synthesize-panel.md +104 -0
- package/skills/handoff/SKILL.md +67 -0
- package/skills/hotfix/SKILL.md +219 -0
- package/skills/mmi/SKILL.md +372 -0
- package/skills/rcand/SKILL.md +169 -0
- package/skills/release/SKILL.md +309 -0
- package/skills/secrets/SKILL.md +137 -0
- package/skills/stage/SKILL.md +150 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hotfix
|
|
3
|
+
description: Emergency PATCH to main + prod by cherry-picking a fix that already landed on development — pick to a hotfix branch, merge to main, tag vX.Y.Z, prod-deploy. No back-merge; rc absorbs it at the next /rcand. Train-authority gated (Hub train master-only). Use when an authorized user needs an urgent production fix, a hotfix or emergency patch to main, or invokes /hotfix.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /hotfix — promote a development fix to main + prod, fast
|
|
7
|
+
|
|
8
|
+
A hotfix is **promotion, not authoring**: the fix lands on `development` first via a normal PR, then
|
|
9
|
+
`/hotfix` cherry-picks exactly those commits onto `main`, tags `vX.Y.Z`, and deploys prod. One train,
|
|
10
|
+
one origin. **There is no back-merge**: `development` already has the code by construction, and `rc`
|
|
11
|
+
absorbs the fix at the next `/rcand`. A release cut from a stale rc is blocked by the `/release`
|
|
12
|
+
hotfix-coverage guard (built into `mmi-cli release`), so the fix cannot be silently reverted.
|
|
13
|
+
**Train-authority gated (D14)** — verify with `mmi-cli access role {owner}/{repo} --json` (fail
|
|
14
|
+
closed; the Hub repo is master-only); prod change → the authorized human's explicit per-turn go.
|
|
15
|
+
PATCH-level only — cherry-pick promotion makes it tempting to rush a feature to prod; don't.
|
|
16
|
+
|
|
17
|
+
## Step 0 — the fix lands on development first (precondition)
|
|
18
|
+
|
|
19
|
+
The fix is authored, reviewed, and merged on `development` like any other change — normal PR, normal
|
|
20
|
+
gate, normal issue auto-close and board automation. **Never author the fix on a branch off `main`.**
|
|
21
|
+
If `main` has diverged and the dev fix doesn't apply cleanly, the port happens during the cherry-pick
|
|
22
|
+
(Step 1) — `development` stays the single origin of every fix.
|
|
23
|
+
|
|
24
|
+
Record the dev-side SHA(s) to promote — for a squash-merged PR that's one commit:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
git fetch origin
|
|
28
|
+
FIX=$(gh pr view <dev-pr-number> --json mergeCommit --jq .mergeCommit.oid)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Step 1 — branch from main, cherry-pick with -x (the audit trail)
|
|
32
|
+
|
|
33
|
+
Precondition: a clean working tree — the branch + cherry-pick + dist bump won't run dirty. Like the other
|
|
34
|
+
train commands, the clean-tree check rejects UNTRACKED scratch too, not just modified tracked files — if it
|
|
35
|
+
stops with `working tree must be clean before …`, run `git status` and gitignore the `??` scratch (or move it
|
|
36
|
+
to a gitignored path like `tmp/`) (#1472).
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
git checkout -b hotfix/vX.Y.Z origin/main
|
|
40
|
+
git cherry-pick -x "$FIX" # repeat per commit, oldest first, if promoting more than one
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**`-x` is mandatory, not cosmetic.** It records `(cherry picked from commit <sha>)` in each commit
|
|
44
|
+
message; the `/release` hotfix-coverage guard reads that trailer to prove — by dev-SHA ancestry, immune
|
|
45
|
+
to conflict-resolved diffs — that the fix is in the release candidate. A pick without `-x` degrades the
|
|
46
|
+
guard to a diff (patch-id) comparison, which a conflicted port breaks.
|
|
47
|
+
|
|
48
|
+
Conflict on the pick → resolve it **here, on the hotfix branch**: port the fix's intent to `main`'s
|
|
49
|
+
code. Never "fix forward" on main with new logic that dev doesn't have — if the port changes behavior,
|
|
50
|
+
land that change on `development` first and re-pick.
|
|
51
|
+
|
|
52
|
+
## Step 2 — verify
|
|
53
|
+
|
|
54
|
+
Run the gate green locally on the hotfix branch. The pick must prove itself against `main`'s code, not
|
|
55
|
+
just dev's — the dev PR's test rides along in the cherry-pick; make sure it passes here too.
|
|
56
|
+
|
|
57
|
+
### Step 2a — verify panel (compressed, always Paranoid)
|
|
58
|
+
|
|
59
|
+
After local checks pass, run a **compressed Paranoid panel** on the cherry-pick diff — same
|
|
60
|
+
fresh-eyes discipline as `/grind`, scoped for surgical prod promotion:
|
|
61
|
+
|
|
62
|
+
1. **Panel** (parallel, verifier tier): `security` + `correctness` (each **double-pass**) +
|
|
63
|
+
**tests-actually-test** — do the picked/adjusted tests prove the fix on `main`'s code?
|
|
64
|
+
2. **Synthesize** → `PanelReport` per `skills/grind/templates/synthesize-panel.md`.
|
|
65
|
+
3. **Gate:** `PanelReport.blockers` must be empty. Cap **2** panel rounds — on cap, stop and
|
|
66
|
+
report; do not open the Step 3 PR.
|
|
67
|
+
|
|
68
|
+
Pin verifiers to the verbatim diff — never builder/session context. No `--explore`, no WIP hand-off
|
|
69
|
+
path on this panel.
|
|
70
|
+
|
|
71
|
+
## Step 2b — bump the distribution (Hub only, unconditional)
|
|
72
|
+
|
|
73
|
+
Only in the repo that hosts the org plugin set (`.claude-plugin/marketplace.json` and
|
|
74
|
+
`.agents/plugins/marketplace.json` present). The Claude marketplace `source` is pinned to `ref: main`,
|
|
75
|
+
and the Codex marketplace is refreshed from this repo, so the hotfix ships its PATCH version across the
|
|
76
|
+
whole set — spine dogfood (`scripts/spine-dogfood.mjs`), Claude/Codex/Cursor plugin manifests, OpenCode adapter,
|
|
77
|
+
standalone npm packages, and the committed CLI bundle — **every time, changed or not** (#976; `mmi-cli hotfix start` does
|
|
78
|
+
exactly this). Stage exactly the files the helper updated — `changed-files` prints them, so the list can't go
|
|
79
|
+
stale:
|
|
80
|
+
```bash
|
|
81
|
+
VER=$(node scripts/next-version.mjs hotfix); VER=${VER#v} # X.Y.Z for this hotfix
|
|
82
|
+
node scripts/release-distribution.mjs prepare "$VER"
|
|
83
|
+
git commit -m "[hotfix] publish mmi tooling $VER" -- $(node scripts/release-distribution.mjs changed-files)
|
|
84
|
+
```
|
|
85
|
+
This bump commit is `main`-side version metadata — the hotfix-coverage guard exempts it (it touches
|
|
86
|
+
only the distribution manifest set), so it needs no dev twin to pass `/release`. Non-Hub repos skip
|
|
87
|
+
this step (no plugin to publish); their release version fold happens at the next `/release`.
|
|
88
|
+
|
|
89
|
+
## Step 3 — land on main via PR (the gate)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git push -u origin hotfix/vX.Y.Z
|
|
93
|
+
gh pr create --base main --title "[hotfix] vX.Y.Z — <summary>" --body "Promotes <dev-pr-or-sha> from development. ..."
|
|
94
|
+
mmi-cli pr merge <number> --squash # rejected if you're not an admin/bypass actor — that's the gate
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
> **Squash caveat:** squashing the hotfix PR collapses the picked commits into one fresh commit, and the
|
|
98
|
+
> `(cherry picked from commit …)` trailers survive only if they ride into the squash message. Verify the
|
|
99
|
+
> merged commit on `main` still carries the trailer (`git log -1 origin/main`); if it was lost, re-state
|
|
100
|
+
> it in the squash message — otherwise the `/release` guard falls back to patch-id and a conflicted port
|
|
101
|
+
> will need an explicit human ack.
|
|
102
|
+
|
|
103
|
+
Because Hub's default branch is `development`, the `main` hotfix PR closes nothing — and in this flow it
|
|
104
|
+
*shouldn't*: the work item already closed when the fix merged to `development`. If a separate
|
|
105
|
+
hotfix-tracking issue exists, close it explicitly:
|
|
106
|
+
`gh issue close <issue-number> --comment "Promoted to main via hotfix PR #<pr-number>; tagging vX.Y.Z next."`
|
|
107
|
+
|
|
108
|
+
## Step 3b — a fix found mid-hotfix (continuation branch)
|
|
109
|
+
|
|
110
|
+
A friction or bug surfaced *while* the hotfix is in flight follows the same one-origin rule — it does not
|
|
111
|
+
get patched onto the hotfix branch directly:
|
|
112
|
+
|
|
113
|
+
1. Land the fix on `development` via a normal PR (its own work item, its own gate).
|
|
114
|
+
2. Cherry-pick it with `-x` onto a **continuation branch** `hotfix/vX.Y.Z-<slug>` cut from `origin/main`
|
|
115
|
+
— one branch per fix, `<slug>` naming the fix (e.g. `hotfix/v2.20.1-train-gate`).
|
|
116
|
+
3. Verify (Step 2), bump the distribution if Hub (Step 2b), then merge it to `main` via PR (Step 3) — with
|
|
117
|
+
the `(cherry picked from commit …)` trailer preserved in the squash message, same caveat as above.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
git fetch origin main && git switch -c hotfix/vX.Y.Z-<slug> origin/main
|
|
121
|
+
git cherry-pick -x <dev-sha>
|
|
122
|
+
git push -u origin hotfix/vX.Y.Z-<slug>
|
|
123
|
+
gh pr create --base main --title "[hotfix] vX.Y.Z — <fix summary>" --body "Continuation pick of <dev-pr-or-sha>."
|
|
124
|
+
mmi-cli pr merge <number> --squash
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`mmi-cli hotfix release` matches both `hotfix/vX.Y.Z` and `hotfix/vX.Y.Z-*` heads and pins the **newest
|
|
128
|
+
merged** PR for the tag, so every continuation pick ships in `vX.Y.Z`. Re-run the Step 2b
|
|
129
|
+
release-distribution prepare on each continuation (usually byte-identical) so the bump rides whichever
|
|
130
|
+
branch ends up newest.
|
|
131
|
+
|
|
132
|
+
## Step 4 — tag + prod deploy + Release
|
|
133
|
+
|
|
134
|
+
`mmi-cli hotfix release vX.Y.Z` runs this step for **hub-serverless** (MMI-Hub) and **tenant-container**
|
|
135
|
+
(and **solo-container**) repos — it branches on `deployModel` from the Hub registry. For other models the
|
|
136
|
+
orchestrator tags + creates the GitHub Release but does not dispatch a central deploy (follow the repo's
|
|
137
|
+
own prod path). Manual fallback below when not using the orchestrator:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
git fetch origin
|
|
141
|
+
TAG=$(node scripts/next-version.mjs hotfix) # -> vX.Y.(Z+1)
|
|
142
|
+
git tag "$TAG" origin/main
|
|
143
|
+
git push origin "$TAG"
|
|
144
|
+
gh release create "$TAG" --target main --generate-notes --latest
|
|
145
|
+
git merge-base --is-ancestor "$TAG^{commit}" origin/main && echo "tag is on main"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
> Hub `deploy.yml` requires `target_commitish == "main"` for prod deploy (#1400). Use `--target main`
|
|
149
|
+
> (not a commit SHA) — the tag still pins the release artifact. `mmi-cli hotfix release` passes
|
|
150
|
+
> `--target main` automatically; manual fallback must match.
|
|
151
|
+
|
|
152
|
+
**Hub hotfixes announce to Slack (#883).** Hub scope is **only** `mutmutco/MMI-Hub` — never another repo's
|
|
153
|
+
board, `ds-propagate.yml`, or product design-system state. Resolve the real tag (`TAG=$(node scripts/next-version.mjs hotfix)`)
|
|
154
|
+
and print `$TAG` in summaries and reports — never a placeholder.
|
|
155
|
+
|
|
156
|
+
For MMI-Hub, write a curated summary — 2-4 very short plain lines, one change per line, dev-readable,
|
|
157
|
+
in neutral Hub-subsystem terms — **never** a product or brand name (FoFu, Katip, etc.) in the summary,
|
|
158
|
+
Slack post, chat, or report — to a fresh temp file (`f=$(mktemp tmp/release-summary.XXXXXX)`, so a stale
|
|
159
|
+
prior summary is never reused), then run the orchestrator with it:
|
|
160
|
+
`mmi-cli hotfix release "$TAG" --announce-summary-file "$f"`. After the Release is created, the CLI posts
|
|
161
|
+
the summary to the org alerts channel as the MMI-Future Slack app (token + channel from SSM at run time);
|
|
162
|
+
without the file it distills the generated notes (product brands are stripped there too). Best-effort only —
|
|
163
|
+
a Slack failure never fails the hotfix, and a resumed (already-existing) Release does not re-announce.
|
|
164
|
+
|
|
165
|
+
For `tenant-container` repos, dispatch the Hub central deployer and watch the exact run:
|
|
166
|
+
```bash
|
|
167
|
+
gh workflow run tenant-deploy.yml --repo mutmutco/MMI-Hub \
|
|
168
|
+
-f slug={slug} -f repo={owner}/{repo} -f ref=main -f stage=main
|
|
169
|
+
gh run watch "$(gh run list --repo mutmutco/MMI-Hub --workflow tenant-deploy.yml --limit 1 --json databaseId -q '.[0].databaseId')" \
|
|
170
|
+
--exit-status
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
For `hub-serverless` (MMI-Hub), the Release event auto-fires `deploy.yml` for prod and `publish.yml` for
|
|
174
|
+
the plugin/CLI/OpenCode npm packages. Do **not** dispatch `tenant-deploy.yml`; watch the release-triggered runs instead:
|
|
175
|
+
```bash
|
|
176
|
+
gh run watch "$(gh run list --workflow deploy.yml --event release --limit 1 --json databaseId -q '.[0].databaseId')" --exit-status
|
|
177
|
+
gh run watch "$(gh run list --workflow publish.yml --event release --limit 1 --json databaseId -q '.[0].databaseId')" --exit-status
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
node scripts/release-distribution.mjs publish "$TAG" # Hub only — manual fallback when publish.yml could not ship npm
|
|
182
|
+
npm exec --package @mutmutco/cli -- mmi-cli --version
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Any follow-up `release-distribution.mjs verify "$TAG"` must run from a checkout **at the tag** (`git
|
|
186
|
+
checkout "$TAG"`, or a worktree at the tag) — verify checks the working tree and refuses any other
|
|
187
|
+
commit once the tag exists, so a `development` checkout that hasn't seen the bump can't masquerade as a
|
|
188
|
+
broken release.
|
|
189
|
+
|
|
190
|
+
## Step 5 — no residue — NOT a back-merge, NOT a forward bump
|
|
191
|
+
|
|
192
|
+
`development` already has the fix (Step 0), so **no branch merges back** — and nothing else needs to
|
|
193
|
+
happen either (#976). Tags are repo-global, so `next-version.mjs` sees `vX.Y.Z` from any branch — version
|
|
194
|
+
math doesn't drift. The version manifests Step 2b bumped on `main` stay `main`-only by design:
|
|
195
|
+
`development` sitting behind on manifests is the steady state, and the next `/release` re-aligns it
|
|
196
|
+
structurally (its version fold rewrites the manifests on the release commit; its back-merge carries them
|
|
197
|
+
to `development`). Never open a manifest-alignment PR against `development`.
|
|
198
|
+
|
|
199
|
+
`rc` is **never touched**: it gets the fix from `development` at the next `/rcand`. The `/release`
|
|
200
|
+
hotfix-coverage guard (fail closed) blocks any candidate that misses a prod hotfix, so "untouched" can't
|
|
201
|
+
become "reverted".
|
|
202
|
+
|
|
203
|
+
## Step 6 — report
|
|
204
|
+
|
|
205
|
+
`vX.Y.Z` + Release URL · prod deploy run + URL · per-branch verification, not merge ceremony:
|
|
206
|
+
- `main`: tag SHA is on `origin/main` (`merge-base --is-ancestor` from Step 4).
|
|
207
|
+
- `development`: the promoted dev SHA(s) — already ancestors by construction; cite the dev PR.
|
|
208
|
+
- `rc`: untouched by design; note that `/release` enforces coverage automatically inside `mmi-cli release`.
|
|
209
|
+
- Any hotfix-tracking issue explicitly closed in Step 3 (the `main` PR can't auto-close — the repo
|
|
210
|
+
default branch is `development`).
|
|
211
|
+
|
|
212
|
+
## Retro — one check before you finish
|
|
213
|
+
Before your final report, answer one question honestly: did **this skill's own instructions** misfire
|
|
214
|
+
this run — ambiguous wording, a misleading message, or an environment failure it should have warned
|
|
215
|
+
about? (Process only — never the user's code or task; e.g. a misleading authority or gate message, or an
|
|
216
|
+
ambiguous cherry-pick or no-back-merge step.) If yes, file **one** lesson and move on; a clean run is
|
|
217
|
+
silent (hard cap: one per run). It lands on the Hub board (deduped) and is fixed only via a reviewed PR —
|
|
218
|
+
never edit the skill live; the retro is advisory, so if the call fails, note it and continue:
|
|
219
|
+
`mmi-cli skill-lesson --skill hotfix --title "<what misfired>" --body "<what; evidence; proposed amendment>"`
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mmi
|
|
3
|
+
description: Your work board — shows your assigned + claimable work (and what others have claimed) on this repo's GitHub Project, and helps you continue, claim, advance, or file an item. Use when a dev starts work, asks what to work on, what's assigned or claimable, wants to claim or advance an item, file a bug or feature, asks "what's on my board", or invokes /mmi.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /mmi — start of work
|
|
7
|
+
|
|
8
|
+
Shows a dev their workboard for this repo: what they're working on, what's free to pick up, and what others
|
|
9
|
+
have claimed. Read-only by default — render the board, then get out of the way.
|
|
10
|
+
|
|
11
|
+
Status values: `Todo · In Progress · In Review · Done` (GitHub enforces who can move what — don't re-explain
|
|
12
|
+
it on every move). Closed/finished items auto-archive after they go quiet; archived ones aren't on the board.
|
|
13
|
+
|
|
14
|
+
## Step 0 — identity, greet, eager preflight when stale
|
|
15
|
+
|
|
16
|
+
`/mmi` is the dev's hello-to-work — the most common command they run. Three pacing rules before anything else:
|
|
17
|
+
|
|
18
|
+
1. **Resolve login, then greet immediately** (before `board read` or doctor — still the first lines in
|
|
19
|
+
the response so the dev never stares at silent tool output). One emoji max in the whole response.
|
|
20
|
+
The greeting addresses the dev, never claims to *be* them (not "I'm @<login>"):
|
|
21
|
+
- **SessionStart banner** — if context carries `current human: <login>`, use that login.
|
|
22
|
+
- **Else** one fast call: `mmi-cli whoami --json` (cached Hub session in `hub-session.json` when
|
|
23
|
+
valid — no network; `gh` fallback only when the cache lacks `login`; exit 0 on `unknown`). Do
|
|
24
|
+
**not** call `gh api user` separately — `whoami` already covers it. Do **not** wait on `board read`
|
|
25
|
+
for identity — `viewer` is for work items only (Step 1).
|
|
26
|
+
- Known login → `👋 Welcome back, @<login> — pulling up your board…`
|
|
27
|
+
- `source: unknown` → generic `👋 Welcome back — pulling up your board…`
|
|
28
|
+
2. **Run doctor preflight synchronously before `board read` when a heal may be needed (#1871).** A healthy
|
|
29
|
+
setup stays **completely silent and fast** — no background task, no "setup looks good" line. When the
|
|
30
|
+
CLI or plugin is behind, the dev must see the wait **up front**, not after a silent multi-minute gap.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
mmi-cli doctor --preflight # silent when healthy; upfront ↻ notice + eager heal when version/plugin update needed
|
|
34
|
+
mmi-cli board read --json # Step 1 — only after preflight (or greet-first on the all-green path)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`doctor --preflight` detects a stale npm global, plugin clone, or installed-plugin record and runs the
|
|
38
|
+
same self-heal as interactive `doctor` — but prints `↻ Updating mmi tooling, one moment…` **before** the
|
|
39
|
+
wait and a clear `↻ MMI tooling updated — …` line when done (reload/restart guidance included). A behind
|
|
40
|
+
npm global runs `npm install -g @mutmutco/cli@latest` (effective next invocation); a behind plugin clone
|
|
41
|
+
fast-forwards (effective next session). On a Claude surface it also self-heals a **stale or duplicate
|
|
42
|
+
installed plugin** — it drives `claude plugin marketplace remove mmi` → `claude plugin marketplace remove
|
|
43
|
+
mutmutco` → `claude plugin marketplace add mutmutco/MMI-Hub` → `claude plugin install mmi@mutmutco` (a
|
|
44
|
+
fresh reinstall, never `claude plugin update`, which nests into itself past MAX_PATH on Windows and wipes
|
|
45
|
+
the marketplace clone, #1126), collapses duplicate `mmi@mutmutco` rows in
|
|
46
|
+
`~/.claude/plugins/installed_plugins.json` to one user-scope entry, and quarantines stale MMI-only cache
|
|
47
|
+
dirs under Claude/Codex plugin caches while preserving the active/released version. Plugin updates still
|
|
48
|
+
take effect after a reload: **restart Claude Code / run `/reload-plugins`** (native), or **reopen the
|
|
49
|
+
workspace** (VS Code extension).
|
|
50
|
+
|
|
51
|
+
- **All green** → `doctor --preflight` prints nothing; proceed straight to `board read`.
|
|
52
|
+
- **Stale tooling** → relay the `↻` lines from stderr to the dev, then `board read`.
|
|
53
|
+
- **`mmi-cli: command not found`** → plugin PATH provisioning has not applied, or the standalone CLI is not installed.
|
|
54
|
+
In Claude Code, reopen the session; if it persists, install the MMI plugin:
|
|
55
|
+
`/plugin marketplace add mutmutco/MMI-Hub` → `/plugin install mmi@mutmutco` → `/reload-plugins`.
|
|
56
|
+
In Codex, install the plugin from the configured marketplace at the released `main` ref (the
|
|
57
|
+
marketplace default branch can lag the release — #1458):
|
|
58
|
+
`codex plugin marketplace add mutmutco/MMI-Hub --ref main` if missing → `codex plugin add mmi@mutmutco`.
|
|
59
|
+
For editor-agnostic access, install the standalone CLI:
|
|
60
|
+
```powershell
|
|
61
|
+
npm install -g @mutmutco/cli
|
|
62
|
+
```
|
|
63
|
+
In PowerShell from an `MMI-Hub` checkout, or when diagnosing a stale plugin cache, use the repo-local fallback:
|
|
64
|
+
```powershell
|
|
65
|
+
node cli/dist/index.cjs doctor --json
|
|
66
|
+
```
|
|
67
|
+
- **Slash commands disappeared — `/mmi` (or any `/…`) shows nothing** → the plugin is stale, duplicated, or
|
|
68
|
+
disabled, so the command surface is gone and you can't reach a slash recovery command. Recover from the
|
|
69
|
+
shell with the repo-local doctor, which detects and (on a Claude surface) self-heals it:
|
|
70
|
+
```powershell
|
|
71
|
+
node cli/dist/index.cjs doctor # from an MMI-Hub checkout — auto-heals + prints the reload action
|
|
72
|
+
```
|
|
73
|
+
If `claude` isn't on PATH for the auto-heal, run the surface-correct commands by hand (never `/plugin` in
|
|
74
|
+
VS Code — it isn't an updateable path there):
|
|
75
|
+
```bash
|
|
76
|
+
# Claude Code (native or VS Code extension)
|
|
77
|
+
claude plugin marketplace remove mmi && claude plugin marketplace remove mutmutco && claude plugin marketplace add mutmutco/MMI-Hub && claude plugin install mmi@mutmutco
|
|
78
|
+
# then: restart Claude Code / run /reload-plugins (VS Code: reopen the workspace)
|
|
79
|
+
|
|
80
|
+
# Codex — pin --ref main: the marketplace default branch can lag the released plugin (#1458),
|
|
81
|
+
# so `marketplace upgrade` reinstalls the stale build. Remove → re-add at main → add reinstalls clean.
|
|
82
|
+
codex plugin marketplace remove mmi && codex plugin marketplace remove mutmutco && codex plugin marketplace add mutmutco/MMI-Hub --ref main && codex plugin add mmi@mutmutco # then restart Codex
|
|
83
|
+
|
|
84
|
+
# Cursor — no per-user CLI; refresh the Team Marketplace from the IDE:
|
|
85
|
+
# Cursor Dashboard → Settings → Plugins → Update next to the MMI Team Marketplace, then restart Cursor
|
|
86
|
+
```
|
|
87
|
+
- **A gate is ✗** → walk them through the printed fix; don't just echo it:
|
|
88
|
+
- **GitHub auth** (the usual one) — the saga *and* the board both use their `gh` token. Give them the
|
|
89
|
+
command to run **in their own terminal** (the browser step is theirs — an agent can't log in as them):
|
|
90
|
+
```bash
|
|
91
|
+
gh auth login --hostname github.com --git-protocol https --web --scopes "project"
|
|
92
|
+
```
|
|
93
|
+
The `project` scope is what lets `/mmi` read + move the board, granted here once. When they're back,
|
|
94
|
+
re-run `mmi-cli doctor` to confirm green.
|
|
95
|
+
- **Hub registry / board META** — `mmi-cli project get <owner/repo>` or `mmi-cli board read` reports
|
|
96
|
+
missing project/board coords → a master-admin registers or backfills the repo's `PROJECT#<slug>` META.
|
|
97
|
+
There's no reliable project to read until that is fixed, so stop here.
|
|
98
|
+
|
|
99
|
+
A broken setup surfaces from `doctor --preflight`, a failed `board read`, or a gate that still fails after
|
|
100
|
+
heal — handle it then. A `command not found` from **either** command routes into the recovery paths above.
|
|
101
|
+
Don't block the all-green path on doctor noise.
|
|
102
|
+
|
|
103
|
+
## Authority (org-wide)
|
|
104
|
+
|
|
105
|
+
`/mmi` is the usual session start — agents should know the dev's role before any later train, vault, or
|
|
106
|
+
tenant request surfaces. After the board read (Step 1), you already have `viewer` in the JSON; for train
|
|
107
|
+
authority on this or another repo, run:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
mmi-cli access role <owner/repo> --json # { role, train } — Hub-verified from registry projectAdmins
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
When `role` is `project-admin` and `train` is true on **that** repo, the dev holds D14 authority there —
|
|
114
|
+
guide or execute via the matching skill (`/secrets`, `/rcand`, `/release`, `/hotfix`, `tenant control`).
|
|
115
|
+
**Do not** redirect them to the master. Hub train is master-only; org-tier vault and access grants stay
|
|
116
|
+
master-only. Full matrix: `AGENTS.md` § Authority.
|
|
117
|
+
|
|
118
|
+
## Config
|
|
119
|
+
|
|
120
|
+
The project this repo is on lives in the Hub registry (`PROJECT#<slug>`: `projectOwner`, `projectNumber`,
|
|
121
|
+
`projectId`, `statusFieldId`, `statusOptions{}`, and optional Priority field ids), set by `/bootstrap`
|
|
122
|
+
(repos and projects are not 1:1 — a repo attaches to a chosen project). Refresh the registry META if a
|
|
123
|
+
lookup misses; do not read or repair committed repo-local board config.
|
|
124
|
+
|
|
125
|
+
## Step 1 — read the board (one call, caller-scoped)
|
|
126
|
+
|
|
127
|
+
SessionStart injects a **bounded board slice** (assigned + top claimable items, max five lines,
|
|
128
|
+
3s timeout, fail-soft) and, when task relevance is high-confidence, up to **two North Star context
|
|
129
|
+
cards** (title + compact intent, PRIOR-not-instruction framing — silent when ambiguous). For the
|
|
130
|
+
complete partition — secondary repos, taken items, bundle details — run the full command below.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
mmi-cli board read --json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
This is the **only foreground call** on the happy path for **work items** (not identity — Step 0 already
|
|
137
|
+
resolved login). Its JSON carries `viewer`, `repo`, and the project title — do **not** run separate
|
|
138
|
+
`gh api user` / `gh repo view` calls; they just delay the board. If `repo` is missing from the JSON,
|
|
139
|
+
keep the board header generic. The CLI resolves the project from the Hub registry; to inspect it
|
|
140
|
+
directly, `mmi-cli project get --json`.
|
|
141
|
+
|
|
142
|
+
Use the returned `primary` group for current-repo items and `secondary` for other repos on the same Project.
|
|
143
|
+
Within each group, render `userOwned`, `claimable`, and `taken`.
|
|
144
|
+
|
|
145
|
+
CLI partition:
|
|
146
|
+
- **Yours** — assignee includes the viewer AND `Status ∈ {Todo, In Progress, In Review}`.
|
|
147
|
+
- **Free to claim** — `Status == Todo` AND unassigned AND the viewer has repo write permission
|
|
148
|
+
(`repos/<owner>/<repo>.permissions.push == true`). Issue filing stays available to any authenticated
|
|
149
|
+
org member; claiming work is gated by write access.
|
|
150
|
+
- **Taken** — assigned to someone else (any active status). Render id + status + owner ONLY — no title.
|
|
151
|
+
|
|
152
|
+
Do not cache claimable state. Every `/mmi` board is a fresh Project v2 read. Partial reads exit nonzero by
|
|
153
|
+
default; use `--allow-partial` only when the dev explicitly accepts an incomplete board. If the read fails
|
|
154
|
+
for a missing `read:project` scope, surface that verbatim — the dev grants it once at `gh auth login`.
|
|
155
|
+
|
|
156
|
+
## Step 2 — show the board
|
|
157
|
+
|
|
158
|
+
This render is the product: welcoming, guiding, clear — and gone in one glance. Plain **markdown**,
|
|
159
|
+
never a fenced code block (monospace hard-wraps long titles and the structure is lost). The shape:
|
|
160
|
+
|
|
161
|
+
- **Short refs.** `[RepoName#N](issue-url) · short title` — repo name + number only, no `owner/`
|
|
162
|
+
prefix, no `[type]` brackets. The ref is the clickable link; the title follows after `·`, trimmed
|
|
163
|
+
to its essence (drop boilerplate prefixes, keep it under ~8 words).
|
|
164
|
+
- **Flat `-` lists** under bold head lines — never `##` headings (too heavy for a three-section
|
|
165
|
+
board), never nested bullet trees, never tables, never a literal `•` glyph (it breaks GFM list
|
|
166
|
+
parsing).
|
|
167
|
+
- **Three heads, each with one factual clause** appended after an em dash — a fact the dev can act
|
|
168
|
+
on ("two train fixes in flight"), not cheerleading. Encouragement lives once, in the close.
|
|
169
|
+
- **On your plate** — the dev's items, status noted inline after the title (`· in review`) when
|
|
170
|
+
not In Progress. In Review means *awaiting admin review & merge* — caption it that way, never
|
|
171
|
+
"ready to move".
|
|
172
|
+
- **Up for grabs** — claimable items.
|
|
173
|
+
- **Taken** — id · status · owner ONLY, never the title. No commentary clause; it's reference.
|
|
174
|
+
- **Skip empty sections silently** — no "nothing here" filler. Empty board entirely → one warm line:
|
|
175
|
+
nothing assigned, point at Up for grabs or filing a new item.
|
|
176
|
+
- **Close with one grounding line** — no question, no hype, no pressure: `Pick one and claim it
|
|
177
|
+
when you're ready.` plus the standing quiet affordance `Or file a new item — say the word.`
|
|
178
|
+
- **One screen total.** Greeting + sections + optional Leverage (Step 6) + close.
|
|
179
|
+
|
|
180
|
+
Full example (greeting printed earlier, before the read):
|
|
181
|
+
|
|
182
|
+
> 👋 Welcome back, @dev — here's your board on **MMI-Hub**.
|
|
183
|
+
>
|
|
184
|
+
> **On your plate** — two train fixes in flight:
|
|
185
|
+
> - [MMI-Hub#834](https://github.com/mutmutco/MMI-Hub/issues/834) · automated hotfix apply path
|
|
186
|
+
> - [MMI-Hub#841](https://github.com/mutmutco/MMI-Hub/issues/841) · rcand stuck on required checks
|
|
187
|
+
>
|
|
188
|
+
> **Up for grabs** — ready when you are:
|
|
189
|
+
> - [MMI-Hub#821](https://github.com/mutmutco/MMI-Hub/issues/821) · redesign tenant env-writer
|
|
190
|
+
> - [MMI-Hub#839](https://github.com/mutmutco/MMI-Hub/issues/839) · revisit hotfix back-merge policy
|
|
191
|
+
>
|
|
192
|
+
> **Taken**
|
|
193
|
+
> - MMI-Hub#827 · In Progress · @otherdev
|
|
194
|
+
>
|
|
195
|
+
> **Leverage**
|
|
196
|
+
> - #834 and #841 are both train-lane — I can run them side by side, one PR each.
|
|
197
|
+
>
|
|
198
|
+
> Pick one and claim it when you're ready. Or file a new item — say the word.
|
|
199
|
+
|
|
200
|
+
Only an admin merges (a project-admin on their own project, the master-admin everywhere); the dev who
|
|
201
|
+
opened the PR waits on that review, they don't move it themselves.
|
|
202
|
+
|
|
203
|
+
## Step 3 — stop (act only on request)
|
|
204
|
+
|
|
205
|
+
Render the board and stop. Don't prompt for a choice, don't recommend a next move, don't ask "what now?".
|
|
206
|
+
The dev drives: when they say claim / continue / file — or accept a Leverage offer (Step 6) — do it.
|
|
207
|
+
Otherwise the board alone is the answer.
|
|
208
|
+
|
|
209
|
+
**Status moves happen automatically** as the work flows (claim, PR open, merge, release). The dev never
|
|
210
|
+
moves an item by hand, so **never suggest a status move** — not "advance to Test", not "mark this PR",
|
|
211
|
+
not "ready to move?". The board reflects state; it doesn't ask the dev to change it.
|
|
212
|
+
|
|
213
|
+
The one standing affordance is **filing a new item** — always available, no item needed. The Step 2
|
|
214
|
+
close line already carries it (`Or file a new item — say the word.`); never turn it into a status
|
|
215
|
+
nudge. If the dev takes it, run the guided flow in Step 5.
|
|
216
|
+
|
|
217
|
+
## Step 4 — load the full item before working it
|
|
218
|
+
|
|
219
|
+
The moment the dev commits to an item (continue or claim), read the **whole** work item before planning or
|
|
220
|
+
acting — never from the board title alone. Body **and every comment**, end-to-end; treat later comments as
|
|
221
|
+
potentially **superseding** the body. Only then greet into the work or propose a plan.
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# One shot — status, assignees, type, body, and every comment for one board item:
|
|
225
|
+
mmi-cli board show <owner/repo#N> # add --json for machine-readable output
|
|
226
|
+
```
|
|
227
|
+
Fallback for an item not on the board (or raw `gh`) — use `--json`, not `--comments`: in a non-TTY
|
|
228
|
+
shell (every agent/CI context) `gh issue view --comments` prints only the comments and hides the body,
|
|
229
|
+
and prints nothing at all on a zero-comment issue.
|
|
230
|
+
```bash
|
|
231
|
+
gh issue view <N> --repo <owner/repo> --json title,body,comments \
|
|
232
|
+
--jq '.title, .body, (.comments[] | "--- @\(.author.login):", .body)'
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
> **Never reach for standalone `jq`** — it isn't installed on Windows dev machines, so each attempt burns a
|
|
236
|
+
> failed call (#230). `mmi-cli board read|show` is already human-readable (drop `--json`); to parse JSON use
|
|
237
|
+
> `gh`'s **built-in** `--jq` (as above) or `mmi-cli … --json` piped to `node`.
|
|
238
|
+
|
|
239
|
+
(Triggers only when a dev commits to an existing item — no-op for the *report a bug / request a feature /
|
|
240
|
+
something else* paths.)
|
|
241
|
+
|
|
242
|
+
## Step 5 — act
|
|
243
|
+
|
|
244
|
+
- **Claim:** when the dev takes an item, assign them + set `In Progress` in one go. This is the only status
|
|
245
|
+
write `/mmi` makes, and only as the mechanical side of claiming — never as a standalone "move" the dev
|
|
246
|
+
is offered. Every later transition (In Review on PR open, Done on merge) flows automatically from the
|
|
247
|
+
work, not from here.
|
|
248
|
+
```bash
|
|
249
|
+
mmi-cli board claim <owner/repo#N> --json
|
|
250
|
+
```
|
|
251
|
+
The command validates `Todo` + unassigned, assigns the viewer, and moves the Project v2 `Status` to
|
|
252
|
+
`In Progress`. A partial claim exits nonzero unless the dev explicitly accepted `--allow-partial`.
|
|
253
|
+
Claiming several items (batch/parallel act-paths) takes them in **one call** — `board claim <ref> <ref> …`
|
|
254
|
+
— which shares the setup cost and reports per-item results (any per-item failure → nonzero exit).
|
|
255
|
+
- **File a new item (guided by type → template):** don't free-type an issue. Walk the dev through it:
|
|
256
|
+
1. **Pick the type** — `bug` · `feature` · `task` (the repo's three `.github/ISSUE_TEMPLATE/` forms;
|
|
257
|
+
each carries its own label). Offer the choice with the structured-question UI, one line each:
|
|
258
|
+
bug = something's broken · feature = new capability · task = chore/improvement.
|
|
259
|
+
2. **Fill that type's template.** Read its fields from `.github/ISSUE_TEMPLATE/<type>.yml` and gather
|
|
260
|
+
answers from the dev for each — draft where you can, ask where you can't (the template form is
|
|
261
|
+
interactive and won't drive in a non-TTY agent shell, so collect the fields, then create directly).
|
|
262
|
+
3. **Submit via `mmi-cli issue create`** — the canonical create path. It maps `--type` to the label,
|
|
263
|
+
requires `--priority` (which sets the board Priority **field**, never a `priority:*` label — #416),
|
|
264
|
+
prints `{number,url}` JSON, and fails loud on a misfire (never use
|
|
265
|
+
`gh issue create --json` — that
|
|
266
|
+
flag does not exist on `create`, errors, and silently misfires):
|
|
267
|
+
```bash
|
|
268
|
+
mmi-cli issue create --type <bug|feature|task> --title "<title>" --body "<filled template>" \
|
|
269
|
+
--priority <high|medium|low>
|
|
270
|
+
```
|
|
271
|
+
For long markdown, use `--body-file <path>` or pipe UTF-8 markdown with `--body-file -`; never fall
|
|
272
|
+
back to `gh issue create`.
|
|
273
|
+
The command starts bounded related-issue discovery off-path. It auto-comments only high-confidence,
|
|
274
|
+
idempotent links. To inspect candidates manually before writing anything else:
|
|
275
|
+
```bash
|
|
276
|
+
mmi-cli issue discover-related --repo <owner/repo> --number <number> --title "<title>" --body "<body>" --json
|
|
277
|
+
```
|
|
278
|
+
It lands on the board as Todo automatically — confirm the link from the JSON. (Templates differ per
|
|
279
|
+
repo; read the actual `.yml` set rather than assuming bug/feature/task.)
|
|
280
|
+
- **File a friction report (org-tooling pain):** `mmi-cli report --title "<one-line>" --body "<what hurt>"`
|
|
281
|
+
files it on the Hub board with your GitHub identity and dedups against the open reports (a confident
|
|
282
|
+
duplicate becomes a +1 comment, not a new issue). Never read Hub coordinates or keys from a repo-local
|
|
283
|
+
`.env`, call a repo-local report script, or POST the Hub API directly — the CLI carries the endpoint
|
|
284
|
+
and your `gh` identity intrinsically.
|
|
285
|
+
- Surface any `gh`/`mmi-cli` error verbatim.
|
|
286
|
+
|
|
287
|
+
## Step 6 — Leverage (offer where it fits)
|
|
288
|
+
|
|
289
|
+
`/mmi` is an agentic coding board — every item is written by an LLM agent, so the board can do more than
|
|
290
|
+
hand over one item at a time. Between the Taken section and the close, render an optional **Leverage**
|
|
291
|
+
block: **up to two** offers, one line each, under a bold `**Leverage**` head (see the Step 2 example).
|
|
292
|
+
**Default to silence:** if nothing below crisply fits, omit the whole block — never pad it. Never use a
|
|
293
|
+
question-UI, never pressure — the dev acts or ignores.
|
|
294
|
+
|
|
295
|
+
Pick up to two, in priority order:
|
|
296
|
+
|
|
297
|
+
1. **Split + fan out** — a single item plainly too large for one PR (body is multi-part, an umbrella or
|
|
298
|
+
epic). Offer to slice it into child issues. (First because it *creates* the items the rest act on.)
|
|
299
|
+
2. **Batch** — 2+ claimable items that are one coherent unit (shared title-prefix family, same subsystem)
|
|
300
|
+
**and** touch overlapping/adjacent paths. Coupled → one worktree, **one PR**.
|
|
301
|
+
3. **Parallel** — 2+ items that are mutually independent and touch **disjoint paths**. Independent → N
|
|
302
|
+
worktrees, **one PR each**, run concurrently.
|
|
303
|
+
4. **Background** — a single long-running item (broad refactor, large build/sweep). Kick it off in the
|
|
304
|
+
background so the dev isn't blocked.
|
|
305
|
+
|
|
306
|
+
Disjoint paths is the deciding signal between batch (overlap → one PR) and parallel (disjoint → N PRs).
|
|
307
|
+
When unsure which fits, prefer the more conservative offer — a marginal call is worse than a quiet board.
|
|
308
|
+
Two offers must not overlap (never the same item in both); a second marginal offer is worse than one
|
|
309
|
+
crisp one.
|
|
310
|
+
|
|
311
|
+
Bundling detail boundary: start from the metadata board. Only if there are multiple viable
|
|
312
|
+
`userOwned`/`claimable` candidates, fetch bodies/comments with:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
mmi-cli board read --json --bundle-details
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
That detail path may fetch bodies/comments only for `userOwned` and `claimable` issues. `taken` stays
|
|
319
|
+
metadata-only, always. Do not fetch Done items, do not cache claimables, and do not pass `--allow-partial`
|
|
320
|
+
unless the dev explicitly accepts an incomplete Leverage read. If detail lookup exits nonzero, render
|
|
321
|
+
the board without a Leverage block.
|
|
322
|
+
|
|
323
|
+
Offer lines — one line each, no UI, no "(Recommended)", phrased as available leverage:
|
|
324
|
+
|
|
325
|
+
- **Batch** — `These read like one change — I can take #66–#70 together in a single PR if you'd like.`
|
|
326
|
+
- **Parallel** — `#17 and #18 are independent — I can run them side by side, one PR each, if that helps.`
|
|
327
|
+
- **Background** — `#22 looks long-running — I can take it in the background so you're not blocked.`
|
|
328
|
+
- **Split** — `#60 looks large — I can slice it into child issues and fan them out, if you want.`
|
|
329
|
+
|
|
330
|
+
Act-paths run only on the dev's explicit go. Every path branches from `development` and lands by PR.
|
|
331
|
+
PR land cleans up at the branch boundary (`git worktree remove` + `git worktree prune`); batch/session
|
|
332
|
+
work should keep all related sequential issues in the same branch/PR where possible instead of merging and
|
|
333
|
+
destroying the worktree after each issue:
|
|
334
|
+
|
|
335
|
+
- **Batch:** one worktree, claim each item (the Step 5 claim loop), make the coupled edits, open **one** PR
|
|
336
|
+
(`Closes #…, #…`).
|
|
337
|
+
- **Session/sequential:** multiple related same-repo items handled one after another in the same session
|
|
338
|
+
reuse the active worktree until the session or execution group ends; do not churn one worktree per
|
|
339
|
+
issue unless a branch/PR boundary, true parallelism, or explicit user ask requires it.
|
|
340
|
+
- **Parallel:** one isolated worktree per item, cut from `development`, run concurrently, **one PR per
|
|
341
|
+
item**. If two would touch the same file, serialize them or fold into a batch instead.
|
|
342
|
+
- **Background:** run off the hot path (a background task or CI job); poll with `/loop`, test with `/stage`
|
|
343
|
+
if useful; it still lands via its own worktree + PR. Bound it — never block silently.
|
|
344
|
+
- **Stage/worktree:** a local `/stage` is tied to the worktree that started it. Stop/destroy and recreate
|
|
345
|
+
it before moving to another worktree, or warn first when intent is unclear.
|
|
346
|
+
- **Split:** keep the original as the umbrella; file each child as a **native sub-issue** of it with
|
|
347
|
+
`mmi-cli issue create --parent <umbrella-ref> …` (or `mmi-cli issue link-child <umbrella> <child>` for a
|
|
348
|
+
child that already exists). The parent then renders a sub-issue checklist with each child's state and the
|
|
349
|
+
child renders its parent — no title prefix or body task-list to maintain. Refs are `#NN`, `owner/repo#NN`,
|
|
350
|
+
or a URL, and it works cross-repo (a Hub umbrella can track product-repo children). Get the dev's go before
|
|
351
|
+
filing the children; each child then becomes a parallel item. **When the last child merges, close the
|
|
352
|
+
umbrella** — its `Done` follows automatically.
|
|
353
|
+
|
|
354
|
+
## Notes
|
|
355
|
+
|
|
356
|
+
- Reads/moves use **your** `gh` token (needs `read:project`/`project`, granted once at `gh auth login`).
|
|
357
|
+
- Promotion (`/rcand`, `/release`, `/hotfix`) and the local test env (`/stage`) are their own skills — `/mmi`
|
|
358
|
+
is the board + start-of-work, not the train.
|
|
359
|
+
- **Board verbs:** `board read` · `board show <id>` · `board claim <id>` · `board move <id> <status>` ·
|
|
360
|
+
`board done <id>`. `move`/`done` exist for an agent's own mechanical bookkeeping when **no PR rides the
|
|
361
|
+
automation** — e.g. setting `Done` on a no-PR `task` or closed-out item that won't auto-advance. They are
|
|
362
|
+
tools, not a dev-facing offer: the "never suggest a status move" rule (Step 3) still governs the human
|
|
363
|
+
flow. Each verb hides the `gh project item-edit` + option-id wiring, so reach for the verb, not raw `gh`.
|
|
364
|
+
|
|
365
|
+
## Retro — one check before you finish
|
|
366
|
+
Before your final report, answer one question honestly: did **this skill's own instructions** misfire
|
|
367
|
+
this run — ambiguous wording, a misleading message, or an environment failure it should have warned
|
|
368
|
+
about? (Process only — never the user's code or task; e.g. a board read that misreported what's
|
|
369
|
+
claimable, or a claim that moved the wrong item.) If yes, file **one** lesson and move on; a clean run is
|
|
370
|
+
silent (hard cap: one per run). It lands on the Hub board (deduped) and is fixed only via a reviewed PR —
|
|
371
|
+
never edit the skill live; the retro is advisory, so if the call fails, note it and continue:
|
|
372
|
+
`mmi-cli skill-lesson --skill mmi --title "<what misfired>" --body "<what; evidence; proposed amendment>"`
|