@mutmutco/codex-plugin 4.3.29 → 4.3.31
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/.codex-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/board/SKILL.md +156 -0
package/package.json
CHANGED
|
@@ -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>"`
|