@mutmutco/kilo-plugin 3.105.6 → 3.105.8
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 +1 -1
- package/scripts/hook-run.mjs +8 -1
- package/skills/hotfix/SKILL.md +26 -6
- package/skills/worktree/SKILL.md +15 -1
package/package.json
CHANGED
package/scripts/hook-run.mjs
CHANGED
|
@@ -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
|
-
|
|
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 {
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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-
|
|
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-
|
|
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
|
|
114
|
-
|
|
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
|
|
package/skills/worktree/SKILL.md
CHANGED
|
@@ -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
|