@mutmutco/kilo-plugin 3.105.7 → 3.105.9

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.105.7",
3
+ "version": "3.105.9",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -168,7 +168,14 @@ function adaptOutput(surface, stdout) {
168
168
  try {
169
169
  const payload = JSON.parse(stdout);
170
170
  const decision = payload?.hookSpecificOutput;
171
- if (decision?.permissionDecision !== 'deny') return '';
171
+ // #4331: a gate that DECIDES anything other than deny must still leave cursor a parseable envelope.
172
+ // #4300 fixed the no-envelope path and stopped here, so an explicit `allow`/`ask` envelope still
173
+ // adapted to EMPTY stdout — the exact byte stream cursor's failClosed reader grades as a hook
174
+ // failure, denying the call the gate had just passed. Same no-op as the empty case: `{}` is
175
+ // cursor's documented "no decision, defer to the host". It must NOT become `permission: 'allow'`
176
+ // — on cursor only an explicit decision overrides the host's own permission flow, so that would
177
+ // auto-approve calls the user would otherwise be prompted for. Deny stays byte-identical below.
178
+ if (decision?.permissionDecision !== 'deny') return '{}\n';
172
179
  const reason = decision.permissionDecisionReason || 'MMI policy denied this tool call.';
173
180
  return `${JSON.stringify({ permission: 'deny', user_message: reason, agent_message: reason })}\n`;
174
181
  } catch {
@@ -11,8 +11,14 @@ preserves the cherry-pick audit trail, and performs the PATCH release. Never aut
11
11
  Never author the fix on a branch off `main`. The main-base branch is only the orchestrated port of a fix
12
12
  that is already merged to `development`.
13
13
 
14
- There is no back-merge: `development` already contains the fix, and `rc` absorbs it at the next `/rcand`.
15
- The release hotfix-coverage guard blocks a later candidate that omits the production fix.
14
+ The FIX is never back-merged: `development` already contains it, and `rc` absorbs it at the next
15
+ `/rcand`. The release hotfix-coverage guard blocks a later candidate that omits the production fix.
16
+
17
+ The VERSION FOLD is different, and `hotfix release` ports it for you (#4410). `hotfix start` commits the
18
+ fold onto the main-base branch, so after the tag `main` declares the new version while `development`
19
+ still declares the old one — and on a repo whose branch-pinned files carry that version (the Hub's
20
+ `.claude-plugin/marketplace.json` pins plugin content to `main`) catalog-lockstep then reds **every** PR
21
+ into development until it is ported. Step 3 opens that development-base fold PR automatically; land it.
16
22
 
17
23
  ## Merge floor (#3167 — non-negotiable)
18
24
 
@@ -49,9 +55,16 @@ exactly ` M` as real work to commit or stash, and for ` M` discard only when
49
55
  Use the orchestrator with an explicit source every time:
50
56
 
51
57
  ```bash
52
- mmi-cli hotfix start --from <development-pr-number-or-merge-sha> --json
58
+ mmi-cli hotfix start --from <development-pr-or-sha>[,<development-pr-or-sha>...] --json
53
59
  ```
54
60
 
61
+ **One hotfix cycle carries as many merged fixes as you name.** `--from` takes a comma-separated list in
62
+ pick order, and every sha it picks goes into the PR's carries marker, so the release proves each one
63
+ present before tagging. Do not open one hotfix per fix: batch everything ready for production into the
64
+ single PATCH. A fix that only becomes ready mid-cycle rides the same tag — cherry-pick it with `-x` onto
65
+ a `hotfix/<tag>-<n>` continuation branch, merge that PR, and rerun `hotfix release` with the full
66
+ `--carries` list; the release pins the newest merged SHA (#1025).
67
+
55
68
  `hotfix start` resolves the PATCH version, branches from `origin/main`, performs the cherry-pick with `-x`,
56
69
  prepares Hub distribution artifacts when applicable (stamping BOM `sourceCommit` at the durable
57
70
  `origin/main` merge-base so a squash merge cannot orphan it — #4361; and for `registry-publish`
@@ -88,9 +101,12 @@ Derive the tag from `mmi-cli hotfix status`, then release with the same declared
88
101
 
89
102
  ```bash
90
103
  mmi-cli hotfix status
91
- mmi-cli hotfix release <vX.Y.Z> --carries <development-pr-number-or-merge-sha>
104
+ mmi-cli hotfix release <vX.Y.Z> --carries <development-pr-or-sha>[,<development-pr-or-sha>...]
92
105
  ```
93
106
 
107
+ Name **every** fix the cycle carries. Each is proven an ancestor of the tagged SHA before tagging; a
108
+ missing one refuses the release and names the continuation path.
109
+
94
110
  For MMI-Hub, pass a fresh 2-4 line neutral summary file with `--announce-summary-file`; never reuse a
95
111
  stale file and never put a product or brand name in the summary. Hub release scope never includes another
96
112
  repo's board or `ds-propagate.yml`. The orchestrator creates the tag and GitHub Release, selects the
@@ -109,9 +125,13 @@ branch facts:
109
125
  - `main`: the tag commit is on `origin/main`.
110
126
  - `development`: the source fix was already merged before the hotfix began.
111
127
  - `rc`: intentionally untouched; the next release coverage gate prevents regression.
128
+ - the development fold PR the release opened (`hotfix-fold/<tag>`), and whether it landed.
112
129
 
113
- Do not open a manifest-alignment or back-merge PR. This is explicitly NOT a back-merge: the next normal
114
- release folds version manifests and branch alignment.
130
+ Do not hand-open a manifest-alignment PR: the version fold is already ported by `hotfix release` land
131
+ its PR instead of authoring one. That port is explicitly NOT a back-merge — nothing from `main` is
132
+ merged into `development`; the fold is regenerated on a branch cut from `development` itself. If the run
133
+ reported `development fold port FAILED`, follow the manual remedy it named; never improvise a merge from
134
+ `main`.
115
135
 
116
136
  ## Retro
117
137
 
@@ -52,4 +52,4 @@ about? (Process only — never the user's code or task; e.g. a doctor run that p
52
52
  branch.) If yes, file **one** lesson and move on; a clean run is silent (hard cap: one per run). It
53
53
  lands on the Hub board (deduped) and is fixed only via a reviewed PR — never edit the skill live; the
54
54
  retro is advisory, so if the call fails, note it and continue:
55
- `mmi-cli skill-lesson --skill mmi-doctor --title "<what misfired>" --body "<what; evidence; proposed amendment>"`
55
+ `mmi-cli skill-lesson --skill doctor --title "<what misfired>" --body "<what; evidence; proposed amendment>"`
@@ -41,10 +41,14 @@ open — never move it by hand.
41
41
 
42
42
  ```bash
43
43
  git push origin <branch>:<branch> # explicit feature refspec — see below
44
- mmi-cli pr create --title "<title>" --body-file PR_BODY.md --base development
44
+ mmi-cli pr create --title "<title>" --body-file .jerv/PR_BODY.md --base development
45
45
  mmi-cli pr checks-wait <PR-number> # wait for required CI to go green
46
46
  ```
47
47
 
48
+ Write the PR body under `.jerv/` (#4405), never at the worktree root. `.jerv/` is the agent-artifact
49
+ prefix `worktree land` treats as removable; a stray untracked `PR_BODY.md` anywhere else classifies the
50
+ tree as `untracked-files` and Step 4 then skips cleanup entirely.
51
+
48
52
  The push must be the explicit `<branch>:<branch>` refspec (the branch Step 1 derived, e.g.
49
53
  `git push origin 3795-my-slice:3795-my-slice`). The #1660 protected-push gate denies the
50
54
  `HEAD`/remote-only form (`git push -u origin HEAD`) — its target cannot be proven safe. And never
@@ -65,6 +69,16 @@ worktree, deletes the merged branch (local + origin), and prunes tracking refs.
65
69
  locked is queued and retried by `mmi-cli worktree gc sweep-deferred`. Self-authored merges need an explicit
66
70
  per-session merge grant — ask early if you don't have one.
67
71
 
72
+ **`not-attempted (untracked-files)` (#3500 / #4405):** the usual cause of a merged PR that left its
73
+ worktree behind. Any untracked path outside `.jerv/` — a hand-written `PR_BODY.md`, notes, a scratch
74
+ script — makes removal refuse, because an unadded file can be real work. Delete or move the file, then
75
+ re-run cleanup **from inside the worktree** (`worktree land` has no `--path`; it acts on the tree you
76
+ are standing in):
77
+
78
+ ```bash
79
+ mmi-cli worktree land --apply
80
+ ```
81
+
68
82
  **Cwd-safe land (#4140):** `worktree land --apply` (what `pr land` runs) is designed to be invoked from
69
83
  inside the worktree you are landing. Before removal it releases the process cwd to the primary checkout
70
84
  (#1444/#2747) — on Windows, leaving cwd inside the target tree makes `rmdir` fail with `EBUSY` and leaks