@delta-infra/cli 1.0.45 → 1.0.47

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
@@ -28,6 +28,24 @@ npx @delta-infra/cli@latest uninstall
28
28
 
29
29
  清理全局包、AI Skills 和配置文件。
30
30
 
31
+ ### 升级
32
+
33
+ ```bash
34
+ # 升级 CLI + AI Skills
35
+ delta-cli upgrade
36
+
37
+ # 只检查是否有更新(不执行升级)
38
+ delta-cli upgrade --check
39
+
40
+ # 只升级 CLI 二进制
41
+ delta-cli upgrade --cli-only
42
+
43
+ # 只升级 AI Skills
44
+ delta-cli upgrade --skills-only
45
+ ```
46
+
47
+ 升级 CLI 时会通过 `npm install -g @delta-infra/cli@latest` 拉取最新版本;升级 Skills 时会通过 `npx skills add` 重新安装 AI Skills。
48
+
31
49
  ### 方式二:直接下载 Binary
32
50
 
33
51
  从 [GitHub Releases](https://github.com/yzailab/delta-infra-cli/releases) 下载对应平台的压缩包(以下使用 `latest` 指向最新版):
@@ -175,8 +193,12 @@ delta-cli sandbox kill <sandbox_id>
175
193
  | `delta-cli auth login` | 交互式登录 |
176
194
  | `delta-cli auth login --token <token>` | Token 认证 |
177
195
  | `delta-cli auth status` | 查看认证状态 |
178
- | `delta-cli update check` | 检查更新 |
179
- | `delta-cli update` | 安装最新版本 |
196
+ | `delta-cli update check` | 检查更新(deprecated,请用 `upgrade --check`) |
197
+ | `delta-cli update` | 安装最新版本(deprecated,请用 `upgrade`) |
198
+ | `delta-cli upgrade` | 升级 CLI 和 AI Skills 到最新版本 |
199
+ | `delta-cli upgrade --check` | 检查是否有可用更新 |
200
+ | `delta-cli upgrade --cli-only` | 只升级 CLI 二进制 |
201
+ | `delta-cli upgrade --skills-only` | 只升级 AI Skills |
180
202
  | `delta-cli --version` | 显示版本 |
181
203
 
182
204
  ### Sandbox 命令
package/checksums.txt CHANGED
@@ -1,5 +1,5 @@
1
- 57e1334d81ceffb658b8b7868d9df29d73963ff9534ca49636f982122bda4fc5 delta-cli-darwin-amd64.tar.gz
2
- 68e001e482a5ea0760474bca5d344eac370910a9fa7d920ff5fd6c0f607e5fb9 delta-cli-darwin-arm64.tar.gz
3
- 2864a8670fdb86ac091d58d093b518e5472f92b5832eae4d84774982688d8d73 delta-cli-linux-amd64.tar.gz
4
- 61507fd1bdfa35ef35bb9f6c36d5d331bbae9e7ca5ca24e0e5608325b4b7c0c5 delta-cli-linux-arm64.tar.gz
5
- 36d1cdc11acd621317f882b39dbb144fb3c56656b9cbd0df0b6386cad33da4b0 delta-cli-windows-amd64.zip
1
+ abfbd8a22e5fb5e193d6ef63f4f49db195ceb635bb08a19ae550555f4d8da1ed delta-cli-darwin-amd64.tar.gz
2
+ 90e3b9e1b7784b3e84a8e34adb7be975cf84a768ec01c2d6c11de0c6bca2ff8d delta-cli-darwin-arm64.tar.gz
3
+ 7897fcec1be3468ec15e3d2f2771cd1e7837fe148ff1fbae4ca3dbb0f733b838 delta-cli-linux-amd64.tar.gz
4
+ 6d69f17806ff1a6a42d530fa6ef78c7fbc49aa88242cc95482708a6097b9d13e delta-cli-linux-arm64.tar.gz
5
+ 0f6b1274ed8cf3113d1f49b3c526a756bed0e343aa186af623ab5aecf993619f delta-cli-windows-amd64.zip
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delta-infra/cli",
3
- "version": "1.0.45",
3
+ "version": "1.0.47",
4
4
  "description": "Delta Sandbox CLI",
5
5
  "bin": {
6
6
  "delta-cli": "scripts/run.js"
@@ -232,12 +232,45 @@ async function stepInstallGlobally(msg) {
232
232
  }
233
233
 
234
234
  async function skillsAlreadyInstalled() {
235
- try {
236
- const out = await runSilentAsync("npx", ["-y", "skills", "ls", "-g"], {
237
- timeout: 120000,
238
- });
239
- return /^delta-/m.test(out.toString());
240
- } catch { return false; }
235
+ const agentsDir = path.join(osHomedir(), ".agents", "skills");
236
+ return fs.existsSync(path.join(agentsDir, "delta-sandbox", "SKILL.md")) &&
237
+ fs.existsSync(path.join(agentsDir, "delta-shared", "SKILL.md"));
238
+ }
239
+
240
+ function installSkillsFromLocalPackage() {
241
+ const npmRoot = runSilent("npm", ["root", "-g"], { timeout: 10000 })
242
+ .toString().trim();
243
+ const pkgSkillsDir = path.join(npmRoot, PKG, "skills");
244
+ if (!fs.existsSync(path.join(pkgSkillsDir, "delta-sandbox", "SKILL.md"))) {
245
+ return false;
246
+ }
247
+
248
+ const home = osHomedir();
249
+ const agentsDir = path.join(home, ".agents", "skills");
250
+ fs.mkdirSync(agentsDir, { recursive: true });
251
+
252
+ for (const skill of ["delta-sandbox", "delta-shared"]) {
253
+ const src = path.join(pkgSkillsDir, skill);
254
+ if (!fs.existsSync(src)) continue;
255
+ const dst = path.join(agentsDir, skill);
256
+ fs.rmSync(dst, { recursive: true, force: true });
257
+ fs.cpSync(src, dst, { recursive: true });
258
+ }
259
+
260
+ const claudeDir = path.join(home, ".claude", "skills");
261
+ if (fs.existsSync(path.dirname(claudeDir))) {
262
+ fs.mkdirSync(claudeDir, { recursive: true });
263
+ for (const skill of ["delta-sandbox", "delta-shared"]) {
264
+ const linkPath = path.join(claudeDir, skill);
265
+ const targetPath = path.join(agentsDir, skill);
266
+ try {
267
+ fs.rmSync(linkPath, { force: true });
268
+ fs.symlinkSync(path.relative(path.dirname(linkPath), targetPath), linkPath);
269
+ } catch { /* symlink may fail on some platforms */ }
270
+ }
271
+ }
272
+
273
+ return true;
241
274
  }
242
275
 
243
276
  async function stepInstallSkills(msg) {
@@ -248,17 +281,24 @@ async function stepInstallSkills(msg) {
248
281
  s.stop(msg.step2Skip);
249
282
  return;
250
283
  }
284
+
285
+ try {
286
+ if (installSkillsFromLocalPackage()) {
287
+ s.stop(msg.step2Done);
288
+ return;
289
+ }
290
+ } catch { }
291
+
251
292
  const GH_PROXY = "https://gh-proxy.com/https://github.com";
252
293
  const urls = [
253
294
  `${GH_PROXY}/${SKILLS_REPO}`,
254
- SKILLS_REPO,
255
295
  `https://github.com/${SKILLS_REPO}`,
256
296
  ];
257
297
  let lastErr;
258
298
  for (const url of urls) {
259
299
  try {
260
300
  await runSilentAsync("npx", ["-y", "skills", "add", url, "-y", "-g"], {
261
- timeout: 120000,
301
+ timeout: 60000,
262
302
  env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
263
303
  });
264
304
  s.stop(msg.step2Done);
@@ -342,9 +382,28 @@ async function stepAuthLogin(msg) {
342
382
  async function stepUninstallSkills(msg) {
343
383
  const s = createSpinner();
344
384
  s.start("Removing AI skills...");
385
+
386
+ const home = osHomedir();
387
+ const agentsDir = path.join(home, ".agents", "skills");
388
+ const claudeDir = path.join(home, ".claude", "skills");
389
+ let removedLocally = false;
390
+
391
+ for (const skill of ["delta-sandbox", "delta-shared"]) {
392
+ try {
393
+ fs.rmSync(path.join(agentsDir, skill), { recursive: true, force: true });
394
+ fs.rmSync(path.join(claudeDir, skill), { force: true });
395
+ removedLocally = true;
396
+ } catch { }
397
+ }
398
+
399
+ if (removedLocally) {
400
+ s.stop("AI skills removed");
401
+ return;
402
+ }
403
+
345
404
  try {
346
405
  await runSilentAsync("npx", ["-y", "skills", "remove", "delta-sandbox", "delta-shared", "-g"], {
347
- timeout: 120000,
406
+ timeout: 60000,
348
407
  });
349
408
  s.stop("AI skills removed");
350
409
  } catch {