@zerozhang-giza/kdl-agent 0.1.0-beta.1 → 0.1.0-beta.3
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/CHANGELOG.md +17 -1
- package/README.md +4 -4
- package/SHA256SUMS +11 -11
- package/package.json +39 -9
- package/release.json +3 -3
- package/scripts/install.cjs +1 -0
- package/scripts/run.cjs +1 -0
- package/scripts/runtime/install.cjs +26 -4
- package/scripts/wizard.cjs +17 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
## 未发布
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 0.1.0-beta.3 - 2026-09-10
|
|
6
|
+
|
|
7
|
+
- 增加匿名新版检查、确认后同步升级 CLI/Skill 的 npm update 入口,保留登录配置和失败恢复。
|
|
8
|
+
- tag 流程经五平台验活和环境审批后自动公开 Release 并派发 npm;重复发布校验固定候选,冲突停止。
|
|
9
|
+
|
|
10
|
+
## 0.1.0-beta.2 - 2026-09-10
|
|
11
|
+
|
|
12
|
+
- GitHub Release 与 npm 已公开,五平台安装验证通过;首次实际 Trusted Publishing/OIDC 发行成功,registry 包与固定候选一致并提供 provenance。
|
|
13
|
+
- 新增代理 Basic 鉴权与白名单只读命令,明确订单 API 密钥和代理连接凭据的区别。
|
|
14
|
+
- 统一 Gateway 错误信封、字段级校验和 Retry-After 提示,补齐 HTTPS 连接指南与配套 Skill。
|
|
15
|
+
- 安装下载增加有限重试与半包清理,支持 KDL_AGENT_DOWNLOAD_TIMEOUT_MS;永久错误不重试,失败提供网络排查入口。
|
|
16
|
+
- 更新已公开的 beta 安装入口、发行证据、Trusted Publisher 配置与 latest 标签限制说明。
|
|
17
|
+
|
|
18
|
+
## 0.1.0-beta.1 - 2026-09-10
|
|
19
|
+
|
|
20
|
+
- GitHub Release 与 npm 已公开;五平台安装烟测、匿名 npm 精确版本/beta 向导与 Codex Skill 实装通过。
|
|
21
|
+
- npm 按平台下载安装器、SHA256 与版本校验、同版本 Skill 安装向导。
|
|
6
22
|
- 个人 npm 包 `@zerozhang-giza/kdl-agent`,终端命令保持 `kdl-agent`;升级、回退及卸载保留 `.kdl`。
|
|
7
23
|
- GoReleaser 候选、来源绑定检查、公开安装/API/Skill 文档与安装器回归。
|
|
8
24
|
- npm 打包允许清单同时验证文件缺失和意外夹带,包含同版本更新记录。
|
package/README.md
CHANGED
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
|
|
9
9
|
## npm 安装
|
|
10
10
|
|
|
11
|
-
需要 Node.js 22.14+ 和用户可写的 npm
|
|
11
|
+
需要 Node.js 22.14+ 和用户可写的 npm 全局目录。配套版本 `0.1.0-beta.3` 的发行结果见 [npm](https://www.npmjs.com/package/@zerozhang-giza/kdl-agent/v/0.1.0-beta.3) 和 [GitHub Release](https://github.com/gizaZerozhang/kdl-agent-cli/releases/tag/v0.1.0-beta.3):
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
npx @zerozhang-giza/kdl-agent@0.1.0-beta.
|
|
14
|
+
npx @zerozhang-giza/kdl-agent@0.1.0-beta.3 install
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
向导安装 CLI 与同版本 Skill,然后引导本机隐藏输入凭证并验证首次只读查询。Agent 自动安装使用 `install --yes --agent codex --no-login`,由用户在本地终端完成登录。仅安装 CLI 可执行 `npm install -g @zerozhang-giza/kdl-agent@0.1.0-beta.
|
|
17
|
+
向导安装 CLI 与同版本 Skill,然后引导本机隐藏输入凭证并验证首次只读查询。Agent 自动安装使用 `install --yes --agent codex --no-login`,由用户在本地终端完成登录。仅安装 CLI 可执行 `npm install -g @zerozhang-giza/kdl-agent@0.1.0-beta.3`。
|
|
18
18
|
|
|
19
|
-
npm 包按平台下载 GitHub Release 原生二进制并验证内置 SHA256
|
|
19
|
+
npm 包按平台下载 GitHub Release 原生二进制并验证内置 SHA256。当前请显式指定 beta 版本或 `@beta`;npm 自动附加的 `latest` 仍指向该预发行版,不代表稳定就绪。beta 的 macOS 程序未签名/公证;最低系统和真实业务仍待专项验收。安装、升级、回退与卸载见[安装指南](./docs/install.md),维护者见[发行操作](./docs/releasing.md)。
|
|
20
20
|
|
|
21
21
|
## 从源码构建
|
|
22
22
|
|
package/SHA256SUMS
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
c137d2d90fbcfff703f9bbce6215690e1e22c15eb513afbd47dc141b29510bbe BUILD.json
|
|
2
|
+
dfbfb2350f131474ae69f6862e1fbedab8afcb0fe154d3bc55df01057fca7785 api-guide.md
|
|
3
|
+
56cae14d0fff44d867275806126b7a90bd1d399d08ac41826d3df96eafaa3f9a cli-guide.md
|
|
4
|
+
5dbf7cef1797457ae91b67b2d8ef619c6f9c19477dc7ae3a2fc7c70f85bdc995 install.md
|
|
5
|
+
7f0e934259d96e8c541af62b47f3baa863f964c5a8185d80c62902020034997b kdl-agent-skill.zip
|
|
6
|
+
f7e89f716ac88879802374acaeed9954cc83cc95e528cf734312a1daabfe6bbc kdl-agent_0.1.0-beta.3_darwin_amd64.tar.gz
|
|
7
|
+
1871774881bf1821a1ec64371e276121480d56ab697d39ce08d1c237579b1430 kdl-agent_0.1.0-beta.3_darwin_arm64.tar.gz
|
|
8
|
+
5b2f8a2450c560be269d4e4f3d087a419cca54bab6acaed3723a42c3019527c0 kdl-agent_0.1.0-beta.3_linux_amd64.tar.gz
|
|
9
|
+
47fc0affd2c8c4776be8827528330b6c70af4f5120c5255d8ba3347f9eaff2b7 kdl-agent_0.1.0-beta.3_linux_arm64.tar.gz
|
|
10
|
+
32cc0f58e2096d28e3147f0b10a89b4f97bb90a2d64442181d8161355878e853 kdl-agent_0.1.0-beta.3_windows_amd64.zip
|
|
11
11
|
95a9aae626b807cd97b95fb73ff0207c72a88c10c936fc73da5a25fa4af14d10 openapi.yaml
|
|
12
|
-
|
|
12
|
+
8ef746e7d7f54b599c15f57941436e95f9a3688d7301c29b4418f1234e4d6de5 release-notes.md
|
package/package.json
CHANGED
|
@@ -1,20 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zerozhang-giza/kdl-agent",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.3",
|
|
4
4
|
"description": "快代理 CLI:账户与订单查询、授权操作及代理便利命令",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"engines": {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22.14.0"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"kdl-agent": "scripts/run.cjs"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/gizaZerozhang/kdl-agent-cli.git"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public",
|
|
18
|
+
"registry": "https://registry.npmjs.org/"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"scripts/runtime",
|
|
22
|
+
"scripts/run.cjs",
|
|
23
|
+
"scripts/install.cjs",
|
|
24
|
+
"scripts/wizard.cjs",
|
|
25
|
+
"scripts/verify-package.cjs",
|
|
26
|
+
"SHA256SUMS",
|
|
27
|
+
"release.json",
|
|
28
|
+
"CHANGELOG.md",
|
|
29
|
+
"THIRD_PARTY_NOTICES.txt"
|
|
30
|
+
],
|
|
11
31
|
"scripts": {
|
|
12
32
|
"postinstall": "node scripts/install.cjs",
|
|
13
33
|
"prepack": "node scripts/verify-package.cjs",
|
|
14
34
|
"test": "node --test tests/*.test.cjs",
|
|
15
35
|
"release:prepare": "node scripts/prepare-package.cjs"
|
|
16
36
|
},
|
|
17
|
-
"dependencies": {
|
|
18
|
-
|
|
19
|
-
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"https-proxy-agent": "7.0.6",
|
|
39
|
+
"tar": "7.5.22",
|
|
40
|
+
"yauzl": "3.4.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"yazl": "3.3.1"
|
|
44
|
+
},
|
|
45
|
+
"kdl": {
|
|
46
|
+
"command": "kdl-agent",
|
|
47
|
+
"skill": "kdl-agent",
|
|
48
|
+
"skillsPackage": "skills@1.5.25"
|
|
49
|
+
}
|
|
20
50
|
}
|
package/release.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.0-beta.
|
|
2
|
+
"version": "0.1.0-beta.3",
|
|
3
3
|
"repository": "gizaZerozhang/kdl-agent-cli",
|
|
4
|
-
"commit": "
|
|
4
|
+
"commit": "75934e505a6355bbe71b3db998c3026f6f8ff318",
|
|
5
5
|
"dirty": false,
|
|
6
6
|
"macosSigned": false,
|
|
7
|
-
"sha256": "
|
|
7
|
+
"sha256": "ff499485dbb890557f07637e58bc74b03f394411a7c2b4aa11c28188e4498c69"
|
|
8
8
|
}
|
package/scripts/install.cjs
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
if (process.env.npm_command !== 'exec') {
|
|
5
5
|
require('./runtime/install.cjs').ensureInstalled().catch(error => {
|
|
6
6
|
console.error(`安装失败:${error.message}`);
|
|
7
|
+
console.error('检查 HTTPS_PROXY 或设置 KDL_AGENT_DOWNLOAD_TIMEOUT_MS 后重新运行安装;GitHub 不可达时可从同版本 Release 手动安装并核对 SHA256。');
|
|
7
8
|
process.exitCode = 1;
|
|
8
9
|
});
|
|
9
10
|
}
|
package/scripts/run.cjs
CHANGED
|
@@ -4,6 +4,7 @@ const { spawn } = require('node:child_process');
|
|
|
4
4
|
async function main() {
|
|
5
5
|
const args = process.argv.slice(2);
|
|
6
6
|
if (args[0] === 'install') return require('./wizard.cjs').main(args.slice(1));
|
|
7
|
+
if (args[0] === 'update' && args[1] !== 'check') return require('./wizard.cjs').main(args.slice(1), { mode: 'update' });
|
|
7
8
|
const binary = await require('./runtime/install.cjs').ensureInstalled();
|
|
8
9
|
const child = spawn(binary, args, { stdio: 'inherit' });
|
|
9
10
|
for (const signal of ['SIGINT', 'SIGTERM']) process.on(signal, () => child.kill(signal));
|
|
@@ -49,23 +49,30 @@ function allowedURL(raw) {
|
|
|
49
49
|
return url;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
function downloadTimeout() {
|
|
53
|
+
const raw = process.env.KDL_AGENT_DOWNLOAD_TIMEOUT_MS || '60000';
|
|
54
|
+
if (!/^\d+$/.test(raw) || Number(raw) < 1000 || Number(raw) > 600000) throw new Error('KDL_AGENT_DOWNLOAD_TIMEOUT_MS 必须为 1000–600000 毫秒');
|
|
55
|
+
return Number(raw);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function downloadOnce(raw, destination, redirects = 0) {
|
|
53
59
|
const url = allowedURL(raw);
|
|
60
|
+
const timeout = downloadTimeout();
|
|
54
61
|
if (redirects > 5) throw new Error('下载重定向次数过多');
|
|
55
62
|
const proxy = process.env.HTTPS_PROXY || process.env.https_proxy;
|
|
56
63
|
const response = await new Promise((resolve, reject) => {
|
|
57
64
|
const request = https.get(url, { agent: proxy ? new HttpsProxyAgent(proxy) : undefined, headers: { 'User-Agent': 'kdl-agent-installer' } }, resolve);
|
|
58
|
-
request.setTimeout(
|
|
65
|
+
request.setTimeout(timeout, () => request.destroy(Object.assign(new Error('下载超时,请检查网络或 HTTPS_PROXY'), { code: 'ETIMEDOUT' })));
|
|
59
66
|
request.on('error', reject);
|
|
60
67
|
});
|
|
61
68
|
if ([301, 302, 303, 307, 308].includes(response.statusCode)) {
|
|
62
69
|
response.resume();
|
|
63
70
|
if (!response.headers.location) throw new Error('下载重定向缺少地址');
|
|
64
|
-
return
|
|
71
|
+
return downloadOnce(new URL(response.headers.location, url).href, destination, redirects + 1);
|
|
65
72
|
}
|
|
66
73
|
if (response.statusCode !== 200) {
|
|
67
74
|
response.resume();
|
|
68
|
-
throw new Error(`下载失败 HTTP ${response.statusCode};请核对版本及 Release 是否公开`);
|
|
75
|
+
throw Object.assign(new Error(`下载失败 HTTP ${response.statusCode};请核对版本及 Release 是否公开`), { statusCode: response.statusCode });
|
|
69
76
|
}
|
|
70
77
|
let size = 0;
|
|
71
78
|
const limit = new Transform({ transform(chunk, encoding, callback) {
|
|
@@ -75,6 +82,21 @@ async function download(raw, destination, redirects = 0) {
|
|
|
75
82
|
await pipeline(response, limit, fs.createWriteStream(destination, { flags: 'wx', mode: 0o600 }));
|
|
76
83
|
}
|
|
77
84
|
|
|
85
|
+
// 仅重试临时下载故障;校验、解压与替换仍由安装事务执行一次。
|
|
86
|
+
async function download(raw, destination, { attempt = downloadOnce, sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) } = {}) {
|
|
87
|
+
allowedURL(raw);
|
|
88
|
+
downloadTimeout();
|
|
89
|
+
if (fs.existsSync(destination)) throw new Error('下载目标已存在');
|
|
90
|
+
for (let retry = 0; ; retry++) {
|
|
91
|
+
try { return await attempt(raw, destination); } catch (error) {
|
|
92
|
+
fs.rmSync(destination, { force: true });
|
|
93
|
+
const transient = ['ETIMEDOUT', 'ECONNRESET', 'ECONNREFUSED', 'EAI_AGAIN', 'ERR_STREAM_PREMATURE_CLOSE'].includes(error.code) || [408, 500, 502, 503, 504].includes(error.statusCode);
|
|
94
|
+
if (!transient || retry >= 2) throw error;
|
|
95
|
+
await sleep(1000 * 2 ** retry);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
78
100
|
async function hashFile(file) {
|
|
79
101
|
const hash = crypto.createHash('sha256');
|
|
80
102
|
for await (const chunk of fs.createReadStream(file)) hash.update(chunk);
|
package/scripts/wizard.cjs
CHANGED
|
@@ -31,8 +31,22 @@ function parse(args) {
|
|
|
31
31
|
return options;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
async function
|
|
34
|
+
async function confirmUpdate() {
|
|
35
|
+
const prompt = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
36
|
+
try { return /^y(es)?$/i.test((await prompt.question('确认升级 CLI 与同版本 Skill?[y/N] ')).trim()); }
|
|
37
|
+
finally { prompt.close(); }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function main(args, { run = command, install = ensureInstalled, readConfig = config, checkBinary = verifyBinary, tty = process.stdin.isTTY, mode = 'install', confirm = confirmUpdate } = {}) {
|
|
35
41
|
const options = parse(args);
|
|
42
|
+
if (mode === 'update') {
|
|
43
|
+
options.noLogin = true;
|
|
44
|
+
if (options.help) {
|
|
45
|
+
console.log('同步升级 CLI 与同版本 Skill\n检查新版:kdl-agent update check --format json\n用法:npx --yes @zerozhang-giza/kdl-agent@<目标版本> update --agent codex [--yes]\n默认询问确认;非交互必须显式 --yes。保留登录配置,Skill 失败时重复同一命令修复。');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (options.noSkills) throw new Error('同步升级不能跳过 Skill;请移除 --no-skills');
|
|
49
|
+
}
|
|
36
50
|
if (options.help) {
|
|
37
51
|
console.log('安装快代理 CLI 与同版本 Skill\n\n用法:npx <包名>@<版本> install [--yes] [--agent codex] [--no-login] [--no-skills]\n\n--yes 非交互安装;安装 Skill 时须指定 --agent\n--no-login 仅安装,稍后在本地终端执行 kdl-agent auth login\n--no-skills 跳过 Skill,适用于直接使用 CLI\n升级或回退:使用目标版本再次运行;卸载 npm 包保留 .kdl 与 Skill。');
|
|
38
52
|
return;
|
|
@@ -42,6 +56,7 @@ async function main(args, { run = command, install = ensureInstalled, readConfig
|
|
|
42
56
|
const { pkg, repository } = readConfig();
|
|
43
57
|
if (!/^@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*$/.test(pkg.name)) throw new Error('npm 包名尚未绑定');
|
|
44
58
|
console.log(`目标版本:${pkg.name}@${pkg.version}`);
|
|
59
|
+
if (mode === 'update' && !options.yes && !await confirm()) { console.log('已取消升级,保留现有 CLI 与 Skill。'); return; }
|
|
45
60
|
console.log('正在下载并校验原生程序...');
|
|
46
61
|
await install();
|
|
47
62
|
const prefixResult = run('npm', ['prefix', '-g'], { timeout: 15000 });
|
|
@@ -76,7 +91,7 @@ async function main(args, { run = command, install = ensureInstalled, readConfig
|
|
|
76
91
|
if (result.status !== 0) throw new Error('CLI 已安装,Skill 安装未完成;重新运行此向导重试,已安装 CLI 将跳过');
|
|
77
92
|
console.log('Skill:已安装;目标 Agent 可能需要刷新会话');
|
|
78
93
|
} else console.log('Skill:按要求跳过');
|
|
79
|
-
if (options.noLogin) { console.log('登录:按要求跳过;用户稍后在本地终端执行 kdl-agent auth login 和 kdl-agent auth status'); return; }
|
|
94
|
+
if (options.noLogin) { console.log(mode === 'update' ? '升级完成,登录配置保持不变;请核对 kdl-agent --version,并刷新 Agent 会话。' : '登录:按要求跳过;用户稍后在本地终端执行 kdl-agent auth login 和 kdl-agent auth status'); return; }
|
|
80
95
|
let status = run(binary, ['auth', 'status', '--format', 'json'], { timeout: 25000 });
|
|
81
96
|
if (status.status !== 0) {
|
|
82
97
|
if (!tty) throw new Error('CLI/Skill 已安装,登录待用户在本地终端完成:kdl-agent auth login');
|