Skip to content

RFC 0015: System Tool Discovery & Unified Execution ​

  • 状态: 实现中 (Phase 1 完成)
  • 创建日期: 2026-01-07
  • 作者: VX Team
  • 关联: RFC-0014 (Platform-Aware Providers)

摘要 ​

让 vx 成为统一的命令执行入口,不仅管理需要安装的运行时,还能动态发现并执行系统工具。覆盖 DevOps、AIOps、全栈开发 的完整工具链。

设计目标:零学习成本、AI 友好、环境一致、多环境共存。

核心理念 ​

┌─────────────────────────────────────────────────────────────────┐
│                     vx = 统一命令入口                           │
│                                                                 │
│   人类开发者: vx <command>  ──┐                                 │
│                              ├──► 一致的执行环境 ──► 结果       │
│   AI Agent:   vx <command>  ──┘                                 │
│                                                                 │
│   无需关心: 工具在哪里、如何安装、环境变量、平台差异            │
└─────────────────────────────────────────────────────────────────┘

设计原则 ​

原则说明
零学习成本用户已知的命令语法不变,只需加 vx 前缀
AI 优先所有命令通过 vx 执行,AI 无需了解平台差异
干净环境每次执行创建干净环境,避免环境污染
多环境共存支持多个项目环境同时存在,随时切换
自动激活检测到 vx.toml 自动激活项目环境

一、优先集成的工具清单 ​

1.1 按领域分类 ​

构建工具 (Build) ​

工具平台说明
xcodebuildmacOSApple 项目构建
xcrunmacOSXcode 工具链调用
msbuildWindows.NET/C++ 构建
cmake跨平台跨平台构建系统
make跨平台经典构建工具
ninja跨平台高速构建系统
bazel跨平台Google 构建系统
gradle跨平台Java/Android 构建
maven跨平台Java 构建

容器与编排 (Container & Orchestration) ​

工具平台说明
docker跨平台容器运行时
docker-compose跨平台多容器编排
podman跨平台无守护进程容器
kubectl跨平台Kubernetes CLI
helm跨平台K8s 包管理
k9s跨平台K8s TUI
minikube跨平台本地 K8s
kind跨平台K8s in Docker

云平台 CLI (Cloud) ​

工具平台说明
aws跨平台AWS CLI
az跨平台Azure CLI
gcloud跨平台Google Cloud CLI
terraform跨平台基础设施即代码
pulumi跨平台现代 IaC
ansible跨平台配置管理

CI/CD 工具 ​

工具平台说明
gh跨平台GitHub CLI
gitlab跨平台GitLab CLI
jenkins-cli跨平台Jenkins CLI
act跨平台本地运行 GitHub Actions

网络与调试 (Network & Debug) ​

工具平台说明
curl跨平台HTTP 客户端
wget跨平台下载工具
httpie跨平台现代 HTTP 客户端
ssh跨平台远程连接
scp跨平台安全复制
rsyncmacOS/Linux文件同步
netstat跨平台网络状态
tcpdumpmacOS/Linux网络抓包
wireshark跨平台网络分析

数据库工具 (Database) ​

工具平台说明
psql跨平台PostgreSQL CLI
mysql跨平台MySQL CLI
mongosh跨平台MongoDB Shell
redis-cli跨平台Redis CLI
sqlite3跨平台SQLite CLI

监控与日志 (Monitoring & Logging) ​

工具平台说明
htopmacOS/Linux进程监控
top跨平台系统监控
iotopLinuxIO 监控
journalctlLinux系统日志
dmesgmacOS/Linux内核日志
prometheus跨平台监控系统
grafana-cli跨平台可视化

安全工具 (Security) ​

工具平台说明
codesignmacOS代码签名
signtoolWindows代码签名
gpg跨平台加密签名
openssl跨平台SSL/TLS 工具
certutilWindows证书管理
securitymacOS钥匙串管理

版本控制 (VCS) ​

工具平台说明
git跨平台版本控制
git-lfs跨平台大文件存储
svn跨平台Subversion
hg跨平台Mercurial

文件系统 (Filesystem) ​

工具平台说明
tar跨平台归档工具
zip / unzip跨平台ZIP 压缩
7z跨平台7-Zip
robocopyWindows高级复制
xcopyWindows扩展复制
findmacOS/Linux文件查找
fd跨平台现代 find
rg (ripgrep)跨平台高速搜索

AIOps / MLOps ​

工具平台说明
nvidia-smi跨平台GPU 监控
nvcc跨平台CUDA 编译器
mlflow跨平台ML 生命周期
dvc跨平台数据版本控制
wandb跨平台实验跟踪

1.2 平台特定工具 ​

macOS 专属 ​

toml
[tools.macos]
# Apple 开发
xcodebuild = { category = "build" }
xcrun = { category = "build" }
swift = { category = "language" }
swiftc = { category = "build" }
xcode-select = { category = "system" }
# 系统工具
codesign = { category = "security" }
notarytool = { category = "security" }
security = { category = "security" }
plutil = { category = "system" }
defaults = { category = "system" }
launchctl = { category = "system" }
diskutil = { category = "system" }
hdiutil = { category = "system" }
pkgbuild = { category = "package" }
productbuild = { category = "package" }
# Homebrew
brew = { category = "package" }

Windows 专属 ​

toml
[tools.windows]
# 构建工具
msbuild = { discover = "vswhere", category = "build" }
devenv = { discover = "vswhere", category = "build" }
cl = { discover = "vcvars", category = "build" }
link = { discover = "vcvars", category = "build" }
# 系统工具
robocopy = { category = "filesystem" }
xcopy = { category = "filesystem" }
sfc = { category = "system", requires_admin = true }
dism = { category = "system", requires_admin = true }
certutil = { category = "security" }
signtool = { discover = "windows_sdk", category = "security" }
# PowerShell
pwsh = { category = "shell" }
powershell = { category = "shell" }
# 包管理
winget = { category = "package" }
choco = { category = "package" }
scoop = { category = "package" }

Linux 专属 ​

toml
[tools.linux]
# 包管理
apt = { path = "/usr/bin/apt", category = "package" }
apt-get = { path = "/usr/bin/apt-get", category = "package" }
yum = { path = "/usr/bin/yum", category = "package" }
dnf = { path = "/usr/bin/dnf", category = "package" }
pacman = { path = "/usr/bin/pacman", category = "package" }
# 系统服务
systemctl = { category = "system" }
journalctl = { category = "system" }
service = { category = "system" }
# 网络
iptables = { category = "network", requires_sudo = true }
ip = { category = "network" }
ss = { category = "network" }

二、虚拟环境与隔离策略 ​

2.1 设计目标 ​

  1. 环境隔离 - 防止用户随意安装导致全局环境冲突
  2. 快速创建 - 秒级创建新的虚拟环境
  3. 空间复用 - 相同版本的工具不重复占用磁盘
  4. PATH 优先级 - vx 管理的工具优先于系统工具

2.2 主流方案对比 (2025-2026) ​

方案工具实现方式优点缺点
硬链接uv, pnpm同分区硬链接极快、零额外空间跨分区失败
软链接Nix, mise符号链接到 store快速、跨分区支持Windows 兼容性
Shimasdf, mise拦截器代理灵活、动态切换每次调用有开销
复制venv (fallback)完整复制文件最兼容慢、占空间

uv 的硬链接策略 ​

bash
# uv 默认使用硬链接,跨分区时回退到复制
$ uv venv
warning: Failed to hardlink files; falling back to full copy.

# 可配置链接模式
export UV_LINK_MODE=copy      # 强制复制
export UV_LINK_MODE=hardlink  # 强制硬链接

mise 的 Shim vs PATH 策略 ​

bash
# Shim 模式 - 适合 IDE/脚本
eval "$(mise activate --shims)"

# PATH 模式 - 适合交互式 Shell
eval "$(mise activate bash)"

2.3 vx 的混合策略 (推荐) ​

结合各方案优点,vx 采用分层隔离 + 智能链接策略:

┌─────────────────────────────────────────────────────────────────┐
│                    vx 存储架构                                   │
├─────────────────────────────────────────────────────────────────┤
│  ~/.vx/                                                         │
│  ├── store/              # 内容寻址存储 (Content-Addressable)   │
│  │   ├── node/                                                  │
│  │   │   ├── 22.0.0-darwin-arm64/     # 实际安装                │
│  │   │   └── 20.0.0-darwin-arm64/                              │
│  │   ├── python/                                                │
│  │   │   └── 3.11.0-darwin-arm64/                              │
│  │   └── ...                                                    │
│  │                                                              │
│  ├── envs/               # 虚拟环境 (软链接组合)                 │
│  │   ├── project-a/      # 项目 A 的环境                        │
│  │   │   └── bin/                                               │
│  │   │       ├── node -> ../../store/node/22.0.0/bin/node      │
│  │   │       ├── npm -> ../../store/node/22.0.0/bin/npm        │
│  │   │       └── python -> ../../store/python/3.11/bin/python  │
│  │   ├── project-b/      # 项目 B 的环境                        │
│  │   │   └── bin/                                               │
│  │   │       ├── node -> ../../store/node/20.0.0/bin/node      │
│  │   │       └── ...                                            │
│  │   └── _default/       # 默认环境                             │
│  │                                                              │
│  └── shims/              # 全局 Shim (用于 IDE/非交互式)         │
│      ├── node            # shim 脚本                            │
│      ├── npm                                                    │
│      └── ...                                                    │
└─────────────────────────────────────────────────────────────────┘

2.4 链接策略选择 ​

rust
/// 链接模式
pub enum LinkMode {
    /// 硬链接 (默认,同分区时最快)
    Hardlink,
    /// 软链接 (跨分区、Windows 兼容)
    Symlink,
    /// 复制 (最兼容,fallback)
    Copy,
    /// 自动选择最优策略
    Auto,
}

impl LinkMode {
    /// 自动选择最优链接策略
    pub fn auto_select(source: &Path, target: &Path) -> Self {
        // 1. 检查是否同一文件系统
        if same_filesystem(source, target) {
            return LinkMode::Hardlink;
        }
        
        // 2. Windows 检查符号链接权限
        #[cfg(windows)]
        if !has_symlink_privilege() {
            return LinkMode::Copy;
        }
        
        // 3. 默认使用软链接
        LinkMode::Symlink
    }
}

2.5 虚拟环境创建 (秒级) ​

bash
# 创建新的虚拟环境 (基于软链接,极快)
$ vx env create my-env --with node@22 python@3.11
Creating environment 'my-env'...
  ✓ Linking node@22.0.0 (symlink)
  ✓ Linking python@3.11.0 (symlink)
Done in 0.3s

# 环境结构
~/.vx/envs/my-env/
└── bin/
    ├── node -> ../../store/node/22.0.0/bin/node
    ├── npm -> ../../store/node/22.0.0/bin/npm
    ├── python -> ../../store/python/3.11.0/bin/python
    └── pip -> ../../store/python/3.11.0/bin/pip

2.6 项目本地模式 (可选) ​

对于特殊场景(CI、离线环境、完全隔离),支持项目本地存储:

toml
# vx.toml
[settings]
# 默认使用全局 store (推荐)
local_store = false

# 启用项目本地 store
# local_store = true

本地模式目录结构 ​

my-project/
├── vx.toml
├── vx.lock
├── .vx/                        # 项目本地 vx 目录 (gitignore)
│   ├── store/                  # 本地存储 (完整安装)
│   │   ├── node/
│   │   │   └── 22.0.0/
│   │   └── python/
│   │       └── 3.11.0/
│   └── bin/                    # 软链接到 store
│       ├── node -> ../store/node/22.0.0/bin/node
│       ├── npm -> ../store/node/22.0.0/bin/npm
│       └── python -> ../store/python/3.11.0/bin/python
└── src/

使用场景 ​

场景推荐模式原因
日常开发全局 store节省空间,共享版本
CI/CD本地 store隔离,可缓存 .vx/
离线环境本地 store不依赖全局状态
Docker 构建本地 store镜像层缓存友好
多用户共享全局 store统一管理

命令行切换 ​

bash
# 初始化项目为本地模式
$ vx init --local
Created vx.toml with local_store = true

# 将现有项目切换到本地模式
$ vx config set local_store true
$ vx sync  # 同步工具到本地 .vx/store

# 查看当前模式
$ vx config get local_store
local_store = false (using global store: ~/.vx/store)

混合模式 ​

可以选择性地将某些工具放在本地:

toml
# vx.toml
[settings]
local_store = false  # 默认使用全局

[tools]
node = "22.0.0"      # 使用全局 store
python = "3.11"      # 使用全局 store

[tools.local]
# 这些工具强制使用项目本地 store
my-custom-tool = "1.0.0"

2.7 PATH 优先级管理 ​

核心原则:vx 管理的工具 始终优先于 系统工具。

bash
# vx 激活后的 PATH 顺序
PATH=
  ~/.vx/envs/current/bin      # 1. 当前项目环境 (最高优先级)
  ~/.vx/shims                  # 2. vx shims
  ~/.vx/bin                    # 3. vx 全局工具
  /usr/local/bin               # 4. 系统工具
  /usr/bin                     # 5. 系统基础
  ...

实现方式 ​

rust
/// 构建 PATH 环境变量
pub fn build_path(env: &Environment) -> String {
    let mut paths = Vec::new();
    
    // 1. 当前项目环境 (最高优先级)
    if let Some(project_env) = &env.project {
        paths.push(project_env.bin_dir());
    }
    
    // 2. vx shims (用于动态解析)
    paths.push(vx_paths::shims_dir());
    
    // 3. vx 全局工具
    paths.push(vx_paths::global_bin());
    
    // 4. 过滤后的系统 PATH
    // 移除可能冲突的路径 (如 /usr/local/bin/node)
    for sys_path in std::env::var("PATH").unwrap_or_default().split(PATH_SEP) {
        if !is_conflicting_path(sys_path) {
            paths.push(PathBuf::from(sys_path));
        }
    }
    
    paths.iter()
        .map(|p| p.to_string_lossy())
        .collect::<Vec<_>>()
        .join(PATH_SEP)
}

/// 检查是否为冲突路径
fn is_conflicting_path(path: &str) -> bool {
    // 移除其他版本管理器的路径
    let conflicting = [
        ".nvm/", ".pyenv/", ".rbenv/", ".asdf/",
        "homebrew/opt/node", "homebrew/opt/python",
    ];
    conflicting.iter().any(|c| path.contains(c))
}

2.8 命令冲突解决 ​

当系统中存在同名命令时,vx 的解决策略:

bash
# 场景:系统有 node v18,项目需要 node v22

# 方案 1: vx 环境优先 (默认)
$ vx node --version
v22.0.0  # 使用 vx 管理的版本

# 方案 2: 显式使用系统版本
$ vx --system node --version
v18.0.0  # 使用系统 PATH 中的版本

# 方案 3: 查看所有可用版本
$ vx which --all node
node (vx managed):
  ~/.vx/envs/current/bin/node -> v22.0.0 (active)
  ~/.vx/store/node/20.0.0/bin/node
  
node (system):
  /usr/local/bin/node -> v18.0.0
  /usr/bin/node -> v16.0.0

2.9 多环境共存与切换 ​

bash
# 查看所有环境
$ vx env list
  NAME          TOOLS                    SIZE      CREATED
* project-a     node@22, python@3.11     12 KB     2 days ago
  project-b     node@20, go@1.23         8 KB      1 week ago
  ml-project    python@3.11, cuda@12     16 KB     3 days ago
  _default      node@lts, python@3       4 KB      1 month ago

# 切换环境
$ vx env use project-b
vx: switched to 'project-b'
  PATH updated: ~/.vx/envs/project-b/bin prepended

# 创建环境副本
$ vx env clone project-a project-a-test
vx: cloned 'project-a' to 'project-a-test' (0.1s)

# 删除环境 (只删除软链接,不删除 store)
$ vx env remove project-a-test
vx: removed 'project-a-test' (store untouched)

2.10 存储清理 ​

bash
# 查看存储使用情况
$ vx store status
Store: ~/.vx/store
  Total: 2.3 GB
  
  node:
    22.0.0    245 MB    used by: project-a, ml-project
    20.0.0    238 MB    used by: project-b
    18.0.0    230 MB    (unused)
    
  python:
    3.11.0    89 MB     used by: project-a, ml-project
    3.10.0    85 MB     (unused)

# 清理未使用的版本
$ vx store gc
Removing unused versions:
  node@18.0.0 (230 MB)
  python@3.10.0 (85 MB)
Freed: 315 MB

三、执行模式与环境激活 ​

3.1 自动激活机制 ​

当检测到 vx.toml 时,自动激活项目环境(类似 direnv):

bash
# 进入有 vx.toml 的目录
$ cd my-project
vx: activated 'my-project' (node 22.0.0, python 3.11)

# 自动使用项目配置的版本
$ node --version
v22.0.0

# 离开目录时自动退出
$ cd ..
vx: deactivated 'my-project'

3.2 手动 Shell 模式 ​

没有 vx.toml 时,可以手动进入子 shell:

bash
# 进入临时 vx shell
$ vx shell
(vx) $ node --version  # 使用 vx 默认版本
(vx) $ exit

# 指定工具版本进入
$ vx shell --with node@20 python@3.12
(vx) $ node --version
v20.0.0

3.3 多环境共存与切换 ​

支持多个项目环境同时存在:

bash
# 终端 1: 项目 A
$ cd project-a
vx: activated 'project-a' (node 18.0.0)

# 终端 2: 项目 B  
$ cd project-b
vx: activated 'project-b' (node 22.0.0)

# 两个环境独立,互不影响

环境切换命令 ​

bash
# 查看当前激活的环境
$ vx env
Active: project-a
  node: 18.0.0
  python: 3.11

# 列出所有已知环境
$ vx env list
  project-a     ~/code/project-a     node@18, python@3.11
  project-b     ~/code/project-b     node@22, go@1.23
* project-c     ~/code/project-c     rust@1.84 (current)

# 手动切换到另一个项目环境
$ vx env use project-b
vx: switched to 'project-b'

# 临时使用不同版本(不修改配置)
$ vx env override node@20
vx: node overridden to 20.0.0 (session only)

3.4 环境激活实现 ​

rust
/// 环境激活策略
pub enum ActivationMode {
    /// 自动激活 (检测到 vx.toml)
    Auto,
    /// 手动 shell (vx shell)
    Manual,
    /// 单次执行 (vx <cmd>)
    Oneshot,
}

/// 环境管理器
pub struct EnvironmentManager {
    /// 当前激活的环境
    active: Option<ProjectEnvironment>,
    /// 所有已知环境
    known_envs: HashMap<String, ProjectEnvironment>,
    /// 临时覆盖
    overrides: HashMap<String, Version>,
}

impl EnvironmentManager {
    /// 检测并激活环境
    pub fn detect_and_activate(&mut self, cwd: &Path) -> Result<()> {
        if let Some(config_path) = find_vx_toml(cwd) {
            let env = ProjectEnvironment::load(&config_path)?;
            self.activate(env)?;
        }
        Ok(())
    }
    
    /// 切换环境
    pub fn switch_to(&mut self, name: &str) -> Result<()> {
        if let Some(env) = self.known_envs.get(name) {
            self.activate(env.clone())?;
        }
        Ok(())
    }
}

3.5 Shell 集成 ​

Bash/Zsh 集成 ​

bash
# ~/.bashrc 或 ~/.zshrc
eval "$(vx hook bash)"  # 或 zsh

# 这会:
# 1. 设置 cd 钩子,自动检测 vx.toml
# 2. 设置提示符显示当前环境
# 3. 添加自动补全

PowerShell 集成 ​

powershell
# $PROFILE
Invoke-Expression (& vx hook pwsh)

Fish 集成 ​

fish
# ~/.config/fish/config.fish
vx hook fish | source

3.6 执行模式对比 ​

特性单次执行 vx <cmd>自动激活手动 Shell vx shell
触发方式显式调用cd 到项目目录显式调用
环境生命周期命令执行期间直到离开目录直到 exit
项目配置可选读取自动读取可选读取
多环境不适用自动切换手动切换
AI 使用✅ 推荐✅ 推荐不适用

四、命令解析流程 ​

vx <command> [args...]
     │
     ▼
┌──────────────────────────────────────────────────────────────┐
│ 1. 内置命令? (install, list, shell, which, info)   │
│    └─► 是 → 执行内置命令                                     │
├──────────────────────────────────────────────────────────────┤
│ 2. Provider Runtime? (node, go, cargo, uv, npm...)         │
│    └─► 是 → 通过 Provider 执行(可能自动安装)               │
├──────────────────────────────────────────────────────────────┤
│ 3. 已注册系统工具? (xcodebuild, msbuild, curl...)          │
│    └─► 是 → 设置环境后执行                                   │
├──────────────────────────────────────────────────────────────┤
│ 4. PATH 中存在?                                             │
│    └─► 是 → 直接执行                                         │
├──────────────────────────────────────────────────────────────┤
│ 5. 跨平台别名? (copy → robocopy/cp)                        │
│    └─► 是 → 映射到平台命令后执行                             │
├──────────────────────────────────────────────────────────────┤
│ 6. 未找到 → 友好错误提示                                     │
└──────────────────────────────────────────────────────────────┘

五、跨平台命令映射 ​

对于语法基本一致的命令,提供统一别名:

toml
# vx 内置的跨平台别名
[aliases]
# 网络工具
http = { macos = "curl", linux = "curl", windows = "curl" }

# 文件操作 (语法差异大,不建议映射)
# copy = { macos = "cp", linux = "cp", windows = "robocopy" }  # ❌ 语法不同

# 构建工具
[aliases.build]
macos = "xcodebuild"
windows = "msbuild"
linux = "make"

映射原则 ​

情况是否映射原因
curl (跨平台语法一致)✅ 直接使用所有平台都有,语法相同
xcodebuild / msbuild❌ 不映射语法完全不同,映射会造成混乱
cp / robocopy❌ 不映射参数语法差异大
git, docker✅ 直接使用跨平台工具,语法一致

结论:只对语法完全一致的命令提供映射,其他保持原生命令名。


六、系统工具注册 ​

6.1 工具分类 ​

分类说明示例
build构建工具xcodebuild, msbuild, make
language语言运行时swift, java
network网络工具curl, ssh, wget
vcs版本控制git, svn
container容器工具docker, kubectl
filesystem文件系统robocopy, rsync
archive压缩解压tar, zip, 7z
security安全工具codesign, signtool
system系统工具systemctl, sfc
package包管理apt, brew, winget
cloud云平台aws, az, gcloud
mlopsML/AI 工具nvidia-smi, mlflow

七、AI 友好设计 ​

7.1 能力发现 ​

AI 可以查询 vx 的完整能力:

bash
$ vx info --json
json
{
  "version": "0.1.0",
  "platform": { "os": "macos", "arch": "arm64" },
  
  "runtimes": {
    "node": { 
      "version": "22.0.0", 
      "installed": true,
      "commands": ["node", "npm", "npx"]
    },
    "go": { 
      "version": "1.23.0", 
      "installed": true,
      "commands": ["go", "gofmt"]
    },
    "rust": {
      "version": "1.84.0",
      "installed": true,
      "commands": ["cargo", "rustc", "rustfmt", "clippy"]
    }
  },
  
  "system_tools": {
    "available": [
      { "name": "xcodebuild", "category": "build", "platform": "macos" },
      { "name": "curl", "category": "network", "platform": "universal" },
      { "name": "git", "category": "vcs", "platform": "universal" },
      { "name": "docker", "category": "container", "platform": "universal" }
    ],
    "unavailable": [
      { "name": "msbuild", "category": "build", "platform": "windows", "reason": "Windows only" }
    ]
  },
  
  "features": {
    "auto_install": true,
    "shell_mode": true,
    "project_config": true
  }
}

7.2 MCP 工具定义 ​

typescript
// vx 提供的 MCP 工具
const vxTools = [
  {
    name: "vx_run",
    description: "Execute any command through vx unified interface. Use this for ALL command execution.",
    inputSchema: {
      type: "object",
      properties: {
        command: { 
          type: "string", 
          description: "Command name (e.g., 'node', 'curl', 'xcodebuild')" 
        },
        args: { 
          type: "array", 
          items: { type: "string" },
          description: "Command arguments"
        },
        cwd: { 
          type: "string", 
          description: "Working directory (optional)"
        }
      },
      required: ["command"]
    }
  },
  {
    name: "vx_info",
    description: "Get available tools and runtimes on this system",
    inputSchema: {
      type: "object",
      properties: {}
    }
  },
  {
    name: "vx_install",
    description: "Install a runtime or tool",
    inputSchema: {
      type: "object",
      properties: {
        name: { type: "string", description: "Runtime name (e.g., 'node', 'go')" },
        version: { type: "string", description: "Version (optional, defaults to latest)" }
      },
      required: ["name"]
    }
  }
]

7.3 AI 使用示例 ​

AI: 我需要构建这个 iOS 项目

# AI 首先查询能力
$ vx info --json | jq '.system_tools.available[] | select(.name=="xcodebuild")'
{
  "name": "xcodebuild",
  "category": "build",
  "platform": "macos"
}

# AI 执行构建
$ vx xcodebuild -project MyApp.xcodeproj -scheme MyApp -configuration Release build

# AI 签名
$ vx codesign --sign "Developer ID" MyApp.app

八、vx.toml 配置设计 ​

与现有设计保持一致,扩展系统工具支持:

toml
# vx.toml - 项目配置

[project]
name = "my-fullstack-app"

# 运行时版本 (已有设计)
[tools]
node = "22.0.0"
python = "3.11"
go = "1.23.0"
uv = "latest"

# 系统工具要求 (新增)
[system_tools]
required = ["docker", "kubectl", "git"]
optional = ["xcodebuild"]  # 平台特定,可选

# 行为设置 (已有设计)
[settings]
auto_install = true
cache_duration = "7d"

# 脚本定义 (已有设计)
[scripts]
dev = "npm run dev"
build = "npm run build && go build ./cmd/server"
test = "npm test && go test ./..."
deploy = "docker build -t myapp . && kubectl apply -f k8s/"

# 环境变量 (新增)
[env]
NODE_ENV = "development"
DATABASE_URL = "postgres://localhost/myapp"

# 环境特定配置 (新增)
[env.production]
NODE_ENV = "production"
DATABASE_URL = "${DATABASE_URL}"  # 从系统环境读取

九、CLI 命令设计 ​

9.1 命令概览 ​

vx - Universal Development Tool Manager

USAGE:
    vx <COMMAND> [ARGS]...
    vx <RUNTIME> [ARGS]...      # 转发到运行时
    vx <SYSTEM_TOOL> [ARGS]...  # 转发到系统工具

COMMANDS:
    # 核心命令
    install     Install a runtime
    list        List available runtimes and tools
    which       Show tool location and info
    run         Run a script defined in vx.toml
    
    # 环境命令
    shell       Enter project shell environment (manual)
    env         Manage environments
    hook        Generate shell integration script
    
    # 信息命令
    info            Show system information and capabilities (for AI)
    help            Show help
    version         Show version

EXAMPLES:
    vx node --version           # Run node
    vx npm install              # Run npm
    vx curl https://example.com # Run system curl
    vx xcodebuild build         # Run xcodebuild with env setup
    vx shell                    # Enter project environment (manual)
    vx env list                 # List known environments
    vx run build                # Run 'build' script from vx.toml
    vx info --json      # Show capabilities for AI

9.2 环境管理命令 ​

bash
# 查看当前环境
$ vx env
Active: my-project (auto-activated)
  Path: ~/code/my-project
  Tools:
    node: 22.0.0 (managed)
    python: 3.11 (managed)
    docker: 24.0.0 (system)

# 列出所有环境
$ vx env list
  NAME          PATH                    TOOLS
* my-project    ~/code/my-project       node@22, python@3.11
  backend       ~/code/backend          go@1.23, rust@1.84
  ml-project    ~/code/ml-project       python@3.11, cuda@12

# 切换环境
$ vx env use backend
vx: switched to 'backend'

# 临时覆盖版本
$ vx env override node@20
vx: node overridden to 20.0.0 (session only)

# 清除覆盖
$ vx env reset
vx: cleared all overrides

9.3 工具信息命令 ​

bash
# 查看工具信息
$ vx which node
node: ~/.vx/runtimes/node/22.0.0/bin/node
  Type: managed runtime
  Version: 22.0.0
  Provider: node

$ vx which xcodebuild
xcodebuild: /usr/bin/xcodebuild
  Type: system tool
  Category: build
  Platform: macOS
  Env: DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer

$ vx which unknown-tool
Error: 'unknown-tool' not found
  - Not a vx managed runtime
  - Not found in system PATH
  
  Did you mean: known-tool?

# 列出工具
$ vx list
Managed Runtimes:
  node     22.0.0    installed
  go       1.23.0    installed
  rust     1.84.0    installed

$ vx list --system
System Tools (available):
  xcodebuild    /usr/bin/xcodebuild     [build]
  curl          /usr/bin/curl           [network]
  git           /usr/bin/git            [vcs]
  docker        /usr/local/bin/docker   [container]

十、错误处理 ​

10.1 友好的错误提示 ​

bash
# 工具不存在
$ vx unknown-command
Error: Command 'unknown-command' not found

  vx searched:
    ✗ Not a vx built-in command
    ✗ Not a registered runtime
    ✗ Not found in PATH

  Suggestions:
    - Check spelling
    - Install with: vx install <runtime>
    - Or add to PATH

# 平台不支持
$ vx xcodebuild  # on Windows
Error: 'xcodebuild' is only available on macOS

  This tool requires:
    - Platform: macOS
    - Current: Windows

  Windows alternatives:
    - msbuild (for .NET/C++ projects)

# 需要安装
$ vx node  # node not installed
Node.js is not installed. Install now? [Y/n] y
Installing node@22.0.0...

十一、配置文件 ​

11.1 全局配置 ~/.vx/config.toml ​

toml
[defaults]
# 默认运行时版本
node = "lts"
go = "latest"

[system_tools]
# 是否启用系统工具发现
enabled = true

# 未知命令是否允许执行
allow_unknown = true

[shell]
# shell 提示符格式
prompt = "(vx:$PROJECT) "
# 自动激活
auto_activate = true

[ai]
# AI 模式:跳过确认提示
non_interactive = false

十二、实现计划 ​

Phase 1: 基础执行 (MVP) ✅ ​

  • [x] 命令解析和路由
  • [x] PATH 动态发现
  • [x] 基本执行转发
  • [x] vx which 命令
  • [x] vx info 命令 (AI 友好的能力发现)
  • [x] vx list --system 显示系统工具

Phase 2: 存储与虚拟环境 ​

  • [ ] 内容寻址存储 (~/.vx/store/)
  • [ ] 智能链接策略 (硬链接 → 软链接 → 复制)
  • [ ] 虚拟环境创建 (vx env create)
  • [ ] 环境切换与管理 (vx env use/list/remove)
  • [ ] 存储清理 (vx store gc)

Phase 3: 系统工具注册 ​

  • [ ] 平台工具注册表 (内置 TOML)
  • [ ] 工具特定环境设置
  • [ ] macOS 工具 (xcodebuild, codesign, swift...)
  • [ ] Windows 工具 (msbuild, robocopy, signtool...)
  • [ ] Linux 工具 (apt, systemctl...)
  • [ ] 跨平台工具 (docker, kubectl, terraform...)

Phase 4: 环境激活与 Shell 集成 ​

  • [ ] Shell hook 集成 (bash, zsh, fish, pwsh)
  • [ ] 自动激活 (检测 vx.toml)
  • [ ] PATH 优先级管理
  • [ ] Shim 模式 (IDE/非交互式支持)
  • [ ] 命令冲突解决

Phase 5: DevOps/AIOps 工具 ​

  • [ ] 云平台 CLI (aws, az, gcloud)
  • [ ] CI/CD 工具 (gh, act)
  • [ ] 监控工具 (prometheus, grafana)
  • [ ] MLOps 工具 (nvidia-smi, mlflow)

Phase 6: AI 集成 ​

  • [ ] MCP 工具定义
  • [ ] JSON 输出格式优化
  • [ ] 非交互模式完善

实现状态 (2026-01-07) ​

✅ 已完成功能 ​

  1. vx info 命令 - AI 友好的能力发现

    • JSON 输出格式,包含平台信息、运行时列表、系统工具、功能特性
    • 文本输出格式,人类可读
    • 完整的测试覆盖
  2. 系统工具发现机制

    • 动态检测 PATH 中的系统工具
    • 支持 7 个系统工具 Provider (curl, openssl, msbuild, msvc, xcodebuild, systemctl, choco)
    • 平台兼容性检查
    • 版本检测和路径解析
  3. vx list --system 命令

    • 按类别显示系统工具 (Build Tools, Compilers, Version Control 等)
    • 显示工具状态、版本、路径
    • --all 选项显示不兼容平台的工具
    • 统计摘要
  4. 测试和质量保证

    • 完整的单元测试 (info_tests.rs)
    • 集成测试更新
    • CLI 解析测试更新

🚧 下一步计划 ​

按照 RFC Phase 2 继续实现:

  • 内容寻址存储 (~/.vx/store/)
  • 虚拟环境创建和管理
  • 存储清理机制

十三、与现有设计的关系 ​

现有概念本 RFC 扩展
Provider不变,继续管理需要安装的运行时
Runtime不变,Provider 提供的可执行工具
SystemTool新增,系统已有的工具
VirtualEnvironment新增,基于软链接的隔离环境
ContentStore新增,内容寻址存储 (~/.vx/store/)
EnvironmentManager新增,多环境管理
vx.toml扩展,增加 system_tools 和 env

十四、FAQ ​

Q: 为什么使用软链接而不是复制? ​

A:

方案创建速度磁盘占用隔离性跨分区
软链接~0.1s0✅✅
硬链接~0.1s0✅❌
复制~10s100%✅✅

软链接是最佳平衡:

  • 速度:秒级创建环境
  • 空间:零额外占用,所有环境共享 store
  • 隔离:每个环境有独立的 bin 目录
  • 兼容:跨分区、跨文件系统都支持

Q: Windows 上软链接有权限问题? ​

A:

  • Windows 10 1703+ 开发者模式下无需管理员权限
  • vx 会自动检测,无权限时回退到复制模式
  • 可通过配置强制使用复制:
toml
# ~/.vx/config.toml
[storage]
link_mode = "copy"

Q: vx 和直接运行命令有什么区别? ​

A:

  1. 环境一致性 - vx 创建干净环境,避免环境污染
  2. 自动安装 - 运行时不存在时自动安装
  3. 版本管理 - 项目可以锁定工具版本
  4. AI 友好 - AI 只需要知道 vx <command>

Q: vx shell 和 direnv 有什么区别? ​

A:

  • direnv: 只管理环境变量
  • vx: 管理运行时版本 + 环境变量 + 系统工具

Q: 自动激活会影响性能吗? ​

A:

  • Shell hook 检测 vx.toml: ~5ms
  • 环境激活: ~20ms
  • 总开销很小,用户无感知

Q: 如何禁用自动激活? ​

A:

toml
# ~/.vx/config.toml
[shell]
auto_activate = false

Q: 多环境如何工作? ​

A: 每个终端会话独立,可以同时激活不同项目的环境。环境信息存储在内存中,不会相互干扰。


参考 ​

Released under the MIT License.