fnm-ai 是一个 Windows 优先的 Node.js 版本管理工具。它基于 fnm 的快速版本切换能力,并增加了自然语言入口:你可以直接说“帮我切换到 Node 20”“安装最新 LTS 并使用它”“检查当前环境配置”。
这个仓库同时包含底层 fnm Rust 二进制和 npm wrapper。npm 包当前发布名是 fnm-ai,安装后提供 fnm-api 和 fnm-ai 两个可执行命令。
- 用中文或英文管理 Node.js 版本:安装、切换、列出、查看当前版本、设置默认版本、卸载。
- 默认使用 Kimi
kimi-k2.6,通过 OpenAI-compatiblechat/completions接口调用模型。 fnm-api会读取本地配置,并在缺少 fnm 环境变量时自动执行fnm env --json初始化子进程环境。- 交互模式内置两个常用预设:切换当前项目环境、检查当前环境配置。
- AI 输出只会映射到固定 fnm 动作,不会执行模型返回的任意 shell 命令。
当前 npm 包面向 Windows x64:
{
"os": ["win32"],
"cpu": ["x64"]
}README 中的示例默认使用 Windows PowerShell。
npm install -g fnm-ai安装后推荐使用 fnm-api:
fnm-api "检查当前环境配置"fnm-ai 是同一个 npm wrapper 的别名。底层 Rust 二进制也提供 fnm ai 和 fnm api:
fnm ai "帮我切换到 Node 20"
fnm api "检查当前环境配置"普通 npm 安装场景建议优先使用 fnm-api,因为它会自动读取 AI 配置并补齐常见的 fnm 子进程环境。
默认模型是:
kimi-k2.6
配置 Kimi:
fnm-api config set --base-url https://api.moonshot.ai/v1 --api-key <your-kimi-api-key>如果要显式指定模型:
fnm-api config set --base-url https://api.moonshot.ai/v1 --api-key <your-kimi-api-key> --model kimi-k2.6查看配置:
fnm-api config get输出会隐藏 API key 的中间部分:
{
"baseUrl": "https://api.moonshot.ai/v1",
"apiKey": "sk-...xxxx",
"model": null,
"path": "C:\\Users\\you\\AppData\\Roaming\\fnm-ai\\config.json"
}查看配置文件路径:
fnm-api config pathWindows 默认位置通常是:
%APPDATA%\fnm-ai\config.json
也可以用环境变量覆盖配置文件:
$env:FNM_AI_BASE_URL = "https://api.moonshot.ai/v1"
$env:FNM_AI_API_KEY = "<your-kimi-api-key>"
$env:FNM_AI_MODEL = "kimi-k2.6"环境变量优先级高于配置文件:
FNM_AI_BASE_URL覆盖baseUrlFNM_AI_API_KEY覆盖apiKeyFNM_AI_MODEL覆盖model
安装并切换:
fnm-api "安装 Node 20 并马上使用"
fnm-api "install node 20 and use it"切换版本,缺失时自动安装:
fnm-api "use node 22, install it if missing"
fnm-api "切换到 Node 18"查看当前版本:
fnm-api "现在用的是哪个 Node 版本"
fnm-api "what version am I using"列出版本:
fnm-api "列出已安装版本"
fnm-api "list remote lts versions"设置默认版本:
fnm-api "把 Node 20 设置成默认版本"卸载版本:
fnm-api "卸载 Node 16"不带参数运行会进入交互模式:
fnm-api启动后会看到两个预设:
fnm ai is ready.
Presets:
1. switch environment
2. check current environment config
预设 1 会根据当前目录的 .node-version、.nvmrc、package.json engines.node 或默认版本切换环境。
预设 2 会打印 fnm 目录、Node 镜像、架构、版本文件策略、corepack、resolve engines、multishell 路径、PATH 状态和当前 Node 版本。
也可以直接说:
fnm-api "先切换环境"
fnm-api "检查当前环境配置"fnm 切换 Node 版本依赖运行时环境变量和 PATH,例如:
FNM_MULTISHELL_PATHFNM_DIRFNM_VERSION_FILE_STRATEGYFNM_NODE_DIST_MIRRORFNM_COREPACK_ENABLEDFNM_RESOLVE_ENGINESFNM_ARCHPATH
传统 fnm 用法需要在 shell profile 中加载:
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expressionfnm-api 的 npm wrapper 会在启动时做额外初始化:
- 读取
%APPDATA%\fnm-ai\config.json。 - 把
baseUrl、apiKey、model转成FNM_AI_BASE_URL、FNM_AI_API_KEY、FNM_AI_MODEL。 - 如果缺少
FNM_MULTISHELL_PATH,自动执行fnm env --json。 - 合并
fnm env --json返回的FNM_*变量。 - 把 multishell 路径加入子进程
PATH。 - 启动真正的
fnm ai。
因此,即使当前 PowerShell 没有提前加载 fnm env,下面的命令也能在 fnm-api 子进程里看到完整 fnm 环境:
fnm-api "检查当前环境配置"需要注意的是,Windows、PowerShell 和 Node.js 子进程都有同一个限制:子进程不能永久修改已经运行中的父终端环境变量。
这意味着:
fnm-api可以为自己的子进程补齐FNM_*和PATH。fnm-api可以更新 fnm 的 multishell 链接,让 fnm 知道应该使用哪个 Node 版本。fnm-api退出后,父 PowerShell 中已经存在的PATH不一定会自动刷新。
如果你希望 fnm-api "切换到 Node 20" 之后,当前 PowerShell 里的 node -v 也马上稳定使用该版本,请把下面这行加入 PowerShell profile:
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression创建并打开 profile:
if (-not (Test-Path $profile)) { New-Item $profile -Force }
Invoke-Item $profile写入后重启 PowerShell。
AI provider 只负责把自然语言请求翻译成固定 JSON 动作。当前允许的动作是:
help
exit
switch_environment
check_environment
install
use
list_local
list_remote
current
default
uninstall
模型不能返回任意 shell 命令并让工具执行。自然语言请求最终会映射到这些 fnm 能力:
fnm installfnm usefnm listfnm list-remotefnm currentfnm defaultfnm uninstallfnm env
安装依赖:
pnpm install构建 Rust 二进制:
cargo build运行 AI 相关单元测试:
cargo test ai::tests运行 e2e:
pnpm test -- e2e/ai.test.ts测试 npm wrapper:
node bin\fnm-ai.mjs config set --base-url https://api.moonshot.ai/v1 --api-key test-key
node bin\fnm-ai.mjs config get
node bin\fnm-ai.mjs "检查当前环境配置"打包检查:
npm pack --dry-run发布前应确保:
cargo fmt已运行。cargo test ai::tests通过。- 相关 e2e 测试通过。
.changeset/中包含本次变更说明。
GPL-3.0