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.
- package/dist/client.d.ts +76 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +208 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +70 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +110 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +63 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +43 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/report.d.ts +3 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +65 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +50 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +61 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/upload.d.ts +3 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +70 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +65 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/pack.d.ts +2 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +31 -0
- package/dist/pack.js.map +1 -0
- package/dist/progress.d.ts +9 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +63 -0
- package/dist/progress.js.map +1 -0
- package/dist/prompts.d.ts +28 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +141 -0
- package/dist/prompts.js.map +1 -0
- package/dist/repl.d.ts +2 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +209 -0
- package/dist/repl.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,uBAAuB,EAAE,yCAAyC,CAAC;SAC1E,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,IAAI,EAAE,EAAE;QAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;gBACxC,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,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,KAAK;gBACR,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7B,SAAS,EAAE,EAAE;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,cAAc,CAAC,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CACxC,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,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,MAAM,CAAC,KAAK,GAAG,WAAW,GAAG,EAAE,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CACT,YAAY,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAC7E,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"}
|
|
@@ -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 @@
|
|
|
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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/pack.js.map
ADDED
|
@@ -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"}
|