@kscs-inc/cli 0.3.1 → 0.3.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/README.md CHANGED
@@ -5,11 +5,11 @@
5
5
  ## 安装
6
6
 
7
7
  ```sh
8
- npx @kscs-inc/cli@0.3.1 install
8
+ npx @kscs-inc/cli@0.3.3 install
9
9
  # 国内镜像(同步可能延迟)
10
- npx --registry=https://registry.npmmirror.com @kscs-inc/cli@0.3.1 install
10
+ npx --registry=https://registry.npmmirror.com @kscs-inc/cli@0.3.3 install
11
11
  # 或全局安装入口后显式安装客户端
12
- npm install -g @kscs-inc/cli@0.3.1
12
+ npm install -g @kscs-inc/cli@0.3.3
13
13
  kscs install
14
14
  ```
15
15
 
@@ -20,13 +20,13 @@ kscs install
20
20
  ```sh
21
21
  kscs --version
22
22
  kscs auth login
23
- kscs products list --human
23
+ kscs products list
24
24
  ```
25
25
 
26
26
  安装成功不代表已登录或有业务权限。终端未识别命令时新开终端,或使用回执给出的绝对入口。
27
27
 
28
28
  ## 安全与更新
29
29
 
30
- 入口版本0.3.1固定对应发行目标,验证Ed25519签名及SHA256后调用同一安装事务。客户端自带Node,后续使用kscs update check/status/apply;npm仅更新入口。npm uninstall -g @kscs-inc/cli只删除npm入口,不删除实际客户端、配置和Skill。业务请求直接到公司CLI服务,不经过npm或镜像。
30
+ 入口版本0.3.3固定对应发行目标,验证Ed25519签名及SHA256后调用同一安装事务。客户端自带Node,后续使用kscs update check/status/apply;npm仅更新入口。npm uninstall -g @kscs-inc/cli只删除npm入口,不删除实际客户端、配置和Skill。业务请求直接到公司CLI服务,不经过npm或镜像。
31
31
 
32
32
  如安装中断,保留原客户端与身份,按中文错误提示恢复;不关闭TLS或签名校验。镜像不可用时从npm官方源重试或使用官网安装方式。内联第三方代码许可见THIRD-PARTY-NOTICES.txt。
package/bin/kscs.mjs CHANGED
@@ -32,9 +32,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  mod
33
33
  ));
34
34
 
35
- // node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js
35
+ // ../../../../../code/node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js
36
36
  var require_pend = __commonJS({
37
- "node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports, module) {
37
+ "../../../../../code/node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports, module) {
38
38
  module.exports = Pend;
39
39
  function Pend() {
40
40
  this.pending = 0;
@@ -87,9 +87,9 @@ var require_pend = __commonJS({
87
87
  }
88
88
  });
89
89
 
90
- // node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/fd-slicer.js
90
+ // ../../../../../code/node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/fd-slicer.js
91
91
  var require_fd_slicer = __commonJS({
92
- "node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/fd-slicer.js"(exports) {
92
+ "../../../../../code/node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/fd-slicer.js"(exports) {
93
93
  var fs = __require("fs");
94
94
  var util = __require("util");
95
95
  var stream = __require("stream");
@@ -244,9 +244,9 @@ var require_fd_slicer = __commonJS({
244
244
  }
245
245
  });
246
246
 
247
- // node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/crc32.js
247
+ // ../../../../../code/node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/crc32.js
248
248
  var require_crc32 = __commonJS({
249
- "node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/crc32.js"(exports, module) {
249
+ "../../../../../code/node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/crc32.js"(exports, module) {
250
250
  var CRC_TABLE = new Int32Array([
251
251
  0,
252
252
  1996959894,
@@ -516,9 +516,9 @@ var require_crc32 = __commonJS({
516
516
  }
517
517
  });
518
518
 
519
- // node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/index.js
519
+ // ../../../../../code/node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/index.js
520
520
  var require_yauzl = __commonJS({
521
- "node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/index.js"(exports) {
521
+ "../../../../../code/node_modules/.pnpm/yauzl@3.4.0/node_modules/yauzl/index.js"(exports) {
522
522
  var fs = __require("fs");
523
523
  var zlib = __require("zlib");
524
524
  var fd_slicer = require_fd_slicer();
@@ -1494,23 +1494,31 @@ async function downloadBytes(url, limit, allowLocal = false, timeoutMs = 6e4) {
1494
1494
  }
1495
1495
  return Buffer.concat(chunks);
1496
1496
  }
1497
- async function downloadFile(url, path, limit, allowLocal = false) {
1498
- const response = await downloadResponse(url, allowLocal, 6e4);
1497
+ async function downloadFile(url, path, limit, allowLocal = false, onProgress) {
1499
1498
  let size = 0;
1500
- const budget = new Transform({
1501
- transform(chunk, _encoding, callback) {
1502
- size += chunk.length;
1503
- callback(size > limit ? new Error("\u4E0B\u8F7D\u8D85\u8FC7\u5141\u8BB8\u5927\u5C0F") : null, chunk);
1504
- }
1505
- });
1506
- await pipeline(response.body, budget, createWriteStream(path, { flags: "wx", mode: 384 }));
1507
- const file = await open(path, "r+");
1499
+ onProgress?.(size, "downloading");
1508
1500
  try {
1509
- await file.sync();
1510
- } finally {
1511
- await file.close();
1501
+ const response = await downloadResponse(url, allowLocal, 6e4);
1502
+ const budget = new Transform({
1503
+ transform(chunk, _encoding, callback) {
1504
+ size += chunk.length;
1505
+ if (size <= limit) onProgress?.(size, "downloading");
1506
+ callback(size > limit ? new Error("\u4E0B\u8F7D\u8D85\u8FC7\u5141\u8BB8\u5927\u5C0F") : null, chunk);
1507
+ }
1508
+ });
1509
+ await pipeline(response.body, budget, createWriteStream(path, { flags: "wx", mode: 384 }));
1510
+ const file = await open(path, "r+");
1511
+ try {
1512
+ await file.sync();
1513
+ } finally {
1514
+ await file.close();
1515
+ }
1516
+ onProgress?.(size, "downloaded");
1517
+ return size;
1518
+ } catch (error) {
1519
+ onProgress?.(size, "failed");
1520
+ throw error;
1512
1521
  }
1513
- return size;
1514
1522
  }
1515
1523
  async function fileDigest(path) {
1516
1524
  const hash = createHash2("sha256");
@@ -1709,6 +1717,39 @@ function validateArtifact(value) {
1709
1717
  };
1710
1718
  }
1711
1719
 
1720
+ // cli/src/service/installation/installation-progress.formatter.ts
1721
+ function createDownloadProgress(totalBytes, output = process.stderr) {
1722
+ const startedAt = performance.now();
1723
+ let lastPaint = -Infinity;
1724
+ let previousLength = 0;
1725
+ const interactive = output.isTTY === true && process.env.TERM !== "dumb";
1726
+ return (receivedBytes, status) => {
1727
+ const now = performance.now();
1728
+ const finished = status !== "downloading";
1729
+ if (!finished && now - lastPaint < (interactive ? 150 : 2e3)) return;
1730
+ lastPaint = now;
1731
+ const knownSize = Number.isFinite(totalBytes) && totalBytes > 0;
1732
+ const percent = knownSize ? Math.min(
1733
+ status === "downloaded" && receivedBytes === totalBytes ? 100 : 99,
1734
+ Math.floor(receivedBytes / totalBytes * 100)
1735
+ ) : null;
1736
+ const megabytes = (bytes) => (bytes / 1024 / 1024).toFixed(1);
1737
+ const amount = `${megabytes(receivedBytes)}${knownSize ? `/${megabytes(totalBytes)}` : ""} MB`;
1738
+ const speed = `${megabytes(receivedBytes / Math.max((now - startedAt) / 1e3, 1e-3))} MB/s`;
1739
+ const label = status === "failed" ? "\u4E0B\u8F7D\u4E2D\u65AD" : status === "downloaded" ? "\u4E0B\u8F7D\u5B8C\u6210" : "\u4E0B\u8F7D";
1740
+ const width = output.columns ?? 80;
1741
+ const barWidth = Math.max(0, Math.min(20, width - 58));
1742
+ const filled = percent === null ? 0 : Math.floor(percent / 100 * barWidth);
1743
+ const bar = barWidth && percent !== null ? `[${"=".repeat(filled)}${"-".repeat(barWidth - filled)}] ` : "";
1744
+ const line = width < 36 ? `${label} ${percent === null ? `${megabytes(receivedBytes)} MB` : `${percent}%`}` : `${label} ${bar}${percent === null ? "" : `${percent}% `}${amount}${width >= 58 ? ` \xB7 ${speed}` : ""}`;
1745
+ output.write(
1746
+ interactive ? `\r${line}${" ".repeat(Math.max(0, previousLength - line.length))}${finished ? "\n" : ""}` : `${line}
1747
+ `
1748
+ );
1749
+ previousLength = line.length;
1750
+ };
1751
+ }
1752
+
1712
1753
  // cli/src/service/installation/npm-bootstrap.service.ts
1713
1754
  async function readNpmRelease(directory) {
1714
1755
  const bytes = await readFile(join3(directory, "release.json"));
@@ -1772,15 +1813,15 @@ async function runNpmChild(command, argumentsList) {
1772
1813
  });
1773
1814
  });
1774
1815
  }
1775
- async function readPrivateReceipt(root) {
1816
+ async function readPrivateInstallationFile(root, filename = "installation.json") {
1776
1817
  try {
1777
- const file = join3(root, "installation.json");
1818
+ const file = join3(root, filename);
1778
1819
  const info = await lstat2(file);
1779
1820
  if (!info.isFile() || info.size > 65536 || await realpath2(file) !== file || process.platform !== "win32" && (info.uid !== process.getuid?.() || info.mode & 63))
1780
- throw new Error("\u5B89\u88C5\u56DE\u6267\u4E0D\u662F\u53D7\u4FDD\u62A4\u666E\u901A\u6587\u4EF6");
1821
+ throw new Error("\u5B89\u88C5\u5143\u6570\u636E\u4E0D\u662F\u53D7\u4FDD\u62A4\u666E\u901A\u6587\u4EF6");
1781
1822
  const value = JSON.parse(await readFile(file, "utf8"));
1782
1823
  if (!value || typeof value !== "object" || Array.isArray(value))
1783
- throw new Error("\u5B89\u88C5\u56DE\u6267\u683C\u5F0F\u65E0\u6548");
1824
+ throw new Error("\u5B89\u88C5\u5143\u6570\u636E\u683C\u5F0F\u65E0\u6548");
1784
1825
  return value;
1785
1826
  } catch (error) {
1786
1827
  if (error.code === "ENOENT") return null;
@@ -1803,7 +1844,7 @@ async function nativeArchitecture() {
1803
1844
  }
1804
1845
  return process.arch;
1805
1846
  }
1806
- async function installFromNpm(release, argv) {
1847
+ async function installFromNpm(release, argv, onFormat) {
1807
1848
  const { values } = parseArgs({
1808
1849
  args: argv,
1809
1850
  options: {
@@ -1814,9 +1855,13 @@ async function installFromNpm(release, argv) {
1814
1855
  "skill-dir": { type: "string", multiple: true },
1815
1856
  "update-policy": { type: "string" },
1816
1857
  "no-path": { type: "boolean" },
1817
- "verify-connection": { type: "boolean" }
1858
+ "verify-connection": { type: "boolean" },
1859
+ json: { type: "boolean" },
1860
+ human: { type: "boolean" }
1818
1861
  }
1819
1862
  });
1863
+ onFormat?.(values.json === true);
1864
+ if (values.json && values.human) throw new Error("--json\u4E0E--human\u4E0D\u80FD\u540C\u65F6\u4F7F\u7528");
1820
1865
  if (!INSTALL_MODES.includes(values.mode) || !["stable", "trial"].includes(values.channel))
1821
1866
  throw new Error("\u5B89\u88C5\u6A21\u5F0F\u6216\u901A\u9053\u65E0\u6548");
1822
1867
  const arch = await nativeArchitecture();
@@ -1831,7 +1876,7 @@ async function installFromNpm(release, argv) {
1831
1876
  if (target.channel === "trial")
1832
1877
  process.stderr.write("\u6CE8\u610F\uFF1A\u5F53\u524D\u76EE\u6807\u4E3A\u8BD5\u7528\u901A\u9053\uFF0C\u539F\u751F\u9A8C\u6536\u672A\u5B8C\u6210\uFF0C\u4E0D\u542F\u7528\u81EA\u52A8\u5347\u7EA7\u3002\n");
1833
1878
  const root = resolve2(values.root ?? defaultInstallRoot(target.mode));
1834
- const previous = await readPrivateReceipt(root);
1879
+ const previous = await readPrivateInstallationFile(root);
1835
1880
  process.stderr.write(
1836
1881
  `\u6B63\u5728\u9A8C\u8BC1 ${release.name}@${release.version} \u5BF9\u5E94\u7684 ${target.mode}/${target.platform}/${target.arch} \u5BA2\u6237\u7AEF\u3002
1837
1882
  `
@@ -1855,7 +1900,9 @@ async function installFromNpm(release, argv) {
1855
1900
  const size = await downloadFile(
1856
1901
  sameOriginUrl(artifact.url, target.manifest),
1857
1902
  archive,
1858
- 512 * 1024 * 1024
1903
+ 512 * 1024 * 1024,
1904
+ false,
1905
+ values.json ? void 0 : createDownloadProgress(artifact.size)
1859
1906
  );
1860
1907
  if (size !== artifact.size || await fileDigest(archive) !== artifact.sha256)
1861
1908
  throw new Error("\u5BA2\u6237\u7AEF\u5927\u5C0F\u6216\u6458\u8981\u4E0D\u4E00\u81F4");
@@ -1876,6 +1923,7 @@ async function installFromNpm(release, argv) {
1876
1923
  "--archive-path",
1877
1924
  archive
1878
1925
  ];
1926
+ if (values.json) installerArguments.push("--json");
1879
1927
  for (const option of ["config", "update-policy"])
1880
1928
  if (values[option]) installerArguments.push("--" + option, values[option]);
1881
1929
  for (const directory of values["skill-dir"] ?? [])
@@ -1891,14 +1939,9 @@ async function installFromNpm(release, argv) {
1891
1939
  [join3(application, "dist/service/installation/install.entry.js"), ...installerArguments]
1892
1940
  );
1893
1941
  if (status !== 0) return status;
1894
- const receipt = await readPrivateReceipt(root);
1942
+ const receipt = await readPrivateInstallationFile(root);
1895
1943
  if (receipt?.build_id !== artifact.build_id || receipt.root !== root || receipt.command !== launcherPath(root))
1896
1944
  throw new Error("\u5B89\u88C5\u56DE\u6267\u4E0E\u76EE\u6807\u4E0D\u4E00\u81F4");
1897
- process.stderr.write(
1898
- `\u5B89\u88C5\u5B8C\u6210\u3002\u65B0\u5F00\u7EC8\u7AEF\u8FD0\u884C kscs --version\uFF1B\u672C\u4EBA\u6388\u6743\u8BF7\u8FD0\u884C kscs auth login\u3002
1899
- \u7EDD\u5BF9\u5165\u53E3\uFF1A${receipt.command}
1900
- `
1901
- );
1902
1945
  return 0;
1903
1946
  } finally {
1904
1947
  await rm(stage, { recursive: true, force: true });
@@ -1906,13 +1949,21 @@ async function installFromNpm(release, argv) {
1906
1949
  }
1907
1950
  async function forwardNpmCommand(argv) {
1908
1951
  const root = defaultInstallRoot("personal");
1909
- const receipt = await readPrivateReceipt(root);
1952
+ const receipt = await readPrivateInstallationFile(root);
1910
1953
  if (!receipt || receipt.installer_runtime !== "node" || receipt.root !== root || receipt.command !== launcherPath(root) || typeof receipt.build_id !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,100}$/.test(receipt.build_id))
1911
1954
  throw new Error(
1912
1955
  "\u672A\u627E\u5230\u6709\u6548\u4E2A\u4EBA\u5B89\u88C5\uFF0C\u8BF7\u5148\u8FD0\u884C npx <\u5305\u540D>@latest install\uFF1B\u81EA\u5B9A\u4E49\u6216\u56E2\u961F\u5B89\u88C5\u8BF7\u4F7F\u7528\u56DE\u6267\u4E2D\u7684\u7EDD\u5BF9\u5165\u53E3"
1913
1956
  );
1914
- const application = await realpath2(join3(root, "current"));
1915
- if (application !== join3(root, "releases", receipt.build_id))
1957
+ const expectedApplication = join3(root, "releases", receipt.build_id);
1958
+ if (process.platform === "win32") {
1959
+ const pointer = await readPrivateInstallationFile(root, "current.json");
1960
+ if (pointer?.release !== `releases/${receipt.build_id}`)
1961
+ throw new Error("\u7248\u672C\u6307\u9488\u4E0E\u56DE\u6267\u4E0D\u4E00\u81F4");
1962
+ }
1963
+ const application = await realpath2(
1964
+ process.platform === "win32" ? expectedApplication : join3(root, "current")
1965
+ );
1966
+ if (application !== expectedApplication)
1916
1967
  throw new Error("\u7248\u672C\u6307\u9488\u4E0E\u56DE\u6267\u4E0D\u4E00\u81F4");
1917
1968
  return runNpmChild(
1918
1969
  join3(application, process.platform === "win32" ? "runtime/node.exe" : "runtime/node"),
@@ -1921,6 +1972,7 @@ async function forwardNpmCommand(argv) {
1921
1972
  }
1922
1973
 
1923
1974
  // cli/src/service/installation/npm.entry.ts
1975
+ var jsonOutput = false;
1924
1976
  async function main() {
1925
1977
  const argv = process.argv.slice(2);
1926
1978
  if (argv[0] === "--entry-version") {
@@ -1936,7 +1988,7 @@ async function main() {
1936
1988
  \u7528\u6CD5\uFF1Anpx ${NPM_PACKAGE_NAME}@latest install [--mode personal|team] [--channel stable|trial]
1937
1989
  \u53EF\u9009\uFF1A--root \u79C1\u6709\u76EE\u5F55 --config \u5DF2\u6709\u914D\u7F6E --skill-dir \u6280\u80FD\u76EE\u5F55 --update-policy off|notify|auto --no-path
1938
1990
 
1939
- \u5B89\u88C5\u540E\uFF1Akscs --version\uFF1Bkscs auth login\uFF1Bkscs products list --human
1991
+ \u5B89\u88C5\u540E\uFF1Akscs --version\uFF1Bkscs auth login\uFF1Bkscs products list
1940
1992
  \u65E0\u9700Python\u3001Java\u6216\u7F16\u8BD1\u5668\u3002\u6CA1\u6709Node\u8BF7\u8BBF\u95EE https://cli.xaweiju.com/install/
1941
1993
  \u5378\u8F7Dnpm\u5165\u53E3\u4E0D\u4F1A\u5220\u9664\u5B9E\u9645\u5BA2\u6237\u7AEF\u3001\u8EAB\u4EFD\u914D\u7F6E\u6216Skill\u3002
1942
1994
  `
@@ -1947,11 +1999,17 @@ async function main() {
1947
1999
  process.exitCode = await forwardNpmCommand(argv);
1948
2000
  return;
1949
2001
  }
2002
+ jsonOutput = argv.includes("--json") && !argv.includes("--human");
1950
2003
  const release = await readNpmRelease(resolve3(dirname2(fileURLToPath(import.meta.url)), ".."));
1951
- process.exitCode = await installFromNpm(release, argv.slice(1));
2004
+ process.exitCode = await installFromNpm(release, argv.slice(1), (json) => {
2005
+ jsonOutput = json;
2006
+ });
1952
2007
  }
1953
2008
  void main().catch((error) => {
1954
- process.stderr.write(`\u5B89\u88C5\u5165\u53E3\u5931\u8D25\uFF1A${error instanceof Error ? error.message : String(error)}
1955
- `);
2009
+ const message = error instanceof Error ? error.message : String(error);
2010
+ process.stderr.write(
2011
+ jsonOutput ? JSON.stringify({ installed: false, status: "installation_failed", message }) + "\n" : `\u5B89\u88C5\u5165\u53E3\u5931\u8D25\uFF1A${message}
2012
+ `
2013
+ );
1956
2014
  process.exitCode = 1;
1957
2015
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kscs-inc/cli",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "旷世传声 CLI 官方安装入口:中文引导、签名校验、公司客户端安装。",
5
5
  "type": "module",
6
6
  "bin": {
package/release.json CHANGED
@@ -1,79 +1,79 @@
1
1
  {
2
2
  "schema_version": 1,
3
3
  "name": "@kscs-inc/cli",
4
- "version": "0.3.1",
4
+ "version": "0.3.3",
5
5
  "targets": [
6
6
  {
7
7
  "mode": "personal",
8
8
  "platform": "darwin",
9
9
  "arch": "x64",
10
10
  "channel": "stable",
11
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/20261024-171853-adcaa13a/manifest.json",
12
- "manifest_sha256": "ef2c60db06e09dbc68686cb1242783834d2afb32a65b6dfe831ac67f1142fad3",
13
- "build_id": "20261024-171853-adcaa13a"
11
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/20261024-205147-150ffa04/manifest.json",
12
+ "manifest_sha256": "8b68c9f8c0f02c275783ef0ed9b2c769145a0b74ee02cbc7d2a1704c91669730",
13
+ "build_id": "20261024-205147-150ffa04"
14
14
  },
15
15
  {
16
16
  "mode": "team",
17
17
  "platform": "linux",
18
18
  "arch": "x64",
19
19
  "channel": "stable",
20
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/20261024-171925-bab3edbd/manifest.json",
21
- "manifest_sha256": "577d9bd483b2e8f862e1e701abefba73ce6e1256673d7fc28a4593b470f69960",
22
- "build_id": "20261024-171925-bab3edbd"
20
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/20261024-205238-92d19b20/manifest.json",
21
+ "manifest_sha256": "37fd66f133b209034bf7dc71147984684085062e8f06448c622fb28833c7d63d",
22
+ "build_id": "20261024-205238-92d19b20"
23
23
  },
24
24
  {
25
25
  "mode": "personal",
26
26
  "platform": "darwin",
27
27
  "arch": "arm64",
28
28
  "channel": "trial",
29
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-171906-0febefa4/manifest.json",
30
- "manifest_sha256": "84412409acdd116fe22df6c974535bd42a878029d20cf751748311a13ec0eb5c",
31
- "build_id": "20261024-171906-0febefa4"
29
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-205139-99d730ef/manifest.json",
30
+ "manifest_sha256": "d5b56ec09d5b2bb186123dff6b78cca9636a3c5f42bee4851a1e1f17ad03c5ab",
31
+ "build_id": "20261024-205139-99d730ef"
32
32
  },
33
33
  {
34
34
  "mode": "personal",
35
35
  "platform": "linux",
36
- "arch": "x64",
36
+ "arch": "arm64",
37
37
  "channel": "trial",
38
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-171915-94e4944f/manifest.json",
39
- "manifest_sha256": "f74d346b1df2e43e8cc394c202faa0f625249355e2675a1be53c3df1825be191",
40
- "build_id": "20261024-171915-94e4944f"
38
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-205159-3bfdc3cf/manifest.json",
39
+ "manifest_sha256": "cb88595354ca35725b252f4aea14ac1c8f5ab4bf2eb9202c834af692e0770174",
40
+ "build_id": "20261024-205159-3bfdc3cf"
41
41
  },
42
42
  {
43
43
  "mode": "personal",
44
44
  "platform": "linux",
45
- "arch": "arm64",
45
+ "arch": "x64",
46
46
  "channel": "trial",
47
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-171935-3f5cc19d/manifest.json",
48
- "manifest_sha256": "95500c910a1b7cdb1f2ac6b2ad7b485de8f9f56a49beede4d1c59295f82ea6fb",
49
- "build_id": "20261024-171935-3f5cc19d"
47
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-205208-ad8ab2be/manifest.json",
48
+ "manifest_sha256": "2501da9df9ec1abf9caabe0f25ddac37e1bd6b146c252f4d6cffa9b161b20abd",
49
+ "build_id": "20261024-205208-ad8ab2be"
50
50
  },
51
51
  {
52
- "mode": "team",
53
- "platform": "linux",
52
+ "mode": "personal",
53
+ "platform": "win32",
54
54
  "arch": "arm64",
55
55
  "channel": "trial",
56
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-171946-8876759b/manifest.json",
57
- "manifest_sha256": "dec273d914d36467d94484657c3389e44693dcd361073fcf7efc489ee9d162fe",
58
- "build_id": "20261024-171946-8876759b"
56
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-205216-e727b0b6/manifest.json",
57
+ "manifest_sha256": "78e27b46c869bff48820ba328330ca427fc43d890e6e4c1524049b8324cf0919",
58
+ "build_id": "20261024-205216-e727b0b6"
59
59
  },
60
60
  {
61
61
  "mode": "personal",
62
62
  "platform": "win32",
63
63
  "arch": "x64",
64
64
  "channel": "trial",
65
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-171954-08cb0491/manifest.json",
66
- "manifest_sha256": "c343ac17ed0e0cae441193ae59f1c5585e51d0afa286a86b7148cfa11f293525",
67
- "build_id": "20261024-171954-08cb0491"
65
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-205223-61cb60b3/manifest.json",
66
+ "manifest_sha256": "34eb9a002316f88613347a1f00aa435328a85b4494006204e410649b2dcc0968",
67
+ "build_id": "20261024-205223-61cb60b3"
68
68
  },
69
69
  {
70
- "mode": "personal",
71
- "platform": "win32",
70
+ "mode": "team",
71
+ "platform": "linux",
72
72
  "arch": "arm64",
73
73
  "channel": "trial",
74
- "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-172004-04e3339c/manifest.json",
75
- "manifest_sha256": "3b75a738736b8a2ec4fc671e6c9200c33fb94a94a39494d8fa5fe9da362a4cd2",
76
- "build_id": "20261024-172004-04e3339c"
74
+ "manifest": "https://cli.xaweiju.com/downloads/cli/node/trial/20261024-205230-70cc3f63/manifest.json",
75
+ "manifest_sha256": "61464d87a718b615c22f5d85ee5dba499e96ddd372b46834af513c9af74a24d2",
76
+ "build_id": "20261024-205230-70cc3f63"
77
77
  }
78
78
  ]
79
79
  }
@@ -1 +1 @@
1
- {"algorithm":"Ed25519","key_id":"kscs-release-20261023","payload":"eyJzY2hlbWFfdmVyc2lvbiI6MSwicGF0aCI6Ii9kb3dubG9hZHMvY2xpL25vZGUvbnBtLzAuMy4xL3JlbGVhc2UuanNvbiIsInNoYTI1NiI6ImJlNGM1MjZhMTJkYjI2MGVhNGNiYWEzYzdmMDM2OGE2OTQ4MmNhOWIzMzNhYjgxZmViZDhkNTMxM2I2ZTY2N2UiLCJpc3N1ZWRfYXQiOjE3OTI4MzM5MTUsImV4cGlyZXNfYXQiOjE4MjQzNjk5MTV9","signature":"uonze5qGM2Jc1Vwt7aVHrH9OBFtCH0nnv0WGPgOCP6hdRVl28aZXFE/K4XBFI4pzGmOkPish4ntPnZ1brenXDg=="}
1
+ {"algorithm":"Ed25519","key_id":"kscs-release-20261023","payload":"eyJzY2hlbWFfdmVyc2lvbiI6MSwicGF0aCI6Ii9kb3dubG9hZHMvY2xpL25vZGUvbnBtLzAuMy4zL3JlbGVhc2UuanNvbiIsInNoYTI1NiI6ImMzNmEzZDZjMmJiZGU3YjdmZmYzY2E2MGE0NzlmYzdhOGJiNTllMTFlNTc5NGQ2M2YwMzk4ZWNmZjlhMDA0OWQiLCJpc3N1ZWRfYXQiOjE3OTI4NDc4MjYsImV4cGlyZXNfYXQiOjE4MjQzODM4MjZ9","signature":"reqgM4s6QU2nq+K5ghupNEFGEA7o/PXYjeLFcISh0oSJIiM4cWTnV6QguZLcwMfzIiESpPhw5phdQBNm0CpCDQ=="}