@mutmutco/codex-plugin 4.3.28 → 4.3.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mmi",
3
- "version": "4.3.28",
3
+ "version": "4.3.30",
4
4
  "mmiCompat": "4.x",
5
5
  "description": "MMI workflow skills and org gates delivery.",
6
6
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/codex-plugin",
3
- "version": "4.3.28",
3
+ "version": "4.3.30",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -0,0 +1,156 @@
1
+ ---
2
+ name: board
3
+ description: Show the repo workboard, then take it down in the fewest pull requests.
4
+ ---
5
+
6
+ # /board — your workboard, and the fastest way through it
7
+
8
+ Two halves. The first shows a dev their board for this repo — what they hold, what is free, what others
9
+ took. The second is the reason this skill exists: plan the whole board into the **fewest pull requests**
10
+ that can safely be opened, then run those lanes in parallel.
11
+
12
+ Read-only until the dev says go. Rendering a board is not permission to take it.
13
+
14
+ ## Step 1 — read the board
15
+
16
+ ```bash
17
+ mmi-cli oracle board read --json --out .jerv/tmp/board.json
18
+ ```
19
+
20
+ Use `--out`, never a shell redirect. PowerShell's `>` writes UTF-16LE with a BOM and the next
21
+ `JSON.parse` dies at position 1 (#5802); `--out` writes UTF-8 itself.
22
+
23
+ One call. Its JSON carries `viewer`, `repo` and the project title — do not spend extra calls on
24
+ `gh api user` or `gh repo view`. Use `primary` for this repo and `secondary` for other repos on the same
25
+ Project. Partial reads exit nonzero; pass `--allow-partial` only when the dev accepts an incomplete board.
26
+
27
+ Partition, as the CLI computes it:
28
+
29
+ - **Yours** — assignee includes the viewer, status in `Todo · In Progress · In Review`.
30
+ - **Free to claim** — status `Todo`, unassigned, and the viewer has push on the repo.
31
+ - **Taken** — someone else's, any active status.
32
+
33
+ ## Step 2 — render it
34
+
35
+ Plain markdown, never a fenced block. Flat `-` lists under bold heads, never `##` headings, never tables.
36
+ Refs are `[RepoName#N](url) · short title` — no `owner/` prefix, no `[type]` brackets, title trimmed to
37
+ its essence. **Taken** renders id · status · owner only, never the title. Skip empty sections silently.
38
+ One screen.
39
+
40
+ > 👋 Welcome back, @dev — here's your board on **MMI-Hub**.
41
+ >
42
+ > **On your plate** — two train fixes in flight:
43
+ > - [MMI-Hub#834](https://github.com/mutmutco/MMI-Hub/issues/834) · automated hotfix apply path
44
+ > - [MMI-Hub#841](https://github.com/mutmutco/MMI-Hub/issues/841) · rcand stuck on required checks
45
+ >
46
+ > **Up for grabs** — nine open, I can take them in three PRs:
47
+ > - [MMI-Hub#821](https://github.com/mutmutco/MMI-Hub/issues/821) · redesign tenant env-writer
48
+ >
49
+ > **Taken**
50
+ > - MMI-Hub#827 · In Progress · @otherdev
51
+
52
+ Status moves happen automatically as work flows — claim, PR open, merge. Never offer a status move.
53
+
54
+ ## Step 3 — plan the fewest PRs
55
+
56
+ This is the aggressive half. Do not offer one item at a time and do not default to one PR per issue.
57
+
58
+ Fetch the material you need to group by:
59
+
60
+ ```bash
61
+ mmi-cli oracle board read --json --bodies --out .jerv/tmp/board-full.json
62
+ ```
63
+
64
+ `--bodies` returns body and comments for **every** scoped row. `--bundle-details` is the cheaper variant
65
+ that covers only `userOwned` and `claimable` — prefer it when the plan is limited to claimable work.
66
+ `taken` stays metadata-only either way. Do not fetch Done items.
67
+
68
+ Then build the plan:
69
+
70
+ 1. **Derive each issue's touch-set** — the files and directories it will change, read from the body,
71
+ its comments and its `surface:*` label. An issue whose touch-set you cannot name is not plannable;
72
+ leave it out of the batch and say so.
73
+ 2. **Join issues whose touch-sets overlap.** Follow the overlap transitively: if A and B share a file and
74
+ B and C share another, all three are one group. Each resulting group is one worktree and **one PR**.
75
+ 3. **Groups are disjoint by construction**, so every group runs in parallel with no worktree contention.
76
+ That is the whole trick — the number of groups is the number of PRs, and it is the smallest number
77
+ reachable without two PRs fighting over the same file.
78
+
79
+ Forced splits — these override the grouping and each takes its own PR:
80
+
81
+ - **Another repo.** Never bundle across repos. Board advance is per-repo and deliberately refuses to move
82
+ another repo's issue, so a cross-repo bundle lands the code and leaves those issues stranded open.
83
+ - **Irreversible or gated work** — migrations, secret rotation, release-train changes. Bundling hides them.
84
+ - **An issue that must stay open** (HOLD, prep, partial delivery).
85
+ - **Review size.** A PR no one can review is not cheap. When a group grows past roughly ten issues or
86
+ spans unrelated subsystems, cut it at its weakest overlap and take two PRs.
87
+
88
+ Present the plan before touching anything — batch count, issue count, and one line per batch naming its
89
+ shared surface. Then stop and wait.
90
+
91
+ > Nine claimable, three PRs: **A** #6395–#6397 board routing · **B** #6398–#6401 train doctor heal ·
92
+ > **C** #6402–#6403 CLI flag validation. Say go and I'll run all three in parallel.
93
+
94
+ ## Step 4 — on the dev's go, claim and run
95
+
96
+ Claim a whole batch in one call — it shares setup cost and returns per-item results:
97
+
98
+ ```bash
99
+ mmi-cli oracle board claim <ref> <ref> <ref> --json
100
+ ```
101
+
102
+ Claiming validates `Todo` + unassigned, assigns the viewer, moves Status to `In Progress`, and stamps a
103
+ lane-identity comment so other agents can attribute the hold. Any per-item failure exits nonzero — read
104
+ the per-item results rather than assuming the batch took. **Route is `oracle board claim` only**; there is
105
+ no `oracle issue claim` and guessing one burns a call on a refusal.
106
+
107
+ Then one worktree per batch, all batches concurrently. The host owns worktree mechanics; MMI owns board
108
+ and PR facts. On Windows set `git config core.longpaths true` on the main checkout before the first
109
+ `git worktree add` (#5499). Linked worktrees share one `.git`, so serialize `git branch -m` and other ref
110
+ renames across them, or retry serially when the error names `.tmp-renamed-log` (#5485).
111
+
112
+ ## Step 5 — land one PR per batch
113
+
114
+ There is no `--issues` or `--closes` flag. A bundled PR is expressed in the **body**:
115
+
116
+ ```
117
+ Closes #6395, #6396, #6397
118
+ ```
119
+
120
+ `pr create` normalizes multiple closing directives, and after the merge the board advance walks GitHub's
121
+ full `closingIssuesReferences` list and moves **each** issue to Done, verifying every one and naming any
122
+ that did not move. So a bundle is a first-class landing, not a trick.
123
+
124
+ ```bash
125
+ mmi-cli devops pr create --body-file .jerv/tmp/pr-batch-a.md
126
+ mmi-cli devops pr land <pr> --json
127
+ ```
128
+
129
+ Materialize the body as a real UTF-8 file and pass its path; do not pipe it to `--body-file -`. Read
130
+ `mmi-cli explain devops pr create --json` before the write — flags change.
131
+
132
+ When an issue must stay open, write `Part of #N` or `Refs #N`. **Never** write `Does not close #N` —
133
+ GitHub closes it anyway (JC#495).
134
+
135
+ Landing requires a merged receipt before any cleanup: `state` `MERGED`, the head ref and OID matching the
136
+ local task branch, and a clean worktree. Anything else means retain and report, never clean.
137
+
138
+ ## Guardrails
139
+
140
+ - **No go, no write.** The board render and the plan are free. Claims, branches, PRs are not.
141
+ - **Say the size out loud** before claiming: how many issues, how many PRs.
142
+ - **Same repo only** inside one PR.
143
+ - A batch is justified by a shared code surface, never by convenience. Unrelated changes in one PR make a
144
+ worse PR, not a cheaper one.
145
+ - Surface any `gh` / `mmi-cli` error verbatim.
146
+
147
+ ## Retro — one check before you finish
148
+ Before your final report, answer one question honestly: did **this skill's own instructions** misfire this
149
+ run — ambiguous wording, a misleading message, or an environment failure it should have warned about?
150
+ (Process only — never the user's code or task; e.g. a grouping rule that bundled two issues which turned
151
+ out to conflict, or a board read that misreported what was claimable.) If yes, file **one** lesson and
152
+ move on; a clean run is silent (hard cap: one per run). It lands on the owning board (deduped) and is
153
+ fixed only via a reviewed PR — never edit the skill live; the retro is advisory, so if the call fails,
154
+ note it and continue. In-session, call the `jerv_learning_note` tool with origin retro; the machine
155
+ fallback is:
156
+ `jervcode learn --origin retro --surface skills --title "board: <what misfired>" --body "<what; evidence; proposed amendment>"`