Skip to content

fix(plugin): detect plugin types after cloning#9540

Merged
jdx merged 2 commits intojdx:mainfrom
risu729:codex/plugin-type-detection
May 2, 2026
Merged

fix(plugin): detect plugin types after cloning#9540
jdx merged 2 commits intojdx:mainfrom
risu729:codex/plugin-type-detection

Conversation

@risu729
Copy link
Copy Markdown
Contributor

@risu729 risu729 commented May 2, 2026

Summary

  • remove URL-name plugin type heuristics for unprefixed plugin config and installs
  • detect asdf/vfox/vfox-backend plugins from cloned plugin files (metadata.lua, hooks/backend_install.lua, bin/list-all)
  • update install state and clear backend cache after plugin clone so commands can continue with the detected backend
  • refresh plugin-backed latest and ls-remote backends after auto-install
  • add e2e coverage with mise-plugins asdf/vfox plugins and the allowed jbadeau/mise-nix backend plugin

Fixes discussion #9333.

Validation

  • /home/risu/.cargo/bin/cargo fmt --check
  • /home/risu/.cargo/bin/cargo test --bin mise plugins::tests::test_plugin_type -- --nocapture
  • /home/risu/.cargo/bin/cargo test --bin mise backend_arg -- --nocapture
  • MISE_TRUSTED_CONFIG_PATHS=/tmp/mise-plugin-type-detection/mise.toml ./target/debug/mise run test:e2e e2e/plugins/test_plugin_type_lazy e2e/plugins/test_backend_plugin_install
  • git diff --check

This PR was generated by an AI coding assistant.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 2, 2026

Greptile Summary

This PR centralizes plugin-type detection behind two new helpers — PluginType::from_plugin_config (prefix-aware, falls back to filesystem) and PluginType::from_plugin_path (inspects installed files) — and wires post-install re-detection into both AsdfPlugin and VfoxPlugin so that a vfox plugin installed without an explicit prefix is correctly reclassified after its git clone completes. The backend::remove + backend re-fetch pattern added to latest.rs and ls_remote.rs ensures callers pick up the updated type immediately.

Confidence Score: 5/5

Safe to merge; logic is sound and the self-correcting post-install re-detection handles all cases correctly.

All findings are P2. The core fix (post-install type re-detection in AsdfPlugin/VfoxPlugin plus backend cache eviction) is implemented correctly, and callers that need the updated type re-fetch the backend. The only gaps are a missing e2e test for the primary vfox URL roundtrip and a transient pre-install Asdf classification for bare vfox URLs — neither causes incorrect runtime behaviour.

e2e/plugins/test_plugin_type_lazy — lacks a vfox URL test case for the core fix

Important Files Changed

Filename Overview
src/plugins/mod.rs Adds from_plugin_config and from_plugin_path helpers; consolidates plugin-type detection with comprehensive unit tests. Pre-install fallback to Asdf for bare vfox URLs is a behaviour change from the old URL-heuristic.
src/plugins/asdf_plugin.rs Adds post-install re-detection: after cloning any repo, from_plugin_path determines the real plugin type and updates install_state + clears the backend cache. Correct.
src/plugins/vfox_plugin.rs Mirrors post-install re-detection from AsdfPlugin; fixes is_installed/ensure_installed to allow installing embedded plugins when an explicit URL override is present.
src/cli/args/backend_arg.rs Replaces URL-heuristic in backend_type() and full() with install_state::get_plugin_type; correct delegation to install_state for both paths.
src/config/mod.rs Config loading now uses from_plugin_config (filesystem-based) instead of URL heuristic; uninstalled plugins get a temporary Asdf type until post-install re-detection runs.
e2e/plugins/test_plugin_type_lazy New e2e test for lazy plugin-type detection, but both URLs are asdf plugins — the vfox URL auto-detection roundtrip (the core fix) is not covered.
src/backend/mod.rs Defensive if let Some guard in remove prevents a potential panic when TOOLS is not yet initialised.
src/toolset/install_state.rs Removes duplicated has_backend_methods and inline vfox detection, replacing them with PluginType::from_plugin_path. Cleaner with no logic change.
src/toolset/toolset_install.rs parse_plugin_key now delegates entirely to from_plugin_config, removing its own duplicated prefix-stripping and URL-heuristic logic.
src/cli/latest.rs Re-fetches backend after ensure_installed so the correct (post-install-detected) type is used. Needed companion to the lazy-detection design.
src/cli/ls_remote.rs Same re-fetch pattern as latest.rs; correct.
src/cli/plugins/install.rs Replaces hardcoded AsdfPlugin with plugin_type.plugin(...) derived from from_plugin_config; resolves the long-standing TODO about vfox detection.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Plugin key in config] --> B{Has explicit prefix?}
    B -- "vfox: / vfox-backend: / asdf:" --> C[Use declared PluginType]
    B -- no prefix --> D{Plugin installed on disk?}
    D -- yes --> E[from_plugin_path: inspect metadata.lua / bin/list-all]
    E --> F[Detected PluginType: Vfox / VfoxBackend / Asdf]
    D -- no --> G[Fallback: Asdf]
    G --> H[Create AsdfPlugin, clone repo]
    H --> I[Post-install: from_plugin_path re-detection]
    I --> J[install_state::add_plugin with real type]
    J --> K[backend::remove — evict stale cache]
    K --> L[Callers re-fetch backend — correct type in use]
    C --> M[install_state::add_plugin]
    F --> M
Loading

Reviews (5): Last reviewed commit: "fix(plugin): detect plugin type after cl..." | Re-trigger Greptile

Comment thread src/cli/args/backend_arg.rs Outdated
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 centralizes and refactors the logic for detecting plugin types (ASDF, Vfox, or VfoxBackend) from plugin keys and URLs by introducing PluginType::from_plugin_config and PluginType::from_plugin_url. Feedback suggests enhancing from_plugin_url to handle explicit prefixes, simplifying from_plugin_config through delegation, and improving plugin type detection during installation by querying the registry when a direct URL is absent.

Comment thread src/plugins/mod.rs Outdated
Comment thread src/plugins/mod.rs Outdated
Comment thread src/cli/plugins/install.rs Outdated
Comment thread src/plugins/mod.rs Outdated
@risu729 risu729 force-pushed the codex/plugin-type-detection branch 2 times, most recently from ca8eef6 to 147cd0c Compare May 2, 2026 14:23
@risu729 risu729 force-pushed the codex/plugin-type-detection branch from 147cd0c to 38460c2 Compare May 2, 2026 14:54
Comment thread src/plugins/mod.rs Outdated
Comment thread src/plugins/mod.rs Outdated
@risu729 risu729 changed the title fix(plugin): detect vfox plugin URLs during install fix(plugin): detect plugin types after cloning May 2, 2026
@risu729

This comment was marked as outdated.

@risu729 risu729 marked this pull request as ready for review May 2, 2026 17:30
@jdx jdx merged commit 431226f into jdx:main May 2, 2026
36 checks passed
@risu729 risu729 deleted the codex/plugin-type-detection branch May 3, 2026 00:15
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)
@n-rodriguez
Copy link
Copy Markdown

@risu729 thank you!

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.

3 participants