base on A cross-platform and extendable version manager with support for Java, Node.js, Flutter, .Net & more <p style="" align="center">
<img src="./logo.png" alt="Logo" width="250" height="250">
</p>
# vfox
[![Go Report Card](https://img.shields.io/badge/go%20report-A+-brightgreen.svg?style=for-the-badge)](https://goreportcard.com/report/github.com/version-fox/vfox)
[![GitHub License](https://img.shields.io/github/license/version-fox/vfox?style=for-the-badge)](LICENSE)
[![GitHub Release](https://img.shields.io/github/v/release/version-fox/vfox?display_name=tag&style=for-the-badge)](https://github.com/version-fox/vfox/releases)
[![Discord](https://img.shields.io/discord/1191981003204477019?style=for-the-badge&logo=discord)](https://discord.gg/85c8ptYgb7)
[[English]](./README.md) [[中文文档]](./README_CN.md)
If you **switch between development projects which expect different environments**, specifically different runtime versions or ambient libraries,
or **you are tired of all kinds of cumbersome environment configurations**, `vfox` is the ideal choice for you.
## Introduction
**`vfox` is a cross-platform version manager(similar to `nvm`, `fvm`, `sdkman`, `asdf-vm`, etc.), extendable via plugins**. It allows you to quickly install
and switch between different environment you need via the command line.
## Why use vfox?
- **cross-platform support** (**Windows**, Linux, macOS)
- **consistent commands** to manage all your languages
- supports **different versions for different projects, different shells, and globally**.
- simple **plugin system** to add support for your runtime of choice
- **automatically switches** runtime versions as you traverse your project
- support for existing config files `.node-version`, `.nvmrc`, `.sdkmanrc` for easy migration
- shell completion available for common shells (Bash, ZSH, Powershell, Clink)
- **it's faster than `asdf-vm`, and offers more simple commands and genuine cross-platform unification.**
see [Comparison with asdf](https://vfox.lhan.me/misc/vs-asdf.html)
## Demo
[![asciicast](https://asciinema.org/a/650100.svg)](https://asciinema.org/a/650100)
## Quickstart
> For detailed installation instructions, see [Quick Start](https://vfox.lhan.me/guides/quick-start.html)
#### 1. Choose an [installation](https://vfox.lhan.me/guides/quick-start.html#_1-installation) that works for you.
#### 2. ⚠️ **_Hook `vfox` into your shell_ (pick one that works for your shell)** ⚠️
```bash
echo 'eval "$(vfox activate bash)"' >> ~/.bashrc
echo 'eval "$(vfox activate zsh)"' >> ~/.zshrc
echo 'vfox activate fish | source' >> ~/.config/fish/config.fish
# For PowerShell:
if (-not (Test-Path -Path $PROFILE)) { New-Item -Type File -Path $PROFILE -Force }; Add-Content -Path $PROFILE -Value 'Invoke-Expression "$(vfox activate pwsh)"'
# For Clink:
# 1. Install clink: https://github.com/chrisant996/clink/releases
# Or Install cmder: https://github.com/cmderdev/cmder/releases
# 2. Find script path: clink info | findstr scripts
# 3. copy internal/shell/clink_vfox.lua to script path
```
> Remember to restart your shell to apply the changes.
#### 3. Add an SDK plugin
```bash
$ vfox add nodejs
```
#### 4. Install a runtime
```bash
$ vfox install
[email protected]
```
#### 5. Switch runtime
```bash
$ vfox use
[email protected]
$ node -v
21.5.0
```
## Full Documentation
See [vfox.lhan.me](https://vfox.lhan.me) for full documentation.
## Roadmap
Our future plans and high priority features and enhancements are:
- [x] Refactoring the plugin mechanism:
- Introducing plugin templates to facilitate multi-file plugin development.
- Establishing a global registry (similar to `NPM Registry` or `Scoop Main Bucket`) to provide a unified entry point for plugin distribution.
- Decomposing the existing plugin repository into individual repositories, one for each plugin.
- [X] Allowing the switching of registry addresses.
- [X] Plugin capabilities: Parsing legacy configuration files, such as `.nvmrc`, `.node-version`, `.sdkmanrc`, etc.
- [ ] Plugin capabilities: Allowing plugins to load installed runtimes and provide information about the runtime.
## Available Plugins
> If you have installed `vfox`, you can view all available plugins with the `vfox available` command.
For more details, see the [Available Plugins](https://vfox.lhan.me/plugins/available.html).
## Contributors
> Thanks to following people who contributed to this project. 🎉🎉🙏🙏
<a href="https://github.com/version-fox/vfox/graphs/contributors">
<img src="https://contrib.rocks/image?repo=version-fox/vfox" />
</a>
## Contributing
Bug reports, contributions and forks are welcome. All bugs or other forms of discussion happen
on [issues](http://github.com/version-fox/vfox/issues).
See more at [CONTRIBUTING.md](./CONTRIBUTING.md).
Plugin Contributions, please go to [Public Registry](https://github.com/version-fox/vfox-plugins)
## Star History
![Star History Chart](https://api.star-history.com/svg?repos=version-fox/vfox&type=Date)
## Thanks
> Thanks JetBrains for the free open source license. :)
<a href="https://www.jetbrains.com/?from=gev" target="_blank">
<img src="https://i.loli.net/2021/02/08/2aejB8rwNmQR7FG.png" width="200" height="200" />
</a>
<a href="https://hellogithub.com/repository/a32a1f2ad04a4b8aa4dd3e1b76c880b2" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=a32a1f2ad04a4b8aa4dd3e1b76c880b2&claim_uid=TV6tBSMzmZUWQqk" alt="Featured|HelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
## COPYRIGHT
[Apache 2.0 license](./LICENSE) - Copyright (C) 2024 Han Li
and [contributors](https://github.com/version-fox/vfox/graphs/contributors)
", Assign "at most 3 tags" to the expected json: {"id":"8211","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"