@delta-infra/cli 1.0.62 → 1.0.63

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
@@ -12,9 +12,10 @@ npx @delta-infra/cli@latest install
12
12
 
13
13
  该命令会依次完成:
14
14
  1. **全局安装** `@delta-infra/cli`(含 Go 二进制)
15
- 2. **安装 AI Skills** 到 `~/.agents/skills/`,自动适配 Claude Code、Codex、OpenCode、Cursor 等 AI 工具
16
- 3. **初始化配置** `delta-cli config init`(交互式,非 TTY 跳过)
17
- 4. **身份认证** `delta-cli auth login`(交互式,非 TTY 跳过)
15
+ 2. **选择 AI 工具平台**(可多选):通用 Agent 目录 `~/.agents/skills/`(Codex/Cursor/OpenCode)、Claude Code `~/.claude/skills/`、OpenCode 原生 `~/.config/opencode/skills/`、Cursor `~/.cursor/skills/`、Memento-S 开发模式 `~/memento_s/skills/`
16
+ 3. **安装 AI Skills** 到所选平台的 skills 目录
17
+ 4. **初始化配置** `delta-cli config init`(交互式,非 TTY 跳过)
18
+ 5. **身份认证** `delta-cli auth login`(交互式,非 TTY 跳过)
18
19
 
19
20
  AI Agent 也可以直接使用以下指令完成安装:
20
21
 
@@ -26,7 +27,7 @@ AI Agent 也可以直接使用以下指令完成安装:
26
27
  npx @delta-infra/cli@latest uninstall
27
28
  ```
28
29
 
29
- 清理全局包、AI Skills 和配置文件。
30
+ 清理全局包、所有已知平台的 AI Skills 和配置文件。
30
31
 
31
32
  ### 升级
32
33
 
@@ -197,8 +198,6 @@ delta-cli sandbox kill <sandbox_id>
197
198
  | `delta-cli auth login` | 交互式登录 |
198
199
  | `delta-cli auth login --token <token>` | Token 认证 |
199
200
  | `delta-cli auth status` | 查看认证状态 |
200
- | `delta-cli update check` | 检查更新(deprecated,请用 `upgrade --check`) |
201
- | `delta-cli update` | 安装最新版本(deprecated,请用 `upgrade`) |
202
201
  | `delta-cli upgrade` | 升级 CLI 和 AI Skills 到最新版本 |
203
202
  | `delta-cli upgrade --check` | 检查是否有可用更新 |
204
203
  | `delta-cli upgrade --cli-only` | 只升级 CLI 二进制 |
package/checksums.txt CHANGED
@@ -1,5 +1,5 @@
1
- ee97f4fbd2e96e637186b16a2fe07e7f5efcee6e7d80b2f37be33169cd614ca8 delta-cli-darwin-amd64.tar.gz
2
- cd5b445908a986529fc6eeb0c26552858ee9b0faed7eee863086033e027d44f7 delta-cli-darwin-arm64.tar.gz
3
- e2cef122d91f28b14f24c1cb505033314a874bfabb2baf3942bad9a65c112ab0 delta-cli-linux-amd64.tar.gz
4
- a63071b004394a3a5e2ed8c94da089655a334065d0e9507ecd4fc1e108130056 delta-cli-linux-arm64.tar.gz
5
- 5f9fc12e6af6ace5071ede349b526c1ce2b2e736355fe194262cc35977a43165 delta-cli-windows-amd64.zip
1
+ e5019395b7d3dbb9cbdd01b16d0407fe986ec4577ab839b92cf05f376d8f60a3 delta-cli-darwin-amd64.tar.gz
2
+ 2d68e0ff3f65b688235fed99b7011c41949e9c222bd2ce9be41b2a9df67472ba delta-cli-darwin-arm64.tar.gz
3
+ 2c3ea59c3d5f98af2f9200d8e940c1b08d374307dabc6976e31aa38cf6929fa3 delta-cli-linux-amd64.tar.gz
4
+ 16c184a9cd9dd7d08da26a59c16364c23117a9edd82278f61c3e726595b6001d delta-cli-linux-arm64.tar.gz
5
+ a9e85daa3fb33ecf2c4db821d247df8cdd3c78b04a8af1ea08e997ef9117ff85 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.62",
3
+ "version": "1.0.63",
4
4
  "description": "Delta Sandbox CLI",
5
5
  "bin": {
6
6
  "delta-cli": "scripts/run.js"
@@ -14,6 +14,38 @@ const GH_MIRRORS = ["https://gh.ddlc.top", "https://ghproxy.net", "https://gh-pr
14
14
  const CONFIG_DIR = path.join(osHomedir(), ".delta-infra");
15
15
  const isWindows = process.platform === "win32";
16
16
 
17
+ const PLATFORM_PATHS = {
18
+ agents: [".agents", "skills"],
19
+ claude: [".claude", "skills"],
20
+ opencode: [".config", "opencode", "skills"],
21
+ cursor: [".cursor", "skills"],
22
+ mementos: ["memento_s", "skills"],
23
+ };
24
+
25
+ const PLATFORM_LABELS = {
26
+ zh: {
27
+ agents: "通用 Agent 目录 (~/.agents/skills) — Codex / Cursor / OpenCode",
28
+ claude: "Claude Code (~/.claude/skills)",
29
+ opencode: "OpenCode 原生目录 (~/.config/opencode/skills)",
30
+ cursor: "Cursor (~/.cursor/skills)",
31
+ mementos: "Memento-S 开发模式 (~/memento_s/skills)",
32
+ },
33
+ en: {
34
+ agents: "Generic agent dir (~/.agents/skills) — Codex / Cursor / OpenCode",
35
+ claude: "Claude Code (~/.claude/skills)",
36
+ opencode: "OpenCode native dir (~/.config/opencode/skills)",
37
+ cursor: "Cursor (~/.cursor/skills)",
38
+ mementos: "Memento-S dev mode (~/memento_s/skills)",
39
+ },
40
+ };
41
+
42
+ const SKILL_NAMES = ["delta-sandbox", "delta-shared"];
43
+ const LANG = "zh";
44
+
45
+ function platformSkillDir(platform) {
46
+ return path.join(osHomedir(), ...PLATFORM_PATHS[platform]);
47
+ }
48
+
17
49
  // ── i18n ────────────────────────────────────────────────────────────────────
18
50
 
19
51
  const messages = {
@@ -26,8 +58,10 @@ const messages = {
26
58
  step1Upgraded: "已升级到 v%s",
27
59
  step1Fail: "全局安装失败。运行以下命令重试: npm install -g %s",
28
60
  step2: "安装 AI Skills",
61
+ step2SelectPlatforms: "选择需要安装 Delta Skills 的 AI 工具平台(可多选)",
29
62
  step2Spinner: "正在安装 Skills...",
30
63
  step2Done: "Skills 已安装",
64
+ step2DoneFor: "已安装至: %s",
31
65
  step2Skip: "已安装,跳过",
32
66
  step2Fail: "Skills 安装失败。运行以下命令重试: npx skills add %s -y -g",
33
67
  step3: "正在初始化配置...",
@@ -52,8 +86,10 @@ const messages = {
52
86
  step1Upgraded: "Upgraded to v%s",
53
87
  step1Fail: "Failed to install globally. Run manually: npm install -g %s",
54
88
  step2: "Install AI skills",
89
+ step2SelectPlatforms: "Select AI tool platforms to install Delta Skills (multi-select)",
55
90
  step2Spinner: "Installing skills...",
56
91
  step2Done: "Skills installed",
92
+ step2DoneFor: "Installed to: %s",
57
93
  step2Skip: "Already installed. Skipped",
58
94
  step2Fail: "Failed to install skills. Run manually: npx skills add %s -y -g",
59
95
  step3: "Initializing config...",
@@ -252,7 +288,7 @@ async function stepInstallGlobally(msg) {
252
288
  }
253
289
  }
254
290
 
255
- function installSkillsFromLocalPackage() {
291
+ function findPackageSkillsDir() {
256
292
  const candidates = [];
257
293
  try {
258
294
  const npmRoot = runSilent("npm", ["root", "-g"], { timeout: 10000 })
@@ -261,54 +297,69 @@ function installSkillsFromLocalPackage() {
261
297
  } catch {}
262
298
  candidates.push(path.join(__dirname, "..", "skills"));
263
299
 
264
- let pkgSkillsDir = null;
265
300
  for (const c of candidates) {
266
301
  if (fs.existsSync(path.join(c, "delta-sandbox", "SKILL.md"))) {
267
- pkgSkillsDir = c;
268
- break;
302
+ return c;
269
303
  }
270
304
  }
271
- if (!pkgSkillsDir) return false;
272
-
273
- const home = osHomedir();
274
- const agentsDir = path.join(home, ".agents", "skills");
275
- fs.mkdirSync(agentsDir, { recursive: true });
305
+ return null;
306
+ }
276
307
 
277
- for (const skill of ["delta-sandbox", "delta-shared"]) {
278
- const src = path.join(pkgSkillsDir, skill);
279
- if (!fs.existsSync(src)) continue;
280
- const dst = path.join(agentsDir, skill);
281
- fs.rmSync(dst, { recursive: true, force: true });
282
- fs.cpSync(src, dst, { recursive: true });
283
- }
308
+ function installSkillsFromLocalPackage(platforms) {
309
+ const pkgSkillsDir = findPackageSkillsDir();
310
+ if (!pkgSkillsDir) return false;
284
311
 
285
- const claudeDir = path.join(home, ".claude", "skills");
286
- if (fs.existsSync(path.dirname(claudeDir))) {
287
- fs.mkdirSync(claudeDir, { recursive: true });
288
- for (const skill of ["delta-sandbox", "delta-shared"]) {
289
- const linkPath = path.join(claudeDir, skill);
290
- const targetPath = path.join(agentsDir, skill);
291
- try {
292
- fs.rmSync(linkPath, { force: true });
293
- fs.symlinkSync(path.relative(path.dirname(linkPath), targetPath), linkPath);
294
- } catch { /* symlink may fail on some platforms */ }
312
+ for (const platform of platforms) {
313
+ const targetDir = platformSkillDir(platform);
314
+ fs.mkdirSync(targetDir, { recursive: true });
315
+ for (const skill of SKILL_NAMES) {
316
+ const src = path.join(pkgSkillsDir, skill);
317
+ if (!fs.existsSync(src)) continue;
318
+ const dst = path.join(targetDir, skill);
319
+ try { fs.rmSync(dst, { recursive: true, force: true }); } catch {}
320
+ fs.cpSync(src, dst, { recursive: true });
295
321
  }
296
322
  }
297
-
298
323
  return true;
299
324
  }
300
325
 
301
- async function stepInstallSkills(msg) {
326
+ async function stepSelectPlatforms(msg) {
327
+ if (!isInteractiveEnv()) {
328
+ return ["agents"];
329
+ }
330
+ const labels = PLATFORM_LABELS[LANG];
331
+ const defaultPlatforms = fs.existsSync(path.dirname(platformSkillDir("claude")))
332
+ ? ["agents", "claude"]
333
+ : ["agents"];
334
+ const selected = await p.multiselect({
335
+ message: msg.step2SelectPlatforms,
336
+ options: Object.keys(PLATFORM_PATHS).map((key) => ({
337
+ value: key,
338
+ label: labels[key],
339
+ })),
340
+ initialValues: defaultPlatforms,
341
+ required: true,
342
+ });
343
+ handleCancel(selected, msg);
344
+ return selected;
345
+ }
346
+
347
+ async function stepInstallSkills(msg, platforms) {
302
348
  const s = createSpinner();
303
349
  s.start(msg.step2Spinner);
304
350
  try {
305
351
  try {
306
- if (installSkillsFromLocalPackage()) {
352
+ if (installSkillsFromLocalPackage(platforms)) {
307
353
  s.stop(msg.step2Done);
354
+ p.log.info(fmt(msg.step2DoneFor, platforms.join(", ")));
308
355
  return;
309
356
  }
310
357
  } catch { }
311
358
 
359
+ if (!platforms.includes("agents")) {
360
+ throw new Error("local skills package not found and agent dir not selected");
361
+ }
362
+
312
363
  const urls = [
313
364
  `https://gh.ddlc.top/https://github.com/${SKILLS_REPO}`,
314
365
  `https://ghproxy.net/https://github.com/${SKILLS_REPO}`,
@@ -323,6 +374,7 @@ async function stepInstallSkills(msg) {
323
374
  env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
324
375
  });
325
376
  s.stop(msg.step2Done);
377
+ p.log.info(fmt(msg.step2DoneFor, "agents"));
326
378
  return;
327
379
  } catch (e) {
328
380
  lastErr = e;
@@ -406,17 +458,15 @@ async function stepUninstallSkills(msg) {
406
458
  const s = createSpinner();
407
459
  s.start("Removing AI skills...");
408
460
 
409
- const home = osHomedir();
410
- const agentsDir = path.join(home, ".agents", "skills");
411
- const claudeDir = path.join(home, ".claude", "skills");
412
461
  let removedLocally = false;
413
-
414
- for (const skill of ["delta-sandbox", "delta-shared"]) {
415
- try {
416
- fs.rmSync(path.join(agentsDir, skill), { recursive: true, force: true });
417
- fs.rmSync(path.join(claudeDir, skill), { force: true });
418
- removedLocally = true;
419
- } catch { }
462
+ for (const platform of Object.keys(PLATFORM_PATHS)) {
463
+ const dir = platformSkillDir(platform);
464
+ for (const skill of SKILL_NAMES) {
465
+ try {
466
+ fs.rmSync(path.join(dir, skill), { recursive: true, force: true });
467
+ removedLocally = true;
468
+ } catch { }
469
+ }
420
470
  }
421
471
 
422
472
  if (removedLocally) {
@@ -466,14 +516,16 @@ async function doInstall() {
466
516
  if (isInteractive) {
467
517
  p.intro(messages.zh.setup);
468
518
  await stepInstallGlobally(messages.zh);
469
- await stepInstallSkills(messages.zh);
519
+ const platforms = await stepSelectPlatforms(messages.zh);
520
+ await stepInstallSkills(messages.zh, platforms);
470
521
  await stepConfigInit(messages.zh);
471
522
  await stepAuthLogin(messages.zh);
472
523
  p.outro(messages.zh.done);
473
524
  } else {
474
525
  console.log(messages.zh.setup);
475
526
  await stepInstallGlobally(messages.zh);
476
- await stepInstallSkills(messages.zh);
527
+ const platforms = ["agents"];
528
+ await stepInstallSkills(messages.zh, platforms);
477
529
  console.log(messages.zh.nonTtyHint);
478
530
  }
479
531
  }
@@ -76,12 +76,12 @@ AI Agent 解析规则:
76
76
  | api | 7 | 服务端非 2xx |
77
77
  | internal | 10 | 客户端内部错误 |
78
78
 
79
- ## 更新检查
79
+ ## 升级检查
80
80
 
81
81
  完成用户请求后,如果 JSON 中有 `_notice.update`,可建议:
82
82
 
83
83
  ```bash
84
- delta-cli update
84
+ delta-cli upgrade
85
85
  ```
86
86
 
87
87
  ## 常见恢复