@zerozhang-giza/kdl-agent 0.1.0-beta.1 → 0.1.0-beta.2

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 CHANGED
@@ -2,7 +2,17 @@
2
2
 
3
3
  ## 未发布
4
4
 
5
- - npm 按平台下载安装器、SHA256 与版本校验、同版本 Skill 安装向导;首个候选版本 `0.1.0-beta.1`。
5
+ ## 0.1.0-beta.2 - 2026-09-10
6
+
7
+ - 新增代理 Basic 鉴权与白名单只读命令,明确订单 API 密钥和代理连接凭据的区别。
8
+ - 统一 Gateway 错误信封、字段级校验和 Retry-After 提示,补齐 HTTPS 连接指南与配套 Skill。
9
+ - 安装下载增加有限重试与半包清理,支持 KDL_AGENT_DOWNLOAD_TIMEOUT_MS;永久错误不重试,失败提供网络排查入口。
10
+ - 更新已公开的 beta 安装入口、发行证据、Trusted Publisher 配置与 latest 标签限制说明。
11
+
12
+ ## 0.1.0-beta.1 - 2026-09-10
13
+
14
+ - GitHub Release 与 npm 已公开;五平台安装烟测、匿名 npm 精确版本/beta 向导与 Codex Skill 实装通过。
15
+ - npm 按平台下载安装器、SHA256 与版本校验、同版本 Skill 安装向导。
6
16
  - 个人 npm 包 `@zerozhang-giza/kdl-agent`,终端命令保持 `kdl-agent`;升级、回退及卸载保留 `.kdl`。
7
17
  - GoReleaser 候选、来源绑定检查、公开安装/API/Skill 文档与安装器回归。
8
18
  - npm 打包允许清单同时验证文件缺失和意外夹带,包含同版本更新记录。
package/README.md CHANGED
@@ -8,15 +8,15 @@
8
8
 
9
9
  ## npm 安装
10
10
 
11
- 需要 Node.js 22.14+ 和用户可写的 npm 全局目录。首个预发行目标为 `0.1.0-beta.1`,仅在同版本 GitHub Release 与 npm 发布完成后可安装:
11
+ 需要 Node.js 22.14+ 和用户可写的 npm 全局目录。`0.1.0-beta.2` 已发布至 [npm](https://www.npmjs.com/package/@zerozhang-giza/kdl-agent/v/0.1.0-beta.2) 和 [GitHub Release](https://github.com/gizaZerozhang/kdl-agent-cli/releases/tag/v0.1.0-beta.2),匿名安装与 Codex Skill 实装已验证:
12
12
 
13
13
  ```bash
14
- npx @zerozhang-giza/kdl-agent@0.1.0-beta.1 install
14
+ npx @zerozhang-giza/kdl-agent@0.1.0-beta.2 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.1`。
17
+ 向导安装 CLI 与同版本 Skill,然后引导本机隐藏输入凭证并验证首次只读查询。Agent 自动安装使用 `install --yes --agent codex --no-login`,由用户在本地终端完成登录。仅安装 CLI 可执行 `npm install -g @zerozhang-giza/kdl-agent@0.1.0-beta.2`。
18
18
 
19
- npm 包按平台下载 GitHub Release 原生二进制并验证内置 SHA256。beta 的 macOS 程序未签名/公证;最低系统和真实业务仍待专项验收。安装、升级、回退与卸载见[安装指南](./docs/install.md),维护者见[发行操作](./docs/releasing.md)。
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
- bf6110f2fa1ac45f66c3d07833408114a7b464564c7ee7dde88f421bddee0054 BUILD.json
2
- 25762eecaae5a0b7a316faf8c9ace8ee7b7a841916ae874683152a620dc21264 api-guide.md
3
- 8b8529f293422dde91ac23cf388c171f557eb1ab806596cece6e97fe75ce1487 cli-guide.md
4
- 9ce97e29116c224343a32b5402a588ed74e306d6b66fd525a3b6fa82c373724e install.md
5
- 2245321a97bf8e504499bc97efc62cc9d55084cdbade0e3299a8e4224921be4a kdl-agent-skill.zip
6
- 6134119e18c2150c37a5f67e38b30eadc41d700c07bb1cc531c320650dd7bdbd kdl-agent_0.1.0-beta.1_darwin_amd64.tar.gz
7
- 444baaaebf7a4ef2a7d478603086ca35bd4a4d2e5029ef1d8254585eb7be95fd kdl-agent_0.1.0-beta.1_darwin_arm64.tar.gz
8
- fcdffeaf5d9db4bdb16f4eb5bbdb457f3db851b2816d0d127276f5c0c650cbcc kdl-agent_0.1.0-beta.1_linux_amd64.tar.gz
9
- 9456ade4ddad1c8e7af7c6d018541165b3a68682c1290619c4b6c33c72aefe8c kdl-agent_0.1.0-beta.1_linux_arm64.tar.gz
10
- 561f597fe475891ede81b337a243345749d5465d2b32e7f737df7d575111d619 kdl-agent_0.1.0-beta.1_windows_amd64.zip
1
+ aae212b4c6db35f9f4be104da9c3f7296be48412ead33effea8e9448b1b31e5c BUILD.json
2
+ 75be41758770cf5e84f5fc452ab2974019d99765bf92ad62e741479b82e1a853 api-guide.md
3
+ 8c3ce39ed33e6b6f40d32ceb7710ffeac3f8cb5d7f760682464fc45c11ea71f5 cli-guide.md
4
+ 42c64de18e06869e5e605d05b568a9626bbcaf7ed1dedc69020550abd8523355 install.md
5
+ 5486870fad78662f91b787d1f4679d982f3a2edb460fbc2b4d8dc2b308876134 kdl-agent-skill.zip
6
+ c185e1403a706a4419a0b2919c6d48b3c4263fca2b3fe296679eca6c55efe67c kdl-agent_0.1.0-beta.2_darwin_amd64.tar.gz
7
+ 84f635f230b136186730cdbfad2b17f1e6530b43a05123ab55030bbd1586981c kdl-agent_0.1.0-beta.2_darwin_arm64.tar.gz
8
+ 6a01dcdb0f773d07ac41d5b9d2979a4bd3ca1d2b2453a9696ce60767f94a5051 kdl-agent_0.1.0-beta.2_linux_amd64.tar.gz
9
+ 308e58093d6d72e41e0f424a4b39e193e95a7e0c70ff1806657a023a6c15a507 kdl-agent_0.1.0-beta.2_linux_arm64.tar.gz
10
+ 94ada3486eefa490770a2f6abb95368e90d9ff00b3008735805250ea1b6ad007 kdl-agent_0.1.0-beta.2_windows_amd64.zip
11
11
  95a9aae626b807cd97b95fb73ff0207c72a88c10c936fc73da5a25fa4af14d10 openapi.yaml
12
- 6773ea828c0e4d021b6aaaf903a72e763fc4c034f68f35fcdd0cc3cf6ea1b035 release-notes.md
12
+ 5a2bdc390c0fbfd0126d54db9c74258fb2b24e0ced3017315a7a894ea66ff5a4 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.1",
3
+ "version": "0.1.0-beta.2",
4
4
  "description": "快代理 CLI:账户与订单查询、授权操作及代理便利命令",
5
5
  "license": "MIT",
6
- "engines": { "node": ">=22.14.0" },
7
- "bin": { "kdl-agent": "scripts/run.cjs" },
8
- "repository": { "type": "git", "url": "git+https://github.com/gizaZerozhang/kdl-agent-cli.git" },
9
- "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
10
- "files": ["scripts/runtime", "scripts/run.cjs", "scripts/install.cjs", "scripts/wizard.cjs", "scripts/verify-package.cjs", "SHA256SUMS", "release.json", "CHANGELOG.md", "THIRD_PARTY_NOTICES.txt"],
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": { "https-proxy-agent": "7.0.6", "tar": "7.5.22", "yauzl": "3.4.0" },
18
- "devDependencies": { "yazl": "3.3.1" },
19
- "kdl": { "command": "kdl-agent", "skill": "kdl-agent", "skillsPackage": "skills@1.5.25" }
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.1",
2
+ "version": "0.1.0-beta.2",
3
3
  "repository": "gizaZerozhang/kdl-agent-cli",
4
- "commit": "a50bc08164a9ab11a8f9d8b5435eb3553fcdeed8",
4
+ "commit": "b96a7061450d8b4c6899c52442307ac0ba9fdb89",
5
5
  "dirty": false,
6
6
  "macosSigned": false,
7
- "sha256": "856588de2e6e97c166f8c0a1573a1ef97c747db9df132e3f9ee5c3a95e1061e9"
7
+ "sha256": "be8a4f466beb4859053cbb2f1ef6c88a36399777c32ba5e76568f78373775e6a"
8
8
  }
@@ -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
  }
@@ -49,23 +49,30 @@ function allowedURL(raw) {
49
49
  return url;
50
50
  }
51
51
 
52
- async function download(raw, destination, redirects = 0) {
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(60000, () => request.destroy(new Error('下载超时,请检查网络或 HTTPS_PROXY')));
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 download(new URL(response.headers.location, url).href, destination, redirects + 1);
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);