fnva 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,87 +1,141 @@
1
- # 环境切换工具 (fnva)
1
+ # fnva - Fast Environment Version Alter
2
2
 
3
- 跨平台环境切换工具,支持 Java 和 LLM 环境配置管理。
3
+ 跨平台环境管理工具,支持 Java、LLMClaude Code 环境,具有默认环境设置和自动加载功能。
4
4
 
5
5
  ## 功能特性
6
6
 
7
7
  - ✅ **Java 环境管理**:快速切换不同版本的 JDK
8
8
  - ✅ **LLM 环境管理**:支持多 LLM 提供商配置切换
9
+ - ✅ **Claude Code (CC) 环境管理**:专门为 Claude Code 设计的环境切换
10
+ - ✅ **默认环境支持**:支持设置默认环境
11
+ - ✅ **自动加载**:新 Shell 会话自动加载默认环境
12
+ - ✅ **智能扫描**:高效扫描系统 Java 安装,支持自定义路径
9
13
  - ✅ **跨平台支持**:Windows、macOS、Linux
10
14
  - ✅ **多 Shell 支持**:bash、zsh、fish、PowerShell、CMD
11
- - ✅ **自动扫描**:自动检测系统中的 Java 安装
12
- - ✅ **环境变量引用**:支持 `${VAR_NAME}` 格式引用系统环境变量
15
+ - ✅ **配置化扫描**:支持配置文件和环境变量自定义扫描路径
16
+ - ✅ **高效去重**:智能去除重复的环境条目
13
17
 
14
18
  ## 安装
15
19
 
16
- ### 通过 npm 安装(推荐)
20
+ ### 方式一:通过 npm 安装(推荐)
17
21
 
18
22
  ```bash
19
23
  # 全局安装
20
24
  npm install -g fnva
21
25
 
22
- # 或使用 yarn
26
+ # 使用 yarn
23
27
  yarn global add fnva
24
28
 
25
- # 或使用 pnpm
29
+ # 使用 pnpm
26
30
  pnpm add -g fnva
27
31
  ```
28
32
 
29
- 安装完成后,可以直接使用 `fnva` 命令。
33
+ ### 方式二:从 Releases 下载二进制文件
30
34
 
31
- ### 从源码构建
35
+ 1. 访问 [GitHub Releases](https://github.com/your-repo/fnva/releases)
36
+ 2. 下载对应平台的二进制文件:
37
+ - Windows: `fnva-win32-x64.exe`
38
+ - macOS: `fnva-darwin-x64` 或 `fnva-darwin-arm64`
39
+ - Linux: `fnva-linux-x64`
32
40
 
33
- #### 本地构建(当前平台)
41
+ 3. 将二进制文件重命名为 `fnva`(Windows 下为 `fnva.exe`)
42
+
43
+ 4. 添加到 PATH 环境变量(详见下面的配置步骤)
44
+
45
+ ### 方式三:从源码构建(开发者)
46
+
47
+ **前置要求:**
48
+ - **Rust** 1.70+
49
+ - **系统依赖**:
50
+ - Linux: `pkg-config`, `libssl-dev`, `build-essential`
51
+ - macOS: Xcode Command Line Tools
52
+ - Windows: Microsoft Visual Studio C++ Build Tools
34
53
 
35
54
  ```bash
36
- git clone <repository-url>
37
- cd cool-utils
38
- npm run build
39
- ```
55
+ # 克隆仓库
56
+ git clone git@github.com:Protagonistss/fnva.git
57
+ cd fnva
40
58
 
41
- 编译后的二进制文件位于 `platforms/<platform>/fnva`。
59
+ # 构建
60
+ cargo build --release
42
61
 
43
- #### 构建所有平台
62
+ # 二进制文件位置:
63
+ # Windows: target\release\fnva.exe
64
+ # macOS/Linux: target/release/fnva
65
+ ```
44
66
 
45
- 项目使用 GitHub Actions 自动构建所有平台的二进制文件。当创建版本标签时,会自动构建并发布到 npm。
67
+ ### 安装后配置
46
68
 
47
- **手动触发构建:**
48
- 1. 在 GitHub 上创建新的 Release 标签(例如 `v0.1.0`)
49
- 2. GitHub Actions 会自动构建所有平台
50
- 3. 构建完成后自动发布到 npm
69
+ #### 1. 验证安装
51
70
 
52
- **本地构建所有平台(需要交叉编译工具):**
53
71
  ```bash
54
- npm run build:all
72
+ fnva --version
55
73
  ```
56
74
 
57
- 注意:需要安装 `cross` 工具:`cargo install cross`
75
+ #### 2. Shell 集成
76
+
77
+ 为了获得最佳体验,需要配置 Shell 集成。这会让 fnva 在新的 Shell 会话中自动加载环境。
58
78
 
59
- ### 添加到 PATH
79
+ **PowerShell(推荐):**
80
+ ```powershell
81
+ # 添加到 PowerShell Profile
82
+ fnva env env --shell powershell | Out-String | Invoke-Expression
60
83
 
61
- 将二进制文件复制到系统 PATH 中,或创建符号链接:
84
+ # 或手动添加到 $PROFILE
85
+ echo 'fnva env env --shell powershell | Out-String | Invoke-Expression' >> $PROFILE
86
+ ```
62
87
 
88
+ **Bash/Zsh:**
63
89
  ```bash
64
- # Linux/macOS
65
- sudo ln -s $(pwd)/target/release/fnva /usr/local/bin/fnva
90
+ # 添加到 ~/.bashrc 或 ~/.zshrc
91
+ echo 'eval "$(fnva env env --shell bash)"' >> ~/.bashrc
92
+ # 或
93
+ echo 'eval "$(fnva env env --shell zsh)"' >> ~/.zshrc
66
94
 
67
- # 或添加到 ~/.bashrc 或 ~/.zshrc
68
- export PATH="$PATH:$(pwd)/target/release"
95
+ # 重新加载配置
96
+ source ~/.bashrc # 或 source ~/.zshrc
69
97
  ```
70
98
 
71
- ## 使用方法
99
+ **Fish:**
100
+ ```fish
101
+ # 添加到 ~/.config/fish/config.fish
102
+ echo 'fnva env env --shell fish | source' >> ~/.config/fish/config.fish
103
+ ```
72
104
 
73
- ### Java 环境管理
105
+ #### 3. 配置文件
74
106
 
75
- #### 列出所有 Java 环境
107
+ 首次运行时,fnva 会自动创建配置文件:
76
108
 
77
109
  ```bash
110
+ # 配置文件位置
111
+ Linux/macOS: ~/.fnva/config.toml
112
+ Windows: %USERPROFILE%\.fnva\config.toml
113
+ ```
114
+
115
+ #### 4. 测试安装
116
+
117
+ ```bash
118
+ # 列出所有环境类型
119
+ fnva env list-types
120
+
121
+ # 查看 Java 环境
78
122
  fnva java list
123
+
124
+ # 查看 CC 环境
125
+ fnva cc list
126
+
127
+ # 查看 LLM 环境
128
+ fnva llm list
79
129
  ```
80
130
 
81
- #### 扫描系统中的 Java 安装
131
+ ## 使用方法
132
+
133
+ ### Java 环境管理
134
+
135
+ #### 列出所有 Java 环境
82
136
 
83
137
  ```bash
84
- fnva java scan
138
+ fnva java list
85
139
  ```
86
140
 
87
141
  #### 添加 Java 环境
@@ -93,11 +147,36 @@ fnva java add --name jdk-17 --home /usr/lib/jvm/java-17-openjdk --description "O
93
147
  #### 切换到 Java 环境
94
148
 
95
149
  ```bash
96
- # 自动检测 shell
150
+ # Bash / Zsh
97
151
  eval "$(fnva java use jdk-17)"
98
152
 
99
- # 指定 shell
100
- eval "$(fnva java use jdk-17 --shell bash)"
153
+ # Fish
154
+ fnva java use jdk-17 --shell fish | source
155
+
156
+ # PowerShell
157
+ fnva java use jdk-17 --shell powershell | Invoke-Expression
158
+
159
+ # CMD
160
+ fnva java use jdk-17 --shell cmd > %TEMP%\fnva_use.cmd && call %TEMP%\fnva_use.cmd
161
+ ```
162
+
163
+ #### 设置默认 Java 环境
164
+
165
+ ```bash
166
+ # 设置默认环境
167
+ fnva java default jdk-21
168
+
169
+ # 查看当前默认环境
170
+ fnva java default
171
+
172
+ # 清除默认设置
173
+ fnva java default --unset
174
+ ```
175
+
176
+ #### 查看当前激活的环境
177
+
178
+ ```bash
179
+ fnva java current
101
180
  ```
102
181
 
103
182
  #### 删除 Java 环境
@@ -106,6 +185,52 @@ eval "$(fnva java use jdk-17 --shell bash)"
106
185
  fnva java remove jdk-17
107
186
  ```
108
187
 
188
+ #### 扫描系统中的 Java 安装
189
+
190
+ ```bash
191
+ fnva java scan
192
+ ```
193
+
194
+ **扫描功能详解:**
195
+
196
+ **基础扫描:**
197
+ - 自动检测系统标准 Java 安装路径
198
+ - 扫描用户主目录下的 `.fnva/java-packages`
199
+ - 检查 PATH 环境变量中的 Java 可执行文件
200
+
201
+ **自定义扫描路径:**
202
+
203
+ 1. **配置文件方式**(推荐):
204
+ ```toml
205
+ # ~/.fnva/config.toml
206
+ custom_java_scan_paths = [
207
+ "D:\\tools\\java",
208
+ "/opt/custom/java",
209
+ "/home/user/my-jdks"
210
+ ]
211
+ ```
212
+
213
+ 2. **环境变量方式**:
214
+ ```bash
215
+ # 临时添加扫描路径
216
+ export FNVA_SCAN_PATHS="/path/to/jdk1:/path/to/jdk2"
217
+ fnva java scan
218
+
219
+ # Windows
220
+ set FNVA_SCAN_PATHS=D:\tools\java;E:\other\java
221
+ fnva java scan
222
+ ```
223
+
224
+ **扫描性能:**
225
+ - 🔒 **安全**:只扫描指定路径,不进行全盘搜索
226
+ - ⚡ **快速**:使用高效的去重算法,避免重复处理
227
+ - 🎯 **精确**:智能识别 Java 安装,过滤无效路径
228
+
229
+ **支持的扫描路径:**
230
+ - Windows:`C:\Program Files\Java`、`C:\Program Files\Eclipse Adoptium` 等
231
+ - macOS:`/Library/Java/JavaVirtualMachines`、`/opt/homebrew/Caskroom` 等
232
+ - Linux:`/usr/lib/jvm`、`/opt/java`、`/usr/local/java` 等
233
+
109
234
  ### LLM 环境管理
110
235
 
111
236
  #### 列出所有 LLM 环境
@@ -171,6 +296,126 @@ fnva llm use openai-dev --shell powershell | Invoke-Expression
171
296
  fnva llm remove openai-dev
172
297
  ```
173
298
 
299
+ ### Claude Code (CC) 环境管理
300
+
301
+ 专门为 Claude Code 设计的环境管理功能,支持多种 Claude Code 兼容服务的环境切换。
302
+
303
+ #### 列出所有 CC 环境
304
+
305
+ ```bash
306
+ fnva cc list
307
+ ```
308
+
309
+ #### 添加 CC 环境
310
+
311
+ ```bash
312
+ # 方法一:使用 JSON 配置
313
+ fnva cc add glmcc '{
314
+ "provider": "anthropic",
315
+ "api_key": "your-api-key",
316
+ "base_url": "https://open.bigmodel.cn/api/anthropic",
317
+ "model": "glm-4.6",
318
+ "description": "GLM-4.6 Claude Code 环境"
319
+ }'
320
+
321
+ # 方法二:直接编辑配置文件
322
+ # 编辑 ~/.fnva/config.toml,添加:
323
+ # [[cc_environments]]
324
+ # name = "glmcc"
325
+ # provider = "anthropic"
326
+ # api_key = "your-api-key"
327
+ # base_url = "https://open.bigmodel.cn/api/anthropic"
328
+ # model = "glm-4.6"
329
+ # description = "GLM-4.6 Claude Code 环境"
330
+ ```
331
+
332
+ #### 切换到 CC 环境
333
+
334
+ ```bash
335
+ # PowerShell(推荐)
336
+ fnva cc use glmcc --shell powershell | Invoke-Expression
337
+
338
+ # Bash/Zsh
339
+ eval "$(fnva cc use glmcc)"
340
+
341
+ # Fish
342
+ fnva cc use glmcc --shell fish | source
343
+
344
+ # CMD
345
+ fnva cc use glmcc --shell cmd > %TEMP%\fnva_cc.cmd && call %TEMP%\fnva_cc.cmd
346
+ ```
347
+
348
+ #### Manage default CC environment
349
+
350
+ ```bash
351
+ # Set default CC environment
352
+ fnva cc default glmcc
353
+
354
+ # Show current default CC environment
355
+ fnva cc default
356
+
357
+ # Unset default CC environment
358
+ fnva cc default --unset
359
+ ```
360
+
361
+ #### 查看当前激活的 CC 环境
362
+
363
+ ```bash
364
+ fnva cc current
365
+ ```
366
+
367
+ #### 删除 CC 环境
368
+
369
+ ```bash
370
+ fnva cc remove glmcc
371
+ ```
372
+
373
+ #### 预配置的 CC 环境
374
+
375
+ fnva 提供了一些常用的 CC 环境配置:
376
+
377
+ - **glmcc**: GLM-4.6 智谱 AI Claude Code 兼容服务
378
+ - **anycc**: AnyCC 通用 Claude Code 代理服务
379
+ - **kimicc**: Kimi AI Claude Code 兼容服务
380
+
381
+ #### 环境变量说明
382
+
383
+ CC 环境切换会设置以下环境变量:
384
+
385
+ - `ANTHROPIC_AUTH_TOKEN`: Claude Code 认证令牌
386
+ - `ANTHROPIC_BASE_URL`: Claude Code API 基础 URL
387
+ - `ANTHROPIC_DEFAULT_SONNET_MODEL`: 默认使用的模型
388
+ - `API_TIMEOUT_MS`: API 请求超时时间
389
+ - `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`: 禁用非必要网络流量
390
+
391
+ #### 配置示例
392
+
393
+ ```toml
394
+ [[cc_environments]]
395
+ name = "glmcc"
396
+ provider = "anthropic"
397
+ api_key = "your-glm-api-key"
398
+ base_url = "https://open.bigmodel.cn/api/anthropic"
399
+ model = "glm-4.6"
400
+ description = "GLM-4.6 Claude Code 环境"
401
+
402
+ [[cc_environments]]
403
+ name = "anycc"
404
+ provider = "anthropic"
405
+ api_key = "your-anycc-api-key"
406
+ base_url = "https://your-anycc-proxy.com"
407
+ model = "claude-sonnet-4-5"
408
+ description = "AnyCC 代理服务"
409
+
410
+ [[cc_environments]]
411
+ name = "kimicc"
412
+ provider = "anthropic"
413
+ api_key = "your-kimi-api-key"
414
+ base_url = "https://api.moonshot.cn/anthropic"
415
+ model = "kimi-k2-turbo-preview"
416
+ description = "Kimi AI Claude Code 环境"
417
+ ```
418
+
174
419
  ## 配置文件
175
420
 
176
421
  配置文件位置:
@@ -184,11 +429,13 @@ fnva llm remove openai-dev
184
429
  查看 `config/config.toml.example` 获取完整配置示例。
185
430
 
186
431
  ```toml
432
+ # Java 环境配置
187
433
  [[java_environments]]
188
434
  name = "jdk-17"
189
435
  java_home = "/usr/lib/jvm/java-17-openjdk"
190
436
  description = "OpenJDK 17"
191
437
 
438
+ # LLM 环境配置
192
439
  [[llm_environments]]
193
440
  name = "openai-dev"
194
441
  provider = "openai"
@@ -196,64 +443,51 @@ api_key = "${OPENAI_API_KEY}"
196
443
  base_url = "https://api.openai.com/v1"
197
444
  model = "gpt-4"
198
445
  temperature = 0.7
446
+ max_tokens = 2000
447
+ description = "OpenAI 开发环境"
448
+
449
+ # Claude Code (CC) 环境配置
450
+ [[cc_environments]]
451
+ name = "glmcc"
452
+ provider = "anthropic"
453
+ api_key = "${GLM_API_KEY}"
454
+ base_url = "https://open.bigmodel.cn/api/anthropic"
455
+ model = "glm-4.6"
456
+ description = "GLM-4.6 Claude Code 环境"
457
+
458
+ [[cc_environments]]
459
+ name = "anycc"
460
+ provider = "anthropic"
461
+ api_key = "sk-your-api-key"
462
+ base_url = "https://your-proxy.com"
463
+ model = "claude-sonnet-4-5"
464
+ description = "AnyCC 代理服务"
465
+
466
+ # 仓库配置
467
+ [repositories]
468
+ java = [
469
+ "https://mirrors.aliyun.com/eclipse/temurin-compliance/temurin",
470
+ "https://api.adoptium.net/v3"
471
+ ]
472
+ maven = [
473
+ "https://maven.aliyun.com/repository/public",
474
+ "https://search.maven.org/solrsearch/select"
475
+ ]
199
476
  ```
200
477
 
201
- ## 环境变量引用
202
-
203
- 在配置文件中可以使用 `${VAR_NAME}` 格式引用系统环境变量:
204
-
205
- ```toml
206
- [[llm_environments]]
207
- name = "openai-prod"
208
- provider = "openai"
209
- api_key = "${OPENAI_API_KEY}" # 从系统环境变量读取
210
- ```
211
-
212
- ## Shell 集成
213
-
214
- ### Bash/Zsh
215
-
216
- 在 `~/.bashrc` 或 `~/.zshrc` 中添加:
217
-
218
- ```bash
219
- # 快速切换 Java 环境
220
- alias java17='eval "$(fnva java use jdk-17)"'
221
- alias java11='eval "$(fnva java use jdk-11)"'
222
-
223
- # 快速切换 LLM 环境
224
- alias llm-openai='eval "$(fnva llm use openai-dev)"'
225
- alias llm-anthropic='eval "$(fnva llm use anthropic-prod)"'
226
- ```
227
-
228
- ### Fish
229
-
230
- 在 `~/.config/fish/config.fish` 中添加:
231
-
232
- ```fish
233
- function java17
234
- fnva java use jdk-17 | source
235
- end
236
-
237
- function llm-openai
238
- fnva llm use openai-dev | source
239
- end
240
- ```
241
-
242
- ### PowerShell
243
-
244
- 在 `$PROFILE` 中添加:
245
-
246
- ```powershell
247
- function Switch-Java {
248
- param([string]$Name)
249
- fnva java use $Name | Invoke-Expression
250
- }
251
-
252
- function Switch-Llm {
253
- param([string]$Name)
254
- fnva llm use $Name | Invoke-Expression
255
- }
256
- ```
478
+ ### 常用命令速查
479
+
480
+ | 命令 | 功能 | 示例 |
481
+ |------|------|------|
482
+ | `fnva java list` | 列出 Java 环境 | `fnva java list` |
483
+ | `fnva java use <name>` | 切换 Java 环境 | `fnva java use jdk21` |
484
+ | `fnva java default <name>` | 设置默认 Java | `fnva java default jdk21` |
485
+ | `fnva cc list` | 列出 CC 环境 | `fnva cc list` |
486
+ | `fnva cc use <name>` | 切换 CC 环境 | `fnva cc use glmcc` |
487
+ | `fnva cc default <name>` | 设置默认 CC 环境 | `fnva cc default glmcc` |
488
+ | `fnva llm list` | 列出 LLM 环境 | `fnva llm list` |
489
+ | `fnva llm use <name>` | 切换 LLM 环境 | `fnva llm use openai-dev` |
490
+ | `fnva env switch <type> <name>` | 通用切换 | `fnva env switch java jdk17` |
257
491
 
258
492
  ## 许可证
259
493
 
package/bin/fnva.js ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawnSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ function resolvePlatform() {
8
+ switch (process.platform) {
9
+ case 'win32':
10
+ case 'darwin':
11
+ case 'linux':
12
+ return process.platform;
13
+ default:
14
+ throw new Error(`Unsupported platform: ${process.platform}`);
15
+ }
16
+ }
17
+
18
+ function resolveArch() {
19
+ const arch = process.arch;
20
+ if (arch === 'x64') {
21
+ return 'x64';
22
+ }
23
+ if (arch === 'arm64') {
24
+ return 'arm64';
25
+ }
26
+ // Fallback to x64 for unknown architectures to keep previous behaviour.
27
+ return 'x64';
28
+ }
29
+
30
+ function buildBinaryPath() {
31
+ const platform = resolvePlatform();
32
+ const arch = resolveArch();
33
+ const scriptDir = __dirname;
34
+ const projectRoot = path.resolve(scriptDir, '..');
35
+ const platformDir = `${platform}-${arch}`;
36
+ const binaryName = platform === 'win32' ? 'fnva.exe' : 'fnva';
37
+ return path.join(projectRoot, 'platforms', platformDir, binaryName);
38
+ }
39
+
40
+ function run() {
41
+ const binaryPath = buildBinaryPath();
42
+
43
+ if (!fs.existsSync(binaryPath)) {
44
+ console.error(`Error: binary not found: ${binaryPath}`);
45
+ console.error('');
46
+ console.error("Please build the CLI binaries first, e.g. run 'npm run build' or 'npm run build:all'.");
47
+ process.exit(1);
48
+ }
49
+
50
+ const result = spawnSync(binaryPath, process.argv.slice(2), {
51
+ stdio: 'inherit',
52
+ });
53
+
54
+ if (result.error) {
55
+ console.error(`Failed to execute fnva: ${result.error.message}`);
56
+ process.exit(result.status ?? 1);
57
+ }
58
+
59
+ process.exit(result.status ?? 0);
60
+ }
61
+
62
+ run();
package/package.json CHANGED
@@ -1,13 +1,11 @@
1
1
  {
2
2
  "name": "fnva",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "跨平台环境切换工具,支持 Java 和 LLM 环境配置",
5
5
  "author": "protagonistss",
6
6
  "license": "MIT",
7
7
  "bin": {
8
- "fnva": "./bin/fnva",
9
- "fnva.cmd": "./bin/fnva.cmd",
10
- "fnva.exe": "./bin/fnva.bat"
8
+ "fnva": "./bin/fnva.js"
11
9
  },
12
10
  "scripts": {
13
11
  "prepublishOnly": "scripts/prepare-publish.sh",
package/platforms/fnva CHANGED
Binary file
Binary file
@@ -0,0 +1 @@
1
+ Skipping cross-compiled build for aarch64-unknown-linux-gnu