holos-skillhub 0.1.0

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 (61) hide show
  1. package/dist/client.d.ts +76 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +208 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/audit.d.ts +3 -0
  6. package/dist/commands/audit.d.ts.map +1 -0
  7. package/dist/commands/audit.js +70 -0
  8. package/dist/commands/audit.js.map +1 -0
  9. package/dist/commands/install.d.ts +3 -0
  10. package/dist/commands/install.d.ts.map +1 -0
  11. package/dist/commands/install.js +110 -0
  12. package/dist/commands/install.js.map +1 -0
  13. package/dist/commands/list.d.ts +5 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +63 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/login.d.ts +3 -0
  18. package/dist/commands/login.d.ts.map +1 -0
  19. package/dist/commands/login.js +43 -0
  20. package/dist/commands/login.js.map +1 -0
  21. package/dist/commands/report.d.ts +3 -0
  22. package/dist/commands/report.d.ts.map +1 -0
  23. package/dist/commands/report.js +65 -0
  24. package/dist/commands/report.js.map +1 -0
  25. package/dist/commands/search.d.ts +3 -0
  26. package/dist/commands/search.d.ts.map +1 -0
  27. package/dist/commands/search.js +50 -0
  28. package/dist/commands/search.js.map +1 -0
  29. package/dist/commands/status.d.ts +3 -0
  30. package/dist/commands/status.d.ts.map +1 -0
  31. package/dist/commands/status.js +61 -0
  32. package/dist/commands/status.js.map +1 -0
  33. package/dist/commands/upload.d.ts +3 -0
  34. package/dist/commands/upload.d.ts.map +1 -0
  35. package/dist/commands/upload.js +70 -0
  36. package/dist/commands/upload.js.map +1 -0
  37. package/dist/config.d.ts +17 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +65 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/index.d.ts +8 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +43 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/pack.d.ts +2 -0
  46. package/dist/pack.d.ts.map +1 -0
  47. package/dist/pack.js +31 -0
  48. package/dist/pack.js.map +1 -0
  49. package/dist/progress.d.ts +9 -0
  50. package/dist/progress.d.ts.map +1 -0
  51. package/dist/progress.js +63 -0
  52. package/dist/progress.js.map +1 -0
  53. package/dist/prompts.d.ts +28 -0
  54. package/dist/prompts.d.ts.map +1 -0
  55. package/dist/prompts.js +141 -0
  56. package/dist/prompts.js.map +1 -0
  57. package/dist/repl.d.ts +2 -0
  58. package/dist/repl.d.ts.map +1 -0
  59. package/dist/repl.js +209 -0
  60. package/dist/repl.js.map +1 -0
  61. package/package.json +45 -0
@@ -0,0 +1,43 @@
1
+ import chalk from "chalk";
2
+ import { HolosHubClient } from "../client.js";
3
+ import { setConfig } from "../config.js";
4
+ import { promptText, promptPassword } from "../prompts.js";
5
+ export function registerLogin(program) {
6
+ program
7
+ .command("login")
8
+ .description("登录 Holos SkillHub 并保存凭证")
9
+ .option("-s, --server <url>", "Holos SkillHub 服务地址", process.env.HOLOS_SKILLHUB_SERVER || "https://holos.sii.edu.cn")
10
+ .option("-u, --user <username>", "用户名")
11
+ .option("-p, --password <password>", "密码(也可通过 HOLOS_SKILLHUB_PASSWORD 环境变量传入)", process.env.HOLOS_SKILLHUB_PASSWORD)
12
+ .action(async (opts) => {
13
+ // 用户名未提供时交互式输入(默认 admin)
14
+ let username = opts.user || "";
15
+ if (!username) {
16
+ username = await promptText(chalk.cyan("? ") + "用户名:", "admin");
17
+ if (!username)
18
+ username = "admin";
19
+ }
20
+ // 密码未提供时隐藏输入
21
+ let password = opts.password || "";
22
+ if (!password) {
23
+ password = await promptPassword(chalk.cyan("? ") + "密码(隐藏输入):");
24
+ if (!password) {
25
+ console.error(chalk.red("❌ 密码不能为空"));
26
+ process.exit(1);
27
+ }
28
+ }
29
+ const client = new HolosHubClient(opts.server, "");
30
+ try {
31
+ const result = await client.login(username, password);
32
+ setConfig({ server: opts.server, token: result.token, username: result.username });
33
+ console.log(chalk.green(`✅ 登录成功,欢迎 ${result.username}`));
34
+ console.log(` 服务地址:${opts.server}`);
35
+ console.log(` 凭证已保存到本地配置`);
36
+ }
37
+ catch (err) {
38
+ console.error(chalk.red(`❌ ${err.message}`));
39
+ process.exit(1);
40
+ }
41
+ });
42
+ }
43
+ //# sourceMappingURL=login.js.map
@@ -0,0 +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,0BAA0B,CAAC;SACpH,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,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,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACtC,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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerReport(program: Command): void;
3
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,65 @@
1
+ import chalk from "chalk";
2
+ import * as path from "path";
3
+ import { HolosHubClient } from "../client.js";
4
+ import { requireAuth, getConfig } from "../config.js";
5
+ import { promptText, cmd, resolveAuditId } from "../prompts.js";
6
+ export function registerReport(program) {
7
+ program
8
+ .command("report [audit-id]")
9
+ .description("下载审计报告")
10
+ .option("-f, --fmt <format>", "报告格式:json 或 md", "")
11
+ .option("-o, --out <file>", "输出文件路径(默认:当前目录)")
12
+ .action(async (auditId, opts) => {
13
+ if (!auditId) {
14
+ auditId = await promptText(chalk.cyan("? ") + "审计任务 ID 或 Skill 名称:");
15
+ if (!auditId) {
16
+ console.error(chalk.red("❌ 必须提供审计任务 ID 或 Skill 名称"));
17
+ process.exit(1);
18
+ }
19
+ }
20
+ const { server, token } = await requireAuth();
21
+ const cfg = getConfig();
22
+ const fmt = (opts.fmt || cfg.defaultFmt);
23
+ if (fmt !== "json" && fmt !== "md") {
24
+ console.error(chalk.red("❌ --fmt 必须是 json 或 md"));
25
+ process.exit(1);
26
+ }
27
+ const client = new HolosHubClient(server, token);
28
+ try {
29
+ auditId = await resolveAuditId(client, auditId);
30
+ }
31
+ catch (err) {
32
+ console.error(chalk.red(`❌ ${err.message}`));
33
+ process.exit(1);
34
+ }
35
+ // 先确认任务已完成
36
+ try {
37
+ const status = await client.getStatus(auditId);
38
+ if (status.status !== "DONE") {
39
+ if (status.status === "FAILED") {
40
+ console.error(chalk.red(`❌ 审计失败,无法下载报告:${status.message || ""}`));
41
+ }
42
+ else {
43
+ console.error(chalk.yellow(`⚠️ 审计尚未完成(当前状态:${status.status}),请稍后再试`));
44
+ console.log(` 实时监听:${chalk.cyan(cmd(`status ${auditId} --watch`))}`);
45
+ }
46
+ process.exit(1);
47
+ }
48
+ }
49
+ catch (err) {
50
+ console.error(chalk.red(`❌ ${err.message}`));
51
+ process.exit(1);
52
+ }
53
+ const ext = fmt === "json" ? ".json" : ".md";
54
+ const outPath = opts.out || path.join(process.cwd(), `${auditId}_report${ext}`);
55
+ try {
56
+ await client.downloadReport(auditId, fmt, outPath);
57
+ console.log(chalk.green(`✅ 报告已保存:${outPath}`));
58
+ }
59
+ catch (err) {
60
+ console.error(chalk.red(`❌ 下载失败:${err.message}`));
61
+ process.exit(1);
62
+ }
63
+ });
64
+ }
65
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerSearch(program: Command): void;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,50 @@
1
+ import chalk from "chalk";
2
+ import { HolosHubClient } from "../client.js";
3
+ import { requireAuth } from "../config.js";
4
+ import { formatSkillRow } from "./list.js";
5
+ import { promptText, cmd } from "../prompts.js";
6
+ export function registerSearch(program) {
7
+ program
8
+ .command("search [query]")
9
+ .description("搜索 skill(支持语义搜索)")
10
+ .option("-s, --status <status>", "按状态过滤:approved | conditional | rejected")
11
+ .option("--page <n>", "页码", "1")
12
+ .action(async (query, opts) => {
13
+ if (!query) {
14
+ query = await promptText(chalk.cyan("? ") + "搜索关键词:");
15
+ if (!query) {
16
+ console.error(chalk.red("❌ 必须提供搜索关键词"));
17
+ process.exit(1);
18
+ }
19
+ }
20
+ const { server, token } = await requireAuth();
21
+ const client = new HolosHubClient(server, token);
22
+ try {
23
+ const result = await client.listSkills({
24
+ q: query,
25
+ status: opts.status,
26
+ page: parseInt(opts.page, 10),
27
+ page_size: 20,
28
+ });
29
+ if (result.items.length === 0) {
30
+ console.log(chalk.gray(` 没有找到与 "${query}" 相关的 skill。`));
31
+ return;
32
+ }
33
+ console.log(`\n 搜索 "${chalk.bold(query)}" — 共 ${result.total} 条结果\n`);
34
+ console.log(` ${chalk.bold("名称".padEnd(30))} 安全评级`);
35
+ console.log(" " + "─".repeat(44));
36
+ for (const item of result.items) {
37
+ formatSkillRow(item);
38
+ }
39
+ const currentPage = parseInt(opts.page, 10);
40
+ if (result.total > currentPage * 20) {
41
+ console.log(`\n 更多结果:${chalk.cyan(cmd(`search "${query}" --page ${currentPage + 1}`))}`);
42
+ }
43
+ }
44
+ catch (err) {
45
+ console.error(chalk.red(`❌ ${err.message}`));
46
+ process.exit(1);
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerStatus(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +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,CAoDrD"}
@@ -0,0 +1,61 @@
1
+ import chalk from "chalk";
2
+ import { HolosHubClient } from "../client.js";
3
+ import { requireAuth } from "../config.js";
4
+ import { watchAuditProgress, printStatusRow } from "../progress.js";
5
+ import { promptText, cmd, resolveAuditId } from "../prompts.js";
6
+ export function registerStatus(program) {
7
+ program
8
+ .command("status [audit-id]")
9
+ .description("查看审计任务状态")
10
+ .option("-w, --watch", "实时监听进度(WebSocket 模式)")
11
+ .action(async (auditId, opts) => {
12
+ if (!auditId) {
13
+ auditId = await promptText(chalk.cyan("? ") + "审计任务 ID 或 Skill 名称:");
14
+ if (!auditId) {
15
+ console.error(chalk.red("❌ 必须提供审计任务 ID 或 Skill 名称"));
16
+ process.exit(1);
17
+ }
18
+ }
19
+ const { server, token } = await requireAuth();
20
+ const client = new HolosHubClient(server, token);
21
+ try {
22
+ auditId = await resolveAuditId(client, auditId);
23
+ }
24
+ catch (err) {
25
+ console.error(chalk.red(`❌ ${err.message}`));
26
+ process.exit(1);
27
+ }
28
+ if (opts.watch) {
29
+ console.log(chalk.cyan(`👀 监听审计进度:${auditId}\n`));
30
+ await watchAuditProgress(client, auditId);
31
+ }
32
+ else {
33
+ try {
34
+ const [status, detail] = await Promise.all([
35
+ client.getStatus(auditId),
36
+ client.getSkill(auditId).catch(() => null),
37
+ ]);
38
+ console.log();
39
+ if (detail?.skill_name) {
40
+ console.log(`Skill: ${chalk.bold(detail.skill_name)}`);
41
+ }
42
+ if (detail?.skill_description) {
43
+ console.log(`描述: ${chalk.dim(detail.skill_description)}`);
44
+ }
45
+ console.log(`审计 ID: ${chalk.gray(auditId)}`);
46
+ printStatusRow(status);
47
+ if (status.status === "DONE") {
48
+ console.log(`\n下载报告:${chalk.cyan(cmd(`report ${auditId}`))}`);
49
+ }
50
+ else if (status.status !== "FAILED") {
51
+ console.log(`\n实时监听:${chalk.cyan(cmd(`status ${auditId} --watch`))}`);
52
+ }
53
+ }
54
+ catch (err) {
55
+ console.error(chalk.red(`❌ ${err.message}`));
56
+ process.exit(1);
57
+ }
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerUpload(program: Command): void;
3
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8DrD"}
@@ -0,0 +1,70 @@
1
+ import chalk from "chalk";
2
+ import * as path from "path";
3
+ import * as fs from "fs";
4
+ import { HolosHubClient } from "../client.js";
5
+ import { requireAuth } from "../config.js";
6
+ import { watchAuditProgress } from "../progress.js";
7
+ import { promptText, cmd } from "../prompts.js";
8
+ export function registerUpload(program) {
9
+ program
10
+ .command("upload [skill-path]")
11
+ .description("上传 skill 提交安全审计(支持本地目录或 zip 文件)")
12
+ .option("-m, --mode <mode>", "审计模式:standard(完整)或 quick(快速)", "standard")
13
+ .option("-w, --wait", "等待审计完成并实时显示进度")
14
+ .action(async (skillPath, opts) => {
15
+ if (!skillPath) {
16
+ skillPath = await promptText(chalk.cyan("? ") + "Skill 路径(目录或 .zip 文件):");
17
+ if (!skillPath) {
18
+ console.error(chalk.red("❌ 必须提供 skill 路径"));
19
+ process.exit(1);
20
+ }
21
+ }
22
+ const { server, token } = await requireAuth();
23
+ const client = new HolosHubClient(server, token);
24
+ let result;
25
+ try {
26
+ const abs = path.resolve(skillPath);
27
+ if (!fs.existsSync(abs)) {
28
+ console.error(chalk.red(`❌ 路径不存在:${abs}`));
29
+ process.exit(1);
30
+ }
31
+ const stat = fs.statSync(abs);
32
+ if (stat.isDirectory()) {
33
+ console.log(chalk.cyan(`⬆️ 上传目录:${abs}`));
34
+ result = await client.uploadFolder(abs, opts.mode);
35
+ }
36
+ else if (abs.endsWith(".zip")) {
37
+ console.log(chalk.cyan(`⬆️ 上传 ZIP:${abs}`));
38
+ result = await client.uploadZip(abs, opts.mode);
39
+ }
40
+ else {
41
+ console.error(chalk.red("❌ skill-path 必须是目录或 .zip 文件"));
42
+ process.exit(1);
43
+ }
44
+ }
45
+ catch (err) {
46
+ console.error(chalk.red(`❌ 提交失败:${err.message}`));
47
+ process.exit(1);
48
+ }
49
+ if (result.duplicate) {
50
+ console.log(chalk.yellow(`⚠️ 检测到重复 skill(SHA256 相同)`));
51
+ console.log(` 已有审计 ID:${result.existing_audit_id || result.task_id}`);
52
+ }
53
+ else {
54
+ console.log(chalk.green(`✅ 已提交审计任务`));
55
+ }
56
+ console.log(` task_id:${chalk.bold(result.task_id)}`);
57
+ console.log(` skill_id:${result.skill_id}`);
58
+ console.log(` sha256:${result.sha256}`);
59
+ console.log(`\n 查看状态:${chalk.cyan(cmd(`status ${result.task_id}`))}`);
60
+ console.log(` 下载报告:${chalk.cyan(cmd(`report ${result.task_id}`))}`);
61
+ if (opts.wait && !result.duplicate) {
62
+ console.log();
63
+ const status = await watchAuditProgress(client, result.task_id);
64
+ if (status) {
65
+ console.log(`\n 下载报告:${chalk.cyan(cmd(`report ${result.task_id}`))}`);
66
+ }
67
+ }
68
+ });
69
+ }
70
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import Conf from "conf";
2
+ interface ConfigSchema {
3
+ server: string;
4
+ token: string;
5
+ username: string;
6
+ defaultFmt: "json" | "md";
7
+ installDir: string;
8
+ }
9
+ declare const conf: Conf<ConfigSchema>;
10
+ export declare function getConfig(): ConfigSchema;
11
+ export declare function setConfig(updates: Partial<ConfigSchema>): void;
12
+ export declare function requireAuth(): Promise<{
13
+ server: string;
14
+ token: string;
15
+ }>;
16
+ export { conf };
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,IAAI,oBASR,CAAC;AAEH,wBAAgB,SAAS,IAAI,YAAY,CAQxC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAI9D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA8C9E;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,65 @@
1
+ import Conf from "conf";
2
+ import chalk from "chalk";
3
+ import { promptText, promptPassword, promptConfirm } from "./prompts.js";
4
+ const conf = new Conf({
5
+ projectName: "holos-skillhub",
6
+ defaults: {
7
+ server: "https://holos.sii.edu.cn",
8
+ token: "",
9
+ username: "",
10
+ defaultFmt: "md",
11
+ installDir: `${process.env.HOME || "~"}/.holos-skillhub/skills`,
12
+ },
13
+ });
14
+ export function getConfig() {
15
+ return {
16
+ server: process.env.HOLOS_SKILLHUB_SERVER || conf.get("server"),
17
+ token: process.env.HOLOS_SKILLHUB_TOKEN || conf.get("token"),
18
+ username: conf.get("username"),
19
+ defaultFmt: conf.get("defaultFmt"),
20
+ installDir: conf.get("installDir"),
21
+ };
22
+ }
23
+ export function setConfig(updates) {
24
+ for (const [key, value] of Object.entries(updates)) {
25
+ conf.set(key, value);
26
+ }
27
+ }
28
+ export async function requireAuth() {
29
+ const cfg = getConfig();
30
+ if (cfg.token) {
31
+ return { server: cfg.server, token: cfg.token };
32
+ }
33
+ // 非 TTY 环境(CI/管道)保持快速失败
34
+ if (!process.stdin.isTTY) {
35
+ console.error("未找到认证 token。请先运行:holos-skillhub login --server <URL> --user <username> --password <password>");
36
+ process.exit(1);
37
+ }
38
+ // TTY 环境:引导登录
39
+ console.log(chalk.yellow("⚠ 未登录,需要先连接到 Holos SkillHub 服务器。"));
40
+ const doLogin = await promptConfirm("现在登录?", true);
41
+ if (!doLogin) {
42
+ process.exit(0);
43
+ }
44
+ const server = await promptText(chalk.cyan("? ") + `服务器地址 [${cfg.server}]:`, cfg.server);
45
+ const username = await promptText(chalk.cyan("? ") + "用户名:", "admin");
46
+ const password = await promptPassword(chalk.cyan("? ") + "密码(隐藏输入):");
47
+ if (!password) {
48
+ console.error(chalk.red("❌ 密码不能为空"));
49
+ process.exit(1);
50
+ }
51
+ try {
52
+ const { HolosHubClient } = await import("./client.js");
53
+ const client = new HolosHubClient(server, "");
54
+ const result = await client.login(username, password);
55
+ setConfig({ server, token: result.token, username: result.username });
56
+ console.log(chalk.green(`✅ 登录成功,欢迎 ${result.username}`));
57
+ return { server, token: result.token };
58
+ }
59
+ catch (err) {
60
+ console.error(chalk.red(`❌ 登录失败:${err.message}`));
61
+ process.exit(1);
62
+ }
63
+ }
64
+ export { conf };
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ /**
4
+ * 创建并返回配置好所有子命令的 Commander 实例。
5
+ * 在普通 CLI 模式和 REPL 模式中均可复用。
6
+ */
7
+ export declare function createProgram(): Command;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAgBvC"}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { createRequire } from "module";
4
+ import { registerLogin } from "./commands/login.js";
5
+ import { registerUpload } from "./commands/upload.js";
6
+ import { registerStatus } from "./commands/status.js";
7
+ import { registerReport } from "./commands/report.js";
8
+ import { registerList } from "./commands/list.js";
9
+ import { registerSearch } from "./commands/search.js";
10
+ import { registerInstall } from "./commands/install.js";
11
+ const require = createRequire(import.meta.url);
12
+ const pkg = require("../package.json");
13
+ /**
14
+ * 创建并返回配置好所有子命令的 Commander 实例。
15
+ * 在普通 CLI 模式和 REPL 模式中均可复用。
16
+ */
17
+ export function createProgram() {
18
+ const program = new Command();
19
+ program
20
+ .name("holos-skillhub")
21
+ .description(pkg.description)
22
+ .version(pkg.version, "-v, --version", "输出版本号");
23
+ registerLogin(program);
24
+ registerUpload(program);
25
+ registerStatus(program);
26
+ registerReport(program);
27
+ registerList(program);
28
+ registerSearch(program);
29
+ registerInstall(program);
30
+ return program;
31
+ }
32
+ // 无参数时进入交互式 REPL,有参数时走标准 CLI 路径
33
+ (async () => {
34
+ const args = process.argv.slice(2);
35
+ if (args.length === 0) {
36
+ const { startRepl } = await import("./repl.js");
37
+ await startRepl();
38
+ }
39
+ else {
40
+ createProgram().parse(process.argv);
41
+ }
42
+ })();
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAA6C,CAAC;AAEnF;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,gBAAgB,CAAC;SACtB,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;SAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IAElD,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,eAAe,CAAC,OAAO,CAAC,CAAC;IAEzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gCAAgC;AAChC,CAAC,KAAK,IAAI,EAAE;IACV,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,aAAa,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;AACH,CAAC,CAAC,EAAE,CAAC"}
package/dist/pack.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function packDirectory(srcDir: string, outZip: string): Promise<void>;
2
+ //# sourceMappingURL=pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF"}
package/dist/pack.js ADDED
@@ -0,0 +1,31 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import archiver from "archiver";
4
+ const SKIP_NAMES = new Set(["__pycache__", ".git", "node_modules", ".DS_Store", "dist"]);
5
+ export async function packDirectory(srcDir, outZip) {
6
+ return new Promise((resolve, reject) => {
7
+ const output = fs.createWriteStream(outZip);
8
+ const archive = archiver("zip", { zlib: { level: 6 } });
9
+ output.on("close", resolve);
10
+ archive.on("error", reject);
11
+ archive.pipe(output);
12
+ const dirName = path.basename(srcDir);
13
+ addDirToArchive(archive, srcDir, dirName);
14
+ archive.finalize();
15
+ });
16
+ }
17
+ function addDirToArchive(archive, dir, archivePath) {
18
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
19
+ if (SKIP_NAMES.has(entry.name))
20
+ continue;
21
+ const fullPath = path.join(dir, entry.name);
22
+ const entryArchivePath = `${archivePath}/${entry.name}`;
23
+ if (entry.isDirectory()) {
24
+ addDirToArchive(archive, fullPath, entryArchivePath);
25
+ }
26
+ else {
27
+ archive.file(fullPath, { name: entryArchivePath });
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,MAAc;IAChE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACtB,OAA0B,EAC1B,GAAW,EACX,WAAmB;IAEnB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACxD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { HolosHubClient } from "./client.js";
2
+ export declare function watchAuditProgress(client: HolosHubClient, taskId: string): Promise<string | null>;
3
+ export declare function printStatusRow(status: {
4
+ status: string;
5
+ phase: string | null;
6
+ message: string | null;
7
+ scorecard_status: string | null;
8
+ }): void;
9
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAC;AAgB9D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GAAG,IAAI,CAqBP"}