这是indexloc提供的服务,不要输入任何密码
Skip to content

proto exec should auto-install specified tool versions like environment variables do #881

@curlykay

Description

@curlykay

What version?

0.53.0

Which command?

proto exec

What happened?

Current Behavior

When using proto exec with a specific tool version that is not installed, it does not automatically download and install the specified version. Instead, it falls back to using the currently configured/installed version.

Example:

$ node -v
v24.8.0
# This does NOT auto-install node@14, falls back to configured version
$ proto exec node@14 -- node -v
v24.8.0  # Uses the currently configured version instead of v14.x.x

Expected Behavior

proto exec should automatically download and install the specified tool version if it's not already installed, similar to how environment variables work.

Example of current working behavior with environment variables:

$ node -v
v24.8.0
# This DOES auto-install node@14
$ PROTO_NODE_VERSION=14 node -v
Auto-install is enabled, attempting to install Node.js 14.21.3
━━━━━━━━━━━━━━━━━━━━ Node.js 14.21.3 installed (1s)
v14.21.3

Environment

  • proto version: 0.53.0
  • OS: macOS
  • Shell: zsh 5.9

Trace logs?

$ PROTO_LOG=trace proto exec node@16 -- node -v

[TRACE 2025-09-23 21:17:36.124] starbase_console::console Creating buffered console
[DEBUG 21:17:36.124] proto Running proto v0.53.0 exe="proto" args=["exec", "node@16", "--", "node", "-v"] pid=41253
[TRACE 21:17:36.124] starbase::app Running startup phase
[DEBUG 21:17:36.124] proto_core::env Creating proto environment, detecting store store="/Users/ck/.proto" home="/Users/ck"
[TRACE 21:17:36.124] starbase::app Running analyze phase
[DEBUG 21:17:36.124] proto::systems Loading configuration in upwards-global mode working_dir="/Users/ck"
[DEBUG 21:17:36.124] proto_core::config Loading .prototools file="/Users/ck/.prototools"
[TRACE 21:17:36.124] starbase_utils::fs Reading file file="/Users/ck/.prototools"
[TRACE 21:17:36.124] schematic::config::loader Loading partial configuration config="ProtoConfig"
[TRACE 21:17:36.124] schematic::config::loader Creating layer from source config="ProtoConfig" source=""
[TRACE 21:17:36.125] schematic::config::loader Merging partial layers into a final result config="ProtoConfig"
[DEBUG 21:17:36.125] proto_core::config Loading .prototools file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.125] starbase_utils::fs Opening file file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.125] starbase_utils::fs_lock Locking file file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.125] starbase_utils::fs_lock Unlocking file file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.125] schematic::config::loader Loading partial configuration config="ProtoConfig"
[TRACE 21:17:36.125] schematic::config::loader Creating layer from source config="ProtoConfig" source=""
[TRACE 21:17:36.125] schematic::config::loader Merging partial layers into a final result config="ProtoConfig"
[DEBUG 21:17:36.125] proto_core::file_manager Merging loaded configs with global
[DEBUG 21:17:36.125] proto_core::file_manager Merged 2 configs
[TRACE 21:17:36.125] starbase::app Running execute phase
[TRACE 21:17:36.125] warpgate::loader Creating plugin loader cache_dir="/Users/ck/.proto/plugins"
[TRACE 21:17:36.125] warpgate::loader Loading plugin internal-schema id="internal-schema" locator="https://github.com/moonrepo/plugins/releases/download/schema_tool-v0.17.5/schema_tool.wasm"
[TRACE 21:17:36.125] warpgate::protocols::http Downloading plugin from URL id="internal-schema" from="https://github.com/moonrepo/plugins/releases/download/schema_tool-v0.17.5/schema_tool.wasm"
[TRACE 21:17:36.125] starbase_utils::net Checking for an internet connection timeout=750
[TRACE 21:17:36.125] starbase_utils::fs Reading file metadata file="/Users/ck/.proto/plugins/internal-schema-b351a5e054a660ee3544fc1ec46faa60758c09aafa1926e51d6119e51da525cc.wasm"
[TRACE 21:17:36.125] warpgate::loader Plugin already acquired and cached id="internal-schema" path="/Users/ck/.proto/plugins/internal-schema-b351a5e054a660ee3544fc1ec46faa60758c09aafa1926e51d6119e51da525cc.wasm"
[DEBUG 21:17:36.125] proto_core::loader Finding a configured plugin id="node"
[DEBUG 21:17:36.125] proto_core::loader Found a plugin id="node" plugin="https://github.com/moonrepo/plugins/releases/download/node_tool-v0.17.2/node_tool.wasm"
[TRACE 21:17:36.125] warpgate::loader Loading plugin node id="node" locator="https://github.com/moonrepo/plugins/releases/download/node_tool-v0.17.2/node_tool.wasm"
[TRACE 21:17:36.125] starbase_utils::net::offline Resolving 1.1.1.1:53
[TRACE 21:17:36.125] warpgate::protocols::http Downloading plugin from URL id="node" from="https://github.com/moonrepo/plugins/releases/download/node_tool-v0.17.2/node_tool.wasm"
[TRACE 21:17:36.126] starbase_utils::fs Reading file metadata file="/Users/ck/.proto/plugins/node-45decb051d882a5b0c57e25a7ce22438988442b271386678f7d8f246c38e391c.wasm"
[TRACE 21:17:36.126] warpgate::loader Plugin already acquired and cached id="node" path="/Users/ck/.proto/plugins/node-45decb051d882a5b0c57e25a7ce22438988442b271386678f7d8f246c38e391c.wasm"
[DEBUG 21:17:36.126] proto_core::loader Loading WASM plugin source="/Users/ck/.proto/plugins/node-45decb051d882a5b0c57e25a7ce22438988442b271386678f7d8f246c38e391c.wasm"
[TRACE 21:17:36.126] warpgate::plugin Storing plugin identifier id="node"
[TRACE 21:17:36.126] warpgate::plugin Storing host environment id="node" env={"arch":"arm64","ci":false,"libc":"gnu","os":"macos","home_dir":{"path":"/userhome/","virtual_prefix":"/userhome","real_prefix":"/Users/ck"}}
[TRACE 21:17:36.126] starbase_utils::json Formatting JSON
[TRACE 21:17:36.126] proto_core::loader Storing proto tool configuration config={"bundled-npm":true}
[DEBUG 21:17:36.126] proto_core::tool Creating tool node and instantiating plugin
[DEBUG 21:17:36.126] warpgate::clients::http Creating HTTP client
[TRACE 21:17:36.126] starbase_utils::net Online!
[TRACE 21:17:36.126] starbase_utils::fs Reading file file="/Users/ck/.proto/temp/.last-version-check"
[TRACE 21:17:36.222] warpgate::clients::http Applying middleware to client
[TRACE 21:17:36.222] warpgate::clients::http Adding GET and HEAD request caching
[DEBUG 21:17:36.222] warpgate::clients::http Created HTTP client
[TRACE 21:17:36.222] warpgate::plugin Creating plugin container id="node"
[TRACE 21:17:36.230] warpgate::plugin Created plugin container id="node" plugin="a9d024b7-7dda-4c76-b7f2-30b3970adae5"
[DEBUG 21:17:36.230] proto_core::tool Created tool node and its WASM runtime
[TRACE 21:17:36.230] warpgate::plugin Calling guest function register_tool id="node" plugin="a9d024b7-7dda-4c76-b7f2-30b3970adae5" input={"id":"node"}
[TRACE 21:17:36.230] warpgate::plugin Called guest function register_tool id="node" plugin="a9d024b7-7dda-4c76-b7f2-30b3970adae5" output={"config_schema":{"name":"NodePluginConfig","ty":{"type":"Struct","fields":{"bundled-npm":{"schema":{"ty":{"type":"Boolean"}},"optional":true},"dist-url":{"schema":{"ty":{"type":"String"}},"optional":true}},"partial":false}},"default_install_strategy":"download-prebuilt","minimum_proto_version":"0.46.0","name":"Node.js","plugin_version":"0.17.2","type":"language","unstable":false} elapsed=230.791µs
[DEBUG 21:17:36.230] proto_core::tool_manifest Loading manifest.json file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.230] starbase_utils::fs Opening file file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.230] starbase_utils::fs_lock Locking file file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.230] starbase_utils::fs_lock Unlocking file file="/Users/ck/.proto/tools/node/manifest.json"
[DEBUG 21:17:36.231] proto_core::flow::resolve Resolving a semantic version or alias tool="node" initial_version="~16"
[DEBUG 21:17:36.231] proto_core::flow::resolve Loading available versions tool="node"
[TRACE 21:17:36.231] starbase_utils::fs Reading file metadata file="/Users/ck/.proto/tools/node/remote-versions.json"
[TRACE 21:17:36.231] starbase_utils::fs Reading file file="/Users/ck/.proto/tools/node/remote-versions.json"
[TRACE 21:17:36.231] starbase_utils::json Reading JSON file file="/Users/ck/.proto/tools/node/remote-versions.json"
[TRACE 21:17:36.231] warpgate::plugin Calling guest function resolve_version id="node" plugin="a9d024b7-7dda-4c76-b7f2-30b3970adae5" input={"context":{"proto_version":"0.53.0","temp_dir":{"path":"/proto/temp/node","virtual_prefix":"/proto","real_prefix":"/Users/ck/.proto"},"version":"latest","tool_dir":{"path":"/proto/tools","virtual_prefix":"/proto","real_prefix":"/Users/ck/.proto"}},"initial":"~16"}
[TRACE 21:17:36.231] warpgate::plugin Called guest function resolve_version id="node" plugin="a9d024b7-7dda-4c76-b7f2-30b3970adae5" output={} elapsed=74.292µs
[TRACE 21:17:36.231] proto_core::version_resolver Resolving a version with manifest candidate="~16"
[TRACE 21:17:36.231] proto_core::version_resolver Found a requirement, resolving further requirement="~16"
[TRACE 21:17:36.231] proto_core::version_resolver Resolved to remote available version version="16.20.2"
[DEBUG 21:17:36.231] proto_core::flow::resolve Resolved to 16.20.2 tool="node" spec="~16"
[DEBUG 21:17:36.231] proto_core::flow::setup Checking if tool is installed tool="node" install_dir="/Users/ck/.proto/tools/node/16.20.2"
[DEBUG 21:17:36.231] proto_core::flow::setup Tool has not been installed tool="node"
[TRACE 21:17:36.232] proto::workflows::exec_workflow Created command to execute exe="node" args=["-v"]
[TRACE 2025-09-23 21:17:36.239] starbase_console::console Creating buffered console
[DEBUG 21:17:36.240] proto Running proto v0.53.0 exe="/Users/ck/.proto/tools/proto/0.53.0/proto" args=["run", "node", "--", "-v"] shim="node" shim_exe="/Users/ck/.proto/shims/node" pid=41253
[TRACE 21:17:36.240] starbase::app Running startup phase
[DEBUG 21:17:36.240] proto_core::env Creating proto environment, detecting store store="/Users/ck/.proto" home="/Users/ck"
[TRACE 21:17:36.240] starbase::app Running analyze phase
[DEBUG 21:17:36.240] proto::systems Loading configuration in upwards-global mode working_dir="/Users/ck"
[DEBUG 21:17:36.240] proto_core::config Loading .prototools file="/Users/ck/.prototools"
[TRACE 21:17:36.240] starbase_utils::fs Reading file file="/Users/ck/.prototools"
[TRACE 21:17:36.240] schematic::config::loader Loading partial configuration config="ProtoConfig"
[TRACE 21:17:36.240] schematic::config::loader Creating layer from source config="ProtoConfig" source=""
[TRACE 21:17:36.240] schematic::config::loader Merging partial layers into a final result config="ProtoConfig"
[DEBUG 21:17:36.240] proto_core::config Loading .prototools file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.240] starbase_utils::fs Opening file file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.240] starbase_utils::fs_lock Locking file file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.240] starbase_utils::fs_lock Unlocking file file="/Users/ck/.proto/.prototools"
[TRACE 21:17:36.240] schematic::config::loader Loading partial configuration config="ProtoConfig"
[TRACE 21:17:36.240] schematic::config::loader Creating layer from source config="ProtoConfig" source=""
[TRACE 21:17:36.240] schematic::config::loader Merging partial layers into a final result config="ProtoConfig"
[DEBUG 21:17:36.240] proto_core::file_manager Merging loaded configs with global
[DEBUG 21:17:36.240] proto_core::file_manager Merged 2 configs
[TRACE 21:17:36.240] starbase::app Running execute phase
[TRACE 21:17:36.240] starbase_utils::net Checking for an internet connection timeout=750
[DEBUG 21:17:36.240] proto_core::loader Finding a configured plugin id="node"
[DEBUG 21:17:36.240] proto_core::loader Found a plugin id="node" plugin="https://github.com/moonrepo/plugins/releases/download/node_tool-v0.17.2/node_tool.wasm"
[TRACE 21:17:36.240] warpgate::loader Creating plugin loader cache_dir="/Users/ck/.proto/plugins"
[TRACE 21:17:36.240] starbase_utils::net::offline Resolving 1.1.1.1:53
[TRACE 21:17:36.240] warpgate::loader Loading plugin node id="node" locator="https://github.com/moonrepo/plugins/releases/download/node_tool-v0.17.2/node_tool.wasm"
[TRACE 21:17:36.240] warpgate::protocols::http Downloading plugin from URL id="node" from="https://github.com/moonrepo/plugins/releases/download/node_tool-v0.17.2/node_tool.wasm"
[TRACE 21:17:36.240] starbase_utils::fs Reading file metadata file="/Users/ck/.proto/plugins/node-45decb051d882a5b0c57e25a7ce22438988442b271386678f7d8f246c38e391c.wasm"
[TRACE 21:17:36.240] warpgate::loader Plugin already acquired and cached id="node" path="/Users/ck/.proto/plugins/node-45decb051d882a5b0c57e25a7ce22438988442b271386678f7d8f246c38e391c.wasm"
[DEBUG 21:17:36.240] proto_core::loader Loading WASM plugin source="/Users/ck/.proto/plugins/node-45decb051d882a5b0c57e25a7ce22438988442b271386678f7d8f246c38e391c.wasm"
[TRACE 21:17:36.240] warpgate::plugin Storing plugin identifier id="node"
[TRACE 21:17:36.241] warpgate::plugin Storing host environment id="node" env={"arch":"arm64","ci":false,"libc":"gnu","os":"macos","home_dir":{"path":"/userhome/","virtual_prefix":"/userhome","real_prefix":"/Users/ck"}}
[TRACE 21:17:36.241] starbase_utils::json Formatting JSON
[TRACE 21:17:36.241] proto_core::loader Storing proto tool configuration config={"bundled-npm":true}
[DEBUG 21:17:36.241] proto_core::tool Creating tool node and instantiating plugin
[DEBUG 21:17:36.241] warpgate::clients::http Creating HTTP client
[TRACE 21:17:36.241] starbase_utils::net Online!
[TRACE 21:17:36.241] starbase_utils::fs Reading file file="/Users/ck/.proto/temp/.last-version-check"
[TRACE 21:17:36.320] warpgate::clients::http Applying middleware to client
[TRACE 21:17:36.320] warpgate::clients::http Adding GET and HEAD request caching
[DEBUG 21:17:36.320] warpgate::clients::http Created HTTP client
[TRACE 21:17:36.320] warpgate::plugin Creating plugin container id="node"
[TRACE 21:17:36.327] warpgate::plugin Created plugin container id="node" plugin="aa178b38-5651-492a-9463-ba3a3a98230b"
[DEBUG 21:17:36.327] proto_core::tool Created tool node and its WASM runtime
[TRACE 21:17:36.327] warpgate::plugin Calling guest function register_tool id="node" plugin="aa178b38-5651-492a-9463-ba3a3a98230b" input={"id":"node"}
[TRACE 21:17:36.328] warpgate::plugin Called guest function register_tool id="node" plugin="aa178b38-5651-492a-9463-ba3a3a98230b" output={"config_schema":{"name":"NodePluginConfig","ty":{"type":"Struct","fields":{"bundled-npm":{"schema":{"ty":{"type":"Boolean"}},"optional":true},"dist-url":{"schema":{"ty":{"type":"String"}},"optional":true}},"partial":false}},"default_install_strategy":"download-prebuilt","minimum_proto_version":"0.46.0","name":"Node.js","plugin_version":"0.17.2","type":"language","unstable":false} elapsed=169.125µs
[DEBUG 21:17:36.328] proto_core::tool_manifest Loading manifest.json file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.328] starbase_utils::fs Opening file file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.328] starbase_utils::fs_lock Locking file file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.328] starbase_utils::fs_lock Unlocking file file="/Users/ck/.proto/tools/node/manifest.json"
[TRACE 21:17:36.328] proto_core::flow::detect Attempting to find version from .prototools files tool="node"
[DEBUG 21:17:36.328] proto_core::flow::detect Detected version from .prototools file tool="node" version="24.8.0" file="/Users/ck/.prototools"
[DEBUG 21:17:36.328] proto_core::flow::resolve Resolving a semantic version or alias tool="node" initial_version="24.8.0"
[DEBUG 21:17:36.328] proto_core::flow::resolve Resolved to 24.8.0 (without validation) tool="node" spec="24.8.0"
[DEBUG 21:17:36.328] proto_core::flow::setup Checking if tool is installed tool="node" install_dir="/Users/ck/.proto/tools/node/24.8.0"
[DEBUG 21:17:36.328] proto_core::flow::setup Tool has already been installed, locating binaries and shims tool="node" install_dir="/Users/ck/.proto/tools/node/24.8.0"
[TRACE 21:17:36.328] warpgate::plugin Calling guest function locate_executables id="node" plugin="aa178b38-5651-492a-9463-ba3a3a98230b" input={"context":{"proto_version":"0.53.0","temp_dir":{"path":"/proto/temp/node","virtual_prefix":"/proto","real_prefix":"/Users/ck/.proto"},"tool_dir":{"path":"/proto/tools/node/24.8.0","virtual_prefix":"/proto","real_prefix":"/Users/ck/.proto"},"version":"24.8.0"},"install_dir":{"path":"/proto/tools/node/24.8.0","virtual_prefix":"/proto","real_prefix":"/Users/ck/.proto"}}
[TRACE 21:17:36.328] warpgate::plugin Called guest function locate_executables id="node" plugin="aa178b38-5651-492a-9463-ba3a3a98230b" output={"exes":{"node":{"exe_path":"bin/node","primary":true}},"exes_dirs":["bin"],"globals_lookup_dirs":["$PROTO_HOME/tools/node/globals/bin"]} elapsed=372.541µs
[DEBUG 21:17:36.328] proto_core::flow::link Creating binary symlink tool="node" source="/Users/ck/.proto/tools/node/24.8.0/bin/node" target="/Users/ck/.proto/bin/node"
[DEBUG 21:17:36.328] proto::commands::run Running Node.js exe="/Users/ck/.proto/tools/node/24.8.0/bin/node" args=["-v"] pid=41253
[DEBUG 21:17:36.329] proto_core::flow::setup Checking if tool is installed tool="node" install_dir="/Users/ck/.proto/tools/node/24.8.0"
[DEBUG 21:17:36.329] proto_core::flow::setup Tool has already been installed, locating binaries and shims tool="node" install_dir="/Users/ck/.proto/tools/node/24.8.0"
[DEBUG 21:17:36.329] proto_core::flow::locate Locating primary executable for tool tool="node"
[DEBUG 21:17:36.329] proto_core::flow::locate Found an executable tool="node" exe_path="/Users/ck/.proto/tools/node/24.8.0/bin/node"
[DEBUG 21:17:36.329] proto_core::flow::locate Locating globals directories for tool tool="node"
[DEBUG 21:17:36.329] proto_core::flow::locate Located possible globals directories tool="node" dirs=["/Users/ck/.proto/tools/node/globals/bin"]
[TRACE 21:17:36.329] starbase_utils::fs Writing file file="/Users/ck/.proto/tools/node/24.8.0/.last-used"
[TRACE 21:17:36.330] proto::workflows::exec_workflow Created command to execute exe="/Users/ck/.proto/tools/node/24.8.0/bin/node" args=["-v"]
v24.8.0

Operating system?

MacOS

Architecture?

arm64

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions