@nodeskai/genehub-sdk 2026.3.4-3 → 2026.3.4-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -219,10 +219,12 @@ type LearningResult = {
|
|
|
219
219
|
type LearningEngineOptions = {
|
|
220
220
|
workspaceDir: string;
|
|
221
221
|
adapter?: GeneAdapter;
|
|
222
|
+
client?: GeneHubClient;
|
|
222
223
|
};
|
|
223
224
|
declare class LearningEngine {
|
|
224
225
|
private workspaceDir;
|
|
225
226
|
private adapter?;
|
|
227
|
+
private client?;
|
|
226
228
|
constructor(options: LearningEngineOptions);
|
|
227
229
|
private get tasksDir();
|
|
228
230
|
private get resultsDir();
|
package/dist/index.js
CHANGED
|
@@ -506,7 +506,9 @@ var OpenClawAdapter = class extends BaseAdapter {
|
|
|
506
506
|
try {
|
|
507
507
|
content = await readFile3(agentsPath, "utf-8");
|
|
508
508
|
} catch {
|
|
509
|
-
return;
|
|
509
|
+
if (action === "remove") return;
|
|
510
|
+
await mkdir3(this.workspaceDir, { recursive: true });
|
|
511
|
+
content = "# AGENTS.md\n";
|
|
510
512
|
}
|
|
511
513
|
const marker = `<!-- genehub:${manifest.slug} -->`;
|
|
512
514
|
const endMarker = `<!-- /genehub:${manifest.slug} -->`;
|
|
@@ -1263,9 +1265,11 @@ function generateForgetTaskMarkdown(slug, name, skillContent, callbackPath) {
|
|
|
1263
1265
|
var LearningEngine = class {
|
|
1264
1266
|
workspaceDir;
|
|
1265
1267
|
adapter;
|
|
1268
|
+
client;
|
|
1266
1269
|
constructor(options) {
|
|
1267
1270
|
this.workspaceDir = options.workspaceDir;
|
|
1268
1271
|
this.adapter = options.adapter;
|
|
1272
|
+
this.client = options.client;
|
|
1269
1273
|
}
|
|
1270
1274
|
get tasksDir() {
|
|
1271
1275
|
return join4(this.workspaceDir, "learning-tasks");
|
|
@@ -1275,10 +1279,17 @@ var LearningEngine = class {
|
|
|
1275
1279
|
}
|
|
1276
1280
|
async ensureMetaGeneInstalled() {
|
|
1277
1281
|
if (!this.adapter) return false;
|
|
1282
|
+
await this.injectBootInstruction();
|
|
1278
1283
|
const installed = await this.adapter.isInstalled("genehub-learner");
|
|
1279
1284
|
if (installed) return false;
|
|
1280
|
-
|
|
1281
|
-
|
|
1285
|
+
let manifest = META_LEARNER_MANIFEST;
|
|
1286
|
+
if (this.client) {
|
|
1287
|
+
try {
|
|
1288
|
+
manifest = await this.client.getManifest("genehub-learner");
|
|
1289
|
+
} catch {
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
await this.adapter.install(manifest, { force: true });
|
|
1282
1293
|
return true;
|
|
1283
1294
|
}
|
|
1284
1295
|
async injectBootInstruction() {
|
|
@@ -1287,7 +1298,7 @@ var LearningEngine = class {
|
|
|
1287
1298
|
try {
|
|
1288
1299
|
content = await readFile4(agentsPath, "utf-8");
|
|
1289
1300
|
} catch {
|
|
1290
|
-
|
|
1301
|
+
content = "# AGENTS.md\n";
|
|
1291
1302
|
}
|
|
1292
1303
|
const BEGIN = "<!-- genehub:learning-boot -->";
|
|
1293
1304
|
const END = "<!-- /genehub:learning-boot -->";
|
|
@@ -1317,6 +1328,7 @@ ${content.slice(insertPos)}`;
|
|
|
1317
1328
|
${instruction}
|
|
1318
1329
|
`;
|
|
1319
1330
|
}
|
|
1331
|
+
await mkdir4(join4(this.workspaceDir), { recursive: true });
|
|
1320
1332
|
await writeFile4(agentsPath, content, "utf-8");
|
|
1321
1333
|
}
|
|
1322
1334
|
async createLearningTask(manifest) {
|
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 { 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"]}
|
|
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 if (action === 'remove') return;\n await mkdir(this.workspaceDir, { recursive: true });\n content = '# AGENTS.md\\n';\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 type { GeneHubClient } from '../client.js';\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 client?: GeneHubClient;\n};\n\nexport class LearningEngine {\n private workspaceDir: string;\n private adapter?: GeneAdapter;\n private client?: GeneHubClient;\n\n constructor(options: LearningEngineOptions) {\n this.workspaceDir = options.workspaceDir;\n this.adapter = options.adapter;\n this.client = options.client;\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 await this.injectBootInstruction();\n\n const installed = await this.adapter.isInstalled('genehub-learner');\n if (installed) return false;\n\n let manifest = META_LEARNER_MANIFEST;\n if (this.client) {\n try {\n manifest = await this.client.getManifest('genehub-learner');\n } catch {\n // Fallback to built-in manifest if remote fetch fails\n }\n }\n\n await this.adapter.install(manifest, { force: true });\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 content = '# AGENTS.md\\n';\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 mkdir(join(this.workspaceDir), { recursive: true });\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","mkdir","writeFile","readdir","rm"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodeskai/genehub-sdk",
|
|
3
|
-
"version": "2026.3.4-
|
|
3
|
+
"version": "2026.3.4-5",
|
|
4
4
|
"description": "GeneHub TypeScript SDK - API 客户端与产品适配器",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"yaml": "^2.7",
|
|
19
|
-
"@nodeskai/genehub-types": "2026.3.4-
|
|
19
|
+
"@nodeskai/genehub-types": "2026.3.4-5"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"tsup": "^8.3",
|