@mutmutco/kilo-plugin 3.105.12 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/kilo-plugin",
3
- "version": "3.105.12",
3
+ "version": "3.106.0",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -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(/\$env:(\w+)/gi)) {
97
- if (isSecretName(m[1])) {
98
- return { block: true, reason: `Write/echo of $env:${m[1]} prints a secret-named env var` };
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(/(?:^|[;&|]\s*)\$env:(\w+)/gi)) {
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(m[1])) {
108
- return { block: true, reason: `$env:${m[1]} in output position prints a secret-named env var` };
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
 
@@ -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:
@@ -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: discover it with `jerv-cli lease list`, then
29
- `jerv-cli lease close <leaseId>`.
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 land (#4140):** `worktree land --apply` (what `pr land` runs) is designed to be invoked from
83
- inside the worktree you are landing. Before removal it releases the process cwd to the primary checkout
84
- (#1444/#2747) on Windows, leaving cwd inside the target tree makes `rmdir` fail with `EBUSY` and leaks
85
- branch refs. You do not need to `cd` out first; if removal still fails (IDE lock, antivirus), the deferred
86
- sweep retries from a safe cwd. Prefer the primary checkout cwd only when you are running `worktree land`
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