@nodeskai/genehub 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/index.js ADDED
@@ -0,0 +1,438 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import { Command as Command9 } from "commander";
5
+
6
+ // src/commands/config.ts
7
+ import { Command } from "commander";
8
+
9
+ // src/config.ts
10
+ import { mkdir, readFile, writeFile } from "fs/promises";
11
+ import { homedir } from "os";
12
+ import { join } from "path";
13
+ var CONFIG_DIR = join(homedir(), ".genehub");
14
+ var CONFIG_PATH = join(CONFIG_DIR, "config.json");
15
+ var DEFAULT_CONFIG = {
16
+ registryUrl: "https://genehub.nodeskai.com"
17
+ };
18
+ async function loadConfig() {
19
+ try {
20
+ const raw = await readFile(CONFIG_PATH, "utf-8");
21
+ return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
22
+ } catch {
23
+ return DEFAULT_CONFIG;
24
+ }
25
+ }
26
+ async function saveConfig(config) {
27
+ const current = await loadConfig();
28
+ const merged = { ...current, ...config };
29
+ await mkdir(CONFIG_DIR, { recursive: true });
30
+ await writeFile(CONFIG_PATH, JSON.stringify(merged, null, 2), "utf-8");
31
+ }
32
+
33
+ // src/output.ts
34
+ import chalk from "chalk";
35
+ import Table from "cli-table3";
36
+ function info(msg) {
37
+ console.log(chalk.blue("i"), msg);
38
+ }
39
+ function ok(msg) {
40
+ console.log(chalk.green("+"), msg);
41
+ }
42
+ function warn(msg) {
43
+ console.log(chalk.yellow("!"), msg);
44
+ }
45
+ function fail(msg) {
46
+ console.error(chalk.red("x"), msg);
47
+ }
48
+ function table(headers, rows) {
49
+ const t = new Table({
50
+ head: headers.map((h) => chalk.cyan(h)),
51
+ style: { head: [], border: [] }
52
+ });
53
+ for (const row of rows) {
54
+ t.push(row);
55
+ }
56
+ console.log(t.toString());
57
+ }
58
+
59
+ // src/commands/config.ts
60
+ var configCommand = new Command("config").description("\u7BA1\u7406 GeneHub CLI \u914D\u7F6E");
61
+ configCommand.command("set <key> <value>").description("\u8BBE\u7F6E\u914D\u7F6E\u9879\uFF08registry / token\uFF09").action(async (key, value) => {
62
+ const validKeys = ["registry", "token"];
63
+ if (!validKeys.includes(key)) {
64
+ fail(`\u65E0\u6548\u7684\u914D\u7F6E\u9879: ${key}\uFF0C\u53EF\u9009: ${validKeys.join(", ")}`);
65
+ return;
66
+ }
67
+ if (key === "registry") {
68
+ await saveConfig({ registryUrl: value });
69
+ } else if (key === "token") {
70
+ await saveConfig({ token: value });
71
+ }
72
+ ok(`${key} = ${key === "token" ? `${value.slice(0, 8)}***` : value}`);
73
+ });
74
+ configCommand.command("get [key]").description("\u67E5\u770B\u914D\u7F6E").action(async (key) => {
75
+ const config = await loadConfig();
76
+ if (key) {
77
+ const map = {
78
+ registry: config.registryUrl,
79
+ token: config.token ? `${config.token.slice(0, 8)}***` : void 0
80
+ };
81
+ info(`${key} = ${map[key] ?? "(\u672A\u8BBE\u7F6E)"}`);
82
+ } else {
83
+ info(`registry = ${config.registryUrl}`);
84
+ info(`token = ${config.token ? `${config.token.slice(0, 8)}***` : "(\u672A\u8BBE\u7F6E)"}`);
85
+ }
86
+ });
87
+
88
+ // src/commands/init.ts
89
+ import { mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
90
+ import { join as join2, resolve } from "path";
91
+ import { Command as Command2 } from "commander";
92
+ import { stringify } from "yaml";
93
+ var TEMPLATE = {
94
+ slug: "my-gene",
95
+ name: "\u6211\u7684\u57FA\u56E0",
96
+ version: "1.0.0",
97
+ description: "\u57FA\u56E0\u529F\u80FD\u63CF\u8FF0",
98
+ short_description: "\u4E00\u53E5\u8BDD\u63CF\u8FF0",
99
+ category: "development",
100
+ tags: ["ability"],
101
+ author: { type: "human", name: "" },
102
+ compatibility: [
103
+ { product: "openclaw", min_version: "0.5.0" },
104
+ { product: "nanobot", min_version: "0.1.0" }
105
+ ],
106
+ dependencies: [],
107
+ synergies: [],
108
+ skill: {
109
+ name: "my-gene",
110
+ always: false,
111
+ file: "SKILL.md"
112
+ },
113
+ rules: [],
114
+ config: {},
115
+ mcp_servers: [],
116
+ learning: {
117
+ force_deep_learn: false,
118
+ objectives: [],
119
+ scenarios: []
120
+ }
121
+ };
122
+ var SKILL_TEMPLATE = `---
123
+ name: my-gene
124
+ description: \u4E00\u53E5\u8BDD\u63CF\u8FF0
125
+ metadata:
126
+ openclaw:
127
+ always: false
128
+ nanobot:
129
+ always: false
130
+ ---
131
+
132
+ \u5728\u6B64\u7F16\u5199\u57FA\u56E0\u7684\u6280\u80FD\u63CF\u8FF0...
133
+ `;
134
+ var initCommand = new Command2("init").description("\u521D\u59CB\u5316\u57FA\u56E0\u6A21\u677F").argument("[path]", "\u76EE\u6807\u76EE\u5F55", ".").action(async (dirPath) => {
135
+ const absPath = resolve(dirPath);
136
+ try {
137
+ await mkdir2(absPath, { recursive: true });
138
+ const yamlPath = join2(absPath, "gene.yaml");
139
+ await writeFile2(yamlPath, stringify(TEMPLATE), "utf-8");
140
+ const skillPath = join2(absPath, "SKILL.md");
141
+ await writeFile2(skillPath, SKILL_TEMPLATE, "utf-8");
142
+ ok(`\u57FA\u56E0\u6A21\u677F\u5DF2\u521B\u5EFA:`);
143
+ info(` ${yamlPath}`);
144
+ info(` ${skillPath}`);
145
+ info("\u7F16\u8F91\u8FD9\u4E24\u4E2A\u6587\u4EF6\u540E\uFF0C\u4F7F\u7528 genehub publish \u53D1\u5E03");
146
+ } catch (err) {
147
+ fail(err instanceof Error ? err.message : String(err));
148
+ process.exit(1);
149
+ }
150
+ });
151
+
152
+ // src/commands/install.ts
153
+ import { homedir as homedir2 } from "os";
154
+ import { join as join3 } from "path";
155
+ import { detectAdapter, GeneHubClient, getAdapter, LearningEngine } from "@nodeskai/genehub-sdk";
156
+ import { Command as Command3 } from "commander";
157
+ import ora from "ora";
158
+ function parseSlugVersion(input) {
159
+ const atIdx = input.lastIndexOf("@");
160
+ if (atIdx > 0) {
161
+ return { slug: input.slice(0, atIdx), version: input.slice(atIdx + 1) };
162
+ }
163
+ return { slug: input };
164
+ }
165
+ var installCommand = new Command3("install").description("\u5B89\u88C5\u57FA\u56E0\u5230\u5F53\u524D Agent \u73AF\u5883").argument("<slug>", "\u57FA\u56E0\u6807\u8BC6\u7B26\uFF08\u652F\u6301 slug@version \u683C\u5F0F\uFF09").option("-p, --product <product>", "\u6307\u5B9A\u76EE\u6807\u4EA7\u54C1\uFF08openclaw / nanobot / generic\uFF09").option("-f, --force", "\u5F3A\u5236\u8986\u76D6\u5DF2\u5B89\u88C5\u7248\u672C", false).option("--target <path>", "\u6307\u5B9A\u5B89\u88C5\u76EE\u6807\u8DEF\u5F84").option("--learn", "\u5B89\u88C5\u540E\u81EA\u52A8\u89E6\u53D1\u6DF1\u5EA6\u5B66\u4E60", false).action(async (rawSlug, opts) => {
166
+ const config = await loadConfig();
167
+ const client = new GeneHubClient({ registryUrl: config.registryUrl, token: config.token });
168
+ const { slug, version } = parseSlugVersion(rawSlug);
169
+ const spinner = ora(`\u83B7\u53D6\u57FA\u56E0 ${slug}${version ? `@${version}` : ""} \u7684 manifest...`).start();
170
+ try {
171
+ const manifest = await client.getManifest(slug, version);
172
+ spinner.succeed(`\u83B7\u53D6 ${manifest.name} v${manifest.version}`);
173
+ const adapter = opts.product ? getAdapter(opts.product) : await detectAdapter();
174
+ info(`\u76EE\u6807\u4EA7\u54C1: ${adapter.product}`);
175
+ if (!opts.force && await adapter.isInstalled(slug)) {
176
+ const installedVer = await adapter.getInstalledVersion(slug);
177
+ warn(`${slug}${installedVer ? ` v${installedVer}` : ""} \u5DF2\u5B89\u88C5\uFF0C\u4F7F\u7528 --force \u8986\u76D6`);
178
+ return;
179
+ }
180
+ const installSpinner = ora("\u5B89\u88C5\u4E2D...").start();
181
+ const result = await adapter.install(manifest, {
182
+ force: opts.force,
183
+ targetPath: opts.target
184
+ });
185
+ installSpinner.succeed("\u5B89\u88C5\u5B8C\u6210");
186
+ ok(`${result.slug}@${result.version} \u5B89\u88C5\u6210\u529F`);
187
+ info(`\u6587\u4EF6: ${result.files.join(", ")}`);
188
+ if (result.needsRestart) {
189
+ warn("\u9700\u8981\u91CD\u542F Agent Host \u4F7F\u57FA\u56E0\u751F\u6548");
190
+ }
191
+ if (result.dependencies.length > 0) {
192
+ info(`\u4F9D\u8D56\u57FA\u56E0: ${result.dependencies.join(", ")}`);
193
+ }
194
+ try {
195
+ await client.reportInstall(slug);
196
+ } catch {
197
+ }
198
+ if (opts.learn) {
199
+ const workspaceDir = adapter.product === "openclaw" ? join3(homedir2(), ".openclaw", "workspace") : adapter.product === "nanobot" ? join3(homedir2(), ".nanobot", "workspace") : join3(process.cwd(), ".genehub");
200
+ const engine = new LearningEngine({ workspaceDir, adapter });
201
+ const learnSpinner = ora("\u751F\u6210\u5B66\u4E60\u4EFB\u52A1...").start();
202
+ await engine.createLearningTask(manifest);
203
+ learnSpinner.succeed("\u5B66\u4E60\u4EFB\u52A1\u5DF2\u521B\u5EFA\uFF0CAgent \u5C06\u5728\u4E0B\u6B21\u5BF9\u8BDD\u4E2D\u5904\u7406");
204
+ }
205
+ } catch (err) {
206
+ spinner.fail("\u5B89\u88C5\u5931\u8D25");
207
+ fail(err instanceof Error ? err.message : String(err));
208
+ process.exit(1);
209
+ }
210
+ });
211
+
212
+ // src/commands/learn.ts
213
+ import { homedir as homedir3 } from "os";
214
+ import { join as join4 } from "path";
215
+ import { detectAdapter as detectAdapter2, GeneHubClient as GeneHubClient2, getAdapter as getAdapter2, LearningEngine as LearningEngine2 } from "@nodeskai/genehub-sdk";
216
+ import { Command as Command4 } from "commander";
217
+ import ora2 from "ora";
218
+ function getWorkspaceDir(product) {
219
+ switch (product) {
220
+ case "openclaw":
221
+ return join4(homedir3(), ".openclaw", "workspace");
222
+ case "nanobot":
223
+ return join4(homedir3(), ".nanobot", "workspace");
224
+ default:
225
+ return join4(process.cwd(), ".genehub");
226
+ }
227
+ }
228
+ var learnCommand = new Command4("learn").description("\u89E6\u53D1\u57FA\u56E0\u6DF1\u5EA6\u5B66\u4E60\uFF08L2\uFF09").argument("<slug>", "\u57FA\u56E0\u6807\u8BC6\u7B26").option("-p, --product <product>", "\u6307\u5B9A\u76EE\u6807\u4EA7\u54C1").option("--check", "\u68C0\u67E5\u5B66\u4E60\u7ED3\u679C\u5E76\u5E94\u7528").action(async (slug, opts) => {
229
+ const config = await loadConfig();
230
+ const client = new GeneHubClient2({ registryUrl: config.registryUrl, token: config.token });
231
+ const adapter = opts.product ? getAdapter2(opts.product) : await detectAdapter2();
232
+ const workspaceDir = getWorkspaceDir(adapter.product);
233
+ const engine = new LearningEngine2({ workspaceDir, adapter });
234
+ if (opts.check) {
235
+ const spinner2 = ora2("\u68C0\u67E5\u5B66\u4E60\u7ED3\u679C...").start();
236
+ const result = await engine.checkResult(slug);
237
+ if (!result) {
238
+ spinner2.fail("\u672A\u627E\u5230\u5B66\u4E60\u7ED3\u679C");
239
+ info("Agent \u8FD8\u672A\u5B8C\u6210\u8BE5\u57FA\u56E0\u7684\u5B66\u4E60\u4EFB\u52A1");
240
+ const pending = await engine.listPendingTasks();
241
+ if (pending.length > 0) {
242
+ info(`\u5F85\u5B8C\u6210\u7684\u5B66\u4E60\u4EFB\u52A1: ${pending.join(", ")}`);
243
+ }
244
+ return;
245
+ }
246
+ spinner2.succeed(`\u5B66\u4E60\u7ED3\u679C: ${result.decision}`);
247
+ if (result.self_eval !== void 0) {
248
+ info(`\u81EA\u8BC4\u5206: ${result.self_eval}`);
249
+ }
250
+ if (result.reason) {
251
+ info(`\u7406\u7531: ${result.reason}`);
252
+ }
253
+ if (result.decision === "learned" && result.content) {
254
+ const skillsDir = join4(workspaceDir, "skills");
255
+ const applied = await engine.applyResult(slug, skillsDir);
256
+ if (applied) {
257
+ ok("\u5DF2\u5C06\u4E2A\u6027\u5316\u7248\u672C\u5E94\u7528\u5230\u6280\u80FD\u76EE\u5F55");
258
+ }
259
+ }
260
+ return;
261
+ }
262
+ const spinner = ora2(`\u83B7\u53D6 ${slug} \u7684 manifest...`).start();
263
+ try {
264
+ const manifest = await client.getManifest(slug);
265
+ spinner.succeed(`\u83B7\u53D6 ${manifest.name} v${manifest.version}`);
266
+ if (!manifest.learning?.objectives?.length && !manifest.learning?.scenarios?.length) {
267
+ warn("\u8BE5\u57FA\u56E0\u6CA1\u6709\u5B9A\u4E49\u5B66\u4E60\u76EE\u6807\u6216\u7EC3\u4E60\u573A\u666F\uFF0C\u5C06\u521B\u5EFA\u57FA\u7840\u5B66\u4E60\u4EFB\u52A1");
268
+ }
269
+ const learnSpinner = ora2("\u751F\u6210\u5B66\u4E60\u4EFB\u52A1...").start();
270
+ const task = await engine.createLearningTask(manifest);
271
+ learnSpinner.succeed("\u5B66\u4E60\u4EFB\u52A1\u5DF2\u521B\u5EFA");
272
+ ok(`\u4EFB\u52A1\u6587\u4EF6: ${join4(workspaceDir, "learning-tasks", `${slug}.md`)}`);
273
+ info(`\u7ED3\u679C\u8DEF\u5F84: ${task.callback_path}`);
274
+ info("");
275
+ info("\u4E0B\u4E00\u6B65\uFF1A");
276
+ info(" 1. Agent \u5728\u4E0B\u6B21\u5BF9\u8BDD\u4E2D\u4F1A\u81EA\u52A8\u53D1\u73B0\u5E76\u5904\u7406\u5B66\u4E60\u4EFB\u52A1");
277
+ info(` 2. \u5B66\u4E60\u5B8C\u6210\u540E\u8FD0\u884C: genehub learn --check ${slug}`);
278
+ } catch (err) {
279
+ spinner.fail("\u5B66\u4E60\u4EFB\u52A1\u521B\u5EFA\u5931\u8D25");
280
+ fail(err instanceof Error ? err.message : String(err));
281
+ process.exit(1);
282
+ }
283
+ });
284
+
285
+ // src/commands/list.ts
286
+ import { detectAdapter as detectAdapter3, getAdapter as getAdapter3 } from "@nodeskai/genehub-sdk";
287
+ import { Command as Command5 } from "commander";
288
+ var listCommand = new Command5("list").description("\u5217\u51FA\u5F53\u524D\u73AF\u5883\u5DF2\u5B89\u88C5\u7684\u57FA\u56E0").option("-p, --product <product>", "\u6307\u5B9A\u76EE\u6807\u4EA7\u54C1").option("--json", "JSON \u683C\u5F0F\u8F93\u51FA", false).action(async (opts) => {
289
+ try {
290
+ const adapter = opts.product ? getAdapter3(opts.product) : await detectAdapter3();
291
+ const genes = await adapter.list();
292
+ if (opts.json) {
293
+ console.log(JSON.stringify(genes, null, 2));
294
+ return;
295
+ }
296
+ if (genes.length === 0) {
297
+ info(`[${adapter.product}] \u6CA1\u6709\u5DF2\u5B89\u88C5\u7684\u57FA\u56E0`);
298
+ return;
299
+ }
300
+ info(`[${adapter.product}] \u5DF2\u5B89\u88C5 ${genes.length} \u4E2A\u57FA\u56E0:
301
+ `);
302
+ for (const gene of genes) {
303
+ const date = new Date(gene.installedAt).toLocaleDateString("zh-CN");
304
+ console.log(` ${gene.slug.padEnd(24)} v${gene.version.padEnd(10)} ${date}`);
305
+ }
306
+ } catch (err) {
307
+ fail(err instanceof Error ? err.message : String(err));
308
+ process.exit(1);
309
+ }
310
+ });
311
+
312
+ // src/commands/publish.ts
313
+ import { readFile as readFile2 } from "fs/promises";
314
+ import { join as join5, resolve as resolve2 } from "path";
315
+ import { GeneHubClient as GeneHubClient3 } from "@nodeskai/genehub-sdk";
316
+ import { GeneManifestSchema } from "@nodeskai/genehub-types";
317
+ import { Command as Command6 } from "commander";
318
+ import ora3 from "ora";
319
+ import { parse } from "yaml";
320
+ var publishCommand = new Command6("publish").description("\u53D1\u5E03\u57FA\u56E0\u5230 GeneHub Registry").argument("<path>", "\u57FA\u56E0\u76EE\u5F55\u8DEF\u5F84\uFF08\u5305\u542B gene.yaml\uFF09").action(async (dirPath) => {
321
+ const config = await loadConfig();
322
+ if (!config.token) {
323
+ fail("\u672A\u914D\u7F6E\u8BA4\u8BC1 token\uFF0C\u8BF7\u5148\u8FD0\u884C genehub config --token <token>");
324
+ process.exit(1);
325
+ }
326
+ const client = new GeneHubClient3({ registryUrl: config.registryUrl, token: config.token });
327
+ const absPath = resolve2(dirPath);
328
+ try {
329
+ const yamlPath = join5(absPath, "gene.yaml");
330
+ const raw = await readFile2(yamlPath, "utf-8");
331
+ const parsed = parse(raw);
332
+ const skillMdPath = join5(absPath, "SKILL.md");
333
+ if (parsed.skill?.file && !parsed.skill.content) {
334
+ try {
335
+ parsed.skill.content = await readFile2(join5(absPath, parsed.skill.file), "utf-8");
336
+ } catch {
337
+ parsed.skill.content = await readFile2(skillMdPath, "utf-8");
338
+ }
339
+ }
340
+ const validation = GeneManifestSchema.safeParse(parsed);
341
+ if (!validation.success) {
342
+ fail("Manifest \u6821\u9A8C\u5931\u8D25:");
343
+ for (const issue of validation.error.issues) {
344
+ fail(` ${issue.path.join(".")}: ${issue.message}`);
345
+ }
346
+ process.exit(1);
347
+ }
348
+ const spinner = ora3(`\u53D1\u5E03 ${validation.data.slug}@${validation.data.version}...`).start();
349
+ const gene = await client.publishGene(validation.data);
350
+ spinner.succeed("\u53D1\u5E03\u6210\u529F");
351
+ ok(`${gene.slug}@${gene.version} \u5DF2\u53D1\u5E03\u5230 GeneHub Registry`);
352
+ } catch (err) {
353
+ fail(err instanceof Error ? err.message : String(err));
354
+ process.exit(1);
355
+ }
356
+ });
357
+
358
+ // src/commands/search.ts
359
+ import { GeneHubClient as GeneHubClient4 } from "@nodeskai/genehub-sdk";
360
+ import { Command as Command7 } from "commander";
361
+ var searchCommand = new Command7("search").description("\u641C\u7D22\u57FA\u56E0\u5E93").argument("[keyword]", "\u641C\u7D22\u5173\u952E\u8BCD").option("-c, --category <category>", "\u6309\u5206\u7C7B\u8FC7\u6EE4").option("-t, --tags <tags>", "\u6309\u6807\u7B7E\u8FC7\u6EE4\uFF08\u9017\u53F7\u5206\u9694\uFF09").option("--compat <product>", "\u6309\u517C\u5BB9\u4EA7\u54C1\u8FC7\u6EE4").option("-s, --sort <sort>", "\u6392\u5E8F\u65B9\u5F0F\uFF08newest / popular / rating\uFF09", "newest").option("--page <page>", "\u9875\u7801", "1").option("--json", "JSON \u683C\u5F0F\u8F93\u51FA", false).action(async (keyword, opts) => {
362
+ const config = await loadConfig();
363
+ const client = new GeneHubClient4({ registryUrl: config.registryUrl, token: config.token });
364
+ try {
365
+ const result = await client.searchGenes({
366
+ q: keyword,
367
+ category: opts.category,
368
+ tags: opts.tags?.split(","),
369
+ compatibility: opts.compat,
370
+ sort: opts.sort,
371
+ page: Number(opts.page)
372
+ });
373
+ if (opts.json) {
374
+ console.log(JSON.stringify(result, null, 2));
375
+ return;
376
+ }
377
+ if (result.items.length === 0) {
378
+ info("\u672A\u627E\u5230\u5339\u914D\u7684\u57FA\u56E0");
379
+ return;
380
+ }
381
+ table(
382
+ ["slug", "\u540D\u79F0", "\u7248\u672C", "\u5206\u7C7B", "\u517C\u5BB9", "\u5B89\u88C5\u6570"],
383
+ result.items.map((g) => [
384
+ g.slug,
385
+ g.name,
386
+ g.version,
387
+ g.category,
388
+ g.compatibility.join(", "),
389
+ String(g.install_count)
390
+ ])
391
+ );
392
+ info(`\u5171 ${result.total} \u6761\u7ED3\u679C\uFF0C\u7B2C ${result.page}/${result.total_pages} \u9875`);
393
+ } catch (err) {
394
+ fail(err instanceof Error ? err.message : String(err));
395
+ process.exit(1);
396
+ }
397
+ });
398
+
399
+ // src/commands/uninstall.ts
400
+ import { detectAdapter as detectAdapter4, getAdapter as getAdapter4 } from "@nodeskai/genehub-sdk";
401
+ import { Command as Command8 } from "commander";
402
+ import ora4 from "ora";
403
+ var uninstallCommand = new Command8("uninstall").description("\u4ECE\u5F53\u524D Agent \u73AF\u5883\u5378\u8F7D\u57FA\u56E0").argument("<slug>", "\u57FA\u56E0\u6807\u8BC6\u7B26").option("-p, --product <product>", "\u6307\u5B9A\u76EE\u6807\u4EA7\u54C1\uFF08openclaw / nanobot / generic\uFF09").action(async (slug, opts) => {
404
+ const adapter = opts.product ? getAdapter4(opts.product) : await detectAdapter4();
405
+ info(`\u76EE\u6807\u4EA7\u54C1: ${adapter.product}`);
406
+ if (!await adapter.isInstalled(slug)) {
407
+ warn(`${slug} \u672A\u5B89\u88C5`);
408
+ return;
409
+ }
410
+ const spinner = ora4("\u5378\u8F7D\u4E2D...").start();
411
+ try {
412
+ const result = await adapter.uninstall(slug);
413
+ spinner.succeed("\u5378\u8F7D\u5B8C\u6210");
414
+ ok(`${result.slug} \u5DF2\u5378\u8F7D`);
415
+ info(`\u6E05\u7406\u6587\u4EF6: ${result.files.join(", ")}`);
416
+ if (result.needsRestart) {
417
+ warn("\u9700\u8981\u91CD\u542F Agent Host \u4F7F\u53D8\u66F4\u751F\u6548");
418
+ }
419
+ } catch (err) {
420
+ spinner.fail("\u5378\u8F7D\u5931\u8D25");
421
+ fail(err instanceof Error ? err.message : String(err));
422
+ process.exit(1);
423
+ }
424
+ });
425
+
426
+ // src/index.ts
427
+ var program = new Command9();
428
+ program.name("genehub").description("GeneHub CLI - AI \u5458\u5DE5\u57FA\u56E0\u7BA1\u7406\u5DE5\u5177").version("0.1.0");
429
+ program.addCommand(installCommand);
430
+ program.addCommand(uninstallCommand);
431
+ program.addCommand(searchCommand);
432
+ program.addCommand(listCommand);
433
+ program.addCommand(publishCommand);
434
+ program.addCommand(initCommand);
435
+ program.addCommand(configCommand);
436
+ program.addCommand(learnCommand);
437
+ program.parse();
438
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/config.ts","../src/config.ts","../src/output.ts","../src/commands/init.ts","../src/commands/install.ts","../src/commands/learn.ts","../src/commands/list.ts","../src/commands/publish.ts","../src/commands/search.ts","../src/commands/uninstall.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { configCommand } from './commands/config.js';\nimport { initCommand } from './commands/init.js';\nimport { installCommand } from './commands/install.js';\nimport { learnCommand } from './commands/learn.js';\nimport { listCommand } from './commands/list.js';\nimport { publishCommand } from './commands/publish.js';\nimport { searchCommand } from './commands/search.js';\nimport { uninstallCommand } from './commands/uninstall.js';\n\nconst program = new Command();\n\nprogram.name('genehub').description('GeneHub CLI - AI 员工基因管理工具').version('0.1.0');\n\nprogram.addCommand(installCommand);\nprogram.addCommand(uninstallCommand);\nprogram.addCommand(searchCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(publishCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(learnCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../config.js';\nimport * as output from '../output.js';\n\nexport const configCommand = new Command('config').description('管理 GeneHub CLI 配置');\n\nconfigCommand\n .command('set <key> <value>')\n .description('设置配置项(registry / token)')\n .action(async (key: string, value: string) => {\n const validKeys = ['registry', 'token'] as const;\n if (!validKeys.includes(key as (typeof validKeys)[number])) {\n output.fail(`无效的配置项: ${key},可选: ${validKeys.join(', ')}`);\n return;\n }\n\n if (key === 'registry') {\n await saveConfig({ registryUrl: value });\n } else if (key === 'token') {\n await saveConfig({ token: value });\n }\n\n output.ok(`${key} = ${key === 'token' ? `${value.slice(0, 8)}***` : value}`);\n });\n\nconfigCommand\n .command('get [key]')\n .description('查看配置')\n .action(async (key?: string) => {\n const config = await loadConfig();\n\n if (key) {\n const map: Record<string, string | undefined> = {\n registry: config.registryUrl,\n token: config.token ? `${config.token.slice(0, 8)}***` : undefined,\n };\n output.info(`${key} = ${map[key] ?? '(未设置)'}`);\n } else {\n output.info(`registry = ${config.registryUrl}`);\n output.info(`token = ${config.token ? `${config.token.slice(0, 8)}***` : '(未设置)'}`);\n }\n });\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst CONFIG_DIR = join(homedir(), '.genehub');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nexport type CliConfig = {\n registryUrl: string;\n token?: string;\n};\n\nconst DEFAULT_CONFIG: CliConfig = {\n registryUrl: 'https://genehub.nodeskai.com',\n};\n\nexport async function loadConfig(): Promise<CliConfig> {\n try {\n const raw = await readFile(CONFIG_PATH, 'utf-8');\n return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function saveConfig(config: Partial<CliConfig>): Promise<void> {\n const current = await loadConfig();\n const merged = { ...current, ...config };\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_PATH, JSON.stringify(merged, null, 2), 'utf-8');\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\n\nexport function info(msg: string) {\n console.log(chalk.blue('i'), msg);\n}\n\nexport function ok(msg: string) {\n console.log(chalk.green('+'), msg);\n}\n\nexport function warn(msg: string) {\n console.log(chalk.yellow('!'), msg);\n}\n\nexport function fail(msg: string) {\n console.error(chalk.red('x'), msg);\n}\n\nexport function table(headers: string[], rows: string[][]) {\n const t = new Table({\n head: headers.map((h) => chalk.cyan(h)),\n style: { head: [], border: [] },\n });\n for (const row of rows) {\n t.push(row);\n }\n console.log(t.toString());\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { stringify } from 'yaml';\nimport * as output from '../output.js';\n\nconst TEMPLATE = {\n slug: 'my-gene',\n name: '我的基因',\n version: '1.0.0',\n description: '基因功能描述',\n short_description: '一句话描述',\n category: 'development',\n tags: ['ability'],\n author: { type: 'human', name: '' },\n compatibility: [\n { product: 'openclaw', min_version: '0.5.0' },\n { product: 'nanobot', min_version: '0.1.0' },\n ],\n dependencies: [],\n synergies: [],\n skill: {\n name: 'my-gene',\n always: false,\n file: 'SKILL.md',\n },\n rules: [],\n config: {},\n mcp_servers: [],\n learning: {\n force_deep_learn: false,\n objectives: [],\n scenarios: [],\n },\n};\n\nconst SKILL_TEMPLATE = `---\nname: my-gene\ndescription: 一句话描述\nmetadata:\n openclaw:\n always: false\n nanobot:\n always: false\n---\n\n在此编写基因的技能描述...\n`;\n\nexport const initCommand = new Command('init')\n .description('初始化基因模板')\n .argument('[path]', '目标目录', '.')\n .action(async (dirPath: string) => {\n const absPath = resolve(dirPath);\n\n try {\n await mkdir(absPath, { recursive: true });\n\n const yamlPath = join(absPath, 'gene.yaml');\n await writeFile(yamlPath, stringify(TEMPLATE), 'utf-8');\n\n const skillPath = join(absPath, 'SKILL.md');\n await writeFile(skillPath, SKILL_TEMPLATE, 'utf-8');\n\n output.ok(`基因模板已创建:`);\n output.info(` ${yamlPath}`);\n output.info(` ${skillPath}`);\n output.info('编辑这两个文件后,使用 genehub publish 发布');\n } catch (err) {\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { detectAdapter, GeneHubClient, getAdapter, LearningEngine } from '@nodeskai/genehub-sdk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { loadConfig } from '../config.js';\nimport * as output from '../output.js';\n\nfunction parseSlugVersion(input: string): { slug: string; version?: string } {\n const atIdx = input.lastIndexOf('@');\n if (atIdx > 0) {\n return { slug: input.slice(0, atIdx), version: input.slice(atIdx + 1) };\n }\n return { slug: input };\n}\n\nexport const installCommand = new Command('install')\n .description('安装基因到当前 Agent 环境')\n .argument('<slug>', '基因标识符(支持 slug@version 格式)')\n .option('-p, --product <product>', '指定目标产品(openclaw / nanobot / generic)')\n .option('-f, --force', '强制覆盖已安装版本', false)\n .option('--target <path>', '指定安装目标路径')\n .option('--learn', '安装后自动触发深度学习', false)\n .action(async (rawSlug: string, opts) => {\n const config = await loadConfig();\n const client = new GeneHubClient({ registryUrl: config.registryUrl, token: config.token });\n\n const { slug, version } = parseSlugVersion(rawSlug);\n const spinner = ora(`获取基因 ${slug}${version ? `@${version}` : ''} 的 manifest...`).start();\n\n try {\n const manifest = await client.getManifest(slug, version);\n spinner.succeed(`获取 ${manifest.name} v${manifest.version}`);\n\n const adapter = opts.product ? getAdapter(opts.product) : await detectAdapter();\n\n output.info(`目标产品: ${adapter.product}`);\n\n if (!opts.force && (await adapter.isInstalled(slug))) {\n const installedVer = await adapter.getInstalledVersion(slug);\n output.warn(`${slug}${installedVer ? ` v${installedVer}` : ''} 已安装,使用 --force 覆盖`);\n return;\n }\n\n const installSpinner = ora('安装中...').start();\n const result = await adapter.install(manifest, {\n force: opts.force,\n targetPath: opts.target,\n });\n installSpinner.succeed('安装完成');\n\n output.ok(`${result.slug}@${result.version} 安装成功`);\n output.info(`文件: ${result.files.join(', ')}`);\n\n if (result.needsRestart) {\n output.warn('需要重启 Agent Host 使基因生效');\n }\n\n if (result.dependencies.length > 0) {\n output.info(`依赖基因: ${result.dependencies.join(', ')}`);\n }\n\n try {\n await client.reportInstall(slug);\n } catch {\n // non-critical\n }\n\n if (opts.learn) {\n const workspaceDir =\n adapter.product === 'openclaw'\n ? join(homedir(), '.openclaw', 'workspace')\n : adapter.product === 'nanobot'\n ? join(homedir(), '.nanobot', 'workspace')\n : join(process.cwd(), '.genehub');\n\n const engine = new LearningEngine({ workspaceDir, adapter });\n const learnSpinner = ora('生成学习任务...').start();\n await engine.createLearningTask(manifest);\n learnSpinner.succeed('学习任务已创建,Agent 将在下次对话中处理');\n }\n } catch (err) {\n spinner.fail('安装失败');\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { detectAdapter, GeneHubClient, getAdapter, LearningEngine } from '@nodeskai/genehub-sdk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { loadConfig } from '../config.js';\nimport * as output from '../output.js';\n\nfunction getWorkspaceDir(product: string): string {\n switch (product) {\n case 'openclaw':\n return join(homedir(), '.openclaw', 'workspace');\n case 'nanobot':\n return join(homedir(), '.nanobot', 'workspace');\n default:\n return join(process.cwd(), '.genehub');\n }\n}\n\nexport const learnCommand = new Command('learn')\n .description('触发基因深度学习(L2)')\n .argument('<slug>', '基因标识符')\n .option('-p, --product <product>', '指定目标产品')\n .option('--check', '检查学习结果并应用')\n .action(async (slug: string, opts) => {\n const config = await loadConfig();\n const client = new GeneHubClient({ registryUrl: config.registryUrl, token: config.token });\n\n const adapter = opts.product ? getAdapter(opts.product) : await detectAdapter();\n\n const workspaceDir = getWorkspaceDir(adapter.product);\n const engine = new LearningEngine({ workspaceDir, adapter });\n\n if (opts.check) {\n const spinner = ora('检查学习结果...').start();\n const result = await engine.checkResult(slug);\n\n if (!result) {\n spinner.fail('未找到学习结果');\n output.info('Agent 还未完成该基因的学习任务');\n\n const pending = await engine.listPendingTasks();\n if (pending.length > 0) {\n output.info(`待完成的学习任务: ${pending.join(', ')}`);\n }\n return;\n }\n\n spinner.succeed(`学习结果: ${result.decision}`);\n\n if (result.self_eval !== undefined) {\n output.info(`自评分: ${result.self_eval}`);\n }\n if (result.reason) {\n output.info(`理由: ${result.reason}`);\n }\n\n if (result.decision === 'learned' && result.content) {\n const skillsDir = join(workspaceDir, 'skills');\n const applied = await engine.applyResult(slug, skillsDir);\n if (applied) {\n output.ok('已将个性化版本应用到技能目录');\n }\n }\n\n return;\n }\n\n const spinner = ora(`获取 ${slug} 的 manifest...`).start();\n\n try {\n const manifest = await client.getManifest(slug);\n spinner.succeed(`获取 ${manifest.name} v${manifest.version}`);\n\n if (!manifest.learning?.objectives?.length && !manifest.learning?.scenarios?.length) {\n output.warn('该基因没有定义学习目标或练习场景,将创建基础学习任务');\n }\n\n const learnSpinner = ora('生成学习任务...').start();\n const task = await engine.createLearningTask(manifest);\n learnSpinner.succeed('学习任务已创建');\n\n output.ok(`任务文件: ${join(workspaceDir, 'learning-tasks', `${slug}.md`)}`);\n output.info(`结果路径: ${task.callback_path}`);\n output.info('');\n output.info('下一步:');\n output.info(' 1. Agent 在下次对话中会自动发现并处理学习任务');\n output.info(` 2. 学习完成后运行: genehub learn --check ${slug}`);\n } catch (err) {\n spinner.fail('学习任务创建失败');\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { detectAdapter, getAdapter } from '@nodeskai/genehub-sdk';\nimport { Command } from 'commander';\nimport * as output from '../output.js';\n\nexport const listCommand = new Command('list')\n .description('列出当前环境已安装的基因')\n .option('-p, --product <product>', '指定目标产品')\n .option('--json', 'JSON 格式输出', false)\n .action(async (opts) => {\n try {\n const adapter = opts.product ? getAdapter(opts.product) : await detectAdapter();\n\n const genes = await adapter.list();\n\n if (opts.json) {\n console.log(JSON.stringify(genes, null, 2));\n return;\n }\n\n if (genes.length === 0) {\n output.info(`[${adapter.product}] 没有已安装的基因`);\n return;\n }\n\n output.info(`[${adapter.product}] 已安装 ${genes.length} 个基因:\\n`);\n\n for (const gene of genes) {\n const date = new Date(gene.installedAt).toLocaleDateString('zh-CN');\n console.log(` ${gene.slug.padEnd(24)} v${gene.version.padEnd(10)} ${date}`);\n }\n } catch (err) {\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { GeneHubClient } from '@nodeskai/genehub-sdk';\nimport { GeneManifestSchema } from '@nodeskai/genehub-types';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { parse } from 'yaml';\nimport { loadConfig } from '../config.js';\nimport * as output from '../output.js';\n\nexport const publishCommand = new Command('publish')\n .description('发布基因到 GeneHub Registry')\n .argument('<path>', '基因目录路径(包含 gene.yaml)')\n .action(async (dirPath: string) => {\n const config = await loadConfig();\n\n if (!config.token) {\n output.fail('未配置认证 token,请先运行 genehub config --token <token>');\n process.exit(1);\n }\n\n const client = new GeneHubClient({ registryUrl: config.registryUrl, token: config.token });\n const absPath = resolve(dirPath);\n\n try {\n const yamlPath = join(absPath, 'gene.yaml');\n const raw = await readFile(yamlPath, 'utf-8');\n const parsed = parse(raw);\n\n const skillMdPath = join(absPath, 'SKILL.md');\n if (parsed.skill?.file && !parsed.skill.content) {\n try {\n parsed.skill.content = await readFile(join(absPath, parsed.skill.file), 'utf-8');\n } catch {\n parsed.skill.content = await readFile(skillMdPath, 'utf-8');\n }\n }\n\n const validation = GeneManifestSchema.safeParse(parsed);\n if (!validation.success) {\n output.fail('Manifest 校验失败:');\n for (const issue of validation.error.issues) {\n output.fail(` ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n\n const spinner = ora(`发布 ${validation.data.slug}@${validation.data.version}...`).start();\n const gene = await client.publishGene(validation.data);\n spinner.succeed('发布成功');\n\n output.ok(`${gene.slug}@${gene.version} 已发布到 GeneHub Registry`);\n } catch (err) {\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { GeneHubClient } from '@nodeskai/genehub-sdk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport * as output from '../output.js';\n\nexport const searchCommand = new Command('search')\n .description('搜索基因库')\n .argument('[keyword]', '搜索关键词')\n .option('-c, --category <category>', '按分类过滤')\n .option('-t, --tags <tags>', '按标签过滤(逗号分隔)')\n .option('--compat <product>', '按兼容产品过滤')\n .option('-s, --sort <sort>', '排序方式(newest / popular / rating)', 'newest')\n .option('--page <page>', '页码', '1')\n .option('--json', 'JSON 格式输出', false)\n .action(async (keyword: string | undefined, opts) => {\n const config = await loadConfig();\n const client = new GeneHubClient({ registryUrl: config.registryUrl, token: config.token });\n\n try {\n const result = await client.searchGenes({\n q: keyword,\n category: opts.category,\n tags: opts.tags?.split(','),\n compatibility: opts.compat,\n sort: opts.sort,\n page: Number(opts.page),\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.items.length === 0) {\n output.info('未找到匹配的基因');\n return;\n }\n\n output.table(\n ['slug', '名称', '版本', '分类', '兼容', '安装数'],\n result.items.map((g) => [\n g.slug,\n g.name,\n g.version,\n g.category,\n (g.compatibility as string[]).join(', '),\n String(g.install_count),\n ]),\n );\n\n output.info(`共 ${result.total} 条结果,第 ${result.page}/${result.total_pages} 页`);\n } catch (err) {\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import { detectAdapter, getAdapter } from '@nodeskai/genehub-sdk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport * as output from '../output.js';\n\nexport const uninstallCommand = new Command('uninstall')\n .description('从当前 Agent 环境卸载基因')\n .argument('<slug>', '基因标识符')\n .option('-p, --product <product>', '指定目标产品(openclaw / nanobot / generic)')\n .action(async (slug: string, opts) => {\n const adapter = opts.product ? getAdapter(opts.product) : await detectAdapter();\n\n output.info(`目标产品: ${adapter.product}`);\n\n if (!(await adapter.isInstalled(slug))) {\n output.warn(`${slug} 未安装`);\n return;\n }\n\n const spinner = ora('卸载中...').start();\n\n try {\n const result = await adapter.uninstall(slug);\n spinner.succeed('卸载完成');\n\n output.ok(`${result.slug} 已卸载`);\n output.info(`清理文件: ${result.files.join(', ')}`);\n\n if (result.needsRestart) {\n output.warn('需要重启 Agent Host 使变更生效');\n }\n } catch (err) {\n spinner.fail('卸载失败');\n output.fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n"],"mappings":"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","names":["Command","mkdir","writeFile","join","Command","Command","mkdir","join","writeFile","homedir","join","Command","Command","join","homedir","homedir","join","detectAdapter","GeneHubClient","getAdapter","LearningEngine","Command","ora","join","homedir","Command","GeneHubClient","getAdapter","detectAdapter","LearningEngine","spinner","ora","detectAdapter","getAdapter","Command","Command","getAdapter","detectAdapter","readFile","join","resolve","GeneHubClient","Command","ora","Command","GeneHubClient","resolve","join","readFile","ora","GeneHubClient","Command","Command","GeneHubClient","detectAdapter","getAdapter","Command","ora","Command","getAdapter","detectAdapter","ora","Command"]}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@nodeskai/genehub",
3
+ "version": "0.1.0",
4
+ "description": "GeneHub CLI - AI 员工基因管理命令行工具",
5
+ "type": "module",
6
+ "bin": {
7
+ "genehub": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "dev": "tsx src/index.ts",
14
+ "build": "tsup",
15
+ "prepublishOnly": "pnpm build",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest"
18
+ },
19
+ "dependencies": {
20
+ "@nodeskai/genehub-types": "workspace:*",
21
+ "@nodeskai/genehub-sdk": "workspace:*",
22
+ "commander": "^13.1",
23
+ "chalk": "^5.4",
24
+ "cli-table3": "^0.6",
25
+ "ora": "^8.1",
26
+ "yaml": "^2.7"
27
+ },
28
+ "devDependencies": {
29
+ "tsup": "^8.3",
30
+ "tsx": "^4.19",
31
+ "typescript": "^5.7",
32
+ "vitest": "^3.0",
33
+ "@types/node": "^22.0"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/NoDeskAI/genehub.git",
38
+ "directory": "packages/cli"
39
+ },
40
+ "homepage": "https://github.com/NoDeskAI/genehub",
41
+ "keywords": [
42
+ "genehub",
43
+ "ai",
44
+ "agent",
45
+ "gene",
46
+ "skill",
47
+ "cli"
48
+ ],
49
+ "license": "MIT"
50
+ }