website/docs/proto/tool-spec.mdx
import HeaderLabel from '@site/src/components/Docs/HeaderLabel'; import VersionLabel from '@site/src/components/Docs/VersionLabel';
<HeaderLabel text="3 min" />Since proto is a toolchain for multiple tools, each with differing version formats, we must align them on a standard specification that can resolve and store safely. To handle this, we've implemented our own solution called the tool and version specification. This specification currently supports semantic and calendar based versions, each with their own guidelines and caveats.
:::info
If you're implementing a plugin for a specific tool that has a different version format, you'll need to re-format it into one of the specifications below.
:::
A backend is an internal system that allows proto to use plugins from 3rd-party package/version managers within proto, greatly expanding the amount of tools that proto can install and support. This functionality is achieved through special WASM plugins under the hood.
To make use of a backend, prefix the tool identifier in .prototools with the backend's unique
identifier. For example, we can install Zig via asdf.
# >= v0.52
"asdf:zig" = "0.13.0"
# <= v0.51
zig = "asdf:0.13.0"
asdfThe asdf backend will utilize the asdf version manager for downloading and
installing a tool, loading versions, and locating executables. This backend implementation does
not use the asdf binary itself, and instead emulates the environment as best we can. Because of
this, some tools may not be usable through proto.
"asdf:<id>" = "20"
By default, the ID pinned in .prototools is the
asdf shortname used when cloning a
repository. If the ID is different than the shortname (node vs nodejs), you can configure the
asdf-shortname setting.
"asdf:node" = "20"
[tools."asdf.node"]
asdf-shortname = "nodejs"
The following settings are supported:
asdf-shortname (string) - The name of the asdf plugin
if different than the configured ID.asdf-repository (string) - The Git repository URL in which to locate
scripts. If not defined, is extracted
from the shortname plugin index.exes (string[]) - List of executable file names (relative from bin) to be linked as a
shim/bin. If not defined, we'll automatically scan the bin directory.The most common format is semver, also known as a semantic version. This format requires major, minor, and patch numbers, with optional pre-release and build metadata.
tool = "1.2.3"
<major>.<minor>.<patch> - 1.2.3<major>.<minor>.<patch>-<pre> - 1.2.3-alpha.0<major>.<minor>.<patch>-<pre>+<build> - 1.2.3-alpha.0+nightly456<major>.<minor>.<patch>+<build> - 1.2.3+nightly4560-9 of any lengtha-z, 0-9, -, .Another popular format is calver, also known as a calendar version, which uses the calendar year, month, and day as version numbers. This format also supports pre-release and build metadata, but with different syntax than semver.
tool = "2025-02-26"
<year>-<month> - 2024-02<year>-<month>-<day> - 2024-02-26<year>-<month>-<day>.<build> - 2024-02-26.123<year>-<month>-<day>_<build> - 2024-02-26_123<year>-<month>-<day>.<build>-<pre> - 2024-02-26.123-alpha.0<year>-<month>-<day>_<build>-<pre> - 2024-02-26_123-alpha.0<year>-<month>-<day>-<pre> - 2024-02-26-alpha.00-9 of 1-4 length
24 becomes
2024, and 124 becomes 2124.0-9 of 1-2 length
02 vs 2).0 or 13).0-9 of 1-2 length
02 vs 2).0 or 32).0-9 of any length
. format is preferred.a-z, 0-9, -, .Besides an explicit version, we also support partial versions known as version requirements or version ranges. These are quite complex as we need to support both semver and calver in unison, as well as support partial/incomplete numbers (missing patch/day, missing minor/month, etc). We do our best to support as many combinations as possible.
tool-a = "^1"
tool-b = "~2.1"
tool-c = ">=2000-10"
[<op>]<pattern> - 1.2.3, >4.5, ~3, ^2000-10, etc<requirement>[,] <requirement> ... - >=1, <2, ^1.3 <=1.3.9, etc<requirement> || <requirement> ... - ^1.2 || ^2.3, ~2000-10 || ~2010-2, etc=, >, >=, <=, <, ~, ^
~ when a partial version is provided (i.e. allow the minimum specified
version component to increase)^ (i.e. allow any newer version that is nominally
compatible)= operator explicitly.For example, if you want to use npm 11.6.2 but 11.6.3 has an issue, use:
npm = "^11.6.4 || =11.6.2"