@delta-infra/cli 1.0.62 → 1.0.64
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 +5 -6
- package/checksums.txt +5 -5
- package/package.json +1 -1
- package/scripts/install-wizard.js +93 -41
- package/skills/delta-shared/SKILL.md +2 -2
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.
|
|
16
|
-
3.
|
|
17
|
-
4.
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
30c7668a50d7eb09ca2292b5ad202652a49270469622d51e560f9540775ff994 delta-cli-darwin-amd64.tar.gz
|
|
2
|
+
c0c8e0b564fd6f7196081d4f0416e2802254e5a8175a5849890291f86dce6a24 delta-cli-darwin-arm64.tar.gz
|
|
3
|
+
e0c84c99d12cbe3067fa0779c15f8ba54c21b3c18f606b9c5be7b0667783043a delta-cli-linux-amd64.tar.gz
|
|
4
|
+
bb14b0fd2a82bc7b9fa1fe4893b2b4cde45bd97ff7ce0abfa442a7179bf493ae delta-cli-linux-arm64.tar.gz
|
|
5
|
+
24a0b9dadef8ff6e487b39454bbc84959d31434293b5d4e6a96b10acf5fb4c13 delta-cli-windows-amd64.zip
|
package/package.json
CHANGED
|
@@ -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
|
|
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
|
-
|
|
268
|
-
break;
|
|
302
|
+
return c;
|
|
269
303
|
}
|
|
270
304
|
}
|
|
271
|
-
|
|
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
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
|
286
|
-
|
|
287
|
-
fs.mkdirSync(
|
|
288
|
-
for (const skill of
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
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
|
|
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
|
-
|
|
527
|
+
const platforms = ["agents"];
|
|
528
|
+
await stepInstallSkills(messages.zh, platforms);
|
|
477
529
|
console.log(messages.zh.nonTtyHint);
|
|
478
530
|
}
|
|
479
531
|
}
|