fix(backend): flag regex prerelease versions#9500
Conversation
Greptile SummaryThis PR adds an opt-in Confidence Score: 5/5Safe 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
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]
Reviews (5): Last reviewed commit: "fix(conda): apply prerelease filter in l..." | Re-trigger Greptile |
There was a problem hiding this comment.
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.
| ._list_remote_versions(config) | ||
| .await? | ||
| .into_iter() | ||
| .map(mark_prerelease) |
There was a problem hiding this comment.
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.
| .map(|(v, m)| VersionInfo { | ||
| version: v.clone(), | ||
| created_at: m.created_at.clone(), | ||
| prerelease: VERSION_REGEX.is_match(&v), |
There was a problem hiding this comment.
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".
| prerelease: VERSION_REGEX.is_match(&v), | |
| prerelease: release_type == "ea" || VERSION_REGEX.is_match(&v), |
| pub(crate) fn mark_prerelease(mut version: VersionInfo) -> VersionInfo { | ||
| if VERSION_REGEX.is_match(&version.version) { | ||
| version.prerelease = true; | ||
| } | ||
| version | ||
| } |
There was a problem hiding this comment.
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).
| 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 | |
| } |
0df4835 to
0e0e62f
Compare
Hyperfine Performance
|
| 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% |
fca88b2 to
b75b618
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ 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.
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]>
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]>
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]>
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]>
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]>
…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]>
### 🚀 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)

Summary
mark_prereleases_from_version_patternbackend hook for version sources that do not already carry prerelease metadatals-remote --prereleasehelp/generated docs to describe metadata and opt-in regex detectionWhy
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
--prereleasehelp text and regenerated usage/manpage docsmark_prereleasewhen upstream already flagged a version as prereleasemark_prereleases_from_version_patternoverride while keeping its direct stamping in the custom cache-bypass pathValidation
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.prereleasefrom a regex, which could affectlatestresolution andls-remoteoutput 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_patternhook and a sharedmark_prereleasehelper 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 updatesconda’s cache-bypass path to apply the same stamping+filtering logic.javanow explicitly setsprereleasewhen building its version list.Updates
ls-remote --prereleasehelp 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.