From 6c9a8d1dca6cfa887a4c2057f806f2bf44df24d9 Mon Sep 17 00:00:00 2001 From: Dmitry Guyvoronsky Date: Tue, 18 Nov 2025 12:20:41 -0800 Subject: [PATCH] fix: improve worker startup on fresh install This fixes the issue where the worker service wouldn't start automatically after installing the plugin, leaving users with confusing error messages. Changes: - Update worker-utils.ts to use local PM2 from node_modules instead of requiring it in PATH - Improve error messages to suggest npx pm2 commands - Add auto-start attempt in smart-install.js after fresh installation - Fall back gracefully if worker can't start (will auto-start on first use) Fixes issue where users with PM2 not in their PATH couldn't start the worker. --- scripts/smart-install.js | 23 ++++++++++++++++++++--- src/shared/worker-utils.ts | 13 ++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/scripts/smart-install.js b/scripts/smart-install.js index 83c1c877..e238345d 100644 --- a/scripts/smart-install.js +++ b/scripts/smart-install.js @@ -260,10 +260,27 @@ async function main() { log('', colors.reset); process.exit(1); } - } - // Worker will be started lazily when needed (e.g., when save-hook sends data) - // Context hook only needs database access, not the worker service + // Try to start the PM2 worker after fresh install + try { + log('🚀 Starting worker service...', colors.cyan); + const localPm2 = join(NODE_MODULES_PATH, '.bin', 'pm2'); + const pm2Command = existsSync(localPm2) ? localPm2 : 'pm2'; + const ecosystemPath = join(PLUGIN_ROOT, 'ecosystem.config.cjs'); + + execSync(`"${pm2Command}" start "${ecosystemPath}"`, { + cwd: PLUGIN_ROOT, + stdio: 'pipe', + encoding: 'utf-8' + }); + + log('✅ Worker service started', colors.green); + } catch (error) { + // Worker might already be running or PM2 not available - that's okay + // The ensureWorkerRunning() function will handle auto-start when needed + log('â„šī¸ Worker will start automatically when needed', colors.dim); + } + } // Success - dependencies installed (if needed) process.exit(0); diff --git a/src/shared/worker-utils.ts b/src/shared/worker-utils.ts index 908ca35c..f471390e 100644 --- a/src/shared/worker-utils.ts +++ b/src/shared/worker-utils.ts @@ -55,9 +55,13 @@ async function startWorker(): Promise { throw new Error(`Ecosystem config not found at ${ecosystemPath}`); } + // Try to use local PM2 from node_modules first, fall back to global PM2 + const localPm2 = path.join(pluginRoot, 'node_modules', '.bin', 'pm2'); + const pm2Command = existsSync(localPm2) ? localPm2 : 'pm2'; + // Start using PM2 with the ecosystem config // CRITICAL: Must set cwd to pluginRoot so PM2 starts from marketplace directory - execSync(`pm2 start "${ecosystemPath}"`, { + execSync(`"${pm2Command}" start "${ecosystemPath}"`, { cwd: pluginRoot, stdio: 'pipe', encoding: 'utf-8' @@ -93,10 +97,13 @@ export async function ensureWorkerRunning(): Promise { if (!started) { const port = getWorkerPort(); + const pluginRoot = getPackageRoot(); throw new Error( `Worker service failed to start on port ${port}.\n\n` + - `Try manually running: pm2 start ecosystem.config.cjs\n` + - `Or restart: pm2 restart claude-mem-worker` + `To start manually, run:\n` + + ` cd ${pluginRoot}\n` + + ` npx pm2 start ecosystem.config.cjs\n\n` + + `If already running, try: npx pm2 restart claude-mem-worker` ); } }