@williamthorsen/nmr 0.54.1 → 0.55.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.
@@ -1,4 +1,37 @@
1
1
  [
2
+ {
3
+ "version": "0.55.0",
4
+ "date": "2026-11-06",
5
+ "sections": [
6
+ {
7
+ "title": "🎉 Features",
8
+ "audience": "all",
9
+ "items": [
10
+ {
11
+ "description": "Adds the built-in root command `lint:shell`, which runs the new `nmr-shellcheck` bin to lint every tracked `*.sh` file with nmr's pinned shellcheck and passes without downloading shellcheck when the repo does not track any. (#1161)",
12
+ "hash": "d5cb485398fbc00f81b5533bd8c71033d81e6026",
13
+ "entry": 1
14
+ },
15
+ {
16
+ "description": "Adds a warning to nmr's readyup kit that reports a `lint:shell` entry in `.config/nmr.config.ts`, which overrides the built-in command, and directs the repo to delete the entry. (#1161)",
17
+ "hash": "d5cb485398fbc00f81b5533bd8c71033d81e6026",
18
+ "entry": 2
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "title": "🐛 Bug fixes",
24
+ "audience": "all",
25
+ "items": [
26
+ {
27
+ "description": "Adopt the crash convention in release-kit (#1158)",
28
+ "body": "Makes `release-kit` report a bug in its own code as `release-kit: internal error: <message>` followed by the stack, rather than as the `Error: <message>` line that it keeps for a failure in the user's input, config, or environment. The same change makes `nmr` and `v11y-check` print a Node system error, such as `EACCES` or `ENOENT`, as `Error: <message>` rather than as an internal error.",
29
+ "hash": "3a62cc768b23f37156c846f32fd4acaa70f7f931"
30
+ }
31
+ ]
32
+ }
33
+ ]
34
+ },
2
35
  {
3
36
  "version": "0.54.1",
4
37
  "date": "2026-11-05",
@@ -7691,6 +7691,7 @@ function buildRootScripts(workspaceGlobs) {
7691
7691
  "fmt:check": "nmr-fmt --check",
7692
7692
  lint: "eslint --fix .",
7693
7693
  "lint:check": "eslint .",
7694
+ "lint:shell": "nmr-shellcheck",
7694
7695
  "lint:strict": "strict-lint",
7695
7696
  "lint:workflows": "nmr-actionlint",
7696
7697
  // The audit takes seconds and `ci` takes minutes, so the cheap gate fails first. The audit reads the
@@ -7880,6 +7881,8 @@ var INSTALL_LIFECYCLE_SCRIPTS = [
7880
7881
  ];
7881
7882
  var LEFTHOOK_CHECK_INSTALL_PATTERN = /\blefthook\s+check-install\b/;
7882
7883
  var LEFTHOOK_INSTALL_PATTERN = /\blefthook\s+install\b/;
7884
+ var LINT_SHELL_KEY_PATTERN = /['"]lint:shell['"]\s*:/;
7885
+ var NMR_CONFIG_PATH = ".config/nmr.config.ts";
7883
7886
  var rootScriptChecks = [
7884
7887
  {
7885
7888
  name: "root package.json has no nmr-provided scripts",
@@ -7887,6 +7890,13 @@ var rootScriptChecks = [
7887
7890
  quiet: true,
7888
7891
  check: noRedundantRootScripts,
7889
7892
  fix: "Remove scripts from root package.json that nmr provides as built-in root scripts, and invoke them through nmr directly"
7893
+ },
7894
+ {
7895
+ name: ".config/nmr.config.ts does not override lint:shell",
7896
+ severity: "warn",
7897
+ quiet: true,
7898
+ check: () => noLintShellOverride(),
7899
+ fix: "Delete the `lint:shell` entry from `rootScripts` in .config/nmr.config.ts, because nmr provides `lint:shell` as a built-in root command that passes when the repo does not track any shell script"
7890
7900
  }
7891
7901
  ];
7892
7902
  var gitHookChecks = [
@@ -7914,6 +7924,11 @@ var legacyRunnerChecks = [
7914
7924
  fix: 'Remove "ws" script entries and replace any "pnpm run ws" invocations with nmr in each packages/*/package.json'
7915
7925
  }
7916
7926
  ];
7927
+ function noLintShellOverride(cwd = process.cwd()) {
7928
+ const content = readFileIn(cwd, NMR_CONFIG_PATH);
7929
+ if (content === void 0 || !LINT_SHELL_KEY_PATTERN.test(content)) return true;
7930
+ return { ok: false, detail: `${NMR_CONFIG_PATH}: rootScripts.lint:shell` };
7931
+ }
7917
7932
  function noUnguardedLefthookInstall(cwd = process.cwd()) {
7918
7933
  const scripts = readRootScripts(cwd);
7919
7934
  const unguardedScripts = INSTALL_LIFECYCLE_SCRIPTS.flatMap((name) => {
@@ -9190,7 +9205,7 @@ function hasSupportedStrictLintVersion() {
9190
9205
  });
9191
9206
  }
9192
9207
  function getMinVersion() {
9193
- const pickedFields = { "version": "0.54.1" };
9208
+ const pickedFields = { "version": "0.55.0" };
9194
9209
  if (typeof pickedFields["version"] !== "string") {
9195
9210
  throw new TypeError("nmr/package.json: 'version' must be a string");
9196
9211
  }
@@ -27,7 +27,7 @@
27
27
  "checklist": "nmr",
28
28
  "checks": [
29
29
  "@williamthorsen/nmr in devDependencies",
30
- "@williamthorsen/nmr >= 0.54.1",
30
+ "@williamthorsen/nmr >= 0.55.0",
31
31
  "pnpm-workspace.yaml exists",
32
32
  "catalogued dependencies use catalog:",
33
33
  "package.json has packageManager field",
@@ -38,6 +38,7 @@
38
38
  "eslint >= 10.0.0",
39
39
  "@williamthorsen/strict-lint >= 9.3.0",
40
40
  "root package.json has no nmr-provided scripts",
41
+ ".config/nmr.config.ts does not override lint:shell",
41
42
  "no root install script runs lefthook install unguarded",
42
43
  "all workspace packages can build",
43
44
  "every bin target is a committed wrapper",
@@ -109,10 +110,15 @@
109
110
  "path": "../../nmr-core/dist/esm/helpers/workspace-patterns.js"
110
111
  },
111
112
  {
112
- "hash": "8fe9a346",
113
+ "hash": "76923c93",
113
114
  "kind": "module",
114
115
  "path": "../../nmr-core/dist/esm/index.js"
115
116
  },
117
+ {
118
+ "hash": "85d76864",
119
+ "kind": "module",
120
+ "path": "../../nmr-core/dist/esm/isAnticipatedFailure.js"
121
+ },
116
122
  {
117
123
  "hash": "de51ceb3",
118
124
  "kind": "module",
@@ -124,7 +130,7 @@
124
130
  "path": "../../nmr-core/dist/esm/runGit.js"
125
131
  },
126
132
  {
127
- "hash": "6f46d90a",
133
+ "hash": "01ad20df",
128
134
  "kind": "module",
129
135
  "path": "../../nmr-core/dist/esm/terminal.js"
130
136
  },
@@ -184,7 +190,7 @@
184
190
  "path": "lib/repo-files.ts"
185
191
  },
186
192
  {
187
- "hash": "2a90a1d3",
193
+ "hash": "a62f92eb",
188
194
  "kind": "module",
189
195
  "path": "lib/root-scripts.ts"
190
196
  },
@@ -214,7 +220,7 @@
214
220
  "path": "lib/workspace-build.ts"
215
221
  },
216
222
  {
217
- "hash": "dad7f436",
223
+ "hash": "f22b8da5",
218
224
  "kind": "inline",
219
225
  "path": "../package.json",
220
226
  "paths": [
@@ -237,7 +243,7 @@
237
243
  "path": "../src/config.ts"
238
244
  },
239
245
  {
240
- "hash": "b8e98c81",
246
+ "hash": "463c7bbd",
241
247
  "kind": "module",
242
248
  "path": "../src/default-scripts.ts"
243
249
  },
@@ -327,7 +333,7 @@
327
333
  "readyupVersion": "0.45.0",
328
334
  "source": "kits/default.ts",
329
335
  "sourceHash": "9fd61bf4",
330
- "targetHash": "04e5d541"
336
+ "targetHash": "6eb9c2b5"
331
337
  }
332
338
  ]
333
339
  }
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## 0.55.0 — 2026-11-06
6
+
7
+ ### 🎉 Features
8
+
9
+ - Adds the built-in root command `lint:shell`, which runs the new `nmr-shellcheck` bin to lint every tracked `*.sh` file with nmr's pinned shellcheck and passes without downloading shellcheck when the repo does not track any. (#1161)
10
+ - Adds a warning to nmr's readyup kit that reports a `lint:shell` entry in `.config/nmr.config.ts`, which overrides the built-in command, and directs the repo to delete the entry. (#1161)
11
+
12
+ ### 🐛 Bug fixes
13
+
14
+ - Adopt the crash convention in release-kit (#1158)
15
+
16
+ Makes `release-kit` report a bug in its own code as `release-kit: internal error: <message>` followed by the stack, rather than as the `Error: <message>` line that it keeps for a failure in the user's input, config, or environment. The same change makes `nmr` and `v11y-check` print a Node system error, such as `EACCES` or `ENOENT`, as `Error: <message>` rather than as an internal error.
17
+
5
18
  ## 0.54.1 — 2026-11-05
6
19
 
7
20
  ### 🐛 Bug fixes
package/README.md CHANGED
@@ -5,14 +5,18 @@
5
5
  Context-aware script runner for pnpm monorepos. Includes an `nmr` (node-monorepo run) binary that provides centralized, consistent script execution across workspace packages and the monorepo root.
6
6
 
7
7
  <!-- section:release-notes -->
8
- ## Release notes — v0.54.1 (2026-11-05)
8
+ ## Release notes — v0.55.0 (2026-11-06)
9
+
10
+ ### 🎉 Features
11
+
12
+ - Adds the built-in root command `lint:shell`, which runs the new `nmr-shellcheck` bin to lint every tracked `*.sh` file with nmr's pinned shellcheck and passes without downloading shellcheck when the repo does not track any. (#1161)
13
+ - Adds a warning to nmr's readyup kit that reports a `lint:shell` entry in `.config/nmr.config.ts`, which overrides the built-in command, and directs the repo to delete the entry. (#1161)
9
14
 
10
15
  ### 🐛 Bug fixes
11
16
 
12
- - Fixes the issue that `pnpm add` failed when an install hook such as `postinstall` ran an nmr command delegated by `NMR_DELEGATE` or the user config, because the host's frozen install rejected a manifest that was ahead of its lockfile, by making nmr run such a command on this machine unless `--delegate` or `--delegate-to` is passed. (#1151)
13
- - Fixes the issue that `nmr` printed an unexpected crash as its raw stack, whose first line, `Error: <message>`, read the same as a handled error; it now prints `nmr: internal error: <message>` followed by the stack frames, and still prints an error caused by the user's own config as `Error: <message>`. (#1153)
14
- - Fixes the issue that the `nmr` sub-bins, such as `nmr-compile` and `nmr-fmt`, and the `v11y` subcommands reported an unexpected crash as a handled `Error: <message>` line, rather than as `<bin>: internal error: <message>` with its stack frames. (#1157)
15
- - Fixes the issue that the bin scripts of `nmr`, `release-kit`, and `v11y-check` reported every error other than missing build output as `<bin>: failed to load: <message>` without a stack, which hid where the fault occurred. (#1157)
17
+ - Adopt the crash convention in release-kit (#1158)
18
+
19
+ Makes `release-kit` report a bug in its own code as `release-kit: internal error: <message>` followed by the stack, rather than as the `Error: <message>` line that it keeps for a failure in the user's input, config, or environment. The same change makes `nmr` and `v11y-check` print a Node system error, such as `EACCES` or `ENOENT`, as `Error: <message>` rather than as an internal error.
16
20
  <!-- /section:release-notes -->
17
21
 
18
22
  ## Installation
@@ -319,7 +323,7 @@ rdy list --from npm:@williamthorsen/nmr # what nmr publishes
319
323
  - [Machine lock](docs/machine-lock.md): Which commands wait for one another, where the lock lives, and bypassing it
320
324
  - [Delegating to another machine](docs/delegate.md): The user config, `--delegate`, `--delegate-to`, `NMR_DELEGATE`, where a command runs, choosing among several hosts, what the host runs, and setting it up
321
325
  - [Dependency upgrades](docs/upgrades.md): `nmr upgrade`, the upgrade policy, the Node version pin, `report-catalog`, `report-overrides`, and `nmr-taze`
322
- - [Standalone utilities](docs/utilities.md): `nmr-actionlint`, `nmr-clean`, `nmr-compile`, `nmr-fmt`, `nmr-vitest`, and `ensure-prepublish-hooks`
326
+ - [Standalone utilities](docs/utilities.md): `nmr-actionlint`, `nmr-clean`, `nmr-compile`, `nmr-fmt`, `nmr-shellcheck`, `nmr-vitest`, and `ensure-prepublish-hooks`
323
327
  - [Shared Vitest config](docs/vitest.md): Test tiers, test selections, the conventions check, and customization
324
328
  - [Shared Prettier config](docs/prettier.md): What it formats and how to customize it
325
329
  - [Workspace introspection](docs/workspace.md): The two workspace lookups
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ try {
3
+ await import('../dist/esm/cli-shellcheck.js');
4
+ } catch (error) {
5
+ if (error?.code === 'ERR_MODULE_NOT_FOUND') {
6
+ process.stderr.write('nmr-shellcheck: build output not found; run `pnpm run bootstrap` first\n');
7
+ } else {
8
+ const message = typeof error?.message === 'string' && error.message !== '' ? error.message : String(error);
9
+ const lines = typeof error?.stack === 'string' ? error.stack.split('\n') : [];
10
+ const firstFrame = lines.findIndex((line) => /^\s+at /.test(line));
11
+ const frames = firstFrame === -1 ? '' : `${lines.slice(firstFrame).join('\n')}\n`;
12
+ process.stderr.write(`nmr-shellcheck: internal error: ${message}\n${frames}`);
13
+ }
14
+ process.exit(1);
15
+ }
@@ -10,6 +10,7 @@ export const DEFAULT_CACHEABLE_COMMANDS = [
10
10
  'fix:check',
11
11
  'fmt:check',
12
12
  'lint:check',
13
+ 'lint:shell',
13
14
  'lint:strict',
14
15
  'lint:workflows',
15
16
  'root:check',
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import process from 'node:process';
2
+ import { reportFailure } from '@williamthorsen/nmr-core';
3
+ import { runShellcheck } from "./commands/shellcheck.js";
4
+ import { findMonorepoRoot } from "./workspace.js";
5
+ try {
6
+ process.exitCode = await runShellcheck(findMonorepoRoot(), process.argv.slice(2));
7
+ }
8
+ catch (error) {
9
+ reportFailure('nmr-shellcheck', error);
10
+ process.exitCode = 1;
11
+ }
@@ -0,0 +1,25 @@
1
+ import { type WorkflowTool } from './workflow-tools.js';
2
+ /** How a spawned shellcheck ended. */
3
+ export interface ShellcheckOutcome {
4
+ error?: Error | undefined;
5
+ signal: NodeJS.Signals | null;
6
+ status: number | null;
7
+ }
8
+ export interface RunShellcheckOptions {
9
+ /** Directory under which the pinned tools are cached; defaults to `node_modules/.cache/nmr-tools` at the root. */
10
+ cacheRoot?: string;
11
+ ensure?: (tool: WorkflowTool, cacheRoot: string) => Promise<string>;
12
+ /** Lists the tracked `*.sh` files under the root, relative to it. */
13
+ listFiles?: (monorepoRoot: string) => string[];
14
+ spawn?: (file: string, args: string[], cwd: string) => ShellcheckOutcome;
15
+ }
16
+ /**
17
+ * Lints the monorepo's tracked shell scripts with the pinned shellcheck and returns its exit status. Trailing
18
+ * arguments replace the file list. A repo that does not track any `*.sh` file passes without fetching the tool.
19
+ */
20
+ export declare function runShellcheck(monorepoRoot: string, args: readonly string[], options?: RunShellcheckOptions): Promise<number>;
21
+ /**
22
+ * Lists the `*.sh` files that git tracks under the root, relative to it. git's `*` also matches `/`, so the pathspec
23
+ * reaches every directory.
24
+ */
25
+ export declare function listTrackedScripts(monorepoRoot: string): string[];
@@ -0,0 +1,41 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { UserError } from '@williamthorsen/nmr-core';
5
+ import { describeSignalExitCode } from "../child-process.js";
6
+ import { ensureTool } from "./workflow-tools.js";
7
+ export async function runShellcheck(monorepoRoot, args, options = {}) {
8
+ const shellcheckArgs = args.length > 0 ? [...args] : listPresentScripts(monorepoRoot, options.listFiles);
9
+ if (shellcheckArgs.length === 0) {
10
+ console.info('No shell scripts to lint: the working tree does not contain any tracked *.sh file.');
11
+ return 0;
12
+ }
13
+ const cacheRoot = options.cacheRoot ?? path.join(monorepoRoot, 'node_modules', '.cache', 'nmr-tools');
14
+ const ensure = options.ensure ?? ((tool, root) => ensureTool(tool, { cacheRoot: root }));
15
+ const shellcheckPath = await ensure('shellcheck', cacheRoot);
16
+ const outcome = (options.spawn ?? spawnInherited)(shellcheckPath, shellcheckArgs, monorepoRoot);
17
+ if (outcome.error !== undefined) {
18
+ throw new UserError(`Cannot run shellcheck: ${outcome.error.message}`, { cause: outcome.error });
19
+ }
20
+ if (outcome.signal !== null) {
21
+ return describeSignalExitCode(outcome.signal);
22
+ }
23
+ return outcome.status ?? 1;
24
+ }
25
+ export function listTrackedScripts(monorepoRoot) {
26
+ const result = spawnSync('git', ['ls-files', '-z', '--', '*.sh'], { cwd: monorepoRoot, encoding: 'utf8' });
27
+ if (result.error !== undefined) {
28
+ throw new UserError(`Cannot list tracked shell scripts: ${result.error.message}`, { cause: result.error });
29
+ }
30
+ if (result.status !== 0) {
31
+ throw new UserError(`Cannot list tracked shell scripts: ${result.stderr.trim()}`);
32
+ }
33
+ return result.stdout.split('\0').filter((file) => file !== '');
34
+ }
35
+ function listPresentScripts(monorepoRoot, listFiles = listTrackedScripts) {
36
+ return listFiles(monorepoRoot).filter((file) => fs.existsSync(path.join(monorepoRoot, file)));
37
+ }
38
+ function spawnInherited(file, args, cwd) {
39
+ const result = spawnSync(file, args, { cwd, stdio: 'inherit' });
40
+ return { error: result.error, signal: result.signal, status: result.status };
41
+ }
@@ -46,6 +46,7 @@ export function buildRootScripts(workspaceGlobs) {
46
46
  'fmt:check': 'nmr-fmt --check',
47
47
  lint: 'eslint --fix .',
48
48
  'lint:check': 'eslint .',
49
+ 'lint:shell': 'nmr-shellcheck',
49
50
  'lint:strict': 'strict-lint',
50
51
  'lint:workflows': 'nmr-actionlint',
51
52
  prepush: [{ run: 'audit', shouldDeclineArguments: true }, 'ci'],
@@ -10,7 +10,7 @@ The cache is a working-tree cache, not a build cache: It answers "has this exact
10
10
 
11
11
  ## What is cached
12
12
 
13
- Cacheable by default: `check`, `check:strict`, `ci`, `fix:check`, `fmt:check`, `lint:check`, `lint:strict`, `lint:workflows`, `test`, `test:coverage`, `test:tool`, `test:unit`, `typecheck`, and the `root:` variants `root:check`, `root:lint:check`, `root:lint:strict`, `root:test`, `root:test:tool`, `root:test:unit`, and `root:typecheck`.
13
+ Cacheable by default: `check`, `check:strict`, `ci`, `fix:check`, `fmt:check`, `lint:check`, `lint:shell`, `lint:strict`, `lint:workflows`, `test`, `test:coverage`, `test:tool`, `test:unit`, `typecheck`, and the `root:` variants `root:check`, `root:lint:check`, `root:lint:strict`, `root:test`, `root:test:tool`, `root:test:unit`, and `root:typecheck`.
14
14
 
15
15
  Everything else runs every time:
16
16
 
package/docs/scripts.md CHANGED
@@ -202,6 +202,10 @@ The result does not depend on what the machine has installed. nmr pins actionlin
202
202
 
203
203
  The supported platforms are macOS and Linux on x64 and arm64; on any other, the command fails and names the platform. actionlint reads its own configuration from `.github/actionlint.yaml`, through which a repo can ignore a finding.
204
204
 
205
+ ### Shell lint
206
+
207
+ `lint:shell`, a root command, lints every `*.sh` file that git tracks under the monorepo root with [shellcheck](https://www.shellcheck.net/) and fails on any finding. A repo that does not track any `*.sh` file passes without downloading shellcheck, and a tracked file that is missing from the working tree is skipped. The command runs `nmr-shellcheck`, whose trailing arguments replace the file list, so `nmr lint:shell scripts/release.sh` lints that file alone. It uses the shellcheck that [Workflow lint](#workflow-lint) pins, downloads, and caches. Neither `check`, `check:strict`, nor `root:check` runs it.
208
+
205
209
  ### Root-only
206
210
 
207
211
  The `root:`-prefixed commands operate on root-level code only (not workspace packages).
package/docs/utilities.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Standalone utilities
2
2
 
3
- The binaries behind nmr's default `clean`, `compile`, `fmt`, `lint:workflows`, and package `test` commands, and a check for the `prepublishOnly` hooks of publishable packages.
3
+ The binaries behind nmr's default `clean`, `compile`, `fmt`, `lint:shell`, `lint:workflows`, and package `test` commands, and a check for the `prepublishOnly` hooks of publishable packages.
4
4
 
5
5
  ## `nmr-actionlint`
6
6
 
@@ -74,6 +74,14 @@ Pass `--no-cache`, or set `NMR_NO_CACHE=1`, to run uncached. `nmr --no-cache fmt
74
74
  nmr-fmt --check --no-cache
75
75
  ```
76
76
 
77
+ ## `nmr-shellcheck`
78
+
79
+ Lint the monorepo's tracked `*.sh` files with the pinned shellcheck binary, passing when the repo does not track any. Any arguments replace the file list and reach shellcheck as given. This is the default root `lint:shell` script; [Shell lint](scripts.md#shell-lint) covers its behavior.
80
+
81
+ ```bash
82
+ nmr-shellcheck
83
+ ```
84
+
77
85
  ## `nmr-vitest`
78
86
 
79
87
  Run Vitest from a package directory with the monorepo's shared config. Vitest 5 does not search parent directories for a config, so `nmr-vitest` names it: When the working directory does not contain a `vitest.config.*` or `vite.config.*` of its own, it passes `--config` naming the `vitest.config.*` at the monorepo root, the directory that contains `pnpm-workspace.yaml`. It does not search the directories in between. A package with a config of its own, a monorepo root without a `vitest.config.*`, and a directory outside any monorepo all run Vitest without the flag. An explicit `--config` or `-c` ahead of any `--` passes through unchanged, and so does every other argument. This is the command behind every package-scope `test*` script.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@williamthorsen/nmr",
3
- "version": "0.54.1",
3
+ "version": "0.55.0",
4
4
  "private": false,
5
5
  "description": "Context-aware script runner for pnpm monorepos",
6
6
  "keywords": [
@@ -64,6 +64,7 @@
64
64
  "nmr-fmt": "bin/nmr-fmt.js",
65
65
  "nmr-report-catalog": "bin/nmr-report-catalog.js",
66
66
  "nmr-report-overrides": "bin/nmr-report-overrides.js",
67
+ "nmr-shellcheck": "bin/nmr-shellcheck.js",
67
68
  "nmr-taze": "bin/nmr-taze.js",
68
69
  "nmr-vitest": "bin/nmr-vitest.js"
69
70
  },
@@ -79,7 +80,7 @@
79
80
  "!docs/*.v*.md"
80
81
  ],
81
82
  "dependencies": {
82
- "@williamthorsen/nmr-core": "0.15.0",
83
+ "@williamthorsen/nmr-core": "0.15.1",
83
84
  "@williamthorsen/toolbelt.errors": "0.9.0",
84
85
  "@williamthorsen/toolbelt.filesystem": "0.10.0",
85
86
  "glob": "14.0.3",
@@ -95,7 +96,7 @@
95
96
  "readyup": "0.45.0",
96
97
  "tinyglobby": "0.2.17",
97
98
  "typescript": "6.0.3",
98
- "vite": "8.3.5",
99
+ "vite": "8.3.6",
99
100
  "vitest": "5.1.0",
100
101
  "yaml": "2.9.1"
101
102
  },