@nodeskai/genehub-sdk 2026.3.2-9 → 2026.3.3-3

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NoDeskAI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # @nodeskai/genehub-sdk
2
+
3
+ GeneHub TypeScript SDK -- API 客户端、产品适配器和学习引擎。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @nodeskai/genehub-sdk
9
+ ```
10
+
11
+ ## 使用
12
+
13
+ ### API 客户端
14
+
15
+ ```typescript
16
+ import { GeneHubClient } from '@nodeskai/genehub-sdk';
17
+
18
+ const client = new GeneHubClient({
19
+ registryUrl: 'https://genehub.nodeskai.com',
20
+ token: 'ghb_...',
21
+ });
22
+
23
+ const genes = await client.searchGenes({ q: 'code-review' });
24
+ const gene = await client.getGene('code-review');
25
+ const manifest = await client.getManifest('code-review');
26
+ ```
27
+
28
+ ### 产品适配器
29
+
30
+ 为不同 AI 产品提供统一的基因安装/卸载接口:
31
+
32
+ ```typescript
33
+ import { OpenClawAdapter } from '@nodeskai/genehub-sdk';
34
+
35
+ const adapter = new OpenClawAdapter({ workspaceDir: '/path/to/workspace' });
36
+ await adapter.install(manifest);
37
+ await adapter.uninstall('code-review');
38
+ const installed = await adapter.list();
39
+ ```
40
+
41
+ 支持的适配器:
42
+
43
+ | 适配器 | 产品 | 说明 |
44
+ |---|---|---|
45
+ | `OpenClawAdapter` | OpenClaw | AGENTS.md + memory + MCP 配置 |
46
+ | `NanobotAdapter` | nanobot | memory 记录、版本解析 |
47
+ | `GenericAdapter` | 通用 | 基础文件写入 |
48
+
49
+ ### 学习引擎
50
+
51
+ ```typescript
52
+ import { LearningEngine } from '@nodeskai/genehub-sdk';
53
+
54
+ const engine = new LearningEngine(client, adapter);
55
+ const task = await engine.createTask('code-review');
56
+ const result = await engine.checkResult('code-review');
57
+ ```
58
+
59
+ ## 目录结构
60
+
61
+ ```
62
+ packages/sdk/typescript/
63
+ ├── src/
64
+ │ ├── index.ts # 导出入口
65
+ │ ├── client.ts # GeneHubClient API 客户端
66
+ │ ├── adapters/ # 产品适配器
67
+ │ │ ├── base.ts
68
+ │ │ ├── openclaw.ts
69
+ │ │ ├── nanobot.ts
70
+ │ │ └── generic.ts
71
+ │ └── learning/
72
+ │ └── engine.ts # L2 深度学习引擎
73
+ ├── dist/ # 构建产物
74
+ └── package.json
75
+ ```
76
+
77
+ ## 开发
78
+
79
+ ```bash
80
+ pnpm build # 构建
81
+ pnpm dev # 开发模式(watch)
82
+ pnpm test # 运行测试
83
+ ```
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
- import { GeneAdapter, GeneManifest, InstallOptions, InstallResult, UninstallResult, UninstallOptions, InstalledGene, GeneListParams, PaginatedData, Gene, GeneVersion, Genome, ResolvedGene } from '@nodeskai/genehub-types';
1
+ import { GeneAdapter, GeneManifest, InstallOptions, InstallResult, UninstallResult, UninstallOptions, InstalledGene, GeneListParams, PaginatedData, Gene, GeneVersion, ResolvedGene, GenomeListParams, Genome, GenomeVersion, GenomeResolveResult, CreateGenomeRequest, PublishGenomeVersionRequest, AgentTemplateListParams, AgentTemplate, AgentTemplateVersion, CreateAgentTemplateRequest, PublishAgentTemplateVersionRequest } from '@nodeskai/genehub-types';
2
2
 
3
3
  declare abstract class BaseAdapter implements GeneAdapter {
4
4
  abstract readonly product: string;
5
5
  abstract detect(): Promise<boolean>;
6
6
  install(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
7
+ installFromDirectory(geneDir: string, manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
7
8
  protected abstract doInstall(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
9
+ protected doInstallFromDirectory(_geneDir: string, manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
8
10
  protected onPostInstall(_manifest: GeneManifest, _result: InstallResult): Promise<void>;
9
11
  protected onPostUninstall(_slug: string, _result: UninstallResult): Promise<void>;
10
12
  uninstall(slug: string, options?: UninstallOptions): Promise<UninstallResult>;
@@ -24,6 +26,7 @@ declare class GenericAdapter extends BaseAdapter {
24
26
  });
25
27
  detect(): Promise<boolean>;
26
28
  protected doInstall(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
29
+ protected doInstallFromDirectory(geneDir: string, manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
27
30
  protected doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult>;
28
31
  list(): Promise<InstalledGene[]>;
29
32
  isInstalled(slug: string): Promise<boolean>;
@@ -42,12 +45,14 @@ declare class NanobotAdapter extends BaseAdapter {
42
45
  private get skillsDir();
43
46
  detect(): Promise<boolean>;
44
47
  protected doInstall(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
48
+ protected doInstallFromDirectory(geneDir: string, manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
45
49
  protected onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void>;
46
50
  protected doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult>;
47
51
  protected onPostUninstall(slug: string, _result: UninstallResult): Promise<void>;
48
52
  list(): Promise<InstalledGene[]>;
49
53
  isInstalled(slug: string): Promise<boolean>;
50
54
  getInstalledVersion(slug: string): Promise<string | null>;
55
+ triggerLearning(prompt: string): Promise<void>;
51
56
  private writeMemoryEntry;
52
57
  private buildNanobotSkillContent;
53
58
  private mergeNanobotMcpConfig;
@@ -67,6 +72,7 @@ declare class OpenClawAdapter extends BaseAdapter {
67
72
  });
68
73
  detect(): Promise<boolean>;
69
74
  protected doInstall(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
75
+ protected doInstallFromDirectory(geneDir: string, manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult>;
70
76
  protected onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void>;
71
77
  protected doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult>;
72
78
  protected onPostUninstall(slug: string, _result: UninstallResult): Promise<void>;
@@ -77,6 +83,7 @@ declare class OpenClawAdapter extends BaseAdapter {
77
83
  private writeMemoryEntry;
78
84
  private mergeOpenClawConfig;
79
85
  private mergeMcpServers;
86
+ triggerLearning(prompt: string): Promise<void>;
80
87
  notifySkillChange(geneName: string, action: 'installed' | 'updated' | 'uninstalled'): Promise<void>;
81
88
  /**
82
89
  * Clear cached skillsSnapshot from all OpenClaw sessions.
@@ -108,9 +115,19 @@ declare class GeneHubClient {
108
115
  getManifest(slug: string, version?: string): Promise<GeneManifest>;
109
116
  getVersions(slug: string): Promise<GeneVersion[]>;
110
117
  getVersion(slug: string, version: string): Promise<GeneVersion>;
111
- getGenome(slug: string): Promise<Genome>;
112
- publishGene(manifest: GeneManifest): Promise<Gene>;
113
- publishVersion(slug: string, manifest: GeneManifest, changelog?: string): Promise<Gene>;
118
+ publishGene(manifest: GeneManifest, files?: Record<string, string>): Promise<Gene>;
119
+ publishVersion(slug: string, manifest: GeneManifest, changelog?: string, files?: Record<string, string>): Promise<Gene>;
120
+ getGeneFiles(slug: string, version?: string): Promise<{
121
+ path: string;
122
+ size: number;
123
+ sha: string;
124
+ type: string;
125
+ }[]>;
126
+ getGeneFileContent(slug: string, filePath: string, version?: string): Promise<{
127
+ path: string;
128
+ content: string;
129
+ }>;
130
+ downloadArchive(slug: string, version?: string): Promise<ArrayBuffer>;
114
131
  resolve(slug: string, version?: string, product?: string): Promise<{
115
132
  plan: ResolvedGene[];
116
133
  warnings: string[];
@@ -121,6 +138,43 @@ declare class GeneHubClient {
121
138
  value: number;
122
139
  context?: string;
123
140
  }): Promise<void>;
141
+ searchGenomes(params?: GenomeListParams): Promise<PaginatedData<Genome>>;
142
+ getGenome(slug: string): Promise<Genome>;
143
+ getGenomeVersions(slug: string): Promise<GenomeVersion[]>;
144
+ getGenomeVersion(slug: string, version: string): Promise<GenomeVersion>;
145
+ resolveGenome(slug: string, version?: string, product?: string): Promise<GenomeResolveResult>;
146
+ publishGenome(data: CreateGenomeRequest, files?: Record<string, string>): Promise<Genome>;
147
+ publishGenomeVersion(slug: string, data: PublishGenomeVersionRequest, files?: Record<string, string>): Promise<Genome>;
148
+ getGenomeFiles(slug: string, version?: string): Promise<{
149
+ path: string;
150
+ size: number;
151
+ sha: string;
152
+ type: string;
153
+ }[]>;
154
+ getGenomeFileContent(slug: string, filePath: string, version?: string): Promise<{
155
+ path: string;
156
+ content: string;
157
+ }>;
158
+ downloadGenomeArchive(slug: string, version?: string): Promise<ArrayBuffer>;
159
+ reportGenomeInstall(slug: string): Promise<void>;
160
+ searchTemplates(params?: AgentTemplateListParams): Promise<PaginatedData<AgentTemplate>>;
161
+ getTemplate(slug: string): Promise<AgentTemplate>;
162
+ getTemplateVersions(slug: string): Promise<AgentTemplateVersion[]>;
163
+ getTemplateVersion(slug: string, version: string): Promise<AgentTemplateVersion>;
164
+ publishTemplate(data: CreateAgentTemplateRequest, files?: Record<string, string>): Promise<AgentTemplate>;
165
+ publishTemplateVersion(slug: string, data: PublishAgentTemplateVersionRequest, files?: Record<string, string>): Promise<AgentTemplate>;
166
+ getTemplateFiles(slug: string, version?: string): Promise<{
167
+ path: string;
168
+ size: number;
169
+ sha: string;
170
+ type: string;
171
+ }[]>;
172
+ getTemplateFileContent(slug: string, filePath: string, version?: string): Promise<{
173
+ path: string;
174
+ content: string;
175
+ }>;
176
+ downloadTemplateArchive(slug: string, version?: string): Promise<ArrayBuffer>;
177
+ reportTemplateInstall(slug: string): Promise<void>;
124
178
  }
125
179
 
126
180
  type LearningMode = 'learn' | 'create' | 'forget';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/adapters/generic.ts
2
- import { mkdir, readdir, readFile, rm, stat, writeFile } from "fs/promises";
2
+ import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from "fs/promises";
3
3
  import { join } from "path";
4
4
  import { stringify } from "yaml";
5
5
 
@@ -10,6 +10,14 @@ var BaseAdapter = class {
10
10
  await this.onPostInstall(manifest, result);
11
11
  return result;
12
12
  }
13
+ async installFromDirectory(geneDir, manifest, options) {
14
+ const result = await this.doInstallFromDirectory(geneDir, manifest, options);
15
+ await this.onPostInstall(manifest, result);
16
+ return result;
17
+ }
18
+ async doInstallFromDirectory(_geneDir, manifest, options) {
19
+ return this.doInstall(manifest, options);
20
+ }
13
21
  async onPostInstall(_manifest, _result) {
14
22
  }
15
23
  async onPostUninstall(_slug, _result) {
@@ -81,6 +89,28 @@ var GenericAdapter = class extends BaseAdapter {
81
89
  dependencies: manifest.dependencies.map((d) => d.slug)
82
90
  };
83
91
  }
92
+ async doInstallFromDirectory(geneDir, manifest, options) {
93
+ const targetDir = options?.targetPath ? join(options.targetPath, manifest.slug) : join(this.genesDir, manifest.slug);
94
+ await cp(geneDir, targetDir, { recursive: true });
95
+ const files = [];
96
+ async function collectFiles(dir) {
97
+ const entries = await readdir(dir, { withFileTypes: true });
98
+ for (const entry of entries) {
99
+ const full = join(dir, entry.name);
100
+ if (entry.isDirectory()) await collectFiles(full);
101
+ else files.push(full);
102
+ }
103
+ }
104
+ await collectFiles(targetDir);
105
+ return {
106
+ success: true,
107
+ slug: manifest.slug,
108
+ version: manifest.version,
109
+ files,
110
+ needsRestart: false,
111
+ dependencies: manifest.dependencies.map((d) => d.slug)
112
+ };
113
+ }
84
114
  async doUninstall(slug, _options) {
85
115
  const targetDir = join(this.genesDir, slug);
86
116
  try {
@@ -134,7 +164,7 @@ var GenericAdapter = class extends BaseAdapter {
134
164
  };
135
165
 
136
166
  // src/adapters/nanobot.ts
137
- import { mkdir as mkdir2, readdir as readdir2, readFile as readFile2, rm as rm2, stat as stat2, writeFile as writeFile2 } from "fs/promises";
167
+ import { cp as cp2, mkdir as mkdir2, readdir as readdir2, readFile as readFile2, rm as rm2, stat as stat2, writeFile as writeFile2 } from "fs/promises";
138
168
  import { homedir } from "os";
139
169
  import { join as join2 } from "path";
140
170
  var DEFAULT_WORKSPACE = join2(homedir(), ".nanobot", "workspace");
@@ -176,6 +206,32 @@ var NanobotAdapter = class extends BaseAdapter {
176
206
  dependencies: manifest.dependencies.map((d) => d.slug)
177
207
  };
178
208
  }
209
+ async doInstallFromDirectory(geneDir, manifest, options) {
210
+ const targetDir = options?.targetPath ? join2(options.targetPath, manifest.skill.name) : join2(this.skillsDir, manifest.skill.name);
211
+ await mkdir2(targetDir, { recursive: true });
212
+ await cp2(geneDir, targetDir, { recursive: true });
213
+ if (manifest.mcp_servers.length > 0) {
214
+ await this.mergeNanobotMcpConfig(manifest.mcp_servers);
215
+ }
216
+ const files = [];
217
+ async function collectFiles(dir) {
218
+ const entries = await readdir2(dir, { withFileTypes: true });
219
+ for (const entry of entries) {
220
+ const full = join2(dir, entry.name);
221
+ if (entry.isDirectory()) await collectFiles(full);
222
+ else files.push(full);
223
+ }
224
+ }
225
+ await collectFiles(targetDir);
226
+ return {
227
+ success: true,
228
+ slug: manifest.slug,
229
+ version: manifest.version,
230
+ files,
231
+ needsRestart: false,
232
+ dependencies: manifest.dependencies.map((d) => d.slug)
233
+ };
234
+ }
179
235
  async onPostInstall(manifest, _result) {
180
236
  await this.writeMemoryEntry(manifest, "install");
181
237
  }
@@ -236,6 +292,16 @@ var NanobotAdapter = class extends BaseAdapter {
236
292
  return null;
237
293
  }
238
294
  }
295
+ async triggerLearning(prompt) {
296
+ const { exec } = await import("child_process");
297
+ const { promisify } = await import("util");
298
+ const execAsync = promisify(exec);
299
+ const escaped = prompt.replace(/"/g, '\\"');
300
+ try {
301
+ await execAsync(`nanobot run --prompt "${escaped}"`, { timeout: 5e3 });
302
+ } catch {
303
+ }
304
+ }
239
305
  async writeMemoryEntry(manifest, action) {
240
306
  const memoryDir = join2(this.workspace, "memory");
241
307
  await mkdir2(memoryDir, { recursive: true });
@@ -285,7 +351,7 @@ var NanobotAdapter = class extends BaseAdapter {
285
351
 
286
352
  // src/adapters/openclaw.ts
287
353
  import { randomUUID } from "crypto";
288
- import { appendFile, mkdir as mkdir3, readdir as readdir3, readFile as readFile3, rm as rm3, stat as stat3, writeFile as writeFile3 } from "fs/promises";
354
+ import { appendFile, cp as cp3, mkdir as mkdir3, readdir as readdir3, readFile as readFile3, rm as rm3, stat as stat3, writeFile as writeFile3 } from "fs/promises";
289
355
  import { homedir as homedir2 } from "os";
290
356
  import { basename, join as join3 } from "path";
291
357
  var DEFAULT_CONFIG_DIR = join3(homedir2(), ".openclaw");
@@ -339,6 +405,35 @@ var OpenClawAdapter = class extends BaseAdapter {
339
405
  dependencies: manifest.dependencies.map((d) => d.slug)
340
406
  };
341
407
  }
408
+ async doInstallFromDirectory(geneDir, manifest, options) {
409
+ const targetDir = options?.targetPath ? join3(options.targetPath, manifest.skill.name) : join3(this.skillsDir, manifest.skill.name);
410
+ await mkdir3(targetDir, { recursive: true });
411
+ await cp3(geneDir, targetDir, { recursive: true });
412
+ if (manifest.config?.openclaw) {
413
+ await this.mergeOpenClawConfig(manifest.config.openclaw);
414
+ }
415
+ if (manifest.mcp_servers?.length) {
416
+ await this.mergeMcpServers(manifest.mcp_servers);
417
+ }
418
+ const files = [];
419
+ async function collectFiles(dir) {
420
+ const entries = await readdir3(dir, { withFileTypes: true });
421
+ for (const entry of entries) {
422
+ const full = join3(dir, entry.name);
423
+ if (entry.isDirectory()) await collectFiles(full);
424
+ else files.push(full);
425
+ }
426
+ }
427
+ await collectFiles(targetDir);
428
+ return {
429
+ success: true,
430
+ slug: manifest.slug,
431
+ version: manifest.version,
432
+ files,
433
+ needsRestart: true,
434
+ dependencies: manifest.dependencies.map((d) => d.slug)
435
+ };
436
+ }
342
437
  async onPostInstall(manifest, _result) {
343
438
  await this.updateAgentsMd(manifest, "add");
344
439
  await this.writeMemoryEntry(manifest, "install");
@@ -508,6 +603,16 @@ ${geneBlock}
508
603
  existing.mcpServers = mcpServers;
509
604
  await writeFile3(this.configPath, JSON.stringify(existing, null, 2), "utf-8");
510
605
  }
606
+ async triggerLearning(prompt) {
607
+ const { exec } = await import("child_process");
608
+ const { promisify } = await import("util");
609
+ const execAsync = promisify(exec);
610
+ const escaped = prompt.replace(/"/g, '\\"');
611
+ try {
612
+ await execAsync(`openclaw agent --message "${escaped}"`, { timeout: 5e3 });
613
+ } catch {
614
+ }
615
+ }
511
616
  async notifySkillChange(geneName, action) {
512
617
  await this.invalidateSkillSnapshots();
513
618
  const notifyAction = action === "uninstalled" ? "uninstalled" : "installed";
@@ -690,6 +795,7 @@ var GeneHubClient = class {
690
795
  }
691
796
  return json.data;
692
797
  }
798
+ // ── Gene ──
693
799
  async searchGenes(params = {}) {
694
800
  const qs = new URLSearchParams();
695
801
  if (params.q) qs.set("q", params.q);
@@ -715,21 +821,39 @@ var GeneHubClient = class {
715
821
  async getVersion(slug, version) {
716
822
  return this.request(`/api/v1/genes/${slug}/versions/${version}`);
717
823
  }
718
- async getGenome(slug) {
719
- return this.request(`/api/v1/genomes/${slug}`);
720
- }
721
- async publishGene(manifest) {
824
+ async publishGene(manifest, files) {
722
825
  return this.request("/api/v1/genes", {
723
826
  method: "POST",
724
- body: JSON.stringify({ manifest })
827
+ body: JSON.stringify({ manifest, files })
725
828
  });
726
829
  }
727
- async publishVersion(slug, manifest, changelog) {
830
+ async publishVersion(slug, manifest, changelog, files) {
728
831
  return this.request(`/api/v1/genes/${slug}/versions`, {
729
832
  method: "POST",
730
- body: JSON.stringify({ manifest, changelog })
833
+ body: JSON.stringify({ manifest, changelog, files })
731
834
  });
732
835
  }
836
+ async getGeneFiles(slug, version) {
837
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
838
+ return this.request(`/api/v1/genes/${slug}/files${qs}`);
839
+ }
840
+ async getGeneFileContent(slug, filePath, version) {
841
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
842
+ return this.request(`/api/v1/genes/${slug}/files/${filePath}${qs}`);
843
+ }
844
+ async downloadArchive(slug, version) {
845
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
846
+ const url = `${this.baseUrl}/api/v1/genes/${slug}/archive${qs}`;
847
+ const headers = {};
848
+ if (this.token) {
849
+ headers.Authorization = `Bearer ${this.token}`;
850
+ }
851
+ const res = await fetch(url, { headers });
852
+ if (!res.ok) {
853
+ throw new Error(`[GeneHub] Download archive failed: HTTP ${res.status}`);
854
+ }
855
+ return res.arrayBuffer();
856
+ }
733
857
  async resolve(slug, version, product) {
734
858
  return this.request(`/api/v1/resolve`, {
735
859
  method: "POST",
@@ -745,6 +869,122 @@ var GeneHubClient = class {
745
869
  body: JSON.stringify(report)
746
870
  });
747
871
  }
872
+ // ── Genome ──
873
+ async searchGenomes(params = {}) {
874
+ const qs = new URLSearchParams();
875
+ if (params.q) qs.set("q", params.q);
876
+ if (params.category) qs.set("category", params.category);
877
+ if (params.sort) qs.set("sort", params.sort);
878
+ if (params.page) qs.set("page", String(params.page));
879
+ if (params.page_size) qs.set("page_size", String(params.page_size));
880
+ const query = qs.toString();
881
+ return this.request(`/api/v1/genomes${query ? `?${query}` : ""}`);
882
+ }
883
+ async getGenome(slug) {
884
+ return this.request(`/api/v1/genomes/${slug}`);
885
+ }
886
+ async getGenomeVersions(slug) {
887
+ return this.request(`/api/v1/genomes/${slug}/versions`);
888
+ }
889
+ async getGenomeVersion(slug, version) {
890
+ return this.request(`/api/v1/genomes/${slug}/versions/${version}`);
891
+ }
892
+ async resolveGenome(slug, version, product) {
893
+ const qs = new URLSearchParams();
894
+ if (version) qs.set("version", version);
895
+ if (product) qs.set("product", product);
896
+ const query = qs.toString();
897
+ return this.request(
898
+ `/api/v1/genomes/${slug}/resolve${query ? `?${query}` : ""}`
899
+ );
900
+ }
901
+ async publishGenome(data, files) {
902
+ return this.request("/api/v1/genomes", {
903
+ method: "POST",
904
+ body: JSON.stringify({ ...data, files })
905
+ });
906
+ }
907
+ async publishGenomeVersion(slug, data, files) {
908
+ return this.request(`/api/v1/genomes/${slug}/versions`, {
909
+ method: "POST",
910
+ body: JSON.stringify({ ...data, files })
911
+ });
912
+ }
913
+ async getGenomeFiles(slug, version) {
914
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
915
+ return this.request(`/api/v1/genomes/${slug}/files${qs}`);
916
+ }
917
+ async getGenomeFileContent(slug, filePath, version) {
918
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
919
+ return this.request(`/api/v1/genomes/${slug}/files/${filePath}${qs}`);
920
+ }
921
+ async downloadGenomeArchive(slug, version) {
922
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
923
+ const url = `${this.baseUrl}/api/v1/genomes/${slug}/archive${qs}`;
924
+ const headers = {};
925
+ if (this.token) headers.Authorization = `Bearer ${this.token}`;
926
+ const res = await fetch(url, { headers });
927
+ if (!res.ok) throw new Error(`[GeneHub] Download genome archive failed: HTTP ${res.status}`);
928
+ return res.arrayBuffer();
929
+ }
930
+ async reportGenomeInstall(slug) {
931
+ await this.request(`/api/v1/genomes/${slug}/installed`, { method: "POST", body: "{}" });
932
+ }
933
+ // ── Agent Template ──
934
+ async searchTemplates(params = {}) {
935
+ const qs = new URLSearchParams();
936
+ if (params.q) qs.set("q", params.q);
937
+ if (params.category) qs.set("category", params.category);
938
+ if (params.role) qs.set("role", params.role);
939
+ if (params.sort) qs.set("sort", params.sort);
940
+ if (params.page) qs.set("page", String(params.page));
941
+ if (params.page_size) qs.set("page_size", String(params.page_size));
942
+ const query = qs.toString();
943
+ return this.request(
944
+ `/api/v1/templates${query ? `?${query}` : ""}`
945
+ );
946
+ }
947
+ async getTemplate(slug) {
948
+ return this.request(`/api/v1/templates/${slug}`);
949
+ }
950
+ async getTemplateVersions(slug) {
951
+ return this.request(`/api/v1/templates/${slug}/versions`);
952
+ }
953
+ async getTemplateVersion(slug, version) {
954
+ return this.request(`/api/v1/templates/${slug}/versions/${version}`);
955
+ }
956
+ async publishTemplate(data, files) {
957
+ return this.request("/api/v1/templates", {
958
+ method: "POST",
959
+ body: JSON.stringify({ ...data, files })
960
+ });
961
+ }
962
+ async publishTemplateVersion(slug, data, files) {
963
+ return this.request(`/api/v1/templates/${slug}/versions`, {
964
+ method: "POST",
965
+ body: JSON.stringify({ ...data, files })
966
+ });
967
+ }
968
+ async getTemplateFiles(slug, version) {
969
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
970
+ return this.request(`/api/v1/templates/${slug}/files${qs}`);
971
+ }
972
+ async getTemplateFileContent(slug, filePath, version) {
973
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
974
+ return this.request(`/api/v1/templates/${slug}/files/${filePath}${qs}`);
975
+ }
976
+ async downloadTemplateArchive(slug, version) {
977
+ const qs = version ? `?version=${encodeURIComponent(version)}` : "";
978
+ const url = `${this.baseUrl}/api/v1/templates/${slug}/archive${qs}`;
979
+ const headers = {};
980
+ if (this.token) headers.Authorization = `Bearer ${this.token}`;
981
+ const res = await fetch(url, { headers });
982
+ if (!res.ok) throw new Error(`[GeneHub] Download template archive failed: HTTP ${res.status}`);
983
+ return res.arrayBuffer();
984
+ }
985
+ async reportTemplateInstall(slug) {
986
+ await this.request(`/api/v1/templates/${slug}/installed`, { method: "POST", body: "{}" });
987
+ }
748
988
  };
749
989
 
750
990
  // src/learning/engine.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/generic.ts","../src/adapters/base.ts","../src/adapters/nanobot.ts","../src/adapters/openclaw.ts","../src/adapters/index.ts","../src/client.ts","../src/learning/engine.ts","../src/learning/meta-gene.ts","../src/learning/prompts.ts"],"sourcesContent":["import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { stringify } from 'yaml';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_DIR = join(process.cwd(), '.genehub', 'genes');\n\nexport class GenericAdapter extends BaseAdapter {\n readonly product = 'generic';\n private genesDir: string;\n\n constructor(options?: { genesDir?: string }) {\n super();\n this.genesDir = options?.genesDir ?? DEFAULT_DIR;\n }\n\n async detect(): Promise<boolean> {\n return true;\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.slug)\n : join(this.genesDir, manifest.slug);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const yamlPath = join(targetDir, 'gene.yaml');\n await writeFile(yamlPath, stringify(manifest), 'utf-8');\n files.push(yamlPath);\n\n if (manifest.skill.content) {\n const skillPath = join(targetDir, 'SKILL.md');\n await writeFile(skillPath, manifest.skill.content, 'utf-8');\n files.push(skillPath);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.genesDir, slug);\n try {\n await rm(targetDir, { recursive: true });\n } catch {\n // already removed\n }\n return { success: true, slug, files: [targetDir], needsRestart: false };\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.genesDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const yamlPath = join(this.genesDir, dir.name, 'gene.yaml');\n try {\n const s = await stat(yamlPath);\n const raw = await readFile(yamlPath, 'utf-8');\n const versionMatch = raw.match(/^version:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n results.push({\n slug: dir.name,\n version: versionMatch?.[1] ?? 'unknown',\n installedAt: s.mtime.toISOString(),\n files: [yamlPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.genesDir, slug, 'gene.yaml'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const raw = await readFile(join(this.genesDir, slug, 'gene.yaml'), 'utf-8');\n const match = raw.match(/^version:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n}\n","import type {\n GeneAdapter,\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\n\nexport abstract class BaseAdapter implements GeneAdapter {\n abstract readonly product: string;\n\n abstract detect(): Promise<boolean>;\n\n async install(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult> {\n const result = await this.doInstall(manifest, options);\n await this.onPostInstall(manifest, result);\n return result;\n }\n\n protected abstract doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult>;\n\n protected async onPostInstall(_manifest: GeneManifest, _result: InstallResult): Promise<void> {}\n\n protected async onPostUninstall(_slug: string, _result: UninstallResult): Promise<void> {}\n\n async uninstall(slug: string, options?: UninstallOptions): Promise<UninstallResult> {\n const result = await this.doUninstall(slug, options);\n await this.onPostUninstall(slug, result);\n return result;\n }\n\n protected abstract doUninstall(\n slug: string,\n options?: UninstallOptions,\n ): Promise<UninstallResult>;\n\n abstract list(): Promise<InstalledGene[]>;\n\n abstract isInstalled(slug: string): Promise<boolean>;\n\n abstract getInstalledVersion(slug: string): Promise<string | null>;\n\n protected generateSkillContent(manifest: GeneManifest, metadataNamespace: string): string {\n const skillMeta = manifest.skill.always ? 'true' : 'false';\n const frontMatter = [\n '---',\n `name: ${manifest.skill.name}`,\n `version: ${manifest.version}`,\n `description: ${manifest.short_description}`,\n 'metadata:',\n ` ${metadataNamespace}:`,\n ` always: ${skillMeta}`,\n '---',\n ].join('\\n');\n\n if (manifest.skill.content) {\n const content = manifest.skill.content.trim();\n if (content.startsWith('---')) {\n return content;\n }\n return `${frontMatter}\\n\\n${content}`;\n }\n\n return frontMatter;\n }\n\n protected parseSkillVersion(content: string): string | null {\n const match = content.match(/^---[\\s\\S]*?version:\\s*(.+?)[\\s\\n][\\s\\S]*?---/m);\n return match?.[1]?.trim() ?? null;\n }\n}\n","import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_WORKSPACE = join(homedir(), '.nanobot', 'workspace');\n\nexport class NanobotAdapter extends BaseAdapter {\n readonly product = 'nanobot';\n private workspace: string;\n\n constructor(options?: { workspace?: string }) {\n super();\n this.workspace = options?.workspace ?? DEFAULT_WORKSPACE;\n }\n\n private get skillsDir(): string {\n return join(this.workspace, 'skills');\n }\n\n async detect(): Promise<boolean> {\n try {\n await stat(join(homedir(), '.nanobot', 'config.json'));\n return true;\n } catch {\n return false;\n }\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const skillContent = this.buildNanobotSkillContent(manifest);\n const skillPath = join(targetDir, 'SKILL.md');\n await writeFile(skillPath, skillContent, 'utf-8');\n files.push(skillPath);\n\n if (manifest.mcp_servers.length > 0) {\n await this.mergeNanobotMcpConfig(manifest.mcp_servers);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void> {\n await this.writeMemoryEntry(manifest, 'install');\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.skillsDir, slug);\n const files: string[] = [];\n\n try {\n await rm(targetDir, { recursive: true });\n files.push(targetDir);\n } catch {\n // already removed\n }\n\n return { success: true, slug, files, needsRestart: false };\n }\n\n protected async onPostUninstall(slug: string, _result: UninstallResult): Promise<void> {\n await this.writeMemoryEntry(\n { slug, name: slug, version: 'unknown' } as GeneManifest,\n 'uninstall',\n );\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.skillsDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const skillPath = join(this.skillsDir, dir.name, 'SKILL.md');\n try {\n const s = await stat(skillPath);\n const content = await readFile(skillPath, 'utf-8');\n const version = this.parseSkillVersion(content) ?? 'unknown';\n results.push({\n slug: dir.name,\n version,\n installedAt: s.mtime.toISOString(),\n files: [skillPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.skillsDir, slug, 'SKILL.md'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const content = await readFile(join(this.skillsDir, slug, 'SKILL.md'), 'utf-8');\n return this.parseSkillVersion(content);\n } catch {\n return null;\n }\n }\n\n private async writeMemoryEntry(\n manifest: GeneManifest,\n action: 'install' | 'uninstall',\n ): Promise<void> {\n const memoryDir = join(this.workspace, 'memory');\n await mkdir(memoryDir, { recursive: true });\n\n const today = new Date().toISOString().slice(0, 10);\n const memoryPath = join(memoryDir, `${today}.md`);\n\n let existing = '';\n try {\n existing = await readFile(memoryPath, 'utf-8');\n } catch {\n /* new file */\n }\n\n const time = new Date().toLocaleTimeString('zh-CN', { hour12: false });\n const verb = action === 'install' ? '学习了' : '遗忘了';\n const entry = `\\n- [${time}] 通过 GeneHub ${verb}基因: **${manifest.name ?? manifest.slug}** v${manifest.version ?? '?'}\\n`;\n\n await writeFile(memoryPath, existing + entry, 'utf-8');\n }\n\n private buildNanobotSkillContent(manifest: GeneManifest): string {\n if (manifest.skill.content?.trim().startsWith('---')) {\n return manifest.skill.content;\n }\n\n return this.generateSkillContent(manifest, 'nanobot');\n }\n\n private async mergeNanobotMcpConfig(mcpServers: GeneManifest['mcp_servers']): Promise<void> {\n const configPath = join(homedir(), '.nanobot', 'config.json');\n\n let config: Record<string, unknown> = {};\n try {\n const raw = await readFile(configPath, 'utf-8');\n config = JSON.parse(raw);\n } catch {\n return;\n }\n\n if (!config.tools) config.tools = {};\n const tools = config.tools as Record<string, unknown>;\n if (!tools.mcpServers) tools.mcpServers = {};\n const servers = tools.mcpServers as Record<string, unknown>;\n\n for (const srv of mcpServers) {\n if (servers[srv.name]) continue;\n servers[srv.name] = {\n ...(srv.command ? { command: srv.command, args: srv.args ?? [], env: srv.env ?? {} } : {}),\n ...(srv.url ? { url: srv.url, headers: srv.headers ?? {} } : {}),\n };\n }\n\n await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { appendFile, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.openclaw');\nconst DEFAULT_WORKSPACE_DIR = join(DEFAULT_CONFIG_DIR, 'workspace');\nconst DEFAULT_SKILLS_DIR = join(DEFAULT_WORKSPACE_DIR, 'skills');\nconst DEFAULT_CONFIG_PATH = join(DEFAULT_CONFIG_DIR, 'openclaw.json');\nconst SESSIONS_REL = join('agents', 'main', 'sessions');\n\nexport class OpenClawAdapter extends BaseAdapter {\n readonly product = 'openclaw';\n private skillsDir: string;\n private configPath: string;\n private configDir: string;\n private workspaceDir: string;\n\n constructor(options?: {\n skillsDir?: string;\n configPath?: string;\n workspaceDir?: string;\n configDir?: string;\n }) {\n super();\n this.configDir = options?.configDir ?? DEFAULT_CONFIG_DIR;\n this.workspaceDir = options?.workspaceDir ?? DEFAULT_WORKSPACE_DIR;\n this.skillsDir = options?.skillsDir ?? DEFAULT_SKILLS_DIR;\n this.configPath = options?.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async detect(): Promise<boolean> {\n try {\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const skillPath = join(targetDir, 'SKILL.md');\n const content = this.generateSkillContent(manifest, 'openclaw');\n await writeFile(skillPath, content, 'utf-8');\n files.push(skillPath);\n\n if (manifest.config?.openclaw) {\n await this.mergeOpenClawConfig(manifest.config.openclaw);\n files.push(this.configPath);\n }\n\n if (manifest.mcp_servers?.length) {\n await this.mergeMcpServers(manifest.mcp_servers);\n files.push(this.configPath);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files: [...new Set(files)],\n needsRestart: true,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void> {\n await this.updateAgentsMd(manifest, 'add');\n await this.writeMemoryEntry(manifest, 'install');\n await this.invalidateSkillSnapshots();\n await this.injectEvolutionNotification(manifest.name ?? manifest.slug, 'installed');\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.skillsDir, slug);\n const files: string[] = [];\n\n try {\n await rm(targetDir, { recursive: true });\n files.push(targetDir);\n } catch {\n // already removed\n }\n\n return { success: true, slug, files, needsRestart: true };\n }\n\n protected async onPostUninstall(slug: string, _result: UninstallResult): Promise<void> {\n await this.updateAgentsMd({ slug } as GeneManifest, 'remove');\n await this.writeMemoryEntry(\n { slug, name: slug, version: 'unknown' } as GeneManifest,\n 'uninstall',\n );\n await this.invalidateSkillSnapshots();\n await this.injectEvolutionNotification(slug, 'uninstalled');\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.skillsDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const skillPath = join(this.skillsDir, dir.name, 'SKILL.md');\n try {\n const s = await stat(skillPath);\n const content = await readFile(skillPath, 'utf-8');\n const version = this.parseSkillVersion(content) ?? 'unknown';\n results.push({\n slug: dir.name,\n version,\n installedAt: s.mtime.toISOString(),\n files: [skillPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.skillsDir, slug, 'SKILL.md'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const content = await readFile(join(this.skillsDir, slug, 'SKILL.md'), 'utf-8');\n return this.parseSkillVersion(content);\n } catch {\n return null;\n }\n }\n\n private async updateAgentsMd(manifest: GeneManifest, action: 'add' | 'remove'): Promise<void> {\n const agentsPath = join(this.workspaceDir, 'AGENTS.md');\n let content: string;\n try {\n content = await readFile(agentsPath, 'utf-8');\n } catch {\n return;\n }\n\n const marker = `<!-- genehub:${manifest.slug} -->`;\n const endMarker = `<!-- /genehub:${manifest.slug} -->`;\n\n const existingPattern = new RegExp(\n `${escapeRegex(marker)}[\\\\s\\\\S]*?${escapeRegex(endMarker)}\\\\n?`,\n );\n content = content.replace(existingPattern, '');\n\n if (action === 'add') {\n const geneBlock = [\n marker,\n `- **${manifest.name ?? manifest.slug}** (v${manifest.version}) — ${manifest.short_description ?? ''}`,\n endMarker,\n ].join('\\n');\n\n const toolsSection = content.indexOf('## Tools');\n if (toolsSection !== -1) {\n const nextSection = content.indexOf('\\n## ', toolsSection + 1);\n const insertPos = nextSection !== -1 ? nextSection : content.length;\n content = `${content.slice(0, insertPos)}\\n${geneBlock}\\n${content.slice(insertPos)}`;\n } else {\n content += `\\n\\n## GeneHub Skills\\n\\n${geneBlock}\\n`;\n }\n }\n\n if (action === 'remove' && manifest.slug === 'genehub-learner') {\n const bootBegin = '<!-- genehub:learning-boot -->';\n const bootEnd = '<!-- /genehub:learning-boot -->';\n const bootPattern = new RegExp(\n `\\\\n?${escapeRegex(bootBegin)}[\\\\s\\\\S]*?${escapeRegex(bootEnd)}\\\\n?`,\n );\n content = content.replace(bootPattern, '');\n }\n\n await writeFile(agentsPath, content, 'utf-8');\n }\n\n private async writeMemoryEntry(\n manifest: GeneManifest,\n action: 'install' | 'uninstall',\n ): Promise<void> {\n const memoryDir = join(this.workspaceDir, 'memory');\n await mkdir(memoryDir, { recursive: true });\n\n const today = new Date().toISOString().slice(0, 10);\n const memoryPath = join(memoryDir, `${today}.md`);\n\n let existing = '';\n try {\n existing = await readFile(memoryPath, 'utf-8');\n } catch {\n // new file\n }\n\n const time = new Date().toLocaleTimeString('zh-CN', { hour12: false });\n const verb = action === 'install' ? '学习了' : '遗忘了';\n const entry = `\\n- [${time}] 通过 GeneHub ${verb}基因: **${manifest.name ?? manifest.slug}** v${manifest.version ?? '?'}\\n`;\n\n await writeFile(memoryPath, existing + entry, 'utf-8');\n }\n\n private async mergeOpenClawConfig(config: NonNullable<GeneManifest['config']>['openclaw']) {\n if (!config) return;\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await readFile(this.configPath, 'utf-8');\n existing = JSON.parse(raw);\n } catch {\n // no existing config\n }\n\n if (config.openclaw_config) {\n Object.assign(existing, config.openclaw_config);\n }\n\n if (config.tool_allow) {\n const current = ((existing.tools as Record<string, unknown>)?.allow as string[]) ?? [];\n const merged = [...new Set([...current, ...config.tool_allow])];\n if (!existing.tools) existing.tools = {};\n (existing.tools as Record<string, unknown>).allow = merged;\n }\n\n await writeFile(this.configPath, JSON.stringify(existing, null, 2), 'utf-8');\n }\n\n private async mergeMcpServers(servers: NonNullable<GeneManifest['mcp_servers']>) {\n if (!servers?.length) return;\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await readFile(this.configPath, 'utf-8');\n existing = JSON.parse(raw);\n } catch {\n return;\n }\n\n const mcpServers = (existing.mcpServers ?? {}) as Record<string, unknown>;\n for (const server of servers) {\n mcpServers[server.name] = {\n transport: server.transport,\n command: server.command,\n args: server.args,\n env: server.env,\n };\n }\n existing.mcpServers = mcpServers;\n\n await writeFile(this.configPath, JSON.stringify(existing, null, 2), 'utf-8');\n }\n\n async notifySkillChange(\n geneName: string,\n action: 'installed' | 'updated' | 'uninstalled',\n ): Promise<void> {\n await this.invalidateSkillSnapshots();\n const notifyAction = action === 'uninstalled' ? 'uninstalled' : 'installed';\n await this.injectEvolutionNotification(geneName, notifyAction);\n }\n\n /**\n * Clear cached skillsSnapshot from all OpenClaw sessions.\n * Without this, OpenClaw keeps using the stale skill list even after restart.\n */\n private async invalidateSkillSnapshots(): Promise<void> {\n const sessionsPath = join(this.configDir, SESSIONS_REL, 'sessions.json');\n let raw: string;\n try {\n raw = await readFile(sessionsPath, 'utf-8');\n } catch {\n return;\n }\n\n try {\n const store = JSON.parse(raw) as Record<string, unknown>;\n let changed = false;\n\n for (const entry of Object.values(store)) {\n if (entry && typeof entry === 'object' && 'skillsSnapshot' in entry) {\n delete (entry as Record<string, unknown>).skillsSnapshot;\n changed = true;\n }\n }\n\n if (changed) {\n await writeFile(sessionsPath, JSON.stringify(store, null, 2), 'utf-8');\n }\n } catch {\n // best-effort\n }\n }\n\n /**\n * Inject evolution notification into all active session JSONL files.\n *\n * Old conversation history may contain stale skill listings from the agent.\n * The LLM repeats its previous answer instead of re-checking the system prompt.\n * By appending a user+assistant message pair about the evolution, we override\n * the stale context. Also resets systemSent to force system prompt rebuild.\n */\n private async injectEvolutionNotification(\n geneName: string,\n action: 'installed' | 'uninstalled',\n ): Promise<void> {\n const sessionsDir = join(this.configDir, SESSIONS_REL);\n const sessionsPath = join(sessionsDir, 'sessions.json');\n\n let raw: string;\n try {\n raw = await readFile(sessionsPath, 'utf-8');\n } catch {\n return;\n }\n\n const userText =\n action === 'installed'\n ? `[System] 基因系统通知: 你刚刚获取了新的基因「${geneName}」,完成了一轮进化。你的技能列表已更新,请以 system prompt 中 <available_skills> 为准。`\n : `[System] 基因系统通知: 基因「${geneName}」已遗忘。你的技能列表已更新,请以 system prompt 中 <available_skills> 为准。`;\n\n const assistantText =\n action === 'installed'\n ? `收到,我已获取新基因「${geneName}」并完成进化。我的技能列表已更新。`\n : `收到,基因「${geneName}」已遗忘。我的技能列表已更新。`;\n\n try {\n const store = JSON.parse(raw) as Record<string, unknown>;\n let storeChanged = false;\n\n for (const entry of Object.values(store)) {\n if (!entry || typeof entry !== 'object') continue;\n const rec = entry as Record<string, unknown>;\n const sessionFile = rec.sessionFile as string | undefined;\n if (!sessionFile) continue;\n\n const localPath = join(sessionsDir, basename(sessionFile));\n let content: string;\n try {\n content = (await readFile(localPath, 'utf-8')).trimEnd();\n if (!content) continue;\n } catch {\n continue;\n }\n\n try {\n const lastLine = content.split('\\n').pop() ?? '';\n const lastEntry = JSON.parse(lastLine) as Record<string, unknown>;\n const parentId = (lastEntry.id as string) ?? randomUUID().slice(0, 8);\n\n const now = new Date();\n const tsIso = now.toISOString();\n const tsMs = now.getTime();\n const userId = randomUUID().slice(0, 8);\n const assistantId = randomUUID().slice(0, 8);\n\n const modelProvider = (rec.modelProvider as string) ?? 'system';\n const modelName = (rec.model as string) ?? 'system';\n\n const userMsg = JSON.stringify({\n type: 'message',\n id: userId,\n parentId,\n timestamp: tsIso,\n message: {\n role: 'user',\n content: [{ type: 'text', text: userText }],\n timestamp: tsMs,\n },\n });\n\n const assistantMsg = JSON.stringify({\n type: 'message',\n id: assistantId,\n parentId: userId,\n timestamp: tsIso,\n message: {\n role: 'assistant',\n content: [{ type: 'text', text: assistantText }],\n api: 'openai-completions',\n provider: modelProvider,\n model: modelName,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'stop',\n timestamp: tsMs,\n },\n });\n\n await appendFile(localPath, `\\n${userMsg}\\n${assistantMsg}`, 'utf-8');\n } catch {\n continue;\n }\n\n rec.systemSent = false;\n storeChanged = true;\n }\n\n if (storeChanged) {\n await writeFile(sessionsPath, JSON.stringify(store, null, 2), 'utf-8');\n }\n } catch {\n // best-effort\n }\n }\n}\n\nfunction escapeRegex(str: string) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { GeneAdapter } from '@nodeskai/genehub-types';\nimport { GenericAdapter } from './generic.js';\nimport { NanobotAdapter } from './nanobot.js';\nimport { OpenClawAdapter } from './openclaw.js';\n\nconst ADAPTERS: (() => GeneAdapter)[] = [\n () => new OpenClawAdapter(),\n () => new NanobotAdapter(),\n () => new GenericAdapter(),\n];\n\nexport async function detectAdapter(): Promise<GeneAdapter> {\n for (const create of ADAPTERS) {\n const adapter = create();\n if (await adapter.detect()) {\n return adapter;\n }\n }\n return new GenericAdapter();\n}\n\nexport function getAdapter(product: string): GeneAdapter {\n switch (product) {\n case 'openclaw':\n return new OpenClawAdapter();\n case 'nanobot':\n return new NanobotAdapter();\n default:\n return new GenericAdapter();\n }\n}\n","import type {\n ApiResponse,\n Gene,\n GeneListParams,\n GeneManifest,\n GeneVersion,\n Genome,\n PaginatedData,\n ResolvedGene,\n} from '@nodeskai/genehub-types';\n\nexport type GeneHubClientOptions = {\n registryUrl: string;\n token?: string;\n};\n\nexport class GeneHubClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(options: GeneHubClientOptions) {\n this.baseUrl = options.registryUrl.replace(/\\/$/, '');\n this.token = options.token;\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(init?.headers as Record<string, string>),\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers });\n\n const json = (await res.json()) as ApiResponse<T> & { error_code?: string };\n\n if (!res.ok || json.code !== 0) {\n const msg = json.message || `HTTP ${res.status}`;\n throw new Error(`[GeneHub] ${json.error_code ?? 'error'}: ${msg}`);\n }\n\n return json.data;\n }\n\n async searchGenes(params: GeneListParams = {}): Promise<PaginatedData<Gene>> {\n const qs = new URLSearchParams();\n if (params.q) qs.set('q', params.q);\n if (params.category) qs.set('category', params.category);\n if (params.tags?.length) qs.set('tags', params.tags.join(','));\n if (params.compatibility) qs.set('compatibility', params.compatibility);\n if (params.sort) qs.set('sort', params.sort);\n if (params.page) qs.set('page', String(params.page));\n if (params.page_size) qs.set('page_size', String(params.page_size));\n\n const query = qs.toString();\n return this.request<PaginatedData<Gene>>(`/api/v1/genes${query ? `?${query}` : ''}`);\n }\n\n async getGene(slug: string): Promise<Gene> {\n return this.request<Gene>(`/api/v1/genes/${slug}`);\n }\n\n async getManifest(slug: string, version?: string): Promise<GeneManifest> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request<GeneManifest>(`/api/v1/genes/${slug}/manifest${qs}`);\n }\n\n async getVersions(slug: string): Promise<GeneVersion[]> {\n return this.request<GeneVersion[]>(`/api/v1/genes/${slug}/versions`);\n }\n\n async getVersion(slug: string, version: string): Promise<GeneVersion> {\n return this.request<GeneVersion>(`/api/v1/genes/${slug}/versions/${version}`);\n }\n\n async getGenome(slug: string): Promise<Genome> {\n return this.request<Genome>(`/api/v1/genomes/${slug}`);\n }\n\n async publishGene(manifest: GeneManifest): Promise<Gene> {\n return this.request<Gene>('/api/v1/genes', {\n method: 'POST',\n body: JSON.stringify({ manifest }),\n });\n }\n\n async publishVersion(slug: string, manifest: GeneManifest, changelog?: string): Promise<Gene> {\n return this.request<Gene>(`/api/v1/genes/${slug}/versions`, {\n method: 'POST',\n body: JSON.stringify({ manifest, changelog }),\n });\n }\n\n async resolve(\n slug: string,\n version?: string,\n product?: string,\n ): Promise<{ plan: ResolvedGene[]; warnings: string[] }> {\n return this.request(`/api/v1/resolve`, {\n method: 'POST',\n body: JSON.stringify({ slug, version, product }),\n });\n }\n\n async reportInstall(slug: string): Promise<void> {\n await this.request(`/api/v1/genes/${slug}/installed`, { method: 'POST', body: '{}' });\n }\n\n async reportEffectiveness(\n slug: string,\n report: { metric_type: string; value: number; context?: string },\n ): Promise<void> {\n await this.request(`/api/v1/genes/${slug}/effectiveness`, {\n method: 'POST',\n body: JSON.stringify(report),\n });\n }\n}\n","import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { GeneAdapter, GeneManifest } from '@nodeskai/genehub-types';\nimport { META_LEARNER_MANIFEST } from './meta-gene.js';\nimport { generateForgetTaskMarkdown, generateLearningTaskMarkdown } from './prompts.js';\nimport type { LearningResult, LearningTask } from './task.js';\n\nexport type LearningEngineOptions = {\n workspaceDir: string;\n adapter?: GeneAdapter;\n};\n\nexport class LearningEngine {\n private workspaceDir: string;\n private adapter?: GeneAdapter;\n\n constructor(options: LearningEngineOptions) {\n this.workspaceDir = options.workspaceDir;\n this.adapter = options.adapter;\n }\n\n private get tasksDir(): string {\n return join(this.workspaceDir, 'learning-tasks');\n }\n\n private get resultsDir(): string {\n return join(this.workspaceDir, 'learning-results');\n }\n\n async ensureMetaGeneInstalled(): Promise<boolean> {\n if (!this.adapter) return false;\n\n const installed = await this.adapter.isInstalled('genehub-learner');\n if (installed) return false;\n\n await this.adapter.install(META_LEARNER_MANIFEST, { force: true });\n await this.injectBootInstruction();\n return true;\n }\n\n private async injectBootInstruction(): Promise<void> {\n const agentsPath = join(this.workspaceDir, 'AGENTS.md');\n let content: string;\n try {\n content = await readFile(agentsPath, 'utf-8');\n } catch {\n return;\n }\n\n const BEGIN = '<!-- genehub:learning-boot -->';\n const END = '<!-- /genehub:learning-boot -->';\n\n if (content.includes(BEGIN)) return;\n\n const instruction = [\n '',\n BEGIN,\n '### GeneHub Learning',\n '',\n 'Check `learning-tasks/` for pending `.md` files. If any exist:',\n '',\n '1. Read `skills/genehub-learner/SKILL.md` for the full learning protocol',\n '2. Process each task file following those instructions',\n '3. Write results to `learning-results/`',\n '4. Log what you learned in `memory/YYYY-MM-DD.md`',\n END,\n ].join('\\n');\n\n const everySession = content.indexOf('## Every Session');\n if (everySession !== -1) {\n const nextSection = content.indexOf('\\n## ', everySession + 1);\n const insertPos = nextSection !== -1 ? nextSection : content.length;\n content = `${content.slice(0, insertPos)}\\n${instruction}\\n${content.slice(insertPos)}`;\n } else {\n content += `\\n${instruction}\\n`;\n }\n\n await writeFile(agentsPath, content, 'utf-8');\n }\n\n async createLearningTask(manifest: GeneManifest): Promise<LearningTask> {\n await this.ensureMetaGeneInstalled();\n\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.resultsDir, { recursive: true });\n\n const task: LearningTask = {\n mode: 'learn',\n task_id: `learn-${manifest.slug}-${Date.now()}`,\n gene_slug: manifest.slug,\n gene_name: manifest.name,\n gene_version: manifest.version,\n gene_content: manifest.skill.content ?? '',\n gene_meta: {\n name: manifest.name,\n description: manifest.description,\n category: manifest.category,\n short_description: manifest.short_description,\n },\n learning: manifest.learning\n ? {\n objectives: manifest.learning.objectives,\n scenarios: manifest.learning.scenarios,\n force_deep_learn: manifest.learning.force_deep_learn,\n }\n : undefined,\n callback_path: join(this.resultsDir, `${manifest.slug}.md`),\n created_at: new Date().toISOString(),\n };\n\n const md = generateLearningTaskMarkdown(task);\n await writeFile(join(this.tasksDir, `${manifest.slug}.md`), md, 'utf-8');\n\n return task;\n }\n\n async createForgetTask(slug: string, name: string, skillContent: string): Promise<void> {\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.resultsDir, { recursive: true });\n\n const callbackPath = join(this.resultsDir, `${slug}.md`);\n const md = generateForgetTaskMarkdown(slug, name, skillContent, callbackPath);\n await writeFile(join(this.tasksDir, `${slug}.md`), md, 'utf-8');\n }\n\n async checkResult(slug: string): Promise<LearningResult | null> {\n const resultPath = join(this.resultsDir, `${slug}.md`);\n\n try {\n const content = await readFile(resultPath, 'utf-8');\n return this.parseResult(content);\n } catch {\n return null;\n }\n }\n\n async listPendingTasks(): Promise<string[]> {\n try {\n const files = await readdir(this.tasksDir);\n const pending: string[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const slug = file.replace('.md', '');\n const result = await this.checkResult(slug);\n if (!result) {\n pending.push(slug);\n }\n }\n\n return pending;\n } catch {\n return [];\n }\n }\n\n async listCompletedResults(): Promise<LearningResult[]> {\n const results: LearningResult[] = [];\n\n try {\n const files = await readdir(this.resultsDir);\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const content = await readFile(join(this.resultsDir, file), 'utf-8');\n const result = this.parseResult(content);\n if (result) results.push(result);\n }\n } catch {\n // no results\n }\n\n return results;\n }\n\n async applyResult(slug: string, skillsDir: string): Promise<boolean> {\n const result = await this.checkResult(slug);\n if (!result) return false;\n\n if (result.decision === 'learned' && result.content) {\n const skillDir = join(skillsDir, slug);\n await mkdir(skillDir, { recursive: true });\n await writeFile(join(skillDir, 'SKILL.md'), result.content, 'utf-8');\n\n if (this.adapter?.notifySkillChange) {\n await this.adapter.notifySkillChange(slug, 'updated');\n }\n }\n\n await this.cleanupTask(slug);\n return true;\n }\n\n async cleanupTask(slug: string): Promise<void> {\n try {\n await rm(join(this.tasksDir, `${slug}.md`));\n } catch {\n /* ok */\n }\n try {\n await rm(join(this.resultsDir, `${slug}.md`));\n } catch {\n /* ok */\n }\n }\n\n private parseResult(content: string): LearningResult | null {\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) return null;\n\n const fm = fmMatch[1];\n const get = (key: string): string | undefined => {\n const m = fm.match(new RegExp(`^${key}:\\\\s*[\"']?(.+?)[\"']?\\\\s*$`, 'm'));\n return m?.[1];\n };\n\n const taskId = get('task_id');\n const geneSlug = get('gene_slug');\n const mode = get('mode') as LearningResult['mode'] | undefined;\n const decision = get('decision') as LearningResult['decision'] | undefined;\n\n if (!taskId || !geneSlug || !decision) return null;\n\n const bodyStart = content.indexOf('---', 4);\n const body = bodyStart !== -1 ? content.slice(bodyStart + 3).trim() : undefined;\n\n return {\n task_id: taskId,\n gene_slug: geneSlug,\n mode: mode ?? 'learn',\n decision,\n content: body || undefined,\n self_eval: get('self_eval') ? Number.parseFloat(get('self_eval') as string) : undefined,\n reason: get('reason'),\n completed_at: new Date().toISOString(),\n };\n }\n}\n","import type { GeneManifest } from '@nodeskai/genehub-types';\n\nconst SKILL_CONTENT = `---\nname: genehub-learner\nversion: 1.1.0\ndescription: GeneHub 基因管理与深度学习引擎\nmetadata:\n openclaw:\n always: true\n nanobot:\n always: true\n---\n\n# GeneHub 基因管理与学习引擎\n\n你具备通过 GeneHub 管理和深度学习新基因的能力。GeneHub 是你的基因库,提供各种可学习的技能基因。\n\n## 一、从 GeneHub 获取基因\n\n### 搜索可用基因\n\n\\`\\`\\`bash\ngenehub search <关键词>\ngenehub search --json <关键词>\n\\`\\`\\`\n\n### 查看已安装基因\n\n\\`\\`\\`bash\ngenehub list -p openclaw\n\\`\\`\\`\n\n### 安装基因(浅安装)\n\n直接安装 SKILL.md,不经过学习过程:\n\n\\`\\`\\`bash\ngenehub install <slug> -p openclaw\n\\`\\`\\`\n\n### 深度安装(推荐)\n\n安装后自动生成学习任务,你需要完成学习才能真正掌握:\n\n\\`\\`\\`bash\ngenehub install <slug> --learn -p openclaw\n\\`\\`\\`\n\n### 仅学习(不安装)\n\n从 Registry 获取基因内容生成学习任务,学习完成后再安装:\n\n\\`\\`\\`bash\ngenehub learn <slug> -p openclaw\n\\`\\`\\`\n\n### 检查学习结果\n\n学习完成后,验证并应用个性化版本:\n\n\\`\\`\\`bash\ngenehub learn --check <slug> -p openclaw\n\\`\\`\\`\n\n### 卸载基因\n\n\\`\\`\\`bash\ngenehub uninstall <slug> -p openclaw\n\\`\\`\\`\n\n## 二、处理学习任务\n\n每次会话开始时,检查 \\`learning-tasks/\\` 目录是否有待处理的学习任务。\n\n### 1. 发现任务\n\n\\`\\`\\`\nlearning-tasks/*.md\n\\`\\`\\`\n\n每个 \\`.md\\` 文件是一个待学习的基因任务,包含 YAML front matter 和任务详情。\n\n### 2. 执行学习\n\n对于每个任务:\n\n1. **阅读理解** — 仔细阅读技能原文,理解它要教你什么\n2. **完成目标** — 逐一完成 \\\\\\`学习目标\\\\\\` 中列出的 checklist\n3. **练习场景** — 如果有练习场景,认真完成每个场景的分析\n4. **个性化** — 基于你的理解和风格,改写技能内容为你自己的版本\n5. **自我评估** — 诚实评估你对该技能的掌握程度(0.0 - 1.0)\n\n### 3. 提交结果\n\n在 \\`learning-results/\\` 目录创建同名的 \\`.md\\` 文件:\n\n\\`\\`\\`markdown\n---\ntask_id: learn-code-review-1234567890\ngene_slug: code-review\nmode: learn\ndecision: learned\nself_eval: 0.85\nreason: \"我已深入理解代码审查的四个维度,并结合自己的经验进行了个性化\"\n---\n\n(你个性化后的 SKILL.md 完整内容放在这里)\n\\`\\`\\`\n\n### decision 选项\n\n| 值 | 含义 |\n|---|---|\n| \\`direct_install\\` | 技能内容很好,直接使用原版 |\n| \\`learned\\` | 已深度学习并生成了个性化版本(正文包含新 SKILL.md) |\n| \\`failed\\` | 学习失败(在 reason 中说明原因) |\n\n### 4. 记录心得\n\n学习完成后,将心得记录到 \\`memory/YYYY-MM-DD.md\\`。\n\n## 三、遗忘任务\n\n如果 \\`learning-tasks/\\` 中有 \\`mode: forget\\` 的任务:\n\n1. 回顾该技能的使用经验\n2. 决定完全遗忘(forgotten)还是保留精华(simplified)\n3. 将结果写入 \\`learning-results/\\`\n\n## 重要原则\n\n- **诚实自评** — 真正理解了才打高分\n- **真正个性化** — 融入你的理解和风格,不是复制粘贴\n- **记录过程** — 学习过程本身也是宝贵的记忆\n- **主动学习** — 发现新任务就立即开始,不等催促\n- **主动探索** — 当用户提到你不具备的能力时,尝试用 \\\\\\`genehub search\\\\\\` 搜索是否有对应基因`;\n\nexport const META_LEARNER_MANIFEST: GeneManifest = {\n slug: 'genehub-learner',\n name: 'GeneHub 学习引擎',\n version: '1.1.0',\n description: 'GeneHub 基因管理与学习引擎。提供从 GeneHub 搜索、安装、深度学习基因的完整能力。',\n short_description: '基因管理 + 深度学习引擎',\n category: 'efficiency',\n tags: ['ability'],\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: 'genehub-learner',\n always: true,\n content: SKILL_CONTENT,\n },\n rules: [],\n mcp_servers: [],\n learning: {\n force_deep_learn: false,\n objectives: [\n '掌握 genehub CLI 的搜索、安装、学习、卸载命令',\n '能够处理 learning-tasks/ 中的学习任务并提交结果',\n '能够生成个性化技能版本',\n ],\n scenarios: [],\n },\n};\n","import type { LearningTask } from './task.js';\n\nexport function generateLearningTaskMarkdown(task: LearningTask): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`task_id: ${task.task_id}`);\n lines.push(`mode: ${task.mode}`);\n lines.push(`gene_slug: ${task.gene_slug}`);\n lines.push(`gene_version: ${task.gene_version}`);\n lines.push(`callback_path: ${task.callback_path}`);\n lines.push(`created_at: ${task.created_at}`);\n lines.push('---');\n lines.push('');\n lines.push(`# 学习任务: ${task.gene_name}`);\n lines.push('');\n lines.push(`> 类别: ${task.gene_meta.category} | 版本: ${task.gene_version}`);\n lines.push('');\n lines.push(`${task.gene_meta.description}`);\n lines.push('');\n\n if (task.learning?.objectives?.length) {\n lines.push('## 学习目标');\n lines.push('');\n for (const obj of task.learning.objectives) {\n lines.push(`- [ ] ${obj}`);\n }\n lines.push('');\n }\n\n if (task.learning?.scenarios?.length) {\n lines.push('## 练习场景');\n lines.push('');\n for (let i = 0; i < task.learning.scenarios.length; i++) {\n const s = task.learning.scenarios[i];\n lines.push(`### 场景 ${i + 1}: ${s.title}`);\n lines.push('');\n lines.push(`**上下文**: ${s.context}`);\n lines.push('');\n lines.push(`**预期关注点**: ${s.expected_focus}`);\n lines.push('');\n lines.push('**你的练习**:');\n lines.push('');\n lines.push('(请在此处记录你对该场景的分析和应对方案)');\n lines.push('');\n }\n }\n\n lines.push('## 技能原文');\n lines.push('');\n lines.push('```');\n lines.push(task.gene_content);\n lines.push('```');\n lines.push('');\n lines.push('## 完成学习');\n lines.push('');\n lines.push('学习完成后,请执行以下操作:');\n lines.push('');\n lines.push(`1. 在 \\`${task.callback_path}\\` 创建学习结果文件`);\n lines.push('2. 包含 YAML front matter(task_id, decision, self_eval)');\n lines.push('3. 如果你个性化了技能内容,将修改后的 SKILL.md 内容放在正文中');\n lines.push('');\n lines.push('### 结果文件模板');\n lines.push('');\n lines.push('```markdown');\n lines.push('---');\n lines.push(`task_id: ${task.task_id}`);\n lines.push(`gene_slug: ${task.gene_slug}`);\n lines.push(`mode: ${task.mode}`);\n lines.push('decision: learned # direct_install | learned | failed');\n lines.push('self_eval: 0.8 # 0.0 - 1.0 自评分');\n lines.push('reason: \"我已理解并个性化了该技能\"');\n lines.push('---');\n lines.push('');\n lines.push('(如果 decision 为 learned,在此放入个性化后的 SKILL.md 内容)');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\nexport function generateForgetTaskMarkdown(\n slug: string,\n name: string,\n skillContent: string,\n callbackPath: string,\n): string {\n const taskId = `forget-${slug}-${Date.now()}`;\n return [\n '---',\n `task_id: ${taskId}`,\n 'mode: forget',\n `gene_slug: ${slug}`,\n `callback_path: ${callbackPath}`,\n `created_at: ${new Date().toISOString()}`,\n '---',\n '',\n `# 遗忘任务: ${name}`,\n '',\n '请回顾你使用该技能的经验,然后决定:',\n '',\n '- **forgotten**: 完全遗忘,清除所有痕迹',\n '- **simplified**: 保留精华,简化为更短的技能描述',\n '',\n '## 当前技能内容',\n '',\n '```',\n skillContent,\n '```',\n '',\n `请将遗忘结果写入 \\`${callbackPath}\\``,\n ].join('\\n');\n}\n"],"mappings":"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","names":["mkdir","readdir","readFile","rm","stat","writeFile","join","join","stat","mkdir","writeFile","rm","readdir","readFile","mkdir","readdir","readFile","rm","stat","writeFile","homedir","join","join","homedir","stat","mkdir","writeFile","rm","readdir","readFile","mkdir","readdir","readFile","rm","writeFile","join","join","readFile","writeFile","mkdir","readdir","rm"]}
1
+ {"version":3,"sources":["../src/adapters/generic.ts","../src/adapters/base.ts","../src/adapters/nanobot.ts","../src/adapters/openclaw.ts","../src/adapters/index.ts","../src/client.ts","../src/learning/engine.ts","../src/learning/meta-gene.ts","../src/learning/prompts.ts"],"sourcesContent":["import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { stringify } from 'yaml';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_DIR = join(process.cwd(), '.genehub', 'genes');\n\nexport class GenericAdapter extends BaseAdapter {\n readonly product = 'generic';\n private genesDir: string;\n\n constructor(options?: { genesDir?: string }) {\n super();\n this.genesDir = options?.genesDir ?? DEFAULT_DIR;\n }\n\n async detect(): Promise<boolean> {\n return true;\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.slug)\n : join(this.genesDir, manifest.slug);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const yamlPath = join(targetDir, 'gene.yaml');\n await writeFile(yamlPath, stringify(manifest), 'utf-8');\n files.push(yamlPath);\n\n if (manifest.skill.content) {\n const skillPath = join(targetDir, 'SKILL.md');\n await writeFile(skillPath, manifest.skill.content, 'utf-8');\n files.push(skillPath);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected override async doInstallFromDirectory(\n geneDir: string,\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.slug)\n : join(this.genesDir, manifest.slug);\n\n await cp(geneDir, targetDir, { recursive: true });\n\n const files: string[] = [];\n async function collectFiles(dir: string) {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) await collectFiles(full);\n else files.push(full);\n }\n }\n await collectFiles(targetDir);\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.genesDir, slug);\n try {\n await rm(targetDir, { recursive: true });\n } catch {\n // already removed\n }\n return { success: true, slug, files: [targetDir], needsRestart: false };\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.genesDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const yamlPath = join(this.genesDir, dir.name, 'gene.yaml');\n try {\n const s = await stat(yamlPath);\n const raw = await readFile(yamlPath, 'utf-8');\n const versionMatch = raw.match(/^version:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n results.push({\n slug: dir.name,\n version: versionMatch?.[1] ?? 'unknown',\n installedAt: s.mtime.toISOString(),\n files: [yamlPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.genesDir, slug, 'gene.yaml'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const raw = await readFile(join(this.genesDir, slug, 'gene.yaml'), 'utf-8');\n const match = raw.match(/^version:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n}\n","import type {\n GeneAdapter,\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\n\nexport abstract class BaseAdapter implements GeneAdapter {\n abstract readonly product: string;\n\n abstract detect(): Promise<boolean>;\n\n async install(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult> {\n const result = await this.doInstall(manifest, options);\n await this.onPostInstall(manifest, result);\n return result;\n }\n\n async installFromDirectory(\n geneDir: string,\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const result = await this.doInstallFromDirectory(geneDir, manifest, options);\n await this.onPostInstall(manifest, result);\n return result;\n }\n\n protected abstract doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult>;\n\n protected async doInstallFromDirectory(\n _geneDir: string,\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n return this.doInstall(manifest, options);\n }\n\n protected async onPostInstall(_manifest: GeneManifest, _result: InstallResult): Promise<void> {}\n\n protected async onPostUninstall(_slug: string, _result: UninstallResult): Promise<void> {}\n\n async uninstall(slug: string, options?: UninstallOptions): Promise<UninstallResult> {\n const result = await this.doUninstall(slug, options);\n await this.onPostUninstall(slug, result);\n return result;\n }\n\n protected abstract doUninstall(\n slug: string,\n options?: UninstallOptions,\n ): Promise<UninstallResult>;\n\n abstract list(): Promise<InstalledGene[]>;\n\n abstract isInstalled(slug: string): Promise<boolean>;\n\n abstract getInstalledVersion(slug: string): Promise<string | null>;\n\n protected generateSkillContent(manifest: GeneManifest, metadataNamespace: string): string {\n const skillMeta = manifest.skill.always ? 'true' : 'false';\n const frontMatter = [\n '---',\n `name: ${manifest.skill.name}`,\n `version: ${manifest.version}`,\n `description: ${manifest.short_description}`,\n 'metadata:',\n ` ${metadataNamespace}:`,\n ` always: ${skillMeta}`,\n '---',\n ].join('\\n');\n\n if (manifest.skill.content) {\n const content = manifest.skill.content.trim();\n if (content.startsWith('---')) {\n return content;\n }\n return `${frontMatter}\\n\\n${content}`;\n }\n\n return frontMatter;\n }\n\n protected parseSkillVersion(content: string): string | null {\n const match = content.match(/^---[\\s\\S]*?version:\\s*(.+?)[\\s\\n][\\s\\S]*?---/m);\n return match?.[1]?.trim() ?? null;\n }\n}\n","import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_WORKSPACE = join(homedir(), '.nanobot', 'workspace');\n\nexport class NanobotAdapter extends BaseAdapter {\n readonly product = 'nanobot';\n private workspace: string;\n\n constructor(options?: { workspace?: string }) {\n super();\n this.workspace = options?.workspace ?? DEFAULT_WORKSPACE;\n }\n\n private get skillsDir(): string {\n return join(this.workspace, 'skills');\n }\n\n async detect(): Promise<boolean> {\n try {\n await stat(join(homedir(), '.nanobot', 'config.json'));\n return true;\n } catch {\n return false;\n }\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const skillContent = this.buildNanobotSkillContent(manifest);\n const skillPath = join(targetDir, 'SKILL.md');\n await writeFile(skillPath, skillContent, 'utf-8');\n files.push(skillPath);\n\n if (manifest.mcp_servers.length > 0) {\n await this.mergeNanobotMcpConfig(manifest.mcp_servers);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected override async doInstallFromDirectory(\n geneDir: string,\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n await cp(geneDir, targetDir, { recursive: true });\n\n if (manifest.mcp_servers.length > 0) {\n await this.mergeNanobotMcpConfig(manifest.mcp_servers);\n }\n\n const files: string[] = [];\n async function collectFiles(dir: string) {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) await collectFiles(full);\n else files.push(full);\n }\n }\n await collectFiles(targetDir);\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void> {\n await this.writeMemoryEntry(manifest, 'install');\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.skillsDir, slug);\n const files: string[] = [];\n\n try {\n await rm(targetDir, { recursive: true });\n files.push(targetDir);\n } catch {\n // already removed\n }\n\n return { success: true, slug, files, needsRestart: false };\n }\n\n protected async onPostUninstall(slug: string, _result: UninstallResult): Promise<void> {\n await this.writeMemoryEntry(\n { slug, name: slug, version: 'unknown' } as GeneManifest,\n 'uninstall',\n );\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.skillsDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const skillPath = join(this.skillsDir, dir.name, 'SKILL.md');\n try {\n const s = await stat(skillPath);\n const content = await readFile(skillPath, 'utf-8');\n const version = this.parseSkillVersion(content) ?? 'unknown';\n results.push({\n slug: dir.name,\n version,\n installedAt: s.mtime.toISOString(),\n files: [skillPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.skillsDir, slug, 'SKILL.md'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const content = await readFile(join(this.skillsDir, slug, 'SKILL.md'), 'utf-8');\n return this.parseSkillVersion(content);\n } catch {\n return null;\n }\n }\n\n async triggerLearning(prompt: string): Promise<void> {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n const escaped = prompt.replace(/\"/g, '\\\\\"');\n try {\n await execAsync(`nanobot run --prompt \"${escaped}\"`, { timeout: 5000 });\n } catch {\n // fire-and-forget: nanobot CLI support is tentative\n }\n }\n\n private async writeMemoryEntry(\n manifest: GeneManifest,\n action: 'install' | 'uninstall',\n ): Promise<void> {\n const memoryDir = join(this.workspace, 'memory');\n await mkdir(memoryDir, { recursive: true });\n\n const today = new Date().toISOString().slice(0, 10);\n const memoryPath = join(memoryDir, `${today}.md`);\n\n let existing = '';\n try {\n existing = await readFile(memoryPath, 'utf-8');\n } catch {\n /* new file */\n }\n\n const time = new Date().toLocaleTimeString('zh-CN', { hour12: false });\n const verb = action === 'install' ? '学习了' : '遗忘了';\n const entry = `\\n- [${time}] 通过 GeneHub ${verb}基因: **${manifest.name ?? manifest.slug}** v${manifest.version ?? '?'}\\n`;\n\n await writeFile(memoryPath, existing + entry, 'utf-8');\n }\n\n private buildNanobotSkillContent(manifest: GeneManifest): string {\n if (manifest.skill.content?.trim().startsWith('---')) {\n return manifest.skill.content;\n }\n\n return this.generateSkillContent(manifest, 'nanobot');\n }\n\n private async mergeNanobotMcpConfig(mcpServers: GeneManifest['mcp_servers']): Promise<void> {\n const configPath = join(homedir(), '.nanobot', 'config.json');\n\n let config: Record<string, unknown> = {};\n try {\n const raw = await readFile(configPath, 'utf-8');\n config = JSON.parse(raw);\n } catch {\n return;\n }\n\n if (!config.tools) config.tools = {};\n const tools = config.tools as Record<string, unknown>;\n if (!tools.mcpServers) tools.mcpServers = {};\n const servers = tools.mcpServers as Record<string, unknown>;\n\n for (const srv of mcpServers) {\n if (servers[srv.name]) continue;\n servers[srv.name] = {\n ...(srv.command ? { command: srv.command, args: srv.args ?? [], env: srv.env ?? {} } : {}),\n ...(srv.url ? { url: srv.url, headers: srv.headers ?? {} } : {}),\n };\n }\n\n await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { appendFile, cp, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.openclaw');\nconst DEFAULT_WORKSPACE_DIR = join(DEFAULT_CONFIG_DIR, 'workspace');\nconst DEFAULT_SKILLS_DIR = join(DEFAULT_WORKSPACE_DIR, 'skills');\nconst DEFAULT_CONFIG_PATH = join(DEFAULT_CONFIG_DIR, 'openclaw.json');\nconst SESSIONS_REL = join('agents', 'main', 'sessions');\n\nexport class OpenClawAdapter extends BaseAdapter {\n readonly product = 'openclaw';\n private skillsDir: string;\n private configPath: string;\n private configDir: string;\n private workspaceDir: string;\n\n constructor(options?: {\n skillsDir?: string;\n configPath?: string;\n workspaceDir?: string;\n configDir?: string;\n }) {\n super();\n this.configDir = options?.configDir ?? DEFAULT_CONFIG_DIR;\n this.workspaceDir = options?.workspaceDir ?? DEFAULT_WORKSPACE_DIR;\n this.skillsDir = options?.skillsDir ?? DEFAULT_SKILLS_DIR;\n this.configPath = options?.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async detect(): Promise<boolean> {\n try {\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const skillPath = join(targetDir, 'SKILL.md');\n const content = this.generateSkillContent(manifest, 'openclaw');\n await writeFile(skillPath, content, 'utf-8');\n files.push(skillPath);\n\n if (manifest.config?.openclaw) {\n await this.mergeOpenClawConfig(manifest.config.openclaw);\n files.push(this.configPath);\n }\n\n if (manifest.mcp_servers?.length) {\n await this.mergeMcpServers(manifest.mcp_servers);\n files.push(this.configPath);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files: [...new Set(files)],\n needsRestart: true,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected override async doInstallFromDirectory(\n geneDir: string,\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n await cp(geneDir, targetDir, { recursive: true });\n\n if (manifest.config?.openclaw) {\n await this.mergeOpenClawConfig(manifest.config.openclaw);\n }\n if (manifest.mcp_servers?.length) {\n await this.mergeMcpServers(manifest.mcp_servers);\n }\n\n const files: string[] = [];\n async function collectFiles(dir: string) {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) await collectFiles(full);\n else files.push(full);\n }\n }\n await collectFiles(targetDir);\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: true,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void> {\n await this.updateAgentsMd(manifest, 'add');\n await this.writeMemoryEntry(manifest, 'install');\n await this.invalidateSkillSnapshots();\n await this.injectEvolutionNotification(manifest.name ?? manifest.slug, 'installed');\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.skillsDir, slug);\n const files: string[] = [];\n\n try {\n await rm(targetDir, { recursive: true });\n files.push(targetDir);\n } catch {\n // already removed\n }\n\n return { success: true, slug, files, needsRestart: true };\n }\n\n protected async onPostUninstall(slug: string, _result: UninstallResult): Promise<void> {\n await this.updateAgentsMd({ slug } as GeneManifest, 'remove');\n await this.writeMemoryEntry(\n { slug, name: slug, version: 'unknown' } as GeneManifest,\n 'uninstall',\n );\n await this.invalidateSkillSnapshots();\n await this.injectEvolutionNotification(slug, 'uninstalled');\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.skillsDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const skillPath = join(this.skillsDir, dir.name, 'SKILL.md');\n try {\n const s = await stat(skillPath);\n const content = await readFile(skillPath, 'utf-8');\n const version = this.parseSkillVersion(content) ?? 'unknown';\n results.push({\n slug: dir.name,\n version,\n installedAt: s.mtime.toISOString(),\n files: [skillPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.skillsDir, slug, 'SKILL.md'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const content = await readFile(join(this.skillsDir, slug, 'SKILL.md'), 'utf-8');\n return this.parseSkillVersion(content);\n } catch {\n return null;\n }\n }\n\n private async updateAgentsMd(manifest: GeneManifest, action: 'add' | 'remove'): Promise<void> {\n const agentsPath = join(this.workspaceDir, 'AGENTS.md');\n let content: string;\n try {\n content = await readFile(agentsPath, 'utf-8');\n } catch {\n return;\n }\n\n const marker = `<!-- genehub:${manifest.slug} -->`;\n const endMarker = `<!-- /genehub:${manifest.slug} -->`;\n\n const existingPattern = new RegExp(\n `${escapeRegex(marker)}[\\\\s\\\\S]*?${escapeRegex(endMarker)}\\\\n?`,\n );\n content = content.replace(existingPattern, '');\n\n if (action === 'add') {\n const geneBlock = [\n marker,\n `- **${manifest.name ?? manifest.slug}** (v${manifest.version}) — ${manifest.short_description ?? ''}`,\n endMarker,\n ].join('\\n');\n\n const toolsSection = content.indexOf('## Tools');\n if (toolsSection !== -1) {\n const nextSection = content.indexOf('\\n## ', toolsSection + 1);\n const insertPos = nextSection !== -1 ? nextSection : content.length;\n content = `${content.slice(0, insertPos)}\\n${geneBlock}\\n${content.slice(insertPos)}`;\n } else {\n content += `\\n\\n## GeneHub Skills\\n\\n${geneBlock}\\n`;\n }\n }\n\n if (action === 'remove' && manifest.slug === 'genehub-learner') {\n const bootBegin = '<!-- genehub:learning-boot -->';\n const bootEnd = '<!-- /genehub:learning-boot -->';\n const bootPattern = new RegExp(\n `\\\\n?${escapeRegex(bootBegin)}[\\\\s\\\\S]*?${escapeRegex(bootEnd)}\\\\n?`,\n );\n content = content.replace(bootPattern, '');\n }\n\n await writeFile(agentsPath, content, 'utf-8');\n }\n\n private async writeMemoryEntry(\n manifest: GeneManifest,\n action: 'install' | 'uninstall',\n ): Promise<void> {\n const memoryDir = join(this.workspaceDir, 'memory');\n await mkdir(memoryDir, { recursive: true });\n\n const today = new Date().toISOString().slice(0, 10);\n const memoryPath = join(memoryDir, `${today}.md`);\n\n let existing = '';\n try {\n existing = await readFile(memoryPath, 'utf-8');\n } catch {\n // new file\n }\n\n const time = new Date().toLocaleTimeString('zh-CN', { hour12: false });\n const verb = action === 'install' ? '学习了' : '遗忘了';\n const entry = `\\n- [${time}] 通过 GeneHub ${verb}基因: **${manifest.name ?? manifest.slug}** v${manifest.version ?? '?'}\\n`;\n\n await writeFile(memoryPath, existing + entry, 'utf-8');\n }\n\n private async mergeOpenClawConfig(config: NonNullable<GeneManifest['config']>['openclaw']) {\n if (!config) return;\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await readFile(this.configPath, 'utf-8');\n existing = JSON.parse(raw);\n } catch {\n // no existing config\n }\n\n if (config.openclaw_config) {\n Object.assign(existing, config.openclaw_config);\n }\n\n if (config.tool_allow) {\n const current = ((existing.tools as Record<string, unknown>)?.allow as string[]) ?? [];\n const merged = [...new Set([...current, ...config.tool_allow])];\n if (!existing.tools) existing.tools = {};\n (existing.tools as Record<string, unknown>).allow = merged;\n }\n\n await writeFile(this.configPath, JSON.stringify(existing, null, 2), 'utf-8');\n }\n\n private async mergeMcpServers(servers: NonNullable<GeneManifest['mcp_servers']>) {\n if (!servers?.length) return;\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await readFile(this.configPath, 'utf-8');\n existing = JSON.parse(raw);\n } catch {\n return;\n }\n\n const mcpServers = (existing.mcpServers ?? {}) as Record<string, unknown>;\n for (const server of servers) {\n mcpServers[server.name] = {\n transport: server.transport,\n command: server.command,\n args: server.args,\n env: server.env,\n };\n }\n existing.mcpServers = mcpServers;\n\n await writeFile(this.configPath, JSON.stringify(existing, null, 2), 'utf-8');\n }\n\n async triggerLearning(prompt: string): Promise<void> {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n const escaped = prompt.replace(/\"/g, '\\\\\"');\n try {\n await execAsync(`openclaw agent --message \"${escaped}\"`, { timeout: 5000 });\n } catch {\n // fire-and-forget: the command may keep running after timeout\n }\n }\n\n async notifySkillChange(\n geneName: string,\n action: 'installed' | 'updated' | 'uninstalled',\n ): Promise<void> {\n await this.invalidateSkillSnapshots();\n const notifyAction = action === 'uninstalled' ? 'uninstalled' : 'installed';\n await this.injectEvolutionNotification(geneName, notifyAction);\n }\n\n /**\n * Clear cached skillsSnapshot from all OpenClaw sessions.\n * Without this, OpenClaw keeps using the stale skill list even after restart.\n */\n private async invalidateSkillSnapshots(): Promise<void> {\n const sessionsPath = join(this.configDir, SESSIONS_REL, 'sessions.json');\n let raw: string;\n try {\n raw = await readFile(sessionsPath, 'utf-8');\n } catch {\n return;\n }\n\n try {\n const store = JSON.parse(raw) as Record<string, unknown>;\n let changed = false;\n\n for (const entry of Object.values(store)) {\n if (entry && typeof entry === 'object' && 'skillsSnapshot' in entry) {\n delete (entry as Record<string, unknown>).skillsSnapshot;\n changed = true;\n }\n }\n\n if (changed) {\n await writeFile(sessionsPath, JSON.stringify(store, null, 2), 'utf-8');\n }\n } catch {\n // best-effort\n }\n }\n\n /**\n * Inject evolution notification into all active session JSONL files.\n *\n * Old conversation history may contain stale skill listings from the agent.\n * The LLM repeats its previous answer instead of re-checking the system prompt.\n * By appending a user+assistant message pair about the evolution, we override\n * the stale context. Also resets systemSent to force system prompt rebuild.\n */\n private async injectEvolutionNotification(\n geneName: string,\n action: 'installed' | 'uninstalled',\n ): Promise<void> {\n const sessionsDir = join(this.configDir, SESSIONS_REL);\n const sessionsPath = join(sessionsDir, 'sessions.json');\n\n let raw: string;\n try {\n raw = await readFile(sessionsPath, 'utf-8');\n } catch {\n return;\n }\n\n const userText =\n action === 'installed'\n ? `[System] 基因系统通知: 你刚刚获取了新的基因「${geneName}」,完成了一轮进化。你的技能列表已更新,请以 system prompt 中 <available_skills> 为准。`\n : `[System] 基因系统通知: 基因「${geneName}」已遗忘。你的技能列表已更新,请以 system prompt 中 <available_skills> 为准。`;\n\n const assistantText =\n action === 'installed'\n ? `收到,我已获取新基因「${geneName}」并完成进化。我的技能列表已更新。`\n : `收到,基因「${geneName}」已遗忘。我的技能列表已更新。`;\n\n try {\n const store = JSON.parse(raw) as Record<string, unknown>;\n let storeChanged = false;\n\n for (const entry of Object.values(store)) {\n if (!entry || typeof entry !== 'object') continue;\n const rec = entry as Record<string, unknown>;\n const sessionFile = rec.sessionFile as string | undefined;\n if (!sessionFile) continue;\n\n const localPath = join(sessionsDir, basename(sessionFile));\n let content: string;\n try {\n content = (await readFile(localPath, 'utf-8')).trimEnd();\n if (!content) continue;\n } catch {\n continue;\n }\n\n try {\n const lastLine = content.split('\\n').pop() ?? '';\n const lastEntry = JSON.parse(lastLine) as Record<string, unknown>;\n const parentId = (lastEntry.id as string) ?? randomUUID().slice(0, 8);\n\n const now = new Date();\n const tsIso = now.toISOString();\n const tsMs = now.getTime();\n const userId = randomUUID().slice(0, 8);\n const assistantId = randomUUID().slice(0, 8);\n\n const modelProvider = (rec.modelProvider as string) ?? 'system';\n const modelName = (rec.model as string) ?? 'system';\n\n const userMsg = JSON.stringify({\n type: 'message',\n id: userId,\n parentId,\n timestamp: tsIso,\n message: {\n role: 'user',\n content: [{ type: 'text', text: userText }],\n timestamp: tsMs,\n },\n });\n\n const assistantMsg = JSON.stringify({\n type: 'message',\n id: assistantId,\n parentId: userId,\n timestamp: tsIso,\n message: {\n role: 'assistant',\n content: [{ type: 'text', text: assistantText }],\n api: 'openai-completions',\n provider: modelProvider,\n model: modelName,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'stop',\n timestamp: tsMs,\n },\n });\n\n await appendFile(localPath, `\\n${userMsg}\\n${assistantMsg}`, 'utf-8');\n } catch {\n continue;\n }\n\n rec.systemSent = false;\n storeChanged = true;\n }\n\n if (storeChanged) {\n await writeFile(sessionsPath, JSON.stringify(store, null, 2), 'utf-8');\n }\n } catch {\n // best-effort\n }\n }\n}\n\nfunction escapeRegex(str: string) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { GeneAdapter } from '@nodeskai/genehub-types';\nimport { GenericAdapter } from './generic.js';\nimport { NanobotAdapter } from './nanobot.js';\nimport { OpenClawAdapter } from './openclaw.js';\n\nconst ADAPTERS: (() => GeneAdapter)[] = [\n () => new OpenClawAdapter(),\n () => new NanobotAdapter(),\n () => new GenericAdapter(),\n];\n\nexport async function detectAdapter(): Promise<GeneAdapter> {\n for (const create of ADAPTERS) {\n const adapter = create();\n if (await adapter.detect()) {\n return adapter;\n }\n }\n return new GenericAdapter();\n}\n\nexport function getAdapter(product: string): GeneAdapter {\n switch (product) {\n case 'openclaw':\n return new OpenClawAdapter();\n case 'nanobot':\n return new NanobotAdapter();\n default:\n return new GenericAdapter();\n }\n}\n","import type {\n AgentTemplate,\n AgentTemplateListParams,\n AgentTemplateVersion,\n ApiResponse,\n CreateAgentTemplateRequest,\n CreateGenomeRequest,\n Gene,\n GeneListParams,\n GeneManifest,\n GeneVersion,\n Genome,\n GenomeListParams,\n GenomeResolveResult,\n GenomeVersion,\n PaginatedData,\n PublishAgentTemplateVersionRequest,\n PublishGenomeVersionRequest,\n ResolvedGene,\n} from '@nodeskai/genehub-types';\n\nexport type GeneHubClientOptions = {\n registryUrl: string;\n token?: string;\n};\n\nexport class GeneHubClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(options: GeneHubClientOptions) {\n this.baseUrl = options.registryUrl.replace(/\\/$/, '');\n this.token = options.token;\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(init?.headers as Record<string, string>),\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers });\n\n const json = (await res.json()) as ApiResponse<T> & { error_code?: string };\n\n if (!res.ok || json.code !== 0) {\n const msg = json.message || `HTTP ${res.status}`;\n throw new Error(`[GeneHub] ${json.error_code ?? 'error'}: ${msg}`);\n }\n\n return json.data;\n }\n\n // ── Gene ──\n\n async searchGenes(params: GeneListParams = {}): Promise<PaginatedData<Gene>> {\n const qs = new URLSearchParams();\n if (params.q) qs.set('q', params.q);\n if (params.category) qs.set('category', params.category);\n if (params.tags?.length) qs.set('tags', params.tags.join(','));\n if (params.compatibility) qs.set('compatibility', params.compatibility);\n if (params.sort) qs.set('sort', params.sort);\n if (params.page) qs.set('page', String(params.page));\n if (params.page_size) qs.set('page_size', String(params.page_size));\n\n const query = qs.toString();\n return this.request<PaginatedData<Gene>>(`/api/v1/genes${query ? `?${query}` : ''}`);\n }\n\n async getGene(slug: string): Promise<Gene> {\n return this.request<Gene>(`/api/v1/genes/${slug}`);\n }\n\n async getManifest(slug: string, version?: string): Promise<GeneManifest> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request<GeneManifest>(`/api/v1/genes/${slug}/manifest${qs}`);\n }\n\n async getVersions(slug: string): Promise<GeneVersion[]> {\n return this.request<GeneVersion[]>(`/api/v1/genes/${slug}/versions`);\n }\n\n async getVersion(slug: string, version: string): Promise<GeneVersion> {\n return this.request<GeneVersion>(`/api/v1/genes/${slug}/versions/${version}`);\n }\n\n async publishGene(manifest: GeneManifest, files?: Record<string, string>): Promise<Gene> {\n return this.request<Gene>('/api/v1/genes', {\n method: 'POST',\n body: JSON.stringify({ manifest, files }),\n });\n }\n\n async publishVersion(\n slug: string,\n manifest: GeneManifest,\n changelog?: string,\n files?: Record<string, string>,\n ): Promise<Gene> {\n return this.request<Gene>(`/api/v1/genes/${slug}/versions`, {\n method: 'POST',\n body: JSON.stringify({ manifest, changelog, files }),\n });\n }\n\n async getGeneFiles(\n slug: string,\n version?: string,\n ): Promise<{ path: string; size: number; sha: string; type: string }[]> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request(`/api/v1/genes/${slug}/files${qs}`);\n }\n\n async getGeneFileContent(\n slug: string,\n filePath: string,\n version?: string,\n ): Promise<{ path: string; content: string }> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request(`/api/v1/genes/${slug}/files/${filePath}${qs}`);\n }\n\n async downloadArchive(slug: string, version?: string): Promise<ArrayBuffer> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n const url = `${this.baseUrl}/api/v1/genes/${slug}/archive${qs}`;\n const headers: Record<string, string> = {};\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n const res = await fetch(url, { headers });\n if (!res.ok) {\n throw new Error(`[GeneHub] Download archive failed: HTTP ${res.status}`);\n }\n return res.arrayBuffer();\n }\n\n async resolve(\n slug: string,\n version?: string,\n product?: string,\n ): Promise<{ plan: ResolvedGene[]; warnings: string[] }> {\n return this.request(`/api/v1/resolve`, {\n method: 'POST',\n body: JSON.stringify({ slug, version, product }),\n });\n }\n\n async reportInstall(slug: string): Promise<void> {\n await this.request(`/api/v1/genes/${slug}/installed`, { method: 'POST', body: '{}' });\n }\n\n async reportEffectiveness(\n slug: string,\n report: { metric_type: string; value: number; context?: string },\n ): Promise<void> {\n await this.request(`/api/v1/genes/${slug}/effectiveness`, {\n method: 'POST',\n body: JSON.stringify(report),\n });\n }\n\n // ── Genome ──\n\n async searchGenomes(params: GenomeListParams = {}): Promise<PaginatedData<Genome>> {\n const qs = new URLSearchParams();\n if (params.q) qs.set('q', params.q);\n if (params.category) qs.set('category', params.category);\n if (params.sort) qs.set('sort', params.sort);\n if (params.page) qs.set('page', String(params.page));\n if (params.page_size) qs.set('page_size', String(params.page_size));\n\n const query = qs.toString();\n return this.request<PaginatedData<Genome>>(`/api/v1/genomes${query ? `?${query}` : ''}`);\n }\n\n async getGenome(slug: string): Promise<Genome> {\n return this.request<Genome>(`/api/v1/genomes/${slug}`);\n }\n\n async getGenomeVersions(slug: string): Promise<GenomeVersion[]> {\n return this.request<GenomeVersion[]>(`/api/v1/genomes/${slug}/versions`);\n }\n\n async getGenomeVersion(slug: string, version: string): Promise<GenomeVersion> {\n return this.request<GenomeVersion>(`/api/v1/genomes/${slug}/versions/${version}`);\n }\n\n async resolveGenome(\n slug: string,\n version?: string,\n product?: string,\n ): Promise<GenomeResolveResult> {\n const qs = new URLSearchParams();\n if (version) qs.set('version', version);\n if (product) qs.set('product', product);\n const query = qs.toString();\n return this.request<GenomeResolveResult>(\n `/api/v1/genomes/${slug}/resolve${query ? `?${query}` : ''}`,\n );\n }\n\n async publishGenome(data: CreateGenomeRequest, files?: Record<string, string>): Promise<Genome> {\n return this.request<Genome>('/api/v1/genomes', {\n method: 'POST',\n body: JSON.stringify({ ...data, files }),\n });\n }\n\n async publishGenomeVersion(\n slug: string,\n data: PublishGenomeVersionRequest,\n files?: Record<string, string>,\n ): Promise<Genome> {\n return this.request<Genome>(`/api/v1/genomes/${slug}/versions`, {\n method: 'POST',\n body: JSON.stringify({ ...data, files }),\n });\n }\n\n async getGenomeFiles(\n slug: string,\n version?: string,\n ): Promise<{ path: string; size: number; sha: string; type: string }[]> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request(`/api/v1/genomes/${slug}/files${qs}`);\n }\n\n async getGenomeFileContent(\n slug: string,\n filePath: string,\n version?: string,\n ): Promise<{ path: string; content: string }> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request(`/api/v1/genomes/${slug}/files/${filePath}${qs}`);\n }\n\n async downloadGenomeArchive(slug: string, version?: string): Promise<ArrayBuffer> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n const url = `${this.baseUrl}/api/v1/genomes/${slug}/archive${qs}`;\n const headers: Record<string, string> = {};\n if (this.token) headers.Authorization = `Bearer ${this.token}`;\n const res = await fetch(url, { headers });\n if (!res.ok) throw new Error(`[GeneHub] Download genome archive failed: HTTP ${res.status}`);\n return res.arrayBuffer();\n }\n\n async reportGenomeInstall(slug: string): Promise<void> {\n await this.request(`/api/v1/genomes/${slug}/installed`, { method: 'POST', body: '{}' });\n }\n\n // ── Agent Template ──\n\n async searchTemplates(\n params: AgentTemplateListParams = {},\n ): Promise<PaginatedData<AgentTemplate>> {\n const qs = new URLSearchParams();\n if (params.q) qs.set('q', params.q);\n if (params.category) qs.set('category', params.category);\n if (params.role) qs.set('role', params.role);\n if (params.sort) qs.set('sort', params.sort);\n if (params.page) qs.set('page', String(params.page));\n if (params.page_size) qs.set('page_size', String(params.page_size));\n\n const query = qs.toString();\n return this.request<PaginatedData<AgentTemplate>>(\n `/api/v1/templates${query ? `?${query}` : ''}`,\n );\n }\n\n async getTemplate(slug: string): Promise<AgentTemplate> {\n return this.request<AgentTemplate>(`/api/v1/templates/${slug}`);\n }\n\n async getTemplateVersions(slug: string): Promise<AgentTemplateVersion[]> {\n return this.request<AgentTemplateVersion[]>(`/api/v1/templates/${slug}/versions`);\n }\n\n async getTemplateVersion(slug: string, version: string): Promise<AgentTemplateVersion> {\n return this.request<AgentTemplateVersion>(`/api/v1/templates/${slug}/versions/${version}`);\n }\n\n async publishTemplate(\n data: CreateAgentTemplateRequest,\n files?: Record<string, string>,\n ): Promise<AgentTemplate> {\n return this.request<AgentTemplate>('/api/v1/templates', {\n method: 'POST',\n body: JSON.stringify({ ...data, files }),\n });\n }\n\n async publishTemplateVersion(\n slug: string,\n data: PublishAgentTemplateVersionRequest,\n files?: Record<string, string>,\n ): Promise<AgentTemplate> {\n return this.request<AgentTemplate>(`/api/v1/templates/${slug}/versions`, {\n method: 'POST',\n body: JSON.stringify({ ...data, files }),\n });\n }\n\n async getTemplateFiles(\n slug: string,\n version?: string,\n ): Promise<{ path: string; size: number; sha: string; type: string }[]> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request(`/api/v1/templates/${slug}/files${qs}`);\n }\n\n async getTemplateFileContent(\n slug: string,\n filePath: string,\n version?: string,\n ): Promise<{ path: string; content: string }> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request(`/api/v1/templates/${slug}/files/${filePath}${qs}`);\n }\n\n async downloadTemplateArchive(slug: string, version?: string): Promise<ArrayBuffer> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n const url = `${this.baseUrl}/api/v1/templates/${slug}/archive${qs}`;\n const headers: Record<string, string> = {};\n if (this.token) headers.Authorization = `Bearer ${this.token}`;\n const res = await fetch(url, { headers });\n if (!res.ok) throw new Error(`[GeneHub] Download template archive failed: HTTP ${res.status}`);\n return res.arrayBuffer();\n }\n\n async reportTemplateInstall(slug: string): Promise<void> {\n await this.request(`/api/v1/templates/${slug}/installed`, { method: 'POST', body: '{}' });\n }\n}\n","import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { GeneAdapter, GeneManifest } from '@nodeskai/genehub-types';\nimport { META_LEARNER_MANIFEST } from './meta-gene.js';\nimport { generateForgetTaskMarkdown, generateLearningTaskMarkdown } from './prompts.js';\nimport type { LearningResult, LearningTask } from './task.js';\n\nexport type LearningEngineOptions = {\n workspaceDir: string;\n adapter?: GeneAdapter;\n};\n\nexport class LearningEngine {\n private workspaceDir: string;\n private adapter?: GeneAdapter;\n\n constructor(options: LearningEngineOptions) {\n this.workspaceDir = options.workspaceDir;\n this.adapter = options.adapter;\n }\n\n private get tasksDir(): string {\n return join(this.workspaceDir, 'learning-tasks');\n }\n\n private get resultsDir(): string {\n return join(this.workspaceDir, 'learning-results');\n }\n\n async ensureMetaGeneInstalled(): Promise<boolean> {\n if (!this.adapter) return false;\n\n const installed = await this.adapter.isInstalled('genehub-learner');\n if (installed) return false;\n\n await this.adapter.install(META_LEARNER_MANIFEST, { force: true });\n await this.injectBootInstruction();\n return true;\n }\n\n private async injectBootInstruction(): Promise<void> {\n const agentsPath = join(this.workspaceDir, 'AGENTS.md');\n let content: string;\n try {\n content = await readFile(agentsPath, 'utf-8');\n } catch {\n return;\n }\n\n const BEGIN = '<!-- genehub:learning-boot -->';\n const END = '<!-- /genehub:learning-boot -->';\n\n if (content.includes(BEGIN)) return;\n\n const instruction = [\n '',\n BEGIN,\n '### GeneHub Learning',\n '',\n 'Check `learning-tasks/` for pending `.md` files. If any exist:',\n '',\n '1. Read `skills/genehub-learner/SKILL.md` for the full learning protocol',\n '2. Process each task file following those instructions',\n '3. Write results to `learning-results/`',\n '4. Log what you learned in `memory/YYYY-MM-DD.md`',\n END,\n ].join('\\n');\n\n const everySession = content.indexOf('## Every Session');\n if (everySession !== -1) {\n const nextSection = content.indexOf('\\n## ', everySession + 1);\n const insertPos = nextSection !== -1 ? nextSection : content.length;\n content = `${content.slice(0, insertPos)}\\n${instruction}\\n${content.slice(insertPos)}`;\n } else {\n content += `\\n${instruction}\\n`;\n }\n\n await writeFile(agentsPath, content, 'utf-8');\n }\n\n async createLearningTask(manifest: GeneManifest): Promise<LearningTask> {\n await this.ensureMetaGeneInstalled();\n\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.resultsDir, { recursive: true });\n\n const task: LearningTask = {\n mode: 'learn',\n task_id: `learn-${manifest.slug}-${Date.now()}`,\n gene_slug: manifest.slug,\n gene_name: manifest.name,\n gene_version: manifest.version,\n gene_content: manifest.skill.content ?? '',\n gene_meta: {\n name: manifest.name,\n description: manifest.description,\n category: manifest.category,\n short_description: manifest.short_description,\n },\n learning: manifest.learning\n ? {\n objectives: manifest.learning.objectives,\n scenarios: manifest.learning.scenarios,\n force_deep_learn: manifest.learning.force_deep_learn,\n }\n : undefined,\n callback_path: join(this.resultsDir, `${manifest.slug}.md`),\n created_at: new Date().toISOString(),\n };\n\n const md = generateLearningTaskMarkdown(task);\n await writeFile(join(this.tasksDir, `${manifest.slug}.md`), md, 'utf-8');\n\n return task;\n }\n\n async createForgetTask(slug: string, name: string, skillContent: string): Promise<void> {\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.resultsDir, { recursive: true });\n\n const callbackPath = join(this.resultsDir, `${slug}.md`);\n const md = generateForgetTaskMarkdown(slug, name, skillContent, callbackPath);\n await writeFile(join(this.tasksDir, `${slug}.md`), md, 'utf-8');\n }\n\n async checkResult(slug: string): Promise<LearningResult | null> {\n const resultPath = join(this.resultsDir, `${slug}.md`);\n\n try {\n const content = await readFile(resultPath, 'utf-8');\n return this.parseResult(content);\n } catch {\n return null;\n }\n }\n\n async listPendingTasks(): Promise<string[]> {\n try {\n const files = await readdir(this.tasksDir);\n const pending: string[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const slug = file.replace('.md', '');\n const result = await this.checkResult(slug);\n if (!result) {\n pending.push(slug);\n }\n }\n\n return pending;\n } catch {\n return [];\n }\n }\n\n async listCompletedResults(): Promise<LearningResult[]> {\n const results: LearningResult[] = [];\n\n try {\n const files = await readdir(this.resultsDir);\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const content = await readFile(join(this.resultsDir, file), 'utf-8');\n const result = this.parseResult(content);\n if (result) results.push(result);\n }\n } catch {\n // no results\n }\n\n return results;\n }\n\n async applyResult(slug: string, skillsDir: string): Promise<boolean> {\n const result = await this.checkResult(slug);\n if (!result) return false;\n\n if (result.decision === 'learned' && result.content) {\n const skillDir = join(skillsDir, slug);\n await mkdir(skillDir, { recursive: true });\n await writeFile(join(skillDir, 'SKILL.md'), result.content, 'utf-8');\n\n if (this.adapter?.notifySkillChange) {\n await this.adapter.notifySkillChange(slug, 'updated');\n }\n }\n\n await this.cleanupTask(slug);\n return true;\n }\n\n async cleanupTask(slug: string): Promise<void> {\n try {\n await rm(join(this.tasksDir, `${slug}.md`));\n } catch {\n /* ok */\n }\n try {\n await rm(join(this.resultsDir, `${slug}.md`));\n } catch {\n /* ok */\n }\n }\n\n private parseResult(content: string): LearningResult | null {\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) return null;\n\n const fm = fmMatch[1];\n const get = (key: string): string | undefined => {\n const m = fm.match(new RegExp(`^${key}:\\\\s*[\"']?(.+?)[\"']?\\\\s*$`, 'm'));\n return m?.[1];\n };\n\n const taskId = get('task_id');\n const geneSlug = get('gene_slug');\n const mode = get('mode') as LearningResult['mode'] | undefined;\n const decision = get('decision') as LearningResult['decision'] | undefined;\n\n if (!taskId || !geneSlug || !decision) return null;\n\n const bodyStart = content.indexOf('---', 4);\n const body = bodyStart !== -1 ? content.slice(bodyStart + 3).trim() : undefined;\n\n return {\n task_id: taskId,\n gene_slug: geneSlug,\n mode: mode ?? 'learn',\n decision,\n content: body || undefined,\n self_eval: get('self_eval') ? Number.parseFloat(get('self_eval') as string) : undefined,\n reason: get('reason'),\n completed_at: new Date().toISOString(),\n };\n }\n}\n","import type { GeneManifest } from '@nodeskai/genehub-types';\n\nconst SKILL_CONTENT = `---\nname: genehub-learner\nversion: 1.1.0\ndescription: GeneHub 基因管理与深度学习引擎\nmetadata:\n openclaw:\n always: true\n nanobot:\n always: true\n---\n\n# GeneHub 基因管理与学习引擎\n\n你具备通过 GeneHub 管理和深度学习新基因的能力。GeneHub 是你的基因库,提供各种可学习的技能基因。\n\n## 一、从 GeneHub 获取基因\n\n### 搜索可用基因\n\n\\`\\`\\`bash\ngenehub search <关键词>\ngenehub search --json <关键词>\n\\`\\`\\`\n\n### 查看已安装基因\n\n\\`\\`\\`bash\ngenehub list -p openclaw\n\\`\\`\\`\n\n### 安装基因(浅安装)\n\n直接安装 SKILL.md,不经过学习过程:\n\n\\`\\`\\`bash\ngenehub install <slug> -p openclaw\n\\`\\`\\`\n\n### 深度安装(推荐)\n\n安装后自动生成学习任务,你需要完成学习才能真正掌握:\n\n\\`\\`\\`bash\ngenehub install <slug> --learn -p openclaw\n\\`\\`\\`\n\n### 仅学习(不安装)\n\n从 Registry 获取基因内容生成学习任务,学习完成后再安装:\n\n\\`\\`\\`bash\ngenehub learn <slug> -p openclaw\n\\`\\`\\`\n\n### 检查学习结果\n\n学习完成后,验证并应用个性化版本:\n\n\\`\\`\\`bash\ngenehub learn --check <slug> -p openclaw\n\\`\\`\\`\n\n### 卸载基因\n\n\\`\\`\\`bash\ngenehub uninstall <slug> -p openclaw\n\\`\\`\\`\n\n## 二、处理学习任务\n\n每次会话开始时,检查 \\`learning-tasks/\\` 目录是否有待处理的学习任务。\n\n### 1. 发现任务\n\n\\`\\`\\`\nlearning-tasks/*.md\n\\`\\`\\`\n\n每个 \\`.md\\` 文件是一个待学习的基因任务,包含 YAML front matter 和任务详情。\n\n### 2. 执行学习\n\n对于每个任务:\n\n1. **阅读理解** — 仔细阅读技能原文,理解它要教你什么\n2. **完成目标** — 逐一完成 \\\\\\`学习目标\\\\\\` 中列出的 checklist\n3. **练习场景** — 如果有练习场景,认真完成每个场景的分析\n4. **个性化** — 基于你的理解和风格,改写技能内容为你自己的版本\n5. **自我评估** — 诚实评估你对该技能的掌握程度(0.0 - 1.0)\n\n### 3. 提交结果\n\n在 \\`learning-results/\\` 目录创建同名的 \\`.md\\` 文件:\n\n\\`\\`\\`markdown\n---\ntask_id: learn-code-review-1234567890\ngene_slug: code-review\nmode: learn\ndecision: learned\nself_eval: 0.85\nreason: \"我已深入理解代码审查的四个维度,并结合自己的经验进行了个性化\"\n---\n\n(你个性化后的 SKILL.md 完整内容放在这里)\n\\`\\`\\`\n\n### decision 选项\n\n| 值 | 含义 |\n|---|---|\n| \\`direct_install\\` | 技能内容很好,直接使用原版 |\n| \\`learned\\` | 已深度学习并生成了个性化版本(正文包含新 SKILL.md) |\n| \\`failed\\` | 学习失败(在 reason 中说明原因) |\n\n### 4. 记录心得\n\n学习完成后,将心得记录到 \\`memory/YYYY-MM-DD.md\\`。\n\n## 三、遗忘任务\n\n如果 \\`learning-tasks/\\` 中有 \\`mode: forget\\` 的任务:\n\n1. 回顾该技能的使用经验\n2. 决定完全遗忘(forgotten)还是保留精华(simplified)\n3. 将结果写入 \\`learning-results/\\`\n\n## 重要原则\n\n- **诚实自评** — 真正理解了才打高分\n- **真正个性化** — 融入你的理解和风格,不是复制粘贴\n- **记录过程** — 学习过程本身也是宝贵的记忆\n- **主动学习** — 发现新任务就立即开始,不等催促\n- **主动探索** — 当用户提到你不具备的能力时,尝试用 \\\\\\`genehub search\\\\\\` 搜索是否有对应基因`;\n\nexport const META_LEARNER_MANIFEST: GeneManifest = {\n slug: 'genehub-learner',\n name: 'GeneHub 学习引擎',\n version: '1.1.0',\n description: 'GeneHub 基因管理与学习引擎。提供从 GeneHub 搜索、安装、深度学习基因的完整能力。',\n short_description: '基因管理 + 深度学习引擎',\n category: 'efficiency',\n tags: ['ability'],\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: 'genehub-learner',\n always: true,\n content: SKILL_CONTENT,\n },\n rules: [],\n mcp_servers: [],\n learning: {\n force_deep_learn: false,\n objectives: [\n '掌握 genehub CLI 的搜索、安装、学习、卸载命令',\n '能够处理 learning-tasks/ 中的学习任务并提交结果',\n '能够生成个性化技能版本',\n ],\n scenarios: [],\n },\n};\n","import type { LearningTask } from './task.js';\n\nexport function generateLearningTaskMarkdown(task: LearningTask): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`task_id: ${task.task_id}`);\n lines.push(`mode: ${task.mode}`);\n lines.push(`gene_slug: ${task.gene_slug}`);\n lines.push(`gene_version: ${task.gene_version}`);\n lines.push(`callback_path: ${task.callback_path}`);\n lines.push(`created_at: ${task.created_at}`);\n lines.push('---');\n lines.push('');\n lines.push(`# 学习任务: ${task.gene_name}`);\n lines.push('');\n lines.push(`> 类别: ${task.gene_meta.category} | 版本: ${task.gene_version}`);\n lines.push('');\n lines.push(`${task.gene_meta.description}`);\n lines.push('');\n\n if (task.learning?.objectives?.length) {\n lines.push('## 学习目标');\n lines.push('');\n for (const obj of task.learning.objectives) {\n lines.push(`- [ ] ${obj}`);\n }\n lines.push('');\n }\n\n if (task.learning?.scenarios?.length) {\n lines.push('## 练习场景');\n lines.push('');\n for (let i = 0; i < task.learning.scenarios.length; i++) {\n const s = task.learning.scenarios[i];\n lines.push(`### 场景 ${i + 1}: ${s.title}`);\n lines.push('');\n lines.push(`**上下文**: ${s.context}`);\n lines.push('');\n lines.push(`**预期关注点**: ${s.expected_focus}`);\n lines.push('');\n lines.push('**你的练习**:');\n lines.push('');\n lines.push('(请在此处记录你对该场景的分析和应对方案)');\n lines.push('');\n }\n }\n\n lines.push('## 技能原文');\n lines.push('');\n lines.push('```');\n lines.push(task.gene_content);\n lines.push('```');\n lines.push('');\n lines.push('## 完成学习');\n lines.push('');\n lines.push('学习完成后,请执行以下操作:');\n lines.push('');\n lines.push(`1. 在 \\`${task.callback_path}\\` 创建学习结果文件`);\n lines.push('2. 包含 YAML front matter(task_id, decision, self_eval)');\n lines.push('3. 如果你个性化了技能内容,将修改后的 SKILL.md 内容放在正文中');\n lines.push('');\n lines.push('### 结果文件模板');\n lines.push('');\n lines.push('```markdown');\n lines.push('---');\n lines.push(`task_id: ${task.task_id}`);\n lines.push(`gene_slug: ${task.gene_slug}`);\n lines.push(`mode: ${task.mode}`);\n lines.push('decision: learned # direct_install | learned | failed');\n lines.push('self_eval: 0.8 # 0.0 - 1.0 自评分');\n lines.push('reason: \"我已理解并个性化了该技能\"');\n lines.push('---');\n lines.push('');\n lines.push('(如果 decision 为 learned,在此放入个性化后的 SKILL.md 内容)');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\nexport function generateForgetTaskMarkdown(\n slug: string,\n name: string,\n skillContent: string,\n callbackPath: string,\n): string {\n const taskId = `forget-${slug}-${Date.now()}`;\n return [\n '---',\n `task_id: ${taskId}`,\n 'mode: forget',\n `gene_slug: ${slug}`,\n `callback_path: ${callbackPath}`,\n `created_at: ${new Date().toISOString()}`,\n '---',\n '',\n `# 遗忘任务: ${name}`,\n '',\n '请回顾你使用该技能的经验,然后决定:',\n '',\n '- **forgotten**: 完全遗忘,清除所有痕迹',\n '- **simplified**: 保留精华,简化为更短的技能描述',\n '',\n '## 当前技能内容',\n '',\n '```',\n skillContent,\n '```',\n '',\n `请将遗忘结果写入 \\`${callbackPath}\\``,\n ].join('\\n');\n}\n"],"mappings":"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","names":["cp","mkdir","readdir","readFile","rm","stat","writeFile","join","join","stat","mkdir","writeFile","cp","readdir","rm","readFile","cp","mkdir","readdir","readFile","rm","stat","writeFile","homedir","join","join","homedir","stat","mkdir","writeFile","cp","readdir","rm","readFile","mkdir","readdir","readFile","rm","writeFile","join","join","readFile","writeFile","mkdir","readdir","rm"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodeskai/genehub-sdk",
3
- "version": "2026.3.2-9",
3
+ "version": "2026.3.3-3",
4
4
  "description": "GeneHub TypeScript SDK - API 客户端与产品适配器",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,16 +14,9 @@
14
14
  "files": [
15
15
  "dist"
16
16
  ],
17
- "scripts": {
18
- "build": "tsup",
19
- "dev": "tsup --watch",
20
- "prepublishOnly": "pnpm build",
21
- "test": "vitest run",
22
- "test:watch": "vitest"
23
- },
24
17
  "dependencies": {
25
- "@nodeskai/genehub-types": "workspace:*",
26
- "yaml": "^2.7"
18
+ "yaml": "^2.7",
19
+ "@nodeskai/genehub-types": "2026.3.3-3"
27
20
  },
28
21
  "devDependencies": {
29
22
  "tsup": "^8.3",
@@ -44,5 +37,11 @@
44
37
  "gene",
45
38
  "sdk"
46
39
  ],
47
- "license": "MIT"
48
- }
40
+ "license": "MIT",
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "dev": "tsup --watch",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest"
46
+ }
47
+ }