@huyuan-ai/cli 1.0.4 → 1.1.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 +13 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +2 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/update-notify.d.ts +6 -0
- package/dist/utils/update-notify.d.ts.map +1 -0
- package/dist/utils/update-notify.js +123 -0
- package/dist/utils/update-notify.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,13 +65,25 @@ huyuan-ai-cli --help
|
|
|
65
65
|
|
|
66
66
|
查看子命令帮助:`huyuan-ai-cli doubao ask --help`
|
|
67
67
|
|
|
68
|
-
##
|
|
68
|
+
## 环境变量
|
|
69
|
+
|
|
70
|
+
### 安装技能
|
|
69
71
|
|
|
70
72
|
| 变量 | 说明 |
|
|
71
73
|
|------|------|
|
|
72
74
|
| `HUYUAN_TOKEN_GATEWAY_URL` | Token Gateway 根地址(如 `https://your-app.vercel.app`),详见 [src/constants.ts](src/constants.ts) |
|
|
73
75
|
| `HUYUAN_SKILL_GITHUB_ORG` | 可选,默认 `WeDAOLabs` |
|
|
74
76
|
|
|
77
|
+
### 版本更新提示
|
|
78
|
+
|
|
79
|
+
命令执行结束后,CLI 会按频率向 npm registry 查询 `@huyuan-ai/cli` 是否有更新;若有且当前版本较旧,会在 stderr 提示升级命令。同一机器上 **24 小时内最多提示一次**,并限制拉取 registry 的频率,避免高频脚本刷屏。
|
|
80
|
+
|
|
81
|
+
| 变量 | 说明 |
|
|
82
|
+
|------|------|
|
|
83
|
+
| `HUYUAN_AI_DISABLE_UPDATE_CHECK` | 若设置为任意非空值,关闭上述新版本检查与提示(适合 CI、自动化脚本或不需要联网检查的场景)。 |
|
|
84
|
+
|
|
85
|
+
说明:若环境变量 **`CI`** 已设置(常见于 CI),也会跳过版本检查,无需再设 `HUYUAN_AI_DISABLE_UPDATE_CHECK`。
|
|
86
|
+
|
|
75
87
|
## 脚本
|
|
76
88
|
|
|
77
89
|
| 脚本 | 说明 |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,IAAI,OAAO,CAevC"}
|
package/dist/cli/program.js
CHANGED
|
@@ -6,6 +6,8 @@ import { registerDoubao } from '../sites/doubao/register.js';
|
|
|
6
6
|
const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8'));
|
|
7
7
|
export function createProgram() {
|
|
8
8
|
const program = new Command();
|
|
9
|
+
// 避免 --help / --version 时 process.exit,以便主流程可在 finally 中执行更新提示
|
|
10
|
+
program.exitOverride();
|
|
9
11
|
program
|
|
10
12
|
.name('huyuan-ai-cli')
|
|
11
13
|
.description('Huyuan AI 命令行工具')
|
package/dist/cli/program.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAC/C,CAAC;AAEzB,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,eAAe,CAAC;SACrB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SACpB,uBAAuB,EAAE,CAAC;IAE7B,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAC/C,CAAC;AAEzB,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,+DAA+D;IAC/D,OAAO,CAAC,YAAY,EAAE,CAAC;IACvB,OAAO;SACJ,IAAI,CAAC,eAAe,CAAC;SACrB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SACpB,uBAAuB,EAAE,CAAC;IAE7B,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { CommanderError } from 'commander';
|
|
2
3
|
import { createProgram } from './cli/program.js';
|
|
3
4
|
import { bootstrapOpencli } from './integrations/opencli/bootstrap.js';
|
|
5
|
+
import { notifyIfUpdateAvailable } from './utils/update-notify.js';
|
|
4
6
|
async function main() {
|
|
5
7
|
await bootstrapOpencli();
|
|
6
8
|
const program = createProgram();
|
|
7
|
-
|
|
9
|
+
try {
|
|
10
|
+
await program.parseAsync(process.argv);
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
if (err instanceof CommanderError) {
|
|
14
|
+
const code = err.code;
|
|
15
|
+
if (code === 'commander.helpDisplayed' ||
|
|
16
|
+
code === 'commander.help' ||
|
|
17
|
+
code === 'commander.version') {
|
|
18
|
+
process.exitCode = err.exitCode;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
await notifyIfUpdateAvailable();
|
|
26
|
+
}
|
|
8
27
|
}
|
|
9
28
|
main().catch((err) => {
|
|
10
29
|
console.error(err instanceof Error ? err.message : err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,IACE,IAAI,KAAK,yBAAyB;gBAClC,IAAI,KAAK,gBAAgB;gBACzB,IAAI,KAAK,mBAAmB,EAC5B,CAAC;gBACD,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;gBAChC,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,MAAM,uBAAuB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notify.d.ts","sourceRoot":"","sources":["../../src/utils/update-notify.ts"],"names":[],"mappings":"AAkFA;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgD7D"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { CONFIG_DIR } from './config.js';
|
|
6
|
+
const PACKAGE_NAME = '@huyuan-ai/cli';
|
|
7
|
+
const REGISTRY_URL = 'https://registry.npmjs.org/@huyuan-ai%2Fcli';
|
|
8
|
+
const UPDATE_NOTIFY_PATH = path.join(CONFIG_DIR, 'update-notify.json');
|
|
9
|
+
const TWENTY_FOUR_MS = 24 * 60 * 60 * 1000;
|
|
10
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
11
|
+
/** 与 registry `latest` 常见形态一致:比较 major.minor.patch 数值 */
|
|
12
|
+
function isNewerThan(latest, current) {
|
|
13
|
+
const a = parseSemverTriple(latest);
|
|
14
|
+
const b = parseSemverTriple(current);
|
|
15
|
+
if (!a || !b)
|
|
16
|
+
return false;
|
|
17
|
+
const [a0, a1, a2] = a;
|
|
18
|
+
const [b0, b1, b2] = b;
|
|
19
|
+
if (a0 > b0)
|
|
20
|
+
return true;
|
|
21
|
+
if (a0 < b0)
|
|
22
|
+
return false;
|
|
23
|
+
if (a1 > b1)
|
|
24
|
+
return true;
|
|
25
|
+
if (a1 < b1)
|
|
26
|
+
return false;
|
|
27
|
+
return a2 > b2;
|
|
28
|
+
}
|
|
29
|
+
function parseSemverTriple(v) {
|
|
30
|
+
const m = /^(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
|
|
31
|
+
if (!m?.[1] || !m[2] || !m[3])
|
|
32
|
+
return null;
|
|
33
|
+
return [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)];
|
|
34
|
+
}
|
|
35
|
+
function shouldSkipForVersionOnly(argv) {
|
|
36
|
+
if (argv.length !== 3)
|
|
37
|
+
return false;
|
|
38
|
+
const a = argv[2];
|
|
39
|
+
return a === '--version' || a === '-V';
|
|
40
|
+
}
|
|
41
|
+
async function fetchLatestFromRegistry() {
|
|
42
|
+
const res = await fetch(REGISTRY_URL, {
|
|
43
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
44
|
+
headers: { accept: 'application/json' },
|
|
45
|
+
});
|
|
46
|
+
if (!res.ok)
|
|
47
|
+
return null;
|
|
48
|
+
const data = (await res.json());
|
|
49
|
+
const latest = data['dist-tags']?.latest;
|
|
50
|
+
return typeof latest === 'string' ? latest : null;
|
|
51
|
+
}
|
|
52
|
+
function readCurrentVersion() {
|
|
53
|
+
try {
|
|
54
|
+
const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8'));
|
|
55
|
+
const v = pkg.version?.trim();
|
|
56
|
+
return v || null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function loadState() {
|
|
63
|
+
try {
|
|
64
|
+
const raw = await readFile(UPDATE_NOTIFY_PATH, 'utf-8');
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : {};
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function saveState(state) {
|
|
73
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
74
|
+
await writeFile(UPDATE_NOTIFY_PATH, JSON.stringify(state), 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 命令成功结束后调用:若 registry 上有更新的稳定版本,则最多每 24 小时提示一次。
|
|
78
|
+
* 拉取 registry 亦最多每 24 小时一次(缓存 `cachedLatest`)。
|
|
79
|
+
*/
|
|
80
|
+
export async function notifyIfUpdateAvailable() {
|
|
81
|
+
if (process.env.HUYUAN_AI_DISABLE_UPDATE_CHECK)
|
|
82
|
+
return;
|
|
83
|
+
if (process.env.CI)
|
|
84
|
+
return;
|
|
85
|
+
if (shouldSkipForVersionOnly(process.argv))
|
|
86
|
+
return;
|
|
87
|
+
const current = readCurrentVersion();
|
|
88
|
+
if (!current)
|
|
89
|
+
return;
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
let state = await loadState();
|
|
92
|
+
const needFetch = state.lastFetchAt === undefined || now - state.lastFetchAt >= TWENTY_FOUR_MS;
|
|
93
|
+
let latest = null;
|
|
94
|
+
if (needFetch) {
|
|
95
|
+
try {
|
|
96
|
+
latest = await fetchLatestFromRegistry();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (latest) {
|
|
102
|
+
state = { ...state, lastFetchAt: now, cachedLatest: latest };
|
|
103
|
+
await saveState(state);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
latest = state.cachedLatest ?? null;
|
|
111
|
+
}
|
|
112
|
+
if (!latest || !isNewerThan(latest, current))
|
|
113
|
+
return;
|
|
114
|
+
if (state.lastPromptAt !== undefined && now - state.lastPromptAt < TWENTY_FOUR_MS) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
console.error(chalk.yellow(`\n有新版本可用:${latest}(当前 ${current})。请执行以下命令升级:\n` +
|
|
118
|
+
chalk.cyan(`npm install -g ${PACKAGE_NAME}@latest`) +
|
|
119
|
+
'\n'));
|
|
120
|
+
state = { ...state, lastPromptAt: now };
|
|
121
|
+
await saveState(state);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=update-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notify.js","sourceRoot":"","sources":["../../src/utils/update-notify.ts"],"names":[],"mappings":"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"}
|