@mutmutco/kilo-plugin 3.105.11 → 3.106.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 +1 -1
- package/scripts/secret-echo-lint.mjs +13 -6
- package/skills/hotfix/SKILL.md +14 -0
- package/skills/worktree/SKILL.md +14 -9
package/package.json
CHANGED
|
@@ -91,21 +91,28 @@ function checkBashPrint(segment) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
function checkPsPrint(segment) {
|
|
94
|
+
// PowerShell accepts both $env:SECRET_VAR and ${env:SECRET_VAR}; keep one matcher so the braced form
|
|
95
|
+
// cannot bypass the same output checks as the ordinary form.
|
|
96
|
+
const envReference = /\$(?:\{env:(\w+)\}|env:(\w+))/gi;
|
|
97
|
+
const envName = (match) => match[1] ?? match[2];
|
|
98
|
+
|
|
94
99
|
// Write-Output / Write-Host / echo with $env:SECRET_VAR
|
|
95
100
|
if (/\b(?:Write-Output|Write-Host|echo)\b/i.test(segment)) {
|
|
96
|
-
for (const m of segment.matchAll(
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
for (const m of segment.matchAll(envReference)) {
|
|
102
|
+
const name = envName(m);
|
|
103
|
+
if (isSecretName(name)) {
|
|
104
|
+
return { block: true, reason: `Write/echo of $env:${name} prints a secret-named env var` };
|
|
99
105
|
}
|
|
100
106
|
}
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
// $env:SECRET_VAR in output position (start of command or after pipe, not assignment LHS)
|
|
104
|
-
for (const m of segment.matchAll(
|
|
110
|
+
for (const m of segment.matchAll(new RegExp(`(?:^|[;&|]\\s*)${envReference.source}`, 'gi'))) {
|
|
111
|
+
const name = envName(m);
|
|
105
112
|
const after = segment.slice(m.index + m[0].length);
|
|
106
113
|
if (/^\s*=(?!=)/.test(after)) continue; // assignment LHS, not output
|
|
107
|
-
if (isSecretName(
|
|
108
|
-
return { block: true, reason: `$env:${
|
|
114
|
+
if (isSecretName(name)) {
|
|
115
|
+
return { block: true, reason: `$env:${name} in output position prints a secret-named env var` };
|
|
109
116
|
}
|
|
110
117
|
}
|
|
111
118
|
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -139,6 +139,20 @@ merged into `development`; the fold is regenerated on a branch cut from `develop
|
|
|
139
139
|
reported `development fold port FAILED`, follow the manual remedy it named; never improvise a merge from
|
|
140
140
|
`main`.
|
|
141
141
|
|
|
142
|
+
### Catalog-lockstep vs development prepare (#4517)
|
|
143
|
+
|
|
144
|
+
Hub docs catalog-lockstep refuses PRs into `development` that advance
|
|
145
|
+
`.claude-plugin/marketplace.json` ahead of `origin/main`. That gate is correct for main-anchored catalog
|
|
146
|
+
truth. When Publish-Truth / a version bump must advance the marketplace, do **not** land
|
|
147
|
+
`release-distribution prepare` as a development PR — use this hotfix door:
|
|
148
|
+
|
|
149
|
+
1. `mmi-cli hotfix start --from <merged-dev-pr-or-sha>` (prepare + distribution bump on `hotfix/vX.Y.Z` from `main`)
|
|
150
|
+
2. merge the hotfix PR → `mmi-cli hotfix release vX.Y.Z` (publish)
|
|
151
|
+
3. land the automatic `hotfix-fold/<tag>` development fold PR (or follow its printed remedy)
|
|
152
|
+
|
|
153
|
+
A development prepare PR that only exists to move marketplace ahead of main will keep failing
|
|
154
|
+
catalog-lockstep; that is not a false red — switch to the hotfix path above.
|
|
155
|
+
|
|
142
156
|
## Retro
|
|
143
157
|
|
|
144
158
|
If this skill's instructions themselves misfired, file one deduplicated lesson and continue:
|
package/skills/worktree/SKILL.md
CHANGED
|
@@ -25,8 +25,9 @@ The issue-ref form derives `<issue-number>-<short-slug>`, assigns the item, and
|
|
|
25
25
|
|
|
26
26
|
`worktree create` also leases the tree to the **creating session** (#4328). A later `jerv-cli lane submit
|
|
27
27
|
--dir` (or any governed seat) refuses an already-held host lease and will not commandeer it. Before handing
|
|
28
|
-
the tree to a governed seat, release that lease first
|
|
29
|
-
`jerv-cli lease close <
|
|
28
|
+
the tree to a governed seat, release that lease first — safe once the session's own edits in that tree are
|
|
29
|
+
committed and pushed: `jerv-cli lease close --ref <worktree path>` (closes every lease on that ref; no id
|
|
30
|
+
lookup needed). To inspect what's held before closing, `jerv-cli lease list` shows id, ref, and owner.
|
|
30
31
|
|
|
31
32
|
## Step 2 — claim + work
|
|
32
33
|
|
|
@@ -58,9 +59,14 @@ with it. Stage, commit, and push as separate commands.
|
|
|
58
59
|
|
|
59
60
|
## Step 4 — land + clean up
|
|
60
61
|
|
|
61
|
-
Under standing go (green CI, CI-gated PR) land to `development
|
|
62
|
+
Under standing go (green CI, CI-gated PR) land to `development`. **Invoke `mmi-cli pr land` from the
|
|
63
|
+
primary checkout** (or any cwd that is not the PR worktree) (#4549). Landing while cwd is still inside
|
|
64
|
+
the worktree that cleanup removes can merge successfully and still exit 1 with
|
|
65
|
+
`cleanupError: … Unable to read current working directory` — post-merge `gh`/`git` follow-ups then have
|
|
66
|
+
no readable cwd even when removal itself chdir'd away (#4140).
|
|
62
67
|
|
|
63
68
|
```bash
|
|
69
|
+
cd <primary-checkout> # e.g. the main MMI-Hub clone — not the slice worktree
|
|
64
70
|
mmi-cli pr land <PR-number>
|
|
65
71
|
```
|
|
66
72
|
|
|
@@ -79,12 +85,11 @@ are standing in):
|
|
|
79
85
|
mmi-cli worktree land --apply
|
|
80
86
|
```
|
|
81
87
|
|
|
82
|
-
**Cwd-safe
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
sweep retries from a safe cwd.
|
|
87
|
-
manually outside `pr land`.
|
|
88
|
+
**Cwd-safe removal (#4140):** `worktree land --apply` (what `pr land` runs) releases the process cwd to
|
|
89
|
+
the primary checkout before deleting the tree (#1444/#2747) so Windows `rmdir` is not `EBUSY`. That does
|
|
90
|
+
**not** replace the agent rule above: still start `pr land` from the primary checkout (#4549). Prefer
|
|
91
|
+
primary cwd also when running `worktree land` manually outside `pr land`. If removal still fails (IDE
|
|
92
|
+
lock, antivirus), the deferred sweep retries from a safe cwd.
|
|
88
93
|
|
|
89
94
|
**No main lineage on a squashable development PR (#4365 / #4371):** never `git merge -s ours` (or otherwise
|
|
90
95
|
merge) a main-parented port commit into a development PR that will squash. Squash folds second-parent
|