From 4c6e5964a8f89970dc517c1b37cc9bf8486c6a1e Mon Sep 17 00:00:00 2001 From: oliver Date: Sat, 12 Sep 2026 11:47:48 +0800 Subject: [PATCH] fix: migrate packaged canvas DB to stable DSH_HOME path on update Co-authored-by: Cursor --- packages/dsh-plugin/lib/runtime.js | 37 +++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/dsh-plugin/lib/runtime.js b/packages/dsh-plugin/lib/runtime.js index 2f3e3e7..21060e9 100644 --- a/packages/dsh-plugin/lib/runtime.js +++ b/packages/dsh-plugin/lib/runtime.js @@ -9,7 +9,7 @@ */ import { spawn, execSync } from 'node:child_process' -import { existsSync, statSync } from 'node:fs' +import { existsSync, statSync, mkdirSync, copyFileSync, cpSync } from 'node:fs' import { join, dirname, relative } from 'node:path' import { fileURLToPath } from 'node:url' import { createRequire } from 'node:module' @@ -50,6 +50,40 @@ function resolveDataDir(explicit) { return join(mindMapRoot, 'data') } +/** One-shot: move DB out of package dir so plugin updates don't orphan canvases. */ +function migratePackagedDataIfNeeded(dataDir) { + if (!isPackagedInstall()) return + try { + const destDb = join(dataDir, 'mindmap.sqlite') + if (existsSync(destDb)) return + const candidates = [ + join(pluginRoot, 'data', 'mindmap.sqlite'), + join(pluginRoot, 'bundle', '_testdata', 'mindmap.sqlite'), + ] + for (const srcDb of candidates) { + if (!existsSync(srcDb)) continue + const srcDir = dirname(srcDb) + mkdirSync(dataDir, { recursive: true }) + for (const name of ['mindmap.sqlite', 'mindmap.sqlite-shm', 'mindmap.sqlite-wal']) { + const from = join(srcDir, name) + const to = join(dataDir, name) + if (existsSync(from) && !existsSync(to)) { + copyFileSync(from, to) + } + } + const uploadsFrom = join(srcDir, 'uploads') + const uploadsTo = join(dataDir, 'uploads') + if (existsSync(uploadsFrom) && !existsSync(uploadsTo)) { + cpSync(uploadsFrom, uploadsTo, { recursive: true }) + } + console.log(`[dsh-mind-map] migrated canvas DB → ${dataDir}`) + return + } + } catch (e) { + console.warn('[dsh-mind-map] data migrate skipped:', e?.message || e) + } +} + function resolveTsxCliRel() { const candidates = [ join(mindMapRoot, 'node_modules', 'tsx', 'dist', 'cli.mjs'), @@ -239,6 +273,7 @@ export function createRuntime() { const packaged = isPackagedInstall() const resolvedDataDir = resolveDataDir(dataDir) + migratePackagedDataIfNeeded(resolvedDataDir) const env = { ...process.env, PORT: String(port),