export_domain_pack
Export a project's domain knowledge—abbreviations, conventions, terms, and associations—as a portable YAML pack for review, curation, and reuse in other projects or tools.
Instructions
Export the project's full domain knowledge as a portable YAML pack — abbreviations, conventions, domain terms, and concept associations. Use when asked to 'export conventions', 'create a domain pack', or 'share naming rules'. The output can be reviewed, curated, and saved for use in other projects or tools.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- pi/extensions/index.ts:260-269 (schema)Tool definition/schema for 'export_domain_pack' — defines the MCP name, description, prompt snippet, and empty parameters object (no input args).
{ mcpName: "export_domain_pack", label: "Export Domain Pack", description: "Export the project's full domain knowledge as portable YAML — " + "abbreviations, conventions, domain terms, concept associations.", promptSnippet: "ontomics_export_domain_pack: export domain knowledge as YAML", parameters: Type.Object({}), }, - pi/extensions/index.ts:362-387 (registration)All tools including 'export_domain_pack' are registered via pi.registerTool() in a loop over toolDefs(). The registered name becomes 'ontomics_export_domain_pack'.
for (const def of toolDefs()) { pi.registerTool({ name: `ontomics_${def.mcpName}`, label: def.label, description: def.description, promptSnippet: def.promptSnippet, promptGuidelines: [ "Use ontomics tools BEFORE grep/glob for semantic codebase questions.", ], parameters: def.parameters, async execute(_toolCallId, params, _signal, onUpdate, _ctx) { onUpdate?.({ content: [{ type: "text", text: `Querying ontomics: ${def.mcpName}...` }], }); try { const mcp = await getClient(); const text = await mcp.callTool(def.mcpName, cleanArgs(params)); return { content: [{ type: "text", text }] }; } catch (err) { throw new Error( `ontomics ${def.mcpName} failed: ${err instanceof Error ? err.message : String(err)}`, ); } }, }); } - pi/extensions/index.ts:372-384 (handler)Handler function: delegates to the external 'ontomics' binary via MCP client's callTool("export_domain_pack", {}), sending the tool name and cleaned parameters over JSON-RPC stdio to the external process.
async execute(_toolCallId, params, _signal, onUpdate, _ctx) { onUpdate?.({ content: [{ type: "text", text: `Querying ontomics: ${def.mcpName}...` }], }); try { const mcp = await getClient(); const text = await mcp.callTool(def.mcpName, cleanArgs(params)); return { content: [{ type: "text", text }] }; } catch (err) { throw new Error( `ontomics ${def.mcpName} failed: ${err instanceof Error ? err.message : String(err)}`, ); } - pi/extensions/index.ts:13-99 (helper)McpClient helper class that communicates with the external 'ontomics' binary over stdio JSON-RPC. The callTool method sends a tools/call request, dispatching to the actual server-side implementation of 'export_domain_pack'.
class McpClient { private proc: ChildProcess; private rl: ReadlineInterface; private nextId = 1; private pending = new Map< number, { resolve: (v: unknown) => void; reject: (e: Error) => void } >(); private constructor(proc: ChildProcess) { this.proc = proc; this.rl = createInterface({ input: proc.stdout! }); this.rl.on("line", (line: string) => this.onLine(line)); proc.stderr?.on("data", () => {}); } static async start(binaryPath: string, cwd: string): Promise<McpClient> { const proc = spawn(binaryPath, ["serve"], { cwd, stdio: ["pipe", "pipe", "pipe"], }); const client = new McpClient(proc); await client.request("initialize", { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "pi-ontomics", version: "1.0.0" }, }); client.notify("notifications/initialized", {}); return client; } async callTool( name: string, args: Record<string, unknown>, ): Promise<string> { const result = (await this.request("tools/call", { name, arguments: args, })) as { content?: Array<{ text?: string }> }; const text = result.content?.[0]?.text ?? JSON.stringify(result); return text; } dispose(): void { this.proc.kill(); this.rl.close(); } get alive(): boolean { return !this.proc.killed && this.proc.exitCode === null; } private request(method: string, params: unknown): Promise<unknown> { const id = this.nextId++; return new Promise((resolve, reject) => { this.pending.set(id, { resolve, reject }); this.write({ jsonrpc: "2.0", id, method, params }); }); } private notify(method: string, params: unknown): void { this.write({ jsonrpc: "2.0", method, params }); } private write(msg: unknown): void { this.proc.stdin!.write(JSON.stringify(msg) + "\n"); } private onLine(line: string): void { if (!line.trim()) return; try { const msg = JSON.parse(line) as { id?: number; result?: unknown; error?: { message: string }; }; if (msg.id != null && this.pending.has(msg.id)) { const { resolve, reject } = this.pending.get(msg.id)!; this.pending.delete(msg.id); if (msg.error) reject(new Error(msg.error.message)); else resolve(msg.result); } } catch { // ignore non-JSON lines (e.g. stderr leaks) } } }