ribo-cli-setup 2.0.0 → 2.2.0
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 +5 -0
- package/bin/cli.js +60 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,6 +20,10 @@ npx ribo-cli-setup --gateway https://gw.ribo.internal --target qwenwork --bin-di
|
|
|
20
20
|
# 仅下载二进制,不自动授权
|
|
21
21
|
npx ribo-cli-setup --skip-auth
|
|
22
22
|
|
|
23
|
+
# 升级:强制重下二进制 + 重新安装技能(不碰 mcp.json)
|
|
24
|
+
npx ribo-cli-setup --upgrade
|
|
25
|
+
npx ribo-cli-setup --upgrade --target qwenwork
|
|
26
|
+
|
|
23
27
|
# 解除注册
|
|
24
28
|
npx ribo-cli-setup --uninstall --target workbuddy
|
|
25
29
|
```
|
|
@@ -50,6 +54,7 @@ RIBO_GATEWAY_URL=https://gw.ribo.internal npx ribo-cli-setup
|
|
|
50
54
|
| `--workbuddy` / `--qwenwork` | target 的快捷写法 |
|
|
51
55
|
| `--bin-dir <dir>` | 二进制安装目录,默认 `~/.local/bin` |
|
|
52
56
|
| `-f, --force` | 忽略本地已有版本,强制重新下载 |
|
|
57
|
+
| `--upgrade` | 升级:强制重下二进制 + 重新安装技能(不碰 mcp.json) |
|
|
53
58
|
| `--skip-auth` | 安装后不自动执行 auth init |
|
|
54
59
|
| `--uninstall` | 解除注册 |
|
|
55
60
|
| `-y, --yes` | 跳过确认 |
|
package/bin/cli.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* npx ribo-cli-setup --gateway <url> # 指定网关地址(下载源 + CLI 运行地址)
|
|
9
9
|
* npx ribo-cli-setup --target workbuddy|qwenwork
|
|
10
10
|
* npx ribo-cli-setup --force # 忽略本地已存在版本,强制重新下载
|
|
11
|
+
* npx ribo-cli-setup --upgrade # 升级:强制重下二进制 + 重新安装技能(不碰 mcp.json)
|
|
11
12
|
* npx ribo-cli-setup --uninstall # 解除注册
|
|
12
13
|
*
|
|
13
14
|
* 环境变量:RIBO_GATEWAY_URL 可替代 --gateway
|
|
@@ -24,7 +25,7 @@ const http = require('http');
|
|
|
24
25
|
const crypto = require('crypto');
|
|
25
26
|
const { execFileSync, spawnSync } = require('child_process');
|
|
26
27
|
|
|
27
|
-
const DEFAULT_GATEWAY = 'https://aigc.ribo-group.com/
|
|
28
|
+
const DEFAULT_GATEWAY = 'https://aigc.ribo-group.com/ribo/cli/gateway';
|
|
28
29
|
const BIN_NAME = process.platform === 'win32' ? 'ribo-cli.exe' : 'ribo-cli';
|
|
29
30
|
|
|
30
31
|
// ---------- 参数解析 ----------
|
|
@@ -34,6 +35,7 @@ function parseArgs(argv) {
|
|
|
34
35
|
target: null,
|
|
35
36
|
binDir: null,
|
|
36
37
|
force: false,
|
|
38
|
+
upgrade: false,
|
|
37
39
|
uninstall: false,
|
|
38
40
|
skipAuth: false,
|
|
39
41
|
yes: false,
|
|
@@ -48,6 +50,7 @@ function parseArgs(argv) {
|
|
|
48
50
|
case '--workbuddy': opts.target = 'workbuddy'; break;
|
|
49
51
|
case '--qwenwork': opts.target = 'qwenwork'; break;
|
|
50
52
|
case '--force': case '-f': opts.force = true; break;
|
|
53
|
+
case '--upgrade': opts.upgrade = true; break;
|
|
51
54
|
case '--uninstall': opts.uninstall = true; break;
|
|
52
55
|
case '--skip-auth': opts.skipAuth = true; break;
|
|
53
56
|
case '--yes': case '-y': opts.yes = true; break;
|
|
@@ -62,6 +65,10 @@ function parseArgs(argv) {
|
|
|
62
65
|
console.error(`--target 仅支持 workbuddy 或 qwenwork`);
|
|
63
66
|
process.exit(2);
|
|
64
67
|
}
|
|
68
|
+
if (opts.upgrade && opts.uninstall) {
|
|
69
|
+
console.error(`--upgrade 与 --uninstall 不能同时使用`);
|
|
70
|
+
process.exit(2);
|
|
71
|
+
}
|
|
65
72
|
return opts;
|
|
66
73
|
}
|
|
67
74
|
|
|
@@ -79,6 +86,7 @@ function printHelp() {
|
|
|
79
86
|
--qwenwork 等价于 --target qwenwork
|
|
80
87
|
--bin-dir <dir> 二进制安装目录(默认 ~/.local/bin)
|
|
81
88
|
-f, --force 忽略本地已有版本,强制重新下载
|
|
89
|
+
--upgrade 升级:强制重下二进制 + 重新安装技能(不碰 mcp.json)
|
|
82
90
|
--skip-auth 安装后不自动执行 auth init
|
|
83
91
|
--uninstall 解除注册(移除 mcp.json 条目与 Skill 包)
|
|
84
92
|
-y, --yes 跳过所有确认
|
|
@@ -178,7 +186,7 @@ function resolveBinDir(opts) {
|
|
|
178
186
|
if (opts.binDir) return path.resolve(opts.binDir);
|
|
179
187
|
if (process.platform === 'win32') {
|
|
180
188
|
const base = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
|
|
181
|
-
return path.join(base, 'ribo-cli
|
|
189
|
+
return path.join(base, 'ribo-cli');
|
|
182
190
|
}
|
|
183
191
|
return path.join(os.homedir(), '.local', 'bin');
|
|
184
192
|
}
|
|
@@ -255,6 +263,56 @@ async function main() {
|
|
|
255
263
|
return;
|
|
256
264
|
}
|
|
257
265
|
|
|
266
|
+
// 升级分支:强制重下二进制 + 重新安装技能(不碰 mcp.json,不弹授权)
|
|
267
|
+
if (opts.upgrade) {
|
|
268
|
+
opts.force = true;
|
|
269
|
+
// 确定升级目标:指定了 --target 就用指定的,否则扫描已安装的
|
|
270
|
+
const targets = [];
|
|
271
|
+
if (opts.target) {
|
|
272
|
+
targets.push(opts.target);
|
|
273
|
+
} else {
|
|
274
|
+
const home = os.homedir();
|
|
275
|
+
if (fs.existsSync(path.join(home, '.workbuddy'))) targets.push('workbuddy');
|
|
276
|
+
if (fs.existsSync(path.join(home, '.qwenworkcn'))) targets.push('qwenwork');
|
|
277
|
+
if (targets.length === 0) targets.push('workbuddy'); // 默认 workbuddy
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// 强制下载
|
|
281
|
+
if (needDownload || true) { // upgrade 始终强制下载
|
|
282
|
+
fs.mkdirSync(binDir, { recursive: true });
|
|
283
|
+
const url = `${opts.gateway}/download/${target.file}`;
|
|
284
|
+
console.log(`→ 升级下载 ${target.file} (${(target.size / 1024 / 1024).toFixed(1)} MB)…`);
|
|
285
|
+
try {
|
|
286
|
+
await downloadFile(url, binPath, target.sha256, target.size);
|
|
287
|
+
} catch (e) {
|
|
288
|
+
console.error(`\n✗ 下载失败: ${e.message}`);
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
console.log(`✓ 已更新 ${BIN_NAME} ${target.version} → ${binPath}`);
|
|
292
|
+
const diskSha = crypto.createHash('sha256').update(fs.readFileSync(binPath)).digest('hex');
|
|
293
|
+
if (target.sha256 && diskSha !== target.sha256) {
|
|
294
|
+
console.error(`✗ 本地文件 SHA256 不匹配,已损坏`);
|
|
295
|
+
process.exit(1);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// 配置网关地址
|
|
300
|
+
console.log('→ 配置网关地址…');
|
|
301
|
+
run(binPath, ['config', 'set-gateway', opts.gateway]);
|
|
302
|
+
|
|
303
|
+
// 对每个已安装目标重新安装技能(--skills-only 不碰 mcp.json)
|
|
304
|
+
for (const t of targets) {
|
|
305
|
+
const flag = t === 'qwenwork' ? '--qwenwork' : '--workbuddy';
|
|
306
|
+
console.log(`→ 重新安装 ${t === 'qwenwork' ? '千问办公' : 'WorkBuddy'} 技能包…`);
|
|
307
|
+
run(binPath, ['install', flag, '--skills-only']);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
notePathIfMissing(binDir);
|
|
311
|
+
console.log();
|
|
312
|
+
console.log('✓ 升级完成。');
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
|
|
258
316
|
if (needDownload) {
|
|
259
317
|
fs.mkdirSync(binDir, { recursive: true });
|
|
260
318
|
const url = `${opts.gateway}/download/${target.file}`;
|