import assert from 'node:assert/strict'; import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import test from 'node:test'; import { parseMemoryV2ScaffoldArgs, runMemoryV2ScaffoldCli, } from './scaffold-memory-v2-backend.mjs'; function writableBuffer() { let value = ''; return { write(chunk) { value += String(chunk); }, value() { return value; }, }; } test('parseMemoryV2ScaffoldArgs parses scaffold options', () => { assert.deepEqual( parseMemoryV2ScaffoldArgs([ '--name', 'qdrant', '--category', 'semantic', '--role', 'scale-out', '--capability', 'resolve', '--flag', 'MEMORY_QDRANT_ENABLED', '--out', 'memory-v2-qdrant.mjs', '--write', ]), { name: 'qdrant', category: 'semantic', role: 'scale-out', capabilities: ['resolve'], flag: 'MEMORY_QDRANT_ENABLED', out: 'memory-v2-qdrant.mjs', write: true, help: false, }, ); }); test('runMemoryV2ScaffoldCli dry-run prints adapter source', async () => { const stdout = writableBuffer(); const result = await runMemoryV2ScaffoldCli({ argv: [ '--name', 'qdrant', '--category', 'semantic', '--capability', 'resolve', ], stdout, }); assert.equal(result.mode, 'dry-run'); assert.match(stdout.value(), /export function createQdrantMemoryBackend/); assert.match(stdout.value(), /name: 'qdrant'/); }); test('runMemoryV2ScaffoldCli writes new adapter and refuses overwrite', async () => { const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'memory-v2-scaffold-')); const stdout = writableBuffer(); const argv = [ '--name', 'mem0', '--category', 'extraction', '--capability', 'write', '--capability', 'compact', '--write', ]; const result = await runMemoryV2ScaffoldCli({ argv, stdout, cwd: tmpDir }); const written = await fs.readFile(path.join(tmpDir, 'memory-v2-mem0.mjs'), 'utf8'); assert.equal(result.mode, 'write'); assert.match(stdout.value(), /Memory V2 backend scaffold created/); assert.match(written, /export function createMem0MemoryBackend/); await assert.rejects( () => runMemoryV2ScaffoldCli({ argv, stdout: writableBuffer(), cwd: tmpDir }), /Refusing to overwrite/, ); });