@mutmutco/kilo-plugin 3.81.0 → 3.83.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/kilo-plugin",
3
- "version": "3.81.0",
3
+ "version": "3.83.0",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -128,6 +128,8 @@ for `rc`/`main` (#3433). `$FIRST` is the track's first branch: `development` for
128
128
  FIRST=development # full / direct
129
129
  FIRST=main # trunk (content)
130
130
 
131
+ # One-time namespace + first-ref creation uses the authenticated master-admin GitHub session. The current
132
+ # mmi-cli has no App-backed command for a repository that does not exist; this is the named exception.
131
133
  gh repo create "$OWNER/$REPO" --private
132
134
  gh api -X PUT "repos/$OWNER/$REPO/contents/.gitkeep" \
133
135
  -f message="chore: initial commit" -f content="Cg==" -f branch="$FIRST"
@@ -136,6 +138,11 @@ gh api -X PUT "repos/$OWNER/$REPO/contents/.gitkeep" \
136
138
  On an empty repo that PUT creates `$FIRST` **and leaves it the default branch**, so no `gh repo edit
137
139
  --default-branch` is needed here. Skip this step when the repo already exists with the track's default branch.
138
140
 
141
+ The two `gh` writes above are authorized by the authenticated master-admin login and are the one-time
142
+ bootstrap exception while no App-backed `mmi-cli` command owns a repository that does not yet exist. They
143
+ are not a general write lane: after the namespace and first ref exist, use the App-backed
144
+ `mmi-cli bootstrap apply --execute` path for managed seeds, labels, rulesets, and registry state.
145
+
139
146
  For a **content** repo the API form is not merely tidier, it is the only thing that works: `main` is that
140
147
  track's first and only branch, so the initial commit IS a push to `main` and the #1660 guard fences it — and
141
148
  the deny's own advice ("land through a CI-gated PR to development") is meaningless on a repo with no commits,
@@ -9,6 +9,14 @@ Turn one large item — a vision issue, an epic, an umbrella issue — into a se
9
9
  single pre-validated batch, each already linked to its parent. This is the slice-and-fan-out act done by
10
10
  hand today: draft the children, validate them all, create them, confirm the tree.
11
11
 
12
+ ## Opening branch — create a new umbrella when none exists
13
+
14
+ When the request is a product intent rather than an existing issue, gather the intent first, read the
15
+ repo's live issue templates, draft the umbrella from the matching feature/task template, and show that
16
+ draft for the user's go. Only then create one issue with the `epic` label and an explicit Priority field;
17
+ re-read it from the board to prove the body, label, and priority landed. Stop there unless the user also
18
+ asked for and approved child decomposition.
19
+
12
20
  ## Step 0 — load the umbrella whole
13
21
 
14
22
  Read the parent end-to-end before slicing — body **and every comment**, treating later comments as
@@ -28,7 +36,7 @@ Write a JSON array (one object per child) to a scratch path under `tmp/`. Each r
28
36
  ```json
29
37
  [
30
38
  { "type": "task", "title": "C1: extract the shared frame", "body": "…", "priority": "high",
31
- "parent": "owner/repo#42" },
39
+ "surface": "cli", "parent": "owner/repo#42" },
32
40
  { "type": "feature", "title": "C2: wire the new command", "body": "…", "priority": "medium",
33
41
  "parent": "owner/repo#42" }
34
42
  ]
@@ -40,6 +48,8 @@ Write a JSON array (one object per child) to a scratch path under `tmp/`. Each r
40
48
  create, so you do not need a separate `link-child` pass. Cross-repo is fine (a Hub umbrella can parent
41
49
  product-repo children).
42
50
  - `priority` — `urgent|high|medium|low` (defaults to `medium`); sets the board Priority **field**.
51
+ - `surface` — required when the target repo uses `surface:*` taxonomy; accepts the value with or without
52
+ the prefix. A top-level `--surface <value>` may supply the default for every applicable row.
43
53
 
44
54
  The batch **pre-validates every row before creating any** — one bad row fails the whole set with an
45
55
  aggregate error, so you fix all of them once. Get the user's go on the drafted set before writing.
@@ -47,13 +57,18 @@ aggregate error, so you fix all of them once. Get the user's go on the drafted s
47
57
  ## Step 2 — create the children
48
58
 
49
59
  ```bash
50
- mmi-cli issue create --type task --batch tmp/epic-children.json
60
+ mmi-cli issue create --type task --batch tmp/epic-children.json --surface cli
51
61
  ```
52
62
 
53
63
  `--type` is required by the create command but each row's own `type` governs; pass any valid type as the
54
64
  placeholder. It prints per-row `{number,url}` results and fails loud on any misfire. Add
55
65
  `--idempotency-key <key>` when a retried loop must not duplicate.
56
66
 
67
+ The idempotency lookup is find-before-create, not an atomic reservation. Run one batch writer at a time:
68
+ never submit concurrent creates with the same key. Size the calling command's wall-clock budget for the
69
+ whole sequential batch. If the command times out, its outcome is unknown — confirm the process has ended,
70
+ wait for writes to quiesce, inspect the children, then retry the missing rows with the same key.
71
+
57
72
  ## Step 3 — confirm the tree
58
73
 
59
74
  ```bash
@@ -34,7 +34,7 @@ and CLI health before starting:
34
34
 
35
35
  ```bash
36
36
  mmi-cli org access role <owner/repo> --json
37
- mmi-cli doctor --apply --no-repo-writes
37
+ mmi-cli doctor --no-repo-writes
38
38
  ```
39
39
 
40
40
  Stop on a red authority or CLI-version result. The worktree must be clean; move scratch into `tmp/` or
@@ -52,7 +52,7 @@ preflight that reports "skipped — lock busy" has healed nothing, and an agent
52
52
  line will carry on believing its tooling was fixed.
53
53
 
54
54
  `doctor --preflight` detects a stale npm global or a stale/unresolved plugin install and runs the **env**
55
- half of the interactive `doctor --apply` self-heal (#3485) — it never touches the repo working tree, and
55
+ half of the interactive doctor self-heal (#3485/#3975) — it never touches the repo working tree, and
56
56
  never pays the train-branch sync or the gc sweep. It still belongs off the critical board path unless it
57
57
  has proof it must heal. When it prints `↻ Updating mmi tooling, one moment…`, relay that before waiting;
58
58
  when it prints `↻ MMI tooling updated — …`, relay the reload/restart guidance.
@@ -30,7 +30,7 @@ never proceed unverified.
30
30
  **CLI freshness (#2562):** check the running CLI is current BEFORE step 1 — `mmi-cli rcand --apply` refuses
31
31
  a stale CLI at its own step 0 (pre-mutation), but the manual steps below mutate local state earlier, so a
32
32
  stale CLI discovered late reads as a mid-train abort. When another train just published a new CLI (e.g. a
33
- Hub release), run `mmi-cli doctor --apply --no-repo-writes` first. A stale-CLI refusal itself changes
33
+ Hub release), run `mmi-cli doctor --no-repo-writes` first. A stale-CLI refusal itself changes
34
34
  nothing; after updating, the rerun resumes any partial train state safely.
35
35
 
36
36
  **Run from the checkout that already has `development` — never a fresh isolated worktree (#2770).** This is
@@ -51,7 +51,7 @@ git rev-list --count origin/rc..origin/development
51
51
  ```
52
52
  Dirty → stop. Count `0` → stop ("nothing to promote"). `>0` → capture the commit list for the report.
53
53
 
54
- > Verifying CLI/plugin-health before a train? Use `mmi-cli doctor --apply --no-repo-writes`: it runs the
54
+ > Verifying CLI/plugin-health before a train? Use `mmi-cli doctor --no-repo-writes`: it runs the
55
55
  > env/plugin repairs but never mutates the working tree, so a pending org-managed `.gitignore` repair is
56
56
  > reported with its follow-up command instead of dirtying the product checkout right before promotion.
57
57
  > Apply that follow-up after the train.
@@ -93,28 +93,25 @@ git rev-list --count origin/main..origin/development
93
93
 
94
94
  Before local gates or `release --apply`, ensure the repo-local / PATH `mmi-cli` matches the released train
95
95
  path — a stale checkout (e.g. 2.32.0 while 2.32.4 is released) fails release gates with opaque errors.
96
- Self-heal in place without repo writes:
96
+ Self-heal in place without repo writes (heals run by default since #3975; the flag suppresses only
97
+ mutations of the working tree you are about to release from):
97
98
  ```bash
98
- mmi-cli doctor --apply --no-repo-writes
99
+ mmi-cli doctor --no-repo-writes
99
100
  ```
100
101
  **Read the checks, not the exit code.** `doctor` exits non-zero on any failed check it could have healed —
101
102
  not just a version gap — so a red exit here does not by itself mean the train is blocked (#2962). The
102
- inverse is also true since #3485: a run can exit **0** while printing ✗ lines, because three rows
103
- (`worktree roots`, `schedules`, `docs-audit`) are ruled report-only — real faults the design deliberately
104
- declines to gate on, since their remedy is a human review or lives in the owning repo. Neither direction
105
- is a gate. Read the rows.
103
+ inverse is also true: a run can exit **0** while printing ✗ lines (report-only rows, #3485). Neither
104
+ direction is a gate. Read the rows.
106
105
 
107
- - **Blocking:** a red `mmi-cli` / `Claude plugin` version line, or a reported `minClientVersion` gap. Since
108
- #3485 `--no-repo-writes` no longer blocks the env heals — the step above self-updates the npm global CLI
106
+ - **Blocking:** a red `mmi-cli` / `Claude plugin` version line, or a reported `minClientVersion` gap.
107
+ `--no-repo-writes` does not block the env heals — the step above self-updates the npm global CLI
109
108
  (#3272) and reinstalls the plugin (#3282), suppressing only repo-file writes — so the re-run should clear
110
- it. If a gap persists, fix it — `mmi-cli doctor --apply`, or `npm install -g @mutmutco/cli` — before
109
+ it. If a gap persists, fix it — `mmi-cli doctor`, or `npm install -g @mutmutco/cli` — before
111
110
  continuing. Do **not** proceed to Step 0b while the installed CLI is behind the Hub's `minClientVersion`.
112
111
  - **Not blocking:** every other red check is hygiene, not a train gate. Stale branches and scratch heal with
113
- `mmi-cli doctor --apply`; `plugin cache` needs a different verb, `mmi-cli plugin prune --apply` — saying
114
- `doctor --apply` cleared it was wrong. All three still exit 1 until you run the right verb. The three
115
- report-only rows (`worktree roots`, `schedules`, `docs-audit`) print ✗ without moving the exit code
116
- since #3485 — not because no verb exists, but because the design refuses to gate on a human review or
117
- on a fault owned by another repo. Read them, then proceed.
112
+ a plain `mmi-cli doctor` (after the release); `plugin cache` needs a different verb,
113
+ `mmi-cli plugin prune --apply` — saying doctor cleared it was wrong. Both still exit 1 until you run the
114
+ right verb. Read them, then proceed.
118
115
 
119
116
  Treating doctor's exit code as the gate halts a healthy train on cosmetic drift — or, worse, teaches an
120
117
  operator to ignore doctor's exit code entirely.
@@ -142,7 +139,10 @@ Verify META + required SSM secret names before touching `main`:
142
139
  mmi-cli org project get {owner}/{repo}
143
140
  mmi-cli secrets preflight --stage main --repo {owner}/{repo}
144
141
  ```
145
- Missing META or secret names → stop and repair the registry/secrets first.
142
+ An enumerated missing META row or missing secret name → stop and repair the registry/secrets first. An
143
+ HTTP 5xx, timeout, DNS, socket, or other transport failure is **unverified**, not evidence that a name is
144
+ missing: retry the read/preflight and repair connectivity if it persists. Never provision or rename a
145
+ secret from a transport-error response.
146
146
 
147
147
  ## Step 0c — hotfix-coverage guard (fail closed, #839, #958)
148
148
 
@@ -35,14 +35,16 @@ mmi-cli status
35
35
 
36
36
  `status` is the unified current-state read for **this** checkout: branch, linked worktrees, your open PRs,
37
37
  your claimed board items, and whether a local stage is running. It is the "where am I" line — render it,
38
- don't re-derive it from raw `git`/`gh`.
38
+ don't re-derive it from raw `git`/`gh`. Keep the case-preserving `repo` value it reports; that is the
39
+ workspace identity the next step must use (for example `mutmutco/MMC-ZuberShade`).
39
40
 
40
41
  ## Step 2 — the next move
41
42
 
42
43
  ```bash
43
- mmi-cli next
44
+ mmi-cli next --repo <repo reported by status>
44
45
  ```
45
46
 
47
+ Pass the repository from `status` explicitly; never reconstruct it by changing case or punctuation.
46
48
  `next` recommends the single most actionable claimable board item (unblocked, priority-ranked) and prints
47
49
  the exact `mmi-cli board claim <n>` to take it. Offer it; do not claim on the user's behalf without a go.
48
50
  For the full board partition (yours / claimable / taken) run `/mmi`.