@williamthorsen/nmr 0.48.0 → 0.50.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.
Files changed (111) hide show
  1. package/.meta/changelog.json +218 -0
  2. package/.readyup/kits/default.js +1527 -1460
  3. package/.readyup/manifest.json +96 -11
  4. package/CHANGELOG.md +65 -0
  5. package/README.md +19 -8
  6. package/agents/guidance/rulebooks/nmr.md +2 -2
  7. package/dist/esm/check-cache-build-output.d.ts +24 -0
  8. package/dist/esm/check-cache-build-output.js +49 -0
  9. package/dist/esm/check-cache-delegation.d.ts +27 -0
  10. package/dist/esm/check-cache-delegation.js +92 -0
  11. package/dist/esm/check-cache-entries.d.ts +109 -0
  12. package/dist/esm/check-cache-entries.js +87 -0
  13. package/dist/esm/check-cache-gate.d.ts +64 -0
  14. package/dist/esm/check-cache-gate.js +226 -0
  15. package/dist/esm/check-cache-key.d.ts +47 -0
  16. package/dist/esm/check-cache-key.js +77 -0
  17. package/dist/esm/check-cache-record.d.ts +69 -0
  18. package/dist/esm/check-cache-record.js +167 -0
  19. package/dist/esm/check-cache.d.ts +8 -176
  20. package/dist/esm/check-cache.js +9 -214
  21. package/dist/esm/child-env.d.ts +57 -0
  22. package/dist/esm/child-env.js +59 -0
  23. package/dist/esm/child-process.d.ts +55 -0
  24. package/dist/esm/child-process.js +112 -0
  25. package/dist/esm/commands/build.d.ts +0 -16
  26. package/dist/esm/commands/build.js +9 -214
  27. package/dist/esm/commands/clean.js +3 -2
  28. package/dist/esm/commands/compiler.d.ts +18 -0
  29. package/dist/esm/commands/compiler.js +49 -0
  30. package/dist/esm/commands/fmt.d.ts +0 -39
  31. package/dist/esm/commands/fmt.js +4 -81
  32. package/dist/esm/commands/format-targets.d.ts +39 -0
  33. package/dist/esm/commands/format-targets.js +83 -0
  34. package/dist/esm/commands/rewrite-specifiers.d.ts +17 -0
  35. package/dist/esm/commands/rewrite-specifiers.js +122 -0
  36. package/dist/esm/commands/tsconfig-chain.d.ts +8 -0
  37. package/dist/esm/commands/tsconfig-chain.js +63 -0
  38. package/dist/esm/config-check-cache.d.ts +17 -0
  39. package/dist/esm/config-check-cache.js +63 -0
  40. package/dist/esm/config-validation.d.ts +20 -0
  41. package/dist/esm/config-validation.js +236 -0
  42. package/dist/esm/config.js +4 -286
  43. package/dist/esm/crossing-diagnostics.d.ts +39 -0
  44. package/dist/esm/crossing-diagnostics.js +132 -0
  45. package/dist/esm/default-scripts.js +1 -1
  46. package/dist/esm/delegate-host.d.ts +43 -0
  47. package/dist/esm/delegate-host.js +191 -0
  48. package/dist/esm/delegation-target.d.ts +52 -0
  49. package/dist/esm/delegation-target.js +71 -0
  50. package/dist/esm/fan-out.d.ts +57 -0
  51. package/dist/esm/fan-out.js +146 -0
  52. package/dist/esm/glyphs.d.ts +1 -1
  53. package/dist/esm/help.js +10 -3
  54. package/dist/esm/helpers/deriveExcerpt.d.ts +9 -0
  55. package/dist/esm/helpers/deriveExcerpt.js +1 -1
  56. package/dist/esm/helpers/renderQuotedList.d.ts +2 -0
  57. package/dist/esm/helpers/renderQuotedList.js +9 -0
  58. package/dist/esm/hooks.d.ts +17 -0
  59. package/dist/esm/hooks.js +23 -0
  60. package/dist/esm/invocation-args.d.ts +40 -0
  61. package/dist/esm/invocation-args.js +178 -0
  62. package/dist/esm/invocation.d.ts +67 -0
  63. package/dist/esm/invocation.js +3 -0
  64. package/dist/esm/machine-lock.d.ts +2 -0
  65. package/dist/esm/machine-lock.js +1 -1
  66. package/dist/esm/output-channel.d.ts +23 -0
  67. package/dist/esm/output-channel.js +14 -0
  68. package/dist/esm/pass-manifest.d.ts +53 -0
  69. package/dist/esm/pass-manifest.js +89 -0
  70. package/dist/esm/presentation.d.ts +47 -0
  71. package/dist/esm/presentation.js +32 -0
  72. package/dist/esm/recording.d.ts +1 -1
  73. package/dist/esm/recording.js +2 -2
  74. package/dist/esm/remote-host-session.d.ts +62 -0
  75. package/dist/esm/remote-host-session.js +277 -0
  76. package/dist/esm/remote-probe-host.d.ts +22 -0
  77. package/dist/esm/remote-probe-host.js +50 -0
  78. package/dist/esm/remote-probe.d.ts +63 -0
  79. package/dist/esm/remote-probe.js +88 -0
  80. package/dist/esm/remote-run.d.ts +45 -65
  81. package/dist/esm/remote-run.js +128 -162
  82. package/dist/esm/remote-session.d.ts +40 -0
  83. package/dist/esm/remote-session.js +151 -0
  84. package/dist/esm/remote-snapshot.d.ts +21 -0
  85. package/dist/esm/remote-snapshot.js +80 -0
  86. package/dist/esm/replay-assembly.d.ts +2 -2
  87. package/dist/esm/replay-assembly.js +1 -1
  88. package/dist/esm/run-chain.d.ts +21 -0
  89. package/dist/esm/run-chain.js +108 -0
  90. package/dist/esm/runCli.d.ts +1 -9
  91. package/dist/esm/runCli.js +39 -1002
  92. package/dist/esm/runner.d.ts +1 -54
  93. package/dist/esm/runner.js +2 -125
  94. package/dist/esm/shell-syntax.d.ts +30 -0
  95. package/dist/esm/shell-syntax.js +120 -0
  96. package/dist/esm/steps.d.ts +0 -2
  97. package/dist/esm/steps.js +3 -119
  98. package/dist/esm/types.d.ts +5 -0
  99. package/dist/esm/user-config.d.ts +34 -0
  100. package/dist/esm/user-config.js +93 -0
  101. package/dist/esm/verbosity.d.ts +6 -0
  102. package/dist/esm/verbosity.js +7 -7
  103. package/dist/esm/verdict.d.ts +1 -1
  104. package/dist/esm/verdict.js +1 -1
  105. package/docs/check-cache.md +28 -12
  106. package/docs/delegate.md +103 -17
  107. package/docs/reporting.md +6 -1
  108. package/docs/scripts.md +2 -1
  109. package/package.json +4 -4
  110. /package/dist/esm/{prettier-default-config.d.ts → prettier-default.config.d.ts} +0 -0
  111. /package/dist/esm/{prettier-default-config.js → prettier-default.config.js} +0 -0
@@ -1,4 +1,211 @@
1
1
  [
2
+ {
3
+ "version": "0.50.0",
4
+ "date": "2026-10-21",
5
+ "sections": [
6
+ {
7
+ "title": "🎉 Features",
8
+ "audience": "all",
9
+ "items": [
10
+ {
11
+ "description": "Makes `nmr` run a command on this machine, after printing `nmr: running <command> here rather than on <hosts>` and what `ssh` reported, when the user config's `when` sends the command to other hosts and `ssh` cannot connect to any of them; until now, the delegation failed with exit 255 and a line that named `~/.config/nmr/config.ts`. (#1090)",
12
+ "hash": "07d3b1775a7d1353c3fdf2249970c11214e6a5af",
13
+ "entry": 1
14
+ },
15
+ {
16
+ "description": "Makes `nmr` delegate to a host that `ssh` connected to, rather than to the first listed host, when several delegation hosts are configured and the lock probe finds every one of them neither free nor busy. (#1090)",
17
+ "hash": "07d3b1775a7d1353c3fdf2249970c11214e6a5af",
18
+ "entry": 2
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "title": "🐛 Bug fixes",
24
+ "audience": "all",
25
+ "items": [
26
+ {
27
+ "description": "Fixes the issue that delegation ignored the environment's `GIT_SSH_COMMAND`: `nmr` replaced it with plain `ssh` for the push and ran plain `ssh` for every other call to the host, which kept a machine that reaches its hosts through an ssh wrapper or proxy, such as the Claude Code sandbox, from delegating. (#1088)",
28
+ "hash": "76f6fc6f3501848422196d551393e29813527ae8",
29
+ "entry": 1
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "title": "📚 Documentation",
35
+ "audience": "dev",
36
+ "items": [
37
+ {
38
+ "description": "Documents in `docs/delegate.md` and the nmr rulebook that a sandboxed session must admit the host's `HostName` on port 22, as `ssh -G <host>` prints it, rather than its `~/.ssh/config` alias. (#1088)",
39
+ "hash": "76f6fc6f3501848422196d551393e29813527ae8",
40
+ "entry": 2
41
+ }
42
+ ]
43
+ }
44
+ ]
45
+ },
46
+ {
47
+ "version": "0.49.0",
48
+ "date": "2026-10-18",
49
+ "sections": [
50
+ {
51
+ "title": "🎉 Features",
52
+ "audience": "all",
53
+ "items": [
54
+ {
55
+ "description": "Makes a delegation wait while another delegation from the same worktree holds the host checkout, printing `nmr: waiting for <command> in <dir> (pid <pid>) to finish on <host>` and leaving the wait out of the verdict's duration. (#1079)",
56
+ "hash": "ae83b07e7f9bc21cb6d2131595abaa437350d7b4",
57
+ "entry": 1
58
+ },
59
+ {
60
+ "description": "Extends Ctrl-C, which previously ended only the run step on the host, to end the delegation during the wait for the checkout, the check-out step, and the install step as well. (#1079)",
61
+ "hash": "ae83b07e7f9bc21cb6d2131595abaa437350d7b4",
62
+ "entry": 2
63
+ },
64
+ {
65
+ "description": "Makes `nmr --delegate` fail at the check-out step with `could not check out on <host>: node is not on the PATH that the interactive login shell sets there` when the host's interactive login shell does not put Node on `PATH`, and documents that Node on the host must satisfy nmr's `engines` range (`>=24.16.0`). (#1079)",
66
+ "hash": "ae83b07e7f9bc21cb6d2131595abaa437350d7b4",
67
+ "entry": 3
68
+ },
69
+ {
70
+ "description": "Makes `nmr --delegate` and `NMR_DELEGATE` look up this machine's check-result cache before contacting the host, so that a tree with a pass recorded here is reported as `passed … ago on this tree` and an unknown command is reported here, without either one reaching the host. (#1080)",
71
+ "hash": "ab09b251d5f0d641264b17e458cab60245596e08",
72
+ "entry": 1
73
+ },
74
+ {
75
+ "description": "Adds a record in this machine's check-result cache for each pass that a delegation host reports, so that a later delegation to the same host recalls it as `passed … ago on <host>` and `nmr --log` prints the host's transcript under a header that names the host. (#1080)",
76
+ "hash": "ab09b251d5f0d641264b17e458cab60245596e08",
77
+ "entry": 2
78
+ },
79
+ {
80
+ "description": "Makes `nmr --delegate` record the passes that the host reports for a delegated composite's constituents, so that `nmr --delegate <host> check` after `nmr --delegate <host> ci` on the same tree recalls the pass without contacting the host. (#1082)",
81
+ "hash": "b6b75131145d5c2e9a57926f2016aa900fceff58",
82
+ "entry": 1
83
+ },
84
+ {
85
+ "description": "Makes `nmr --delegate` record the excerpts that the host reports with each delegated pass, so that a recall of a delegated command, such as `ci`, replays them instead of nothing. (#1082)",
86
+ "hash": "b6b75131145d5c2e9a57926f2016aa900fceff58",
87
+ "entry": 2
88
+ },
89
+ {
90
+ "description": "Lets `--delegate` and `NMR_DELEGATE` take a comma-separated list of hosts in order of preference, from which nmr chooses the first host on which the delegation would not wait for a lock, otherwise the first host that answered nmr's lock check, and never the delegating machine. (#1083)",
91
+ "hash": "9d1d63f29e3b1e0f90cd6ca5ee9cf9d43a2fa7a4",
92
+ "entry": 1
93
+ },
94
+ {
95
+ "description": "Extends the check-result cache to recall a pass earned on any host in the list, without checking any host's locks. (#1083)",
96
+ "hash": "9d1d63f29e3b1e0f90cd6ca5ee9cf9d43a2fa7a4",
97
+ "entry": 2
98
+ },
99
+ {
100
+ "description": "Makes `--delegate` a boolean flag, under which `nmr` runs the command on a host that `NMR_DELEGATE` or the user config names, and adds `--delegate-to <hosts>` to name the hosts for one run. (#1084)",
101
+ "breaking": true,
102
+ "migration": "Replace `--delegate <hosts>` and `--delegate=<hosts>` with `--delegate-to <hosts>`; `nmr` now reads a host written after `--delegate` as the command name and fails.",
103
+ "hash": "6fbf9c27c0ddefc337ac693929798922bed576fb",
104
+ "entry": 1
105
+ },
106
+ {
107
+ "description": "Adds a machine-level user config, `~/.config/nmr/config.ts`, in which `delegate.hosts` names this machine's hosts in order of preference and `delegate.when` selects the runs that `nmr` delegates to them without a flag: runs from a coding agent (`'agent'`) or every run (`'always'`), except when `CI` is set and for a `-F` or `-R` invocation. (#1084)",
108
+ "hash": "6fbf9c27c0ddefc337ac693929798922bed576fb",
109
+ "entry": 2
110
+ },
111
+ {
112
+ "description": "Adds the repo config key `delegate`, whose only accepted value, `false`, makes `nmr` run every check on the machine that has the working tree, overriding `NMR_DELEGATE` and the user config but not a delegation flag. (#1084)",
113
+ "hash": "6fbf9c27c0ddefc337ac693929798922bed576fb",
114
+ "entry": 3
115
+ },
116
+ {
117
+ "description": "Adds a stderr line, printed by `nmr` when a delegation decided by the user config cannot reach a host, that names the config file and the remedies in order: network access to the hosts, then `nmr --no-delegate <command>`. (#1084)",
118
+ "hash": "6fbf9c27c0ddefc337ac693929798922bed576fb",
119
+ "entry": 4
120
+ },
121
+ {
122
+ "description": "Updates the `nmr` rulebook to direct agents not to pass `--delegate` or `--delegate-to`, since the user config decides delegation, and to ask for network access to a host before running `nmr --no-delegate`. (#1084)",
123
+ "hash": "6fbf9c27c0ddefc337ac693929798922bed576fb",
124
+ "entry": 5
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "title": "🐛 Bug fixes",
130
+ "audience": "all",
131
+ "items": [
132
+ {
133
+ "description": "Fixes the issue that the snapshot sent to the host by `nmr --delegate` omitted a file edited in the same second as git's last write of the index. (#1078)",
134
+ "hash": "42cd3fb52a022010eccbf904a7d88358dd4e5759",
135
+ "entry": 2
136
+ },
137
+ {
138
+ "description": "Fixes the issue that `NMR_NO_CACHE`, `NMR_DEBUG`, and `NMR_RUN_ID` set on this machine did not reach the delegation host, which left the host's cache in use under `NMR_NO_CACHE=1`. (#1080)",
139
+ "hash": "ab09b251d5f0d641264b17e458cab60245596e08",
140
+ "entry": 3
141
+ },
142
+ {
143
+ "description": "Make release-kit's readyup manifest independent of the compile directory (#1081)",
144
+ "body": "Fixes the issue that the manifest of release-kit's `npm-auto-publish` kit listed whichever workspaces `rdy compile` found in its working directory, so a rebuild from another directory changed it and the published copy named this repository's packages. Moves the construction of the kit's per-package rows to `rdy run` and raises the kit's `minReadyupVersion` to 0.42.0, the first readyup release that can build checks at run time.",
145
+ "hash": "bea0d66f5b804bf51259fa094a890af80917abca"
146
+ }
147
+ ]
148
+ },
149
+ {
150
+ "title": "⚡ Performance",
151
+ "audience": "all",
152
+ "items": [
153
+ {
154
+ "description": "Keys the check cache on the git tree id that `git add --all` would record for the working tree, which lets `nmr` skip a check after the checked tree is committed, and invalidates every pass recorded by earlier versions once. (#1078)",
155
+ "hash": "42cd3fb52a022010eccbf904a7d88358dd4e5759",
156
+ "entry": 1
157
+ }
158
+ ]
159
+ },
160
+ {
161
+ "title": "♻️ Refactoring",
162
+ "audience": "dev",
163
+ "items": [
164
+ {
165
+ "description": "Splits the `nmr` source modules that exceeded the 300-line `max-lines` limit, such as `check-cache.ts` and `commands/build.ts`, into one module per concern, and moves each module's tests with its code. (#1061)",
166
+ "hash": "a28ac5ee6fed7fec2c4c00e08c85b9e6a9093ec8",
167
+ "entry": 1
168
+ },
169
+ {
170
+ "description": "Splits `config.ts`, `steps.ts`, and the default readyup kit `.readyup/kits/default.ts` to bring each under the 300-line `max-lines` limit, moving field-shape validation into `config-validation.ts`, the `checkCache` name check into `config-check-cache.ts`, shell tokenizing and quoting into `shell-syntax.ts`, and each kit section into a module under `.readyup/lib/`. (#1063)",
171
+ "hash": "aded5d14580b39162df66f707708b684e4d71149",
172
+ "entry": 1
173
+ },
174
+ {
175
+ "description": "Moves the argument parser, the invocation types, pnpm fan-out, the delegate host, chain assembly, hook wrapping, crossing diagnostics, the check-cache gate and its recording, the child environment, and presentation out of `runCli.ts` into modules of their own, leaving `runCli.ts` with the run orchestration and bringing it under the 300-line `max-lines` limit. (#1064)",
176
+ "hash": "854be914eaa92d5b25e0a7f8fb15aab4ac1fc4af",
177
+ "entry": 1
178
+ },
179
+ {
180
+ "description": "Rewrites the code that the new and widened rules in `eslint-plugin-unicorn` 78 report, mostly by changing `flatMap` callbacks to return a single value rather than a one-element array. (#1072)",
181
+ "hash": "0eef39d82b4eb46f8d55f1cefe673bc8f54ee2dd",
182
+ "entry": 2
183
+ },
184
+ {
185
+ "description": "Renames nmr's default Prettier config from `prettier-default-config.ts` to `prettier-default.config.ts`, so that the upstream exemption of tool-loaded `*.config.*` files from `unicorn/no-top-level-side-effects` covers it, and updates `nmr-fmt` to resolve the new name. (#1072)",
186
+ "hash": "0eef39d82b4eb46f8d55f1cefe673bc8f54ee2dd",
187
+ "entry": 3
188
+ }
189
+ ]
190
+ },
191
+ {
192
+ "title": "🧪 Tests",
193
+ "audience": "dev",
194
+ "items": [
195
+ {
196
+ "description": "Splits the `nmr` test files that exceeded the 500-line `max-lines` limit for tests into files by aspect, and moves the fixtures and fake-spawn helpers that the new files share into `test-utils/`. (#1061)",
197
+ "hash": "a28ac5ee6fed7fec2c4c00e08c85b9e6a9093ec8",
198
+ "entry": 2
199
+ },
200
+ {
201
+ "description": "Splits `runCli.unit.test.ts` into four files named for the aspect that each covers and moves the pre/post hooks suite out of `cli.tool.test.ts` into `cli.hooks.tool.test.ts`, with the workspace-tree factory, the in-process runners, and the bin harness moved into shared files under `test-utils/`. (#1064)",
202
+ "hash": "854be914eaa92d5b25e0a7f8fb15aab4ac1fc4af",
203
+ "entry": 2
204
+ }
205
+ ]
206
+ }
207
+ ]
208
+ },
2
209
  {
3
210
  "version": "0.48.0",
4
211
  "date": "2026-10-17",
@@ -201,6 +408,17 @@
201
408
  }
202
409
  ]
203
410
  },
411
+ {
412
+ "title": "🏗️ Internal features",
413
+ "audience": "dev",
414
+ "items": [
415
+ {
416
+ "description": "Resolve package roots past dual-format marker manifests (#1016)",
417
+ "body": "Replaces nmr-core's hand-written package-root and version lookups with `findPackageRoot` and `resolveSelfVersion` re-exported from `@williamthorsen/toolbelt.packaging`, which pass over the `{\"type\": \"commonjs\"}` marker manifest of a dual-format layout to reach the package that declares a `name`. `nmr`, `release-kit`, and `v11y-check` switch from `readPackageVersion` to `resolveSelfVersion`, and the boundary guard now holds `toolbelt.packaging`, like `toolbelt.terminal`, to a single importer and a single declarer in nmr-core.",
418
+ "hash": "ff6627180d9e86d083656afb2c09a3fb190fc79d"
419
+ }
420
+ ]
421
+ },
204
422
  {
205
423
  "title": "♻️ Refactoring",
206
424
  "audience": "dev",