#!/usr/bin/env node /** * Protected sync-marketplace script * * Prevents accidental rsync overwrite when installed plugin is on beta branch. * If on beta, the user should use the UI to update instead. */ const { execSync } = require('child_process'); const { existsSync, readFileSync } = require('fs'); const path = require('path'); const os = require('os'); const INSTALLED_PATH = path.join(os.homedir(), '.claude', 'plugins', 'marketplaces', 'thedotmack'); const CACHE_BASE_PATH = path.join(os.homedir(), '.claude', 'plugins', 'cache', 'thedotmack', 'claude-mem'); function getCurrentBranch() { try { if (!existsSync(path.join(INSTALLED_PATH, '.git'))) { return null; } return execSync('git rev-parse --abbrev-ref HEAD', { cwd: INSTALLED_PATH, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim(); } catch { return null; } } const branch = getCurrentBranch(); const isForce = process.argv.includes('--force'); if (branch && branch !== 'main' && !isForce) { console.log(''); console.log('\x1b[33m%s\x1b[0m', `WARNING: Installed plugin is on beta branch: ${branch}`); console.log('\x1b[33m%s\x1b[0m', 'Running rsync would overwrite beta code.'); console.log(''); console.log('Options:'); console.log(' 1. Use UI at http://localhost:37777 to update beta'); console.log(' 2. Switch to stable in UI first, then run sync'); console.log(' 3. Force rsync: npm run sync-marketplace:force'); console.log(''); process.exit(1); } // Get version from plugin.json function getPluginVersion() { try { const pluginJsonPath = path.join(__dirname, '..', 'plugin', '.claude-plugin', 'plugin.json'); const pluginJson = JSON.parse(readFileSync(pluginJsonPath, 'utf-8')); return pluginJson.version; } catch (error) { console.error('\x1b[31m%s\x1b[0m', 'Failed to read plugin version:', error.message); process.exit(1); } } // Normal rsync for main branch or fresh install console.log('Syncing to marketplace...'); try { execSync( 'rsync -av --delete --exclude=.git ./ ~/.claude/plugins/marketplaces/thedotmack/', { stdio: 'inherit' } ); console.log('Running npm install in marketplace...'); execSync( 'cd ~/.claude/plugins/marketplaces/thedotmack/ && npm install', { stdio: 'inherit' } ); // Sync to cache folder with version const version = getPluginVersion(); const CACHE_VERSION_PATH = path.join(CACHE_BASE_PATH, version); console.log(`Syncing to cache folder (version ${version})...`); execSync( `rsync -av --delete --exclude=.git plugin/ "${CACHE_VERSION_PATH}/"`, { stdio: 'inherit' } ); console.log('\x1b[32m%s\x1b[0m', 'Sync complete!'); } catch (error) { console.error('\x1b[31m%s\x1b[0m', 'Sync failed:', error.message); process.exit(1); }