@nodeskai/genehub-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/generic.ts","../src/adapters/base.ts","../src/adapters/nanobot.ts","../src/adapters/openclaw.ts","../src/adapters/index.ts","../src/client.ts","../src/learning/engine.ts","../src/learning/meta-gene.ts","../src/learning/prompts.ts"],"sourcesContent":["import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { stringify } from 'yaml';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_DIR = join(process.cwd(), '.genehub', 'genes');\n\nexport class GenericAdapter extends BaseAdapter {\n readonly product = 'generic';\n private genesDir: string;\n\n constructor(options?: { genesDir?: string }) {\n super();\n this.genesDir = options?.genesDir ?? DEFAULT_DIR;\n }\n\n async detect(): Promise<boolean> {\n return true;\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.slug)\n : join(this.genesDir, manifest.slug);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const yamlPath = join(targetDir, 'gene.yaml');\n await writeFile(yamlPath, stringify(manifest), 'utf-8');\n files.push(yamlPath);\n\n if (manifest.skill.content) {\n const skillPath = join(targetDir, 'SKILL.md');\n await writeFile(skillPath, manifest.skill.content, 'utf-8');\n files.push(skillPath);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.genesDir, slug);\n try {\n await rm(targetDir, { recursive: true });\n } catch {\n // already removed\n }\n return { success: true, slug, files: [targetDir], needsRestart: false };\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.genesDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const yamlPath = join(this.genesDir, dir.name, 'gene.yaml');\n try {\n const s = await stat(yamlPath);\n const raw = await readFile(yamlPath, 'utf-8');\n const versionMatch = raw.match(/^version:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n results.push({\n slug: dir.name,\n version: versionMatch?.[1] ?? 'unknown',\n installedAt: s.mtime.toISOString(),\n files: [yamlPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.genesDir, slug, 'gene.yaml'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const raw = await readFile(join(this.genesDir, slug, 'gene.yaml'), 'utf-8');\n const match = raw.match(/^version:\\s*[\"']?(.+?)[\"']?\\s*$/m);\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n}\n","import type {\n GeneAdapter,\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\n\nexport abstract class BaseAdapter implements GeneAdapter {\n abstract readonly product: string;\n\n abstract detect(): Promise<boolean>;\n\n async install(manifest: GeneManifest, options?: InstallOptions): Promise<InstallResult> {\n const result = await this.doInstall(manifest, options);\n await this.onPostInstall(manifest, result);\n return result;\n }\n\n protected abstract doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult>;\n\n protected async onPostInstall(_manifest: GeneManifest, _result: InstallResult): Promise<void> {}\n\n protected async onPostUninstall(_slug: string, _result: UninstallResult): Promise<void> {}\n\n async uninstall(slug: string, options?: UninstallOptions): Promise<UninstallResult> {\n const result = await this.doUninstall(slug, options);\n await this.onPostUninstall(slug, result);\n return result;\n }\n\n protected abstract doUninstall(\n slug: string,\n options?: UninstallOptions,\n ): Promise<UninstallResult>;\n\n abstract list(): Promise<InstalledGene[]>;\n\n abstract isInstalled(slug: string): Promise<boolean>;\n\n abstract getInstalledVersion(slug: string): Promise<string | null>;\n\n protected generateSkillContent(manifest: GeneManifest, metadataNamespace: string): string {\n const skillMeta = manifest.skill.always ? 'true' : 'false';\n const frontMatter = [\n '---',\n `name: ${manifest.skill.name}`,\n `version: ${manifest.version}`,\n `description: ${manifest.short_description}`,\n 'metadata:',\n ` ${metadataNamespace}:`,\n ` always: ${skillMeta}`,\n '---',\n ].join('\\n');\n\n if (manifest.skill.content) {\n const content = manifest.skill.content.trim();\n if (content.startsWith('---')) {\n return content;\n }\n return `${frontMatter}\\n\\n${content}`;\n }\n\n return frontMatter;\n }\n\n protected parseSkillVersion(content: string): string | null {\n const match = content.match(/^---[\\s\\S]*?version:\\s*(.+?)[\\s\\n][\\s\\S]*?---/m);\n return match?.[1]?.trim() ?? null;\n }\n}\n","import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_WORKSPACE = join(homedir(), '.nanobot', 'workspace');\n\nexport class NanobotAdapter extends BaseAdapter {\n readonly product = 'nanobot';\n private workspace: string;\n\n constructor(options?: { workspace?: string }) {\n super();\n this.workspace = options?.workspace ?? DEFAULT_WORKSPACE;\n }\n\n private get skillsDir(): string {\n return join(this.workspace, 'skills');\n }\n\n async detect(): Promise<boolean> {\n try {\n await stat(join(homedir(), '.nanobot', 'config.json'));\n return true;\n } catch {\n return false;\n }\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const skillContent = this.buildNanobotSkillContent(manifest);\n const skillPath = join(targetDir, 'SKILL.md');\n await writeFile(skillPath, skillContent, 'utf-8');\n files.push(skillPath);\n\n if (manifest.mcp_servers.length > 0) {\n await this.mergeNanobotMcpConfig(manifest.mcp_servers);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files,\n needsRestart: false,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void> {\n await this.writeMemoryEntry(manifest, 'install');\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.skillsDir, slug);\n const files: string[] = [];\n\n try {\n await rm(targetDir, { recursive: true });\n files.push(targetDir);\n } catch {\n // already removed\n }\n\n return { success: true, slug, files, needsRestart: false };\n }\n\n protected async onPostUninstall(slug: string, _result: UninstallResult): Promise<void> {\n await this.writeMemoryEntry(\n { slug, name: slug, version: 'unknown' } as GeneManifest,\n 'uninstall',\n );\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.skillsDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const skillPath = join(this.skillsDir, dir.name, 'SKILL.md');\n try {\n const s = await stat(skillPath);\n const content = await readFile(skillPath, 'utf-8');\n const version = this.parseSkillVersion(content) ?? 'unknown';\n results.push({\n slug: dir.name,\n version,\n installedAt: s.mtime.toISOString(),\n files: [skillPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.skillsDir, slug, 'SKILL.md'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const content = await readFile(join(this.skillsDir, slug, 'SKILL.md'), 'utf-8');\n return this.parseSkillVersion(content);\n } catch {\n return null;\n }\n }\n\n private async writeMemoryEntry(\n manifest: GeneManifest,\n action: 'install' | 'uninstall',\n ): Promise<void> {\n const memoryDir = join(this.workspace, 'memory');\n await mkdir(memoryDir, { recursive: true });\n\n const today = new Date().toISOString().slice(0, 10);\n const memoryPath = join(memoryDir, `${today}.md`);\n\n let existing = '';\n try {\n existing = await readFile(memoryPath, 'utf-8');\n } catch {\n /* new file */\n }\n\n const time = new Date().toLocaleTimeString('zh-CN', { hour12: false });\n const verb = action === 'install' ? '学习了' : '遗忘了';\n const entry = `\\n- [${time}] 通过 GeneHub ${verb}基因: **${manifest.name ?? manifest.slug}** v${manifest.version ?? '?'}\\n`;\n\n await writeFile(memoryPath, existing + entry, 'utf-8');\n }\n\n private buildNanobotSkillContent(manifest: GeneManifest): string {\n if (manifest.skill.content?.trim().startsWith('---')) {\n return manifest.skill.content;\n }\n\n return this.generateSkillContent(manifest, 'nanobot');\n }\n\n private async mergeNanobotMcpConfig(mcpServers: GeneManifest['mcp_servers']): Promise<void> {\n const configPath = join(homedir(), '.nanobot', 'config.json');\n\n let config: Record<string, unknown> = {};\n try {\n const raw = await readFile(configPath, 'utf-8');\n config = JSON.parse(raw);\n } catch {\n return;\n }\n\n if (!config.tools) config.tools = {};\n const tools = config.tools as Record<string, unknown>;\n if (!tools.mcpServers) tools.mcpServers = {};\n const servers = tools.mcpServers as Record<string, unknown>;\n\n for (const srv of mcpServers) {\n if (servers[srv.name]) continue;\n servers[srv.name] = {\n ...(srv.command ? { command: srv.command, args: srv.args ?? [], env: srv.env ?? {} } : {}),\n ...(srv.url ? { url: srv.url, headers: srv.headers ?? {} } : {}),\n };\n }\n\n await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { appendFile, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport type {\n GeneManifest,\n InstalledGene,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from '@nodeskai/genehub-types';\nimport { BaseAdapter } from './base.js';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.openclaw');\nconst DEFAULT_WORKSPACE_DIR = join(DEFAULT_CONFIG_DIR, 'workspace');\nconst DEFAULT_SKILLS_DIR = join(DEFAULT_WORKSPACE_DIR, 'skills');\nconst DEFAULT_CONFIG_PATH = join(DEFAULT_CONFIG_DIR, 'openclaw.json');\nconst SESSIONS_REL = join('agents', 'main', 'sessions');\n\nexport class OpenClawAdapter extends BaseAdapter {\n readonly product = 'openclaw';\n private skillsDir: string;\n private configPath: string;\n private configDir: string;\n private workspaceDir: string;\n\n constructor(options?: {\n skillsDir?: string;\n configPath?: string;\n workspaceDir?: string;\n configDir?: string;\n }) {\n super();\n this.configDir = options?.configDir ?? DEFAULT_CONFIG_DIR;\n this.workspaceDir = options?.workspaceDir ?? DEFAULT_WORKSPACE_DIR;\n this.skillsDir = options?.skillsDir ?? DEFAULT_SKILLS_DIR;\n this.configPath = options?.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async detect(): Promise<boolean> {\n try {\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n protected async doInstall(\n manifest: GeneManifest,\n options?: InstallOptions,\n ): Promise<InstallResult> {\n const targetDir = options?.targetPath\n ? join(options.targetPath, manifest.skill.name)\n : join(this.skillsDir, manifest.skill.name);\n\n await mkdir(targetDir, { recursive: true });\n const files: string[] = [];\n\n const skillPath = join(targetDir, 'SKILL.md');\n const content = this.generateSkillContent(manifest, 'openclaw');\n await writeFile(skillPath, content, 'utf-8');\n files.push(skillPath);\n\n if (manifest.config?.openclaw) {\n await this.mergeOpenClawConfig(manifest.config.openclaw);\n files.push(this.configPath);\n }\n\n if (manifest.mcp_servers?.length) {\n await this.mergeMcpServers(manifest.mcp_servers);\n files.push(this.configPath);\n }\n\n return {\n success: true,\n slug: manifest.slug,\n version: manifest.version,\n files: [...new Set(files)],\n needsRestart: true,\n dependencies: manifest.dependencies.map((d) => d.slug),\n };\n }\n\n protected async onPostInstall(manifest: GeneManifest, _result: InstallResult): Promise<void> {\n await this.updateAgentsMd(manifest, 'add');\n await this.writeMemoryEntry(manifest, 'install');\n await this.invalidateSkillSnapshots();\n await this.injectEvolutionNotification(manifest.name ?? manifest.slug, 'installed');\n }\n\n protected async doUninstall(slug: string, _options?: UninstallOptions): Promise<UninstallResult> {\n const targetDir = join(this.skillsDir, slug);\n const files: string[] = [];\n\n try {\n await rm(targetDir, { recursive: true });\n files.push(targetDir);\n } catch {\n // already removed\n }\n\n return { success: true, slug, files, needsRestart: true };\n }\n\n protected async onPostUninstall(slug: string, _result: UninstallResult): Promise<void> {\n await this.updateAgentsMd({ slug } as GeneManifest, 'remove');\n await this.writeMemoryEntry(\n { slug, name: slug, version: 'unknown' } as GeneManifest,\n 'uninstall',\n );\n await this.invalidateSkillSnapshots();\n await this.injectEvolutionNotification(slug, 'uninstalled');\n }\n\n async list(): Promise<InstalledGene[]> {\n try {\n const dirs = await readdir(this.skillsDir, { withFileTypes: true });\n const results: InstalledGene[] = [];\n\n for (const dir of dirs) {\n if (!dir.isDirectory()) continue;\n const skillPath = join(this.skillsDir, dir.name, 'SKILL.md');\n try {\n const s = await stat(skillPath);\n const content = await readFile(skillPath, 'utf-8');\n const version = this.parseSkillVersion(content) ?? 'unknown';\n results.push({\n slug: dir.name,\n version,\n installedAt: s.mtime.toISOString(),\n files: [skillPath],\n });\n } catch {\n // skip\n }\n }\n\n return results;\n } catch {\n return [];\n }\n }\n\n async isInstalled(slug: string): Promise<boolean> {\n try {\n await stat(join(this.skillsDir, slug, 'SKILL.md'));\n return true;\n } catch {\n return false;\n }\n }\n\n async getInstalledVersion(slug: string): Promise<string | null> {\n try {\n const content = await readFile(join(this.skillsDir, slug, 'SKILL.md'), 'utf-8');\n return this.parseSkillVersion(content);\n } catch {\n return null;\n }\n }\n\n private async updateAgentsMd(manifest: GeneManifest, action: 'add' | 'remove'): Promise<void> {\n const agentsPath = join(this.workspaceDir, 'AGENTS.md');\n let content: string;\n try {\n content = await readFile(agentsPath, 'utf-8');\n } catch {\n return;\n }\n\n const marker = `<!-- genehub:${manifest.slug} -->`;\n const endMarker = `<!-- /genehub:${manifest.slug} -->`;\n\n const existingPattern = new RegExp(\n `${escapeRegex(marker)}[\\\\s\\\\S]*?${escapeRegex(endMarker)}\\\\n?`,\n );\n content = content.replace(existingPattern, '');\n\n if (action === 'add') {\n const geneBlock = [\n marker,\n `- **${manifest.name ?? manifest.slug}** (v${manifest.version}) — ${manifest.short_description ?? ''}`,\n endMarker,\n ].join('\\n');\n\n const toolsSection = content.indexOf('## Tools');\n if (toolsSection !== -1) {\n const nextSection = content.indexOf('\\n## ', toolsSection + 1);\n const insertPos = nextSection !== -1 ? nextSection : content.length;\n content = `${content.slice(0, insertPos)}\\n${geneBlock}\\n${content.slice(insertPos)}`;\n } else {\n content += `\\n\\n## GeneHub Skills\\n\\n${geneBlock}\\n`;\n }\n }\n\n if (action === 'remove' && manifest.slug === 'genehub-learner') {\n const bootBegin = '<!-- genehub:learning-boot -->';\n const bootEnd = '<!-- /genehub:learning-boot -->';\n const bootPattern = new RegExp(\n `\\\\n?${escapeRegex(bootBegin)}[\\\\s\\\\S]*?${escapeRegex(bootEnd)}\\\\n?`,\n );\n content = content.replace(bootPattern, '');\n }\n\n await writeFile(agentsPath, content, 'utf-8');\n }\n\n private async writeMemoryEntry(\n manifest: GeneManifest,\n action: 'install' | 'uninstall',\n ): Promise<void> {\n const memoryDir = join(this.workspaceDir, 'memory');\n await mkdir(memoryDir, { recursive: true });\n\n const today = new Date().toISOString().slice(0, 10);\n const memoryPath = join(memoryDir, `${today}.md`);\n\n let existing = '';\n try {\n existing = await readFile(memoryPath, 'utf-8');\n } catch {\n // new file\n }\n\n const time = new Date().toLocaleTimeString('zh-CN', { hour12: false });\n const verb = action === 'install' ? '学习了' : '遗忘了';\n const entry = `\\n- [${time}] 通过 GeneHub ${verb}基因: **${manifest.name ?? manifest.slug}** v${manifest.version ?? '?'}\\n`;\n\n await writeFile(memoryPath, existing + entry, 'utf-8');\n }\n\n private async mergeOpenClawConfig(config: NonNullable<GeneManifest['config']>['openclaw']) {\n if (!config) return;\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await readFile(this.configPath, 'utf-8');\n existing = JSON.parse(raw);\n } catch {\n // no existing config\n }\n\n if (config.openclaw_config) {\n Object.assign(existing, config.openclaw_config);\n }\n\n if (config.tool_allow) {\n const current = ((existing.tools as Record<string, unknown>)?.allow as string[]) ?? [];\n const merged = [...new Set([...current, ...config.tool_allow])];\n if (!existing.tools) existing.tools = {};\n (existing.tools as Record<string, unknown>).allow = merged;\n }\n\n await writeFile(this.configPath, JSON.stringify(existing, null, 2), 'utf-8');\n }\n\n private async mergeMcpServers(servers: NonNullable<GeneManifest['mcp_servers']>) {\n if (!servers?.length) return;\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await readFile(this.configPath, 'utf-8');\n existing = JSON.parse(raw);\n } catch {\n return;\n }\n\n const mcpServers = (existing.mcpServers ?? {}) as Record<string, unknown>;\n for (const server of servers) {\n mcpServers[server.name] = {\n transport: server.transport,\n command: server.command,\n args: server.args,\n env: server.env,\n };\n }\n existing.mcpServers = mcpServers;\n\n await writeFile(this.configPath, JSON.stringify(existing, null, 2), 'utf-8');\n }\n\n async notifySkillChange(\n geneName: string,\n action: 'installed' | 'updated' | 'uninstalled',\n ): Promise<void> {\n await this.invalidateSkillSnapshots();\n const notifyAction = action === 'uninstalled' ? 'uninstalled' : 'installed';\n await this.injectEvolutionNotification(geneName, notifyAction);\n }\n\n /**\n * Clear cached skillsSnapshot from all OpenClaw sessions.\n * Without this, OpenClaw keeps using the stale skill list even after restart.\n */\n private async invalidateSkillSnapshots(): Promise<void> {\n const sessionsPath = join(this.configDir, SESSIONS_REL, 'sessions.json');\n let raw: string;\n try {\n raw = await readFile(sessionsPath, 'utf-8');\n } catch {\n return;\n }\n\n try {\n const store = JSON.parse(raw) as Record<string, unknown>;\n let changed = false;\n\n for (const entry of Object.values(store)) {\n if (entry && typeof entry === 'object' && 'skillsSnapshot' in entry) {\n delete (entry as Record<string, unknown>).skillsSnapshot;\n changed = true;\n }\n }\n\n if (changed) {\n await writeFile(sessionsPath, JSON.stringify(store, null, 2), 'utf-8');\n }\n } catch {\n // best-effort\n }\n }\n\n /**\n * Inject evolution notification into all active session JSONL files.\n *\n * Old conversation history may contain stale skill listings from the agent.\n * The LLM repeats its previous answer instead of re-checking the system prompt.\n * By appending a user+assistant message pair about the evolution, we override\n * the stale context. Also resets systemSent to force system prompt rebuild.\n */\n private async injectEvolutionNotification(\n geneName: string,\n action: 'installed' | 'uninstalled',\n ): Promise<void> {\n const sessionsDir = join(this.configDir, SESSIONS_REL);\n const sessionsPath = join(sessionsDir, 'sessions.json');\n\n let raw: string;\n try {\n raw = await readFile(sessionsPath, 'utf-8');\n } catch {\n return;\n }\n\n const userText =\n action === 'installed'\n ? `[System] 基因系统通知: 你刚刚获取了新的基因「${geneName}」,完成了一轮进化。你的技能列表已更新,请以 system prompt 中 <available_skills> 为准。`\n : `[System] 基因系统通知: 基因「${geneName}」已遗忘。你的技能列表已更新,请以 system prompt 中 <available_skills> 为准。`;\n\n const assistantText =\n action === 'installed'\n ? `收到,我已获取新基因「${geneName}」并完成进化。我的技能列表已更新。`\n : `收到,基因「${geneName}」已遗忘。我的技能列表已更新。`;\n\n try {\n const store = JSON.parse(raw) as Record<string, unknown>;\n let storeChanged = false;\n\n for (const entry of Object.values(store)) {\n if (!entry || typeof entry !== 'object') continue;\n const rec = entry as Record<string, unknown>;\n const sessionFile = rec.sessionFile as string | undefined;\n if (!sessionFile) continue;\n\n const localPath = join(sessionsDir, basename(sessionFile));\n let content: string;\n try {\n content = (await readFile(localPath, 'utf-8')).trimEnd();\n if (!content) continue;\n } catch {\n continue;\n }\n\n try {\n const lastLine = content.split('\\n').pop() ?? '';\n const lastEntry = JSON.parse(lastLine) as Record<string, unknown>;\n const parentId = (lastEntry.id as string) ?? randomUUID().slice(0, 8);\n\n const now = new Date();\n const tsIso = now.toISOString();\n const tsMs = now.getTime();\n const userId = randomUUID().slice(0, 8);\n const assistantId = randomUUID().slice(0, 8);\n\n const modelProvider = (rec.modelProvider as string) ?? 'system';\n const modelName = (rec.model as string) ?? 'system';\n\n const userMsg = JSON.stringify({\n type: 'message',\n id: userId,\n parentId,\n timestamp: tsIso,\n message: {\n role: 'user',\n content: [{ type: 'text', text: userText }],\n timestamp: tsMs,\n },\n });\n\n const assistantMsg = JSON.stringify({\n type: 'message',\n id: assistantId,\n parentId: userId,\n timestamp: tsIso,\n message: {\n role: 'assistant',\n content: [{ type: 'text', text: assistantText }],\n api: 'openai-completions',\n provider: modelProvider,\n model: modelName,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'stop',\n timestamp: tsMs,\n },\n });\n\n await appendFile(localPath, `\\n${userMsg}\\n${assistantMsg}`, 'utf-8');\n } catch {\n continue;\n }\n\n rec.systemSent = false;\n storeChanged = true;\n }\n\n if (storeChanged) {\n await writeFile(sessionsPath, JSON.stringify(store, null, 2), 'utf-8');\n }\n } catch {\n // best-effort\n }\n }\n}\n\nfunction escapeRegex(str: string) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { GeneAdapter } from '@nodeskai/genehub-types';\nimport { GenericAdapter } from './generic.js';\nimport { NanobotAdapter } from './nanobot.js';\nimport { OpenClawAdapter } from './openclaw.js';\n\nconst ADAPTERS: (() => GeneAdapter)[] = [\n () => new OpenClawAdapter(),\n () => new NanobotAdapter(),\n () => new GenericAdapter(),\n];\n\nexport async function detectAdapter(): Promise<GeneAdapter> {\n for (const create of ADAPTERS) {\n const adapter = create();\n if (await adapter.detect()) {\n return adapter;\n }\n }\n return new GenericAdapter();\n}\n\nexport function getAdapter(product: string): GeneAdapter {\n switch (product) {\n case 'openclaw':\n return new OpenClawAdapter();\n case 'nanobot':\n return new NanobotAdapter();\n default:\n return new GenericAdapter();\n }\n}\n","import type {\n ApiResponse,\n Gene,\n GeneListParams,\n GeneManifest,\n GeneVersion,\n Genome,\n PaginatedData,\n ResolvedGene,\n} from '@nodeskai/genehub-types';\n\nexport type GeneHubClientOptions = {\n registryUrl: string;\n token?: string;\n};\n\nexport class GeneHubClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(options: GeneHubClientOptions) {\n this.baseUrl = options.registryUrl.replace(/\\/$/, '');\n this.token = options.token;\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(init?.headers as Record<string, string>),\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers });\n\n const json = (await res.json()) as ApiResponse<T> & { error_code?: string };\n\n if (!res.ok || json.code !== 0) {\n const msg = json.message || `HTTP ${res.status}`;\n throw new Error(`[GeneHub] ${json.error_code ?? 'error'}: ${msg}`);\n }\n\n return json.data;\n }\n\n async searchGenes(params: GeneListParams = {}): Promise<PaginatedData<Gene>> {\n const qs = new URLSearchParams();\n if (params.q) qs.set('q', params.q);\n if (params.category) qs.set('category', params.category);\n if (params.tags?.length) qs.set('tags', params.tags.join(','));\n if (params.compatibility) qs.set('compatibility', params.compatibility);\n if (params.sort) qs.set('sort', params.sort);\n if (params.page) qs.set('page', String(params.page));\n if (params.page_size) qs.set('page_size', String(params.page_size));\n\n const query = qs.toString();\n return this.request<PaginatedData<Gene>>(`/api/v1/genes${query ? `?${query}` : ''}`);\n }\n\n async getGene(slug: string): Promise<Gene> {\n return this.request<Gene>(`/api/v1/genes/${slug}`);\n }\n\n async getManifest(slug: string, version?: string): Promise<GeneManifest> {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n return this.request<GeneManifest>(`/api/v1/genes/${slug}/manifest${qs}`);\n }\n\n async getVersions(slug: string): Promise<GeneVersion[]> {\n return this.request<GeneVersion[]>(`/api/v1/genes/${slug}/versions`);\n }\n\n async getVersion(slug: string, version: string): Promise<GeneVersion> {\n return this.request<GeneVersion>(`/api/v1/genes/${slug}/versions/${version}`);\n }\n\n async getGenome(slug: string): Promise<Genome> {\n return this.request<Genome>(`/api/v1/genomes/${slug}`);\n }\n\n async publishGene(manifest: GeneManifest): Promise<Gene> {\n return this.request<Gene>('/api/v1/genes', {\n method: 'POST',\n body: JSON.stringify({ manifest }),\n });\n }\n\n async publishVersion(slug: string, manifest: GeneManifest, changelog?: string): Promise<Gene> {\n return this.request<Gene>(`/api/v1/genes/${slug}/versions`, {\n method: 'POST',\n body: JSON.stringify({ manifest, changelog }),\n });\n }\n\n async resolve(\n slug: string,\n version?: string,\n product?: string,\n ): Promise<{ plan: ResolvedGene[]; warnings: string[] }> {\n return this.request(`/api/v1/resolve`, {\n method: 'POST',\n body: JSON.stringify({ slug, version, product }),\n });\n }\n\n async reportInstall(slug: string): Promise<void> {\n await this.request(`/api/v1/genes/${slug}/installed`, { method: 'POST', body: '{}' });\n }\n\n async reportEffectiveness(\n slug: string,\n report: { metric_type: string; value: number; context?: string },\n ): Promise<void> {\n await this.request(`/api/v1/genes/${slug}/effectiveness`, {\n method: 'POST',\n body: JSON.stringify(report),\n });\n }\n}\n","import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { GeneAdapter, GeneManifest } from '@nodeskai/genehub-types';\nimport { META_LEARNER_MANIFEST } from './meta-gene.js';\nimport { generateForgetTaskMarkdown, generateLearningTaskMarkdown } from './prompts.js';\nimport type { LearningResult, LearningTask } from './task.js';\n\nexport type LearningEngineOptions = {\n workspaceDir: string;\n adapter?: GeneAdapter;\n};\n\nexport class LearningEngine {\n private workspaceDir: string;\n private adapter?: GeneAdapter;\n\n constructor(options: LearningEngineOptions) {\n this.workspaceDir = options.workspaceDir;\n this.adapter = options.adapter;\n }\n\n private get tasksDir(): string {\n return join(this.workspaceDir, 'learning-tasks');\n }\n\n private get resultsDir(): string {\n return join(this.workspaceDir, 'learning-results');\n }\n\n async ensureMetaGeneInstalled(): Promise<boolean> {\n if (!this.adapter) return false;\n\n const installed = await this.adapter.isInstalled('genehub-learner');\n if (installed) return false;\n\n await this.adapter.install(META_LEARNER_MANIFEST, { force: true });\n await this.injectBootInstruction();\n return true;\n }\n\n private async injectBootInstruction(): Promise<void> {\n const agentsPath = join(this.workspaceDir, 'AGENTS.md');\n let content: string;\n try {\n content = await readFile(agentsPath, 'utf-8');\n } catch {\n return;\n }\n\n const BEGIN = '<!-- genehub:learning-boot -->';\n const END = '<!-- /genehub:learning-boot -->';\n\n if (content.includes(BEGIN)) return;\n\n const instruction = [\n '',\n BEGIN,\n '### GeneHub Learning',\n '',\n 'Check `learning-tasks/` for pending `.md` files. If any exist:',\n '',\n '1. Read `skills/genehub-learner/SKILL.md` for the full learning protocol',\n '2. Process each task file following those instructions',\n '3. Write results to `learning-results/`',\n '4. Log what you learned in `memory/YYYY-MM-DD.md`',\n END,\n ].join('\\n');\n\n const everySession = content.indexOf('## Every Session');\n if (everySession !== -1) {\n const nextSection = content.indexOf('\\n## ', everySession + 1);\n const insertPos = nextSection !== -1 ? nextSection : content.length;\n content = `${content.slice(0, insertPos)}\\n${instruction}\\n${content.slice(insertPos)}`;\n } else {\n content += `\\n${instruction}\\n`;\n }\n\n await writeFile(agentsPath, content, 'utf-8');\n }\n\n async createLearningTask(manifest: GeneManifest): Promise<LearningTask> {\n await this.ensureMetaGeneInstalled();\n\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.resultsDir, { recursive: true });\n\n const task: LearningTask = {\n mode: 'learn',\n task_id: `learn-${manifest.slug}-${Date.now()}`,\n gene_slug: manifest.slug,\n gene_name: manifest.name,\n gene_version: manifest.version,\n gene_content: manifest.skill.content ?? '',\n gene_meta: {\n name: manifest.name,\n description: manifest.description,\n category: manifest.category,\n short_description: manifest.short_description,\n },\n learning: manifest.learning\n ? {\n objectives: manifest.learning.objectives,\n scenarios: manifest.learning.scenarios,\n force_deep_learn: manifest.learning.force_deep_learn,\n }\n : undefined,\n callback_path: join(this.resultsDir, `${manifest.slug}.md`),\n created_at: new Date().toISOString(),\n };\n\n const md = generateLearningTaskMarkdown(task);\n await writeFile(join(this.tasksDir, `${manifest.slug}.md`), md, 'utf-8');\n\n return task;\n }\n\n async createForgetTask(slug: string, name: string, skillContent: string): Promise<void> {\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.resultsDir, { recursive: true });\n\n const callbackPath = join(this.resultsDir, `${slug}.md`);\n const md = generateForgetTaskMarkdown(slug, name, skillContent, callbackPath);\n await writeFile(join(this.tasksDir, `${slug}.md`), md, 'utf-8');\n }\n\n async checkResult(slug: string): Promise<LearningResult | null> {\n const resultPath = join(this.resultsDir, `${slug}.md`);\n\n try {\n const content = await readFile(resultPath, 'utf-8');\n return this.parseResult(content);\n } catch {\n return null;\n }\n }\n\n async listPendingTasks(): Promise<string[]> {\n try {\n const files = await readdir(this.tasksDir);\n const pending: string[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const slug = file.replace('.md', '');\n const result = await this.checkResult(slug);\n if (!result) {\n pending.push(slug);\n }\n }\n\n return pending;\n } catch {\n return [];\n }\n }\n\n async listCompletedResults(): Promise<LearningResult[]> {\n const results: LearningResult[] = [];\n\n try {\n const files = await readdir(this.resultsDir);\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const content = await readFile(join(this.resultsDir, file), 'utf-8');\n const result = this.parseResult(content);\n if (result) results.push(result);\n }\n } catch {\n // no results\n }\n\n return results;\n }\n\n async applyResult(slug: string, skillsDir: string): Promise<boolean> {\n const result = await this.checkResult(slug);\n if (!result) return false;\n\n if (result.decision === 'learned' && result.content) {\n const skillDir = join(skillsDir, slug);\n await mkdir(skillDir, { recursive: true });\n await writeFile(join(skillDir, 'SKILL.md'), result.content, 'utf-8');\n\n if (this.adapter?.notifySkillChange) {\n await this.adapter.notifySkillChange(slug, 'updated');\n }\n }\n\n await this.cleanupTask(slug);\n return true;\n }\n\n async cleanupTask(slug: string): Promise<void> {\n try {\n await rm(join(this.tasksDir, `${slug}.md`));\n } catch {\n /* ok */\n }\n try {\n await rm(join(this.resultsDir, `${slug}.md`));\n } catch {\n /* ok */\n }\n }\n\n private parseResult(content: string): LearningResult | null {\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) return null;\n\n const fm = fmMatch[1];\n const get = (key: string): string | undefined => {\n const m = fm.match(new RegExp(`^${key}:\\\\s*[\"']?(.+?)[\"']?\\\\s*$`, 'm'));\n return m?.[1];\n };\n\n const taskId = get('task_id');\n const geneSlug = get('gene_slug');\n const mode = get('mode') as LearningResult['mode'] | undefined;\n const decision = get('decision') as LearningResult['decision'] | undefined;\n\n if (!taskId || !geneSlug || !decision) return null;\n\n const bodyStart = content.indexOf('---', 4);\n const body = bodyStart !== -1 ? content.slice(bodyStart + 3).trim() : undefined;\n\n return {\n task_id: taskId,\n gene_slug: geneSlug,\n mode: mode ?? 'learn',\n decision,\n content: body || undefined,\n self_eval: get('self_eval') ? Number.parseFloat(get('self_eval')!) : undefined,\n reason: get('reason'),\n completed_at: new Date().toISOString(),\n };\n }\n}\n","import type { GeneManifest } from '@nodeskai/genehub-types';\n\nconst SKILL_CONTENT = `---\nname: genehub-learner\nversion: 1.1.0\ndescription: GeneHub 基因管理与深度学习引擎\nmetadata:\n openclaw:\n always: true\n nanobot:\n always: true\n---\n\n# GeneHub 基因管理与学习引擎\n\n你具备通过 GeneHub 管理和深度学习新基因的能力。GeneHub 是你的基因库,提供各种可学习的技能基因。\n\n## 一、从 GeneHub 获取基因\n\n### 搜索可用基因\n\n\\`\\`\\`bash\ngenehub search <关键词>\ngenehub search --json <关键词>\n\\`\\`\\`\n\n### 查看已安装基因\n\n\\`\\`\\`bash\ngenehub list -p openclaw\n\\`\\`\\`\n\n### 安装基因(浅安装)\n\n直接安装 SKILL.md,不经过学习过程:\n\n\\`\\`\\`bash\ngenehub install <slug> -p openclaw\n\\`\\`\\`\n\n### 深度安装(推荐)\n\n安装后自动生成学习任务,你需要完成学习才能真正掌握:\n\n\\`\\`\\`bash\ngenehub install <slug> --learn -p openclaw\n\\`\\`\\`\n\n### 仅学习(不安装)\n\n从 Registry 获取基因内容生成学习任务,学习完成后再安装:\n\n\\`\\`\\`bash\ngenehub learn <slug> -p openclaw\n\\`\\`\\`\n\n### 检查学习结果\n\n学习完成后,验证并应用个性化版本:\n\n\\`\\`\\`bash\ngenehub learn --check <slug> -p openclaw\n\\`\\`\\`\n\n### 卸载基因\n\n\\`\\`\\`bash\ngenehub uninstall <slug> -p openclaw\n\\`\\`\\`\n\n## 二、处理学习任务\n\n每次会话开始时,检查 \\`learning-tasks/\\` 目录是否有待处理的学习任务。\n\n### 1. 发现任务\n\n\\`\\`\\`\nlearning-tasks/*.md\n\\`\\`\\`\n\n每个 \\`.md\\` 文件是一个待学习的基因任务,包含 YAML front matter 和任务详情。\n\n### 2. 执行学习\n\n对于每个任务:\n\n1. **阅读理解** — 仔细阅读技能原文,理解它要教你什么\n2. **完成目标** — 逐一完成 \\\\\\`学习目标\\\\\\` 中列出的 checklist\n3. **练习场景** — 如果有练习场景,认真完成每个场景的分析\n4. **个性化** — 基于你的理解和风格,改写技能内容为你自己的版本\n5. **自我评估** — 诚实评估你对该技能的掌握程度(0.0 - 1.0)\n\n### 3. 提交结果\n\n在 \\`learning-results/\\` 目录创建同名的 \\`.md\\` 文件:\n\n\\`\\`\\`markdown\n---\ntask_id: learn-code-review-1234567890\ngene_slug: code-review\nmode: learn\ndecision: learned\nself_eval: 0.85\nreason: \"我已深入理解代码审查的四个维度,并结合自己的经验进行了个性化\"\n---\n\n(你个性化后的 SKILL.md 完整内容放在这里)\n\\`\\`\\`\n\n### decision 选项\n\n| 值 | 含义 |\n|---|---|\n| \\`direct_install\\` | 技能内容很好,直接使用原版 |\n| \\`learned\\` | 已深度学习并生成了个性化版本(正文包含新 SKILL.md) |\n| \\`failed\\` | 学习失败(在 reason 中说明原因) |\n\n### 4. 记录心得\n\n学习完成后,将心得记录到 \\`memory/YYYY-MM-DD.md\\`。\n\n## 三、遗忘任务\n\n如果 \\`learning-tasks/\\` 中有 \\`mode: forget\\` 的任务:\n\n1. 回顾该技能的使用经验\n2. 决定完全遗忘(forgotten)还是保留精华(simplified)\n3. 将结果写入 \\`learning-results/\\`\n\n## 重要原则\n\n- **诚实自评** — 真正理解了才打高分\n- **真正个性化** — 融入你的理解和风格,不是复制粘贴\n- **记录过程** — 学习过程本身也是宝贵的记忆\n- **主动学习** — 发现新任务就立即开始,不等催促\n- **主动探索** — 当用户提到你不具备的能力时,尝试用 \\\\\\`genehub search\\\\\\` 搜索是否有对应基因`;\n\nexport const META_LEARNER_MANIFEST: GeneManifest = {\n slug: 'genehub-learner',\n name: 'GeneHub 学习引擎',\n version: '1.1.0',\n description: 'GeneHub 基因管理与学习引擎。提供从 GeneHub 搜索、安装、深度学习基因的完整能力。',\n short_description: '基因管理 + 深度学习引擎',\n category: 'efficiency',\n tags: ['ability'],\n compatibility: [\n { product: 'openclaw', min_version: '0.5.0' },\n { product: 'nanobot', min_version: '0.1.0' },\n ],\n dependencies: [],\n synergies: [],\n skill: {\n name: 'genehub-learner',\n always: true,\n content: SKILL_CONTENT,\n },\n rules: [],\n mcp_servers: [],\n learning: {\n force_deep_learn: false,\n objectives: [\n '掌握 genehub CLI 的搜索、安装、学习、卸载命令',\n '能够处理 learning-tasks/ 中的学习任务并提交结果',\n '能够生成个性化技能版本',\n ],\n scenarios: [],\n },\n};\n","import type { LearningTask } from './task.js';\n\nexport function generateLearningTaskMarkdown(task: LearningTask): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push(`task_id: ${task.task_id}`);\n lines.push(`mode: ${task.mode}`);\n lines.push(`gene_slug: ${task.gene_slug}`);\n lines.push(`gene_version: ${task.gene_version}`);\n lines.push(`callback_path: ${task.callback_path}`);\n lines.push(`created_at: ${task.created_at}`);\n lines.push('---');\n lines.push('');\n lines.push(`# 学习任务: ${task.gene_name}`);\n lines.push('');\n lines.push(`> 类别: ${task.gene_meta.category} | 版本: ${task.gene_version}`);\n lines.push('');\n lines.push(`${task.gene_meta.description}`);\n lines.push('');\n\n if (task.learning?.objectives?.length) {\n lines.push('## 学习目标');\n lines.push('');\n for (const obj of task.learning.objectives) {\n lines.push(`- [ ] ${obj}`);\n }\n lines.push('');\n }\n\n if (task.learning?.scenarios?.length) {\n lines.push('## 练习场景');\n lines.push('');\n for (let i = 0; i < task.learning.scenarios.length; i++) {\n const s = task.learning.scenarios[i];\n lines.push(`### 场景 ${i + 1}: ${s.title}`);\n lines.push('');\n lines.push(`**上下文**: ${s.context}`);\n lines.push('');\n lines.push(`**预期关注点**: ${s.expected_focus}`);\n lines.push('');\n lines.push('**你的练习**:');\n lines.push('');\n lines.push('(请在此处记录你对该场景的分析和应对方案)');\n lines.push('');\n }\n }\n\n lines.push('## 技能原文');\n lines.push('');\n lines.push('```');\n lines.push(task.gene_content);\n lines.push('```');\n lines.push('');\n lines.push('## 完成学习');\n lines.push('');\n lines.push('学习完成后,请执行以下操作:');\n lines.push('');\n lines.push(`1. 在 \\`${task.callback_path}\\` 创建学习结果文件`);\n lines.push('2. 包含 YAML front matter(task_id, decision, self_eval)');\n lines.push('3. 如果你个性化了技能内容,将修改后的 SKILL.md 内容放在正文中');\n lines.push('');\n lines.push('### 结果文件模板');\n lines.push('');\n lines.push('```markdown');\n lines.push('---');\n lines.push(`task_id: ${task.task_id}`);\n lines.push(`gene_slug: ${task.gene_slug}`);\n lines.push(`mode: ${task.mode}`);\n lines.push('decision: learned # direct_install | learned | failed');\n lines.push('self_eval: 0.8 # 0.0 - 1.0 自评分');\n lines.push('reason: \"我已理解并个性化了该技能\"');\n lines.push('---');\n lines.push('');\n lines.push('(如果 decision 为 learned,在此放入个性化后的 SKILL.md 内容)');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\nexport function generateForgetTaskMarkdown(\n slug: string,\n name: string,\n skillContent: string,\n callbackPath: string,\n): string {\n const taskId = `forget-${slug}-${Date.now()}`;\n return [\n '---',\n `task_id: ${taskId}`,\n 'mode: forget',\n `gene_slug: ${slug}`,\n `callback_path: ${callbackPath}`,\n `created_at: ${new Date().toISOString()}`,\n '---',\n '',\n `# 遗忘任务: ${name}`,\n '',\n '请回顾你使用该技能的经验,然后决定:',\n '',\n '- **forgotten**: 完全遗忘,清除所有痕迹',\n '- **simplified**: 保留精华,简化为更短的技能描述',\n '',\n '## 当前技能内容',\n '',\n '```',\n skillContent,\n '```',\n '',\n `请将遗忘结果写入 \\`${callbackPath}\\``,\n ].join('\\n');\n}\n"],"mappings":"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","names":["mkdir","readdir","readFile","rm","stat","writeFile","join","join","stat","mkdir","writeFile","rm","readdir","readFile","mkdir","readdir","readFile","rm","stat","writeFile","homedir","join","join","homedir","stat","mkdir","writeFile","rm","readdir","readFile","mkdir","readdir","readFile","rm","writeFile","join","join","readFile","writeFile","mkdir","readdir","rm"]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@nodeskai/genehub-sdk",
3
+ "version": "0.1.0",
4
+ "description": "GeneHub TypeScript SDK - API 客户端与产品适配器",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "prepublishOnly": "pnpm build",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "dependencies": {
25
+ "@nodeskai/genehub-types": "workspace:*",
26
+ "yaml": "^2.7"
27
+ },
28
+ "devDependencies": {
29
+ "tsup": "^8.3",
30
+ "typescript": "^5.7",
31
+ "vitest": "^3.0",
32
+ "@types/node": "^22.0"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/NoDeskAI/genehub.git",
37
+ "directory": "packages/sdk/typescript"
38
+ },
39
+ "homepage": "https://github.com/NoDeskAI/genehub",
40
+ "keywords": [
41
+ "genehub",
42
+ "ai",
43
+ "agent",
44
+ "gene",
45
+ "sdk"
46
+ ],
47
+ "license": "MIT"
48
+ }