From 1f8fa0f8c3f6f1f618dbf691955517565182370f Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 5 Jan 2026 15:35:25 -0800 Subject: [PATCH] Separate app DB per Git worktree (#348) --- scripts/git-hooks/post-checkout.mjs | 6 ++++++ src-tauri/yaak-models/src/lib.rs | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/scripts/git-hooks/post-checkout.mjs b/scripts/git-hooks/post-checkout.mjs index 1cc50e36..1b387076 100644 --- a/scripts/git-hooks/post-checkout.mjs +++ b/scripts/git-hooks/post-checkout.mjs @@ -86,6 +86,9 @@ try { // Continue with default ports } +// Get worktree name from current directory +const worktreeName = path.basename(process.cwd()); + // Create .env.local with unique ports const envContent = `# Auto-generated by git post-checkout hook # This file configures ports for this worktree to avoid conflicts @@ -95,6 +98,9 @@ YAAK_DEV_PORT=${maxDevPort} # MCP Server port (main worktree uses 64343) YAAK_PLUGIN_MCP_SERVER_PORT=${maxMcpPort} + +# Database path prefix for worktree isolation +YAAK_DB_PATH_PREFIX=worktrees/${worktreeName} `; fs.writeFileSync(envLocalPath, envContent, 'utf8'); diff --git a/src-tauri/yaak-models/src/lib.rs b/src-tauri/yaak-models/src/lib.rs index 7af9be14..2c190159 100644 --- a/src-tauri/yaak-models/src/lib.rs +++ b/src-tauri/yaak-models/src/lib.rs @@ -51,8 +51,17 @@ pub fn init() -> TauriPlugin { let app_path = app_handle.path().app_data_dir().unwrap(); create_dir_all(app_path.clone()).expect("Problem creating App directory!"); - let db_file_path = app_path.join("db.sqlite"); - let blob_db_file_path = app_path.join("blobs.sqlite"); + // Support per-worktree databases via YAAK_DB_PATH_PREFIX env var + let db_dir = match std::env::var("YAAK_DB_PATH_PREFIX") { + Ok(prefix) if !prefix.is_empty() => { + let dir = app_path.join(prefix); + create_dir_all(&dir).expect("Problem creating DB directory!"); + dir + } + _ => app_path.clone(), + }; + let db_file_path = db_dir.join("db.sqlite"); + let blob_db_file_path = db_dir.join("blobs.sqlite"); // Main database pool let manager = SqliteConnectionManager::file(db_file_path);