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,76 @@
1
+ export interface LoginResult {
2
+ token: string;
3
+ username: string;
4
+ }
5
+ export interface UploadResult {
6
+ task_id: string;
7
+ skill_id: string;
8
+ sha256: string;
9
+ duplicate: boolean;
10
+ existing_audit_id?: string;
11
+ }
12
+ export interface StatusResult {
13
+ status: "PENDING" | "RUNNING" | "DONE" | "FAILED";
14
+ phase: string | null;
15
+ message: string | null;
16
+ scorecard_status: "approved" | "conditional" | "rejected" | null;
17
+ }
18
+ export interface SkillListItem {
19
+ id: string;
20
+ skill_id: string;
21
+ skill_name: string;
22
+ skill_description?: string;
23
+ scorecard_status: string | null;
24
+ status: string;
25
+ output_risk_tags: string[];
26
+ input_sensitivity_tags: string[];
27
+ source_type: string;
28
+ source_url?: string;
29
+ created_at: string;
30
+ completed_at?: string;
31
+ analysis_time_ms?: number;
32
+ uploaded_by?: string;
33
+ }
34
+ export interface SkillListResult {
35
+ total: number;
36
+ page: number;
37
+ page_size: number;
38
+ items: SkillListItem[];
39
+ }
40
+ export interface ListParams {
41
+ q?: string;
42
+ status?: string;
43
+ output_tag?: string[];
44
+ input_tag?: string[];
45
+ uploaded_by?: string;
46
+ page?: number;
47
+ page_size?: number;
48
+ }
49
+ export interface WsProgressEvent {
50
+ type: "progress" | "done" | "error" | "ping";
51
+ phase?: string;
52
+ percent?: number;
53
+ message?: string;
54
+ scorecard_status?: string;
55
+ }
56
+ export declare class HolosHubClient {
57
+ private server;
58
+ private token;
59
+ constructor(server: string, token: string);
60
+ private get headers();
61
+ private request;
62
+ login(username: string, password: string): Promise<LoginResult>;
63
+ uploadZip(zipPath: string, mode?: string): Promise<UploadResult>;
64
+ uploadFolder(dirPath: string, mode?: string): Promise<UploadResult>;
65
+ uploadGithub(githubUrl: string, mode?: string): Promise<UploadResult>;
66
+ getStatus(auditId: string): Promise<StatusResult>;
67
+ getSkill(auditId: string): Promise<SkillListItem & {
68
+ scorecard_status: string | null;
69
+ }>;
70
+ listSkills(params?: ListParams): Promise<SkillListResult>;
71
+ downloadReport(auditId: string, fmt: "json" | "md", outPath: string): Promise<void>;
72
+ downloadSkillZip(auditId: string, outPath: string): Promise<void>;
73
+ watchProgress(taskId: string, onEvent: (event: WsProgressEvent) => void): Promise<void>;
74
+ private _walkDir;
75
+ }
76
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKzC,OAAO,KAAK,OAAO,GAKlB;YAEa,OAAO;IA4Cf,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkB/D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBpE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA0BvE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAMzE,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIjD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG;QAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAIvF,UAAU,CAAC,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAa7D,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAcV,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavE,aAAa,CACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GACxC,OAAO,CAAC,IAAI,CAAC;IA8BhB,OAAO,CAAC,QAAQ;CAcjB"}
package/dist/client.js ADDED
@@ -0,0 +1,208 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import WebSocket from "ws";
4
+ export class HolosHubClient {
5
+ server;
6
+ token;
7
+ constructor(server, token) {
8
+ this.server = server.replace(/\/$/, "");
9
+ this.token = token;
10
+ }
11
+ get headers() {
12
+ return {
13
+ Authorization: `Bearer ${this.token}`,
14
+ "Content-Type": "application/json",
15
+ };
16
+ }
17
+ async request(method, path, options = {}) {
18
+ const url = `${this.server}${path}`;
19
+ const headers = {
20
+ Authorization: `Bearer ${this.token}`,
21
+ };
22
+ if (options.body) {
23
+ headers["Content-Type"] = "application/json";
24
+ }
25
+ const res = await fetch(url, {
26
+ method,
27
+ headers,
28
+ body: options.body ?? undefined,
29
+ });
30
+ if (!res.ok) {
31
+ let detail = "";
32
+ try {
33
+ const text = await res.text();
34
+ try {
35
+ const err = JSON.parse(text);
36
+ detail = err.detail || text;
37
+ }
38
+ catch {
39
+ detail = text;
40
+ }
41
+ }
42
+ catch {
43
+ detail = res.statusText;
44
+ }
45
+ throw new Error(`HTTP ${res.status}: ${detail || res.statusText}`);
46
+ }
47
+ if (options.stream) {
48
+ return res;
49
+ }
50
+ return res.json();
51
+ }
52
+ async login(username, password) {
53
+ const url = `${this.server}/api/auth/login`;
54
+ const res = await fetch(url, {
55
+ method: "POST",
56
+ headers: { "Content-Type": "application/json" },
57
+ body: JSON.stringify({ username, password }),
58
+ });
59
+ if (!res.ok) {
60
+ let detail = "";
61
+ try {
62
+ const err = await res.json();
63
+ detail = err.detail || "";
64
+ }
65
+ catch { }
66
+ throw new Error(`登录失败 HTTP ${res.status}: ${detail || res.statusText}`);
67
+ }
68
+ return res.json();
69
+ }
70
+ async uploadZip(zipPath, mode = "standard") {
71
+ const form = new FormData();
72
+ const content = fs.readFileSync(zipPath);
73
+ form.append("file", new Blob([content]), path.basename(zipPath));
74
+ form.append("mode", mode);
75
+ const url = `${this.server}/api/upload/zip`;
76
+ const res = await fetch(url, {
77
+ method: "POST",
78
+ headers: { Authorization: `Bearer ${this.token}` },
79
+ body: form,
80
+ });
81
+ if (!res.ok) {
82
+ const err = await res.json().catch(() => ({}));
83
+ throw new Error(`上传失败 HTTP ${res.status}: ${err.detail || res.statusText}`);
84
+ }
85
+ return res.json();
86
+ }
87
+ async uploadFolder(dirPath, mode = "standard") {
88
+ const form = new FormData();
89
+ form.append("mode", mode);
90
+ const absDir = path.resolve(dirPath);
91
+ const allFiles = this._walkDir(absDir);
92
+ for (const file of allFiles) {
93
+ const relPath = path.relative(absDir, file).split(path.sep).join("/");
94
+ const content = fs.readFileSync(file);
95
+ form.append("files", new Blob([content]), path.basename(file));
96
+ form.append("paths", relPath);
97
+ }
98
+ const url = `${this.server}/api/upload/folder`;
99
+ const res = await fetch(url, {
100
+ method: "POST",
101
+ headers: { Authorization: `Bearer ${this.token}` },
102
+ body: form,
103
+ });
104
+ if (!res.ok) {
105
+ const err = await res.json().catch(() => ({}));
106
+ throw new Error(`上传失败 HTTP ${res.status}: ${err.detail || res.statusText}`);
107
+ }
108
+ return res.json();
109
+ }
110
+ async uploadGithub(githubUrl, mode = "standard") {
111
+ return this.request("POST", "/api/upload/github", {
112
+ body: JSON.stringify({ github_url: githubUrl, mode }),
113
+ });
114
+ }
115
+ async getStatus(auditId) {
116
+ return this.request("GET", `/api/skills/${auditId}/status`);
117
+ }
118
+ async getSkill(auditId) {
119
+ return this.request("GET", `/api/skills/${auditId}`);
120
+ }
121
+ async listSkills(params = {}) {
122
+ const qs = new URLSearchParams();
123
+ if (params.q)
124
+ qs.set("q", params.q);
125
+ if (params.status)
126
+ qs.set("status", params.status);
127
+ if (params.output_tag)
128
+ params.output_tag.forEach((t) => qs.append("output_tag", t));
129
+ if (params.input_tag)
130
+ params.input_tag.forEach((t) => qs.append("input_tag", t));
131
+ if (params.uploaded_by)
132
+ qs.set("uploaded_by", params.uploaded_by);
133
+ if (params.page)
134
+ qs.set("page", String(params.page));
135
+ if (params.page_size)
136
+ qs.set("page_size", String(params.page_size));
137
+ return this.request("GET", `/api/skills/?${qs.toString()}`);
138
+ }
139
+ async downloadReport(auditId, fmt, outPath) {
140
+ const endpoint = fmt === "json" ? "json" : "markdown";
141
+ const url = `${this.server}/api/reports/${auditId}/${endpoint}`;
142
+ const res = await fetch(url, {
143
+ headers: { Authorization: `Bearer ${this.token}` },
144
+ });
145
+ if (!res.ok) {
146
+ const err = await res.json().catch(() => ({}));
147
+ throw new Error(`下载报告失败 HTTP ${res.status}: ${err.detail || res.statusText}`);
148
+ }
149
+ const buffer = await res.arrayBuffer();
150
+ fs.writeFileSync(outPath, Buffer.from(buffer));
151
+ }
152
+ async downloadSkillZip(auditId, outPath) {
153
+ const url = `${this.server}/api/reports/${auditId}/zip`;
154
+ const res = await fetch(url, {
155
+ headers: { Authorization: `Bearer ${this.token}` },
156
+ });
157
+ if (!res.ok) {
158
+ const err = await res.json().catch(() => ({}));
159
+ throw new Error(`下载 Skill zip 失败 HTTP ${res.status}: ${err.detail || res.statusText}`);
160
+ }
161
+ const buffer = await res.arrayBuffer();
162
+ fs.writeFileSync(outPath, Buffer.from(buffer));
163
+ }
164
+ watchProgress(taskId, onEvent) {
165
+ return new Promise((resolve, reject) => {
166
+ const wsUrl = this.server.replace(/^http/, "ws") + `/ws/audit/${taskId}`;
167
+ const ws = new WebSocket(wsUrl, {
168
+ headers: { Authorization: `Bearer ${this.token}` },
169
+ });
170
+ ws.on("message", (data) => {
171
+ try {
172
+ const event = JSON.parse(data.toString());
173
+ onEvent(event);
174
+ if (event.type === "done" || event.type === "error") {
175
+ ws.close();
176
+ resolve();
177
+ }
178
+ }
179
+ catch {
180
+ // ignore parse errors
181
+ }
182
+ });
183
+ ws.on("error", (err) => {
184
+ reject(err);
185
+ });
186
+ ws.on("close", () => {
187
+ resolve();
188
+ });
189
+ });
190
+ }
191
+ _walkDir(dir) {
192
+ const results = [];
193
+ const skip = new Set(["__pycache__", ".git", "node_modules", ".DS_Store"]);
194
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
195
+ if (skip.has(entry.name))
196
+ continue;
197
+ const full = path.join(dir, entry.name);
198
+ if (entry.isDirectory()) {
199
+ results.push(...this._walkDir(full));
200
+ }
201
+ else {
202
+ results.push(full);
203
+ }
204
+ }
205
+ return results;
206
+ }
207
+ }
208
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerAudit(program: Command): void;
3
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8DpD"}
@@ -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 registerAudit(program) {
9
+ program
10
+ .command("audit [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=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerInstall(program: Command): void;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +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,CA6GtD"}
@@ -0,0 +1,110 @@
1
+ import chalk from "chalk";
2
+ import * as path from "path";
3
+ import * as fs from "fs";
4
+ import AdmZip from "adm-zip";
5
+ import { HolosHubClient } from "../client.js";
6
+ import { requireAuth, getConfig } from "../config.js";
7
+ import { promptText, promptConfirm, cmd, resolveAuditId } from "../prompts.js";
8
+ export function registerInstall(program) {
9
+ program
10
+ .command("install [audit-id-or-name]")
11
+ .description("安装经过安全审计的 skill(仅限 approved 或 conditional)")
12
+ .option("-d, --dest <dir>", "安装目录(默认:~/.holoshub/skills)")
13
+ .option("-y, --yes", "对 conditional skill 自动确认安装")
14
+ .action(async (auditId, opts) => {
15
+ if (!auditId) {
16
+ auditId = await promptText(chalk.cyan("? ") + "审计任务 ID 或 Skill 名称:");
17
+ if (!auditId) {
18
+ console.error(chalk.red("❌ 必须提供审计任务 ID 或 Skill 名称"));
19
+ process.exit(1);
20
+ }
21
+ }
22
+ const { server, token } = await requireAuth();
23
+ const cfg = getConfig();
24
+ const client = new HolosHubClient(server, token);
25
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
26
+ const resolvedByName = !UUID_RE.test(auditId);
27
+ try {
28
+ auditId = await resolveAuditId(client, auditId);
29
+ }
30
+ catch (err) {
31
+ console.error(chalk.red(`❌ ${err.message}`));
32
+ process.exit(1);
33
+ }
34
+ // 按名称解析时需用户确认,防止误装同名 skill
35
+ if (resolvedByName) {
36
+ const confirmed = await promptConfirm("确认安装这个 skill?", true);
37
+ if (!confirmed) {
38
+ console.log(chalk.gray("已取消安装。"));
39
+ process.exit(0);
40
+ }
41
+ }
42
+ // 检查状态
43
+ let skillName = auditId;
44
+ try {
45
+ const status = await client.getStatus(auditId);
46
+ if (status.status !== "DONE") {
47
+ console.error(chalk.yellow(`⚠️ 审计尚未完成(${status.status}),无法安装`));
48
+ process.exit(1);
49
+ }
50
+ if (status.scorecard_status === "rejected") {
51
+ console.error(chalk.red("❌ 此 skill 审计结果为 REJECTED,拒绝安装。"));
52
+ console.error(chalk.dim(" 运行以下命令查看详细报告:"));
53
+ console.error(chalk.cyan(` ${cmd(`report ${auditId}`)}`));
54
+ process.exit(1);
55
+ }
56
+ if (status.scorecard_status === "conditional") {
57
+ console.warn(chalk.yellow("⚠️ 此 skill 审计结果为 CONDITIONAL(存在条件性风险)。"));
58
+ if (!opts.yes) {
59
+ const confirmed = await promptConfirm(chalk.yellow("确认继续安装?(运行 report 可查看详情)"), false);
60
+ if (!confirmed) {
61
+ console.log(chalk.gray("已取消安装。"));
62
+ process.exit(0);
63
+ }
64
+ }
65
+ }
66
+ // 获取 skill 详情以拿到名称
67
+ try {
68
+ const detail = await client.getSkill(auditId);
69
+ skillName = detail.skill_name || auditId;
70
+ }
71
+ catch {
72
+ // 使用 auditId 作为 fallback
73
+ }
74
+ }
75
+ catch (err) {
76
+ console.error(chalk.red(`❌ ${err.message}`));
77
+ process.exit(1);
78
+ }
79
+ // 确定安装目录
80
+ const baseDir = opts.dest || cfg.installDir;
81
+ const installDir = path.join(baseDir, skillName);
82
+ fs.mkdirSync(installDir, { recursive: true });
83
+ // 下载 zip 到临时文件
84
+ const tmpZip = path.join(installDir, "__download.zip");
85
+ try {
86
+ console.log(chalk.cyan(`⬇️ 下载 skill:${skillName}`));
87
+ await client.downloadSkillZip(auditId, tmpZip);
88
+ // 解压(防 Zip Slip:校验每个条目路径不超出 installDir)
89
+ const zip = new AdmZip(tmpZip);
90
+ const canonicalBase = path.resolve(installDir) + path.sep;
91
+ for (const entry of zip.getEntries()) {
92
+ const entryPath = path.resolve(installDir, entry.entryName);
93
+ if (!entryPath.startsWith(canonicalBase)) {
94
+ throw new Error(`不安全的 zip 条目路径:${entry.entryName}`);
95
+ }
96
+ }
97
+ zip.extractAllTo(installDir, true);
98
+ fs.unlinkSync(tmpZip);
99
+ console.log(chalk.green(`✅ 已安装到:${installDir}`));
100
+ }
101
+ catch (err) {
102
+ // 清理临时文件
103
+ if (fs.existsSync(tmpZip))
104
+ fs.unlinkSync(tmpZip);
105
+ console.error(chalk.red(`❌ 安装失败:${err.message}`));
106
+ process.exit(1);
107
+ }
108
+ });
109
+ }
110
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ import { SkillListItem } from "../client.js";
3
+ export declare function formatSkillRow(item: SkillListItem): void;
4
+ export declare function registerList(program: Command): void;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +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,CAexD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiDnD"}
@@ -0,0 +1,63 @@
1
+ import chalk from "chalk";
2
+ import { HolosHubClient } from "../client.js";
3
+ import { requireAuth } from "../config.js";
4
+ import { cmd } from "../prompts.js";
5
+ const SCORECARD_COLORS = {
6
+ approved: chalk.green,
7
+ conditional: chalk.yellow,
8
+ rejected: chalk.red,
9
+ };
10
+ export function formatSkillRow(item) {
11
+ const sc = item.scorecard_status || "—";
12
+ const colorFn = SCORECARD_COLORS[sc] || chalk.gray;
13
+ const tags = [...item.output_risk_tags, ...item.input_sensitivity_tags].join(", ") || "—";
14
+ console.log(` ${chalk.bold(item.skill_name.padEnd(30))} ` +
15
+ `${colorFn(sc)}`);
16
+ if (item.skill_description) {
17
+ console.log(` ${chalk.dim(item.skill_description.slice(0, 80))}`);
18
+ }
19
+ if (tags !== "—") {
20
+ console.log(` ${chalk.dim("tags: " + tags)}`);
21
+ }
22
+ }
23
+ export function registerList(program) {
24
+ program
25
+ .command("list")
26
+ .description("列出已审计的 skills")
27
+ .option("-s, --status <status>", "按状态过滤:approved | conditional | rejected | RUNNING | PENDING | FAILED")
28
+ .option("-q, --query <query>", "关键字搜索(支持语义搜索)")
29
+ .option("--page <n>", "页码(从 1 开始)", "1")
30
+ .option("--page-size <n>", "每页条数(1-100)", "20")
31
+ .option("--by <username>", "按上传者过滤")
32
+ .action(async (opts) => {
33
+ const { server, token } = await requireAuth();
34
+ const client = new HolosHubClient(server, token);
35
+ try {
36
+ const result = await client.listSkills({
37
+ q: opts.query,
38
+ status: opts.status,
39
+ uploaded_by: opts.by,
40
+ page: parseInt(opts.page, 10),
41
+ page_size: parseInt(opts.pageSize, 10),
42
+ });
43
+ if (result.items.length === 0) {
44
+ console.log(chalk.gray(" 没有找到符合条件的 skill。"));
45
+ return;
46
+ }
47
+ console.log(`\n ${chalk.bold("名称".padEnd(30))} 安全评级`);
48
+ console.log(" " + "─".repeat(44));
49
+ for (const item of result.items) {
50
+ formatSkillRow(item);
51
+ }
52
+ console.log(`\n 共 ${result.total} 条,当前第 ${result.page}/${Math.ceil(result.total / result.page_size)} 页`);
53
+ if (result.page < Math.ceil(result.total / result.page_size)) {
54
+ console.log(` 下一页:${chalk.cyan(cmd(`list --page ${result.page + 1}`))}`);
55
+ }
56
+ }
57
+ catch (err) {
58
+ console.error(chalk.red(`❌ ${err.message}`));
59
+ process.exit(1);
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLogin(program: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +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,CAqCpD"}