Skip to content

fix(backend): flag regex prerelease versions#9500

Merged
jdx merged 2 commits intomainfrom
codex/flag-regex-prereleases
May 1, 2026
Merged

fix(backend): flag regex prerelease versions#9500
jdx merged 2 commits intomainfrom
codex/flag-regex-prereleases

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented May 1, 2026

Summary

  • add an opt-in mark_prereleases_from_version_pattern backend hook for version sources that do not already carry prerelease metadata
  • enable regex stamping only for the metadata-free backends that return plain version lists through mise
  • keep metadata-aware paths authoritative; Java continues to set prerelease from its own local regex path because it bypasses the shared backend cache
  • update ls-remote --prerelease help/generated docs to describe metadata and opt-in regex detection

Why

mise-versions should be able to consume prerelease metadata from mise, but mise should not overwrite or second-guess backends that already provide an explicit prerelease flag. This keeps #144 as the immediate hosted-data fix while making mise send the flag for legacy/plain-list backends where regex detection is still the only available signal.

PR feedback addressed

  • clarified stale --prerelease help text and regenerated usage/manpage docs
  • skipped regex matching in mark_prerelease when upstream already flagged a version as prerelease
  • removed conda's dead mark_prereleases_from_version_pattern override while keeping its direct stamping in the custom cache-bypass path

Validation

  • cargo fmt --all --check
  • cargo test -q test_mark_prerelease_flags_regex_matches
  • cargo test -q test_filter_cached_prereleases
  • cargo build -q
  • mise run render:usage
  • mise run render:mangen
  • mise run render:fig (reverted unrelated generated collapse; kept the targeted completion text update)
  • commit hook: hk lint stack, including cargo check --all-features
  • MISE_USE_VERSIONS_HOST=0 target/debug/mise ls-remote --prerelease --json gradle | jq -c 'map(select(.version == "9.6.0-M1" or .version == "9.5.0"))'
  • MISE_USE_VERSIONS_HOST=0 target/debug/mise ls-remote --json gradle | jq -c 'map(select(.version | test("-M|-RC"))) | length'
  • MISE_USE_VERSIONS_HOST=0 target/debug/mise ls-remote --prerelease --json java | jq 'map(select(has("prerelease"))) | length'

This PR description was generated by an AI coding assistant.


Note

Medium Risk
Changes how remote version lists are cached/filtered for many backends by stamping VersionInfo.prerelease from a regex, which could affect latest resolution and ls-remote output if versions are misclassified.

Overview
Extends pre-release handling to backends that don’t provide upstream prerelease metadata by adding a Backend::mark_prereleases_from_version_pattern hook and a shared mark_prerelease helper that stamps regex-shaped versions before they enter the remote-versions cache.

Enables this opt-in for several metadata-free backends (e.g. asdf, cargo, npm, pipx, http, s3, ubi, vfox, etc.) and updates conda’s cache-bypass path to apply the same stamping+filtering logic. java now explicitly sets prerelease when building its version list.

Updates ls-remote --prerelease help text and regenerates usage/manpage/completion docs to reflect that prereleases can come from upstream metadata or regex-based detection.

Reviewed by Cursor Bugbot for commit 6e8d626. Bugbot is set up for automated code reviews on this repo. Configure here.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 1, 2026

Greptile Summary

This PR adds an opt-in mark_prereleases_from_version_pattern() backend hook and a shared mark_prerelease() helper that stamps VersionInfo.prerelease via the existing VERSION_REGEX before versions are cached, enabling --prerelease filtering for metadata-free backends (asdf, cargo, npm, pipx, gem, go, http/s3, ubi, vfox, dotnet, spm). Conda and Java use equivalent direct-stamping in their cache-bypassing paths. The versions-host early-return path intentionally skips stamping — the validation commands in the description all use MISE_USE_VERSIONS_HOST=0, so the default user flow (versions host enabled) is unchanged pending a versions-host-side update.

Confidence Score: 5/5

Safe to merge; logic is gated per-backend, the guard in mark_prerelease prevents double-stamping, and the versions-host limitation is intentional and pre-existing.

No P0 or P1 issues found. The versions-host bypass (flagged in a previous review comment) is a documented, intentional design choice — not a regression introduced by this PR. New unit tests cover the stamping and filtering behaviour. The mark_prerelease guard correctly preserves upstream-authoritative flags.

No files require special attention.

Important Files Changed

Filename Overview
src/backend/mod.rs Adds mark_prereleases_from_version_pattern() trait hook (default false), mark_prerelease() helper, and applies it inside the _list_remote_versions fallback path; versions-host early-return path is intentionally left un-stamped per the PR design.
src/backend/conda.rs Cache-bypassing list_remote_versions_with_info now unconditionally applies mark_prerelease + filter_cached_prereleases, correctly handling conda's non-shared-cache path.
src/plugins/core/java.rs Explicitly stamps prerelease using Java's local VERSION_REGEX inside _list_remote_versions, which is intentional since Java bypasses the shared cache and uses its own slightly-different regex.
src/backend/asdf.rs Blanket opt-in for all ASDF plugins; individual plugins with non-SemVer versioning may get false-positive prerelease stamps, but this is an accepted trade-off of regex-based detection.
src/versions_host.rs Comment-only update to VersionEntry.prerelease doc; no logic changes.
src/cli/ls_remote.rs Doc string updates for --prerelease flag to reflect broader backend coverage; no logic changes.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[list_remote_versions_with_info] --> B{use_versions_host?}
    B -- yes --> C[versions_host::list_versions]
    C -- Some(versions) --> D[early return\nno mark_prerelease applied]
    C -- None/Err --> E[_list_remote_versions]
    B -- no --> E
    E --> F{mark_prereleases_from_version_pattern?}
    F -- true --> G[mark_prerelease\nVERSION_REGEX stamp]
    F -- false --> H[pass through unchanged]
    G --> I[filter valid VersionType versions]
    H --> I
    I --> J[cache]
    J --> K[filter_cached_prereleases\nwant_prereleases?]
    K -- false --> L[drop prerelease=true entries]
    K -- true --> M[return all versions]
Loading

Reviews (5): Last reviewed commit: "fix(conda): apply prerelease filter in l..." | Re-trigger Greptile

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a mechanism to automatically flag pre-release versions using a regex pattern before they are cached, ensuring consistent filtering across different backends. The changes include adding a mark_prerelease helper function and integrating it into the version listing pipeline. Feedback suggests extending this logic to the versions_host path for consistency, improving Java-specific pre-release detection for "ea" versions, and optimizing the mark_prerelease helper to skip regex checks for versions already flagged by upstream metadata.

Comment thread src/backend/mod.rs Outdated
._list_remote_versions(config)
.await?
.into_iter()
.map(mark_prerelease)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

While adding mark_prerelease here correctly flags versions fetched directly from the backend, the same logic appears to be missing from the versions_host path earlier in this function (around line 823 in the full file).

If versions_host::list_versions returns versions that haven't been stamped by the host yet, they will bypass this heuristic and enter the cache with prerelease: false, causing them to show up even when the user hasn't opted into pre-releases. Consider applying mark_prerelease to the host results as well to ensure consistent behavior.

Comment thread src/plugins/core/java.rs Outdated
.map(|(v, m)| VersionInfo {
version: v.clone(),
created_at: m.created_at.clone(),
prerelease: VERSION_REGEX.is_match(&v),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The local VERSION_REGEX in this file does not include the -ea pattern, which means Java Early Access versions (e.g., 21-ea+23) will not be correctly flagged as pre-releases.

Since the JavaPlugin already distinguishes between GA and EA release types, it's safer and more accurate to flag all versions as pre-releases when release_type is "ea".

Suggested change
prerelease: VERSION_REGEX.is_match(&v),
prerelease: release_type == "ea" || VERSION_REGEX.is_match(&v),

Comment thread src/backend/mod.rs
Comment on lines +2366 to +2371
pub(crate) fn mark_prerelease(mut version: VersionInfo) -> VersionInfo {
if VERSION_REGEX.is_match(&version.version) {
version.prerelease = true;
}
version
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This helper can be slightly optimized to avoid unnecessary regex matching for versions that have already been flagged as pre-releases by the upstream backend (e.g., via GitHub API metadata).

Suggested change
pub(crate) fn mark_prerelease(mut version: VersionInfo) -> VersionInfo {
if VERSION_REGEX.is_match(&version.version) {
version.prerelease = true;
}
version
}
pub(crate) fn mark_prerelease(mut version: VersionInfo) -> VersionInfo {
if !version.prerelease && VERSION_REGEX.is_match(&version.version) {
version.prerelease = true;
}
version
}

@jdx jdx force-pushed the codex/flag-regex-prereleases branch from 0df4835 to 0e0e62f Compare May 1, 2026 00:24
Comment thread src/backend/conda.rs Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 1, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 x -- echo 23.9 ± 0.4 23.2 25.5 1.00
mise x -- echo 24.9 ± 3.9 23.8 110.8 1.04 ± 0.16

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 env 23.7 ± 0.6 22.7 32.1 1.00
mise env 24.1 ± 0.5 23.2 25.8 1.02 ± 0.03

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 hook-env 24.1 ± 0.4 23.4 27.6 1.00
mise hook-env 24.4 ± 0.3 23.8 26.0 1.01 ± 0.02

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.28 ls 24.6 ± 0.3 24.0 25.9 1.00
mise ls 25.1 ± 0.6 24.5 35.2 1.02 ± 0.03

xtasks/test/perf

Command mise-2026.4.28 mise Variance
install (cached) 161ms 164ms -1%
ls (cached) 82ms 84ms -2%
bin-paths (cached) 83ms 84ms -1%
task-ls (cached) 784ms 783ms +0%

@jdx jdx force-pushed the codex/flag-regex-prereleases branch from fca88b2 to b75b618 Compare May 1, 2026 01:37
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit b75b618. Configure here.

Comment thread src/backend/conda.rs Outdated
Conda's `list_remote_versions_with_info` override stamps prerelease via
`mark_prerelease` but bypassed the read-time `filter_cached_prereleases`
that the default trait path applies. Versions matching the prerelease
regex were returned even when the user hadn't opted in via
`--prerelease` or `MISE_PRERELEASES=1`. Resolve tool opts and filter
after stamping so conda matches the default behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@jdx jdx merged commit a073b8e into main May 1, 2026
37 checks passed
@jdx jdx deleted the codex/flag-regex-prereleases branch May 1, 2026 11:45
jdx added a commit that referenced this pull request May 3, 2026
The `([abc])[0-9]+` alternative in the shared `VERSION_REGEX` was
unanchored, so it false-positived on any `a`/`b`/`c` followed by a
digit anywhere in a version string — including the random hex hash
inside Go pseudo-versions (e.g. `c1` inside `f149714c1d54`).

After #9500 enabled `mark_prereleases_from_version_pattern: true` for
the `go` backend, this caused `mise install go:.../@latest` to filter
out the only available version for paths whose latest is a
pseudo-version, e.g. `go:github.com/go-kratos/kratos/cmd/kratos/v2`.

The rule itself is PEP 440-specific (Python's `aN`/`bN`/`cN` shorthand)
and shouldn't have been in the general regex at all. Move it into a
new `PEP440_PRERELEASE_REGEX` consulted only by the `pipx` backend —
non-Python backends like `go`, `npm`, `cargo`, GitHub releases, etc.
would otherwise false-positive on hex hashes / short SHAs and other
incidental `[abc]\d` substrings.

The new regex is also anchored — `[abc][0-9]+` must be at end-of-string
or followed by a non-`[a-z0-9]` char — so even within pipx it won't
match hash-shaped identifiers.

`pipx` applies the rule itself in two places: stamping prerelease
versions in `_list_remote_versions` (so the cache reflects it), and
overriding `fuzzy_match_filter` to drop them from match results when
the user hasn't opted in to prereleases.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
jdx added a commit that referenced this pull request May 3, 2026
The `([abc])[0-9]+` alternative in the shared `VERSION_REGEX` was
unanchored, so it false-positived on any `a`/`b`/`c` followed by a
digit anywhere in a version string — including the random hex hash
inside Go pseudo-versions (e.g. `c1` inside `f149714c1d54`).

After #9500 enabled `mark_prereleases_from_version_pattern: true` for
the `go` backend, this caused `mise install go:.../@latest` to filter
out the only available version for paths whose latest is a
pseudo-version, e.g. `go:github.com/go-kratos/kratos/cmd/kratos/v2`.

The rule itself is PEP 440-specific (Python's `aN`/`bN`/`cN` shorthand)
and shouldn't have been in the general regex at all. Move it into a
new `PEP440_PRERELEASE_REGEX` consulted only by the `pipx` backend —
non-Python backends like `go`, `npm`, `cargo`, GitHub releases, etc.
would otherwise false-positive on hex hashes / short SHAs and other
incidental `[abc]\d` substrings.

The new regex is also anchored — `[abc][0-9]+` must be at end-of-string
or followed by a non-`[a-z0-9]` char — so even within pipx it won't
match hash-shaped identifiers.

`pipx` applies the rule itself in two places: stamping prerelease
versions in `_list_remote_versions` (so the cache reflects it), and
overriding `fuzzy_match_filter` to drop them from match results when
the user hasn't opted in to prereleases.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
jdx added a commit that referenced this pull request May 3, 2026
The `([abc])[0-9]+` alternative in the shared `VERSION_REGEX` was
unanchored, so it false-positived on any `a`/`b`/`c` followed by a
digit anywhere in a version string — including the random hex hash
inside Go pseudo-versions (e.g. `c1` inside `f149714c1d54`).

After #9500 enabled `mark_prereleases_from_version_pattern: true` for
the `go` backend, this caused `mise install go:.../@latest` to filter
out the only available version for paths whose latest is a
pseudo-version, e.g. `go:github.com/go-kratos/kratos/cmd/kratos/v2`.

The rule itself is PEP 440-specific (Python's separator-less
alpha/beta/rc shorthand) and shouldn't have been in the general regex.
Move it into a new `PEP440_PRERELEASE_REGEX` consulted only by the
Python-flavored backends — `pipx` and the `python` core plugin. Other
backends would otherwise false-positive on hex hashes / short SHAs.

The new regex is grounded in the canonical PEP 440 grammar,
`[N!]N(.N)*[{a|b|rc}N][.postN][.devN]`: the prerelease segment must
follow the release segment, so the regex requires a leading digit.
`c` is included as PEP 440's recognized alternate spelling for `rc`.
A trailing `(?:$|[^a-z0-9])` boundary keeps it from matching inside
hex identifiers even when those start with a digit.

Both Python-flavored backends share the logic via a new
`fuzzy_match_versions_pep440` helper. `pipx` additionally stamps the
flag on its `VersionInfo` cache entries so `prerelease=true` reflects
upstream metadata as well as fuzzy-match filtering.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
jdx added a commit that referenced this pull request May 3, 2026
The `([abc])[0-9]+` alternative in the shared `VERSION_REGEX` was
unanchored, so it false-positived on any `a`/`b`/`c` followed by a
digit anywhere in a version string — including the random hex hash
inside Go pseudo-versions (e.g. `c1` inside `f149714c1d54`).

After #9500 enabled `mark_prereleases_from_version_pattern: true` for
the `go` backend, this caused `mise install go:.../@latest` to filter
out the only available version for paths whose latest is a
pseudo-version, e.g. `go:github.com/go-kratos/kratos/cmd/kratos/v2`.

The rule itself is PEP 440-specific (Python's separator-less
alpha/beta/rc shorthand) and shouldn't have been in the general regex.
Move it into a new `PEP440_PRERELEASE_REGEX` consulted only by the
Python-flavored backends — `pipx` and the `python` core plugin. Other
backends would otherwise false-positive on hex hashes / short SHAs.

The new regex is grounded in the canonical PEP 440 grammar,
`[N!]N(.N)*[{a|b|rc}N][.postN][.devN]`: the prerelease segment must
follow the release segment, so the regex requires a leading digit.
`c` is included as PEP 440's recognized alternate spelling for `rc`.
A trailing `(?:$|[^a-z0-9])` boundary keeps it from matching inside
hex identifiers even when those start with a digit.

Both Python-flavored backends share the logic via a new
`fuzzy_match_versions_pep440` helper. `pipx` additionally stamps the
flag on its `VersionInfo` cache entries so `prerelease=true` reflects
upstream metadata as well as fuzzy-match filtering.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
jdx added a commit that referenced this pull request May 3, 2026
…9558)

## Summary

Two regressions visible in the release PR (#9485):
- `mise install go:.../@latest` returns "no versions found" when the
latest is a Go pseudo-version (e.g.
`go:github.com/go-kratos/kratos/cmd/kratos/v2`) — the e2e-0 /
`backend/test_go_install_slow` failure.
- (After narrowing the rule too aggressively in earlier revs of this PR:
`mise latest python` returned `3.15.0a8` instead of a stable. Fixed
below.)

## Cause

The `([abc])[0-9]+` alternative in the shared `VERSION_REGEX` was
unanchored, so it false-positived on any `a`/`b`/`c` followed by a digit
anywhere in a string — including the random hex hash inside Go
pseudo-versions (e.g. `c1` inside `f149714c1d54`).

#9500 enabled `mark_prereleases_from_version_pattern: true` for the `go`
backend on May 1, which is what made it user-visible — the regex was
already over-permissive but no Go-flavored input had been feeding it
before.

## Fix

The rule is PEP 440-specific (Python's separator-less alpha/beta/rc
shorthand). Move it out of the general regex into
`PEP440_PRERELEASE_REGEX` and consult it only from Python-flavored
backends.

- `VERSION_REGEX` (in `src/plugins/mod.rs`): drop the `([abc])[0-9]+`
alternative.
- `PEP440_PRERELEASE_REGEX` (new):
`(?i)[0-9](?:a|b|c|rc)[0-9]+(?:\$|[^a-z0-9])` — grounded in PEP 440's
canonical grammar `[N!]N(.N)*[{a|b|rc}N][.postN][.devN]`. The leading
digit anchors the prerelease segment to follow the release segment (so
it can't trigger inside arbitrary identifiers); `c` is included as PEP
440's recognized alternate spelling for `rc`; the trailing boundary
stops it from matching inside hex hashes even when those start with a
digit.
- `pipx`:
- Stamps PEP 440 prereleases on `VersionInfo` in `_list_remote_versions`
so the cache reflects it.
  - Overrides `fuzzy_match_filter` to drop them from match results.
- `python` core plugin: same `fuzzy_match_filter` override
(`python-build` returns `3.15.0a8`-style alphas).
- Both share a new `fuzzy_match_versions_pep440` helper in
`src/backend/mod.rs` so the override is one line each.

## Test plan

- [x] `cargo test test_pep440_prerelease_regex` (new) — Python suffixes
match, Go pseudo-versions and bare-`b` identifiers don't, `.post`
doesn't.
- [x] `cargo test test_version_regex_filters_prerelease` — confirms PEP
440 cases now negative on the general regex.
- [x] `cargo test test_mark_prerelease_flags_regex_matches` — added a Go
pseudo-version case and a PEP 440 case (both should *not* be flagged by
the general path).
- [x] `cargo test test_fuzzy_match_versions_*`,
`test_filter_cached_prereleases_*`, `pipx::tests::*`.
- [x] Local repro: `mise ls-remote
'go:github.com/go-kratos/kratos/cmd/kratos/v2'` returns
`2.0.0-20260404020628-f149714c1d54`.
- [x] Local repro: `mise latest python` returns `3.14.4` (was `3.15.0a8`
after the earlier rev of this PR).
- [ ] Wait on CI for `e2e-0 / test_go_install_slow` and `e2e-6 /
test_latest`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Adjusts prerelease detection and fuzzy version resolution logic, which
can change what versions are considered installable/latest across
multiple backends; mistakes could hide valid versions or surface
prereleases unexpectedly.
> 
> **Overview**
> Fixes prerelease filtering regressions by removing the unanchored
`([abc])[0-9]+` clause from the shared `VERSION_REGEX` (which was
incorrectly flagging strings like Go pseudo-versions) and introducing a
new Python-scoped `PEP440_PRERELEASE_REGEX`.
> 
> Python-flavored backends (`pipx` and the core `python` plugin) now
apply PEP 440 prerelease handling explicitly: `pipx` stamps PEP 440
alphas/betas/rcs onto cached `VersionInfo.prerelease`, and both backends
override fuzzy matching via a new shared helper
`fuzzy_match_versions_pep440` so `latest`/prefix queries skip
`3.15.0a8`-style versions unless explicitly requested.
> 
> Adds focused tests to ensure Go pseudo-versions are not filtered by
the general regex and that PEP 440 prerelease detection works only where
intended.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
287f01d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
mise-en-dev added a commit that referenced this pull request May 3, 2026
### 🚀 Features

- **(conda)** graduate conda backend out of experimental by @jdx in
[#9544](#9544)
- **(deps)** Add dart and flutter providers by @tjarvstrand in
[#9505](#9505)
- **(registry)** add neo4j by @mnm364 in
[#9525](#9525)
- **(registry)** add rustfs by @mnm364 in
[#9530](#9530)
- **(task)** support exclusion patterns in task sources by
@jlarmstrongiv in [#9496](#9496)
- **(vfox)** add stat function to lua file module by @esteve in
[#9497](#9497)

### 🐛 Bug Fixes

- **(backend)** flag regex prerelease versions by @jdx in
[#9500](#9500)
- **(backend)** mark -nightly/-canary/-experimental as prereleases by
@jdx in [#9523](#9523)
- **(backend)** suppress no-versions warning for unresolved-latest
backends by @jdx in [#9548](#9548)
- **(backend)** include dotnet prereleases from package flags by @jdx in
[#9551](#9551)
- **(backend)** scope PEP 440 prerelease detection to Python backends by
@jdx in [#9558](#9558)
- **(cargo)** Apply install_env during cargo install by @c22 in
[#9502](#9502)
- **(copr)** drop epel-9 chroots since rust >= 1.91 is unavailable by
@jdx in [#9484](#9484)
- **(github)** skip attestations on non-default api_url by @jdx in
[#9486](#9486)
- **(github)** retry ip allow list errors without auth by @risu729 in
[#9506](#9506)
- **(http)** update versions host tracking endpoint by @jdx in
[#9527](#9527)
- **(install)** don't warn for configured tools when version is passed
via CLI by @jdx in [#9522](#9522)
- **(install)** refresh latest before installing missing tools by @jdx
in [#9545](#9545)
- **(install)** don't cache nonexistent install paths by @jdx in
[#9553](#9553)
- **(lockfile)** don't propagate ad-hoc CLI overrides into the project
lockfile by @jdx in [#9562](#9562)
- **(plugin)** detect plugin types after cloning by @risu729 in
[#9540](#9540)
- **(release)** pass --no-git-checks to aube publish by @jdx in
[#9483](#9483)
- **(task)** convert PATH to MSYS Unix form when spawning POSIX shells
on Windows by @JamBalaya56562 in
[#9547](#9547)

### 📚 Documentation

- **(contributing)** require popularity check for registry PRs by @jdx
in
[7bbeebe](7bbeebe)
- **(watch)** update pitchfork domain to en.dev by @risu729 in
[#9536](#9536)
- document ghtkn GitHub token setup by @jdx in
[#9546](#9546)
- clarify registry backend acceptance policy by @jdx in
[#9543](#9543)
- Change exec command to use bash for variable echo by @kuboon in
[#9567](#9567)

### 🧪 Testing

- **(e2e)** run test-tool targets in parallel by @jdx in
[#9564](#9564)
- **(e2e)** run tests in parallel by @jdx in
[#9563](#9563)
- **(e2e)** bind-mount /tmp on disk and surface failed tests in CI
summary by @jdx in [#9570](#9570)
- **(tasks)** migrate test_task_help atask to usage field by @jdx in
[#9549](#9549)

### 📦️ Dependency Updates

- update fedora:45 docker digest to 8b838b3 by @renovate[bot] in
[#9507](#9507)
- update ghcr.io/jdx/mise:deb docker digest to f02194c by @renovate[bot]
in [#9509](#9509)
- update taiki-e/install-action digest to 7769b73 by @renovate[bot] in
[#9512](#9512)
- update ghcr.io/jdx/mise:alpine docker digest to 581f8a8 by
@renovate[bot] in [#9508](#9508)
- update rust crate ctor to v0.10.1 by @renovate[bot] in
[#9515](#9515)
- update ghcr.io/jdx/mise:rpm docker digest to a5c9655 by @renovate[bot]
in [#9510](#9510)
- update rust docker digest to a9cfb75 by @renovate[bot] in
[#9511](#9511)
- update rust crate age to v0.11.3 by @renovate[bot] in
[#9514](#9514)
- update rust crate jiff to v0.2.24 by @renovate[bot] in
[#9516](#9516)
- update dependency vitepress-plugin-tabs to ^0.9.0 by @renovate[bot] in
[#9518](#9518)
- update autofix-ci/action action to v1.3.4 by @renovate[bot] in
[#9513](#9513)
- update rust crate usage-lib to v3.2.1 by @renovate[bot] in
[#9517](#9517)
- update apple-actions/import-codesign-certs action to v7 by
@renovate[bot] in [#9519](#9519)
- update taiki-e/install-action digest to 51cd0b8 by @renovate[bot] in
[#9531](#9531)
- exclude taiki-e/install-action from renovate by @jdx in
[#9532](#9532)
- update rust crate blake3 to v1.8.5 by @renovate[bot] in
[#9533](#9533)

### 📦 Registry

- enable shellcheck on windows by @zeitlinger in
[#9487](#9487)
- add google-java-format by @zeitlinger in
[#9488](#9488)
- add expert
([aqua:expert-lsp/expert](https://github.com/expert-lsp/expert)) by
@AlternateRT in [#9498](#9498)
- update entry for checkmake by @eread in
[#9504](#9504)
- add systemctl-tui
([aqua:rgwood/systemctl-tui](https://github.com/rgwood/systemctl-tui))
by @2xdevv in [#9521](#9521)
- add codon by @3w36zj6 in
[#9538](#9538)
- add tool yr (backend:github:VirusTotal/yara-x) by @adam-moss in
[#9542](#9542)
- add tool betterleaks (backend:aqua/betterleaks/betterleaks) by
@adam-moss in [#9541](#9541)
- add `git-filter-repo` by @garysassano in
[#9550](#9550)
- add umoci
([aqua:opencontainers/umoci](https://github.com/opencontainers/umoci))
by @2xdevv in [#9555](#9555)
- add aqua backend for elixir-ls by @AlternateRT in
[#9557](#9557)
- deny inline backend options by @risu729 in
[#9565](#9565)

### Chore

- **(ci)** fail registry tests without summary by @jdx in
[#9559](#9559)
- **(ci)** use !cancelled() instead of always() for test-ci aggregator
by @jdx in [#9569](#9569)
- **(ci)** use namespace runners for ci jobs by @jdx in
[#9561](#9561)
- **(config)** deprecate shorthands_file setting by @risu729 in
[#9534](#9534)
- **(docs)** remove shrill.en.dev analytics script by @jdx in
[#9539](#9539)
- **(release)** replace bc with awk in release-plz star formatting by
@jdx in
[d7f177f](d7f177f)
- bump hk to 1.44.3 by @jdx in
[#9493](#9493)
- invert CLAUDE.md/AGENTS.md so AGENTS.md is canonical by @jdx in
[#9560](#9560)
- set dev profile debug to 1 by @jdx in
[#9572](#9572)

### New Contributors

- @kuboon made their first contribution in
[#9567](#9567)
- @AlternateRT made their first contribution in
[#9557](#9557)
- @2xdevv made their first contribution in
[#9555](#9555)
- @adam-moss made their first contribution in
[#9541](#9541)
- @jlarmstrongiv made their first contribution in
[#9496](#9496)
- @tjarvstrand made their first contribution in
[#9505](#9505)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant