/** * Vault CLI — export vault entries as browsable markdown files. * * `soleri vault export` — export to ./knowledge/vault/ * `soleri vault export --path ~/obsidian` — export to custom directory * `soleri vault export --domain arch` — filter by domain */ import { resolve } from 'node:path'; import type { Command } from 'commander'; import { detectAgent } from '../utils/agent-context.js'; import * as log from '../utils/logger.js'; import { resolveVaultDbPath } from '../utils/vault-db.js'; export function registerVault(program: Command): void { const vault = program.command('vault').description('Vault knowledge management'); vault .command('export') .description('Export vault entries as browsable markdown files') .option('--path ', 'Output directory (default: ./knowledge/)') .option('--domain ', 'Filter by domain') .action(async (opts: { path?: string; domain?: string }) => { const agent = detectAgent(); if (!agent) { log.fail('Not in a Soleri agent project', 'Run from an agent directory'); process.exit(1); } const outputDir = opts.path ? resolve(opts.path) : resolve('knowledge'); const vaultDbPath = resolveVaultDbPath(agent.agentId); if (!vaultDbPath) { log.fail('Vault DB not found', 'Run the agent once to initialize its vault database.'); process.exit(1); } // Dynamic import to avoid loading better-sqlite3 unless needed const { Vault } = await import('@soleri/core'); const vaultInstance = new Vault(vaultDbPath); try { log.heading('Vault Export'); if (opts.domain) { const { syncEntryToMarkdown } = await import('@soleri/core'); const entries = vaultInstance.list({ limit: 10000, domain: opts.domain }); let synced = 0; for (const entry of entries) { await syncEntryToMarkdown(entry, outputDir); synced++; } log.pass( `Exported ${synced} entries from domain "${opts.domain}"`, `${outputDir}/vault/`, ); } else { const { syncAllToMarkdown } = await import('@soleri/core'); const result = await syncAllToMarkdown(vaultInstance, outputDir); log.pass( `Exported ${result.synced} entries (${result.skipped} unchanged)`, `${outputDir}/vault/`, ); } } finally { vaultInstance.close(); } }); }