Compare commits

..
Author SHA1 Message Date
Will Schurman 8f2a7727cf v0.72.0 2026-10-29 16:11:52 -07:00
Will Schurman 🦦 24109bec32 feat: add notAuthorizedEntity to getUserFacingDenialReason (#732)
# Why

We've encountered a need for showing a field from the not-authorized entity in the user facing error message. While we explicitly didn't pass this in the past since it's not authorized, upon second thought and the concrete use case it should be okay since this is only able to be used within the error message. While it is technically possible to leak unauthorized data this way, the variable name and docblock should at least hint that it's not authorized and caution should be used.

# How

Add entity and evaluation context params to the message fn.

# Test Plan

Run updated tests.
2026-10-29 16:10:16 -07:00
renovate[bot] ee24879f8c chore(deps): update node.js to v24.22.1 (#731)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [node](https://nodejs.org) ([source](https://redirect.github.com/nodejs/node)) | tools | patch | `24.22.0` → `24.22.1` |

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

### [`v24.22.1`](https://redirect.github.com/nodejs/node/releases/tag/v24.22.1): 2026-10-21, Version 24.22.1 'Krypton' (LTS), @&#8203;aduh95

[Compare Source](https://redirect.github.com/nodejs/node/compare/v24.22.0...v24.22.1)

This is a security release.

##### Notable Changes

- (CVE-2026-105481) http: ensure agent data guard works without I/O (James M Snell)
- (CVE-2026-105482) dns: validate resolve inputs for null bytes (James M Snell)
- (CVE-2026-105483) tls: fix ip normalization regression (James M Snell)
- (CVE-2026-106069) tls: reject non-canonical IP addresses (Matteo Collina)
- (CVE-2026-106073) permission: check permission model in realpathSync (RafaelGSS)
- (CVE-2026-106074) crypto: reset random caches across snapshots (Filip Skokan)
- (CVE-2026-111497) src: expose `BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH` (Antoine du Hamel)
- (CVE-2026-111497) deps: brotli: cherry-pick [`0ed4268`](https://redirect.github.com/nodejs/node/commit/0ed4268a4401abcb44720963) (Evgenii Kliuchnikov)
- crypto: update root certificates to NSS 3.131.1 (Antoine du Hamel)
- deps: update c-ares to 1.34.9 (Node.js GitHub Bot)
- deps: update timezone to 2026e (Node.js GitHub Bot)
- deps: upgrade openssl sources to openssl-3.5.9 (Node.js GitHub Bot)
- deps: update undici to 7.30.1 (Node.js GitHub Bot)

##### Commits

- \[[`2a73ee5a89`](https://redirect.github.com/nodejs/node/commit/2a73ee5a89)] - **crypto**: update root certificates to NSS 3.131.1 (Antoine du Hamel) [#&#8203;66877](https://redirect.github.com/nodejs/node/pull/66877)
- \[[`4d6990b33c`](https://redirect.github.com/nodejs/node/commit/4d6990b33c)] - **crypto**: reset random caches across snapshots (Filip Skokan) [nodejs-private/node-private#987](https://redirect.github.com/nodejs-private/node-private/pull/987)
- \[[`4b3c9bbf9f`](https://redirect.github.com/nodejs/node/commit/4b3c9bbf9f)] - **crypto**: harden X.509 conversion and formatting (Filip Skokan) [nodejs-private/node-private#1007](https://redirect.github.com/nodejs-private/node-private/pull/1007)
- \[[`9243b105b6`](https://redirect.github.com/nodejs/node/commit/9243b105b6)] - **crypto**: update root certificates to NSS 3.129 (Node.js GitHub Bot) [#&#8203;66496](https://redirect.github.com/nodejs/node/pull/66496)
- \[[`1e39cd53c7`](https://redirect.github.com/nodejs/node/commit/1e39cd53c7)] - **deps**: update c-ares to 1.34.9 (Node.js GitHub Bot) [#&#8203;66868](https://redirect.github.com/nodejs/node/pull/66868)
- \[[`49dff6f57a`](https://redirect.github.com/nodejs/node/commit/49dff6f57a)] - **deps**: brotli: cherry-pick [`0ed4268`](https://redirect.github.com/nodejs/node/commit/0ed4268a4401abcb44720963) (Evgenii Kliuchnikov) [nodejs-private/node-private#1002](https://redirect.github.com/nodejs-private/node-private/pull/1002)
- \[[`fca511adc5`](https://redirect.github.com/nodejs/node/commit/fca511adc5)] - **deps**: V8: backport [`93cd21e`](https://redirect.github.com/nodejs/node/commit/93cd21e8254b) (Joyee Cheung) [nodejs-private/node-private#1008](https://redirect.github.com/nodejs-private/node-private/pull/1008)
- \[[`18711c7567`](https://redirect.github.com/nodejs/node/commit/18711c7567)] - **deps**: update timezone to 2026e (Node.js GitHub Bot) [#&#8203;66419](https://redirect.github.com/nodejs/node/pull/66419)
- \[[`fa77cfb1ad`](https://redirect.github.com/nodejs/node/commit/fa77cfb1ad)] - **deps**: update timezone to 2026d (Node.js GitHub Bot) [#&#8203;66333](https://redirect.github.com/nodejs/node/pull/66333)
- \[[`b84f9f186b`](https://redirect.github.com/nodejs/node/commit/b84f9f186b)] - **deps**: update archs files for openssl-3.5.9 (Node.js GitHub Bot) [#&#8203;66396](https://redirect.github.com/nodejs/node/pull/66396)
- \[[`ff0664c3ba`](https://redirect.github.com/nodejs/node/commit/ff0664c3ba)] - **deps**: upgrade openssl sources to openssl-3.5.9 (Node.js GitHub Bot) [#&#8203;66396](https://redirect.github.com/nodejs/node/pull/66396)
- \[[`1d4c89ef87`](https://redirect.github.com/nodejs/node/commit/1d4c89ef87)] - **deps**: update undici to 7.30.1 (Node.js GitHub Bot) [#&#8203;66764](https://redirect.github.com/nodejs/node/pull/66764)
- \[[`843a1627dc`](https://redirect.github.com/nodejs/node/commit/843a1627dc)] - **dns**: validate resolve inputs for null bytes (James M Snell) [nodejs-private/node-private#984](https://redirect.github.com/nodejs-private/node-private/pull/984)
- \[[`96c3ccb1fc`](https://redirect.github.com/nodejs/node/commit/96c3ccb1fc)] - **http**: ensure agent data guard works without I/O (James M Snell) [nodejs-private/node-private#983](https://redirect.github.com/nodejs-private/node-private/pull/983)
- \[[`8dc18a6218`](https://redirect.github.com/nodejs/node/commit/8dc18a6218)] - **permission**: check permission model in realpathSync (RafaelGSS) [nodejs-private/node-private#973](https://redirect.github.com/nodejs-private/node-private/pull/973)
- \[[`b5f41529df`](https://redirect.github.com/nodejs/node/commit/b5f41529df)] - **src**: expose `BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH` (Antoine du Hamel) [nodejs-private/node-private#1002](https://redirect.github.com/nodejs-private/node-private/pull/1002)
- \[[`01acf0ee74`](https://redirect.github.com/nodejs/node/commit/01acf0ee74)] - **tls**: reject chains containing blocked public keys (Ulises Gascón) [#&#8203;66871](https://redirect.github.com/nodejs/node/pull/66871)
- \[[`935918e342`](https://redirect.github.com/nodejs/node/commit/935918e342)] - **tls**: reject non-canonical IP addresses (Matteo Collina) [nodejs-private/node-private#982](https://redirect.github.com/nodejs-private/node-private/pull/982)
- \[[`de49c913f2`](https://redirect.github.com/nodejs/node/commit/de49c913f2)] - **tls**: fix ip normalization regression (James M Snell) [nodejs-private/node-private#985](https://redirect.github.com/nodejs-private/node-private/pull/985)
- \[[`9dc4bb57f0`](https://redirect.github.com/nodejs/node/commit/9dc4bb57f0)] - **tools**: retry Gatekeeper check and stapling after notarization (Ryan Aslett) [#&#8203;66855](https://redirect.github.com/nodejs/node/pull/66855)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODAuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-26 08:59:22 -07:00
renovate[bot] c89ff74750 chore(deps): update postgres:18 docker digest to edb0c08 (#728)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [postgres](https://hub.docker.com/_/postgres) ([source](https://redirect.github.com/docker-library/postgres)) | digest | `74935e7` → `edb0c08` |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODAuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-26 08:58:56 -07:00
renovate[bot] 0bdc8acafe chore(deps): update redis docker digest to 97ec881 (#729)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| redis | digest | `2c2dff7` → `97ec881` |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODAuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-26 08:58:51 -07:00
renovate[bot] a6088b0b95 chore(deps): update dependency jdx/mise to v2026.10.19 (#730)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [jdx/mise](https://redirect.github.com/jdx/mise) | patch | `v2026.10.15` → `v2026.10.19` |

---

### Release Notes

<details>
<summary>jdx/mise</summary>

### [`v2026.10.19`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.19): : Security hardening across trust, installs and provenance; lockfiles now rebuilt completely by default

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.18...vfox-v2026.10.19)

Most of this release closes ways an untrusted repository, download host or mirror could run code, leak credentials or get around verification. Some of these fixes make mise stricter, so check **Breaking Changes** before you upgrade. Also in this release: `lockfile_mode = "generate"` is now the default, `mise lsp` sends semantic highlighting, and there is a new `{{ mise_config_dir }}` template variable.

#### Highlights

- **Trust is narrower and tied to the files you trusted.** Help output, shims, hooks, config writes and shell completion no longer trust a project or run its code without your consent. Trust also follows worktrees, symlinks and config directories correctly, and safe mode closes several more gaps.
- **Verification fails closed.** Pinned checksums, Node signatures, SLSA provenance (including the tag it was built from) and GitHub attestations are now enforced. Before, a 404 or a missing file could make mise skip them.
- **Hostile inputs are contained.** Archives, asset names, versions, lockfiles and HTTP responses can no longer write outside their directories, use unbounded memory or disk, or hang the prompt. Credentials no longer show up in install paths, lockfiles, logs or redirects.

#### Added

- **`{{ mise_config_dir }}` template variable.** It resolves to the config directory mise itself uses: `MISE_CONFIG_DIR`, or else `xdg_config_home` + `/mise`. It is available wherever `xdg_config_home` is: config templates, `.miserc.toml` and settings paths. This is useful for dotfiles variants that link into `conf.d`. [#&#8203;14886](https://redirect.github.com/jdx/mise/pull/14886) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;ponko2](https://redirect.github.com/ponko2))

  ```toml
  [dotfiles."git-tools"]
  source = "git"
  mode = "symlink"
  variants = [{ default = true, target = "{{ mise_config_dir }}/conf.d/git-tools" }]
  ```

- **Semantic highlighting in `mise lsp`.** Editors can now color task names, tools, env vars, `[vars]` keys, `_.` directives, `{{ }}`/`{% %}`/`{# #}` template delimiters and deprecated keys in `mise.toml`. To turn it off, pass `{"semanticTokens": false}` in `initializationOptions`. [#&#8203;14918](https://redirect.github.com/jdx/mise/pull/14918) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`extract_max_ratio` setting (global only).** It caps how far an archive may expand during extraction. See Security below. [#&#8203;14915](https://redirect.github.com/jdx/mise/pull/14915) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`github.enterprise_hosts` setting (global only, `MISE_GITHUB_ENTERPRISE_HOSTS`).** It lists the GitHub Enterprise hosts that receive the GitHub token on `/api/v3` URLs over https. [#&#8203;14913](https://redirect.github.com/jdx/mise/pull/14913) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **New vfox attestation fields `slsa_source_repository` and `slsa_source_tag`.** Plugins can use them to pin the repository and tag that SLSA provenance must come from. [#&#8203;14904](https://redirect.github.com/jdx/mise/pull/14904), [#&#8203;14924](https://redirect.github.com/jdx/mise/pull/14924) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Changed

- **`lockfile_mode = "generate"` is now the default.** Installs now rebuild `mise.lock` from the current requests, reuse unchanged entries and also lock the other platforms. A lockfile committed from one machine therefore no longer fails `mise install --locked` on another platform because of missing entries. Neither mode creates a lockfile (use `mise lock` or `lockfile = true`), and the lockfile format is unchanged. To keep the previous behavior, set `lockfile_mode = "merge"` or `MISE_LOCKFILE_MODE=merge`. [#&#8203;14893](https://redirect.github.com/jdx/mise/pull/14893) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Security

**Trust and safe mode**

- Several actions no longer count as consent to trust a project: printing `mise run --help`/`mise watch --help`, running a shim, a hook starting `mise run`, an MCP call, or `mise set`/`unset`/`tasks add` saving config. Config writes now ask before they trust an untrusted sibling config. A task counts as trusted only if every config that adds to it is trusted. The MCP server refuses untrusted file tasks, task names that look like file paths, and inline tool options. [#&#8203;14903](https://redirect.github.com/jdx/mise/pull/14903) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Trust now stays with the files you trusted. A forged git worktree, a symlink to your global config, a clone named `.mise`, or a project `.miserc.toml` can no longer borrow trust or hide global config. In paranoid mode, idiomatic version files, each local task file and project-named aqua registries need trust of their own. Remote git includes pinned to a commit SHA must check out exactly that commit. [#&#8203;14902](https://redirect.github.com/jdx/mise/pull/14902) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Safe mode (`MISE_SAFE=1`) now also blocks:

  - a project's lazy tools, `[deps]`, `path:` versions and spm `install_command`;
  - all S3 requests;
  - forge tokens and netrc credentials sent to hosts that project config names;
  - `env` and filesystem helpers in project templates.

  In every mode, a project `.miserc.toml` gets a restricted, size-limited template language, and `bin_path` must stay inside the tool's install directory. [#&#8203;14900](https://redirect.github.com/jdx/mise/pull/14900) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Pressing TAB no longer runs untrusted task code. The dynamic completers (`complete run=`, `complete delegate=`, `choices run=`, `mount`) only run for trusted config. mise's own completers quote typed words, and control characters are removed from candidates. Quoting for fish and PowerShell is also fixed. [#&#8203;14898](https://redirect.github.com/jdx/mise/pull/14898) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Hook commands are now rendered once, when they load. Before, a directory name containing `{{ exec(...) }}` could run code from a `cd` hook. A project's `enter`, `leave` and `watch_files` hooks now start in the project root. `mise use`, `mise upgrade --bump` and every other writer refuse to write a version containing template syntax, and a rewritten option keeps its `{{ env.X }}` template instead of the rendered secret. [#&#8203;14897](https://redirect.github.com/jdx/mise/pull/14897) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `cd`-ing into a hostile repository can no longer hang or crash `hook-env` or make mise print files from outside the repo. Causes this covers include configs linked to devices, symlink mazes in task directories, non-UTF-8 paths, oversized files, glob characters in paths, and version files that link to another file. [#&#8203;14916](https://redirect.github.com/jdx/mise/pull/14916) ([@&#8203;jdx](https://redirect.github.com/jdx))

**Install verification**

- A checksum pinned in `mise.lock` is now enforced for erlang, npm, spm and http instead of being replaced or skipped. If Node's `SHASUMS256.txt.sig` is missing, the install fails. bun and deno check the publisher's sha256 when there is no lock entry. A locked node or spm artifact that returns 404 no longer silently falls back to a source build. [#&#8203;14899](https://redirect.github.com/jdx/mise/pull/14899) ([@&#8203;jdx](https://redirect.github.com/jdx))
- SLSA, attestation and signed-checksum checks now fail closed:

  - the provenance file can no longer stand in for the artifact;
  - `slsa_signer_*` pins require provenance;
  - `mise lock` runs the cosign, minisign and SLSA checks that aqua recipes declare;
  - SHA-512 signed checksum files are compared with the artifact;
  - aqua honors `attestations_since`.

  [#&#8203;14908](https://redirect.github.com/jdx/mise/pull/14908) ([@&#8203;jdx](https://redirect.github.com/jdx))
- The SLSA signing run must come from the workflow's repository or the tool's own repository. Attestations must name the requested repository. Public-good bundles without a Rekor entry are rejected. [#&#8203;14904](https://redirect.github.com/jdx/mise/pull/14904) ([@&#8203;jdx](https://redirect.github.com/jdx))
- SLSA provenance built from a different tag is now rejected, so a mirror can't serve an older release's genuine artifact and provenance as a newer version. [#&#8203;14924](https://redirect.github.com/jdx/mise/pull/14924) ([@&#8203;jdx](https://redirect.github.com/jdx))
- packslip signer pins are checked by repository ID, including `workflow` pins. Backdated GitLab `released_at` dates and bundles with no transparency-log time can no longer get around `minimum_release_age`. [#&#8203;14912](https://redirect.github.com/jdx/mise/pull/14912) ([@&#8203;jdx](https://redirect.github.com/jdx))

**Paths, subprocesses and resource limits**

- Release asset names must be plain file names. Archives from the github, http, aqua, cargo-binstall, packslip and vfox backends may not contain symlinks that point outside the install directory. [#&#8203;14895](https://redirect.github.com/jdx/mise/pull/14895) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Resolved versions, plugin names and task stub names are checked before they become paths or URL segments. A remote version containing `..`, quotes, `$` or a leading `-` now fails as an invalid tool version. [#&#8203;14901](https://redirect.github.com/jdx/mise/pull/14901) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Git lookups, build tools (ruby-build, python-build, `cargo install`, `gem install`) and npm now run outside the project directory, so the repo's `.git/config` and other project files can't change what they do. Untrusted values are kept out of their command-line arguments. In safe mode, asdf `exec-env` is refused. [#&#8203;14896](https://redirect.github.com/jdx/mise/pull/14896) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Committed symlinks around lockfiles, tool stubs and the remote task cache can no longer make mise read, write or delete files outside the repo. An untrusted lockfile still pins versions and checksums, but it can no longer switch a tool's backend, add inline options or supply download URLs. [#&#8203;14906](https://redirect.github.com/jdx/mise/pull/14906) ([@&#8203;jdx](https://redirect.github.com/jdx))
- The task sandbox has fewer escapes:

  - `--allow-write` refuses project symlinks that lead outside the project;
  - `--deny-net` also blocks other socket families, io_uring and x32 syscalls;
  - an empty `allow_write` blocks all writes instead of turning the sandbox off;
  - macOS always uses `/usr/bin/sandbox-exec`;
  - OCI whiteouts can't delete through planted symlinks.

  [#&#8203;14911](https://redirect.github.com/jdx/mise/pull/14911) ([@&#8203;jdx](https://redirect.github.com/jdx))
- HTTP response bodies are capped at 128 MiB, and slow bodies are bounded by `http_download_timeout`. Downloads are saved exactly as sent. Archive extraction stops once the output exceeds both 256 MiB and 100 times the download size (`extract_max_ratio`). [#&#8203;14915](https://redirect.github.com/jdx/mise/pull/14915) ([@&#8203;jdx](https://redirect.github.com/jdx))

**Credentials**

- The GitHub token is sent only to GitHub API hosts or the configured `api_url`, not to any host that serves `/api/v3`. Release caches are keyed by the exact repository. A download that fails its pinned checksum is not kept. A project can no longer mark a task `global`. In safe mode, remote task files from project config are not fetched. [#&#8203;14913](https://redirect.github.com/jdx/mise/pull/14913) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Credentials are now kept out of install directory names, install manifests, `mise.lock`, `Referer` headers, logs and error messages. Age keys and Forgejo tokens are redacted in `mise doctor`, `mise settings` and `mise tool`. Shebang task scripts are readable only by their owner, and multi-line secrets are redacted in task output. [#&#8203;14917](https://redirect.github.com/jdx/mise/pull/14917) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Fixed

- `uv_venv_auto` could fork-bomb the machine when uv probed mise's python shims while creating a venv. mise now skips venv creation when it is started from inside that venv creation. [#&#8203;14927](https://redirect.github.com/jdx/mise/pull/14927) ([@&#8203;jdx](https://redirect.github.com/jdx))
- With `minimum_release_age` set, `mise upgrade` no longer downgrades tools that use date versions with leading zeros (for example `2026.10.21` to `2026.08.19`). [#&#8203;14923](https://redirect.github.com/jdx/mise/pull/14923) ([@&#8203;jdx](https://redirect.github.com/jdx))
- File tasks that `extends` a task template now use the template's `usage` spec, so its flags show in `-h` and are accepted. [#&#8203;14888](https://redirect.github.com/jdx/mise/pull/14888) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `mise tasks add --file` now quotes and escapes `#MISE` header values. Before, `--dir` and values containing quotes produced invalid TOML that broke the next `mise run`. [#&#8203;14925](https://redirect.github.com/jdx/mise/pull/14925) ([@&#8203;xucian](https://redirect.github.com/xucian))
- `mise uninstall` can now remove installs whose directories deny their owner write access, such as read-only `0555` runtime trees. [#&#8203;14883](https://redirect.github.com/jdx/mise/pull/14883) ([@&#8203;HengYangDS](https://redirect.github.com/HengYangDS))
- A `pypi:` tool with a private `git+ssh://` github.com source now lists versions through `git ls-remote` over SSH when GitHub can't see the repository. [#&#8203;14905](https://redirect.github.com/jdx/mise/pull/14905) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;owpac](https://redirect.github.com/owpac))

#### Breaking Changes

Most setups need no changes. Check these cases:

- **Lockfiles:** installs now rewrite `mise.lock` in `generate` mode. To keep the old behavior, set `lockfile_mode = "merge"`.
- **Trust prompts:** `mise set`/`unset`/`tasks add` in a directory with an untrusted sibling config now ask for trust, or fail without a terminal. A project that has only a `mise-tasks/` directory needs `mise trust .` before its dynamic task completions work. In paranoid mode, run `mise trust <file>` once for each existing task file.
- **Worktrees and includes:** a worktree you moved by hand needs `git worktree repair` before it shares trust again. A remote include pinned to an annotated tag's object ID must pin the commit SHA instead. Your own `~/.miserc.toml` can no longer ignore the global config.
- **Project `.miserc.toml`:** templates that read `env` or use loops or functions other than `arch()`, `os()`, `os_family()`, `libc()`, `avx2()` and `num_cpus()` are no longer rendered. Move them to the global `.miserc.toml`.
- **Safe mode:** project templates that read an env var without a `default` now fail to render. Projects that point at a private forge or a netrc-protected server can no longer list versions there.
- **Node:** mirrors that don't copy the `.sig` files, and early releases without one (for example 4.0.0 and 5.12.0), need `node.gpg_verify = false`.
- **SLSA:** a `github:` tool that sets `slsa_signer_identity` but builds from a branch instead of a tag no longer verifies. A lock entry that has a checksum but no provenance installs on the checksum alone; re-run `mise lock` or set `locked_verify_provenance`.
- **packslip:** after a repository rename, a pin without a repository ID needs `mise packslip forget <tool>`.
- **GitHub Enterprise:** `http:` tools, aqua packages and remote tasks on `/api/v3` URLs no longer get the GitHub token automatically. Add the host to `github.enterprise_hosts` in global config, or set `api_url`.
- **Credentials in URLs:** `mise lock` refuses URLs whose query has a credential-like parameter. Use `headers` or netrc instead. Tools installed under a directory name that contained credentials are reinstalled under a clean name.
- **Task sandbox:** `--deny-write`/`allow_write` sandboxes no longer start on Linux before 6.2. Programs that need io_uring no longer run under `--deny-net`. To allow writes through a project symlink that points outside the project, name its target instead.
- **Archives:** archives that contain symlinks pointing outside the install directory fail to install (brew casks and aqua dmg/pkg are exempt). Archives that legitimately expand more than 100 times and past 256 MiB need a higher `extract_max_ratio`, or `0` to turn the check off.
- **Hooks:** a project's `enter`, `leave` and `watch_files` hooks now start in the project root. Use `$MISE_PROJECT_ROOT` if a hook needs the root explicitly.
- **Other changes:**
  - `MISE_OVERRIDE_*_FILENAMES` entries are matched as literal file names;
  - config, lock and task files over 16 MiB are refused;
  - a `.tool-versions` or idiomatic version file that links to a file with a different name is skipped;
  - a relative `go.repo` resolves from `$HOME`;
  - a bare `OWNER/REPO` passed to `bootstrap --adopt` that matches a local path is an error (write `./OWNER/REPO` for the local path).

#### New Contributors

- [@&#8203;xucian](https://redirect.github.com/xucian) made their first contribution in [#&#8203;14925](https://redirect.github.com/jdx/mise/pull/14925)
- [@&#8203;HengYangDS](https://redirect.github.com/HengYangDS) made their first contribution in [#&#8203;14883](https://redirect.github.com/jdx/mise/pull/14883)

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.18...v2026.10.19>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.18`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.18): : mise lsp: a language server for mise.toml

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.17...vfox-v2026.10.18)

mise now includes a language server, `mise lsp`, which gives editors diagnostics, completion, hover, navigation and quick fixes for `mise.toml`. Doctor checks can depend on other checks, and `mise dot history purge` erases a tracked file from dotfiles history. This release also fixes many lockfile, prune, Windows and dotfiles issues.

#### Added

- **`mise lsp`, a language server for mise config files.** It runs over stdin/stdout, so any editor with an LSP client can use it (Neovim, Helix, Emacs, Zed, VS Code, ...). It uses the schema and formatter of the installed mise, so its answers match your version. [#&#8203;14744](https://redirect.github.com/jdx/mise/pull/14744), [#&#8203;14808](https://redirect.github.com/jdx/mise/pull/14808), [#&#8203;14811](https://redirect.github.com/jdx/mise/pull/14811), [#&#8203;14812](https://redirect.github.com/jdx/mise/pull/14812) ([@&#8203;jdx](https://redirect.github.com/jdx))

  - **Diagnostics:** TOML syntax errors, unknown keys with a "did you mean" suggestion, values of the wrong type, and deprecated keys. It warns about task references that point to no task and reports `depends` cycles as errors.
  - **Completion and hover:** config keys and enum or boolean values, task names in `depends`, `depends_post`, `wait_for`, `run = [{ task = ... }]` and `extends`, and tool names from the registry under `[tools]`. Hover shows the description and backends of a tool, or the description and command of a task.
  - **Navigation and editing:** go to a task's definition (also in included files), find its references, and rename a task together with every reference in the file. Quick fixes replace an unknown key or task name, and rewrite a deprecated key such as `env_path` to the key that replaces it. Formatting gives the same output as `mise fmt`.
  - It only handles files that mise loads as configs (`mise.toml`, `mise.<env>.toml`, `conf.d/*.toml`, ...) and ignores `Cargo.toml`, `pyproject.toml` and other TOML files, so you can attach it to the TOML filetype. Configs are parsed but never rendered, and it makes no network requests, so opening an untrusted file runs nothing. Clients can turn off `formatting`, `hover`, `completion`, `definition`, `references` or `rename` with `initializationOptions`.

  ```lua
  vim.lsp.config("mise", { cmd = { "mise", "lsp" }, filetypes = { "toml" }, root_markers = { "mise.toml" } })
  vim.lsp.enable("mise")
  ```

- **Doctor checks can depend on other checks.** Add `depends` (a single name or a list) to a check in `[doctor.checks.*]`. If a dependency fails, errors, is skipped or is blocked, the dependent check is reported as `blocked`, and its command and hint are skipped. A `blocked` result does not change the exit code on its own. An unknown dependency name or a cycle is reported as a config error, and then no checks run. [#&#8203;14773](https://redirect.github.com/jdx/mise/pull/14773) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [doctor.checks."examplectl:project"]
  depends = ["examplectl:auth"]
  run = 'test -n "$(examplectl config get project)"'
  ```

- **`mise dot history purge <path>` removes a tracked path from local dotfiles history.** Use it after tracking a secret by mistake. Checkpoints that changed only that path are removed. All other checkpoints keep their numeric IDs, messages and dates, so `history`, `rollback` and `undo` keep working. Use `--dry-run` to preview and `--yes` to skip the prompt. `--backup` keeps the old history under `refs/mise/purge-backup/`, and `--keep-objects` skips pruning. The command refuses if any version of the path is already reachable from the origin, because mise never force-pushes. [#&#8203;14831](https://redirect.github.com/jdx/mise/pull/14831) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **A dotfiles variant's `target` can be a template**, so one shared config can link into locations that differ between machines. Only the variant `target` is rendered. Templates get the standard config context (`env`, `xdg_config_home`, `config_root`, ...), but `exec()` and `vars` are not available. The rendered path must be absolute or start with `~/`. [#&#8203;14856](https://redirect.github.com/jdx/mise/pull/14856) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;ponko2](https://redirect.github.com/ponko2))

  ```toml
  [dotfiles.examplectl]
  source = "dotfiles/examplectl"
  mode = "symlink"
  variants = [{ default = true, target = "{{ xdg_config_home }}/examplectl" }]
  ```

- **`mise upgrade --bump --pin` writes resolved versions to config.** Requests such as `latest` or `20` become the exact version, for example `24.14.0`, even if the tool was already up to date. With the `pin` setting (`MISE_PIN=1`), a plain `mise upgrade --bump` now does the same. `--dry-run` shows what would change. [#&#8203;14791](https://redirect.github.com/jdx/mise/pull/14791) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`[bootstrap.hooks]` tables accept `run_windows`**, as tasks and `[hooks]` already do. On Windows it is used instead of `run`. A table with only `run_windows` does nothing on other platforms. [#&#8203;14851](https://redirect.github.com/jdx/mise/pull/14851) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **Registry:** `goose-agent` (`aqua:aaif-goose/goose`), the Goose AI agent CLI. The installed binary is still named `goose`. [#&#8203;14822](https://redirect.github.com/jdx/mise/pull/14822) ([@&#8203;kwsantiago](https://redirect.github.com/kwsantiago))

#### Changed

- **`pin` now also affects a plain `mise upgrade --bump`.** If you have `pin` enabled, your next `mise upgrade --bump` rewrites non-exact requests such as `"22"` to exact versions such as `"22.1.0"`. Without `pin`, requests keep their precision as before. [#&#8203;14791](https://redirect.github.com/jdx/mise/pull/14791) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **`mise unuse tool@version` only prunes the version you named.** It used to prune every unused version of the tool. If the named version is kept, mise now explains why, for example `[email protected].0 is kept: required by ~/proj/mise.toml`. `mise unuse node` without a version still prunes all unused versions of node. [#&#8203;14863](https://redirect.github.com/jdx/mise/pull/14863) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;Strepto](https://redirect.github.com/Strepto))

#### Fixed

##### Lockfiles

- If a pipx tool selects its own Python (`python = "3.12"`), `mise use`, `mise up -l`, `mise lock pipx:...` and `mise lock python` now keep both that Python and the project's Python in `mise.lock`. Before, one entry was dropped and `mise install --locked` failed. [#&#8203;14794](https://redirect.github.com/jdx/mise/pull/14794) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;AllDmeat](https://redirect.github.com/AllDmeat))
- `mise install tool@latest` no longer fails with "lockfile contains multiple resolutions" when nested configs pin different versions. The nearest lockfile now decides. [#&#8203;14818](https://redirect.github.com/jdx/mise/pull/14818) ([@&#8203;jdx](https://redirect.github.com/jdx))
- When a monorepo root config is in `.config/mise.toml`, the shared lockfile is now written to `.config/mise.lock` instead of `<root>/mise.lock`. [#&#8203;14860](https://redirect.github.com/jdx/mise/pull/14860) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;fxsalazar](https://redirect.github.com/fxsalazar))
- `mise lock` for `pipx:` and `pypi:` tools now accepts PyPI simple indexes that respond with a PEP 691 `+html` content type, such as Azure Artifacts. [#&#8203;14852](https://redirect.github.com/jdx/mise/pull/14852) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;alexanderlinne](https://redirect.github.com/alexanderlinne))
- Locked conda installs reuse cached downloads whose checksum is known, instead of downloading the package again. [#&#8203;14866](https://redirect.github.com/jdx/mise/pull/14866) ([@&#8203;zeitlinger](https://redirect.github.com/zeitlinger))

##### Install, upgrade and prune

- A project-level `[hooks].postinstall` now runs with the version that was just installed. Before, during `mise upgrade` of a fuzzy request such as `latest`, its `PATH` pointed at the old version. [#&#8203;14853](https://redirect.github.com/jdx/mise/pull/14853) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;sam9191](https://redirect.github.com/sam9191))
- `mise prune` no longer aborts with "points to an unknown mise Python installation" when a pypi/pipx tool's receipt reaches mise's Python through a minor-version link such as `python/3.14`. [#&#8203;14857](https://redirect.github.com/jdx/mise/pull/14857), [#&#8203;14874](https://redirect.github.com/jdx/mise/pull/14874) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;chancez](https://redirect.github.com/chancez))
- With `MISE_OVERRIDE_TOOL_VERSIONS_FILENAMES` set, tracked `.tool-versions` files are still loaded. Before, `mise prune` could remove versions that those projects still used. [#&#8203;14779](https://redirect.github.com/jdx/mise/pull/14779) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `java = "latest"` now selects the newest installed build when two installed versions differ only after `+` (for example `+7` and `+101`). [#&#8203;14876](https://redirect.github.com/jdx/mise/pull/14876) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;javabrett](https://redirect.github.com/javabrett))
- `gem:` installs and `bundle install` no longer fail when `mise` is not on `PATH`. This applies to Rubies installed with this release or later. [#&#8203;14850](https://redirect.github.com/jdx/mise/pull/14850) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;fxsalazar](https://redirect.github.com/fxsalazar))
- packslip tools no longer warn on every `mise outdated` or `mise up` about skipping a version that is past the `minimum_release_age` cutoff when that version is already installed. [#&#8203;14835](https://redirect.github.com/jdx/mise/pull/14835) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;alx-xo](https://redirect.github.com/alx-xo))
- Homebrew tap formulae that define their own `Requirement` classes no longer break `mise bootstrap packages apply`. mise does not enforce these requirements and logs a warning about them. [#&#8203;14807](https://redirect.github.com/jdx/mise/pull/14807) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `mise oci build` images that include `rust` now contain a working `cargo` and `rustc`, with `CARGO_HOME` and `RUSTUP_HOME` set, so containers no longer download the toolchain again on first use. The build now fails if rust comes from a rustup that mise does not manage. [#&#8203;14854](https://redirect.github.com/jdx/mise/pull/14854) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;eiswind](https://redirect.github.com/eiswind))

##### Network and backends

- In official rustls Linux builds, mise falls back to its bundled Mozilla root certificates, with a warning, when no system CA certificates can be loaded (for example in minimal containers, or when `SSL_CERT_FILE` points to a missing file). Roots that do load are not changed. [#&#8203;14817](https://redirect.github.com/jdx/mise/pull/14817) ([@&#8203;jdx](https://redirect.github.com/jdx))
- GitHub assets now download correctly when `.netrc` has credentials for `github.com`. The reachability check no longer sends those credentials, which had caused a fallback to the rate-limited API. [#&#8203;14786](https://redirect.github.com/jdx/mise/pull/14786) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `github:` tools for which mise-versions returned an empty release list (such as `github:caarlos0/svu`) now fall back to paged listing, so their versions are found. [#&#8203;14877](https://redirect.github.com/jdx/mise/pull/14877) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Expired glab OAuth2 tokens are now ignored instead of sent. This fixes `401 Unauthorized` errors when installing `gitlab:` tools from public projects. [#&#8203;14873](https://redirect.github.com/jdx/mise/pull/14873) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;chung1905](https://redirect.github.com/chung1905))

##### Windows

- Zip archives that contain read-only files, such as the Flutter SDK, now extract without "Access is denied". [#&#8203;14869](https://redirect.github.com/jdx/mise/pull/14869) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;akiWagashi](https://redirect.github.com/akiWagashi))
- uv-locked `pipx:` tools whose console script names end in `.py` (for example `pipx:clang-format`) now install. [#&#8203;14825](https://redirect.github.com/jdx/mise/pull/14825) ([@&#8203;jdx](https://redirect.github.com/jdx))
- In tasks, `run_windows = []` now skips the task on Windows instead of running `run`. [#&#8203;14859](https://redirect.github.com/jdx/mise/pull/14859) ([@&#8203;jdx](https://redirect.github.com/jdx))

##### Tasks, bootstrap and generate

- `mise tasks list` now works as an alias for `mise tasks ls`. If you have a task named `list`, that task still runs. [#&#8203;14878](https://redirect.github.com/jdx/mise/pull/14878) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;mcstafford-git](https://redirect.github.com/mcstafford-git))
- `mise bootstrap` no longer fails when a namespaced task such as `system:bootstrap` exists but no task is named exactly `bootstrap`. [#&#8203;14858](https://redirect.github.com/jdx/mise/pull/14858) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `mise generate install-script --write` and `mise generate task-stubs` now write files that end with a newline. Existing stubs regenerate as before. [#&#8203;14819](https://redirect.github.com/jdx/mise/pull/14819) ([@&#8203;itochan](https://redirect.github.com/itochan))
- `curl https://mise.run | sh` no longer fails when `~/.config/curlrc` sets `write-out`. [#&#8203;14830](https://redirect.github.com/jdx/mise/pull/14830) ([@&#8203;jdx](https://redirect.github.com/jdx))

##### Dotfiles

- A `mode = "track"` entry declared in a `config.<env>.toml` stays tracked on machines that don't select that env. Before, those machines published a removal of the entry. [#&#8203;14815](https://redirect.github.com/jdx/mise/pull/14815) ([@&#8203;jdx](https://redirect.github.com/jdx))
- One saved enrollment under a parent directory that is now a symlink no longer stops automatic capture for all other tracked paths. It is reported as invalid instead. [#&#8203;14871](https://redirect.github.com/jdx/mise/pull/14871) ([@&#8203;jdx](https://redirect.github.com/jdx))
- The JSON schema now declares the keys of `[dotfile_groups.<name>.entries]`, so strict validators such as Tombi accept valid entries and report unknown keys. [#&#8203;14810](https://redirect.github.com/jdx/mise/pull/14810) ([@&#8203;jdx](https://redirect.github.com/jdx))

##### Other

- The aqua registry built into mise is now encoded the same way on every build, so builds of the same source are reproducible. [#&#8203;14809](https://redirect.github.com/jdx/mise/pull/14809) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Performance

- mise now checks `trusted_config_paths` after the cheaper trust rules and resolves each entry at most once per process. This speeds up `hook-env` when entries are on slow mounts such as autofs `/home` on macOS. [#&#8203;14875](https://redirect.github.com/jdx/mise/pull/14875) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Documentation

- The dotfiles docs now explain repo-only files, how existing repos fit in, undoing an accidental track, and what `add --no-apply`, `dot diff` and `exclude` do. [#&#8203;14829](https://redirect.github.com/jdx/mise/pull/14829), [#&#8203;14862](https://redirect.github.com/jdx/mise/pull/14862) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### New Contributors

- [@&#8203;kwsantiago](https://redirect.github.com/kwsantiago) made their first contribution in [#&#8203;14822](https://redirect.github.com/jdx/mise/pull/14822)

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.17...v2026.10.18>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.17`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.17): : Shell names in bootstrap login_shell, templated doctor checks, and a per-plugin vfox cache directory

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.15...vfox-v2026.10.17)

`bootstrap.user.login_shell` now accepts a shell name such as `fish` instead of a full path. `[doctor.checks]` can use templates, and vfox backend plugins get their own cache directory. This release also fixes PATH handling in zsh setups that deduplicate PATH, stale task cache hits, a pipx interpreter mix-up on macOS, and removes trust in the compromised eMudhra CA certificates.

It also includes the changes prepared for 2026.10.16, which was tagged but never published: relative and templated `write_targets` paths, version aliases from vfox backend plugins, keyring passwords for private PyPI indexes, `vfox-backend:` packslip plugin sources, and a change to where `find_up` starts (see Changed and Upgrading).

#### Added

- **`[bootstrap.user].login_shell` accepts a shell name.** A config shared across machines no longer needs to know where each system installs the shell. mise looks up the name when it checks or applies the setting, which happens after `bootstrap.packages` has installed the shell. It searches `PATH` first (never the mise shims directory), then common package-manager locations: `/opt/homebrew/bin`, `/usr/local/bin`, `/home/linuxbrew/.linuxbrew/bin`, `~/.linuxbrew/bin`, `/usr/bin` and `/bin`. If no executable is found, `mise bootstrap user apply` fails without changing `/etc/shells` or the account, and `status` reports `not installed`. `mise bootstrap user status` shows the path it found, and `--json` output has a new `resolved` field. Absolute paths work as before. [#&#8203;14770](https://redirect.github.com/jdx/mise/pull/14770) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [bootstrap.packages]
  "brew:fish" = "latest"

  [bootstrap.user]
  login_shell = "fish"
  ```

- **Doctor checks support templates.** `run`, `description` and `hint` in `[doctor.checks.*]` are rendered with the template context of the config file that declares them, the same way hooks are. A check can now use a value from `[vars]` instead of hard-coding it. `dir` is not rendered. If a template fails, only that check reports `ERROR` and the other checks still run. Text that already contains `{{` or `{%` in these fields is now parsed as a template. [#&#8203;14771](https://redirect.github.com/jdx/mise/pull/14771) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [doctor.checks."project-a:env"]
  description = "project-a has a .env file"
  run = 'test -f {{ vars.repos_dir | quote }}/project-a/.env'
  hint = "cp {{ vars.repos_dir }}/project-a/.env.example {{ vars.repos_dir }}/project-a/.env"
  ```

- **vfox plugins get `RUNTIME.cacheDirPath`.** This is a cache directory for each plugin at `$MISE_CACHE_DIR/plugins/<plugin-name>`. mise creates it before running any hook, and every hook of the plugin sees the same path. Unlike `pluginDirPath`, it is kept when the plugin is reinstalled. `mise cache clear` deletes it, so plugins must handle it being missing. It is `nil` when no cache directory is available. [#&#8203;14776](https://redirect.github.com/jdx/mise/pull/14776) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`settings.write_targets` accepts relative and templated paths.** Before, only absolute or `~/` paths worked, so dotfiles shared between machines with different `MISE_CONFIG_DIR` or `XDG_CONFIG_HOME` had to hardcode the config directory. Templates are now rendered, and a relative result is joined to the `config_root` of the settings file that declares it. For a global file that is `$HOME`, so the portable spelling uses the file's own directory. The resolved path must still be a global config file that mise loads. If a template fails to render, mise warns, and `mise use --global` fails with "must resolve to an absolute path" instead of writing to the default file. [#&#8203;14742](https://redirect.github.com/jdx/mise/pull/14742) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  # ~/.config/mise/conf.d/settings.toml
  [settings.write_targets]
  tools = "{{ config_source | dirname }}/tools.toml"
  ```

- **vfox backend plugins can report version aliases.** `BackendListVersions` can return an `aliases` table, so a registry's moving names resolve to real versions. Before, `"mise-ghcup:ghc" = "recommended"` passed the literal string to the plugin, installed into `installs/.../recommended`, never followed the tag when it moved, and showed `recommended` in `mise ls` and the lockfile. Now `ghc@recommended` resolves to `9.10.3`, installs into `9.10.3/`, and the lockfile records `9.10.3`. Aliases you define in config still win. They are cached like the version list, and an expired cache still answers offline. Older mise versions ignore the `aliases` field, so plugins can adopt it right away. [#&#8203;14732](https://redirect.github.com/jdx/mise/pull/14732) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;cprecioso](https://redirect.github.com/cprecioso))

  ```lua
  return {
    versions = { "9.8.4", "9.10.3", "9.14.1" },
    aliases = { recommended = "9.10.3" },
  }
  ```

- **`mise lock` and version listing work with a PyPI index that uses a keyring.** With an index such as Azure Artifacts and `artifacts-keyring`, `mise install` worked because uv read the password from its keyring provider, but mise's own requests sent no credentials and failed with `401 Unauthorized`. Set the new `pypi.keyring_provider` (`disabled` by default, or `subprocess`; env var `MISE_PYPI_KEYRING_PROVIDER`) and give the registry URL a username without a password. mise then runs `keyring get <url> <username>`, as uv does, and sends the result as HTTP Basic credentials when it lists versions and when `mise lock` reads a release's `requires-python`. The password is never written to the lockfile or the version cache. The `keyring` executable must be on `PATH`. If it is missing or has no entry, mise sends the request without credentials. [#&#8203;14733](https://redirect.github.com/jdx/mise/pull/14733) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [settings.pypi]
  keyring_provider = "subprocess"
  registry_url = "https://[email protected]/org/project/_packaging/feed/pypi/simple/{}/"
  ```

- **`vfox-backend:` works as a prefix for packslip plugin sources.** A vfox backend plugin can be installed from a signed packslip archive, both from the CLI and in `[plugins]`. Before, `mise plugins install vfox-backend:foo 'packslip:owner/repo#1.0.0'` failed with `packslip plugin sources require the vfox plugin type`. An explicit `asdf:` or `package:` prefix is still rejected, and the error now says "vfox or vfox-backend". The archive still declares `extensions.mise.plugin = "vfox"`. [#&#8203;14727](https://redirect.github.com/jdx/mise/pull/14727) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```sh
  mise plugins install vfox-backend:my-backend 'packslip:your-org/my-backend#1.0.0'
  ```

- `mise bootstrap packages list` is now an alias for `status`, alongside `ls`. [#&#8203;14709](https://redirect.github.com/jdx/mise/pull/14709) ([@&#8203;himkt](https://redirect.github.com/himkt))

#### Changed

- **`find_up` in `env._.file` starts at the config root.** Every other relative path in a config resolves against the config root, but `find_up` started at the current directory. A relative `find_up` path now starts at the config root and walks up through its parents, which suits a monorepo whose root `.env` applies to every package. An absolute path starts at its own directory. A global config that wants to search from wherever mise runs can use `cwd`. The `env_file` setting still discovers dotenv files up from the current directory and is unchanged. See Upgrading. [#&#8203;14734](https://redirect.github.com/jdx/mise/pull/14734) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;thernstig](https://redirect.github.com/thernstig))

  ```toml
  # ~/.config/mise/config.toml
  [env]
  _.file = { path = "{{cwd}}/.env", find_up = true }
  ```

- **`allow_builds` approves only the packages it lists.** With the embedded aube installer, `allow_builds = ["re2"]` also ran the install scripts of every package on aube's bundled trusted-dependencies list, such as `dtrace-provider`. For a package list, mise now turns that default list off, so only the packages you name build. `allow_builds = true` and the default with no option are unchanged. This updates the embedded aube to 2.8.0. [#&#8203;14731](https://redirect.github.com/jdx/mise/pull/14731) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Fixed

- `exec()` in `[env]` values, and other commands mise runs with the pre-activation environment, can now find commands in a `_.path` directory that was already on `PATH` before activation, even if the shell deduplicates `PATH` (for example zsh with `typeset -U path PATH`). [#&#8203;14772](https://redirect.github.com/jdx/mise/pull/14772) ([@&#8203;jdx](https://redirect.github.com/jdx))
- With `task.source_freshness_hash_contents = true`, a task now re-runs when a source file is changed to content of the same size and its old mtime is restored (for example by `rsync -a`, `cp -p` or `touch -r`). On Unix, mise now also compares the file's ctime. Cache entries written by older versions are rehashed once. [#&#8203;14778](https://redirect.github.com/jdx/mise/pull/14778) ([@&#8203;jdx](https://redirect.github.com/jdx))
- On macOS, `pipx:` installs no longer fail when `aqua:aws/aws-cli` is in the toolset. Because macOS filesystems ignore case by default, mise's lookup for `python` matched aws-cli's executable `Python` shared library and passed it to uv as the interpreter. This lookup now requires the exact case. [#&#8203;14769](https://redirect.github.com/jdx/mise/pull/14769) ([@&#8203;jdx](https://redirect.github.com/jdx))
- An aqua registry template with an unterminated string literal now fails with an "unterminated string literal" error instead of hanging. Escaped quotes after backslashes are also detected correctly. [#&#8203;14752](https://redirect.github.com/jdx/mise/pull/14752) ([@&#8203;Huge](https://redirect.github.com/Huge), [@&#8203;jdx](https://redirect.github.com/jdx))
- The built-in npm backend no longer trusts the eight eMudhra intermediate CA certificates whose private keys were compromised. The fix comes from updating its bundled root certificates (`webpki-root-certs` 1.0.10, `rustls-webpki` 0.103.16). Builds that use the OS trust store are fixed by OS updates instead. [#&#8203;14781](https://redirect.github.com/jdx/mise/pull/14781) ([@&#8203;jdx](https://redirect.github.com/jdx))
- A `[bootstrap.compose]` project no longer reports drift on every run when a service uses a `service:` reference such as `network_mode: service:vpn`. Compose hashes the reference as written but stamps the container with the hash of the resolved `container:<id>`, so the two never matched. mise now pins these references (`network_mode`, `ipc`, `pid`, `volumes_from`) to the running container before it asks compose for the hash. This needs an explicit `files` list in the project's config. Projects without one hash as before. [#&#8203;14729](https://redirect.github.com/jdx/mise/pull/14729) ([@&#8203;jdx](https://redirect.github.com/jdx))
- vfox plugins now keep symlinks when they extract `.zip` archives returned by `PreInstall`. Before, entries such as `bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js` became regular files holding the link target, and the tool failed with `No such file or directory`. Links that resolve outside the install directory are still rejected. The `http:` backend and tarballs were not affected. [#&#8203;14730](https://redirect.github.com/jdx/mise/pull/14730) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `[daemons.<name>] task = "worker"` now finds a file task such as `.mise/tasks/worker.sh`, as `mise run worker` does. Before, it failed with `daemon srv runs unknown task "worker"` unless you wrote `worker.sh`. [#&#8203;14741](https://redirect.github.com/jdx/mise/pull/14741) ([@&#8203;jdx](https://redirect.github.com/jdx))
- On Windows, `mise self-update` no longer replaces the winget `mise-shim.exe` link with a copy. It updates the real `mise-shim.exe` next to the real `mise.exe`. Before, `mise reshim` kept warning that the shim was older than mise. [#&#8203;14737](https://redirect.github.com/jdx/mise/pull/14737) ([@&#8203;jdx](https://redirect.github.com/jdx))
- An inherited `[dotfiles]` entry turned off with only `enabled = false` no longer prints `no recognized operation (block, source, or line), ignoring entry` on every command. Other tables with no recognized operation, such as a misspelled `line`, still warn. [#&#8203;14726](https://redirect.github.com/jdx/mise/pull/14726) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;ponko2](https://redirect.github.com/ponko2))

#### Upgrading

- **`find_up` in a global config:** a relative `find_up` entry in `env._.file` used to search from the current directory. It now searches from the config root, which is `~` for a global config, so it no longer finds project files. To keep the old behavior, put `{{cwd}}/` in front of the path. `find_up` was added in 2026.10.12.

#### Documentation

- The dotfiles docs now explain that a group entry with only `permissions` does not inherit the group's `mode`, so it deploys nothing. Removing `mode` from an entry that used to deploy a file leaves that file orphaned, and `--prune` deletes it. To deploy a file and set its permissions, use `{ mode = "copy", permissions = "0600" }`. [#&#8203;14768](https://redirect.github.com/jdx/mise/pull/14768) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### New Contributors

- [@&#8203;Huge](https://redirect.github.com/Huge) made their first contribution in [#&#8203;14752](https://redirect.github.com/jdx/mise/pull/14752)

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.15...v2026.10.17>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODAuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-26 08:58:43 -07:00
renovate[bot] 7e17be12d5 chore(deps): update yarn to v4.18.1 (#727)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [yarn](https://redirect.github.com/yarnpkg/berry) ([source](https://redirect.github.com/yarnpkg/berry/tree/HEAD/packages/yarnpkg-cli)) | [`4.13.0+sha512.5c20ba010c99815433e5c8453112165e673f1c7948d8d2b267f4b5e52097538658388ebc9f9580656d9b75c5cc996f990f611f99304a2197d4c56d21eea370e7` → `4.18.1`](https://renovatebot.com/diffs/npm/yarn/4.13.0/4.18.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@yarnpkg%2fcli-dist/4.18.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@yarnpkg%2fcli-dist/4.13.0/4.18.1?slim=true) |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-19 11:50:40 -07:00
renovate[bot] d24581ab27 chore(deps): update dependency jdx/mise to v2026.10.15 (#723)
> [!NOTE]
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [jdx/mise](https://redirect.github.com/jdx/mise) | patch | `v2026.10.8` → `v2026.10.15` |

---

### Release Notes

<details>
<summary>jdx/mise</summary>

### [`v2026.10.15`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.15): : Default minimum_release_age covers every backend, plus a PowerShell installer

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.14...vfox-v2026.10.15)

The default 24-hour `minimum_release_age` now applies to every backend. Many more backends report release dates, so the cooldown can actually hold new versions back, and mise warns when it installs a version it couldn't date. This release also adds a PowerShell installer for Windows, `read_json`/`read_yaml`/`read_toml` template functions, `dotnet@lts`/`dotnet@sts`, and new dotfiles options.

#### Changed

- **The default `minimum_release_age` applies to every backend.** The built-in 24h cooldown used to cover only backends that reported release dates (aqua, cargo, core, github, npm, pypi and others). asdf, vfox, conda, dotnet, `http:` and `s3:` tools had no cutoff at all. Now every backend gets the cooldown. A tool whose only version is less than 24h old now resolves to "no versions found", as aqua and github tools already did. To opt a tool out, add it to `minimum_release_age_excludes`. To turn the cooldown off, set `minimum_release_age = "0s"`. [#&#8203;14701](https://redirect.github.com/jdx/mise/pull/14701) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **mise warns when it can't check a version's release date.** A version with no known date still passes the cutoff, but `mise install`, `mise upgrade` and `mise use` now print a one-time warning naming the version. Exact pins you wrote yourself don't trigger it. `mise env`, `mise ls`, `mise outdated` and `mise ls-remote` never print it. [#&#8203;14694](https://redirect.github.com/jdx/mise/pull/14694) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```
  WARN  asdf:[email protected] has no release date, so the ... cutoff cannot be checked and it is allowed (exclude it with minimum_release_age_excludes to silence this)
  ```

- **More backends report release dates, so the cooldown applies to them:**

  - conda versions use the channel's earliest index timestamp. [#&#8203;14693](https://redirect.github.com/jdx/mise/pull/14693)
  - aqua packages that take versions from git tags (`version_source: github_tag`, such as `aws/aws-cli`, `docker/cli` and `cockroachdb/cockroach`) are now dated. [#&#8203;14691](https://redirect.github.com/jdx/mise/pull/14691)
  - dotnet dates come from Microsoft's releases index. deno and erlang dates come from their GitHub releases. [#&#8203;14692](https://redirect.github.com/jdx/mise/pull/14692)
  - Every python version now has a date, and so do many more ruby versions (from ruby-lang.org, Maven Central for JRuby, and GitHub for TruffleRuby). Rust's `stable`, `beta` and `nightly` channels are dated too. With an explicit past cutoff, `rust@stable` resolves to the newest stable release that is old enough, and `beta`/`nightly` resolve to a dated build from before the cutoff. [#&#8203;14697](https://redirect.github.com/jdx/mise/pull/14697)
  - The dart, flutter, nim, julia, nomad-pack, sentinel, tfc-agent, android-cli, cursor-agent and twg registry tools now report dates. [#&#8203;14698](https://redirect.github.com/jdx/mise/pull/14698)

  All by [@&#8203;jdx](https://redirect.github.com/jdx).

- **Version lists for more backends come from the mise-versions host.** `npm:`, `pipx:`, `cargo:`, `gem:`, `go:`, `dotnet:` and `spm:` tools now list versions from mise-versions, like other registry tools, instead of going to their own source. So do http/s3 tools with a `version_list_url`. If you redirect a source, mise still lists from that source directly. That covers a custom npm registry or `npm.shell_out`, `pypi.registry_url`, a non-default `GOPROXY`, `cargo.registry_name`, a custom gem source, `dotnet.registry_url`, S3 endpoint overrides, and local listing options. conda always lists from its channel. The host cache TTL now follows the tool's `minimum_release_age`. To list everything from the source, set `MISE_USE_VERSIONS_HOST=0`. [#&#8203;14700](https://redirect.github.com/jdx/mise/pull/14700) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Added

- **PowerShell installer for Windows.** It's published with each release as `install.ps1` and served from mise.run at `/powershell` and `/pwsh`, so you pipe it into `iex` with `irm`. It works on PowerShell 5.1+ and doesn't need admin rights. It installs the newest release that is at least 24h old, or `MISE_VERSION` if set. The download is verified against `SHASUMS256.txt` from GitHub Releases. `mise.exe` and `mise-shim.exe` go into `~\.local\bin`, and that directory is added to your user `Path`. Re-running it upgrades an existing install. Options include `MISE_INSTALL_PATH`, `MISE_INSTALL_MODIFY_PATH=0`, `MISE_INSTALL_SHIMS_PATH=1` and `MISE_INSTALL_FROM_GITHUB=1`. See the "Installing mise" docs for the full command. [#&#8203;14660](https://redirect.github.com/jdx/mise/pull/14660) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;lhs-12](https://redirect.github.com/lhs-12))

- **`read_json()`, `read_yaml()` and `read_toml()` template functions** parse a file so a template can use a value from it. This saves copying a version from `package.json` or `Pulumi.yaml` into `mise.toml` by hand. Relative paths resolve from the config file's directory. A missing key is an error unless you add `| default(value="...")`. Like `read_file()`, these functions need a trusted config, and they don't work in safe mode, `.miserc.toml` or OCI dotfile templates. [#&#8203;14705](https://redirect.github.com/jdx/mise/pull/14705) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;edahlseng](https://redirect.github.com/edahlseng))

  ```toml
  [tools]
  node = "{{ read_json(path='package.json')['volta']['node'] }}"
  pulumi = "{{ read_yaml(path='Pulumi.yaml')['requiredPulumiVersion'] }}"
  ```

- **`dotnet@lts` and `dotnet@sts`** resolve to the newest SDK in the current LTS or STS channel, using Microsoft's release index. Preview, go-live and end-of-life channels are skipped. A `lts` alias you define in `[tool_alias.dotnet.versions]` still takes precedence. Runtime-only installs still need an exact version. [#&#8203;14683](https://redirect.github.com/jdx/mise/pull/14683) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`mise bootstrap --prune-dotfiles`** removes dotfiles that are no longer deployed, the same way `mise dot apply --prune` does, so `mise bootstrap --upgrade --prune-dotfiles` handles everything in one run. The prune runs at the end of the dotfiles phase. It respects `--dry-run`, `--yes` and `--skip dotfiles`. Copies you edited are left in place. [#&#8203;14681](https://redirect.github.com/jdx/mise/pull/14681) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;thernstig](https://redirect.github.com/thernstig))

- **`dotfiles.windows_symlinks`** (default `false`) makes `symlink` and `symlink-each` create real file symlinks on Windows. With it on, apply fails if Windows refuses to create a link, instead of silently copying. To create symlinks, Windows needs Developer Mode or an elevated shell. If you turn the setting back off, `mise dot unapply` needs `--force` on entries that still hold links. [#&#8203;14682](https://redirect.github.com/jdx/mise/pull/14682) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [settings.dotfiles]
  windows_symlinks = true
  ```

- **`http:` tools can report release dates** with the new `version_date_expr` option. It maps versions to dates from the `version_list_url` response. Use `version_date_url` to read the dates from a different URL, and `version_date_next_expr` to follow paged listings (same host only). Dates can be RFC 3339, `YYYY-MM-DD` or HTTP dates. [#&#8203;14696](https://redirect.github.com/jdx/mise/pull/14696) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **vfox plugins can report release dates.** An `Available` or `BackendListVersions` hook can return `created_at` (RFC 3339) for each version. Plain version strings still work. [#&#8203;14695](https://redirect.github.com/jdx/mise/pull/14695) ([@&#8203;jdx](https://redirect.github.com/jdx))

- `mise tasks -a` is a short alias for `mise tasks --all`. [#&#8203;14674](https://redirect.github.com/jdx/mise/pull/14674) ([@&#8203;williamsjokvist](https://redirect.github.com/williamsjokvist))

#### Fixed

- `mise fmt` no longer breaks multiline inline tables (TOML 1.1). It used to pull comments out of the table and drop indentation. Now it leaves these tables exactly as written. [#&#8203;14670](https://redirect.github.com/jdx/mise/pull/14670) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;ponko2](https://redirect.github.com/ponko2))
- If one task's `dir` template fails to render, other task commands keep working. Before, every command failed, including `mise tasks validate`. Now `mise tasks validate` reports the broken task as `invalid-directory-template`, and only running that task fails. [#&#8203;14680](https://redirect.github.com/jdx/mise/pull/14680) ([@&#8203;jdx](https://redirect.github.com/jdx))
- aqua tools now find their binaries in macOS universal archives, such as fastfetch 2.70.0. [#&#8203;14665](https://redirect.github.com/jdx/mise/pull/14665) ([@&#8203;jdx](https://redirect.github.com/jdx))
- npm: lifecycle scripts approved by `allow_builds` now run even when `~/.npmrc` sets `ignore-scripts=true`. [#&#8203;14661](https://redirect.github.com/jdx/mise/pull/14661) ([@&#8203;jdx](https://redirect.github.com/jdx))
- npm: `mise lock` no longer fails when your aube config sets a different default lockfile, such as `pnpm-lock.yaml`. [#&#8203;14659](https://redirect.github.com/jdx/mise/pull/14659) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `.7z` tool archives now extract when mise's data directory path contains `..`, for example in a localized mise setup. [#&#8203;14657](https://redirect.github.com/jdx/mise/pull/14657) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;sevenc-nanashi](https://redirect.github.com/sevenc-nanashi))
- The `mise-shim.exe` in the Windows release now keeps its version tag, so `mise doctor` and `mise reshim --force` stop reporting it as outdated. The warning goes away after you update and run `mise reshim --force`. [#&#8203;14656](https://redirect.github.com/jdx/mise/pull/14656) ([@&#8203;jdx](https://redirect.github.com/jdx))
- On Windows, `symlink-each` dotfiles messages and dry-run previews now say the files were copied rather than symlinked. [#&#8203;14654](https://redirect.github.com/jdx/mise/pull/14654) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;lhs-12](https://redirect.github.com/lhs-12))
- Rust: with a `RUSTUP_DIST_SERVER` mirror configured and GitHub unreachable, mise now lists the `stable`, `beta` and `nightly` channels instead of failing, so `rust@stable` installs through the mirror. [#&#8203;14662](https://redirect.github.com/jdx/mise/pull/14662) ([@&#8203;jdx](https://redirect.github.com/jdx))
- On Windows, `http:` installs of large archives no longer fail with "Access is denied" while antivirus is scanning the extracted files. mise now retries the final move for up to about a minute. [#&#8203;14703](https://redirect.github.com/jdx/mise/pull/14703) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Documentation

- New [mise.toml playground](https://mise.jdx.dev/configuration/playground.html): a schema-aware editor with hover help, completion and error checking. You can share a config as a link. Every `mise.toml` example in the docs now shows hover help on its keys. [#&#8203;14673](https://redirect.github.com/jdx/mise/pull/14673), [#&#8203;14686](https://redirect.github.com/jdx/mise/pull/14686) ([@&#8203;jdx](https://redirect.github.com/jdx))
- The [mise.toml reference](https://mise.jdx.dev/configuration/reference.html) is now a searchable key explorer grouped by topic. Each key shows its type, default and a real example. Nearly every key now has a description, and these also appear in `mise config explain`. [#&#8203;14687](https://redirect.github.com/jdx/mise/pull/14687), [#&#8203;14690](https://redirect.github.com/jdx/mise/pull/14690), [#&#8203;14688](https://redirect.github.com/jdx/mise/pull/14688) ([@&#8203;jdx](https://redirect.github.com/jdx))
- The fnox secrets page now covers setup, CI and migration. The dotnet page explains how private feeds authenticate. [#&#8203;14675](https://redirect.github.com/jdx/mise/pull/14675), [#&#8203;14679](https://redirect.github.com/jdx/mise/pull/14679) ([@&#8203;jdx](https://redirect.github.com/jdx))

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.14...v2026.10.15>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.14`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.14): : Global override config, mise config explain, and stricter tool option checks

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.13...vfox-v2026.10.14)

A global `config.override.toml` can now take precedence over project config, and `mise config explain` describes each key in a config file. Paranoid mode can be turned on per category, and in that mode dotenv files need their own content-bound trust. Installs now fail when a tool has an option its backend doesn't read, which affects existing configs (see Changed).

#### Added

- **Global override files.** `~/.config/mise/config.override.toml`, and `config.<env>.override.toml` for each `MISE_ENV`, rank above every project file, including `mise.local.toml` and `mise.<env>.toml`. This covers `[env]`, `[tools]`, `[settings]`, `[tasks]`, hooks and the other sections. Anything the override file doesn't set still comes from the project. mise never writes to these files by default. To write to one, pass `--override` to `use`, `unuse`, `set`, `unset`, `settings set|add|unset` or `config get|set`. A tool declared in an override file resolves from the global `mise.lock` and is exempt from the project's `--locked` check. If `MISE_GLOBAL_CONFIG_FILE` is set, override files are not loaded. `mise config ls` shows a `Tier` column and `mise doctor` labels the files. [#&#8203;14610](https://redirect.github.com/jdx/mise/pull/14610) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  # ~/.config/mise/config.override.toml
  [env]
  AWS_PROFILE = "personal"

  [tools]
  node = "24"
  ```

- **`mise config explain [KEY]`** lists each key a config file sets, with its line number and its description from the schema. It flags unknown keys with a "did you mean" suggestion and marks deprecated keys. It reads the file as plain TOML, so it also works on a config mise refuses to load. Pass a key such as `tasks` to show only that section, `--json` for machine-readable output, and `--file`, `--global`, `--system` or `--override` to pick a file. [#&#8203;14642](https://redirect.github.com/jdx/mise/pull/14642) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **Paranoid mode can be turned on per category.** `paranoid` now accepts a list of `config`, `env_files`, `plugins` and `provenance` in addition to `true`/`false`. `MISE_PARANOID=config,env_files` also works. `true` still turns on all four categories. An unknown category name is an error. [#&#8203;14609](https://redirect.github.com/jdx/mise/pull/14609) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;thernstig](https://redirect.github.com/thernstig))

  ```toml
  [settings]
  paranoid = ["env_files"]
  ```

- **`env_file` takes several filenames**, for example `env_file = [".env", ".env.local"]` or `MISE_ENV_FILE=.env:.env.local`. The file nearest the current directory wins. Within one directory, a name later in the list wins. A single string still works. [#&#8203;14606](https://redirect.github.com/jdx/mise/pull/14606) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;thernstig](https://redirect.github.com/thernstig))

- **A `find_up` entry in `env._.file` can search several names together.** Give one entry a `path` list, and mise searches directory by directory. The closest directory wins, then the later name within a directory. With two separate entries, a `.env.local` in a parent directory still overrides the project's `.env`. The docs now explain this difference and how `env_file` differs from `_.file`. [#&#8203;14620](https://redirect.github.com/jdx/mise/pull/14620), [#&#8203;14602](https://redirect.github.com/jdx/mise/pull/14602) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [env]
  _.file = { path = [".env", ".env.local"], find_up = true }
  ```

- **`#MISE` headers in file tasks accept the same keys as `[tasks.<name>]`**, including `timeout`, `vars` and the `deny_*`/`allow_*` sandbox keys. Before, these keys were ignored with a warning. If one header value is invalid, mise warns and skips that key, and every other task still loads. An invalid `confirm` or `deny_*` value is still an error, so a typo can't remove a confirmation prompt or a sandbox restriction. Before, a template named with `extends` overrode a header's `silent`. Now the header's value wins. [#&#8203;14637](https://redirect.github.com/jdx/mise/pull/14637) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **Interactive `mise.toml` reference** in the docs at [configuration/reference](https://mise.jdx.dev/configuration/reference.html). It lists every key with its type, choices and default, and you can filter keys and link to them directly. Plain Markdown copies are also published for agents. [#&#8203;14641](https://redirect.github.com/jdx/mise/pull/14641) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Changed

- **Installs fail on tool options the backend doesn't read.** Before, such options were silently ignored. A typo or a key meant for another backend now stops the install, and the error names the option: `cargo:eza: option 'asset_pattern' is not used by the cargo backend`. Keys under `platforms` are checked too. So far this applies to the cargo, conda, gem, github, gitlab, forgejo, go, http, npm, packslip, pipx, s3, spinel, spm and ubi backends. aqua, plugin and core-language tools are not checked. The npm backend accepts the `checksum` option that comes from a `packageManager` field in `package.json`. [#&#8203;14629](https://redirect.github.com/jdx/mise/pull/14629), [#&#8203;14655](https://redirect.github.com/jdx/mise/pull/14655) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **Paranoid mode needs content-bound trust for env files.** In paranoid mode, files loaded through `_.file`, found by the `env_file` setting, or run by `_.source` each need their own trust. Editing one of these files revokes its trust. Before, trusting `mise.toml` also approved these files, and later edits went unchecked. Running `mise trust` with no path trusts the project's config and every env file it loads. The error names the file but prints none of its values. To exempt a file by path, add it to `trusted_config_paths` in your global config. With a category list, this check belongs to `env_files`. [#&#8203;14604](https://redirect.github.com/jdx/mise/pull/14604) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;thernstig](https://redirect.github.com/thernstig))
- **More specific config error messages.**
  - A warning about an unknown `mise.toml` key now gives the line and column, and suggests a close match, for example `mise.toml:5:1: settings.experimantal (did you mean experimental?)`. [#&#8203;14639](https://redirect.github.com/jdx/mise/pull/14639) ([@&#8203;jdx](https://redirect.github.com/jdx))
  - A wrong value for a hook, a task `run`/`depends` entry or an `[env]` variable now says which forms are accepted, or names the unknown key. Before, the error was `data did not match any variant of untagged enum`. An unknown key in a `run` or `depends` table now gets a warning. Before, it was silently ignored. [#&#8203;14640](https://redirect.github.com/jdx/mise/pull/14640) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **`[bootstrap.linux.firewall]` is validated on every OS.** macOS and Windows still skip the section at bootstrap time, but an invalid value such as `backend = "iptables"` is now an error there too. [#&#8203;14615](https://redirect.github.com/jdx/mise/pull/14615) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **Editor schema updates.** Editors now flag unknown keys in most `[bootstrap]` tables and in `[dotfiles]` entries. The schema now documents launchd `keep_alive_on_failure` and `nice`, and dotfile `autosave` and `enabled`. It also accepts valid configs it used to reject: templated `login_shell`, `queue_directories` and `umask`, nested macOS defaults values, and `tools` on `[vars]` entries. On Windows, `[bootstrap.brew].adopt` no longer causes an unknown-field warning. [#&#8203;14616](https://redirect.github.com/jdx/mise/pull/14616), [#&#8203;14644](https://redirect.github.com/jdx/mise/pull/14644), [#&#8203;14613](https://redirect.github.com/jdx/mise/pull/14613) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `mise dot status` and `mise dot sync` are faster with many tracked files. They start one git process per tracked file instead of three, which took about 10s down to 4s for 860 files. [#&#8203;14607](https://redirect.github.com/jdx/mise/pull/14607) ([@&#8203;waynehoover](https://redirect.github.com/waynehoover))

#### Fixed

- With an external rustup that keeps its proxies in a shared directory, such as pacman's `/usr/bin`, mise no longer puts that directory ahead of its own tools. Before, `mise exec -- node` could run the system Node. Only the Rust proxies are now exposed, through a directory that mise owns. [#&#8203;14597](https://redirect.github.com/jdx/mise/pull/14597) ([@&#8203;jdx](https://redirect.github.com/jdx))
- The cargo backend now honors `rename_exe`. Before, it ignored the option and installed the executable under its original name. [#&#8203;14626](https://redirect.github.com/jdx/mise/pull/14626) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Locked `pypi:` installs through uv now pass the configured mise Python to `uv sync`. Before, mise passed an empty path, so uv could pick another interpreter and fail on `--no-build` tools such as `yamllint`. [#&#8203;14593](https://redirect.github.com/jdx/mise/pull/14593) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;hollow](https://redirect.github.com/hollow))
- When the TLS root store or a CA file can't be loaded, the npm backend now reports an error instead of crashing mise with a core dump. [#&#8203;14595](https://redirect.github.com/jdx/mise/pull/14595) ([@&#8203;jdx](https://redirect.github.com/jdx))
- On fish, mise no longer recurses until fish hits its call stack limit after `mise implode`. [#&#8203;14594](https://redirect.github.com/jdx/mise/pull/14594) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;thernstig](https://redirect.github.com/thernstig))
- `mise bootstrap` now finds Nix in `/nix/var/nix/profiles/default/bin` when a `pre-packages` hook installed it earlier in the same run, so `nix:` packages install. [#&#8203;14596](https://redirect.github.com/jdx/mise/pull/14596) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `MISE_WATCH_FILES_GIT_REWRITTEN` is no longer set when HEAD stayed on the same commit, for example after `git checkout -b`, `git reset` or `git branch -m`. Before, format-on-edit hooks skipped files you had just edited. [#&#8203;14585](https://redirect.github.com/jdx/mise/pull/14585) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- Command wrapper templates can now use `config_root` and `config_source`. Relative paths in template functions resolve from the wrapper's config file instead of the current directory. [#&#8203;14628](https://redirect.github.com/jdx/mise/pull/14628) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))

#### Upgrading

- **Unsupported tool options:** if an install now fails with `option '...' is not used by the ... backend`, remove the option or fix its spelling. `mise config explain tools` shows which keys mise doesn't recognize.
- **Paranoid mode:** after upgrading, run `mise trust` in each project to approve its env files. Run it again after editing them. If you only want the env-file check, set `paranoid = ["env_files"]`.
- **Firewall config on macOS and Windows:** if a shared config has an invalid `[bootstrap.linux.firewall]` value, it now fails to load on macOS and Windows too. Correct the value.

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.13...v2026.10.14>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.13`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.13): : Untrusted project configs can no longer change settings

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.12...vfox-v2026.10.13)

mise now ignores `[settings]` in a project config until you trust it. This release also adds per-version-range backend options to the registry and template support for command wrappers and `[bootstrap.repos]`. It fixes several bugs in lockfiles, tasks and multi-version tool options.

#### Security

- **`[settings]` from untrusted project configs is ignored.** Before, a cloned repo's `mise.toml` could change settings as soon as mise found it, with no trust prompt. That included settings that redirect downloads or feed build commands, such as `node.mirror_url`, `python.pyenv_repo` and `ruby.precompiled_url`. These settings now apply only after `mise trust`, like `[env]`, `[hooks]` and `[tools]` options already did. Trusted projects, global and system config, environment variables and CLI flags work as before. Commands that trust the active config implicitly (`mise run`, `mise exec`, `mise install`) reload settings after trusting it, so the project's settings still apply to that same command. Settings files are now parsed once per load. [#&#8203;14538](https://redirect.github.com/jdx/mise/pull/14538), [#&#8203;14553](https://redirect.github.com/jdx/mise/pull/14553) ([@&#8203;jdx](https://redirect.github.com/jdx))

  For example, if an untrusted repo sets `[settings.python] pyenv_repo` to its own URL, `mise settings get python.pyenv_repo` returns the default pyenv repository until you run `mise trust`.

- mise's own `zip` dependency moved to 9.x, which fixes GHSA-4684-h2q9-2vcp. Older versions applied Unix permissions through extracted symlinks without checking that the target stayed inside the destination. mise uses this code to extract downloaded `.zip` tool archives. [#&#8203;14577](https://redirect.github.com/jdx/mise/pull/14577) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Added

- **One registry backend can carry different options for each version range.** A registry entry can list the same backend more than once, each time with its own `min_version`/`max_version` and `options`. Tools whose release assets changed at some version can then stay on one backend. Two entries can't give the same version different options unless their `platforms` don't overlap. Table syntax such as `tool = { version = "1.4.0" }` now takes its registry defaults from the entry that version selects. Older mise releases apply only the first entry's options to every version. [#&#8203;14543](https://redirect.github.com/jdx/mise/pull/14543) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  backends = [
    { full = "github:example/tool", min_version = "2.0.0", options = { asset_pattern = "tool-v2-*" } },
    { full = "github:example/tool", max_version = "2.0.0", options = { asset_pattern = "tool-*" } },
  ]
  ```

- **`mise ls-remote` lists every version range of a registry tool.** When a tool's backends serve different version ranges, mise now lists each range from the backend that serves it. Before, it listed only the first backend's range. For example, `mise ls-remote hk` now starts at 0.1.4 instead of 1.58.1. Explicit backends, overrides, `--all` and `--strict-metadata` behave as before. [#&#8203;14544](https://redirect.github.com/jdx/mise/pull/14544) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **Command wrapper values render as templates.** `command`, `args` and `env` in `[wrappers]` can use `vars`, `env` and the usual template functions. `tools` and `config_root` are not available. A command that renders blank is an error. Use `{% raw %}` to keep literal braces, such as Docker's `{{.Names}}`. [#&#8203;14565](https://redirect.github.com/jdx/mise/pull/14565) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [wrappers.foo]
  command = "foo-real"
  args = ["--mode={{ vars.mode }}"]
  env = { FOO_HOME = "{{ [xdg_data_home, 'foo'] | join_path }}" }
  ```

- **`[bootstrap.repos]` supports templated `url`/`ref` and clone options.** `url` and `ref` render from `[vars]` or the process environment. Values from a config's `[env]` table are not available. `filter`, `depth` and `submodules = true` are passed to the first `git clone` as `--filter`, `--depth` and `--recurse-submodules`. Existing checkouts are left as they are. `depth` can't be combined with a commit SHA or a `refs/…` ref. [#&#8203;14548](https://redirect.github.com/jdx/mise/pull/14548) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;ovidiubuligan](https://redirect.github.com/ovidiubuligan))

  ```toml
  [bootstrap.repos]
  "~/src/large" = { url = "[email protected]:example/large.git", ref = "{{ vars.branch }}", filter = "blob:none", depth = 1 }
  ```

- **`{{ system_brew_prefix }}` template variable.** It resolves to the Homebrew prefix that `mise bootstrap` installs into: `/opt/homebrew` on macOS and `/home/linuxbrew/.linuxbrew` on Linux, or the value of `MISE_SYSTEM_BREW_PREFIX`. It does not detect a Homebrew install somewhere else. `[bootstrap.user].login_shell` now renders templates too, so `login_shell = "{{ system_brew_prefix }}/bin/zsh"` works. [#&#8203;14572](https://redirect.github.com/jdx/mise/pull/14572), [#&#8203;14570](https://redirect.github.com/jdx/mise/pull/14570) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **vfox `PreInstall` hooks can return a `headers` table** next to `url` and `sha256`. Plugins can now download private or token-gated artifacts through the normal install path, which handles checksums, retries and lockfile URLs. Headers are sent only to the origin of `url`, are dropped on cross-origin redirects, are redacted in debug output and are never written to `mise.lock`. An explicit `Authorization` header overrides netrc and the automatic GitHub token. [#&#8203;14531](https://redirect.github.com/jdx/mise/pull/14531) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`mise doctor` reports a stale `mise-shim.exe` on Windows.** In `windows_shim_mode = "exe"`, shims are copies of the `mise-shim.exe` that sits beside `mise.exe`. If that template is older than mise, or has no version tag (every template built before this release), `mise doctor` reports it and `mise reshim` warns. To fix it, update mise with the package manager that installed it, or run `mise self-update`, and then run `mise reshim --force`. [#&#8203;14586](https://redirect.github.com/jdx/mise/pull/14586) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Fixed

- **Lockfiles**
  - Running `mise lock` on Windows now records `ruby` entries for Windows, Linux and macOS platforms. Before, it skipped them, and `mise install --locked` then failed. [#&#8203;14520](https://redirect.github.com/jdx/mise/pull/14520), [#&#8203;14529](https://redirect.github.com/jdx/mise/pull/14529) ([@&#8203;jdx](https://redirect.github.com/jdx))
  - Commands that rewrite `mise.lock` without locking again, such as `mise link`, no longer delete other platforms' option variants (for example, per-platform `asset_pattern` entries). [#&#8203;14519](https://redirect.github.com/jdx/mise/pull/14519) ([@&#8203;jdx](https://redirect.github.com/jdx))
  - A `mise link` for one version of a tool no longer makes `mise install --locked` fail for that tool's other versions. A link now bypasses the lockfile only when the requested version could select it. [#&#8203;14539](https://redirect.github.com/jdx/mise/pull/14539) ([@&#8203;jdx](https://redirect.github.com/jdx))
  - `mise install --locked` for Java no longer fetches the mise-java catalog when `mise.lock` already has the download URL, so locked installs work in air-gapped or proxied environments. [#&#8203;14534](https://redirect.github.com/jdx/mise/pull/14534) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **Tasks and shims**
  - `mise run` no longer hangs when parallel tasks need to install the same tool. [#&#8203;14536](https://redirect.github.com/jdx/mise/pull/14536) ([@&#8203;jdx](https://redirect.github.com/jdx))
  - Running `mise install` inside a task no longer removes the shims for that task's `lazy` tools. [#&#8203;14533](https://redirect.github.com/jdx/mise/pull/14533) ([@&#8203;jdx](https://redirect.github.com/jdx))
  - Task hooks (such as `postinstall = { task = "setup" }`) and `watch_files` task hooks now run with mise even when a tool shim triggered them. Before, they could fail with errors like `jq: Unknown option --cd`. [#&#8203;14550](https://redirect.github.com/jdx/mise/pull/14550) ([@&#8203;jdx](https://redirect.github.com/jdx), [@&#8203;alitas](https://redirect.github.com/alitas))
  - `mise watch` exits quietly with status 130 when you interrupt watchexec with Ctrl+C, instead of printing an error. [#&#8203;14541](https://redirect.github.com/jdx/mise/pull/14541) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **Per-version tool options**
  - When a `github:`, `gitlab:` or `forgejo:` tool lists several versions in config, each version now installs with its own options. Before, an option such as `rename_exe` set only on the first entry applied to every version. [#&#8203;14537](https://redirect.github.com/jdx/mise/pull/14537) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
  - `vfox:` plugin hooks now receive only the options configured for the version they handle. [#&#8203;14562](https://redirect.github.com/jdx/mise/pull/14562) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- `mise install` now restores `cargo`, `rustc` and the host's `rust-std` when they are missing from a Rust toolchain with the `minimal` or `default` profile. Before, mise reported such a toolchain as installed. [#&#8203;14525](https://redirect.github.com/jdx/mise/pull/14525) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562), [@&#8203;risu729](https://redirect.github.com/risu729))
- The uv, pip and poetry deps providers now run again after mise recreates a deleted venv in a later process. Before, the new venv stayed empty. [#&#8203;14532](https://redirect.github.com/jdx/mise/pull/14532) ([@&#8203;halms](https://redirect.github.com/halms))
- vfox plugins now report an error, instead of crashing mise, when the HTTP client can't be built (for example, when no CA certificates are installed). [#&#8203;14576](https://redirect.github.com/jdx/mise/pull/14576) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- MCP resource read errors now include the underlying cause, such as the untrusted-config message and its `mise trust` hint. [#&#8203;14566](https://redirect.github.com/jdx/mise/pull/14566) ([@&#8203;diogochaves](https://redirect.github.com/diogochaves))

#### Registry

- `xcsift` 1.7.0 and later installs from signed Packslip releases and now supports Linux x64 as well as macOS ARM64. [#&#8203;14540](https://redirect.github.com/jdx/mise/pull/14540) ([@&#8203;jdx](https://redirect.github.com/jdx))
- `protoc-gen-connect-go` 2.x now installs from the `/v2` Go module path, and 1.x versions keep working. [#&#8203;14545](https://redirect.github.com/jdx/mise/pull/14545) ([@&#8203;jdx](https://redirect.github.com/jdx))
- Added `rea` (`npm:rea-agents`). [#&#8203;14421](https://redirect.github.com/jdx/mise/pull/14421) ([@&#8203;phucisstupid](https://redirect.github.com/phucisstupid))

#### Documentation

- The docs now state that OpenTelemetry export and spinel installs require `experimental = true`. [#&#8203;14552](https://redirect.github.com/jdx/mise/pull/14552) ([@&#8203;ZainnQureshii](https://redirect.github.com/ZainnQureshii))

#### New Contributors

- [@&#8203;phucisstupid](https://redirect.github.com/phucisstupid) made their first contribution in [#&#8203;14421](https://redirect.github.com/jdx/mise/pull/14421)
- [@&#8203;diogochaves](https://redirect.github.com/diogochaves) made their first contribution in [#&#8203;14566](https://redirect.github.com/jdx/mise/pull/14566)
- [@&#8203;ZainnQureshii](https://redirect.github.com/ZainnQureshii) made their first contribution in [#&#8203;14552](https://redirect.github.com/jdx/mise/pull/14552)
- [@&#8203;fang2hou](https://redirect.github.com/fang2hou) made their first contribution in [#&#8203;14551](https://redirect.github.com/jdx/mise/pull/14551)

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.12...v2026.10.13>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.12`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.12): : Per-tool Python runtimes for PyPI tools, Gradle workspace discovery, and env file find_up

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.11...vfox-v2026.10.12)

PyPI and pipx tools can now choose their own Python runtime, the workspace graph can read Gradle multi-module builds, and `env._.file` can search parent directories. When mise-versions is having an outage, GitHub lookups now retry on `api.github.com`, and `_.source` scripts no longer pick up `~/.bashrc` when mise is launched from an editor.

#### Added

- **Per-tool Python for `pypi:` tools.** Set `python` to a minor series or an exact version, and mise installs that runtime and passes it to uv or pipx for that tool only. The runtime stays private to the tool and does not become your shell's default Python. `mise lock` records the selected Python with the tool, and `mise prune` keeps any runtime that a retained tool environment still uses. You can't combine `python` with `--python`/`-p` in `uvx_args` or `pipx_args`. Tools that don't set `python` behave as before. [#&#8203;14479](https://redirect.github.com/jdx/mise/pull/14479) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [tools]
  "pypi:black" = { version = "latest", python = "3.12" }
  "pypi:ruff" = { version = "latest", python = "3.12.12" }
  ```

  If you change a tool's `python`, mise installs a new environment instead of reusing the old one. If that install fails, the previous working environment is left untouched. [#&#8203;14504](https://redirect.github.com/jdx/mise/pull/14504) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **Gradle workspace discovery.** `mise tasks graph` and `mise run --affected` now find projects listed by `include` in `settings.gradle` or `settings.gradle.kts`, using Groovy or Kotlin syntax. Project IDs follow Gradle paths: `:app` becomes `gradle::app`, and the root project is `gradle::`. Literal `project(":lib")` references in a project's top-level `dependencies {}` block become graph edges. mise reads the scripts as text and never runs Gradle. If an `include` is computed or conditional, a `projectDir` isn't a plain `file("...")` literal, or both settings files exist, mise reports an error that points to `[monorepo.projects."gradle:..."]` overrides. Editing the settings script marks every Gradle project as affected. Based on a prototype by [@&#8203;Jarvvski](https://redirect.github.com/Jarvvski). [#&#8203;14512](https://redirect.github.com/jdx/mise/pull/14512) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`find_up` for `env._.file`.** With `find_up = true`, mise looks for a relative path in the current directory and in every parent, so a global config can load each project's `.env` files. Files load from the root down, so values in closer files win. The default is `false`, and the option has no effect on absolute paths. [#&#8203;14497](https://redirect.github.com/jdx/mise/pull/14497) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  # ~/.config/mise/config.toml
  [env]
  _.file = [
    { path = ".env", find_up = true },
    { path = ".env.local", find_up = true },
  ]
  ```

- **Detect git-rewritten files in `watch_files` hooks.** mise sets `MISE_WATCH_FILES_GIT_REWRITTEN=1` when every changed file was last written before git's most recent HEAD move (checkout, pull, rebase). Commits don't count as HEAD moves. Hooks such as format-on-edit can use this to skip files the user didn't edit. `git stash pop`/`apply` don't move HEAD, so mise doesn't detect them. [#&#8203;14511](https://redirect.github.com/jdx/mise/pull/14511) ([@&#8203;jdx](https://redirect.github.com/jdx))

  ```toml
  [[watch_files]]
  patterns = ["**/*.go"]
  run = '[ -n "$MISE_WATCH_FILES_GIT_REWRITTEN" ] || { IFS=:; hk fix $MISE_WATCH_FILES_MODIFIED; }'
  ```

- **`.tera` sources inferred for dotfile group templates.** A `mode = "template"` entry in `[dotfile_groups]` no longer needs a `source` just to point at a `.tera` file. If the exact path doesn't exist, mise falls back to the same path with `.tera` added. An explicit `source` still takes precedence, and the `.tera` file is not also deployed under its suffixed name. [#&#8203;14502](https://redirect.github.com/jdx/mise/pull/14502) ([@&#8203;jdx](https://redirect.github.com/jdx))

- **`mise lock` warns about unsupported platforms.** If you name platforms with `lockfile_platforms` or `mise lock --platform`, mise prints a warning for each tool version that has no build for one of them, for example `[email protected].0 is not available for windows-x64; it will not install there`. The default platform set still only logs this at debug level, and the exit status is unchanged. [#&#8203;14500](https://redirect.github.com/jdx/mise/pull/14500) ([@&#8203;jdx](https://redirect.github.com/jdx))

- Registry: added `martin` (`github:maplibre/martin`). [#&#8203;14488](https://redirect.github.com/jdx/mise/pull/14488) ([@&#8203;ivan-ivkovic](https://redirect.github.com/ivan-ivkovic), [@&#8203;jdx](https://redirect.github.com/jdx))

#### Fixed

- **GitHub lookups survive mise-versions outages.** If mise-versions times out, drops the connection, or returns `429` or `5xx`, mise now retries the lookup on `api.github.com`, using your GitHub token if one is set. This covers releases, tags, repository contents, attestations and `self-update`. A `404`, `403` or empty answer from mise-versions is still trusted and not retried, so normal use doesn't spend GitHub's anonymous rate limit. If both sources fail, the error shows both failures, and a previously cached version list is still used. [#&#8203;14501](https://redirect.github.com/jdx/mise/pull/14501) ([@&#8203;jdx](https://redirect.github.com/jdx))
- **`_.source` no longer loads `~/.bashrc`.** When mise's stdin was a socket and `SHLVL` was unset, which happens when an editor extension such as the VS Code mise extension starts it, bash sourced `~/.bashrc` before the script. That leaked variables into the environment and could drop the script's `PATH` entries. The script now runs with `--norc`. [#&#8203;14487](https://redirect.github.com/jdx/mise/pull/14487) ([@&#8203;pikeas](https://redirect.github.com/pikeas))
- **Each version entry uses its own options.** When a tool listed several versions, options set only on the first entry leaked into the later ones. For example, `prerelease = true` on a `latest` entry made a separate `"1"` entry resolve to a prerelease. [#&#8203;14476](https://redirect.github.com/jdx/mise/pull/14476) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562), [@&#8203;risu729](https://redirect.github.com/risu729))
- **Project overrides now work when a workspace provider fails.** Previously, if a provider couldn't read its manifest (for example, a malformed `go.work`), `mise tasks graph` and `mise run --affected` failed for the whole repo. Declaring a project in that provider's namespace under `[monorepo.projects]` now replaces the provider's output and clears its error. Providers with no declared projects still fail loudly. [#&#8203;14508](https://redirect.github.com/jdx/mise/pull/14508) ([@&#8203;jdx](https://redirect.github.com/jdx))

#### Documentation

- Explained why `mise activate` keeps shims on `PATH` [#&#8203;14493](https://redirect.github.com/jdx/mise/pull/14493) ([@&#8203;jdx](https://redirect.github.com/jdx)), and clarified the platform-specific mise cache paths for CI [#&#8203;14506](https://redirect.github.com/jdx/mise/pull/14506) ([@&#8203;zeitlinger](https://redirect.github.com/zeitlinger)).

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.11...v2026.10.12>

#### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.11`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.11): : Much faster installs and far fewer GitHub API calls

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.10...vfox-v2026.10.11)

mise is much faster in this release and calls the GitHub API far less. Version lists, release tags, attestations and other public GitHub metadata now come from mise-versions, so everyday commands like `mise install`, `exec`, shims, `outdated`, `lock` and `self-update` are quicker and users without a GitHub token no longer run into the 60-requests-an-hour limit. Cached version lists are reused for longer, so repeat installs skip most lookups. It also adds `mise bootstrap --upgrade` and `mise env --paths`, and closes a trust gap in remote task files.

#### Speed and GitHub API usage

Cold-cache timings for v2026.10.10 versus v2026.10.11, measured with hyperfine on one Linux x64 machine with no GitHub token set:

| Command                                               | v2026.10.10 | v2026.10.11 |
| ----------------------------------------------------- | ----------- | ----------- |
| `mise ls-remote python`                               | 961 ms      | 93 ms       |
| `mise install` (jq, ripgrep, fd, bat, gh, shellcheck) | 1.49 s      | 1.08 s      |
| `mise outdated` (same six tools installed)            | 433 ms      | 272 ms      |

The install and `outdated` runs are noisy (±0.1–0.4s over 4 runs) and the install time includes downloads, so treat them as rough. Requests to `api.github.com` in a cold `mise install` of `github:` tools dropped from 2 to 0. Cold `mise outdated` made 8 network requests before and none now.

- **Public GitHub metadata comes from mise-versions.** With `use_versions_host` on (the default), release lists, `latest`, git tags (aqua `github_tag` packages, ubi and go), artifact attestations (including aqua's `predicate_type` filters) and the digest in the checksum-mismatch hint are read from mise-versions instead of `api.github.com`. GitHub is still asked directly for repositories mise-versions doesn't list when you have a token (the private-repository case), and in paranoid mode for attestations. The direct API is also used with `use_versions_host = false`, GitHub `url_replacements` and custom `api_url`s. [#&#8203;14460](https://redirect.github.com/jdx/mise/pull/14460), [#&#8203;14461](https://redirect.github.com/jdx/mise/pull/14461), [#&#8203;14469](https://redirect.github.com/jdx/mise/pull/14469), [#&#8203;14481](https://redirect.github.com/jdx/mise/pull/14481), [#&#8203;14477](https://redirect.github.com/jdx/mise/pull/14477), [#&#8203;14443](https://redirect.github.com/jdx/mise/pull/14443)
- Other requests also moved off the GitHub API:
  - `mise x`, `mise exec`, shims and `hook-env` use mise-versions when they auto-install a tool. [#&#8203;14458](https://redirect.github.com/jdx/mise/pull/14458)
  - `mise self-update` reads mise's releases from mise-versions and downloads the archive from github.com release downloads. Packslip and zipsign verification are unchanged. [#&#8203;14464](https://redirect.github.com/jdx/mise/pull/14464)
  - `mise lock` downloads artifacts for provenance checks from github.com instead of the API asset endpoint. [#&#8203;14465](https://redirect.github.com/jdx/mise/pull/14465)
  - Aqua registries hosted on GitHub are fetched from raw\.githubusercontent.com. [#&#8203;14470](https://redirect.github.com/jdx/mise/pull/14470)
  - Ruby looks up the latest ruby-build release through mise-versions. [#&#8203;14471](https://redirect.github.com/jdx/mise/pull/14471)
- **Fewer version-list fetches.** `mise install`, `use` and `run` now reuse a cached version list for the tool's `minimum_release_age` window minus one hour, clamped to 1–24h. With the default 24h cutoff, that is 23h. `outdated`, `upgrade`, `ls-remote`, `lock` and `latest` still refresh after 1h. If you set `fetch_remote_versions_cache` yourself, your value applies to every command. [#&#8203;14484](https://redirect.github.com/jdx/mise/pull/14484), [#&#8203;14485](https://redirect.github.com/jdx/mise/pull/14485), [#&#8203;14457](https://redirect.github.com/jdx/mise/pull/14457)
- **Faster version resolution:**
  - Multi-tool commands such as `mise outdated` can resolve many registry tools with one request to the mise-versions index. [#&#8203;14473](https://redirect.github.com/jdx/mise/pull/14473)
  - `latest` is resolved without refetching the list. [#&#8203;14456](https://redirect.github.com/jdx/mise/pull/14456)
  - Explicit backend args such as `aqua:jqlang/jq` reuse the registry tool's version list. [#&#8203;14459](https://redirect.github.com/jdx/mise/pull/14459)
  - Release tags come from the versions host instead of being listed or guessed. [#&#8203;14442](https://redirect.github.com/jdx/mise/pull/14442)
  - Packslip installs no longer re-download what resolution already verified. [#&#8203;14466](https://redirect.github.com/jdx/mise/pull/14466)
  - Install tracking and the Python version list are served from static assets. [#&#8203;14441](https://redirect.github.com/jdx/mise/pull/14441)
- **Python version listing no longer clones pyenv.** `mise ls-remote python`, `outdated`, `upgrade` and fuzzy `mise use [email protected]` read the python-build definitions from mise-versions. A cold listing took about 960ms before and about 90ms now. pyenv is still cloned when mise compiles Python, when `python.pyenv_repo` points at a fork, when you're offline, or when `use_versions_host = false`. Some definitions that had no date before now have one, so they are held back by `minimum_release_age` until they are old enough. [#&#8203;14455](https://redirect.github.com/jdx/mise/pull/14455)
- `mise oci build` now requires root for `apt:` packages, as it already did for apk, and fails up front with a clear message. If apt-get still fails, the error now includes the last lines of dpkg's output. [#&#8203;14447](https://redirect.github.com/jdx/mise/pull/14447)
- Registry: `native-sdk` now installs from npm (`@native-sdk/cli`), so the `native` command works. It requires Node 24+. [#&#8203;14431](https://redirect.github.com/jdx/mise/pull/14431)

#### Security

- **Remote task files now need trust before their headers render.** A `mise.toml` with only `[tasks]` loads without trust. Before this fix, if one of those tasks set `file` to a remote URL, `mise tasks ls`, `mise tasks info` and `mise tasks validate` rendered the file's `#MISE` headers, so a template like `{{ exec(...) }}` ran without a trust prompt. Remote files now follow the same rule as local task includes: if the headers contain template syntax, the config that references them must be trusted first. Remote files with plain headers still list without trust, and braces in the script body need no trust. [#&#8203;14416](https://redirect.github.com/jdx/mise/pull/14416) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562), [@&#8203;risu729](https://redirect.github.com/risu729))
- Updated rustls to 0.23.46 to address a RustSec advisory. [#&#8203;14434](https://redirect.github.com/jdx/mise/pull/14434)

#### Added

- **`mise bootstrap --upgrade`** installs what is missing and then upgrades what is already installed, in a single run. In the packages phase it runs the same upgrade as `mise bootstrap packages upgrade`, and pins are respected. In the tools phase it runs `mise upgrade` without `--bump`, so configured version ranges hold. Both run before the matching post hooks and dependent services. `--dry-run` previews both steps and `--skip` works as before. It does not update mise itself, repositories or images, and it does not restart services. [#&#8203;14433](https://redirect.github.com/jdx/mise/pull/14433)

  ```sh
  mise self-update --yes && mise bootstrap --upgrade
  ```

- **`mise env --paths`** prints the PATH entries mise manages, one per line and in PATH order: tool bin directories, `_.path` entries, and inherited directories that mise moves forward, such as `~/.cargo/bin`. This lets CI integrations export only mise's additions without diffing `PATH`. [#&#8203;14429](https://redirect.github.com/jdx/mise/pull/14429)

  ```console
  $ mise env --paths
  /home/me/.local/share/mise/installs/node/24.11.0/bin
  /home/me/.cargo/bin
  ```

- **The install script downloads pinned versions from mise.jdx.dev.** `curl https://mise.run | MISE_VERSION=<version> sh` now tries mise.jdx.dev first and falls back to GitHub Releases if that download fails. Checksums for pinned versions still come only from GitHub's `SHASUMS256.txt`. If no checksum is found, the script refuses to install. `MISE_INSTALL_FROM_GITHUB=1` still uses GitHub only. [#&#8203;14446](https://redirect.github.com/jdx/mise/pull/14446)

- Registry: `gdal` installs the GDAL/OGR command-line tools from conda-forge (`conda:libgdal-core`). [#&#8203;14440](https://redirect.github.com/jdx/mise/pull/14440) ([@&#8203;ivan-ivkovic](https://redirect.github.com/ivan-ivkovic))

#### Fixed

- **A bare `mise upgrade` no longer installs lazy tools that have never been installed.** Naming the tool still installs it. A lazy tool that already has a version installed upgrades as before. A missing lazy tool is still installed if an upgraded tool depends on it. `mise outdated` now marks these tools as `[MISSING] (lazy)`, and the bare upgrade no longer looks up their versions. [#&#8203;14422](https://redirect.github.com/jdx/mise/pull/14422) ([@&#8203;ryanrhughes](https://redirect.github.com/ryanrhughes)), [#&#8203;14444](https://redirect.github.com/jdx/mise/pull/14444)
- Fixed false `stack limit reached` errors on the static musl builds, for example on Ubuntu 26.04. These errors broke aqua `version_filter` parsing and made shims such as kubectl's report "not a valid shim". [#&#8203;14450](https://redirect.github.com/jdx/mise/pull/14450)
- `mise lock --platform ...` run on Alpine or NixOS no longer records Node source builds for other platforms. Only an explicit `node.compile` or `all_compile = true` forces source builds for those targets. [#&#8203;14432](https://redirect.github.com/jdx/mise/pull/14432)
- `mise upgrade --bump` and hand-edited version pins no longer drop a pipx tool's locked uv dependency graph. Before, `mise install --locked` then failed on a fresh checkout. [#&#8203;14426](https://redirect.github.com/jdx/mise/pull/14426) ([@&#8203;wislertt](https://redirect.github.com/wislertt))
- Packslip prefixes such as `fnox@1` now skip releases this host can't install, the same way `latest` does. Each skipped release gets a warning, and if no match can

> [!IMPORTANT]
> ✂ PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-19 11:28:33 -07:00
renovate[bot] 88547952df chore(deps): update node.js to v24.22.0 (#726)
> [!NOTE]
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [node](https://nodejs.org) ([source](https://redirect.github.com/nodejs/node)) | tools | minor | `24.21.0` → `24.22.0` |

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

### [`v24.22.0`](https://redirect.github.com/nodejs/node/releases/tag/v24.22.0): 2026-10-14, Version 24.22.0 'Krypton' (LTS), @&#8203;richardlau prepared by @&#8203;aduh95

[Compare Source](https://redirect.github.com/nodejs/node/compare/v24.21.0...v24.22.0)

##### Notable Changes

- \[[`ddbf974b47`](https://redirect.github.com/nodejs/node/commit/ddbf974b47)] - **(SEMVER-MINOR)** **crypto**: add `crypto.parsePKCS12()` (Brian Muenzenmeyer) [#&#8203;65627](https://redirect.github.com/nodejs/node/pull/65627)
- \[[`c162c68ff0`](https://redirect.github.com/nodejs/node/commit/c162c68ff0)] - **(SEMVER-MINOR)** **crypto**: add a generic MAC API (Filip Skokan) [#&#8203;65553](https://redirect.github.com/nodejs/node/pull/65553)
- \[[`a4ab3d84d7`](https://redirect.github.com/nodejs/node/commit/a4ab3d84d7)] - **(SEMVER-MINOR)** **crypto**: discover ciphers from OpenSSL providers (Filip Skokan) [#&#8203;65484](https://redirect.github.com/nodejs/node/pull/65484)
- \[[`c2f1e829ea`](https://redirect.github.com/nodejs/node/commit/c2f1e829ea)] - **(SEMVER-MINOR)** **crypto**: discover hashes from OpenSSL providers (Filip Skokan) [#&#8203;65484](https://redirect.github.com/nodejs/node/pull/65484)
- \[[`51aad5a80d`](https://redirect.github.com/nodejs/node/commit/51aad5a80d)] - **(SEMVER-MINOR)** **crypto**: enable SIV and GCM-SIV modes in Cipher/Decipher APIs (Filip Skokan) [#&#8203;63411](https://redirect.github.com/nodejs/node/pull/63411)
- \[[`d11c65d2f2`](https://redirect.github.com/nodejs/node/commit/d11c65d2f2)] - **doc**: add araujogui to collaborators (Guilherme Araújo) [#&#8203;66090](https://redirect.github.com/nodejs/node/pull/66090)
- \[[`acc1578179`](https://redirect.github.com/nodejs/node/commit/acc1578179)] - **doc**: deprecate `Server.prototype._listen2` in `node:net` (Antoine du Hamel) [#&#8203;65593](https://redirect.github.com/nodejs/node/pull/65593)
- \[[`a7f8de6362`](https://redirect.github.com/nodejs/node/commit/a7f8de6362)] - **(SEMVER-MINOR)** **net**: support sending `net.BoundSocket` to threads and child processes (Guy Bedford) [#&#8203;64725](https://redirect.github.com/nodejs/node/pull/64725)
- \[[`60c3eb61bd`](https://redirect.github.com/nodejs/node/commit/60c3eb61bd)] - **(SEMVER-MINOR)** **perf_hooks**: implement `SlidingWindowHistogram` (James M Snell) [#&#8203;65825](https://redirect.github.com/nodejs/node/pull/65825)
- \[[`6b3e6f9d5c`](https://redirect.github.com/nodejs/node/commit/6b3e6f9d5c)] - **(SEMVER-MINOR)** **perf_hooks**: implement qrde analysis support in Histogram (James M Snell) [#&#8203;65806](https://redirect.github.com/nodejs/node/pull/65806)
- \[[`75456a3512`](https://redirect.github.com/nodejs/node/commit/75456a3512)] - **(SEMVER-MINOR)** **perf_hooks**: implement Histogram `meanCI` API (James M Snell) [#&#8203;65606](https://redirect.github.com/nodejs/node/pull/65606)
- \[[`72d1b40c56`](https://redirect.github.com/nodejs/node/commit/72d1b40c56)] - **(SEMVER-MINOR)** **perf_hooks**: add CBOR export/import for histogram exchange (James M Snell) [#&#8203;65434](https://redirect.github.com/nodejs/node/pull/65434)
- \[[`41161dda87`](https://redirect.github.com/nodejs/node/commit/41161dda87)] - **(SEMVER-MINOR)** **sqlite**: add `StatementSync.prototype.close()` (Guilherme Araújo) [#&#8203;64232](https://redirect.github.com/nodejs/node/pull/64232)
- \[[`adbc757d70`](https://redirect.github.com/nodejs/node/commit/adbc757d70)] - **(SEMVER-MINOR)** **sqlite**: add `StatementSync.prototype[Symbol.dispose]()` (Guilherme Araújo) [#&#8203;64232](https://redirect.github.com/nodejs/node/pull/64232)
- \[[`241339f072`](https://redirect.github.com/nodejs/node/commit/241339f072)] - **(SEMVER-MINOR)** **src,lib**: add `util.markPromiseAsHandled` (James M Snell) [#&#8203;65805](https://redirect.github.com/nodejs/node/pull/65805)
- \[[`63b0974d9e`](https://redirect.github.com/nodejs/node/commit/63b0974d9e)] - **(SEMVER-MINOR)** **util**: implement `util.throttle` (James M Snell) [#&#8203;65899](https://redirect.github.com/nodejs/node/pull/65899)
- \[[`a3bbb5a26f`](https://redirect.github.com/nodejs/node/commit/a3bbb5a26f)] - **(SEMVER-MINOR)** **util**: implement `debounce` (James M Snell) [#&#8203;65899](https://redirect.github.com/nodejs/node/pull/65899)

##### Commits

- \[[`e6832b2cb1`](https://redirect.github.com/nodejs/node/commit/e6832b2cb1)] - **assert**: fix TypeError on deepStrictEqual with null Map key or Set member (Sergey Sannikov) [#&#8203;64449](https://redirect.github.com/nodejs/node/pull/64449)
- \[[`a079177d9f`](https://redirect.github.com/nodejs/node/commit/a079177d9f)] - **benchmark**: add --csv option to compare.js with --analyze (James M Snell) [#&#8203;65922](https://redirect.github.com/nodejs/node/pull/65922)
- \[[`10b1a0f70f`](https://redirect.github.com/nodejs/node/commit/10b1a0f70f)] - **benchmark**: fix max-regressions detection in compare.js (James M Snell) [#&#8203;65587](https://redirect.github.com/nodejs/node/pull/65587)
- \[[`e0c7ba8ad5`](https://redirect.github.com/nodejs/node/commit/e0c7ba8ad5)] - **benchmark**: add --analyze option to benchmark/scatter.js (James M Snell) [#&#8203;65594](https://redirect.github.com/nodejs/node/pull/65594)
- \[[`21fed10bb0`](https://redirect.github.com/nodejs/node/commit/21fed10bb0)] - **benchmark**: add crypto class benchmarks (Filip Skokan) [#&#8203;65518](https://redirect.github.com/nodejs/node/pull/65518)
- \[[`fa912242b7`](https://redirect.github.com/nodejs/node/commit/fa912242b7)] - **buffer**: fix unaligned UTF-16LE decoding (Matteo Collina) [#&#8203;65905](https://redirect.github.com/nodejs/node/pull/65905)
- \[[`a6bd0c1413`](https://redirect.github.com/nodejs/node/commit/a6bd0c1413)] - **build**: suppress OpenSSL asm warnings with clang (Richard Lau) [#&#8203;66023](https://redirect.github.com/nodejs/node/pull/66023)
- \[[`94e12139ee`](https://redirect.github.com/nodejs/node/commit/94e12139ee)] - **build**: derive V8_LOGGING_LEVEL from dcheck_always_on (Joyee Cheung) [#&#8203;65744](https://redirect.github.com/nodejs/node/pull/65744)
- \[[`7a2f322943`](https://redirect.github.com/nodejs/node/commit/7a2f322943)] - **build**: fix quiet default for make builds (Shelley Vohr) [#&#8203;65826](https://redirect.github.com/nodejs/node/pull/65826)
- \[[`c280d650b0`](https://redirect.github.com/nodejs/node/commit/c280d650b0)] - **build**: allow linking shared dependencies in the GN build (Shelley Vohr) [#&#8203;65797](https://redirect.github.com/nodejs/node/pull/65797)
- \[[`4b23a4472c`](https://redirect.github.com/nodejs/node/commit/4b23a4472c)] - **build**: enable the V8 sandbox in shared-cage builds (Shelley Vohr) [#&#8203;62237](https://redirect.github.com/nodejs/node/pull/62237)
- \[[`676e15c003`](https://redirect.github.com/nodejs/node/commit/676e15c003)] - **build**: define V8_CONTIGUOUS_COMPRESSED_RO_SPACE for shared cage (Shelley Vohr) [#&#8203;65464](https://redirect.github.com/nodejs/node/pull/65464)
- \[[`f784058482`](https://redirect.github.com/nodejs/node/commit/f784058482)] - **build**: remove obsolete configure flags (Chengzhong Wu) [#&#8203;65456](https://redirect.github.com/nodejs/node/pull/65456)
- \[[`f63f37d243`](https://redirect.github.com/nodejs/node/commit/f63f37d243)] - **build**: activate correct default flags for riscv64 (Stewart X Addison) [#&#8203;65708](https://redirect.github.com/nodejs/node/pull/65708)
- \[[`da46ac075d`](https://redirect.github.com/nodejs/node/commit/da46ac075d)] - **build**: derive NODE_ARCH from target_cpu in the GN build (Shelley Vohr) [#&#8203;65491](https://redirect.github.com/nodejs/node/pull/65491)
- \[[`249e9a16dd`](https://redirect.github.com/nodejs/node/commit/249e9a16dd)] - **build,src**: gate jspi flag on V8_ENABLE_WEBASSEMBLY (Piotr Kubaj) [#&#8203;66082](https://redirect.github.com/nodejs/node/pull/66082)
- \[[`146f00f64b`](https://redirect.github.com/nodejs/node/commit/146f00f64b)] - **child_process**: clear timeout timer on spawn-time error too (kishore280) [#&#8203;65506](https://redirect.github.com/nodejs/node/pull/65506)
- \[[`13987f4418`](https://redirect.github.com/nodejs/node/commit/13987f4418)] - **crypto**: remove redundent `std::move` call (Antoine du Hamel) [#&#8203;66111](https://redirect.github.com/nodejs/node/pull/66111)
- \[[`ef957ac85f`](https://redirect.github.com/nodejs/node/commit/ef957ac85f)] - **crypto**: skip private RSA parameters in key details (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`8feccc5e22`](https://redirect.github.com/nodejs/node/commit/8feccc5e22)] - **crypto**: use provider EC group names (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`764e0d1120`](https://redirect.github.com/nodejs/node/commit/764e0d1120)] - **crypto**: fetch ciphers for private-key encoding (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`50ffed1979`](https://redirect.github.com/nodejs/node/commit/50ffed1979)] - **crypto**: decode [PKCS#1](https://redirect.github.com/PKCS/node/issues/1) keys through providers (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`56c16b2fd6`](https://redirect.github.com/nodejs/node/commit/56c16b2fd6)] - **crypto**: derive keys through EVP_KDF (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`a4effe6809`](https://redirect.github.com/nodejs/node/commit/a4effe6809)] - **crypto**: use names for asymmetric key algorithms (Filip Skokan) [#&#8203;65966](https://redirect.github.com/nodejs/node/pull/65966)
- \[[`ddbf974b47`](https://redirect.github.com/nodejs/node/commit/ddbf974b47)] - **(SEMVER-MINOR)** **crypto**: add crypto.parsePKCS12() (Brian Muenzenmeyer) [#&#8203;65627](https://redirect.github.com/nodejs/node/pull/65627)
- \[[`8e631aa48f`](https://redirect.github.com/nodejs/node/commit/8e631aa48f)] - **crypto**: add Hybrid KEMs to Web Cryptography (Filip Skokan) [#&#8203;65759](https://redirect.github.com/nodejs/node/pull/65759)
- \[[`5c51129e16`](https://redirect.github.com/nodejs/node/commit/5c51129e16)] - **crypto**: optimize private EC JWK import (Filip Skokan) [#&#8203;65908](https://redirect.github.com/nodejs/node/pull/65908)
- \[[`c2ec40c2d7`](https://redirect.github.com/nodejs/node/commit/c2ec40c2d7)] - **crypto**: disable non-FIPS WebCrypto paths in FIPS mode (Filip Skokan) [#&#8203;65172](https://redirect.github.com/nodejs/node/pull/65172)
- \[[`e198aa0f79`](https://redirect.github.com/nodejs/node/commit/e198aa0f79)] - **crypto**: read RSA-PSS restrictions from provider (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`253784f0e9`](https://redirect.github.com/nodejs/node/commit/253784f0e9)] - **crypto**: optimize and benchmark key preparation (Filip Skokan) [#&#8203;65892](https://redirect.github.com/nodejs/node/pull/65892)
- \[[`80a6ad509b`](https://redirect.github.com/nodejs/node/commit/80a6ad509b)] - **crypto**: avoid EC reconstruction for signature sizing (Filip Skokan) [#&#8203;65908](https://redirect.github.com/nodejs/node/pull/65908)
- \[[`5b592b772c`](https://redirect.github.com/nodejs/node/commit/5b592b772c)] - **crypto**: avoid EC raw export reconstruction (Filip Skokan) [#&#8203;65908](https://redirect.github.com/nodejs/node/pull/65908)
- \[[`ee956ae3bf`](https://redirect.github.com/nodejs/node/commit/ee956ae3bf)] - **crypto**: export EC JWK coordinates directly (Filip Skokan) [#&#8203;65908](https://redirect.github.com/nodejs/node/pull/65908)
- \[[`684008be58`](https://redirect.github.com/nodejs/node/commit/684008be58)] - **crypto**: read EC curve metadata directly (Filip Skokan) [#&#8203;65908](https://redirect.github.com/nodejs/node/pull/65908)
- \[[`f4665f1c41`](https://redirect.github.com/nodejs/node/commit/f4665f1c41)] - **crypto**: validate the limit of PBKDF2 iterations (Filip Skokan) [#&#8203;65704](https://redirect.github.com/nodejs/node/pull/65704)
- \[[`624abbecd7`](https://redirect.github.com/nodejs/node/commit/624abbecd7)] - **crypto**: use primordials in HKDF info validation (Filip Skokan) [#&#8203;65704](https://redirect.github.com/nodejs/node/pull/65704)
- \[[`e4d916f175`](https://redirect.github.com/nodejs/node/commit/e4d916f175)] - **crypto**: add mgf1Hash for RSA-OAEP (Adam Mcgrath) [#&#8203;65073](https://redirect.github.com/nodejs/node/pull/65073)
- \[[`db8a9162a8`](https://redirect.github.com/nodejs/node/commit/db8a9162a8)] - **crypto**: fix multi-prime RSA JWKs (Filip Skokan) [#&#8203;65649](https://redirect.github.com/nodejs/node/pull/65649)
- \[[`022ac83504`](https://redirect.github.com/nodejs/node/commit/022ac83504)] - **crypto**: cache valid ECDH key pairs (Filip Skokan) [#&#8203;65615](https://redirect.github.com/nodejs/node/pull/65615)
- \[[`c61953ebcc`](https://redirect.github.com/nodejs/node/commit/c61953ebcc)] - **crypto**: add strict mode to --force-fips (Filip Skokan) [#&#8203;65645](https://redirect.github.com/nodejs/node/pull/65645)
- \[[`db6ea132a5`](https://redirect.github.com/nodejs/node/commit/db6ea132a5)] - **crypto**: add FIPS indicator diagnostics channel (Filip Skokan) [#&#8203;65645](https://redirect.github.com/nodejs/node/pull/65645)
- \[[`c162c68ff0`](https://redirect.github.com/nodejs/node/commit/c162c68ff0)] - **(SEMVER-MINOR)** **crypto**: add a generic MAC API (Filip Skokan) [#&#8203;65553](https://redirect.github.com/nodejs/node/pull/65553)
- \[[`2b62aafd20`](https://redirect.github.com/nodejs/node/commit/2b62aafd20)] - **crypto**: validate JWK usages before key_ops (Filip Skokan) [#&#8203;65550](https://redirect.github.com/nodejs/node/pull/65550)
- \[[`ec7819db69`](https://redirect.github.com/nodejs/node/commit/ec7819db69)] - **crypto**: fix RSA-PSS oversized salt handling (Filip Skokan) [#&#8203;65550](https://redirect.github.com/nodejs/node/pull/65550)
- \[[`a4ab3d84d7`](https://redirect.github.com/nodejs/node/commit/a4ab3d84d7)] - **(SEMVER-MINOR)** **crypto**: discover ciphers from OpenSSL providers (Filip Skokan) [#&#8203;65484](https://redirect.github.com/nodejs/node/pull/65484)
- \[[`c2f1e829ea`](https://redirect.github.com/nodejs/node/commit/c2f1e829ea)] - **(SEMVER-MINOR)** **crypto**: discover hashes from OpenSSL providers (Filip Skokan) [#&#8203;65484](https://redirect.github.com/nodejs/node/pull/65484)
- \[[`51aad5a80d`](https://redirect.github.com/nodejs/node/commit/51aad5a80d)] - **(SEMVER-MINOR)** **crypto**: enable SIV and GCM-SIV modes in Cipher/Decipher APIs (Filip Skokan) [#&#8203;63411](https://redirect.github.com/nodejs/node/pull/63411)
- \[[`5a46a9acbb`](https://redirect.github.com/nodejs/node/commit/5a46a9acbb)] - **crypto**: improve SubtleCrypto.supports() accuracy (Filip Skokan) [#&#8203;65222](https://redirect.github.com/nodejs/node/pull/65222)
- \[[`191ebfb26c`](https://redirect.github.com/nodejs/node/commit/191ebfb26c)] - **crypto**: fix public PKCS8 export error (한국) [#&#8203;65609](https://redirect.github.com/nodejs/node/pull/65609)
- \[[`b6d7ed372b`](https://redirect.github.com/nodejs/node/commit/b6d7ed372b)] - **crypto**: fix private SPKI export error (Filip Skokan) [#&#8203;65550](https://redirect.github.com/nodejs/node/pull/65550)
- \[[`79509c25a4`](https://redirect.github.com/nodejs/node/commit/79509c25a4)] - **crypto**: correct CCM decryption FIPS error message (kyungrae) [#&#8203;65450](https://redirect.github.com/nodejs/node/pull/65450)
- \[[`9adc87bc16`](https://redirect.github.com/nodejs/node/commit/9adc87bc16)] - **crypto**: harden X509Certificate state (Filip Skokan) [#&#8203;65518](https://redirect.github.com/nodejs/node/pull/65518)
- \[[`c63aa331b4`](https://redirect.github.com/nodejs/node/commit/c63aa331b4)] - **crypto**: optimize key slot caching (Filip Skokan) [#&#8203;65518](https://redirect.github.com/nodejs/node/pull/65518)
- \[[`87daea43a7`](https://redirect.github.com/nodejs/node/commit/87daea43a7)] - **crypto**: add null checks for OPENSSL_INIT_new() (Nora Dossche) [#&#8203;63457](https://redirect.github.com/nodejs/node/pull/63457)
- \[[`98ca5e9358`](https://redirect.github.com/nodejs/node/commit/98ca5e9358)] - **crypto**: prevent Hmac.digest() from returning uninitialized memory (Matteo Collina) [#&#8203;65112](https://redirect.github.com/nodejs/node/pull/65112)
- \[[`0c090a28cd`](https://redirect.github.com/nodejs/node/commit/0c090a28cd)] - **crypto**: avoid throwing CryptoKey brand checks (Filip Skokan) [#&#8203;65503](https://redirect.github.com/nodejs/node/pull/65503)
- \[[`a13cc3f723`](https://redirect.github.com/nodejs/node/commit/a13cc3f723)] - **crypto**: avoid throwing KeyObject brand checks (Filip Skokan) [#&#8203;65503](https://redirect.github.com/nodejs/node/pull/65503)
- \[[`b8db0045ef`](https://redirect.github.com/nodejs/node/commit/b8db0045ef)] - **deps**: V8: cherry-pick [`ea9c016`](https://redirect.github.com/nodejs/node/commit/ea9c016f26ad) (Gundepalli Sravani) [#&#8203;66570](https://redirect.github.com/nodejs/node/pull/66570)
- \[[`ba09b53487`](https://redirect.github.com/nodejs/node/commit/ba09b53487)] - **deps**: V8: backport [`c355350`](https://redirect.github.com/nodejs/node/commit/c3553509f460) (Jakob Linke) [#&#8203;66089](https://redirect.github.com/nodejs/node/pull/66089)
- \[[`9ce8ef405b`](https://redirect.github.com/nodejs/node/commit/9ce8ef405b)] - **deps**: V8: backport [`8901c79`](https://redirect.github.com/nodejs/node/commit/8901c793e439) (Toon Verwaest) [#&#8203;66089](https://redirect.github.com/nodejs/node/pull/66089)
- \[[`fb0d0ca289`](https://redirect.github.com/nodejs/node/commit/fb0d0ca289)] - **deps**: V8: backport [`0b94a9f`](https://redirect.github.com/nodejs/node/commit/0b94a9fd23ba) (Ruan Gustavo) [#&#8203;65753](https://redirect.github.com/nodejs/node/pull/65753)
- \[[`2faca508c0`](https://redirect.github.com/nodejs/node/commit/2faca508c0)] - **deps**: update googletest to [`8eff9e3`](https://redirect.github.com/nodejs/node/commit/8eff9e336692fc95961e096564f1044c600b881d) (Node.js GitHub Bot) [#&#8203;66009](https://redirect.github.com/nodejs/node/pull/66009)
- \[[`4396c9bffe`](https://redirect.github.com/nodejs/node/commit/4396c9bffe)] - **deps**: update googletest to [`283c175`](https://redirect.github.com/nodejs/node/commit/283c17563fe7a1111cd7f581aa5d541e8baeff2f) (Node.js GitHub Bot) [#&#8203;65833](https://redirect.github.com/nodejs/node/pull/65833)
- \[[`8a5b12570c`](https://redirect.github.com/nodejs/node/commit/8a5b12570c)] - **deps**: update simdjson to 4.6.11 (Node.js GitHub Bot) [#&#8203;65834](https://redirect.github.com/nodejs/node/pull/65834)
- \[[`c47feb09e8`](https://redirect.github.com/nodejs/node/commit/c47feb09e8)] - **deps**: update zlib to 1.3.2.1-motley-285e94b (Node.js GitHub Bot) [#&#8203;65835](https://redirect.github.com/nodejs/node/pull/65835)
- \[[`9f0d905286`](https://redirect.github.com/nodejs/node/commit/9f0d905286)] - **deps**: upgrade npm to 11.19.1 (npm team) [#&#8203;65573](https://redirect.github.com/nodejs/node/pull/65573)
- \[[`373cd332d8`](https://redirect.github.com/nodejs/node/commit/373cd332d8)] - **deps**: update googletest to [`36ba75f`](https://redirect.github.com/nodejs/node/commit/36ba75f0ad5383a9759f17f3f72fd4661c72cb6d) (Node.js GitHub Bot) [#&#8203;65654](https://redirect.github.com/nodejs/node/pull/65654)
- \[[`aeed6132a7`](https://redirect.github.com/nodejs/node/commit/aeed6132a7)] - **deps**: update simdjson to 4.6.9 (Node.js GitHub Bot) [#&#8203;65655](https://redirect.github.com/nodejs/node/pull/65655)
- \[[`2583571342`](https://redirect.github.com/nodejs/node/commit/2583571342)] - **deps**: update zlib to 1.3.2.1-motley-5eb4d7e (Node.js GitHub Bot) [#&#8203;65494](https://redirect.github.com/nodejs/node/pull/65494)
- \[[`d11c65d2f2`](https://redirect.github.com/nodejs/node/commit/d11c65d2f2)] - **doc**: add araujogui to collaborators (Guilherme Araújo) [#&#8203;66090](https://redirect.github.com/nodejs/node/pull/66090)
- \[[`0a4a8d602a`](https://redirect.github.com/nodejs/node/commit/0a4a8d602a)] - **doc**: fix duplicate 'the' typo in `node_platform.cc` (Muhammad Al-Muzahid) [#&#8203;66058](https://redirect.github.com/nodejs/node/pull/66058)
- \[[`b6538138ef`](https://redirect.github.com/nodejs/node/commit/b6538138ef)] - **doc**: clarify sub-1000ms behavior in socket.setKeepAlive (Haram Jeong) [#&#8203;65869](https://redirect.github.com/nodejs/node/pull/65869)
- \[[`d319fa7de4`](https://redirect.github.com/nodejs/node/commit/d319fa7de4)] - **doc**: remove obsolete mentioning of cl.exe on windows (Chengzhong Wu) [#&#8203;66038](https://redirect.github.com/nodejs/node/pull/66038)
- \[[`67cb305b59`](https://redirect.github.com/nodejs/node/commit/67cb305b59)] - **doc**: note that default signal handling resets the signal mask (Shelley Vohr) [#&#8203;65877](https://redirect.github.com/nodejs/node/pull/65877)
- \[[`160d44e025`](https://redirect.github.com/nodejs/node/commit/160d44e025)] - **doc**: clarify QUIC async write backpressure (John Finnerty) [#&#8203;65947](https://redirect.github.com/nodejs/node/pull/65947)
- \[[`ffd47a7ee5`](https://redirect.github.com/nodejs/node/commit/ffd47a7ee5)] - **doc**: clarify permission model scope for output paths (Rafael Gonzaga) [#&#8203;66004](https://redirect.github.com/nodejs/node/pull/66004)
- \[[`2e1772a8ab`](https://redirect.github.com/nodejs/node/commit/2e1772a8ab)] - **doc**: fill in missing zstd docs (James M Snell) [#&#8203;65867](https://redirect.github.com/nodejs/node/pull/65867)
- \[[`9f88c6f8dc`](https://redirect.github.com/nodejs/node/commit/9f88c6f8dc)] - **doc**: add inoway46 as triager (Yuya Inoue) [#&#8203;65565](https://redirect.github.com/nodejs/node/pull/65565)
- \[[`c2620d01f3`](https://redirect.github.com/nodejs/node/commit/c2620d01f3)] - **doc**: document windowsHide for child_process.fork (Christopher Buss) [#&#8203;65887](https://redirect.github.com/nodejs/node/pull/65887)
- \[[`6076111e1a`](https://redirect.github.com/nodejs/node/commit/6076111e1a)] - **doc**: qualify directory read ordering for native fs (Trivikram Kamat) [#&#8203;65868](https://redirect.github.com/nodejs/node/pull/65868)
- \[[`7bf048a336`](https://redirect.github.com/nodejs/node/commit/7bf048a336)] - **doc**: add DOMException section to errors API reference (Avocado) [#&#8203;65206](https://redirect.github.com/nodejs/node/pull/65206)
- \[[`414b6bfa62`](https://redirect.github.com/nodejs/node/commit/414b6bfa62)] - **doc**: expand revert commit collaborator instructions (Mike McCready) [#&#8203;65848](https://redirect.github.com/nodejs/node/pull/65848)
- \[[`c8ac91692c`](https://redirect.github.com/nodejs/node/commit/c8ac91692c)] - **doc**: note that FreeEnvironment() runs a shared event loop (Shelley Vohr) [#&#8203;65691](https://redirect.github.com/nodejs/node/pull/65691)
- \[[`cc47cc0983`](https://redirect.github.com/nodejs/node/commit/cc47cc0983)] - **doc**: clarify security triage dispositions and permission boundaries (Rafael Gonzaga) [#&#8203;65436](https://redirect.github.com/nodejs/node/pull/65436)
- \[[`8b79a71e78`](https://redirect.github.com/nodejs/node/commit/8b79a71e78)] - **doc**: fix default limit of maxHeadersCount (Aryn H) [#&#8203;65472](https://redirect.github.com/nodejs/node/pull/65472)
- \[[`56b1252a54`](https://redirect.github.com/nodejs/node/commit/56b1252a54)] - **doc**: fix return types for sync methods (Chiang Fong Lee) [#&#8203;58575](https://redirect.github.com/nodejs/node/pull/58575)
- \[[`da0d32a333`](https://redirect.github.com/nodejs/node/commit/da0d32a333)] - **doc**: document REPL DEP0185 throws and uncaught-exception behavior (Adrián Estrada) [#&#8203;64993](https://redirect.github.com/nodejs/node/pull/64993)
- \[[`f8ab3619b6`](https://redirect.github.com/nodejs/node/commit/f8ab3619b6)] - **doc**: document close() error when in a sqlite callback (Trivikram Kamat) [#&#8203;65090](https://redirect.github.com/nodejs/node/pull/65090)
- \[[`131f1db302`](https://redirect.github.com/nodejs/node/commit/131f1db302)] - **doc**: clarify return type of `fs.mkdtemp*` (Antoine du Hamel) [#&#8203;65743](https://redirect.github.com/nodejs/node/pull/65743)
- \[[`7755e98183`](https://redirect.github.com/nodejs/node/commit/7755e98183)] - **doc**: update `changelog-maker` instructions for releasing (Juan José) [#&#8203;65707](https://redirect.github.com/nodejs/node/pull/65707)
- \[[`f982a53433`](https://redirect.github.com/nodejs/node/commit/f982a53433)] - **doc**: add stability status to `crypto.setEngine` (Antoine du Hamel) [#&#8203;65746](https://redirect.github.com/nodejs/node/pull/65746)
- \[[`17be003f7c`](https://redirect.github.com/nodejs/node/commit/17be003f7c)] - **doc**: remove outdated TLS authorized warning (Tim Perry) [#&#8203;65597](https://redirect.github.com/nodejs/node/pull/65597)
- \[[`424002232d`](https://redirect.github.com/nodejs/node/commit/424002232d)] - **doc**: fix stale TOC in maintaining-dependencies (greenhead) [#&#8203;65523](https://redirect.github.com/nodejs/node/pull/65523)
- \[[`dddb9b57a5`](https://redirect.github.com/nodejs/node/commit/dddb9b57a5)] - **doc**: refactor the AI guidelines (Joyee Cheung) [#&#8203;65269](https://redirect.github.com/nodejs/node/pull/65269)
- \[[`397b58e113`](https://redirect.github.com/nodejs/node/commit/397b58e113)] - **doc**: fix triggerAsyncId() comment in async_hooks example (soreavis) [#&#8203;64583](https://redirect.github.com/nodejs/node/pull/64583)
- \[[`338ec94d83`](https://redirect.github.com/nodejs/node/commit/338ec94d83)] - **doc**: fix fsPromises.watch overflow value (Matt Radbourne) [#&#8203;64605](https://redirect.github.com/nodejs/node/pull/64605)
- \[[`f18be21b14`](https://redirect.github.com/nodejs/node/commit/f18be21b14)] - **doc**: clarify stream direction in options.stdio note (Avocado) [#&#8203;65236](https://redirect.github.com/nodejs/node/pull/65236)
- \[[`f07c6acd8b`](https://redirect.github.com/nodejs/node/commit/f07c6acd8b)] - **doc**: clarify signal listener behavior (Som Samantray) [#&#8203;65243](https://redirect.github.com/nodejs/node/pull/65243)
- \[[`8bc17b0c7a`](https://redirect.github.com/nodejs/node/commit/8bc17b0c7a)] - **doc**: add test reporter event lifecycle diagram (sangwook) [#&#8203;63780](https://redirect.github.com/nodejs/node/pull/63780)
- \[[`452e7477d4`](https://redirect.github.com/nodejs/node/commit/452e7477d4)] - **doc**: discourage AbortSignal cleanup for long-lived resources (Efe Karasakal) [#&#8203;64342](https://redirect.github.com/nodejs/node/pull/64342)
- \[[`acc1578179`](https://redirect.github.com/nodejs/node/commit/acc1578179)] - **doc**: deprecate `Server.prototype._listen2` in `node:net` (Antoine du Hamel) [#&#8203;65593](https://redirect.github.com/nodejs/node/pull/65593)
- \[[`e7ed4361d6`](https://redirect.github.com/nodejs/node/commit/e7ed4361d6)] - **doc,test**: account for OpenSSL 4.1 behaviours (Filip Skokan) [#&#8203;65956](https://redirect.github.com/nodejs/node/pull/65956)
- \[[`c65fafeab4`](https://redirect.github.com/nodejs/node/commit/c65fafeab4)] - **errors**: validate constructor name (Christian Aurich) [#&#8203;65607](https://redirect.github.com/nodejs/node/pull/65607)
- \[[`f6b47938b7`](https://redirect.github.com/nodejs/node/commit/f6b47938b7)] - **events**: fix weak listener retention overwrite (Aryan) [#&#8203;64024](https://redirect.github.com/nodejs/node/pull/64024)
- \[[`a27db42c3e`](https://redirect.github.com/nodejs/node/commit/a27db42c3e)] - **fs**: coerce FileHandle.read length like fs.read (Xia Chao) [#&#8203;65521](https://redirect.github.com/nodejs/node/pull/65521)
- \[[`f3019b522a`](https://redirect.github.com/nodejs/node/commit/f3019b522a)] - **fs**: throw on existing dir in cpSync with errorOnExist (Daijiro Wachi) [#&#8203;64124](https://redirect.github.com/nodejs/node/pull/64124)
- \[[`cd1011458f`](https://redirect.github.com/nodejs/node/commit/cd1011458f)] - **fs**: support removing read-only files in rmSync on Windows (Sparsh :)) [#&#8203;64453](https://redirect.github.com/nodejs/node/pull/64453)
- \[[`d659dd8cd8`](https://redirect.github.com/nodejs/node/commit/d659dd8cd8)] - **fs**: give directories created by cpSync the source directory's mode (Shelley Vohr) [#&#8203;65488](https://redirect.github.com/nodejs/node/pull/65488)
- \[[`1dfb047293`](https://redirect.github.com/nodejs/node/commit/1dfb047293)] - **fs**: handle recursive watch setup races (Filip Skokan) [#&#8203;65699](https://redirect.github.com/nodejs/node/pull/65699)
- \[[`bc431c8413`](https://redirect.github.com/nodejs/node/commit/bc431c8413)] - **fs**: apply nocase to literal glob exclude patterns (Yusuke Hayashi) [#&#8203;64817](https://redirect.github.com/nodejs/node/pull/64817)
- \[[`dd5662e641`](https://redirect.github.com/nodejs/node/commit/dd5662e641)] - **fs**: do not descend into symlinks for \*\* unless following symlinks (RafaelGSS) [#&#8203;65435](https://redirect.github.com/nodejs/node/pull/65435)
- \[[`ac4cf54292`](https://redirect.github.com/nodejs/node/commit/ac4cf54292)] - **fs**: watch directories, not files, in recursive fs.watch fallback (Shelley Vohr) [#&#8203;65486](https://redirect.github.com/nodejs/node/pull/65486)
- \[[`7804bfbd71`](https://redirect.github.com/nodejs/node/commit/7804bfbd71)] - **fs**: preserve directory timestamps in cp (Abhinandan Kumar) [#&#8203;65540](https://redirect.github.com/nodejs/node/pull/65540)
- \[[`ba5ca5a1a5`](https://redirect.github.com/nodejs/node/commit/ba5ca5a1a5)] - **fs**: fix recursive watch error handling (Filip Skokan) [#&#8203;65635](https://redirect.github.com/nodejs/node/pull/65635)
- \[[`b71c4c0551`](https://redirect.github.com/nodejs/node/commit/b71c4c0551)] - **fs**: fix rmSync error messages for non-ASCII paths (Yeaseen) [#&#8203;61233](https://redirect.github.com/nodejs/node/pull/61233)
- \[[`53b4700892`](https://redirect.github.com/nodejs/node/commit/53b4700892)] - **http**: don't destroy socket after request completes (Barath Raj) [#&#8203;65952](https://redirect.github.com/nodejs/node/pull/65952)
- \[[`96d4c23f17`](https://redirect.github.com/nodejs/node/commit/96d4c23f17)] - **http**: fast-forward teardown of unread messages (Matteo Collina) [#&#8203;65732](https://redirect.github.com/nodejs/node/pull/65732)
- \[[`742b4bf5a6`](https://redirect.github.com/nodejs/node/commit/742b4bf5a6)] - **http**: coalesce chunked writes during auto-corking (GetThatCookie) [#&#8203;64987](https://redirect.github.com/nodejs/node/pull/64987)
- \[[`8921108175`](https://redirect.github.com/nodejs/node/commit/8921108175)] - **http2**: settle pending write callbacks on destroy (Matteo Collina) [#&#8203;66016](https://redirect.github.com/nodejs/node/pull/66016)
- \[[`9a2f77a3fc`](https://redirect.github.com/nodejs/node/commit/9a2f77a3fc)] - **http2**: fix onread assert when destroying session from stream handler (Sankalp Thakur) [#&#8203;65116](https://redirect.github.com/nodejs/node/pull/65116)
- \[[`99e41eb43a`](https://redirect.github.com/nodejs/node/commit/99e41eb43a)] - **http2**: error for incomplete reads on RST, auto-drain, deprecate aborted (Tim Perry) [#&#8203;63249](https://redirect.github.com/nodejs/node/pull/63249)
- \[[`d520b9601c`](https://redirect.github.com/nodejs/node/commit/d520b9601c)] - **http2**: fix write deadlock exposed by larger window sizes (Tim Perry) [#&#8203;65440](https://redirect.github.com/nodejs/node/pull/65440)
- \[[`86b2497aae`](https://redirect.github.com/nodejs/node/commit/86b2497aae)] - **http2**: fix async context loss when trailers carry END_STREAM (Orgad Shaneh) [#&#8203;63814](https://redirect.github.com/nodejs/node/pull/63814)
- \[[`536ccc7daf`](https://redirect.github.com/nodejs/node/commit/536ccc7daf)] - **https**: limit proxy CONNECT response headers (Matteo Collina) [#&#8203;64545](https://redirect.github.com/nodejs/node/pull/64545)
- \[[`fe6147832b`](https://redirect.github.com/nodejs/node/commit/fe6147832b)] - **inspector**: fix abort when two Environments own the inspector (Shelley Vohr) [#&#8203;65877](https://redirect.github.com/nodejs/node/pull/65877)
- \[[`843a27782a`](https://redirect.github.com/nodejs/node/commit/843a27782a)] - **inspector**: fix crash when the IsolateData has no platform (Shelley Vohr) [#&#8203;65818](https://redirect.github.com/nodejs/node/pull/65818)
- \[[`3f0b6d3308`](https://redirect.github.com/nodejs/node/commit/3f0b6d3308)] - **lib**: avoid repeat internal receiver checks (Filip Skokan) [#&#8203;65910](https://redirect.github.com/nodejs/node/pull/65910)
- \[[`0039479b4a`](https://redirect.github.com/nodejs/node/commit/0039479b4a)] - **lib**: fix shared buffer growability validation (Filip Skokan) [#&#8203;65845](https://redirect.github.com/nodejs/node/pull/65845)
- \[[`e7907130ae`](https://redirect.github.com/nodejs/node/commit/e7907130ae)] - **lib**: use Web IDL interface brand checks (Filip Skokan) [#&#8203;65846](https://redirect.github.com/nodejs/node/pull/65846)
- \[[`7ae085552b`](https://redirect.github.com/nodejs/node/commit/7ae085552b)] - **lib**: fix AbortSignal.any() abort propagation (Yuya Inoue) [#&#8203;66014](https://redirect.github.com/nodejs/node/pull/66014)
- \[[`01032f4fdc`](https://redirect.github.com/nodejs/node/commit/01032f4fdc)] - **lib**: fix for FileHandle.readableWebStream (Patrick Dähne) [#&#8203;58842](https://redirect.github.com/nodejs/node/pull/58842)
- \[[`60a9a28206`](https://redirect.github.com/nodejs/node/commit/60a9a28206)] - **lib**: avoid unsafe array iteration in cli table (Donghoon Kang) [#&#8203;65838](https://redirect.github.com/nodejs/node/pull/65838)
- \[[`230a7fcef0`](https://redirect.github.com/nodejs/node/commit/230a7fcef0)] - **lib**: optimize internal Web IDL dictionaries (Filip Skokan) [#&#8203;65857](https://redirect.github.com/nodejs/node/pull/65857)
- \[[`7cc02b14ec`](https://redirect.github.com/nodejs/node/commit/7cc02b14ec)] - **lib**: validate sequence iterator objects (Filip Skokan) [#&#8203;65844](https://redirect.github.com/nodejs/node/pull/65844)
- \[[`c2bb3aeccc`](https://redirect.github.com/nodejs/node/commit/c2bb3aeccc)] - **lib**: defer source map payload decoding until first use (Shelley Vohr) [#&#8203;65490](https://redirect.github.com/nodejs/node/pull/65490)
- \[[`c4b390cf17`](https://redirect.github.com/nodejs/node/commit/c4b390cf17)] - **lib**: optimize async context frame activation (Tim Perry) [#&#8203;65519](https://redirect.github.com/nodejs/node/pull/65519)
- \[[`3e4fc50a4f`](https://redirect.github.com/nodejs/node/commit/3e4fc50a4f)] - **lib**: use validateArray for array arguments (JunHwan Choi) [#&#8203;65344](https://redirect.github.com/nodejs/node/pull/65344)
- \[[`b351ac9cd4`](https://redirect.github.com/nodejs/node/commit/b351ac9cd4)] - **meta**: bump step-security/harden-runner from 2.21.0 to 2.21.1 (dependabot\[bot]) [#&#8203;66044](https://redirect.github.com/nodejs/node/pull/66044)
- \[[`693e890fec`](https://redirect.github.com/nodejs/node/commit/693e890fec)] - **meta**: bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.0 (dependabot\[bot]) [#&#8203;66046](https://redirect.github.com/nodejs/node/pull/66046)
- \[[`9c2abc13c2`](https://redirect.github.com/nodejs/node/commit/9c2abc13c2)] - **meta**: bump github/codeql-action/init from 4.37.9 to 4.38.0 (dependabot\[bot]) [#&#8203;66048](https://redirect.github.com/nodejs/node/pull/66048)
- \[[`b3c5c2b91d`](https://redirect.github.com/nodejs/node/commit/b3c5c2b91d)] - **meta**: bump github/codeql-action/analyze from 4.37.9 to 4.38.0 (dependabot\[bot]) [#&#8203;66049](https://redirect.github.com/nodejs/node/pull/66049)
- \[[`2428b13b02`](https://redirect.github.com/nodejs/node/commit/2428b13b02)] - **meta**: bump github/codeql-action/autobuild from 4.37.9 to 4.38.0 (dependabot\[bot]) [#&#8203;66050](https://redirect.github.com/nodejs/node/pull/66050)
- \[[`eff5d15041`](https://redirect.github.com/nodejs/node/commit/eff5d15041)] - **meta**: add joyeecheung as v8 currency strategic initiative champion (Joyee Cheung) [#&#8203;65965](https://redirect.github.com/nodejs/node/pull/65965)
- \[[`aa549fed0d`](https://redirect.github.com/nodejs/node/commit/aa549fed0d)] - **meta**: expand on collaborator restoration process (Chengzhong Wu) [#&#8203;65962](https://redirect.github.com/nodejs/node/pull/65962)
- \[[`593b40eb2b`](https://redirect.github.com/nodejs/node/commit/593b40eb2b)] - **meta**: add web-standards as webidl owners (Filip Skokan) [#&#8203;65856](https://redirect.github.com/nodejs/node/pull/65856)
- \[[`e711d3fef3`](https://redirect.github.com/nodejs/node/commit/e711d3fef3)] - **meta**: bump actions/checkout from 7.0.0 to 7.0.1 (dependabot\[bot]) [#&#8203;65718](https://redirect.github.com/nodejs/node/pull/65718)
- \[[`0fc8a38f5b`](https://redirect.github.com/nodejs/node/commit/0fc8a38f5b)] - **meta**: cleanup targos emeritus changes (Antoine du Hamel) [#&#8203;65738](https://redirect.github.com/nodejs/node/pull/65738)
- \[[`2ca2fd566d`](https://redirect.github.com/nodejs/node/commit/2ca2fd566d)] - **meta**: bump github/codeql-action/init from 4.37.3 to 4.37.9 (dependabot\[bot]) [#&#8203;65714](https://redirect.github.com/nodejs/node/pull/65714)
- \[[`325709818e`](https://redirect.github.com/nodejs/node/commit/325709818e)] - **meta**: bump github/codeql-action/autobuild from 4.37.3 to 4.37.9 (dependabot\[bot]) [#&#8203;65717](https://redirect.github.com/nodejs/node/pull/65717)
- \[[`8481d22f72`](https://redirect.github.com/nodejs/node/commit/8481d22f72)] - **meta**: bump actions/setup-node from 6.4.0 to 7.0.0 (dependabot\[bot]) [#&#8203;65720](https://redirect.github.com/nodejs/node/pull/65720)
- \[[`cd2bd5d9fd`](https://redirect.github.com/nodejs/node/commit/cd2bd5d9fd)] - **meta**: bump step-security/harden-runner from 2.20.0 to 2.21.0 (dependabot\[bot]) [#&#8203;65721](https://redirect.github.com/nodejs/node/pull/65721)
- \[[`fdec747105`](https://redirect.github.com/nodejs/node/commit/fdec747105)] - **meta**: bump github/codeql-action/upload-sarif from 4.37.3 to 4.37.9 (dependabot\[bot]) [#&#8203;65722](https://redirect.github.com/nodejs/node/pull/65722)
- \[[`34c2fca088`](https://redirect.github.com/nodejs/node/commit/34c2fca088)] - **meta**: bump github/codeql-action/analyze from 4.37.3 to 4.37.9 (dependabot\[bot]) [#&#8203;65723](https://redirect.github.com/nodejs/node/pull/65723)
- \[[`46d4549938`](https://redirect.github.com/nodejs/node/commit/46d4549938)] - **meta**: document collaborator automation (Filip Skokan) [#&#8203;65671](https://redirect.github.com/nodejs/node/pull/65671)
- \[[`a7f8de6362`](https://redirect.github.com/nodejs/node/commit/a7f8de6362)] - **(SEMVER-MINOR)** **net**: support sending net.BoundSocket to threads and child processes (Guy Bedford) [#&#8203;64725](https://redirect.github.com/nodejs/node/pull/64725)
- \[[`466f1f8e62`](https://redirect.github.com/nodejs/node/commit/466f1f8e62)] - **net**: fix BlockList.fromJSON for IPv4-mapped IPv6 rules (Daijiro Wachi) [#&#8203;64125](https://redirect.github.com/nodejs/node/pull/64125)
- \[[`cd04cb10d6`](https://redirect.github.com/nodejs/node/commit/cd04cb10d6)] - **net**: recognize bare IPv6 loopback addresses in isLoopback (Daijiro Wachi) [#&#8203;63619](https://redirect.github.com/nodejs/node/pull/63619)
- \[[`d983942636`](https://redirect.github.com/nodejs/node/commit/d983942636)] - **node-api**: make object property arrays const (Yilong Li) [#&#8203;65621](https://redirect.github.com/nodejs/node/pull/65621)
- \[[`cc124394cc`](https://redirect.github.com/nodejs/node/commit/cc124394cc)] - **path**: remove `StringPrototypeCharCodeAt` from some methods of `posix` (Wiyeong Seo) [#&#8203;54668](https://redirect.github.com/nodejs/node/pull/54668)
- \[[`60c3eb61bd`](https://redirect.github.com/nodejs/node/commit/60c3eb61bd)] - **(SEMVER-MINOR)** **perf_hooks**: implement SlidingWindowHistogram (James M Snell) [#&#8203;65825](https://redirect.github.com/nodejs/node/pull/65825)
- \[[`6b3e6f9d5c`](https://redirect.github.com/nodejs/node/commit/6b3e6f9d5c)] - **(SEMVER-MINOR)** **perf_hooks**: implement qrde analysis support in Histogram (James M Snell) [#&#8203;65806](https://redirect.github.com/nodejs/node/pull/65806)
- \[[`8aa870940c`](https://redirect.github.com/nodejs/node/commit/8aa870940c)] - **perf_hooks**: reuse buffer for uv metrics (Donghoon Kang) [#&#8203;65985](https://redirect.github.com/nodejs/node/pull/65985)
- \[[`9cfbfae660`](https://redirect.github.com/nodejs/node/commit/9cfbfae660)] - **perf_hooks**: validate import normalization offset (Matteo Collina) [#&#8203;65950](https://redirect.github.com/nodejs/node/pull/65950)
- \[[`75456a3512`](https://redirect.github.com/nodejs/node/commit/75456a3512)] - **(SEMVER-MINOR)** **perf_hooks**: implement Histogram meanCI API (James M Snell) [#&#8203;65606](https://redirect.github.com/nodejs/node/pull/65606)
- \[[`127cb31864`](https://redirect.github.com/nodejs/node/commit/127cb31864)] - **perf_hooks**: add missing resource timing attributes (greenhead) [#&#8203;65017](https://redirect.github.com/nodejs/node/pull/65017)
- \[[`72d1b40c56`](https://redirect.github.com/nodejs/node/commit/72d1b40c56)] - **(SEMVER-MINOR)** **perf_hooks**: add CBOR export/import for histogram exchange (James M Snell) [#&#8203;65434](https://redirect.github.com/nodejs/node/pull/65434)
- \[[`847fe4d049`](https://redirect.github.com/nodejs/node/commit/847fe4d049)] - **permission**: block FileHandle fsync and fdatasync (Rafael Gonzaga) [#&#8203;65431](https://redirect.github.com/nodejs/node/pull/65431)
- \[[`fa9188bd63`](https://redirect.github.com/nodejs/node/commit/fa9188bd63)] - **quic**: fix two small bugs in HTTP/3 stream internals (Tim Perry) [#&#8203;65970](https://redirect.github.com/nodejs/node/pull/65970)
- \[[`ee80beaa9f`](https://redirect.github.com/nodejs/node/commit/ee80beaa9f)] - **quic**: fix crash in onStreamClose (Marten Richter) [#&#8203;65861](https://redirect.github.com/nodejs/node/pull/65861)
- \[[`98486dd764`](https://redirect.github.com/nodejs/node/commit/98486dd764)] - **quic**: reject zero addressLRUSize (Christian Aurich) [#&#8203;65827](https://redirect.github.com/nodejs/node/pull/65827)
- \[[`97516fc256`](https://redirect.github.com/nodejs/node/commit/97516fc256)] - **quic**: stop guarding ngtcp2_recv_stop_sending callback field (René) [#&#8203;65688](https://redirect.github.com/nodejs/node/pull/65688)
- \[[`024bef25eb`](https://redirect.github.com/nodejs/node/commit/024bef25eb)] - **quic**: remove unused fin flag from blob reader wakeup (trivenay) [#&#8203;65315](https://redirect.github.com/nodejs/node/pull/65315)
- \[[`5468337456`](https://redirect.github.com/nodejs/node/commit/5468337456)] - **quic**: release stream arenas before cleanup (Trivikram Kamat) [#&#8203;65410](https://redirect.github.com/nodejs/node/pull/65410)
- \[[`a794e36970`](https://redirect.github.com/nodejs/node/commit/a794e36970)] - **sqlite**: throw on invalid URL path instead of abort (Guilherme Araújo) [#&#8203;66026](https://redirect.github.com/nodejs/node/pull/66026)
- \[[`f58a55b8d0`](https://redirect.github.com/nodejs/node/commit/f58a55b8d0)] - **sqlite**: add diagnostic channel (Guilherme Araújo) [#&#8203;62241](https://redirect.github.com/nodejs/node/pull/62241)
- \[[`be849bc6af`](https://redirect.github.com/nodejs/node/commit/be849bc6af)] - **sqlite**: reject connection access from authorizer callbacks (Trevor Burnham) [#&#8203;65156](https://redirect.github.com/nodejs/node/pull/65156)
- \[[`41161dda87`](https://redirect.github.com/nodejs/node/commit/41161dda87)] - **(SEMVER-MINOR)** **sqlite**: add StatementSync.prototype.close() (Guilherme Araújo) [#&#8203;64232](https://redirect.github.com/nodejs/node/pull/64232)
- \[[`adbc757d70`](https://redirect.github.com/nodejs/node/commit/adbc757d70)] - **(SEMVER-MINOR)** **sqlite**: add StatementSync.prototype\[Symbol.dispose]\() (Guilherme Araújo) [#&#8203;64232](https://redirect.github.com/nodejs/node/pull/64232)
- \[[`b7b18fdbc9`](https://redirect.github.com/nodejs/node/commit/b7b18fdbc9)] - **sqlite**: run backup completion in callback scope (Filip Skokan) [#&#8203;65666](https://redirect.github.com/nodejs/node/pull/65666)
- \[[`59827acd7f`](https://redirect.github.com/nodejs/node/commit/59827acd7f)] - **sqlite**: isolate applyChangeset filter errors (Trivikram Kamat) [#&#8203;64823](https://redirect.github.com/nodejs/node/pull/64823)
- \[[`5a01df2d15`](https://redirect.github.com/nodejs/node/commit/5a01df2d15)] - **sqlite**: reject deserialize() while in a callback (Trivikram Kamat) [#&#8203;64796](https://redirect.github.com/nodejs/node/pull/64796)
- \[[`c9b6e75a2e`](https://redirect.github.com/nodejs/node/commit/c9b6e75a2e)] - **sqlite**: refactor error helpers and user function pointers (Ali Hassan) [#&#8203;62794](https://redirect.github.com/nodejs/node/pull/62794)
- \[[`d4eb6c62a9`](https://redirect.github.com/nodejs/node/commit/d4eb6c62a9)] - **sqlite**: prevent database close during callbacks (Matteo Collina) [#&#8203;64743](https://redirect.github.com/nodejs/node/pull/64743)
- \[[`83b3431c25`](https://redirect.github.com/nodejs/node/commit/83b3431c25)] - **src**: detach cppgc wrappers from their Realm before it is freed (Shelley Vohr) [#&#8203;65778](https://redirect.github.com/nodejs/node/pull/65778)
- \[[`13ed7e35e7`](https://redirect.github.com/nodejs/node/commit/13ed7e35e7)] - **src**: list scripts when `--run` has no command (James Ross) [#&#8203;64606](https://redirect.github.com/nodejs/node/pull/64606)
- \[[`0f62f2b2df`](https://redirect.github.com/nodejs/node/commit/0f62f2b2df)] - **src**: print exception thrown during primordial initialization (Joyee Cheung) [#&#8203;65991](https://redirect.github.com/nodejs/node/pull/65991)
- \[[`70117640f7`](https://redirect.github.com/nodejs/node/commit/70117640f7)] - **src**: don't kill own process group on failed spawn (Lazizbek Ergashev) [#&#8203;65054](https://redirect.github.com/nodejs/node/pull/65054)
- \[[`64649abfd4`](https://redirect.github.com/nodejs/node/commit/64649abfd4)] - **src**: keep the first snapshot blob alive for later isolates (Shelley Vohr) [#&#8203;65779](https://redirect.github.com/nodejs/node/pull/65779)
- \[[`3c814e8c3c`](https://redirect.github.com/nodejs/node/commit/3c814e8c3c)] - **src**: fix Stop() terminating the next Environment on the isolate (Shelley Vohr) [#&#8203;65819](https://redirect.github.com/nodejs/node/pull/65819)
- \[[`a3ababcebb`](https://redirect.github.com/nodejs/node/commit/a3ababcebb)] - **src**: fix null pointer call when running without a startup snapshot (Shelley Vohr) [#&#8203;65820](https://redirect.github.com/nodejs/node/pull/65820)
- \[[`7331f5cfcc`](https://redirect.github.com/nodejs/node/commit/7331f5cfcc)] - **src**: stop leaking a CppHeap in CommonEnvironmentSetup (Shelley Vohr) [#&#8203;65792](https://redirect.github.com/nodejs/node/pull/65792)
- \[[`5570a84048`](https://redirect.github.com/nodejs/node/commit/5570a84048)] - **src**: fix use-after-free in CleanupHookThunkRun (Caleb Everett) [#&#8203;65630](https://redirect.github.com/nodejs/node/pull/65630)
- \[[`abe1b673e9`](https://redirect.github.com/nodejs/node/commit/abe1b673e9)] - **src**: keep global list of addon-provided cleanup hooks (Anna Henningsen) [#&#8203;63985](https://redirect.github.com/nodejs/node/pull/63985)
- \[[`2203ac9382`](https://redirect.github.com/nodejs/node/commit/2203ac9382)] - **src**: fix startup snapshot reproducibility of InternalFieldInfo (Chengzhong Wu) [#&#8203;65684](https://redirect.github.com/nodejs/node/pull/65684)
- \[[`b282765d99`](https://redirect.github.com/nodejs/node/commit/b282765d99)] - **src**: fix live lock between environments with blocked requests (Ilyas Shabi) [#&#8203;65520](https://redirect.github.com/nodejs/node/pull/65520)
- \[[`61ca3ba93c`](https://redirect.github.com/nodejs/node/commit/61ca3ba93c)] - **src**: apply IsolateSettings when using a snapshot (Shelley Vohr) [#&#8203;65407](https://redirect.github.com/nodejs/node/pull/65407)
- \[[`33b8d6e10f`](https://redirect.github.com/nodejs/node/commit/33b8d6e10f)] - **src**: add re-entrancy guard to TriggerUncaughtException (Temuulen Undrakhbayar) [#&#8203;64327](https://redirect.github.com/nodejs/node/pull/64327)
- \[[`49232db71e`](https://redirect.github.com/nodejs/node/commit/49232db71e)] - **src**: reuse cached strings in CompileSerializeMain (agape1225) [#&#8203;65453](https://redirect.github.com/nodejs/node/pull/65453)
- \[[`e3f52b80a5`](https://redirect.github.com/nodejs/node/commit/e3f52b80a5)] - **src**: report libuv error when openAsBlob cannot stat (Paul Bouchon) [#&#8203;65517](https://redirect.github.com/nodejs/node/pull/65517)
- \[[`42a5a19027`](https://redirect.github.com/nodejs/node/commit/42a5a19027)] - **src**: shave about 20 bytes off each TLSWrap instance (James M Snell) [#&#8203;65144](https://redirect.github.com/nodejs/node/pull/65144)
- \[[`a06bb51e22`](https://redirect.github.com/nodejs/node/commit/a06bb51e22)] - **src**: use UTF-8 for task runner filesystem paths (Archkon) [#&#8203;64868](https://redirect.github.com/nodejs/node/pull/64868)
- \[[`241339f072`](https://redirect.github.com/nodejs/node/commit/241339f072)] - **(SEMVER-MINOR)** **src,lib**: add util.markPromiseAsHandled (James M Snell) [#&#8203;65805](https://redirect.github.com/nodejs/node/pull/65805)
- \[[`1260642ace`](https://redirect.github.com/nodejs/node/commit/1260642ace)] - **stream**: destroy Duplex.from async function on early return (Aman Chadha(IVIXMMI)) [#&#8203;65963](https://redirect.github.com/nodejs/node/pull/65963)
- \[[`5f06defdbd`](https://redirect.github.com/nodejs/node/commit/5f06defdbd)] - **stream**: make share budget failures detach before throwing (James M Snell) [#&#8203;66028](https://redirect.github.com/nodejs/node/pull/66028)
- \[[`d1c60d898d`](https://redirect.github.com/nodejs/node/commit/d1c60d898d)] - **stream**: update broadcast to retain buffered data with zero consumers (James M Snell) [#&#8203;66028](https://redirect.github.com/nodejs/node/pull/66028)
- \[[`bbb00558c5`](https://redirect.github.com/nodejs/node/commit/bbb00558c5)] - **stream**: avoid promise allocation for parked transform writes (Matteo Collina) [#&#8203;65625](https://redirect.github.com/nodejs/node/pull/65625)
- \[[`3216bc3912`](https://redirect.github.com/nodejs/node/commit/3216bc3912)] - **stream**: keep webstream stream states in fast-mode objects (Matteo Collina) [#&#8203;65625](https://redirect.github.com/nodejs/node/pull/65625)
- \[[`70c1415686`](https://redirect.github.com/nodejs/node/commit/70c1415686)] - **stream**: reject closed only after sink abort settles (Lazizbek Ergashev) [#&#8203;65727](https://redirect.github.com/nodejs/node/pull/65727)
- \[[`f8737b8ee5`](https://redirect.github.com/nodejs/node/commit/f8737b8ee5)] - **stream**: fix ERR_INVALID_STATE when cancelling Readable.toWeb() (Richard Scarrott) [#&#8203;62773](https://redirect.github.com/nodejs/node/pull/62773)
- \[[`faa16f671c`](https://redirect.github.com/nodejs/node/commit/faa16f671c)] - **stream**: amortize writable buffer compaction (Gürgün Dayıoğlu) [#&#8203;65847](https://redirect.github.com/nodejs/node/pull/65847)
- \[[`6262e0b8c6`](https://redirect.github.com/nodejs/node/commit/6262e0b8c6)] - **stream**: create write request objects lazily (Matteo Collina) [#&#8203;64455](https://redirect.github.com/nodejs/node/pull/64455)
- \[[`0f0566de15`](https://redirect.github.com/nodejs/node/commit/0f0566de15)] - **stream**: allocate stream read buffers from a slab (Matteo Collina) [#&#8203;64455](https://redirect.github.com/nodejs/node/pull/64455)
- \[[`02c776a7c6`](https://redirect.github.com/nodejs/node/commit/02c776a7c6)] - **stream**: ensure that stateful transforms preserve this (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`4b29051971`](https://redirect.github.com/nodejs/node/commit/4b29051971)] - **stream**: fix nested async flushing with infinite sources (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`2e54186d97`](https://redirect.github.com/nodejs/node/commit/2e54186d97)] - **stream**: ensure from() observes returned rejecting promise correctly (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`fd68d5ca6a`](https://redirect.github.com/nodejs/node/commit/fd68d5ca6a)] - **stream**: apply source normalization once at call time (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`49ee85b462`](https://redirect.github.com/nodejs/node/commit/49ee85b462)] - **stream**: make pipeTo source normalization independent of Writer (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`d7d0440f08`](https://redirect.github.com/nodejs/node/commit/d7d0440f08)] - **stream**: pre-aborted pipeTo now applies dest failure handling (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`6d8e643ef3`](https://redirect.github.com/nodejs/node/commit/6d8e643ef3)] - **stream**: ensure async dispoal after endSync awaits for drain (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`a082916c00`](https://redirect.github.com/nodejs/node/commit/a082916c00)] - **stream**: ensure factory signals remain active through closing (James M Snell) [#&#8203;65658](https://redirect.github.com/nodejs/node/pull/65658)
- \[[`38829295a7`](https://redirect.github.com/nodejs/node/commit/38829295a7)] - **stream**: skip unobserved 'readable' emission at EOF (Matteo Collina) [#&#8203;65749](https://redirect.github.com/nodejs/node/pull/65749)
- \[[`d535859c22`](https://redirect.github.com/nodejs/node/commit/d535859c22)] - **stream**: avoid per-chunk promises in webstream adapters (Matteo Collina) [#&#8203;65548](https://redirect.github.com/nodejs/node/pull/65548)
- \[[`80568f6818`](https://redirect.github.com/nodejs/node/commit/80568f6818)] - **stream**: address stream/iter review feedback (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`6952928f68`](https://redirect.github.com/nodejs/node/commit/6952928f68)] - **stream**: replace object sentinel with symbol (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`9c22c4124c`](https://redirect.github.com/nodejs/node/commit/9c22c4124c)] - **stream**: cancel active stream/iter pulls (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`24d87990cf`](https://redirect.github.com/nodejs/node/commit/24d87990cf)] - **stream**: fix merge settlement tagging and falsy error tracking (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`1e215c4b51`](https://redirect.github.com/nodejs/node/commit/1e215c4b51)] - **stream**: ensure full-close semantics when closed (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`f499d6fadf`](https://redirect.github.com/nodejs/node/commit/f499d6fadf)] - **stream**: fixup writer to terminate on consumer return/throw (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`2130738033`](https://redirect.github.com/nodejs/node/commit/2130738033)] - **stream**: ensure iterator cleanup on done, reject, etc (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`748adc6275`](https://redirect.github.com/nodejs/node/commit/748adc6275)] - **stream**: fixup cancelation handling in pull() (James M Snell) [#&#8203;65652](https://redirect.github.com/nodejs/node/pull/65652)
- \[[`47b3f6a1fa`](https://redirect.github.com/nodejs/node/commit/47b3f6a1fa)] - **stream**: fix early drain after Utf8Stream reopen (Matteo Collina) [#&#8203;65633](https://redirect.github.com/nodejs/node/pull/65633)
- \[[`6dab5412cf`](https://redirect.github.com/nodejs/node/commit/6dab5412cf)] - **test**: skip RSA-PSS keygen deprecation tests with BoringSSL (Shelley Vohr) [#&#8203;65808](https://redirect.github.com/nodejs/node/pull/65808)
- \[[`95d9a25b61`](https://redirect.github.com/nodejs/node/commit/95d9a25b61)] - **test**: consolidate crypto provider cache coverage (Filip Skokan) [#&#8203;66108](https://redirect.github.com/nodejs/node/pull/66108)
- \[[`612db6d5b2`](https://redirect.github.com/nodejs/node/commit/612db6d5b2)] - **test**: deflake user timing WPT assertions (Filip Skokan) [#&#8203;66036](https://redirect.github.com/nodejs/node/pull/66036)
- \[[`61a73d31eb`](https://redirect.github.com/nodejs/node/commit/61a73d31eb)] - **test**: fix RSA/DSA wrong-passphrase flake (Filip Skokan) [#&#8203;65983](https://redirect.github.com/nodejs/node/pull/65983)
- \[[`d9f4a3ee3e`](https://redirect.github.com/nodejs/node/commit/d9f4a3ee3e)] - **test**: reuse fixed primes in DH tests (Filip Skokan) [#&#8203;65980](https://redirect.github.com/nodejs/node/pull/65980)
- \[[`a0fd0a8bd6`](https://redirect.github.com/nodejs/node/commit/a0fd0a8bd6)] - **test**: use named parameters in DH stress test (Filip Skokan) [#&#8203;65980](https://redi

> [!IMPORTANT]
> ✂ PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-19 11:27:12 -07:00
renovate[bot] a98e5bad6c chore(deps): update lint (#725)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [oxfmt](https://oxc.rs/docs/guide/usage/formatter) ([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt)) | [`0.67.0` → `0.73.0`](https://renovatebot.com/diffs/npm/oxfmt/0.67.0/0.73.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/oxfmt/0.73.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/oxfmt/0.67.0/0.73.0?slim=true) |
| [oxlint](https://oxc.rs/docs/guide/usage/linter) ([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/npm/oxlint)) | [`1.82.0` → `1.88.0`](https://renovatebot.com/diffs/npm/oxlint/1.82.0/1.88.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/oxlint/1.88.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/oxlint/1.82.0/1.88.0?slim=true) |
| [prettier](https://prettier.io) ([source](https://redirect.github.com/prettier/prettier)) | [`3.9.6` → `3.9.10`](https://renovatebot.com/diffs/npm/prettier/3.9.6/3.9.10) | ![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.9.10?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.9.6/3.9.10?slim=true) |

---

### Release Notes

<details>
<summary>oxc-project/oxc (oxfmt)</summary>

### [`v0.73.0`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/npm/oxfmt/CHANGELOG.md#0730---2026-10-13)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.72.0...oxfmt_v0.73.0)

##### 🚀 Features

- [`a495e82`](https://redirect.github.com/oxc-project/oxc/commit/a495e82) oxfmt: Support `associations` config to specify language over filepath ([#&#8203;27437](https://redirect.github.com/oxc-project/oxc/issues/27437)) (leaysgur)
- [`5db28fa`](https://redirect.github.com/oxc-project/oxc/commit/5db28fa) oxfmt: Support Astro via `[email protected]` ([#&#8203;27386](https://redirect.github.com/oxc-project/oxc/issues/27386)) (leaysgur)

##### 📚 Documentation

- [`408d87f`](https://redirect.github.com/oxc-project/oxc/commit/408d87f) oxfmt: Simplify oxfmtrc docs ([#&#8203;27432](https://redirect.github.com/oxc-project/oxc/issues/27432)) (leaysgur)
- [`902e188`](https://redirect.github.com/oxc-project/oxc/commit/902e188) oxfmt: Update how `embeddedLanguageFormatting` option works ([#&#8203;27362](https://redirect.github.com/oxc-project/oxc/issues/27362)) (leaysgur)

### [`v0.72.0`](https://redirect.github.com/oxc-project/oxc/releases/tag/oxfmt_v0.72.0): oxfmt v0.72.0

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.71.0...oxfmt_v0.72.0)

##### 💥 BREAKING CHANGES

- [`e2c68b1`](https://redirect.github.com/oxc-project/oxc/commit/e2c68b1) oxfmt: \[**BREAKING**] Format `parser:markdown` files by `oxc_formatter_markdown` ([#&#8203;27256](https://redirect.github.com/oxc-project/oxc/issues/27256)) (leaysgur)

##### 🚀 Features

- [`b538e3c`](https://redirect.github.com/oxc-project/oxc/commit/b538e3c) formatter_css: Parse embedded CSS as a block's contents ([#&#8203;27284](https://redirect.github.com/oxc-project/oxc/issues/27284)) (leaysgur)

##### 🐛 Bug Fixes

- [`71e400b`](https://redirect.github.com/oxc-project/oxc/commit/71e400b) formatter_markdown: Fixed remaining issues found by fuzz ([#&#8203;27334](https://redirect.github.com/oxc-project/oxc/issues/27334)) (leaysgur)
- [`7d0e54d`](https://redirect.github.com/oxc-project/oxc/commit/7d0e54d) formatter_markdown: Preserve line breaks around Chinese/Japanese characters in all `proseWrap` ([#&#8203;27331](https://redirect.github.com/oxc-project/oxc/issues/27331)) (leaysgur)
- [`e9ae2d8`](https://redirect.github.com/oxc-project/oxc/commit/e9ae2d8) formatter_css: Fix layouts found in mdn-content repo (css-in-md) ([#&#8203;27326](https://redirect.github.com/oxc-project/oxc/issues/27326)) (leaysgur)
- [`df85b4c`](https://redirect.github.com/oxc-project/oxc/commit/df85b4c) oxfmt: Keep blank lines after a line break in Prettier Doc to IR ([#&#8203;27325](https://redirect.github.com/oxc-project/oxc/issues/27325)) (leaysgur)
- [`7f65b75`](https://redirect.github.com/oxc-project/oxc/commit/7f65b75) formatter: Format assignment target property as assignment-like ([#&#8203;27289](https://redirect.github.com/oxc-project/oxc/issues/27289)) (leaysgur)
- [`6c08f2a`](https://redirect.github.com/oxc-project/oxc/commit/6c08f2a) formatter_css: Apply the `url()` import exception to a lone comma group ([#&#8203;27288](https://redirect.github.com/oxc-project/oxc/issues/27288)) (leaysgur)
- [`1967302`](https://redirect.github.com/oxc-project/oxc/commit/1967302) formatter_css: Hug a spaced `ident (` only at the at-rule prelude head ([#&#8203;27283](https://redirect.github.com/oxc-project/oxc/issues/27283)) (leaysgur)
- [`2445064`](https://redirect.github.com/oxc-project/oxc/commit/2445064) formatter_markdown: Keep a preserved line break before a delimiter row that opens no table ([#&#8203;27278](https://redirect.github.com/oxc-project/oxc/issues/27278)) (leaysgur)
- [`dd72fbf`](https://redirect.github.com/oxc-project/oxc/commit/dd72fbf) formatter_markdown: Keep container columns as spaces under `useTabs` ([#&#8203;27277](https://redirect.github.com/oxc-project/oxc/issues/27277)) (leaysgur)
- [`1686018`](https://redirect.github.com/oxc-project/oxc/commit/1686018) oxfmt: Make one state `conditionalGroup` fit up to first `hardline` ([#&#8203;27275](https://redirect.github.com/oxc-project/oxc/issues/27275)) (leaysgur)
- [`fd4ddce`](https://redirect.github.com/oxc-project/oxc/commit/fd4ddce) formatter_json: Flatten block comment only array|object ([#&#8203;27274](https://redirect.github.com/oxc-project/oxc/issues/27274)) (leaysgur)
- [`267557c`](https://redirect.github.com/oxc-project/oxc/commit/267557c) formatter,oxfmt: Embed only original JSDoc plugin supported languages ([#&#8203;27241](https://redirect.github.com/oxc-project/oxc/issues/27241)) (leaysgur)
- [`2606c60`](https://redirect.github.com/oxc-project/oxc/commit/2606c60) oxfmt: Do not re-include a file below an excluded directory with a negated pattern ([#&#8203;27237](https://redirect.github.com/oxc-project/oxc/issues/27237)) (Nicolas Le Cam)
- [`c2de02b`](https://redirect.github.com/oxc-project/oxc/commit/c2de02b) formatter: Decide embedded template layout from AST, not source shape ([#&#8203;27218](https://redirect.github.com/oxc-project/oxc/issues/27218)) (leaysgur)
- [`c9e1224`](https://redirect.github.com/oxc-project/oxc/commit/c9e1224) formatter: Handle `quoteProps: consistent` for patterns and computed keys ([#&#8203;27216](https://redirect.github.com/oxc-project/oxc/issues/27216)) (leaysgur)
- [`36e14df`](https://redirect.github.com/oxc-project/oxc/commit/36e14df) formatter: Keep comments between callee and its opener on the callee side ([#&#8203;27172](https://redirect.github.com/oxc-project/oxc/issues/27172)) (leaysgur)
- [`6da7657`](https://redirect.github.com/oxc-project/oxc/commit/6da7657) oxfmt: Render diagnostics with source in Stdin mode ([#&#8203;27130](https://redirect.github.com/oxc-project/oxc/issues/27130)) (leaysgur)
- [`e9b2ec5`](https://redirect.github.com/oxc-project/oxc/commit/e9b2ec5) oxfmt/lsp: Reload `.prettierignore` on watched file change ([#&#8203;27129](https://redirect.github.com/oxc-project/oxc/issues/27129)) (leaysgur)
- [`30eb463`](https://redirect.github.com/oxc-project/oxc/commit/30eb463) oxfmt: Check global ignores before resolving nested config in Stdin mode ([#&#8203;27128](https://redirect.github.com/oxc-project/oxc/issues/27128)) (leaysgur)

##### ⚡ Performance

- [`72f42a3`](https://redirect.github.com/oxc-project/oxc/commit/72f42a3) formatter_markdown: Pre-allocate the IR buffer ([#&#8203;27333](https://redirect.github.com/oxc-project/oxc/issues/27333)) (leaysgur)
- [`cea47e3`](https://redirect.github.com/oxc-project/oxc/commit/cea47e3) formatter_core: Avoid exponential `will_break` check on nested interned ([#&#8203;27211](https://redirect.github.com/oxc-project/oxc/issues/27211)) (leaysgur)
- [`0aba566`](https://redirect.github.com/oxc-project/oxc/commit/0aba566) oxfmt: Do not resolve root js config from nested context ([#&#8203;27147](https://redirect.github.com/oxc-project/oxc/issues/27147)) (leaysgur)

##### 📚 Documentation

- [`51506c6`](https://redirect.github.com/oxc-project/oxc/commit/51506c6) formatter_css: Record divergences found in mdn-content (css-in-md) ([#&#8203;27327](https://redirect.github.com/oxc-project/oxc/issues/27327)) (leaysgur)
- [`656b81c`](https://redirect.github.com/oxc-project/oxc/commit/656b81c) formatter_markdown: Record unclosed fences closing at a directive's closer ([#&#8203;27279](https://redirect.github.com/oxc-project/oxc/issues/27279)) (leaysgur)
- [`66545bf`](https://redirect.github.com/oxc-project/oxc/commit/66545bf) formatter_markdown: Record setext heading wrap divergence ([#&#8203;27221](https://redirect.github.com/oxc-project/oxc/issues/27221)) (leaysgur)
- [`af4b269`](https://redirect.github.com/oxc-project/oxc/commit/af4b269) oxfmt: Document why `format()` API does not take cwd ([#&#8203;27131](https://redirect.github.com/oxc-project/oxc/issues/27131)) (leaysgur)

### [`v0.71.0`](https://redirect.github.com/oxc-project/oxc/releases/tag/oxfmt_v0.71.0): oxfmt v0.71.0

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.70.0...oxfmt_v0.71.0)

##### 🚀 Features

- [`e0b1f9f`](https://redirect.github.com/oxc-project/oxc/commit/e0b1f9f) oxfmt: Bump bundled Prettier version to 3.9.9 ([#&#8203;27002](https://redirect.github.com/oxc-project/oxc/issues/27002)) (leaysgur)
- [`342527d`](https://redirect.github.com/oxc-project/oxc/commit/342527d) oxfmt: Bump bundled Prettier version to 3.9.8 ([#&#8203;26999](https://redirect.github.com/oxc-project/oxc/issues/26999)) (leaysgur)

##### 🐛 Bug Fixes

- [`eeba1db`](https://redirect.github.com/oxc-project/oxc/commit/eeba1db) formatter: Skip test-call layout when arguments have comments ([#&#8203;27119](https://redirect.github.com/oxc-project/oxc/issues/27119)) (leaysgur)
- [`1f7b8ad`](https://redirect.github.com/oxc-project/oxc/commit/1f7b8ad) oxfmt: Allow repeated CLI calls in the same process ([#&#8203;27051](https://redirect.github.com/oxc-project/oxc/issues/27051)) (Liang)
- [`7bcb807`](https://redirect.github.com/oxc-project/oxc/commit/7bcb807) formatter_markdown: Keep blank line between HTML and nested list ([#&#8203;27112](https://redirect.github.com/oxc-project/oxc/issues/27112)) (leaysgur)
- [`10b10c5`](https://redirect.github.com/oxc-project/oxc/commit/10b10c5) formatter: Keep comments around `=` on their side and line ([#&#8203;27041](https://redirect.github.com/oxc-project/oxc/issues/27041)) (leaysgur)
- [`9aad365`](https://redirect.github.com/oxc-project/oxc/commit/9aad365) formatter: Keep comments deferred before an assignment operator ([#&#8203;26997](https://redirect.github.com/oxc-project/oxc/issues/26997)) (waltu)
- [`8fbddb1`](https://redirect.github.com/oxc-project/oxc/commit/8fbddb1) formatter/jsdoc: More alignment with original plugin ([#&#8203;27039](https://redirect.github.com/oxc-project/oxc/issues/27039)) (leaysgur)
- [`50be18e`](https://redirect.github.com/oxc-project/oxc/commit/50be18e) formatter: Keep trailing spaces on normal block comments ([#&#8203;27037](https://redirect.github.com/oxc-project/oxc/issues/27037)) (leaysgur)
- [`56d1880`](https://redirect.github.com/oxc-project/oxc/commit/56d1880) formatter: Nestle adjacent block comments ([#&#8203;27036](https://redirect.github.com/oxc-project/oxc/issues/27036)) (leaysgur)
- [`3be5d94`](https://redirect.github.com/oxc-project/oxc/commit/3be5d94) formatter: Treat `/***` comments as JSDoc ([#&#8203;27035](https://redirect.github.com/oxc-project/oxc/issues/27035)) (leaysgur)
- [`cd45f71`](https://redirect.github.com/oxc-project/oxc/commit/cd45f71) formatter: Keep trailing double spaces on JSDoc lines ([#&#8203;26861](https://redirect.github.com/oxc-project/oxc/issues/26861)) (John Costa)
- [`fd695f4`](https://redirect.github.com/oxc-project/oxc/commit/fd695f4) formatter_markdown: Fix more mismatches found in ecosystem-ci repos ([#&#8203;27003](https://redirect.github.com/oxc-project/oxc/issues/27003)) (leaysgur)
- [`4e77d59`](https://redirect.github.com/oxc-project/oxc/commit/4e77d59) formatter_markdown: Keep a math span after a kept line break from opening a block ([#&#8203;27001](https://redirect.github.com/oxc-project/oxc/issues/27001)) (leaysgur)
- [`584b8b0`](https://redirect.github.com/oxc-project/oxc/commit/584b8b0) formatter_markdown: Keep a shape line after a multi-line inline node or link title ([#&#8203;27000](https://redirect.github.com/oxc-project/oxc/issues/27000)) (leaysgur)
- [`b939645`](https://redirect.github.com/oxc-project/oxc/commit/b939645) formatter_markdown: Keep a line break before an inline liquid tag under preserve ([#&#8203;26998](https://redirect.github.com/oxc-project/oxc/issues/26998)) (leaysgur)

### [`v0.70.0`](https://redirect.github.com/oxc-project/oxc/releases/tag/oxfmt_v0.70.0): oxfmt v0.70.0

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.69.0...oxfmt_v0.70.0)

##### 🚀 Features

- [`415b742`](https://redirect.github.com/oxc-project/oxc/commit/415b742) oxlint,oxfmt: Do not discover nested config in Vite+ mode ([#&#8203;26763](https://redirect.github.com/oxc-project/oxc/issues/26763)) (leaysgur)

### [`v0.69.0`](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.68.0...oxfmt_v0.69.0)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.68.0...oxfmt_v0.69.0)

### [`v0.68.0`](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.67.0...oxfmt_v0.68.0)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.67.0...oxfmt_v0.68.0)

</details>

<details>
<summary>oxc-project/oxc (oxlint)</summary>

### [`v1.88.0`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/npm/oxlint/CHANGELOG.md#1880---2026-10-13)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.87.0...oxlint_v1.88.0)

##### 🚀 Features

- [`3c361a7`](https://redirect.github.com/oxc-project/oxc/commit/3c361a7) linter/unicorn/prefer-query-selector: Add `allowWithVariables` option ([#&#8203;27346](https://redirect.github.com/oxc-project/oxc/issues/27346)) (Mikhail Baev)

### [`v1.87.0`](https://redirect.github.com/oxc-project/oxc/releases/tag/oxlint_v1.87.0): oxlint v1.87.0

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.86.0...oxlint_v1.87.0)

##### 🚀 Features

- [`42dcfd2`](https://redirect.github.com/oxc-project/oxc/commit/42dcfd2) linter/react/no-unescaped-entities: Implement suggestion ([#&#8203;27292](https://redirect.github.com/oxc-project/oxc/issues/27292)) (Mikhail Baev)
- [`cd4510d`](https://redirect.github.com/oxc-project/oxc/commit/cd4510d) linter/unicorn/no-useless-switch-case: Implement suggestion ([#&#8203;27245](https://redirect.github.com/oxc-project/oxc/issues/27245)) (Mikhail Baev)
- [`1a7c902`](https://redirect.github.com/oxc-project/oxc/commit/1a7c902) linter/react/jsx-no-target-blank: Implement suggestion ([#&#8203;27181](https://redirect.github.com/oxc-project/oxc/issues/27181)) (Mikhail Baev)

##### 🐛 Bug Fixes

- [`176b4b9`](https://redirect.github.com/oxc-project/oxc/commit/176b4b9) linter/jsx-a11y/label-has-associated-control: Validate label attribute values ([#&#8203;27302](https://redirect.github.com/oxc-project/oxc/issues/27302)) (sama Pyb)
- [`7d381c3`](https://redirect.github.com/oxc-project/oxc/commit/7d381c3) linter/jsx-a11y/mouse-events-have-key-events: Handle nullish event handlers ([#&#8203;27306](https://redirect.github.com/oxc-project/oxc/issues/27306)) (sama Pyb)
- [`4e09837`](https://redirect.github.com/oxc-project/oxc/commit/4e09837) linter/jsx-a11y/lang: Validate lang expression strings ([#&#8203;27304](https://redirect.github.com/oxc-project/oxc/issues/27304)) (sama Pyb)
- [`7d28a66`](https://redirect.github.com/oxc-project/oxc/commit/7d28a66) linter/unicorn/numeric-separators-style: Report misgrouped BigInt literals ([#&#8203;27207](https://redirect.github.com/oxc-project/oxc/issues/27207)) (breken)
- [`e928322`](https://redirect.github.com/oxc-project/oxc/commit/e928322) linter/unicorn/no-zero-fractions: Parenthesize separator and large integers in fixer ([#&#8203;27206](https://redirect.github.com/oxc-project/oxc/issues/27206)) (breken)
- [`3d61a59`](https://redirect.github.com/oxc-project/oxc/commit/3d61a59) parser: Validate TypeScript type member separators ([#&#8203;27222](https://redirect.github.com/oxc-project/oxc/issues/27222)) (camc314)
- [`f08236b`](https://redirect.github.com/oxc-project/oxc/commit/f08236b) linter/eslint/prefer-exponentiation-operator: Preserve autofix precedence ([#&#8203;27150](https://redirect.github.com/oxc-project/oxc/issues/27150)) (camc314)
- [`7d60ae3`](https://redirect.github.com/oxc-project/oxc/commit/7d60ae3) linter/valid-title: Continue checks after allowed words ([#&#8203;27146](https://redirect.github.com/oxc-project/oxc/issues/27146)) (Cameron)
- [`ad5dd5d`](https://redirect.github.com/oxc-project/oxc/commit/ad5dd5d) linter/eslint/no-unused-vars: Respect disabled argument checks for used ignore patterns ([#&#8203;26925](https://redirect.github.com/oxc-project/oxc/issues/26925)) (camc314)

### [`v1.86.0`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/npm/oxlint/CHANGELOG.md#1860---2026-09-28)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.85.0...oxlint_v1.86.0)

##### 🚀 Features

- [`9d80eed`](https://redirect.github.com/oxc-project/oxc/commit/9d80eed) linter/react/only-export-components: Support `allowCompoundComponents` ([#&#8203;27117](https://redirect.github.com/oxc-project/oxc/issues/27117)) (Kuroda Kayn)
- [`e05b155`](https://redirect.github.com/oxc-project/oxc/commit/e05b155) linter: Add typescript/no-generated-empty-object-type ([#&#8203;26958](https://redirect.github.com/oxc-project/oxc/issues/26958)) (camc314)

### [`v1.85.0`](https://redirect.github.com/oxc-project/oxc/releases/tag/oxlint_v1.85.0): oxlint v1.85.0

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.84.0...oxlint_v1.85.0)

##### 🚀 Features

- [`415b742`](https://redirect.github.com/oxc-project/oxc/commit/415b742) oxlint,oxfmt: Do not discover nested config in Vite+ mode ([#&#8203;26763](https://redirect.github.com/oxc-project/oxc/issues/26763)) (leaysgur)

### [`v1.84.0`](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.83.0...oxlint_v1.84.0)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.83.0...oxlint_v1.84.0)

### [`v1.83.0`](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.82.0...oxlint_v1.83.0)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v1.82.0...oxlint_v1.83.0)

</details>

<details>
<summary>prettier/prettier (prettier)</summary>

### [`v3.9.10`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#3910)

[Compare Source](https://redirect.github.com/prettier/prettier/compare/3.9.9...3.9.10)

[diff](https://redirect.github.com/prettier/prettier/compare/3.9.9...3.9.10)

##### Markdown: Update `micromark-extension-gfm-table` to fix the table parse issue on performance ([#&#8203;20266](https://redirect.github.com/prettier/prettier/pull/20266) by [@&#8203;fisker](https://redirect.github.com/fisker))

See [micromark/micromark-extension-gfm-table@`4f43ead`](https://redirect.github.com/micromark/micromark-extension-gfm-table/commit/4f43ead37b786bc531d924530d4ab4c714886267) for details.

### [`v3.9.9`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#399)

[Compare Source](https://redirect.github.com/prettier/prettier/compare/3.9.8...3.9.9)

[diff](https://redirect.github.com/prettier/prettier/compare/3.9.8...3.9.9)

##### Markdown: Fix text with `$` been incorrectly parsed as math syntax ([#&#8203;20140](https://redirect.github.com/prettier/prettier/pull/20140) by [@&#8203;fisker](https://redirect.github.com/fisker))

<!-- prettier-ignore -->

```md
<!-- Input -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here.

<!-- Prettier 3.9.8 -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR`from`c.sh`, before anything else runs here.

<!-- Prettier 3.9.9 -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here.
```

### [`v3.9.8`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#398)

[Compare Source](https://redirect.github.com/prettier/prettier/compare/3.9.7...3.9.8)

[diff](https://redirect.github.com/prettier/prettier/compare/3.9.7...3.9.8)

##### Markdown: Don't let Liquid objects interrupt paragraphs ([#&#8203;20087](https://redirect.github.com/prettier/prettier/pull/20087) by [@&#8203;seiyab](https://redirect.github.com/seiyab))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a
{{jsxref("TypeError")}} is thrown.

<!-- Prettier 3.9.7 -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a

{{jsxref("TypeError")}} is thrown.

<!-- Prettier 3.9.8 -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a
{{jsxref("TypeError")}} is thrown.
```

### [`v3.9.7`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#397)

[Compare Source](https://redirect.github.com/prettier/prettier/compare/3.9.6...3.9.7)

[diff](https://redirect.github.com/prettier/prettier/compare/3.9.6...3.9.7)

##### Markdown: Prevent indentation drift in list-item code blocks ([#&#8203;19647](https://redirect.github.com/prettier/prettier/pull/19647), [#&#8203;19990](https://redirect.github.com/prettier/prettier/pull/19990) by [@&#8203;Austin1serb](https://redirect.github.com/Austin1serb), [@&#8203;giaBaoJS](https://redirect.github.com/giaBaoJS))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
- [x] short first line.

      second paragraph at six spaces that wraps
      onto another line here.

<!-- Prettier 3.9.6 -->
- [x] short first line.

      second paragraph at six spaces that wraps
          onto another line here.

<!-- Prettier 3.9.7 -->
- [x] short first line.

      second paragraph at six spaces that wraps
      onto another line here.
```

##### JavaScript: Fix embedded template literal idempotency ([#&#8203;19725](https://redirect.github.com/prettier/prettier/pull/19725) by [@&#8203;fisker](https://redirect.github.com/fisker))

<!-- prettier-ignore -->

```jsx
// Input
const foo = html`
            <div>${getText({
            value,
            })}</div>
`;

// Prettier 3.9.6 (first format)
const foo = html`
  <div>
    ${getText({
              value,
            })}
  </div>
`;

// Prettier 3.9.6 (second format)
const foo = html`
  <div>
    ${getText({
      value,
    })}
  </div>
`;

// Prettier 3.9.7
const foo = html`
  <div>
    ${getText({
      value,
    })}
  </div>
`;
```

##### Markdown: Preserve Liquid blocks after Markdown tables ([#&#8203;19730](https://redirect.github.com/prettier/prettier/pull/19730) by [@&#8203;wanxiankai](https://redirect.github.com/wanxiankai), [@&#8203;seiyab](https://redirect.github.com/seiyab))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
| Argument | Type |
| -------- | ---- |
{% set default_params = {
    "model": ["str"],
} %}

<!-- Prettier 3.9.6 -->
| Argument                  | Type |
| ------------------------- | ---- |
| {% set default_params = { |

    "model": ["str"],

} %}

<!-- Prettier 3.9.7 -->
| Argument | Type |
| -------- | ---- |
{% set default_params = {
    "model": ["str"],
} %}
```

##### Markdown: Preserve single tildes in Markdown ([#&#8203;19739](https://redirect.github.com/prettier/prettier/pull/19739) by [@&#8203;lazerg](https://redirect.github.com/lazerg))

Since 3.9.0, single-tilde spans like `H~2~O` were rewritten to double tildes, turning subscript syntax into strike-through. Only double tildes are treated that way now, matching GitHub.

<!-- prettier-ignore -->

```markdown
<!-- Input -->
H~2~O

<!-- Prettier 3.9.6 -->
H~~2~~O

<!-- Prettier 3.9.7 -->
H~2~O
```

##### Markdown: Fix Markdown blockquote containing `>` characters ([#&#8203;19802](https://redirect.github.com/prettier/prettier/pull/19802) by [@&#8203;seiyab](https://redirect.github.com/seiyab))

<!-- prettier-ignore -->

```md
<!-- Input -->
> **test**\>

<!-- Prettier 3.9.6 -->
> **test**>\>

<!-- Prettier 3.9.7 -->
> **test**\>
```

##### Markdown: Strip blockquote markers from a setext heading's continuation lines ([#&#8203;19878](https://redirect.github.com/prettier/prettier/pull/19878) by [@&#8203;Kjubikstronk](https://redirect.github.com/Kjubikstronk))

A setext heading spanning multiple lines inside a blockquote kept the `>` marker of its continuation lines as literal text.

<!-- prettier-ignore -->

```md
<!-- Input -->
> Multi
> Line
> ===

<!-- Prettier 3.9.6 -->
> Multi > Line
> ===

<!-- Prettier 3.9.7 -->
> Multi
> Line
> ===
```

##### Markdown: Fix HTML block indentation drift in markdown list items ([#&#8203;19987](https://redirect.github.com/prettier/prettier/pull/19987) by [@&#8203;lazerg](https://redirect.github.com/lazerg))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
1. Enable images:

    <p align="center">
      <img alt="example">
    </p>

<!-- Prettier 3.9.6 (--tab-width=4) -->
1. Enable images:

     <p align="center">
       <img alt="example">
     </p>

<!-- Prettier 3.9.7 (--tab-width=4) -->
1. Enable images:

    <p align="center">
      <img alt="example">
    </p>
```

##### Angular: Support `@boundary` error boundaries ([#&#8203;20014](https://redirect.github.com/prettier/prettier/pull/20014) by [@&#8203;Yahiro025](https://redirect.github.com/Yahiro025))

<!-- prettier-ignore -->

```html
<!-- Input -->
@boundary {
<complex-chart [data]="data"/>
}
@error (let err) {
<p>{{err.message}}</p>
}

<!-- Prettier 3.9.6 -->
SyntaxError: Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (6:1)

<!-- Prettier 3.9.7 -->
@boundary {
  <complex-chart [data]="data" />
} @error (let err) {
  <p>{{ err.message }}</p>
}
```

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-19 11:26:37 -07:00
renovate[bot] 0285cc8607 chore(deps): update dependency uuid to v14.0.3 (#724)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [uuid](https://redirect.github.com/uuidjs/uuid) | [`14.0.2` → `14.0.3`](https://renovatebot.com/diffs/npm/uuid/14.0.2/14.0.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/uuid/14.0.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/uuid/14.0.2/14.0.3?slim=true) |

---

### Release Notes

<details>
<summary>uuidjs/uuid (uuid)</summary>

### [`v14.0.3`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1403-2026-10-09)

[Compare Source](https://redirect.github.com/uuidjs/uuid/compare/v14.0.2...v14.0.3)

##### Bug Fixes

- fix CITGM [#&#8203;1154](https://redirect.github.com/uuidjs/uuid/issues/1154) ([#&#8203;981](https://redirect.github.com/uuidjs/uuid/issues/981)) ([b44f159](https://redirect.github.com/uuidjs/uuid/commit/b44f159d5a4af4eb7a144ab35dcabcfd58ef0aac))

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-19 11:26:24 -07:00
renovate[bot] e5bd655b6b chore(deps): update dependency @types/node to v24.19.2 (#722)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`24.19.1` → `24.19.2`](https://renovatebot.com/diffs/npm/@types%2fnode/24.19.1/24.19.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/24.19.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/24.19.1/24.19.2?slim=true) |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-19 11:25:25 -07:00
renovate[bot] ab24672e58 chore(deps): update dependency jdx/mise to v2026.10.8 (#720)
> [!NOTE]
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [jdx/mise](https://redirect.github.com/jdx/mise) | minor | `v2026.9.7` → `v2026.10.8` |

---

### Release Notes

<details>
<summary>jdx/mise</summary>

### [`v2026.10.8`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.8): : Stable `global` install link for IDEs

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.7...vfox-v2026.10.8)

Each tool's install directory now has a `global` link that follows your global config, which gives IDEs a path that doesn't change when you switch versions. This release also retries downloads whose response body drops partway through, fixes lockfile checks for release tags that contain `@`, and stops dotfiles history from rewriting files that haven't changed.

##### Added

- **`global` runtime symlink.** Each tool's install directory now has a `global` link to the version your global and system config select. Programs that can't run mise, such as IDEs, can point at this path and follow `mise use -g` changes. [#&#8203;14271](https://redirect.github.com/jdx/mise/pull/14271)

  ```text
  ~/.local/share/mise/installs/maven/
  ├── 3.9.13/
  ├── 3.9.16/
  └── global -> ./3.9.16
  ```

  The link is updated along with the other runtime symlinks (`latest`, `3`, ...), for example after `mise use -g`, `mise install` and `mise upgrade`. Project config and `MISE_*_VERSION` don't change it. If no global config selects the tool, mise removes the link. A real directory named `global` is left alone. The link is always on, and no setting turns it off.

##### Fixed

- HTTP requests now retry, up to `http_retries`, when the response body drops partway through. Before, only the request and headers were retried, so a version list or release page cut off mid-transfer failed with `error decoding response body`. This applies to text, JSON and byte requests, and to version lists read with `version_regex`. [#&#8203;14253](https://redirect.github.com/jdx/mise/pull/14253) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- `mise install` no longer rejects lockfile entries whose release tag contains `@`, such as `[email protected].0`. `mise lock` writes these tags percent-encoded (`cli%400.46.0`), and the locked-URL check read that as version `400.46.0`. Re-running `mise lock` couldn't fix it. [#&#8203;14252](https://redirect.github.com/jdx/mise/pull/14252)
- Dotfiles history index rebuilds now skip checkpoint metadata files whose contents haven't changed. On large histories, rebuilds used to rewrite every file, which caused minutes of disk writes and made `mise dot save` fail with `another history operation is running`. [#&#8203;14249](https://redirect.github.com/jdx/mise/pull/14249)
- The JSON schema now accepts `outputs = { auto = false }` on tasks, so editors and linters such as tombi and Taplo no longer flag it. mise's behavior is unchanged: `auto = false` means the same as leaving `outputs` unset. [#&#8203;14265](https://redirect.github.com/jdx/mise/pull/14265) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))

##### Documentation

- The dotfiles docs now open with a recommended setup, and the modes-and-keys reference table has been reorganized into three readable columns. [#&#8203;14267](https://redirect.github.com/jdx/mise/pull/14267)

##### Registry

- New aqua packages: [`runxhq/runx`](https://redirect.github.com/runxhq/runx) and [`takumin/passt-bin`](https://redirect.github.com/takumin/passt-bin).

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.7...v2026.10.8>

##### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.7`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.7): : Background tool updates at the shell prompt, a verified download cache, and `mise upgrade --global`

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.6...vfox-v2026.10.7)

Tools with `auto_update` now update in the background from an activated shell, and a new `tool_update.global_auto` setting turns this on for every global tool. mise also keeps finished downloads in a content-addressed cache and checks them again before reusing them. This release also fixes `.env` parsing regressions from 2026.10.3 and a crash in `mise run`.

##### Added

- **Automatic updates at the shell prompt.** Before, `auto_update` only ran when a shim or `mise exec` launched a tool. With `mise activate`, tools run straight from `PATH`, so they were never updated. Now, when a check is due, `mise hook-env` starts the update in a detached background process. The prompt doesn't wait and nothing is printed. The next command after the update finishes uses the new version. The existing rules still apply: only global config counts, exact versions don't move, nothing updates offline, in CI or with `locked`, and `minimum_release_age` is honored. While the `tool-update` service is running, prompts leave updates to it. Failed background updates show up in `mise doctor`. [#&#8203;14239](https://redirect.github.com/jdx/mise/pull/14239)

- **`tool_update.global_auto`** turns on automatic updates for every tool in global config at once. It takes the same values as `auto_update`: `true` checks every `tool_update.check_duration` (24h by default), and a duration sets the interval. A tool's own `auto_update` takes precedence, so `auto_update = false` opts a tool out. Projects can't enable this setting. You can also set it with `MISE_TOOL_UPDATE_GLOBAL_AUTO`. `self_update.auto` now accepts an interval too, for example `self_update.auto = "1d"`. [#&#8203;14237](https://redirect.github.com/jdx/mise/pull/14237)

  ```toml
  # ~/.config/mise/config.toml
  [settings]
  tool_update.global_auto = "12h"

  [tools]
  claude = "latest"                                   # checked every 12h
  node = { version = "24", auto_update = "6h" }       # its own interval wins
  python = { version = "3.13", auto_update = false }  # opted out
  ```

- **`mise upgrade --global` and `mise outdated --global`** act only on the tool requests in global and system config, even inside a project that pins its own version or when `MISE_<TOOL>_VERSION` is set. The project's `mise.toml`, lockfile and `[env]` are not read or changed. `--bump` writes to the global config. `--global` can't be combined with `--local` or `--inactive`. A new "Self-updating tools" docs page explains how tools that update themselves, such as coding agents, can detect a mise install and update through mise instead of overwriting their own install. [#&#8203;14243](https://redirect.github.com/jdx/mise/pull/14243)

  ```sh
  mise outdated --global claude --json
  mise upgrade --global claude
  ```

- **Verified download cache.** Finished downloads are stored once in `$MISE_CACHE_DIR/downloads-cas` and hashed again before every reuse. A cached file that no longer matches is dropped and downloaded again. [#&#8203;14222](https://redirect.github.com/jdx/mise/pull/14222), [#&#8203;14242](https://redirect.github.com/jdx/mise/pull/14242)
  - When the server sent an `ETag` or `Last-Modified` header, the next request for the same URL is conditional. On `304 Not Modified`, mise reuses the cached file without downloading it again. This applies to every download through mise's HTTP client.
  - For tools with a pinned checksum (from tool options, `mise.lock` or a packslip digest), `http`, `github`, `aqua`, `packslip` and the precompiled core tools (Node, Go, Bun, Deno, Zig, Java, Python, Ruby, Erlang, Elixir, Swift) reuse the cached file without any network request. The file is hard-linked into place, so it doesn't use extra disk space.
  - With `--locked` or `paranoid`, mise only uses the cache for downloads with a pinned checksum. This means a CI cache you restore can save downloads but can't change what gets installed. The CI guide now shows how to cache `~/.cache/mise/downloads-cas` instead of installed tools.
  - `download_cache_max_size` sets the size limit (default `2GiB`, `0` for no limit). When the cache is full, the least recently used files are removed. `download_cache = false` (`MISE_DOWNLOAD_CACHE=0`) turns the cache off.

- **`npm:` packages that install no executables now trigger a warning.** For example, `mise use npm:lodash` used to succeed silently even though it created no shims. The install still succeeds. [#&#8203;14246](https://redirect.github.com/jdx/mise/pull/14246)

##### Fixed

- **`.env` parsing regressions from 2026.10.3**, affecting `[env] _.file` and the `env_file` setting:
  - Backslashes in single-quoted values are literal again, so Windows paths like `'\\fileserver\share'` and `'C:\temp\'` load correctly. To embed a single quote, use double quotes. [#&#8203;14228](https://redirect.github.com/jdx/mise/pull/14228)
  - Quoted and unquoted parts placed next to each other are joined again, as in shell. For example, `A='it'\''s'` gives `it's` and `B=a'b c'd` gives `ab cd`. These lines used to cause syntax errors that dropped the rest of the file. Quotes inside an unquoted value are now removed, so JSON that needs to keep its quotes must be single-quoted (`CONFIG='{"debug": true}'`). A quote with no matching closing quote on the same line stays literal, so `NAME=O'Brien` reads as written. [#&#8203;14231](https://redirect.github.com/jdx/mise/pull/14231)
- `mise run` no longer crashes now and then with `called Option::unwrap() on a None value` when it reads the tool list while it's being reloaded after an install. [#&#8203;14240](https://redirect.github.com/jdx/mise/pull/14240)
- On Windows with `core.autocrlf=true`, `mise bootstrap repos status` no longer reports freshly cloned repos as dirty. [#&#8203;14225](https://redirect.github.com/jdx/mise/pull/14225)
- On Windows, `mise dot apply` can now repoint a `mode = "symlink"` dotfile whose target is a directory junction after its `source` changes. It used to fail with `os error 5`. [#&#8203;14226](https://redirect.github.com/jdx/mise/pull/14226)
- `history.describe_command` now works for files tracked through a variant (such as `home@work/...`), including files added or removed inside variant directories. Encrypted files are still left out of the diff. [#&#8203;14194](https://redirect.github.com/jdx/mise/pull/14194) ([@&#8203;oppegard](https://redirect.github.com/oppegard))
- `mise doctor` now shows the `dotfiles:` section, including the history `repo:` and `origin:`, when `history.enabled = false`. `mise doctor --json` adds `dotfiles.history_enabled` and `dotfiles.tracking_error`. [#&#8203;14244](https://redirect.github.com/jdx/mise/pull/14244)
- `mise lock` now applies aqua registry version prefixes (such as Codex's `rust-` prefix) before it chooses version overrides. Before, platform entries like `windows-x64` were skipped. When several prefix families match, mise now warns and skips the entry instead of picking one arbitrarily. [#&#8203;14218](https://redirect.github.com/jdx/mise/pull/14218) ([@&#8203;nettlesh](https://redirect.github.com/nettlesh))
- The rustup profile aliases `m`, `d`, `c` and the empty value are now treated like `minimal`, `default` and `complete`. With `profile = "d"`, `mise install` now restores missing components like clippy and rustfmt. Unknown profile names now fail with rustup's list of valid names. [#&#8203;14220](https://redirect.github.com/jdx/mise/pull/14220) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- The cargo backend now takes the same rust-state lock as the rust plugin when `CARGO_HOME`/`RUSTUP_HOME` are set through the `rust.cargo_home`/`rust.rustup_home` settings or `MISE_CARGO_HOME`/`MISE_RUSTUP_HOME` in `[env]`. Before, parallel source-build installs could race and fail. [#&#8203;14219](https://redirect.github.com/jdx/mise/pull/14219) ([@&#8203;wislertt](https://redirect.github.com/wislertt))
- The hint to enable `self_update.auto` now appears on every `mise version` and `mise self-update` run, not just the first time. It stops once you enable auto-update or run `mise settings add disable_hints auto_update`. [#&#8203;14233](https://redirect.github.com/jdx/mise/pull/14233)
- The JSON schema now matches what mise accepts, so editors and linters like tombi and Taplo report the right errors ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562)):
  - Task arrays can contain `{ task = ... }` and `{ tasks = [...] }` entries. [#&#8203;14229](https://redirect.github.com/jdx/mise/pull/14229)
  - `depends`, `depends_post` and `wait_for` accept a single table, and empty nested lists like `depends = [[]]` are rejected. [#&#8203;14236](https://redirect.github.com/jdx/mise/pull/14236)
  - `[env]` entries that combine `value` with `required = true` or a help string, and `{ required = false }` with no value, are rejected. [#&#8203;14247](https://redirect.github.com/jdx/mise/pull/14247)

##### Deprecated

- `always_keep_download` is deprecated because downloads are now kept in the download cache. It will warn starting in 2026.11.0 and will be removed in 2027.11.0. [#&#8203;14222](https://redirect.github.com/jdx/mise/pull/14222)

##### Documentation

- The automatic tool updates docs now explain that `minimum_release_age` (24h by default) plus the check interval can delay an update by 24 to 48 hours after a release. You can set `minimum_release_age` per tool. Docs and hints now use the shorter `mise settings KEY=VALUE` form. [#&#8203;14235](https://redirect.github.com/jdx/mise/pull/14235)

##### New Contributors

- [@&#8203;wislertt](https://redirect.github.com/wislertt) made their first contribution in [#&#8203;14219](https://redirect.github.com/jdx/mise/pull/14219)
- [@&#8203;oppegard](https://redirect.github.com/oppegard) made their first contribution in [#&#8203;14194](https://redirect.github.com/jdx/mise/pull/14194)

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.6...v2026.10.7>

##### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.6`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.6): : Per-machine [vars] prompts, local config includes, and working-tree changes in --affected

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.5...vfox-v2026.10.6)

`[vars]` entries can now ask once per machine and remember the answer, `include` accepts local files, and `mise run --affected` now counts uncommitted work and no longer needs `experimental = true`. On a fresh machine, `mise bootstrap` can install git and ssh before it clones. The release also fixes several dotfiles history issues and stops lazy tools from triggering remote version lookups when something else launches.

##### Added

- **Per-machine `[vars]` prompts.** Give a var a `prompt`, plus either a `default` or `required`. mise asks for it once and saves the answer in `$MISE_STATE_DIR/vars.toml`, outside your config and dotfiles history. Templates, tasks and tools then read it as usual. One shared dotfiles setup can use this to set a different Git identity on each machine. [#&#8203;14190](https://redirect.github.com/jdx/mise/pull/14190)

  ```toml
  [vars.git_name]
  default = "Ada Lovelace"
  prompt = "Git author name"

  [vars.git_email]
  required = "Run mise vars prompt to set git_email"
  prompt = "Git email"
  ```

  ```sh
  mise vars                       # list every var and where its value comes from
  mise vars prompt                # ask for every unanswered prompt var (or name some)
  mise vars git_name=Ada          # save a value without a prompt
  mise vars unset git_name        # forget a saved value
  mise bootstrap --prompt-vars    # prompt during a bootstrap run, e.g. with --adopt
  ```

  Only `mise vars prompt` and `mise bootstrap --prompt-vars` ever ask. Everything else uses the saved answer, then the `default`. Precedence, highest first: the process environment, a value from a higher-precedence config file, the saved answer, the `default`. Answers are keyed by var name, so projects that use the same name share one answer on a machine. `prompt` is not allowed in `[env]`.

- **Local paths in `include`.** `include` in `mise.toml` now accepts local TOML files, not just `git::` and `oci::` references. A path can be relative to the including file or absolute. Local files merge the same way as remote ones, ranking just below the including file. They are read on every load, so edits apply immediately and invalidate the cached env. Paranoid mode rejects local includes, and safe mode still skips all includes in project config. [#&#8203;14178](https://redirect.github.com/jdx/mise/pull/14178)

  ```toml
  include = ["./config/tools.toml", "/etc/mise/team.toml"]
  ```

- **`mise bootstrap` installs git and ssh before cloning.** `mise bootstrap --from` and `--adopt` used to fail with a spawn error when git was missing. Now mise checks for git, and for ssh when the URL is `ssh://` or `user@host:path`, and offers to install whatever is missing with the host package manager. Supported managers are apt, dnf, pacman, apk, zypper, Homebrew, scoop and winget. `--yes` accepts the offer without asking, and `--dry-run` only reports what is missing. [#&#8203;14188](https://redirect.github.com/jdx/mise/pull/14188)

- **`mise dot save --re-encrypt`.** After you change `[history.encryption] recipients`, a normal save leaves some encrypted files under their old keys: manual-save entries the save doesn't name, and other-platform variants. Add `--re-encrypt` to re-encrypt every saved file in the new checkpoint to the current recipients. It never captures unsaved edits. If this machine can't unlock some of the files, nothing is saved and the error lists all of them. [#&#8203;14210](https://redirect.github.com/jdx/mise/pull/14210)

- **`mise dot status` shows unsaved changes.** It now lists tracked paths that changed since the latest checkpoint. Unsaved edits were previously invisible there when the watcher was stopped or an entry used `--no-autosave`. `--json` reports these paths as `history.unsaved`. The value is `null` when they can't be determined, for example with no checkpoint yet or with encrypted files this machine can't compare without prompting. [#&#8203;14209](https://redirect.github.com/jdx/mise/pull/14209)

##### Changed

- **`mise run --affected` now counts working-tree changes, and the workspace graph is no longer experimental.** Besides the committed `base...head` range, `--affected` now also counts staged and unstaged edits and untracked files that aren't ignored. You can narrow it with `--affected-committed`, `--affected-uncommitted` and `--affected-untracked`, which can be combined (environment variables: `MISE_AFFECTED_*`). Working-tree changes only count when the head is your current checkout. To get the old committed-only selection, for example in a CI job that writes untracked files before it runs, use `--affected-committed`. `--affected`, `mise tasks graph`, `[monorepo.task_defaults]`, `[monorepo.projects]` and `task.auto_infer` no longer require `experimental = true`. [#&#8203;14214](https://redirect.github.com/jdx/mise/pull/14214)

  ```sh
  mise run --affected build                                         # committed + uncommitted + untracked
  mise run --affected --affected-uncommitted --affected-untracked build  # only what you haven't committed yet
  mise run --affected --affected-committed build                    # committed range only, as before
  ```

- **Credential checks for dotfiles.** Files with names ending in `.example`, `.sample` or `.template` no longer match the credential name rules. The content scan before publishing still checks them. Once you approve a file for plaintext tracking, mise no longer warns about it on every save. [#&#8203;14204](https://redirect.github.com/jdx/mise/pull/14204)

- **`mise dot track` only asks about plaintext at a terminal.** Before saving a credential-named file in plaintext, it now asks only when both stdin and stderr are terminals. Previously, a piped line, such as the next entry in a `while read` loop, could be taken as the answer. Scripts need `--allow-plaintext` or `--encrypt`. [#&#8203;14205](https://redirect.github.com/jdx/mise/pull/14205)

##### Fixed

- **Lazy tools no longer trigger remote lookups for other lazy tools.** Previously, mise looked up versions for configured lazy tools that weren't installed, even though they weren't being launched. With a cold cache and no network, launching one tool waited on each lookup and could print "Failed to resolve tool version list" warnings. In one offline test a launch took 41 seconds. This no longer happens in these cases:

  - the update that runs before an `auto_update` tool launches ([#&#8203;14195](https://redirect.github.com/jdx/mise/pull/14195))
  - after `mise x` or a shim installs a new version ([#&#8203;14197](https://redirect.github.com/jdx/mise/pull/14197))
  - the first launch of a lazy tool through its shim ([#&#8203;14201](https://redirect.github.com/jdx/mise/pull/14201))

  `mise install`, `mise upgrade` and `mise use` still resolve everything.
- **`Too many open files` with parallel `npm:` installs.** Parallel installs could fail under macOS's default launchd soft limit of 256, for example when mise was started from a LaunchAgent. On Unix, mise now raises its soft open-file limit at startup toward the hard limit, up to 10240, and never lowers it. [#&#8203;14174](https://redirect.github.com/jdx/mise/pull/14174), [#&#8203;14216](https://redirect.github.com/jdx/mise/pull/14216)
- **`go:` tools with an untidy `go.mod`.** Tools whose published `go.mod` is missing a requirement now install, for example `go:tailscale.com/cmd/tailscale`. mise now passes `-mod=mod` to `go install` instead of `-mod=readonly`. A project's `GOFLAGS=-mod=vendor` still doesn't affect these installs. [#&#8203;14180](https://redirect.github.com/jdx/mise/pull/14180) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- **Config at the filesystem root.** A config file at `/`, such as `/mise.toml` in a Docker image, made `mise install` and `mise exec` panic. It now works. [#&#8203;14182](https://redirect.github.com/jdx/mise/pull/14182)
- **.NET installs.** Installing a .NET SDK no longer fails with "was not found in `dotnet --list-sdks` output" when another mise-managed SDK comes before the shims on `PATH`. The post-install check now runs the new SDK's `dotnet` directly. [#&#8203;14189](https://redirect.github.com/jdx/mise/pull/14189)
- **Shims and directories.** Shims and `mise which` no longer resolve a bin name to a directory in another tool's bin path. Previously, `hunk`'s `skills/` directory blocked `npm:skills` with "Permission denied". [#&#8203;14193](https://redirect.github.com/jdx/mise/pull/14193)
- **`mise oci build` and multiple versions.** A tool pinned to several versions is now written to the embedded `/etc/mise/config.toml` as a single array, in resolution order. Previously each version got its own duplicate key, which made the config unreadable inside the container. [#&#8203;14200](https://redirect.github.com/jdx/mise/pull/14200) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- **Encrypted files a sync can't unlock.** `mise bootstrap --adopt`, `mise dot pull` and `mise dot sync` now list every encrypted file they can't unlock in one error, instead of stopping at the first one. Damaged files still stop the sync immediately. [#&#8203;14208](https://redirect.github.com/jdx/mise/pull/14208)
- **Rollback and undo messages.** `mise dot rollback <path>` now names the checkpoint that saved the restored version, which matches `mise dot history --path`. Rollback and undo also name both checkpoints they record: the result, and the one holding the state before the operation. Previously, rollback could name a checkpoint that `history --path` didn't list. What gets restored is unchanged. [#&#8203;14207](https://redirect.github.com/jdx/mise/pull/14207), [#&#8203;14211](https://redirect.github.com/jdx/mise/pull/14211)
- **`mise dot status` on adopted machines.** On a machine that adopted a shared setup, it no longer prints "nothing configured in \[dotfiles]" while history tracks entries. [#&#8203;14206](https://redirect.github.com/jdx/mise/pull/14206)

##### New Contributors

- [@&#8203;jovial-liu](https://redirect.github.com/jovial-liu) made their first contribution in [#&#8203;14184](https://redirect.github.com/jdx/mise/pull/14184)

**Full Changelog**: <https://github.com/jdx/mise/compare/v2026.10.5...v2026.10.6>

##### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.5`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.5): : Java defaults to Temurin, per-machine and local-only dotfile history, packslip workflow pinning

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.4...vfox-v2026.10.5)

Java versions without a vendor prefix now install Eclipse Temurin builds. Dotfiles gain per-machine and local-only history, a `merge = "missing"` mode, and a secret check before `mise dot sync` publishes anything. Packslip tools can be pinned to the workflow that signs their releases. Several features documented as experimental now actually require `experimental = true`. The rest of the release is fixes across tasks, shims, config loading, bootstrap and backends.

##### Breaking Changes

- **`java@21`, `java@lts` and `java@latest` now install Temurin.** The default of `java.shorthand_vendor` changes from `openjdk` to `temurin`. The jdk.java.net OpenJDK builds stop at the next feature release, so `java@21` was stuck on 21.0.2 from January 2024. Vendor-prefixed requests (`openjdk-21`, `corretto-21`, ...) are not affected. Installed OpenJDK versions keep working, and `mise upgrade` offers the Temurin build. Shorthand versions now include Temurin's build suffix (for example `21.0.12+101.0.LTS`). Temurin has no builds of Java 9, 10 or 12–15, so use `openjdk-12` and similar for those. [#&#8203;14146](https://redirect.github.com/jdx/mise/pull/14146)
  - **Lockfiles:** existing shorthand lock entries record `shorthand_vendor = "openjdk"`. Without that setting, `mise install --locked` fails with `java@21 is not in the lockfile`. Either keep OpenJDK:
    ```toml
    [settings]
    java.shorthand_vendor = "openjdk"
    # or per project: java = "openjdk-21"
    ```
    or switch to Temurin with `mise lock --bump java` and commit the result.
- **Some experimental features now require `experimental = true`** (or `MISE_EXPERIMENTAL=1`) when you use them. Config that only mentions them still loads. [#&#8203;14114](https://redirect.github.com/jdx/mise/pull/14114)
  - Running a task with a `git::` remote `file`, including through `mise run --dry-run`, `mise watch`, or as a dependency. Commands that only inspect tasks (`tasks ls`, `tasks info`, `tasks deps`, `generate task-docs`) show the task from its TOML and warn once that the file wasn't fetched. These were documented as experimental but were missing the check in the codebase.
  - `git::` and `oci::` entries in `task_config.includes`. These are skipped with a warning.
  - OpenTelemetry export of `mise run` when an OTLP endpoint is set.
  - Installing `spinel:` tools.
- **`mise.local.toml` now overrides `mise.<env>.toml` in the same directory**, as the docs already said. Before, the committed environment file won in project directories, and also in `~/.config/mise` when the walk up from the cwd reached it. Within each directory the order is now, highest first: `mise.<env>.local.toml`, `mise.local.toml`, `mise.<env>.toml`, `mise.toml`. If you relied on the environment file winning, move those keys into `mise.<env>.local.toml`. [#&#8203;14148](https://redirect.github.com/jdx/mise/pull/14148)
- **MCP:** in the `mise://tasks` resource, `env` is now an array of env directive strings, the same format as `mise tasks ls --json`. It was always an empty object before. [#&#8203;14111](https://redirect.github.com/jdx/mise/pull/14111)
- **`mise settings set` and `add` refuse writes that would have no effect.** This covers early-init settings (`env`, `ceiling_paths`, `env_conf_d`, ...) written to a config file, and global-only settings (`yes`, `paranoid`, `trusted_config_paths`, ...) written with `--local`. The error says where the setting has to go: `miserc.toml`, the global config, or the `MISE_*` variable. [#&#8203;14126](https://redirect.github.com/jdx/mise/pull/14126)

##### Added

##### Dotfiles

- **Per-machine tracked files.** Some files describe the machine, such as a monitor layout. Use `variants = [{ machine = true }]` or `mise dot track --machine` to keep a separate history for each machine. Sync pushes every machine's version to the origin but never applies one machine's version on another. Each machine gets a generated name, which you can set with `[history] machine = "desk"`. A machine variant must be the entry's only variant and can't be combined with `encrypt`. Upgrade every machine that shares a setup before using it. [#&#8203;14062](https://redirect.github.com/jdx/mise/pull/14062)
  ```toml
  [dotfiles]
  "~/.config/hypr/monitors.lua" = { mode = "track", variants = [{ machine = true }] }
  ```
- **`mode = "track-local"`** (or `mise dot track --local`) keeps a file's history in a separate store on this machine, with no origin. The file never reaches the shared manifest, a commit or a push. Commands that name a path use the history that holds it. Use `mise dot --local history` or `mise dot --local undo` to work with the local history directly. `save`, `capture` and `watch` cover both histories. [#&#8203;14082](https://redirect.github.com/jdx/mise/pull/14082)
- **`merge = "missing"`** sets only the keys the target file doesn't have yet. Values an app writes itself, such as the model picked with `/model` in Codex or Claude Code, are left alone. Works with TOML, YAML and JSON. [#&#8203;14081](https://redirect.github.com/jdx/mise/pull/14081)
  ```toml
  [dotfiles]
  "~/.codex/config.toml/shared" = { merge = true }
  "~/.codex/config.toml/defaults" = { source = "codex/defaults.toml", merge = "missing" }
  ```
- Merge entries can leave out `source`. mise then reads the target's path under `dotfiles.root`. Switching an entry from `symlink` to `merge` now replaces a link that points at the merge source with a writable copy, so the app's own keys survive. [#&#8203;14076](https://redirect.github.com/jdx/mise/pull/14076)
- **`mise dot sync` refuses to publish saved versions that look like secrets.** It checks for provider tokens, private key blocks, and `*_KEY`/`*_TOKEN`/`*_SECRET`/`*_PASSWORD` assignments. Only versions the origin doesn't have yet are checked. The error names the file, line and version, never the value. `--allow-plaintext-history` skips the check. [#&#8203;14171](https://redirect.github.com/jdx/mise/pull/14171)
- `mise bootstrap --adopt <url> --take-remote-all` takes the repository's version of every file that differs, in one step. Combined with `--replace-history`, it also adopts the repository on a machine that already has history of its own. [#&#8203;14065](https://redirect.github.com/jdx/mise/pull/14065)
- `mise doctor` shows the dotfiles history repo path and the connected origin (URL, branch, sync mode), in both text and `--json` output. [#&#8203;14173](https://redirect.github.com/jdx/mise/pull/14173)

##### Bootstrap

- `[bootstrap.files]` and `[bootstrap.directories]` accept the same `os` selector as packages. Entries that don't match the host are skipped completely. [#&#8203;14058](https://redirect.github.com/jdx/mise/pull/14058)
  ```toml
  [bootstrap.files."/etc/docker/daemon.json"]
  os = "linux"
  source = "./files/docker-daemon.json"
  ```
- `fish = "auto"` in `[bootstrap.mise_shell_activate]` writes a block that runs `mise activate fish` in interactive shells and `--shims` everywhere else. [#&#8203;14172](https://redirect.github.com/jdx/mise/pull/14172)
- `[bootstrap]` is now allowed in config includes. It merges below the including file, so a shared baseline can declare packages, hooks and services, and the project still wins on any key it sets itself. [#&#8203;14176](https://redirect.github.com/jdx/mise/pull/14176)
- Systemd units accept `state = "absent"`, which stops, disables and deletes the matching mise-managed service and timer. `mise bootstrap unapply` now also removes the units an environment added. [#&#8203;14139](https://redirect.github.com/jdx/mise/pull/14139)

##### Tools and backends

- **Packslip `workflow` option.** It accepts only releases signed by the named GitHub Actions workflow on tags. It takes one workflow or a list, and an entry can name a ref (`release.yml@refs/heads/main`). It can't be combined with `pubkey`, `identity`, `identity_prefix` or `issuer`. [#&#8203;14075](https://redirect.github.com/jdx/mise/pull/14075), [#&#8203;14093](https://redirect.github.com/jdx/mise/pull/14093)
  ```toml
  [tools]
  "packslip:github.com/aubepkg/aube" = { version = "latest", workflow = ["release-plz.yml", "release.yml"] }
  ```
  - Registry entries for dagu, timoni, helmfile, fnox, hk, usage, communique, mr-boxington, pitchfork, aube and worktrunk are now pinned to the workflow that signs their releases. A `workflow` or `pubkey` you set yourself replaces the registry pin. [#&#8203;14092](https://redirect.github.com/jdx/mise/pull/14092), [#&#8203;14091](https://redirect.github.com/jdx/mise/pull/14091), [#&#8203;14073](https://redirect.github.com/jdx/mise/pull/14073) ([@&#8203;max-sixty](https://redirect.github.com/max-sixty))
- **MCP `install_tool` is implemented.** It installs the requested version, or the configured version, or latest, and returns the resolved version and install path. `install_tool` and `run_task` now refuse to act on untrusted config instead of trusting it on the client's behalf. [#&#8203;14111](https://redirect.github.com/jdx/mise/pull/14111)
- `mise installs migrate` no longer fails on installs it can't reinstall, such as withdrawn releases, signer changes or no network. It moves them into the identity layout as they are and leaves a link at the old path. It also handles lockfile-suffixed `~aube~`/`~uv~` directories correctly. [#&#8203;14079](https://redirect.github.com/jdx/mise/pull/14079)
- Registry: `mprocs` is renamed to `dekit` to match upstream, and `mprocs` stays as an alias. From v0.10.0 the binary is `dekit`. [#&#8203;14169](https://redirect.github.com/jdx/mise/pull/14169)

##### Changed

- Dotfile operations you can undo no longer ask for confirmation after showing their plan. This covers `dot pull`, `dot track`, `undo`, `rollback`, `connect` and `bootstrap --adopt`. Destructive ones still ask, such as `--replace-history`, `dot recover --keep-current` and `implode`. `--yes` and `MISE_YES` are still accepted. [#&#8203;14077](https://redirect.github.com/jdx/mise/pull/14077), [#&#8203;14071](https://redirect.github.com/jdx/mise/pull/14071), [#&#8203;14067](https://redirect.github.com/jdx/mise/pull/14067)
- Safe mode (`MISE_SAFE=1`) now ignores a project's `[bootstrap]`, `[dotfiles]` and `[dotfile_groups]`. Before, an untrusted repo could link files into `$HOME` or clone repositories. Global and system config still apply. [#&#8203;14110](https://redirect.github.com/jdx/mise/pull/14110)
- Node downloads are checked against the GPG signature for every version that publishes one. Before, only versions starting with `2` were checked. Set `node.gpg_verify = false` for mirrors without signatures. [#&#8203;14132](https://redirect.github.com/jdx/mise/pull/14132)
- `mise generate github-action` now uses `actions/checkout@v7` and `jdx/mise-action@v5` and no longer sets `MISE_EXPERIMENTAL`. `mise generate devcontainer` now adds `"postCreateCommand": "mise install"`. [#&#8203;14145](https://redirect.github.com/jdx/mise/pull/14145)

##### Deprecated

- `task.cache.stats_report`, `sops.age_recipients` and `plugin_autoupdate_last_check_duration` never had any effect. Setting one now prints a warning, and they will be removed in 2027.10.5. [#&#8203;14112](https://redirect.github.com/jdx/mise/pull/14112)
- `mise bootstrap launchd|systemd|macos-defaults`, the old `--only`/`--skip` part names (`launchd`, `systemd`, `defaults`, `shell`) and `mise direnv` now print a warning that names the replacement. They will be removed in 2027.10.4. [#&#8203;14113](https://redirect.github.com/jdx/mise/pull/14113)

##### Fixed

##### Tasks

- A raw or interactive task with `cache` enabled is now skipped when its sources are fresh and its cache key hasn't changed. Before, it ran every time. [#&#8203;14121](https://redirect.github.com/jdx/mise/pull/14121)
- A typo in `sources` that matches no files now prints a warning. `mise tasks deps <task>` now shows `depends_post` tasks. Scripts in `$MISE_CONFIG_DIR/tasks` load even without a global config file. [#&#8203;14122](https://redirect.github.com/jdx/mise/pull/14122)
- `mise run ./script` resolves relative to the current directory. [#&#8203;14120](https://redirect.github.com/jdx/mise/pull/14120)
- Script extensions are stripped only from file task names. [#&#8203;14159](https://redirect.github.com/jdx/mise/pull/14159)
- Requests to the remote task cache include the mbx-cache headers. [#&#8203;14147](https://redirect.github.com/jdx/mise/pull/14147)
- `mise generate task-stubs` skips hidden and global tasks. [#&#8203;14127](https://redirect.github.com/jdx/mise/pull/14127)

##### Shims and exec

- Shims, `mise x` and `mise env` no longer look up remote versions for lazy tools that aren't installed. With 20 lazy tools and no network, running an installed tool went from about 42s to 0.09s. [#&#8203;14063](https://redirect.github.com/jdx/mise/pull/14063)
- On Unix, a system wrapper that execs the same command name can no longer send an unconfigured shim into an endless loop. [#&#8203;14088](https://redirect.github.com/jdx/mise/pull/14088)
- Windows lazy shim names now match regardless of letter case. [#&#8203;14090](https://redirect.github.com/jdx/mise/pull/14090)
- `mise x [email protected]` installs the exact version when the version list times out, instead of failing with "couldn't exec process". [#&#8203;14164](https://redirect.github.com/jdx/mise/pull/14164)
- `mise doctor` recognizes a `mise` entry in the dedicated shims dir. [#&#8203;14069](https://redirect.github.com/jdx/mise/pull/14069)

##### Config, settings and CLI

- With an environment active and no `config.toml` yet, `mise use -g` creates `config.toml` instead of writing into `config.<env>.toml`. [#&#8203;14179](https://redirect.github.com/jdx/mise/pull/14179)
- Booleans set through `mise config set --type bool` and boolean settings accept `yes`/`no`/`1`/`0`. For `env.*` and other keys that aren't settings, only `true` and `false` become booleans, and anything else is stored as written. `mise latest tool@prefix:X` works, and `--log-level warn` is accepted. `mise doctor` prints the full chain when config fails to load. [#&#8203;14125](https://redirect.github.com/jdx/mise/pull/14125)
- Help output uses the command name you typed. [#&#8203;14123](https://redirect.github.com/jdx/mise/pull/14123)
- `mise edit` no longer overwrites an existing config when there is no terminal. [#&#8203;14124](https://redirect.github.com/jdx/mise/pull/14124)
- `.monorepo` markers are verified in paranoid mode. [#&#8203;14105](https://redirect.github.com/jdx/mise/pull/14105)
- Bad input now gives an error instead of a panic, in places including `mise config ls` and `mise prune` with an invalid tool version, the `--monorepo` flags, and `mise plugins uninstall --purge`. [#&#8203;14118](https://redirect.github.com/jdx/mise/pull/14118), [#&#8203;14094](https://redirect.github.com/jdx/mise/pull/14094) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562)), [#&#8203;14103](https://redirect.github.com/jdx/mise/pull/14103) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562)), [#&#8203;14116](https://redirect.github.com/jdx/mise/pull/14116), [#&#8203;14117](https://redirect.github.com/jdx/mise/pull/14117)
- `mise env --redacted` honors `redact = false` exclusions. `watch_files` hooks don't run in safe mode or with `--no-hooks`. [#&#8203;14109](https://redirect.github.com/jdx/mise/pull/14109), [#&#8203;14108](https://redirect.github.com/jdx/mise/pull/14108)
- `mise watch` passes watchexec flags through to watchexec. [#&#8203;14115](https://redirect.github.com/jdx/mise/pull/14115)
- Error and warning hints point at current commands, for example the PATH advice from `bootstrap remote` and the watchexec install hint. [#&#8203;14142](https://redirect.github.com/jdx/mise/pull/14142)
- If stderr can't be written to during a migration, mise no longer aborts. [#&#8203;14158](https://redirect.github.com/jdx/mise/pull/14158) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- When the default cache and temp directories overlap (the Windows default), temp files now go to `<temp>/mise-tmp`, so `mise cache clear` no longer deletes files that are still in use. [#&#8203;14134](https://redirect.github.com/jdx/mise/pull/14134)

##### Bootstrap and dotfiles

- `mise bootstrap` keeps writing the shell activation block into a startup file that is only tracked. [#&#8203;14135](https://redirect.github.com/jdx/mise/pull/14135)
- If one package manager fails, the others still run. [#&#8203;14138](https://redirect.github.com/jdx/mise/pull/14138)
- The firewall section is skipped on systems that don't support it. [#&#8203;14137](https://redirect.github.com/jdx/mise/pull/14137)
- Dry runs show hooks that use `exec()`. [#&#8203;14136](https://redirect.github.com/jdx/mise/pull/14136)
- Pulling onto a machine with no history now saves the files it replaces first, so `mise dot undo` restores them. `--replace-history` no longer fails on its first attempt. [#&#8203;14065](https://redirect.github.com/jdx/mise/pull/14065)
- `mise dot pull` says so when incoming history changes no files on this machine. [#&#8203;14066](https://redirect.github.com/jdx/mise/pull/14066)

##### Backends and plugins

- `mise install cargo:...` no longer uses an inactive `cargo-binstall` shim. It falls back to native binstall or `cargo install`. [#&#8203;14070](https://redirect.github.com/jdx/mise/pull/14070)
- With `npm.shell_out`, a mise shim from another data dir can no longer be run as `npm` and fork until the machine runs out of memory. [#&#8203;14084](https://redirect.github.com/jdx/mise/pull/14084) (originally found and fixed by [@&#8203;tfournet](https://redirect.github.com/tfournet))
- Java: changing `java.shorthand_vendor` takes effect without waiting for the cache to expire. Inline `java[release_type=ea]` is respected when listing and resolving versions. [#&#8203;14131](https://redirect.github.com/jdx/mise/pull/14131)
- Ruby precompiled URLs expand `{os}` and `{arch}` correctly. [#&#8203;14133](https://redirect.github.com/jdx/mise/pull/14133)
- `ls-remote` respects `disable_backends`. [#&#8203;14130](https://redirect.github.com/jdx/mise/pull/14130)
- SPM uses a custom `api_url` for cloning and skips lockfile URLs. [#&#8203;14129](https://redirect.github.com/jdx/mise/pull/14129)
- GitHub assets are size-checked even when there is no checksum. GitLab release lookups percent-encode the tag. [#&#8203;14128](https://redirect.github.com/jdx/mise/pull/14128), [#&#8203;14102](https://redirect.github.com/jdx/mise/pull/14102) ([@&#8203;thespags](https://redirect.github.com/thespags))
- Brew infers the formula version from the GitHub release tag path, and detaches a DMG left attached by an interrupted install. [#&#8203;14165](https://redirect.github.com/jdx/mise/pull/14165) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562)), [#&#8203;14177](https://redirect.github.com/jdx/mise/pull/14177)
- `git::` plugins install from a subdirectory, and `[plugins]` entries compare those sources correctly. Packslip entries in `[plugins]` install as vfox plugins. [#&#8203;14140](https://redirect.github.com/jdx/mise/pull/14140), [#&#8203;14150](https://redirect.github.com/jdx/mise/pull/14150) ([@&#8203;onokonem](https://redirect.github.com/onokonem)), [#&#8203;14141](https://redirect.github.com/jdx/mise/pull/14141)
- vfox: an env plugin with no source no longer makes every command fail. Embedded plugin files are found relative to the manifest directory. [#&#8203;14119](https://redirect.github.com/jdx/mise/pull/14119), [#&#8203;14167](https://redirect.github.com/jdx/mise/pull/14167)

##### Daemons and sandbox

- On Windows, deferred daemon commands are quoted for cmd.exe. Argv and Windows readiness probes run in the tool environment. [#&#8203;14055](https://redirect.github.com/jdx/mise/pull/14055), [#&#8203;14080](https://redirect.github.com/jdx/mise/pull/14080) ([@&#8203;JamBalaya56562](https://redirect.github.com/JamBalaya56562))
- `--deny-env` clears inherited variables on Windows. On macOS, `allow_net` is rejected instead of writing invalid sandbox rules. [#&#8203;14107](https://redirect.github.com/jdx/mise/pull/14107), [#&#8203;14106](https://redirect.github.com/jdx/mise/pull/14106)

##### Security

- Remote task cache keys store env, `[vars]` and task arg values as `blake3:` digests instead of plaintext, so secret values are no longer uploaded. Existing cache entries miss once after upgrading. [#&#8203;14104](https://redirect.github.com/jdx/mise/pull/14104)
- URL credentials are redacted from HTTP debug logs and from npm Git-source and SSH diagnostics. [#&#8203;14155](https://redirect.github.com/jdx/mise/pull/14155), [#&#8203;14057](https://redirect.github.com/jdx/mise/pull/14057), [#&#8203;14064](https://redirect.github.com/jdx/mise/pull/14064)

##### Documentation

- The documentation site, CLI help and settings descriptions have been restructured and rewritten, and moved pages still resolve. [#&#8203;14097](https://redirect.github.com/jdx/mise/pull/14097), [#&#8203;14098](https://redirect.github.com/jdx/mise/pull/14098), [#&#8203;14096](https://redirect.github.com/jdx/mise/pull/14096), [#&#8203;14163](https://redirect.github.com/jdx/mise/pull/14163)

##### New Contributors

- [@&#8203;onokonem](https://redirect.github.com/onokonem) made their first contribution in [#&#8203;14150](https://redirect.github.com/jdx/mise/pull/14150)
- [@&#8203;max-sixty](https://redirect.github.com/max-sixty) made their first contribution in [#&#8203;14073](https://redirect.github.com/jdx/mise/pull/14073)

**Full Changelog**: <https://github.com/jdx/mise/compare/vfox-v2026.10.4...v2026.10.5>

##### 💚 Sponsor mise

mise is built and maintained by [@&#8203;jdx](https://redirect.github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.

If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.

### [`v2026.10.4`](https://redirect.github.com/jdx/mise/releases/tag/v2026.10.4): : Task-scoped fnox secrets, automatic global tool updates, and an opt-in identity install layout

[Compare Source](https://redirect.github.com/jdx/mise/compare/vfox-v2026.10.3...vfox-v2026.10.4)

This release adds experimental task-scoped secrets backed by fnox, automatic updates for global tools, and an experimental opt-in install layout that names installations by what they contain. It also adds dotfile `merge` entries, `headers` auth for the `http:` backend, npm installs from git, and a set of prune, install and lockfile fixes.

##### Added

##### Secrets (experimental)

These need `mise settings experimental=true` and fnox 1.39.0 or newer. They are refused in safe mode.

- **`[secrets.fnox]` and `mise secrets ls`.** A project can name fnox as its secrets source in its own `mise.toml`. `mise secrets ls` lists key names and metadata but never values. `-J` prints JSON. Global, system and home-level `[secrets]` config is ignored, and `mise doctor` reports it. [#&#8203;13967](https://redirect.github.com/jdx/mise/pull/13967)

- **Tasks get only the secrets they list.** Add `secrets = [...]` to a task, or `#MISE secrets=[...]` in a file task header. Only that task gets the values, only while it runs, and they are redacted from its output. Dependencies, hooks, `mise env`, hook-env and shims get nothing. A task without grants never calls fnox. Tasks that list secrets need a trusted config, aren't artifact-cached, and ignore `--raw` unless the task sets `raw` or `interactive`. Hooks, `watch_files`, daemons and `mise bootstrap` can't run them, and remote or global-config tasks can't list secrets. [#&#8203;13974](https://redirect.github.com/jdx/mise/pull/13974)

  ```toml
  min_version = "2026.10.4"   # older mise rejects `secrets` on a task

  [secrets.fnox]
  profile = "prod"

  [tasks.deploy]
  depends = ["build"]                       # build receives nothing
  secrets = ["DEPLOY_KEY", "DATABASE_URL"]
  run = "./deploy.sh"
  ```

- **One-off grants from the command line.** `--secrets KEY[,KEY]` and `--secrets-all` work on `mise run`, `mise tasks run` and `mise x`. For `mise run`, only the tasks named on the command line get them, not their dependencies. `mise x` gets nothing unless you pass a flag, and it can't receive file secrets. Flags placed after the task name go to the task, and mise warns when that happens. [#&#8203;13975](https://redirect.github.com/jdx/mise/pull/13975)

  ```sh
  mise run --secrets STRIPE_KEY deploy
  mise x --secrets GH_TOKEN -- gh release list
  ```

- **`{{ secrets.X }}` in task env values.** A task can build an env var from a secret, for example `env.PGURL = "postgres://app:{{ secrets.DB_PASSWORD }}@db/app"`. The reference counts as the grant. References are rejected in `run`, `[env]`, `[vars]` and other fields. [#&#8203;13978](https://redirect.github.com/jdx/mise/pull/13978)

- **fnox daemon cache.** If the project's fnox config enables the daemon and it's running, an interactive run reads cached values over its socket without starting an fnox process. mise never starts the daemon itself. CI, non-TTY runs and Windows always use the fnox CLI. [#&#8203;13979](https://redirect.github.com/jdx/mise/pull/13979)

##### Automatic global tool updates

- **`auto_update` for global tools.** Set `auto_update` on a tool in your global config. When a shim or `mise x` is about to run that tool and its check interval is due, mise upgrades it within the configured range and then runs the new version. `true` uses the new `tool_update.check_duration` setting (default 24h), and a duration string sets that tool's own interval (minimum 1h). [#&#8203;14026](https://redirect.github.com/jdx/mise/pull/14026)

  - Exact pins never update.
  - It never runs offline, in CI, with `locked = true`, from tasks or hook-env, or from project configs.
  - If an update fails, mise warns and runs the installed version. The failure shows in `mise doctor`.

  ```toml
  # ~/.config/mise/config.toml
  [tools]
  claude = { version = "latest", auto_update = true }
  node = { version = "22", auto_update = "6h" }   # newest 22.x, never 23
  ```

- **Background `tool-update` service.** A built-in bootstrap service checks `auto_update` tools hourly, so launches don't wait for downloads and tools run directly from PATH under activation also stay current. It installs a systemd user unit, LaunchAgent or scheduled task. [#&#8203;14040](https://redirect.github.com/jdx/mise/pull/14040)

  ```toml
  [bootstrap.services.mise-tool-update]
  builtin = "tool-update"
  ```

##### Identity install layout (experimental, opt-in)

- **`install_layout = "identity"`.** With `experimental = true`, each installation lives in `installs/<label>-<hash>/`. The hash covers the canonical backend, version, platform and install-affecting options. `installs/<tool>/<version>` becomes a link to that directory, a real junction on Windows. As a result: [#&#8203;13951](https://redirect.github.com/jdx/mise/pull/13951)

  - `age` and `aqua:FiloSottile/age` share one installation.
  - Variants of one version with different options can exist side by side.
  - Windows IDEs can follow the version links.

  Existing installs keep working and aren't moved. Nothing changes unless you set this. `MISE_INSTALL_LAYOUT=identity` also turns it on. See the new install layout docs.
- On Windows, identity-layout installations go into the shorter `%LOCALAPPDATA%\mise\i\`, while version links stay in `installs\`. `MISE_INSTALL_STORE_DIR` sets the location on any platform. [#&#8203;13952](https://redirect.github.com/jdx/mise/pull/13952)
- `mise installs ls` lists installations as `selected`, `pinned` or `shared`. `mise installs select <dir>` chooses which installation requests without a lockfile use. When several installations match and none is selected, mise lists them instead of guessing. [#&#8203;13953](https://redirect.github.com/jdx/mise/pull/13953)
- `mise installs migrate [--dry-run] [TOOL[@VERSION]]` reinstalls legacy installations into the new layout and leaves a link at the old path. If a run is interrupted, the next run recovers it. [#&#8203;13955](https://redirect.github.com/jdx/mise/pull/13955)
- In the layout, `mise backends switch` installs the new backend's version and points the link at it. `mise where` and the other commands now resolve versions named on the command line the same way, and `mise where` lists variants instead of picking one. [#&#8203;13957](https://redirect.github.com/jdx/mise/pull/13957)
- `mise prune` handles templated tool versions such as `node = "{{ vars.node }}"`. It uses snapshots of what each project last rendered and keeps installs when it isn't sure they are unused. [#&#8203;14025](https://redirect.github.com/jdx/mise/pull/14025)

##### Other additions

- **Dotfile `merge` entries.** A `merge = true` entry sets only the keys from its source in a JSON, TOML or YAML file, and leaves keys added by the application (Codex, Claude Code, etc.) alone. TOML and YAML keep comments and formatting. `mise dot status` and `mise dot diff` only report drift in those keys. A target that doesn't parse is never overwritten. [#&#8203;14012](https://redirect.github.com/jdx/mise/pull/14012)

  ```toml
  [dotfiles]
  "~/.codex/config.toml/shared" = { source = "codex/shared.toml", merge = true }
  ```

- **`headers` for the `http:` backend.** You can now authenticate with bearer tokens or API keys, for example to download OCI blobs from `ghcr.io`. Values are templates. Headers are sent with downloads, `version_list_url` and `checksum_url` requests, and dropped on cross-host redirects unless the host is listed in `headers_forward`. Changing a token doesn't trigger a reinstall. [#&#8203;14022](https://redirect.github.com/jdx/mise/pull/14022)

  ```toml
  [tools."http:polaris"]
  version = "0.9.2"
  headers = { Authorization = "Bearer {{ env.GITHUB_TOKEN | b64_encode }}" }
  ```

- **npm packages from git.** `git+` URLs and `github:`, `gitlab:` and `bitbucket:` specs now install. The version is a git ref, and `latest` is the default branch. [#&#8203;14044](https://redirect.github.com/jdx/mise/pull/14044)

  ```sh
  mise use 'npm:github:owner/[email protected]'
  ```

- **`settings.write_targets`.** Sends new global `[tools]`, `[bootstrap.packages]` and `[dotfiles]` entries to separate `conf.d` files. Existing entries are updated where they're already declared. [#&#8203;14018](https://redirect.github.com/jdx/mise/pull/14018)

  ```toml
  [settings.write_targets]
  tools = "~/.config/mise/conf.d/10-tools.toml"
  dotfiles = "~/.config/mise/conf.d/30-dotfiles.toml"
  ```

- **`prune.exclude`** (or `MISE_PRUNE_EXCLUDE`) lists tools that `mise prune`, `mise ls --prunable` and upgrade pruning never remove. Short and full names both work, e.g. `node` or `aqua:BurntSushi/ripgrep`. [#&#8203;14030](https://redirect.github.com/jdx/mise/pull/14030)

- **`lockfile_auto_prune = false`** keeps lockfile entries for tools missing from the active config. This is useful when profiles share one lockfile. The default (`tr

> [!IMPORTANT]
> ✂ PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE1NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-13 09:10:53 -07:00
renovate[bot] 399f493808 chore(deps): update dependency supertest to v7.3.1 (#721)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [supertest](https://redirect.github.com/ladjs/supertest) | [`7.2.2` → `7.3.1`](https://renovatebot.com/diffs/npm/supertest/7.2.2/7.3.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/supertest/7.3.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/supertest/7.2.2/7.3.1?slim=true) |

---

### Release Notes

<details>
<summary>ladjs/supertest (supertest)</summary>

### [`v7.3.1`](https://redirect.github.com/forwardemail/supertest/releases/tag/v7.3.1)

[Compare Source](https://redirect.github.com/ladjs/supertest/compare/v7.3.0...v7.3.1)

- Merge pull request [#&#8203;907](https://redirect.github.com/ladjs/supertest/issues/907) from JH8459/fix/ephemeral-loopback-bind  [`884cd26`](https://redirect.github.com/ladjs/supertest/commit/884cd26)
- fix: bind ephemeral server to the loopback address it connects to  [`e74a1e0`](https://redirect.github.com/ladjs/supertest/commit/e74a1e0)

***

### [`v7.3.0`](https://redirect.github.com/forwardemail/supertest/releases/tag/v7.3.0)

[Compare Source](https://redirect.github.com/ladjs/supertest/compare/v7.2.2...v7.3.0)

- fix: stabilize ephemeral server requests and assertions  [`71dc5fb`](https://redirect.github.com/ladjs/supertest/commit/71dc5fb)
- Merge pull request [#&#8203;883](https://redirect.github.com/ladjs/supertest/issues/883) from forwardemail/dependabot/npm_and_yarn/multi-acd8535d99  [`3b5ba5c`](https://redirect.github.com/ladjs/supertest/commit/3b5ba5c)
- Merge pull request [#&#8203;886](https://redirect.github.com/ladjs/supertest/issues/886) from forwardemail/dependabot/npm_and_yarn/picomatch-2.3.2  [`c3419b2`](https://redirect.github.com/ladjs/supertest/commit/c3419b2)
- Merge pull request [#&#8203;887](https://redirect.github.com/ladjs/supertest/issues/887) from forwardemail/dependabot/npm_and_yarn/lodash-4.18.1  [`7e409db`](https://redirect.github.com/ladjs/supertest/commit/7e409db)
- Merge pull request [#&#8203;898](https://redirect.github.com/ladjs/supertest/issues/898) from forwardemail/dependabot/npm_and_yarn/brace-expansion-1.1.21  [`b55a7f9`](https://redirect.github.com/ladjs/supertest/commit/b55a7f9)
- Merge pull request [#&#8203;899](https://redirect.github.com/ladjs/supertest/issues/899) from forwardemail/dependabot/npm_and_yarn/browserslist-4.29.0  [`7a5deaa`](https://redirect.github.com/ladjs/supertest/commit/7a5deaa)
- Merge pull request [#&#8203;900](https://redirect.github.com/ladjs/supertest/issues/900) from forwardemail/dependabot/npm_and_yarn/fast-uri-3.1.8  [`a75f6ee`](https://redirect.github.com/ladjs/supertest/commit/a75f6ee)
- Merge pull request [#&#8203;901](https://redirect.github.com/ladjs/supertest/issues/901) from forwardemail/dependabot/npm_and_yarn/js-yaml-3.15.2  [`c2cb33e`](https://redirect.github.com/ladjs/supertest/commit/c2cb33e)
- Merge pull request [#&#8203;896](https://redirect.github.com/ladjs/supertest/issues/896) from pnookala-godaddy/codex/ephemeral-loopback-bind  [`7fb34e7`](https://redirect.github.com/ladjs/supertest/commit/7fb34e7)
- chore(deps-dev): bump js-yaml from 3.14.2 to 3.15.2  [`c357584`](https://redirect.github.com/ladjs/supertest/commit/c357584)
- chore(deps-dev): bump browserslist from 4.25.1 to 4.29.0  [`2a01b57`](https://redirect.github.com/ladjs/supertest/commit/2a01b57)
- chore(deps-dev): bump fast-uri from 3.0.6 to 3.1.8  [`343394d`](https://redirect.github.com/ladjs/supertest/commit/343394d)
- chore(deps-dev): bump brace-expansion from 1.1.12 to 1.1.21  [`6b203e9`](https://redirect.github.com/ladjs/supertest/commit/6b203e9)
- Merge pull request [#&#8203;881](https://redirect.github.com/ladjs/supertest/issues/881) from forwardemail/dependabot/npm_and_yarn/qs-6.14.2  [`d40ca7e`](https://redirect.github.com/ladjs/supertest/commit/d40ca7e)
- fix: match ephemeral server address family  [`b6f5995`](https://redirect.github.com/ladjs/supertest/commit/b6f5995)
- chore(deps-dev): bump lodash from 4.17.21 to 4.18.1  [`81766ca`](https://redirect.github.com/ladjs/supertest/commit/81766ca)
- chore(deps-dev): bump picomatch from 2.3.1 to 2.3.2  [`985ac7c`](https://redirect.github.com/ladjs/supertest/commit/985ac7c)
- chore(deps): bump minimatch  [`58baa5f`](https://redirect.github.com/ladjs/supertest/commit/58baa5f)
- chore(deps): bump qs from 6.14.1 to 6.14.2  [`c406e82`](https://redirect.github.com/ladjs/supertest/commit/c406e82)

***

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEzNC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-13 09:10:45 -07:00
renovate[bot] 20f2714edd chore(deps): update redis docker digest to 2c2dff7 (#719)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| redis | digest | `6f81e89` → `2c2dff7` |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEzNC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-13 09:10:37 -07:00
renovate[bot] bdcef9fd37 chore(deps): update postgres:18 docker digest to 74935e7 (#718)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [postgres](https://hub.docker.com/_/postgres) ([source](https://redirect.github.com/docker-library/postgres)) | digest | `5a5a84b` → `74935e7` |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEzNC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-13 09:10:25 -07:00
Will Schurman 593fb10c99 v0.71.0 2026-10-09 11:09:24 -07:00
Vatsal Patel 3c96f3b9ea fix: declare runtime dependencies imported by published packages (#717) 2026-10-09 09:14:43 -07:00
Will Schurman 84f83071f3 v0.70.0 2026-10-05 10:24:41 -07:00
Will Schurman 🦦 13ce74e93a feat: add transient error for PostgreSQL lock timeouts (#716)
# Why

Re-implementation of #714 on top of #715.

# How

Prompt:

> add new error for pg code 55P03, use PR 714 as reference but a new error class

# Test Plan

CI
2026-10-05 10:08:28 -07:00
Will Schurman 🦦 6de04055e7 feat!: move knex-specific database adapter errors into entity-database-adapter-knex (#715)
# Why

While reviewing #714, noticed that it was probably better if these knex/postgres-specific errors live in their package rather than the root package.

This is a breaking change but one that is detectable via tsc so within the scope of what's allowed via minor version bump.

# How

Have claude move them. Prompt: 

> move knex-specific entity errors into the entity-database-adapter-knex package. no need for backwards
  compatibility

# Test Plan

CI
2026-10-05 10:05:23 -07:00
renovate[bot] ba74662842 chore(deps): update jest to v30.5.2 (#712)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@jest/globals](https://redirect.github.com/jestjs/jest) ([source](https://redirect.github.com/jestjs/jest/tree/HEAD/packages/jest-globals)) | [`30.5.1` → `30.5.2`](https://renovatebot.com/diffs/npm/@jest%2fglobals/30.5.1/30.5.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@jest%2fglobals/30.5.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@jest%2fglobals/30.5.1/30.5.2?slim=true) |
| [jest](https://jestjs.io/) ([source](https://redirect.github.com/jestjs/jest/tree/HEAD/packages/jest)) | [`30.5.1` → `30.5.2`](https://renovatebot.com/diffs/npm/jest/30.5.1/30.5.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/jest/30.5.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jest/30.5.1/30.5.2?slim=true) |

---

### Release Notes

<details>
<summary>jestjs/jest (@&#8203;jest/globals)</summary>

### [`v30.5.2`](https://redirect.github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3052)

[Compare Source](https://redirect.github.com/jestjs/jest/compare/v30.5.1...v30.5.2)

##### Features

- `[@jest/transform]` Strip TypeScript types with Node when no transformer claims a `.ts`, `.mts` or `.cts` file ([#&#8203;16421](https://redirect.github.com/jestjs/jest/pull/16421))

##### Fixes

- `[jest-core, jest-haste-map, jest-transform]` Keep `require('../package.json')` external when bundling, so `jest --version` and the transform and haste-map cache keys report the released version instead of the previous one ([#&#8203;16422](https://redirect.github.com/jestjs/jest/pull/16422))
- `[jest-each]` Escape a table row's keys before building the `$variable` interpolation `RegExp`, so a column name such as `count(*)` no longer fails the whole table with `Invalid regular expression`, and a `.` or `|` in a column name is matched literally ([#&#8203;16345](https://redirect.github.com/jestjs/jest/pull/16345))
- `[@jest/source-map]` Resolve absolute Windows paths in a source map's `sources` and `sourceRoot` again, instead of appending them to the transformed file's directory ([#&#8203;16439](https://redirect.github.com/jestjs/jest/pull/16439))

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-05 08:44:51 -07:00
44 changed files with 959 additions and 638 deletions

No files matched your search

+1 -1
View File
@@ -7,7 +7,7 @@ on:
env:
# renovate: datasource=github-releases depName=jdx/mise
MISE_VERSION: v2026.9.7
MISE_VERSION: v2026.10.19
jobs:
build:
+1 -1
View File
@@ -4,4 +4,4 @@ npmMinimalAgeGate: 2d
npmPreapprovedPackages:
- '@expo/*'
- 'oxlint-config-universe'
- oxlint-config-universe
+18
View File
@@ -3,6 +3,24 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
### Features
- add notAuthorizedEntity to getUserFacingDenialReason ([#732](https://github.com/expo/entity/issues/732)) ([24109be](https://github.com/expo/entity/commit/24109bec32c03b228bd35cef8bd6a379dcf7277b))
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
### Features
- add transient error for PostgreSQL lock timeouts ([#716](https://github.com/expo/entity/issues/716)) ([13ce74e](https://github.com/expo/entity/commit/13ce74e93aec0a0b0b84edd1e1e89d785a3dbf46)), closes [#714](https://github.com/expo/entity/issues/714) [#715](https://github.com/expo/entity/issues/715)
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
### Features
+1 -1
View File
@@ -1,6 +1,6 @@
{
"packages": ["packages/*"],
"npmClient": "yarn",
"version": "0.69.0",
"version": "0.72.0",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
+1 -1
View File
@@ -1,5 +1,5 @@
[tools]
node = "24.21.0"
node = "24.22.1"
[tasks.yarn]
run = "yarn install --immutable"
+6 -6
View File
@@ -23,20 +23,20 @@
},
"devDependencies": {
"@tsconfig/bases": "1.0.28",
"@types/node": "24.19.1",
"@types/node": "24.19.2",
"ctix": "2.8.2",
"jest": "30.5.1",
"jest": "30.5.2",
"lerna": "9.0.7",
"oxfmt": "0.67.0",
"oxlint": "1.82.0",
"oxfmt": "0.73.0",
"oxlint": "1.88.0",
"oxlint-config-universe": "0.2.0",
"oxlint-tsgolint": "0.25.0",
"prettier": "3.9.6",
"prettier": "3.9.10",
"typedoc": "0.28.20",
"typescript": "6.0.3"
},
"resolutions": {
"collect-v8-coverage": "^1.0.3"
},
"packageManager": "[email protected]3.0+sha512.5c20ba010c99815433e5c8453112165e673f1c7948d8d2b267f4b5e52097538658388ebc9f9580656d9b75c5cc996f990f611f99304a2197d4c56d21eea370e7"
"packageManager": "[email protected]8.1+sha512.b2e1e7524f654f2749d32b4ebcb4622473cb5bcbc485df2007e12a154e50162a4d795526768bc5f5b8f81717bfd79deb2472813d86fb5ae2eb551fa9c872b08f"
}
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-cache-adapter-local-memory",
"version": "0.69.0",
"version": "0.72.0",
"description": "Cross-request local memory cache adapter for @expo/entity",
"keywords": [
"entity"
@@ -31,7 +31,7 @@
"devDependencies": {
"@expo/entity-testing-utils": "workspace:^",
"@isaacs/ttlcache": "2.1.5",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-cache-adapter-redis",
"version": "0.69.0",
"version": "0.72.0",
"description": "Redis cache adapter for @expo/entity",
"keywords": [
"entity"
@@ -31,7 +31,7 @@
"devDependencies": {
"@expo/batcher": "1.1.2",
"@expo/entity-testing-utils": "workspace:^",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"ioredis": "5.11.1",
"ts-mockito": "2.6.1",
"typescript": "6.0.3"
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-codemod
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-codemod
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-codemod
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-codemod
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-codemod",
"version": "0.69.0",
"version": "0.72.0",
"description": "jscodeshift codemods for @expo/entity upgrades",
"keywords": [
"entity"
@@ -25,9 +25,9 @@
"test": "yarn test:all --rootDir $(pwd)"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/jscodeshift": "17.3.0",
"@types/node": "24.19.1",
"@types/node": "24.19.2",
"jscodeshift": "17.4.0",
"typescript": "6.0.3"
},
@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-database-adapter-knex-testing-utils
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-database-adapter-knex-testing-utils
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-database-adapter-knex-testing-utils
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-database-adapter-knex-testing-utils",
"version": "0.69.0",
"version": "0.72.0",
"description": "Testing utilities for applications using Entity with Knex database adapter",
"keywords": [
"entity"
@@ -27,13 +27,14 @@
"dependencies": {
"@expo/entity": "workspace:^",
"@expo/entity-database-adapter-knex": "workspace:^",
"@expo/entity-testing-utils": "workspace:^",
"invariant": "^2.2.4",
"uuid": "^14.0.0"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/invariant": "2.2.37",
"@types/node": "24.19.1",
"@types/node": "24.19.2",
"typescript": "6.0.3"
},
"peerDependencies": {
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-database-adapter-knex
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
### Features
- add transient error for PostgreSQL lock timeouts ([#716](https://github.com/expo/entity/issues/716)) ([13ce74e](https://github.com/expo/entity/commit/13ce74e93aec0a0b0b84edd1e1e89d785a3dbf46)), closes [#714](https://github.com/expo/entity/issues/714) [#715](https://github.com/expo/entity/issues/715)
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
### Features
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-database-adapter-knex",
"version": "0.69.0",
"version": "0.72.0",
"description": "Knex database adapter for @expo/entity",
"keywords": [
"entity"
@@ -27,11 +27,12 @@
},
"dependencies": {
"@expo/entity": "workspace:^",
"@expo/results": "^1.0.0",
"knex": "^3.2.9"
},
"devDependencies": {
"@expo/entity-testing-utils": "workspace:^",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"pg": "8.23.1",
"ts-mockito": "2.6.1",
"typescript": "6.0.3"
@@ -1,13 +1,4 @@
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUniqueConstraintError,
EntityDatabaseAdapterUnknownError,
ViewerContext,
} from '@expo/entity';
import { EntityDatabaseAdapterUniqueConstraintError, ViewerContext } from '@expo/entity';
import nullthrows from '@expo/nullthrows';
import { afterAll, beforeAll, beforeEach, describe, expect, it } from '@jest/globals';
import type { Knex } from 'knex';
@@ -15,6 +6,15 @@ import knex from 'knex';
import { ErrorsTestEntity } from '../__testfixtures__/ErrorsTestEntity.ts';
import { createKnexIntegrationTestEntityCompanionProvider } from '../__testfixtures__/createKnexIntegrationTestEntityCompanionProvider.ts';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterLockNotAvailableError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUnknownError,
} from '../errors/KnexEntityDatabaseAdapterError.ts';
describe('postgres errors', () => {
let knexInstance: Knex;
@@ -160,6 +160,34 @@ describe('postgres errors', () => {
).rejects.toThrow(EntityDatabaseAdapterExclusionConstraintError);
});
it('throws EntityDatabaseAdapterLockNotAvailableError when lock_timeout is exceeded', async () => {
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
const entity = await ErrorsTestEntity.creator(vc)
.setField('id', 1)
.setField('fieldNonNull', 'hello')
.createAsync();
// hold a row lock from a separate transaction while the entity update attempts to acquire it
const lockHolderTransaction = await knexInstance.transaction();
await lockHolderTransaction.raw(
'SELECT * FROM postgres_test_entities WHERE id = ? FOR UPDATE',
[entity.getID()],
);
try {
await expect(
vc.runInTransactionForDatabaseAdapterFlavorAsync('postgres', async (queryContext) => {
await queryContext.getQueryInterface().raw("SET LOCAL lock_timeout = '100ms'");
await ErrorsTestEntity.updater(entity, queryContext)
.setField('fieldNonNull', 'world')
.updateAsync();
}),
).rejects.toThrow(EntityDatabaseAdapterLockNotAvailableError);
} finally {
await lockHolderTransaction.rollback();
}
});
it('throws EntityDatabaseAdapterUnknownError otherwise', async () => {
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
await expect(
@@ -0,0 +1,163 @@
import { EntityDatabaseAdapterError, EntityErrorState } from '@expo/entity';
/**
* Error code for an entity error thrown by the knex database adapter.
* Each error code should map to a specific class of Entity error.
*/
export enum KnexEntityDatabaseAdapterErrorCode {
ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT = 'ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT',
ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN = 'ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN',
ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID = 'ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID',
ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE = 'ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE',
}
/**
* Thrown when a transient error occurrs within the database adapter.
* Transient errors may succeed if retried.
*/
export class EntityDatabaseAdapterTransientError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterTransientError';
}
get state(): EntityErrorState.TRANSIENT {
return EntityErrorState.TRANSIENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT;
}
}
/**
* Thrown when an unknown error occurrs within the database adapter.
* This is a catch-all error class for DBMS-specific errors that do not fit into other categories.
*/
export class EntityDatabaseAdapterUnknownError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterUnknownError';
}
get state(): EntityErrorState.UNKNOWN {
return EntityErrorState.UNKNOWN;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN;
}
}
/**
* Thrown when a check constraint is violated within the database adapter.
* This indicates that a value being inserted or updated does not satisfy a defined data integrity constraint.
*/
export class EntityDatabaseAdapterCheckConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterCheckConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT;
}
}
/**
* Thrown when an exclusion constraint is violated within the database adapter.
* This indicates that a value being inserted or updated conflicts with an existing value based on a defined exclusion constraint.
*/
export class EntityDatabaseAdapterExclusionConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterExclusionConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT;
}
}
/**
* Thrown when a foreign key constraint is violated within the database adapter.
* This indicates that a value being inserted, updated, or deleted references a non-existent value in a related table
* or is referenced in a related table.
*/
export class EntityDatabaseAdapterForeignKeyConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterForeignKeyConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT;
}
}
/**
* Thrown when a not-null constraint is violated within the database adapter.
* This indicates that a null value is being inserted or updated into a column that does not allow null values.
*/
export class EntityDatabaseAdapterNotNullConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterNotNullConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT;
}
}
/**
* Thrown when a pagination cursor cannot be decoded or does not match the expected pagination
* specification.
*/
export class EntityDatabaseAdapterPaginationCursorInvalidError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterPaginationCursorInvalidError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID;
}
}
/**
* Thrown when a lock on a row or table cannot be acquired (PostgreSQL error code 55P03, `lock_not_available`).
* This happens when a statement exceeds `lock_timeout` while waiting for a lock, or when a `NOWAIT`
* lock request conflicts with a lock held by another transaction.
* This error is transient since the conflicting lock is released when the other transaction completes.
*/
export class EntityDatabaseAdapterLockNotAvailableError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterLockNotAvailableError';
}
get state(): EntityErrorState.TRANSIENT {
return EntityErrorState.TRANSIENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE;
}
}
@@ -0,0 +1,76 @@
import { EntityDatabaseAdapterError, EntityErrorState } from '@expo/entity';
import { describe, expect, it } from '@jest/globals';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterLockNotAvailableError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterPaginationCursorInvalidError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUnknownError,
KnexEntityDatabaseAdapterErrorCode,
} from '../KnexEntityDatabaseAdapterError.ts';
describe('KnexEntityDatabaseAdapterError', () => {
it('instantiates all errors with correct state and code', () => {
const transientError = new EntityDatabaseAdapterTransientError('test');
expect(transientError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(transientError.state).toBe(EntityErrorState.TRANSIENT);
expect(transientError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT,
);
const unknownError = new EntityDatabaseAdapterUnknownError('test');
expect(unknownError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(unknownError.state).toBe(EntityErrorState.UNKNOWN);
expect(unknownError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN,
);
const checkError = new EntityDatabaseAdapterCheckConstraintError('test');
expect(checkError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(checkError.state).toBe(EntityErrorState.PERMANENT);
expect(checkError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT,
);
const exclusionError = new EntityDatabaseAdapterExclusionConstraintError('test');
expect(exclusionError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(exclusionError.state).toBe(EntityErrorState.PERMANENT);
expect(exclusionError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT,
);
const foreignKeyError = new EntityDatabaseAdapterForeignKeyConstraintError('test');
expect(foreignKeyError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(foreignKeyError.state).toBe(EntityErrorState.PERMANENT);
expect(foreignKeyError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT,
);
const notNullError = new EntityDatabaseAdapterNotNullConstraintError('test');
expect(notNullError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(notNullError.state).toBe(EntityErrorState.PERMANENT);
expect(notNullError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT,
);
const paginationCursorInvalidError = new EntityDatabaseAdapterPaginationCursorInvalidError(
'test',
);
expect(paginationCursorInvalidError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(paginationCursorInvalidError.state).toBe(EntityErrorState.PERMANENT);
expect(paginationCursorInvalidError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID,
);
const lockNotAvailableError = new EntityDatabaseAdapterLockNotAvailableError('test');
expect(lockNotAvailableError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(lockNotAvailableError.state).toBe(EntityErrorState.TRANSIENT);
expect(lockNotAvailableError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE,
);
});
});
@@ -1,10 +1,11 @@
import { EntityDatabaseAdapterTransientError, EntityErrorState } from '@expo/entity';
import { EntityErrorState } from '@expo/entity';
import { describe, expect, it } from '@jest/globals';
import { EntityDatabaseAdapterLockNotAvailableError } from '../KnexEntityDatabaseAdapterError.ts';
import { wrapNativePostgresCallAsync } from '../wrapNativePostgresCallAsync.ts';
describe(wrapNativePostgresCallAsync, () => {
it('classifies a PostgreSQL lock timeout as transient and preserves the cause', async () => {
it('translates a PostgreSQL lock_not_available error and preserves the cause', async () => {
const error = Object.assign(new Error('canceling statement due to lock timeout'), {
code: '55P03',
});
@@ -12,7 +13,7 @@ describe(wrapNativePostgresCallAsync, () => {
throw error;
});
await expect(result).rejects.toBeInstanceOf(EntityDatabaseAdapterTransientError);
await expect(result).rejects.toBeInstanceOf(EntityDatabaseAdapterLockNotAvailableError);
await expect(result).rejects.toMatchObject({
state: EntityErrorState.TRANSIENT,
message: error.message,
@@ -1,14 +1,16 @@
import type { EntityDatabaseAdapterError } from '@expo/entity';
import { EntityDatabaseAdapterUniqueConstraintError } from '@expo/entity';
import knex from 'knex';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterLockNotAvailableError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUniqueConstraintError,
EntityDatabaseAdapterUnknownError,
} from '@expo/entity';
import knex from 'knex';
} from './KnexEntityDatabaseAdapterError.ts';
function wrapNativePostgresError(
error: Error & { code?: string },
@@ -39,7 +41,7 @@ function translatePostgresError(
case '23P01':
return new EntityDatabaseAdapterExclusionConstraintError(error.message, error);
case '55P03':
return new EntityDatabaseAdapterTransientError(error.message, error);
return new EntityDatabaseAdapterLockNotAvailableError(error.message, error);
default:
return new EntityDatabaseAdapterUnknownError(error.message, error);
}
@@ -18,6 +18,7 @@ export * from './PostgresEntityDatabaseAdapterProvider.ts';
export * from './PostgresEntityQueryContextProvider.ts';
export * from './ReadonlyPostgresEntity.ts';
export * from './SQLOperator.ts';
export * from './errors/KnexEntityDatabaseAdapterError.ts';
export * from './errors/wrapNativePostgresCallAsync.ts';
export * from './internal/EntityKnexDataManager.ts';
export * from './internal/getKnexDataManager.ts';
@@ -1,6 +1,5 @@
import type { EntityConfiguration, EntityQueryContext, IEntityMetricsAdapter } from '@expo/entity';
import {
EntityDatabaseAdapterPaginationCursorInvalidError,
EntityMetricsCountType,
EntityMetricsLoadType,
getDatabaseFieldForEntityField,
@@ -18,6 +17,7 @@ import type {
import { NullsOrdering, OrderByOrdering } from '../BasePostgresEntityDatabaseAdapter.ts';
import { PaginationStrategy } from '../PaginationStrategy.ts';
import { SQLFragment, SQLExpression, identifier, sql, unsafeRaw } from '../SQLOperator.ts';
import { EntityDatabaseAdapterPaginationCursorInvalidError } from '../errors/KnexEntityDatabaseAdapterError.ts';
import type { DistributiveOmit, NonNullableKeys } from './utilityTypes.ts';
interface DataManagerStandardSpecification<TFields extends Record<string, any>> {
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-example
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-example
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-example
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-example
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-example",
"version": "0.69.0",
"version": "0.72.0",
"private": true,
"description": "An example integration of the @expo/entity framework",
"keywords": [
@@ -30,12 +30,12 @@
"koa": "3.2.1"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/koa": "3.0.3",
"@types/koa__cors": "5.0.1",
"@types/koa__router": "12.0.5",
"@types/supertest": "7.2.1",
"supertest": "7.2.2",
"supertest": "7.3.1",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-full-integration-tests
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-full-integration-tests
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-full-integration-tests
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-full-integration-tests
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-full-integration-tests",
"version": "0.69.0",
"version": "0.72.0",
"private": true,
"description": "Full redis and knex integration tests for the entity framework",
"keywords": [
@@ -22,7 +22,7 @@
"@expo/entity-database-adapter-knex": "workspace:^"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-ip-address-field
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-ip-address-field
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-ip-address-field
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-ip-address-field
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-ip-address-field",
"version": "0.69.0",
"version": "0.72.0",
"description": "IP address EntityField definitions for @expo/entity",
"keywords": [
"entity"
@@ -30,7 +30,7 @@
},
"devDependencies": {
"@expo/entity-testing-utils": "workspace:^",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-secondary-cache-local-memory",
"version": "0.69.0",
"version": "0.72.0",
"description": "Local memory secondary cache for @expo/entity",
"keywords": [
"entity"
@@ -32,7 +32,7 @@
"devDependencies": {
"@expo/nullthrows": "2.1.0",
"@isaacs/ttlcache": "2.1.5",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-secondary-cache-redis",
"version": "0.69.0",
"version": "0.72.0",
"description": "Redis secondary cache for @expo/entity",
"keywords": [
"entity"
@@ -30,7 +30,7 @@
},
"devDependencies": {
"@expo/nullthrows": "2.1.0",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"ioredis": "5.11.1",
"typescript": "6.0.3"
},
@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
**Note:** Version bump only for package @expo/entity-testing-utils
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-testing-utils
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-testing-utils
+6 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-testing-utils",
"version": "0.69.0",
"version": "0.72.0",
"description": "A package containing utilities for testing applications that use Entity",
"keywords": [
"entity"
@@ -26,13 +26,15 @@
},
"dependencies": {
"@expo/entity": "workspace:^",
"invariant": "^2.2.4",
"lodash-es": "^4.17.23",
"ts-mockito": "^2.6.1"
"ts-mockito": "^2.6.1",
"uuid": "^14.0.0"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/lodash-es": "4.17.12",
"@types/node": "24.19.1",
"@types/node": "24.19.2",
"typescript": "6.0.3"
},
"peerDependencies": {
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.72.0](https://github.com/expo/entity/compare/v0.71.0...v0.72.0) (2026-10-29)
### Features
- add notAuthorizedEntity to getUserFacingDenialReason ([#732](https://github.com/expo/entity/issues/732)) ([24109be](https://github.com/expo/entity/commit/24109bec32c03b228bd35cef8bd6a379dcf7277b))
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity
+5 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity",
"version": "0.69.0",
"version": "0.72.0",
"description": "A privacy-first data model",
"keywords": [
"entity"
@@ -25,19 +25,20 @@
"test": "yarn test:all --rootDir $(pwd)"
},
"dependencies": {
"@expo/nullthrows": "^2.1.0",
"@expo/results": "^1.0.0",
"dataloader": "^2.2.3",
"invariant": "^2.2.4"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/invariant": "2.2.37",
"@types/lodash-es": "4.17.12",
"@types/node": "24.19.1",
"@types/node": "24.19.2",
"lodash-es": "4.18.1",
"ts-mockito": "2.6.1",
"typescript": "6.0.3",
"uuid": "14.0.2"
"uuid": "14.0.3"
},
"engines": {
"node": ">=18"
+31 -7
View File
@@ -224,17 +224,28 @@ export abstract class EntityPrivacyPolicy<
* contributed, so the policy can select a message for a specific reason, for example "You must be a
* member of this account to view this project." when a rule skipped with a NOT_ACCOUNT_MEMBER reason.
*
* The denied entity and the evaluation context are intentionally not passed to this method. The viewer
* is not authorized to see the entity, and the evaluation context may contain it (as the previous value
* or the cascading deletion cause), so neither may influence or appear in the user-facing message.
* Rules should instead communicate what is needed through reason codes.
* The evaluation context and the denied entity are passed so that the message can be selected based
* on them (for example, the entity type or whether the denial is part of a cascading deletion). The
* viewer is not authorized for the entity, and the evaluation context may contain it (as the previous
* value) or other entities (as the cascading deletion cause), so take care that the message does not
* reveal any data that the viewer may not see. Rules should communicate what is needed through reason codes.
*
* @param _viewerContext - viewer context that was denied
* @param _evaluationContext - context in which the policy was evaluated
* @param _notAuthorizedEntity - entity for which the action was denied
* @param _action - the action that was denied
* @param _denialReason - structured, developer-facing reason for the denial
*/
protected getUserFacingDenialReason(
_viewerContext: TViewerContext,
_evaluationContext: EntityPrivacyPolicyEvaluationContext<
TFields,
TIDField,
TViewerContext,
TEntity,
TSelectedFields
>,
_notAuthorizedEntity: TEntity,
_action: EntityAuthorizationAction,
_denialReason: EntityNotAuthorizedDenialReason,
): EntityNotAuthorizedUserFacingReason | null {
@@ -523,7 +534,7 @@ export abstract class EntityPrivacyPolicy<
);
switch (result) {
case RuleEvaluationResult.DENY:
throw this.createNotAuthorizedError(viewerContext, entity, action, {
throw this.createNotAuthorizedError(viewerContext, evaluationContext, entity, action, {
type: EntityNotAuthorizedDenialType.RULE_DENIED,
rule: { ruleIndex: i, ruleName: rule.constructor.name, reasons },
skippedRules,
@@ -540,7 +551,7 @@ export abstract class EntityPrivacyPolicy<
}
}
throw this.createNotAuthorizedError(viewerContext, entity, action, {
throw this.createNotAuthorizedError(viewerContext, evaluationContext, entity, action, {
type: EntityNotAuthorizedDenialType.ALL_RULES_SKIPPED,
skippedRules,
});
@@ -548,11 +559,24 @@ export abstract class EntityPrivacyPolicy<
private createNotAuthorizedError(
viewerContext: TViewerContext,
evaluationContext: EntityPrivacyPolicyEvaluationContext<
TFields,
TIDField,
TViewerContext,
TEntity,
TSelectedFields
>,
entity: TEntity,
action: EntityAuthorizationAction,
denialReason: EntityNotAuthorizedDenialReason,
): EntityNotAuthorizedError<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
const userFacingReason = this.getUserFacingDenialReason(viewerContext, action, denialReason);
const userFacingReason = this.getUserFacingDenialReason(
viewerContext,
evaluationContext,
entity,
action,
denialReason,
);
return new EntityNotAuthorizedError<
TFields,
TIDField,
@@ -398,6 +398,13 @@ class ReasonedDenialPolicy extends EntityPrivacyPolicy<
protected override getUserFacingDenialReason(
_viewerContext: ViewerContext,
_evaluationContext: EntityPrivacyPolicyEvaluationContext<
BlahFields,
'id',
ViewerContext,
BlahEntity
>,
notAuthorizedEntity: BlahEntity,
_action: EntityAuthorizationAction,
denialReason: EntityNotAuthorizedDenialReason,
): EntityNotAuthorizedUserFacingReason | null {
@@ -407,7 +414,10 @@ class ReasonedDenialPolicy extends EntityPrivacyPolicy<
skippedRule.reasons.includes(TestSkipReason.NOT_MEMBER),
)
) {
return { code: 'MUST_BE_MEMBER', message: 'You must be a member to do this.' };
return {
code: 'MUST_BE_MEMBER',
message: `You must be a member to access this ${notAuthorizedEntity.constructor.name}.`,
};
}
return null;
}
@@ -941,7 +951,7 @@ describe(EntityPrivacyPolicy, () => {
expect(error.message).not.toContain('NOT_OWNER');
expect(error.userFacingDenialReason).toEqual({
code: 'MUST_BE_MEMBER',
message: 'You must be a member to do this.',
message: 'You must be a member to access this BlahEntity.',
});
});
@@ -9,115 +9,6 @@ export abstract class EntityDatabaseAdapterError extends EntityError {
}
}
/**
* Thrown when a transient error occurrs within the database adapter.
* Transient errors may succeed if retried.
*/
export class EntityDatabaseAdapterTransientError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterTransientError';
}
get state(): EntityErrorState.TRANSIENT {
return EntityErrorState.TRANSIENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT;
}
}
/**
* Thrown when an unknown error occurrs within the database adapter.
* This is a catch-all error class for DBMS-specific errors that do not fit into other categories.
*/
export class EntityDatabaseAdapterUnknownError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterUnknownError';
}
get state(): EntityErrorState.UNKNOWN {
return EntityErrorState.UNKNOWN;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN;
}
}
/**
* Thrown when a check constraint is violated within the database adapter.
* This indicates that a value being inserted or updated does not satisfy a defined data integrity constraint.
*/
export class EntityDatabaseAdapterCheckConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterCheckConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT;
}
}
/**
* Thrown when an exclusion constraint is violated within the database adapter.
* This indicates that a value being inserted or updated conflicts with an existing value based on a defined exclusion constraint.
*/
export class EntityDatabaseAdapterExclusionConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterExclusionConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT;
}
}
/**
* Thrown when a foreign key constraint is violated within the database adapter.
* This indicates that a value being inserted, updated, or deleted references a non-existent value in a related table
* or is referenced in a related table.
*/
export class EntityDatabaseAdapterForeignKeyConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterForeignKeyConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT;
}
}
/**
* Thrown when a not-null constraint is violated within the database adapter.
* This indicates that a null value is being inserted or updated into a column that does not allow null values.
*/
export class EntityDatabaseAdapterNotNullConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterNotNullConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT;
}
}
/**
* Thrown when a unique constraint is violated within the database adapter.
* This indicates that a value being inserted or updated duplicates an existing value in a column or set of columns
@@ -231,17 +122,3 @@ export class EntityDatabaseAdapterExcessiveDeleteResultError extends EntityDatab
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT;
}
}
export class EntityDatabaseAdapterPaginationCursorInvalidError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterPaginationCursorError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID;
}
}
+3 -9
View File
@@ -8,18 +8,13 @@ export enum EntityErrorState {
}
/**
* Error code for an entity error. Each error code should map to a specific class of Entity error.
* Error code for an entity error defined in this package. Each error code should map to a specific class of Entity error.
* Other packages that define entity errors (such as database adapter implementations) define their own error code enums.
*/
export enum EntityErrorCode {
ERR_ENTITY_NOT_AUTHORIZED = 'ERR_ENTITY_NOT_AUTHORIZED',
ERR_ENTITY_NOT_FOUND = 'ERR_ENTITY_NOT_FOUND',
ERR_ENTITY_INVALID_FIELD_VALUE = 'ERR_ENTITY_INVALID_FIELD_VALUE',
ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT = 'ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT',
ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN = 'ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN',
ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT',
ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT',
@@ -27,7 +22,6 @@ export enum EntityErrorCode {
ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT',
ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT',
ERR_ENTITY_CACHE_ADAPTER_TRANSIENT = 'ERR_ENTITY_CACHE_ADAPTER_TRANSIENT',
ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID = 'ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID',
}
/**
@@ -39,7 +33,7 @@ export abstract class EntityError extends Error {
}
public abstract readonly state: EntityErrorState;
public abstract readonly code: EntityErrorCode;
public abstract readonly code: string;
constructor(message: string, cause?: Error) {
super(message, { cause });
@@ -1,20 +1,13 @@
import { describe, expect, it } from '@jest/globals';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterEmptyInsertResultError,
EntityDatabaseAdapterEmptyUpdateResultError,
EntityDatabaseAdapterError,
EntityDatabaseAdapterExcessiveDeleteResultError,
EntityDatabaseAdapterExcessiveInsertResultError,
EntityDatabaseAdapterExcessiveUpdateResultError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterPaginationCursorInvalidError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUniqueConstraintError,
EntityDatabaseAdapterUnknownError,
} from '../EntityDatabaseAdapterError.ts';
import { EntityErrorCode, EntityErrorState } from '../EntityError.ts';
@@ -22,34 +15,6 @@ describe(EntityDatabaseAdapterError, () => {
// necessary for coverage within the entity package since these errors are
// currently only ever instantiated by database adapter implementations
it('instantiates all errors with correct state and code', () => {
const transientError = new EntityDatabaseAdapterTransientError('test');
expect(transientError.state).toBe(EntityErrorState.TRANSIENT);
expect(transientError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT);
const unknownError = new EntityDatabaseAdapterUnknownError('test');
expect(unknownError.state).toBe(EntityErrorState.UNKNOWN);
expect(unknownError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN);
const checkError = new EntityDatabaseAdapterCheckConstraintError('test');
expect(checkError.state).toBe(EntityErrorState.PERMANENT);
expect(checkError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT);
const exclusionError = new EntityDatabaseAdapterExclusionConstraintError('test');
expect(exclusionError.state).toBe(EntityErrorState.PERMANENT);
expect(exclusionError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT,
);
const foreignKeyError = new EntityDatabaseAdapterForeignKeyConstraintError('test');
expect(foreignKeyError.state).toBe(EntityErrorState.PERMANENT);
expect(foreignKeyError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT,
);
const notNullError = new EntityDatabaseAdapterNotNullConstraintError('test');
expect(notNullError.state).toBe(EntityErrorState.PERMANENT);
expect(notNullError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT);
const uniqueError = new EntityDatabaseAdapterUniqueConstraintError('test');
expect(uniqueError.state).toBe(EntityErrorState.PERMANENT);
expect(uniqueError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT);
@@ -83,13 +48,5 @@ describe(EntityDatabaseAdapterError, () => {
expect(excessiveDeleteError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT,
);
const paginationCursorInvalidError = new EntityDatabaseAdapterPaginationCursorInvalidError(
'test',
);
expect(paginationCursorInvalidError.state).toBe(EntityErrorState.PERMANENT);
expect(paginationCursorInvalidError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID,
);
});
});
+2 -2
View File
@@ -1,13 +1,13 @@
version: '2'
services:
redis:
image: redis@sha256:6f81e8915c60b065a524e6967e0ad1c639ba6efa84d669f823683ea04d9150ee
image: redis@sha256:97ec88159e6d7cfb5ddef9015386087d58a912de80112f06ebdfa78fa5989901
ports:
- '${REDIS_PORT}:6379'
volumes:
- redis_data:/data
postgres:
image: postgres:18@sha256:5a5a84b19854a9ffaa54082c166ff4ec27473a361e496e5ea167f298f2da9722
image: postgres:18@sha256:edb0c08dc33befd0262ab3b5cf1c4f3f8cfd8b09e88c05b45adee29d6761ddb6
ports:
- '${PGPORT}:5432'
volumes:
Generated
+402 -393
View File
File diff suppressed because it is too large. Load diff