Skip to main content
Glama
profile-loader.jsโ€ข4.89 kB
/** * Profile Loader for SSH Manager * Loads configuration profiles for different project types */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const PROFILES_DIR = path.join(__dirname, '..', 'profiles'); const PROFILE_CONFIG_FILE = path.join(__dirname, '..', '.ssh-manager-profile'); /** * Get the active profile name */ export function getActiveProfileName() { // 1. Check environment variable if (process.env.SSH_MANAGER_PROFILE) { return process.env.SSH_MANAGER_PROFILE; } // 2. Check configuration file if (fs.existsSync(PROFILE_CONFIG_FILE)) { try { const profileName = fs.readFileSync(PROFILE_CONFIG_FILE, 'utf8').trim(); if (profileName) { return profileName; } } catch (error) { console.error(`Error reading profile config: ${error.message}`); } } // 3. Default to 'default' profile return 'default'; } /** * Load a profile by name */ export function loadProfile(profileName = null) { const name = profileName || getActiveProfileName(); const profilePath = path.join(PROFILES_DIR, `${name}.json`); try { if (fs.existsSync(profilePath)) { const profileData = fs.readFileSync(profilePath, 'utf8'); const profile = JSON.parse(profileData); console.error(`๐Ÿ“ฆ Loaded profile: ${profile.name} - ${profile.description}`); return profile; } else { console.error(`โš ๏ธ Profile '${name}' not found, using default profile`); return loadDefaultProfile(); } } catch (error) { console.error(`โŒ Error loading profile '${name}': ${error.message}`); return loadDefaultProfile(); } } /** * Load the default profile */ function loadDefaultProfile() { const defaultPath = path.join(PROFILES_DIR, 'default.json'); try { if (fs.existsSync(defaultPath)) { const profileData = fs.readFileSync(defaultPath, 'utf8'); return JSON.parse(profileData); } } catch (error) { console.error(`Error loading default profile: ${error.message}`); } // Return minimal profile if default doesn't exist return { name: 'minimal', description: 'Minimal profile', commandAliases: {}, hooks: {} }; } /** * List all available profiles */ export function listProfiles() { try { const files = fs.readdirSync(PROFILES_DIR); const profiles = []; for (const file of files) { if (file.endsWith('.json')) { const profilePath = path.join(PROFILES_DIR, file); try { const data = fs.readFileSync(profilePath, 'utf8'); const profile = JSON.parse(data); profiles.push({ name: profile.name || file.replace('.json', ''), description: profile.description || 'No description', file: file, aliasCount: Object.keys(profile.commandAliases || {}).length, hookCount: Object.keys(profile.hooks || {}).length }); } catch (error) { console.error(`Error reading profile ${file}: ${error.message}`); } } } return profiles; } catch (error) { console.error(`Error listing profiles: ${error.message}`); return []; } } /** * Set the active profile */ export function setActiveProfile(profileName) { try { // Verify profile exists const profilePath = path.join(PROFILES_DIR, `${profileName}.json`); if (!fs.existsSync(profilePath)) { throw new Error(`Profile '${profileName}' does not exist`); } // Write to config file fs.writeFileSync(PROFILE_CONFIG_FILE, profileName); return true; } catch (error) { console.error(`Error setting active profile: ${error.message}`); return false; } } /** * Create a custom profile */ export function createProfile(name, config) { try { const profilePath = path.join(PROFILES_DIR, `${name}.json`); // Check if profile already exists if (fs.existsSync(profilePath)) { throw new Error(`Profile '${name}' already exists`); } const profile = { name: name, description: config.description || `Custom profile: ${name}`, commandAliases: config.commandAliases || {}, hooks: config.hooks || {} }; fs.writeFileSync(profilePath, JSON.stringify(profile, null, 2)); return true; } catch (error) { console.error(`Error creating profile: ${error.message}`); return false; } } /** * Merge profiles (useful for extending base profiles) */ export function mergeProfiles(baseProfileName, extensions) { const baseProfile = loadProfile(baseProfileName); return { ...baseProfile, commandAliases: { ...baseProfile.commandAliases, ...extensions.commandAliases }, hooks: { ...baseProfile.hooks, ...extensions.hooks } }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bvisible/mcp-ssh-manager'

If you have feedback or need assistance with the MCP directory API, please join our Discord server