feat: 持久化从 JSON 迁移到 DuckDB,启动自动迁移存量数据并全面异步化
build-and-deploy / build-and-deploy (push) Successful in 37s

- 新增 src/persistence/duckdbAdapter:与 jsonAdapter 同接口的异步适配器,
  数据存于 data/registry.duckdb,首次启动自动从 JSON 迁移并备份 json-backup-<ts>
- 全部服务层(project/config/user/token)与路由改为 async/await
- MCP 工具与鉴权同步异步化,系统 mode 读写迁移至 DuckDB
- 服务启动流程:init DB -> 自动迁移 -> 确保默认管理员 -> listen
- 新增 DuckDB 往返/迁移测试,测试目录隔离 REGISTRY_DATA_DIR
This commit is contained in:
jif2.zhang
2026-09-14 10:35:38 +08:00
parent 2ba09fa7a1
commit 6bbd4bc471
19 changed files with 958 additions and 302 deletions
+19 -9
View File
@@ -5,22 +5,32 @@
*/
const test = require("node:test");
const assert = require("node:assert");
const fs = require("node:fs");
const os = require("node:os");
const path = require("node:path");
const { createMcpServer } = require("../src/mcp/tools");
const { loadSystem, saveSystem } = require("../src/persistence/jsonAdapter");
const { init, loadSystem, saveSystem } = require("../src/persistence/duckdbAdapter");
// 恢复测试前的系统模式,避免影响其他用例
const originalMode = (loadSystem() || {}).mode || "edit";
test.after(() => {
const system = loadSystem() || {};
system.mode = originalMode;
saveSystem(system);
});
// 使用临时数据目录,避免污染真实 data/
const tmpDataDir = fs.mkdtempSync(path.join(os.tmpdir(), "registry-mcp-test-"));
process.env.REGISTRY_DATA_DIR = tmpDataDir;
let server;
test.before(() => {
let originalMode = "edit";
// 初始化 DuckDB,记录测试前模式;测试结束后恢复原模式
test.before(async () => {
await init();
originalMode = (await loadSystem() || {}).mode || "edit";
server = createMcpServer();
});
test.after(async () => {
const system = await loadSystem() || {};
system.mode = originalMode;
await saveSystem(system);
});
/**
* 直接调用已注册工具的处理函数
* @param {string} name - 工具名