@zerozhang-giza/kdl-agent 0.1.0-beta.2 → 0.1.0-beta.4
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 +14 -0
- package/README.md +3 -3
- package/SHA256SUMS +12 -12
- package/package.json +1 -1
- package/release.json +3 -3
- package/scripts/run.cjs +1 -0
- package/scripts/runtime/install.cjs +23 -4
- package/scripts/wizard.cjs +17 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,8 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## 未发布
|
|
4
4
|
|
|
5
|
+
## 0.1.0-beta.4 - 2026-09-11
|
|
6
|
+
|
|
7
|
+
- auth status 展示三项敏感授权;旧 Gateway 未返回的授权显示未知,不推断为关闭。
|
|
8
|
+
- 并发首次安装等待安装锁并复用已安装程序;超时不删除其他进程的锁。
|
|
9
|
+
- 产品目录及订单中文名称依赖配套 Gateway/webhp;本版本不修改价格或自动付款。
|
|
10
|
+
|
|
11
|
+
## 0.1.0-beta.3 - 2026-09-10
|
|
12
|
+
|
|
13
|
+
- GitHub/npm 已公开,五平台与 Release→npm 自动串联通过;隔离环境验证 beta.2→beta.3 CLI/Skill 同步升级与匿名版本检查。
|
|
14
|
+
|
|
15
|
+
- 增加匿名新版检查、确认后同步升级 CLI/Skill 的 npm update 入口,保留登录配置和失败恢复。
|
|
16
|
+
- tag 流程经五平台验活和环境审批后自动公开 Release 并派发 npm;重复发布校验固定候选,冲突停止。
|
|
17
|
+
|
|
5
18
|
## 0.1.0-beta.2 - 2026-09-10
|
|
6
19
|
|
|
20
|
+
- GitHub Release 与 npm 已公开,五平台安装验证通过;首次实际 Trusted Publishing/OIDC 发行成功,registry 包与固定候选一致并提供 provenance。
|
|
7
21
|
- 新增代理 Basic 鉴权与白名单只读命令,明确订单 API 密钥和代理连接凭据的区别。
|
|
8
22
|
- 统一 Gateway 错误信封、字段级校验和 Retry-After 提示,补齐 HTTPS 连接指南与配套 Skill。
|
|
9
23
|
- 安装下载增加有限重试与半包清理,支持 KDL_AGENT_DOWNLOAD_TIMEOUT_MS;永久错误不重试,失败提供网络排查入口。
|
package/README.md
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
|
|
9
9
|
## npm 安装
|
|
10
10
|
|
|
11
|
-
需要 Node.js 22.14+ 和用户可写的 npm
|
|
11
|
+
需要 Node.js 22.14+ 和用户可写的 npm 全局目录。配套版本 `0.1.0-beta.4` 的发行结果见 [npm](https://www.npmjs.com/package/@zerozhang-giza/kdl-agent/v/0.1.0-beta.4) 和 [GitHub Release](https://github.com/gizaZerozhang/kdl-agent-cli/releases/tag/v0.1.0-beta.4):
|
|
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.4 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.4`。
|
|
18
18
|
|
|
19
19
|
npm 包按平台下载 GitHub Release 原生二进制并验证内置 SHA256。当前请显式指定 beta 版本或 `@beta`;npm 自动附加的 `latest` 仍指向该预发行版,不代表稳定就绪。beta 的 macOS 程序未签名/公证;最低系统和真实业务仍待专项验收。安装、升级、回退与卸载见[安装指南](./docs/install.md),维护者见[发行操作](./docs/releasing.md)。
|
|
20
20
|
|
package/SHA256SUMS
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
0aa05c74b1ecd28a8abe886f93173301d6abe2b6615330112bd116b9f29cb277 BUILD.json
|
|
2
|
+
85faeb4d602d4b643c1c7738b0c033024eeb2a2bfacf565aecb9d7ad6df82420 api-guide.md
|
|
3
|
+
e76664cca18c3ed8faef86ac2d399d9b1ffe2b3693168b635881d0613b288c9e cli-guide.md
|
|
4
|
+
b7ed64ce497999e6989735300b5a28123877f5f5562dfea9905f33e0adcea391 install.md
|
|
5
|
+
5f7418c92003826ee5938c287a866dac50f2917c8744be1f15846e73dc75bc51 kdl-agent-skill.zip
|
|
6
|
+
8326b0c22d9e7b70abe5ea344320aa4659b310c4d6605bdd6c344f6fcdec4c63 kdl-agent_0.1.0-beta.4_darwin_amd64.tar.gz
|
|
7
|
+
bd810dd50e4184bb122a663f6f0e1114a09de56c64383e283f4c5a8a0caf402f kdl-agent_0.1.0-beta.4_darwin_arm64.tar.gz
|
|
8
|
+
e16749ddc2687c45802d69a330fea7c922854f112eb14a8e7f3409457695ba86 kdl-agent_0.1.0-beta.4_linux_amd64.tar.gz
|
|
9
|
+
6530677bbe7f64c18f157d808ee138ae8922de2882bc81b8d12ff9a73efd6c66 kdl-agent_0.1.0-beta.4_linux_arm64.tar.gz
|
|
10
|
+
cc69897f95f64b2c888f27be80eeb6f2a4c555b31268b495ce8fe4cc15c93f1f kdl-agent_0.1.0-beta.4_windows_amd64.zip
|
|
11
|
+
9b5ae35d8e99c35432ed8d06bcbfb005e916e28b1810efd49b581d8554f574fe openapi.yaml
|
|
12
|
+
e1ea00191f05a675dd58a152e4a5bce81e77ef7f846de65e298ed524d1f39775 release-notes.md
|
package/package.json
CHANGED
package/release.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.0-beta.
|
|
2
|
+
"version": "0.1.0-beta.4",
|
|
3
3
|
"repository": "gizaZerozhang/kdl-agent-cli",
|
|
4
|
-
"commit": "
|
|
4
|
+
"commit": "0c8b369ef639a06ead2f218587ff71ad1a1f1c07",
|
|
5
5
|
"dirty": false,
|
|
6
6
|
"macosSigned": false,
|
|
7
|
-
"sha256": "
|
|
7
|
+
"sha256": "469505dd285b93e9f4e54e7af08360f746591695a57203cf1a91b69a93e7ca26"
|
|
8
8
|
}
|
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));
|
|
@@ -12,6 +12,8 @@ const yauzl = require('yauzl');
|
|
|
12
12
|
|
|
13
13
|
const ROOT = path.resolve(__dirname, '../..');
|
|
14
14
|
const MAX_BYTES = 256 * 1024 * 1024;
|
|
15
|
+
const LOCK_WAIT_MS = 30000;
|
|
16
|
+
const LOCK_POLL_MS = 250;
|
|
15
17
|
const HOSTS = new Set(['github.com', 'release-assets.githubusercontent.com', 'objects.githubusercontent.com']);
|
|
16
18
|
const TARGETS = new Set(['darwin-arm64', 'darwin-amd64', 'linux-arm64', 'linux-amd64', 'windows-amd64']);
|
|
17
19
|
|
|
@@ -166,7 +168,15 @@ function verifyBinary(file, version, commit) {
|
|
|
166
168
|
if (result.status !== 0 || !output?.startsWith(`kdl-agent ${version} (commit `) || (commit && output !== `kdl-agent ${version} (commit ${commit})`)) throw new Error('下载程序无法运行或版本、来源不匹配');
|
|
167
169
|
}
|
|
168
170
|
|
|
169
|
-
async function ensureInstalled({
|
|
171
|
+
async function ensureInstalled({
|
|
172
|
+
root = ROOT,
|
|
173
|
+
fetchFile = download,
|
|
174
|
+
platform = process.platform,
|
|
175
|
+
arch = process.arch,
|
|
176
|
+
verify = verifyBinary,
|
|
177
|
+
lockWaitMs = LOCK_WAIT_MS,
|
|
178
|
+
lockPollMs = LOCK_POLL_MS,
|
|
179
|
+
} = {}) {
|
|
170
180
|
const { pkg, repository } = config(root);
|
|
171
181
|
const release = JSON.parse(fs.readFileSync(path.join(root, 'release.json'), 'utf8'));
|
|
172
182
|
if (release.version !== pkg.version || release.repository !== repository || !/^[a-f0-9]{40}$/.test(release.commit) || release.dirty !== false) throw new Error('发行元数据与 npm 包不一致');
|
|
@@ -177,9 +187,18 @@ async function ensureInstalled({ root = ROOT, fetchFile = download, platform = p
|
|
|
177
187
|
fs.mkdirSync(directory, { recursive: true });
|
|
178
188
|
if (fs.lstatSync(directory).isSymbolicLink()) throw new Error('安装目录不能是符号链接');
|
|
179
189
|
const lock = path.join(directory, '.lock');
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
190
|
+
const started = Date.now();
|
|
191
|
+
while (true) {
|
|
192
|
+
try {
|
|
193
|
+
fs.mkdirSync(lock);
|
|
194
|
+
break;
|
|
195
|
+
} catch (error) {
|
|
196
|
+
if (error.code !== 'EEXIST') throw error;
|
|
197
|
+
if (Date.now() - started >= lockWaitMs) {
|
|
198
|
+
throw new Error('另一个安装正在进行;确认没有安装进程后可删除 .native/.lock 重试');
|
|
199
|
+
}
|
|
200
|
+
await new Promise(resolve => setTimeout(resolve, lockPollMs));
|
|
201
|
+
}
|
|
183
202
|
}
|
|
184
203
|
const destination = path.join(directory, artifact.binary);
|
|
185
204
|
const old = destination + '.old';
|
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');
|