@mutmutco/kilo-plugin 3.82.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.82.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
@@ -139,7 +139,10 @@ Verify META + required SSM secret names before touching `main`:
139
139
  mmi-cli org project get {owner}/{repo}
140
140
  mmi-cli secrets preflight --stage main --repo {owner}/{repo}
141
141
  ```
142
- 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.
143
146
 
144
147
  ## Step 0c — hotfix-coverage guard (fail closed, #839, #958)
145
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`.