holos-skillhub 0.1.4 → 0.1.6

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.
Files changed (54) hide show
  1. package/dist/commands/install.d.ts.map +1 -1
  2. package/dist/commands/install.js +80 -32
  3. package/dist/commands/install.js.map +1 -1
  4. package/dist/commands/language.d.ts +3 -0
  5. package/dist/commands/language.d.ts.map +1 -0
  6. package/dist/commands/language.js +26 -0
  7. package/dist/commands/language.js.map +1 -0
  8. package/dist/commands/list.d.ts.map +1 -1
  9. package/dist/commands/list.js +17 -11
  10. package/dist/commands/list.js.map +1 -1
  11. package/dist/commands/login.d.ts.map +1 -1
  12. package/dist/commands/login.js +13 -12
  13. package/dist/commands/login.js.map +1 -1
  14. package/dist/commands/report.d.ts.map +1 -1
  15. package/dist/commands/report.js +14 -12
  16. package/dist/commands/report.js.map +1 -1
  17. package/dist/commands/search.d.ts.map +1 -1
  18. package/dist/commands/search.js +10 -9
  19. package/dist/commands/search.js.map +1 -1
  20. package/dist/commands/status.d.ts.map +1 -1
  21. package/dist/commands/status.js +13 -12
  22. package/dist/commands/status.js.map +1 -1
  23. package/dist/commands/upload.d.ts.map +1 -1
  24. package/dist/commands/upload.js +29 -25
  25. package/dist/commands/upload.js.map +1 -1
  26. package/dist/config.d.ts +6 -0
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +26 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/i18n/en.d.ts +3 -0
  31. package/dist/i18n/en.d.ts.map +1 -0
  32. package/dist/i18n/en.js +176 -0
  33. package/dist/i18n/en.js.map +1 -0
  34. package/dist/i18n/index.d.ts +3 -0
  35. package/dist/i18n/index.d.ts.map +1 -0
  36. package/dist/i18n/index.js +19 -0
  37. package/dist/i18n/index.js.map +1 -0
  38. package/dist/i18n/zh.d.ts +3 -0
  39. package/dist/i18n/zh.d.ts.map +1 -0
  40. package/dist/i18n/zh.js +176 -0
  41. package/dist/i18n/zh.js.map +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/progress.d.ts.map +1 -1
  46. package/dist/progress.js +16 -17
  47. package/dist/progress.js.map +1 -1
  48. package/dist/prompts.d.ts.map +1 -1
  49. package/dist/prompts.js +6 -5
  50. package/dist/prompts.js.map +1 -1
  51. package/dist/repl.d.ts.map +1 -1
  52. package/dist/repl.js +33 -29
  53. package/dist/repl.js.map +1 -1
  54. package/package.json +9 -3
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoHtD"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoLtD"}
@@ -5,17 +5,18 @@ import AdmZip from "adm-zip";
5
5
  import { HolosHubClient } from "../client.js";
6
6
  import { requireAuth, getConfig } from "../config.js";
7
7
  import { promptText, promptConfirm, cmd, resolveAuditId } from "../prompts.js";
8
+ import { t } from "../i18n/index.js";
8
9
  export function registerInstall(program) {
9
10
  program
10
11
  .command("install [audit-id-or-name]")
11
- .description("安装经过安全审计的 skill(仅限 approved conditional),支持 owner/name 格式")
12
- .option("-d, --dest <dir>", "安装目录(默认:~/.holoshub/skills")
13
- .option("-y, --yes", " conditional skill 自动确认安装")
12
+ .description("Install an audited Skill (approved or conditional) / 安装经过安全审计的 Skill")
13
+ .option("-d, --dest <dir>", "Installation directory (default: ~/.openclaw/skills)")
14
+ .option("-y, --yes", "Auto-confirm conditional skill installation")
14
15
  .action(async (auditId, opts) => {
15
16
  if (!auditId) {
16
- auditId = await promptText(chalk.cyan("? ") + "审计任务 ID、Skill 名称或 owner/name:");
17
+ auditId = await promptText(chalk.cyan("? ") + t("install.idPrompt"));
17
18
  if (!auditId) {
18
- console.error(chalk.red("❌ 必须提供审计任务 ID 或 Skill 名称"));
19
+ console.error(chalk.red(t("install.idRequired")));
19
20
  process.exit(1);
20
21
  }
21
22
  }
@@ -41,76 +42,123 @@ export function registerInstall(program) {
41
42
  }
42
43
  // 按名称解析时需用户确认,防止误装同名 skill
43
44
  if (resolvedByName) {
44
- const confirmed = await promptConfirm("确认安装这个 skill?", true);
45
+ const confirmed = await promptConfirm(t("install.confirmThisSkill"), true);
45
46
  if (!confirmed) {
46
- console.log(chalk.gray("已取消安装。"));
47
+ console.log(chalk.gray(t("install.cancelledInstall")));
47
48
  process.exit(0);
48
49
  }
49
50
  }
50
- // 检查状态
51
- let skillName = auditId;
51
+ // 检查状态并获取 skill 详情
52
+ let skillName = "";
53
+ let skillVersion = "";
52
54
  try {
53
55
  const status = await client.getStatus(auditId);
54
56
  if (status.status !== "DONE") {
55
- console.error(chalk.yellow(`⚠️ 审计尚未完成(${status.status}),无法安装`));
57
+ console.error(chalk.yellow(t("install.notDone")));
56
58
  process.exit(1);
57
59
  }
58
60
  if (status.scorecard_status === "rejected") {
59
- console.error(chalk.red("❌ 此 skill 审计结果为 REJECTED,拒绝安装。"));
60
- console.error(chalk.dim(" 运行以下命令查看详细报告:"));
61
+ console.error(chalk.red(t("install.rejected")));
62
+ console.error(chalk.dim(t("install.rejectedHint")));
61
63
  console.error(chalk.cyan(` ${cmd(`report ${auditId}`)}`));
62
64
  process.exit(1);
63
65
  }
64
66
  if (status.scorecard_status === "conditional") {
65
- console.warn(chalk.yellow("⚠️ 此 skill 审计结果为 CONDITIONAL(存在条件性风险)。"));
67
+ console.warn(chalk.yellow(t("install.conditional")));
66
68
  if (!opts.yes) {
67
- const confirmed = await promptConfirm(chalk.yellow("确认继续安装?(运行 report 可查看详情)"), false);
69
+ const confirmed = await promptConfirm(chalk.yellow(t("install.confirmContinue")), false);
68
70
  if (!confirmed) {
69
- console.log(chalk.gray("已取消安装。"));
71
+ console.log(chalk.gray(t("install.cancelledInstall")));
70
72
  process.exit(0);
71
73
  }
72
74
  }
73
75
  }
74
- // 获取 skill 详情以拿到名称
75
- try {
76
- const detail = await client.getSkill(auditId);
77
- skillName = detail.skill_name || auditId;
78
- }
79
- catch {
80
- // 使用 auditId 作为 fallback
81
- }
76
+ // 获取 skill 详情(名称 + 版本)
77
+ const detail = await client.getSkill(auditId);
78
+ skillName = detail.skill_name || "";
79
+ skillVersion = detail.skill_version || "";
82
80
  }
83
81
  catch (err) {
84
82
  console.error(chalk.red(`❌ ${err.message}`));
85
83
  process.exit(1);
86
84
  }
87
- // 确定安装目录
85
+ if (!skillName) {
86
+ console.error(chalk.red(t("install.idRequired")));
87
+ process.exit(1);
88
+ }
89
+ // 确定安装目录:baseDir/<skill_name>
88
90
  const baseDir = opts.dest || cfg.installDir;
89
91
  const installDir = path.join(baseDir, skillName);
92
+ // 检查是否已安装同名 skill,比较版本并确认替换
93
+ const metaPath = path.join(installDir, "_Holos-SkillHub.json");
94
+ if (fs.existsSync(metaPath)) {
95
+ try {
96
+ const existing = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
97
+ const oldVer = existing.version || t("install.versionUnknown");
98
+ const newVer = skillVersion || t("install.versionUnknown");
99
+ console.log(chalk.yellow(t("install.alreadyInstalled", { name: skillName })));
100
+ console.log(chalk.dim(` ${t("install.versionCurrent")} ${oldVer} → ${t("install.versionNew")} ${newVer}`));
101
+ if (!opts.yes) {
102
+ const confirmed = await promptConfirm(chalk.yellow(t("install.confirmReplace")), false);
103
+ if (!confirmed) {
104
+ console.log(chalk.gray(t("install.cancelledInstall")));
105
+ process.exit(0);
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ // 元数据损坏,直接继续覆盖
111
+ }
112
+ }
90
113
  fs.mkdirSync(installDir, { recursive: true });
91
114
  // 下载 zip 到临时文件
92
115
  const tmpZip = path.join(installDir, "__download.zip");
93
116
  try {
94
- console.log(chalk.cyan(`⬇️ 下载 skill:${skillName}`));
117
+ console.log(chalk.cyan(t("install.downloading", { name: skillName })));
95
118
  await client.downloadSkillZip(auditId, tmpZip);
96
- // 解压(防 Zip Slip:校验每个条目路径不超出 installDir
119
+ // 解压:剥掉 zip 顶层目录(可能是 UUID),直接展开到 installDir
97
120
  const zip = new AdmZip(tmpZip);
121
+ const entries = zip.getEntries();
122
+ // 检测公共顶层目录前缀
123
+ const topDirs = new Set(entries.map((e) => e.entryName.split("/")[0]).filter(Boolean));
124
+ const stripPrefix = topDirs.size === 1 ? [...topDirs][0] + "/" : "";
98
125
  const canonicalBase = path.resolve(installDir) + path.sep;
99
- for (const entry of zip.getEntries()) {
100
- const entryPath = path.resolve(installDir, entry.entryName);
126
+ for (const entry of entries) {
127
+ const stripped = stripPrefix
128
+ ? entry.entryName.startsWith(stripPrefix)
129
+ ? entry.entryName.slice(stripPrefix.length)
130
+ : entry.entryName
131
+ : entry.entryName;
132
+ if (!stripped)
133
+ continue; // 顶层目录条目本身,跳过
134
+ const entryPath = path.resolve(installDir, stripped);
101
135
  if (!entryPath.startsWith(canonicalBase)) {
102
- throw new Error(`不安全的 zip 条目路径:${entry.entryName}`);
136
+ throw new Error(t("install.unsafeZip", { path: entry.entryName }));
137
+ }
138
+ if (entry.isDirectory) {
139
+ fs.mkdirSync(entryPath, { recursive: true });
140
+ }
141
+ else {
142
+ fs.mkdirSync(path.dirname(entryPath), { recursive: true });
143
+ fs.writeFileSync(entryPath, entry.getData());
103
144
  }
104
145
  }
105
- zip.extractAllTo(installDir, true);
106
146
  fs.unlinkSync(tmpZip);
107
- console.log(chalk.green(`✅ 已安装到:${installDir}`));
147
+ // 写入安装元数据
148
+ const meta = {
149
+ skill_name: skillName,
150
+ version: skillVersion || null,
151
+ audit_id: auditId,
152
+ installed_at: new Date().toISOString(),
153
+ };
154
+ fs.writeFileSync(path.join(installDir, "_Holos-SkillHub.json"), JSON.stringify(meta, null, 2));
155
+ console.log(chalk.green(t("install.success", { dir: installDir })));
108
156
  }
109
157
  catch (err) {
110
158
  // 清理临时文件
111
159
  if (fs.existsSync(tmpZip))
112
160
  fs.unlinkSync(tmpZip);
113
- console.error(chalk.red(`❌ 安装失败:${err.message}`));
161
+ console.error(chalk.red(t("install.fetchError", { msg: err.message })));
114
162
  process.exit(1);
115
163
  }
116
164
  });
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,4BAA4B,CAAC;SACrC,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,kBAAkB,EAAE,sDAAsD,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,iEAAiE,CAAC;QAClF,MAAM,aAAa,GAAG,iBAAiB,CAAC;QACxC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC;gBACnC,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,MAAM,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,MAAM,CAAC,gBAAgB,KAAK,aAAa,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBACzF,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;wBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9C,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YACpC,YAAY,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEjD,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAG7D,CAAC;gBACF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAC/D,MAAM,MAAM,GAAG,YAAY,IAAI,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CACjE,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC,oBAAoB,CAAC,IAAI,MAAM,EAAE,CAAC,CACjG,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EACzC,KAAK,CACN,CAAC;oBACF,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;wBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QAED,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,eAAe;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE/C,4CAA4C;YAC5C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;YAEjC,aAAa;YACb,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC9D,CAAC;YACF,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAElD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;YAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,WAAW;oBAC1B,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC;wBACvC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;wBAC3C,CAAC,CAAC,KAAK,CAAC,SAAS;oBACnB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBACpB,IAAI,CAAC,QAAQ;oBAAE,SAAS,CAAC,cAAc;gBACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACrD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBACtB,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;YACD,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAEtB,UAAU;YACV,MAAM,IAAI,GAAG;gBACX,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,YAAY,IAAI,IAAI;gBAC7B,QAAQ,EAAE,OAAO;gBACjB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACvC,CAAC;YACF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,EAC7C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAC9B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;YACT,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLanguage(program: Command): void;
3
+ //# sourceMappingURL=language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/commands/language.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyBvD"}
@@ -0,0 +1,26 @@
1
+ import chalk from "chalk";
2
+ import { conf } from "../config.js";
3
+ import { t } from "../i18n/index.js";
4
+ export function registerLanguage(program) {
5
+ program
6
+ .command("language [lang]")
7
+ .description("Switch display language / 切换显示语言 (zh | en)")
8
+ .action((lang) => {
9
+ if (!lang) {
10
+ const current = conf.get("lang") || "zh";
11
+ const label = current === "en" ? "English" : "中文";
12
+ console.log(chalk.cyan(t("lang.current", { lang: `${current} (${label})` })));
13
+ console.log(chalk.gray(t("lang.usage")));
14
+ return;
15
+ }
16
+ if (lang !== "zh" && lang !== "en") {
17
+ console.error(chalk.red(t("lang.invalid", { lang })));
18
+ console.log(chalk.gray(t("lang.usage")));
19
+ process.exit(1);
20
+ }
21
+ conf.set("lang", lang);
22
+ const label = lang === "en" ? "English" : "中文";
23
+ console.log(chalk.green(t("lang.set", { lang: `${lang} (${label})` })));
24
+ });
25
+ }
26
+ //# sourceMappingURL=language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/commands/language.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC,CACjE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAU7D,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAiBxD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiDnD"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AAW7D,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAiBxD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkDnD"}
@@ -2,6 +2,7 @@ import chalk from "chalk";
2
2
  import { HolosHubClient } from "../client.js";
3
3
  import { requireAuth } from "../config.js";
4
4
  import { cmd } from "../prompts.js";
5
+ import { t } from "../i18n/index.js";
5
6
  const SCORECARD_COLORS = {
6
7
  approved: chalk.green,
7
8
  conditional: chalk.yellow,
@@ -25,12 +26,12 @@ export function formatSkillRow(item) {
25
26
  export function registerList(program) {
26
27
  program
27
28
  .command("list")
28
- .description("列出已审计的 skills")
29
- .option("-s, --status <status>", "按状态过滤:approved | conditional | rejected | RUNNING | PENDING | FAILED")
30
- .option("-q, --query <query>", "关键字搜索(支持语义搜索)")
31
- .option("--page <n>", "页码(从 1 开始)", "1")
32
- .option("--page-size <n>", "每页条数(1-100", "20")
33
- .option("--by <username>", "按上传者过滤")
29
+ .description("List audited Skills / 列出已审计的 Skills")
30
+ .option("-s, --status <status>", "Filter by status: approved | conditional | rejected | RUNNING | PENDING | FAILED")
31
+ .option("-q, --query <query>", "Keyword search (supports semantic search)")
32
+ .option("--page <n>", "Page number (starting from 1)", "1")
33
+ .option("--page-size <n>", "Items per page (1-100)", "20")
34
+ .option("--by <username>", "Filter by uploader")
34
35
  .action(async (opts) => {
35
36
  const { server, token } = await requireAuth();
36
37
  const client = new HolosHubClient(server, token);
@@ -43,17 +44,22 @@ export function registerList(program) {
43
44
  page_size: parseInt(opts.pageSize, 10),
44
45
  });
45
46
  if (result.items.length === 0) {
46
- console.log(chalk.gray(" 没有找到符合条件的 skill。"));
47
+ console.log(chalk.gray(t("list.noMatch")));
47
48
  return;
48
49
  }
49
- console.log(`\n ${chalk.bold("owner/名称".padEnd(38))} 安全评级`);
50
+ console.log(`\n ${chalk.bold("owner/name".padEnd(38))} Security`);
50
51
  console.log(" " + "─".repeat(52));
51
52
  for (const item of result.items) {
52
53
  formatSkillRow(item);
53
54
  }
54
- console.log(`\n 共 ${result.total} 条,当前第 ${result.page}/${Math.ceil(result.total / result.page_size)} 页`);
55
- if (result.page < Math.ceil(result.total / result.page_size)) {
56
- console.log(` 下一页:${chalk.cyan(cmd(`list --page ${result.page + 1}`))}`);
55
+ const totalPages = Math.ceil(result.total / result.page_size);
56
+ console.log(t("list.pageInfo", {
57
+ total: String(result.total),
58
+ page: String(result.page),
59
+ total_pages: String(totalPages),
60
+ }));
61
+ if (result.page < totalPages) {
62
+ console.log(t("list.nextPage") + chalk.cyan(cmd(`list --page ${result.page + 1}`)));
57
63
  }
58
64
  }
59
65
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAiB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,MAAM,gBAAgB,GAA0C;IAC9D,QAAQ,EAAE,KAAK,CAAC,KAAK;IACrB,WAAW,EAAE,KAAK,CAAC,MAAM;IACzB,QAAQ,EAAE,KAAK,CAAC,GAAG;CACpB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC;IAErD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG;QAC1C,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CACvB,CAAC;IACF,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,uBAAuB,EAAE,sEAAsE,CAAC;SACvG,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;SAC9C,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,CAAC;SACvC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,CAAC;SAC9C,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACrC,CAAC,EAAE,IAAI,CAAC,KAAK;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,IAAI,CAAC,EAAE;gBACpB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7B,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;aACvC,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAChD,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,cAAc,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YAED,OAAO,CAAC,GAAG,CACT,SAAS,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAC7F,CAAC;YACF,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7D,OAAO,CAAC,GAAG,CACT,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAC7D,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4CpD"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4CpD"}
@@ -2,34 +2,35 @@ import chalk from "chalk";
2
2
  import { HolosHubClient } from "../client.js";
3
3
  import { setConfig } from "../config.js";
4
4
  import { promptText, promptPassword } from "../prompts.js";
5
+ import { t } from "../i18n/index.js";
5
6
  export function registerLogin(program) {
6
7
  program
7
8
  .command("login")
8
- .description("登录 Holos SkillHub 并保存凭证")
9
- .option("-s, --server <url>", "Holos SkillHub 服务地址", process.env.HOLOS_SKILLHUB_SERVER || "https://holos.sii.edu.cn/skillhub")
10
- .option("-u, --user <username>", "用户名")
11
- .option("-p, --password <password>", "密码(也可通过 HOLOS_SKILLHUB_PASSWORD 环境变量传入)", process.env.HOLOS_SKILLHUB_PASSWORD)
9
+ .description("Login to Holos SkillHub / 登录 Holos SkillHub")
10
+ .option("-s, --server <url>", "Holos SkillHub server URL", process.env.HOLOS_SKILLHUB_SERVER || "https://holos.sii.edu.cn/skillhub")
11
+ .option("-u, --user <username>", "Username / 用户名")
12
+ .option("-p, --password <password>", "Password (or HOLOS_SKILLHUB_PASSWORD env var)", process.env.HOLOS_SKILLHUB_PASSWORD)
12
13
  .action(async (opts) => {
13
14
  // 服务器地址未通过 -s 指定时交互式确认
14
15
  let server = opts.server;
15
16
  if (!process.argv.includes("-s") && !process.argv.includes("--server")) {
16
- server = await promptText(chalk.cyan("? ") + `服务器地址 [${opts.server}]:`, opts.server);
17
+ server = await promptText(chalk.cyan("? ") + t("login.serverPrompt", { default: opts.server }), opts.server);
17
18
  if (!server)
18
19
  server = opts.server;
19
20
  }
20
21
  // 用户名未提供时交互式输入(默认 admin)
21
22
  let username = opts.user || "";
22
23
  if (!username) {
23
- username = await promptText(chalk.cyan("? ") + "用户名:", "admin");
24
+ username = await promptText(chalk.cyan("? ") + t("login.usernamePrompt"), "admin");
24
25
  if (!username)
25
26
  username = "admin";
26
27
  }
27
28
  // 密码未提供时隐藏输入
28
29
  let password = opts.password || "";
29
30
  if (!password) {
30
- password = await promptPassword(chalk.cyan("? ") + "密码(隐藏输入):");
31
+ password = await promptPassword(chalk.cyan("? ") + t("login.passwordPrompt"));
31
32
  if (!password) {
32
- console.error(chalk.red("❌ 密码不能为空"));
33
+ console.error(chalk.red(t("login.passwordEmpty")));
33
34
  process.exit(1);
34
35
  }
35
36
  }
@@ -37,12 +38,12 @@ export function registerLogin(program) {
37
38
  try {
38
39
  const result = await client.login(username, password);
39
40
  setConfig({ server, token: result.token, username: result.username });
40
- console.log(chalk.green(`✅ 登录成功,欢迎 ${result.username}`));
41
- console.log(` 服务地址:${server}`);
42
- console.log(` 凭证已保存到本地配置`);
41
+ console.log(chalk.green(t("login.success", { name: result.username })));
42
+ console.log(t("login.serverAddr", { server }));
43
+ console.log(t("login.credsSaved"));
43
44
  }
44
45
  catch (err) {
45
- console.error(chalk.red(`❌ ${err.message}`));
46
+ console.error(chalk.red(t("login.loginError", { msg: err.message })));
46
47
  process.exit(1);
47
48
  }
48
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,mCAAmC,CAAC;SAC7H,MAAM,CAAC,uBAAuB,EAAE,KAAK,CAAC;SACtC,MAAM,CAAC,2BAA2B,EAAE,yCAAyC,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;SACnH,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,uBAAuB;QACvB,IAAI,MAAM,GAAW,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvE,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM;gBAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACpC,CAAC;QAED,yBAAyB;QACzB,IAAI,QAAQ,GAAW,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ;gBAAE,QAAQ,GAAG,OAAO,CAAC;QACpC,CAAC;QAED,aAAa;QACb,IAAI,QAAQ,GAAW,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,mCAAmC,CAAC;SACnI,MAAM,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;SACjD,MAAM,CAAC,2BAA2B,EAAE,+CAA+C,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;SACzH,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,uBAAuB;QACvB,IAAI,MAAM,GAAW,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvE,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7G,IAAI,CAAC,MAAM;gBAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACpC,CAAC;QAED,yBAAyB;QACzB,IAAI,QAAQ,GAAW,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC,CAAC;YACnF,IAAI,CAAC,QAAQ;gBAAE,QAAQ,GAAG,OAAO,CAAC;QACpC,CAAC;QAED,aAAa;QACb,IAAI,QAAQ,GAAW,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4DrD"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6DrD"}
@@ -1,27 +1,29 @@
1
1
  import chalk from "chalk";
2
2
  import * as path from "path";
3
3
  import { HolosHubClient } from "../client.js";
4
- import { requireAuth, getConfig } from "../config.js";
4
+ import { requireAuth } from "../config.js";
5
5
  import { promptText, cmd, resolveAuditId } from "../prompts.js";
6
+ import { t } from "../i18n/index.js";
6
7
  export function registerReport(program) {
7
8
  program
8
9
  .command("report [audit-id]")
9
- .description("下载审计报告")
10
- .option("-f, --fmt <format>", "报告格式:json md", "")
11
- .option("-o, --out <file>", "输出文件路径(默认:当前目录)")
10
+ .description("Download audit report / 下载审计报告")
11
+ .option("-f, --fmt <format>", "Report format: json or md", "")
12
+ .option("-o, --out <file>", "Output file path (default: current directory)")
12
13
  .action(async (auditId, opts) => {
13
14
  if (!auditId) {
14
- auditId = await promptText(chalk.cyan("? ") + "审计任务 ID 或 Skill 名称:");
15
+ auditId = await promptText(chalk.cyan("? ") + t("report.idPrompt"));
15
16
  if (!auditId) {
16
- console.error(chalk.red("❌ 必须提供审计任务 ID 或 Skill 名称"));
17
+ console.error(chalk.red(t("report.idRequired")));
17
18
  process.exit(1);
18
19
  }
19
20
  }
20
21
  const { server, token } = await requireAuth();
22
+ const { getConfig } = await import("../config.js");
21
23
  const cfg = getConfig();
22
24
  const fmt = (opts.fmt || cfg.defaultFmt);
23
25
  if (fmt !== "json" && fmt !== "md") {
24
- console.error(chalk.red("❌ --fmt 必须是 json 或 md"));
26
+ console.error(chalk.red(t("report.fmtInvalid")));
25
27
  process.exit(1);
26
28
  }
27
29
  const client = new HolosHubClient(server, token);
@@ -37,11 +39,11 @@ export function registerReport(program) {
37
39
  const status = await client.getStatus(auditId);
38
40
  if (status.status !== "DONE") {
39
41
  if (status.status === "FAILED") {
40
- console.error(chalk.red(`❌ 审计失败,无法下载报告:${status.message || ""}`));
42
+ console.error(chalk.red(t("report.failed", { msg: status.message || "" })));
41
43
  }
42
44
  else {
43
- console.error(chalk.yellow(`⚠️ 审计尚未完成(当前状态:${status.status}),请稍后再试`));
44
- console.log(` 实时监听:${chalk.cyan(cmd(`status ${auditId} --watch`))}`);
45
+ console.error(chalk.yellow(t("report.notDone", { status: status.status })));
46
+ console.log(t("report.notDoneWatch") + chalk.cyan(cmd(`status ${auditId} --watch`)));
45
47
  }
46
48
  process.exit(1);
47
49
  }
@@ -54,10 +56,10 @@ export function registerReport(program) {
54
56
  const outPath = opts.out || path.join(process.cwd(), `${auditId}_report${ext}`);
55
57
  try {
56
58
  await client.downloadReport(auditId, fmt, outPath);
57
- console.log(chalk.green(`✅ 报告已保存:${outPath}`));
59
+ console.log(chalk.green(t("report.saved", { path: outPath })));
58
60
  }
59
61
  catch (err) {
60
- console.error(chalk.red(`❌ 下载失败:${err.message}`));
62
+ console.error(chalk.red(t("report.downloadFailed", { msg: err.message })));
61
63
  process.exit(1);
62
64
  }
63
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmDrD"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiDrD"}
@@ -3,17 +3,18 @@ import { HolosHubClient } from "../client.js";
3
3
  import { requireAuth } from "../config.js";
4
4
  import { formatSkillRow } from "./list.js";
5
5
  import { promptText, cmd } from "../prompts.js";
6
+ import { t } from "../i18n/index.js";
6
7
  export function registerSearch(program) {
7
8
  program
8
9
  .command("search [query]")
9
- .description("搜索 skill(支持语义搜索)")
10
- .option("-s, --status <status>", "按状态过滤:approved | conditional | rejected")
11
- .option("--page <n>", "页码", "1")
10
+ .description("Search Skills (supports semantic search) / 搜索 Skill")
11
+ .option("-s, --status <status>", "Filter by status: approved | conditional | rejected")
12
+ .option("--page <n>", "Page number", "1")
12
13
  .action(async (query, opts) => {
13
14
  if (!query) {
14
- query = await promptText(chalk.cyan("? ") + "搜索关键词:");
15
+ query = await promptText(chalk.cyan("? ") + t("search.queryPrompt"));
15
16
  if (!query) {
16
- console.error(chalk.red("❌ 必须提供搜索关键词"));
17
+ console.error(chalk.red(t("search.queryRequired")));
17
18
  process.exit(1);
18
19
  }
19
20
  }
@@ -27,18 +28,18 @@ export function registerSearch(program) {
27
28
  page_size: 20,
28
29
  });
29
30
  if (result.items.length === 0) {
30
- console.log(chalk.gray(` 没有找到与 "${query}" 相关的 skill。`));
31
+ console.log(chalk.gray(t("search.noMatch", { query })));
31
32
  return;
32
33
  }
33
- console.log(`\n 搜索 "${chalk.bold(query)}" — 共 ${result.total} 条结果\n`);
34
- console.log(` ${chalk.bold("名称".padEnd(30))} 安全评级`);
34
+ console.log(t("search.resultHeader", { query: chalk.bold(query), total: String(result.total) }));
35
+ console.log(` ${chalk.bold("name".padEnd(30))} Security`);
35
36
  console.log(" " + "─".repeat(44));
36
37
  for (const item of result.items) {
37
38
  formatSkillRow(item);
38
39
  }
39
40
  const currentPage = parseInt(opts.page, 10);
40
41
  if (result.total > currentPage * 20) {
41
- console.log(`\n 更多结果:${chalk.cyan(cmd(`search "${query}" --page ${currentPage + 1}`))}`);
42
+ console.log(t("search.moreResults") + chalk.cyan(cmd(`search "${query}" --page ${currentPage + 1}`)));
42
43
  }
43
44
  }
44
45
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwDrD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwDrD"}