@mutmutco/kilo-plugin 3.83.0 → 3.84.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.83.0",
3
+ "version": "3.84.0",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -38,7 +38,11 @@ mmi-cli doctor --no-repo-writes
38
38
  ```
39
39
 
40
40
  Stop on a red authority or CLI-version result. The worktree must be clean; move scratch into `tmp/` or
41
- gitignore it rather than widening the hotfix diff.
41
+ gitignore it rather than widening the hotfix diff. A TRACKED path named in a `working tree must be clean
42
+ before …` refusal is not scratch: read both `git status --porcelain` columns, treat every state except
43
+ exactly ` M` as real work to commit or stash, and for ` M` discard only when
44
+ `git diff HEAD --numstat -- <paths>` is empty, and only with `git checkout -- <paths>`. Plain
45
+ `git diff --numstat` prints nothing for a merely staged change, so it cannot make that call (#4004).
42
46
 
43
47
  ## 1. Start from the merged development fix
44
48
 
@@ -43,8 +43,12 @@ primary checkout.
43
43
  ## Step 1 — development ahead of rc?
44
44
 
45
45
  Preconditions: on `development`, clean tree. The clean-tree check rejects UNTRACKED scratch too, not just
46
- modified tracked files — if `--apply` stops with `working tree must be clean before …`, run `git status` and
47
- gitignore the `??` scratch (or move it to a gitignored path like `tmp/`) before retrying (#1472).
46
+ modified tracked files — if `--apply` stops with `working tree must be clean before …`, run `git status
47
+ --porcelain` on the paths it named and read both columns. Gitignore the `??` scratch (or move it to a
48
+ gitignored path like `tmp/`). Treat every tracked state except exactly ` M` as real work to commit or stash;
49
+ for ` M`, discard only when `git diff HEAD --numstat -- <paths>` is empty, and only with
50
+ `git checkout -- <paths>`. Plain `git diff --numstat` prints nothing for a merely staged change, so it
51
+ cannot tell real work from line-ending churn (#1472, #4004).
48
52
  ```bash
49
53
  git fetch origin
50
54
  git rev-list --count origin/rc..origin/development
@@ -72,9 +72,22 @@ breaks here: the new worktree's branch is never literally named `development`/`r
72
72
  development` inside it fails outright when `development` is already checked out in the primary checkout (git
73
73
  worktrees cannot have the same branch checked out twice). If you are in such a worktree, exit it first and
74
74
  run the release from the primary checkout.
75
- The clean-tree check rejects UNTRACKED scratch too, not just modified tracked files if `--apply` stops
76
- with `working tree must be clean before …`, run `git status` and gitignore the `??` scratch (or move it to a
77
- gitignored path like `tmp/`) before retrying (#1472).
75
+ The clean-tree check rejects UNTRACKED scratch too, not just modified tracked files. When `--apply` or
76
+ `--resume` stops with `working tree must be clean before …`, run `git status --porcelain` on the paths it
77
+ named and read BOTH status columns before touching anything (#1472, #4004):
78
+
79
+ - `??` — untracked scratch. Gitignore it, or move it to a gitignored path like `tmp/`, then retry.
80
+ - exactly ` M` (blank staged column) — the only state that can be churn rather than work. Test it with
81
+ `git diff HEAD --numstat -- <paths>`: non-empty is a real edit to commit or stash; empty means the
82
+ worktree normalizes straight back to HEAD (an LF↔CRLF rewrite, say), and `git checkout -- <paths>`
83
+ then clears the refusal without discarding anything.
84
+ - anything else — `M `, `MM`, `A`, `D`, `R`, `T`, or any `U` conflict — is real work or an exceptional
85
+ index state. Commit, stash or resolve it; do not try to classify it.
86
+
87
+ Do not substitute plain `git diff --numstat` for the `HEAD` form. It compares the worktree against the
88
+ INDEX, so a change that is merely staged prints nothing at all, and reading that emptiness as
89
+ "line-ending churn" throws the change away. The remedy is the index form of `git checkout` for the same
90
+ reason: `git checkout HEAD -- <paths>` would overwrite a staged edit that was misread as churn.
78
91
 
79
92
  Full-track repos:
80
93
  ```bash
@@ -471,6 +484,19 @@ mmi-cli org project sync-info --apply # omit --apply for the read-only plan
471
484
  channel — #3630 took SessionStart off the hook surface) runs the
472
485
  same fast-forward first thing, so a stale local `development`/`main`/`rc` self-heals to origin before you
473
486
  work — no manual `git pull`. Nothing here ever blocks or fails the release.
487
+ - **Read the `checkout:` clause — it does not always say "returned" (#4006).** The report always prints
488
+ one, and restoration is deliberately skipped rather than forced when the repo is not in a fit state.
489
+ A release leaves the repo on `main` until the train moves it back, so a non-`returned` outcome means
490
+ you are still there and must return by hand once the cause is cleared:
491
+ - `checkout restoration skipped: working tree changed after release` — the tree went dirty DURING the
492
+ train, so the train declined to move you. Diagnose those paths with the Step 0 clean-tree rules,
493
+ then `git checkout <start branch>` yourself. The release itself already shipped; this is a
494
+ deliberate, harmless decline, not a failed release.
495
+ - `checkout restoration failed while returning to …` / `origin/<branch> fast-forward failed` — the
496
+ checkout or the pull errored. Read the appended git message; the release is unaffected.
497
+
498
+ `--resume` prints no `checkout:` clause at all, so after a resumed release check `git branch
499
+ --show-current` rather than assuming you were moved back.
474
500
 
475
501
  ## Step 6 — collect deploy verdict + report
476
502
 
@@ -478,6 +504,10 @@ Collect the backgrounded prod-deploy watch from Step 4 (it has typically finishe
478
504
  healthy (the central deploy workflow smoke step / a health check); **red** → report the failure prominently and flag
479
505
  that the release shipped on a failed deploy (re-run just the deploy — `main` is already correct).
480
506
 
507
+ **This distribution verifier is Hub-only.** It assumes the Hub release fold has already committed its
508
+ generated artifacts. Non-Hub `registry-publish` repositories must not run `release-distribution.mjs
509
+ verify`: use their own release-workflow evidence and the publish-visibility contract below.
510
+
481
511
  Hub releases always carry a distribution bump (the Step 1b fold), so the **publish workflow**
482
512
  (`publish.yml`) ships every registry-declared public npm artifact on the GitHub Release from Step 4 —
483
513
  don't publish by hand.