diff --git a/crates-cli/yaak-cli/src/context.rs b/crates-cli/yaak-cli/src/context.rs index 61b06f1b..a895dc6c 100644 --- a/crates-cli/yaak-cli/src/context.rs +++ b/crates-cli/yaak-cli/src/context.rs @@ -67,7 +67,6 @@ impl CliContext { plugin_runtime_main, &query_manager, &PluginContext::new_empty(), - false, ) .await { diff --git a/crates-tauri/yaak-app/src/plugins_ext.rs b/crates-tauri/yaak-app/src/plugins_ext.rs index ced6bca8..29b95b67 100644 --- a/crates-tauri/yaak-app/src/plugins_ext.rs +++ b/crates-tauri/yaak-app/src/plugins_ext.rs @@ -10,6 +10,7 @@ use crate::error::Result; use crate::models_ext::QueryManagerExt; use log::{error, info, warn}; use serde::Serialize; +use std::path::PathBuf; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::time::{Duration, Instant}; @@ -239,10 +240,15 @@ pub fn init() -> TauriPlugin { Builder::new("yaak-plugins") .setup(|app_handle, _| { // Resolve paths for plugin manager - let vendored_plugin_dir = app_handle + let bundled_plugin_dir = app_handle .path() .resolve("vendored/plugins", BaseDirectory::Resource) .expect("failed to resolve plugin directory resource"); + let vendored_plugin_dir = if is_dev() { + resolve_workspace_plugins_dir().unwrap_or(bundled_plugin_dir) + } else { + bundled_plugin_dir + }; let installed_plugin_dir = app_handle .path() @@ -266,7 +272,6 @@ pub fn init() -> TauriPlugin { .expect("failed to resolve plugin runtime") .join("index.cjs"); - let dev_mode = is_dev(); let query_manager = app_handle.state::().inner().clone(); @@ -280,7 +285,6 @@ pub fn init() -> TauriPlugin { plugin_runtime_main, &query_manager, &PluginContext::new_empty(), - dev_mode, ) .await .expect("Failed to initialize plugins"); @@ -322,3 +326,11 @@ pub fn init() -> TauriPlugin { }) .build() } + +fn resolve_workspace_plugins_dir() -> Option { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../..") + .join("plugins") + .canonicalize() + .ok() +} diff --git a/crates/yaak-plugins/src/manager.rs b/crates/yaak-plugins/src/manager.rs index d7b30a08..7dc939ea 100644 --- a/crates/yaak-plugins/src/manager.rs +++ b/crates/yaak-plugins/src/manager.rs @@ -24,7 +24,6 @@ use crate::plugin_handle::PluginHandle; use crate::server_ws::PluginRuntimeServerWebsocket; use log::{error, info, warn}; use std::collections::HashMap; -use std::env; use std::path::{Path, PathBuf}; use std::sync::Arc; use std::time::Duration; @@ -48,7 +47,6 @@ pub struct PluginManager { ws_service: Arc, vendored_plugin_dir: PathBuf, pub(crate) installed_plugin_dir: PathBuf, - dev_mode: bool, } /// Callback for plugin initialization events (e.g., toast notifications) @@ -64,7 +62,6 @@ impl PluginManager { /// * `plugin_runtime_main` - Path to the plugin runtime index.cjs /// * `query_manager` - Query manager for bundled plugin registration and loading /// * `plugin_context` - Context to use while initializing plugins - /// * `dev_mode` - Whether the app is in dev mode (affects plugin loading) pub async fn new( vendored_plugin_dir: PathBuf, installed_plugin_dir: PathBuf, @@ -72,7 +69,6 @@ impl PluginManager { plugin_runtime_main: PathBuf, query_manager: &QueryManager, plugin_context: &PluginContext, - dev_mode: bool, ) -> Result { let (events_tx, mut events_rx) = mpsc::channel(2048); let (kill_server_tx, kill_server_rx) = tokio::sync::watch::channel(false); @@ -91,7 +87,6 @@ impl PluginManager { killed_rx: Arc::new(Mutex::new(Some(killed_rx))), vendored_plugin_dir, installed_plugin_dir, - dev_mode, }; // Forward events to subscribers @@ -192,25 +187,11 @@ impl PluginManager { Ok(plugin_manager) } - /// Get the vendored plugin directory path (resolves dev mode path if applicable) - pub fn get_plugins_dir(&self) -> PathBuf { - if self.dev_mode { - // Use plugins directly for easy development - // Tauri runs from crates-tauri/yaak-app/, so go up two levels to reach project root - env::current_dir() - .map(|cwd| cwd.join("../../plugins").canonicalize().unwrap()) - .unwrap_or_else(|_| self.vendored_plugin_dir.clone()) - } else { - self.vendored_plugin_dir.clone() - } - } - /// Read plugin directories from disk and return their paths. /// This is useful for discovering bundled plugins. pub async fn list_bundled_plugin_dirs(&self) -> Result> { - let plugins_dir = self.get_plugins_dir(); - info!("Loading bundled plugins from {plugins_dir:?}"); - read_plugins_dir(&plugins_dir).await + info!("Loading bundled plugins from {:?}", self.vendored_plugin_dir); + read_plugins_dir(&self.vendored_plugin_dir).await } pub async fn uninstall(&self, plugin_context: &PluginContext, dir: &str) -> Result<()> {