UNPKG

@vooodooo/magic

Version:

Vooodooo - AI orchestration platform

178 lines 7.04 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PluginDiscovery = void 0; exports.createPluginDiscovery = createPluginDiscovery; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); /** * System for discovering Vooodooo plugins */ class PluginDiscovery { constructor(options = {}) { this.options = { localPluginsDir: path_1.default.resolve(process.cwd(), 'plugins'), scanNodeModules: true, additionalDirs: [], npmPrefix: '@vooodooo/', ...options, }; } /** * Discover all available plugins */ async discoverPlugins() { const discoveredPlugins = []; // Discover local plugins const localPlugins = await this.discoverLocalPlugins(); discoveredPlugins.push(...localPlugins); // Discover npm plugins if (this.options.scanNodeModules) { const npmPlugins = await this.discoverNpmPlugins(); discoveredPlugins.push(...npmPlugins); } // Discover plugins in additional directories if (this.options.additionalDirs && this.options.additionalDirs.length > 0) { for (const dir of this.options.additionalDirs) { const additionalPlugins = await this.discoverPluginsInDir(dir, 'local'); discoveredPlugins.push(...additionalPlugins); } } return discoveredPlugins; } /** * Discover plugins in the local plugins directory */ async discoverLocalPlugins() { const pluginsDir = this.options.localPluginsDir; if (!pluginsDir || !fs_1.default.existsSync(pluginsDir)) { return []; } return this.discoverPluginsInDir(pluginsDir, 'local'); } /** * Discover Vooodooo plugins installed from npm */ async discoverNpmPlugins() { const discoveredPlugins = []; const npmPrefix = this.options.npmPrefix || '@vooodooo/'; // Get all node_modules directories up the directory tree const nodeModulesDirs = this.findNodeModulesDirs(); for (const nodeModulesDir of nodeModulesDirs) { if (!fs_1.default.existsSync(nodeModulesDir)) { continue; } // Look for @vooodooo directory const scopeDir = path_1.default.join(nodeModulesDir, '@vooodooo'); if (!fs_1.default.existsSync(scopeDir)) { continue; } try { const items = fs_1.default.readdirSync(scopeDir, { withFileTypes: true }); for (const item of items) { if (!item.isDirectory()) { continue; } const pluginDir = path_1.default.join(scopeDir, item.name); const manifestPath = path_1.default.join(pluginDir, 'package.json'); if (!fs_1.default.existsSync(manifestPath)) { continue; } try { const manifestContent = fs_1.default.readFileSync(manifestPath, 'utf8'); const manifest = JSON.parse(manifestContent); // Check if this is a Vooodooo plugin if (manifest.keywords && Array.isArray(manifest.keywords) && manifest.keywords.includes('vooodooo-plugin')) { discoveredPlugins.push({ id: manifest.name, path: pluginDir, manifest, source: 'npm', }); } } catch (error) { console.warn(`Error reading manifest for npm plugin ${item.name}:`, error); } } } catch (error) { console.warn(`Error scanning npm scope directory:`, error); } } return discoveredPlugins; } /** * Discover plugins in a specific directory */ async discoverPluginsInDir(dir, source) { const discoveredPlugins = []; if (!fs_1.default.existsSync(dir)) { return []; } try { const items = fs_1.default.readdirSync(dir, { withFileTypes: true }); for (const item of items) { if (!item.isDirectory()) { continue; } const pluginDir = path_1.default.join(dir, item.name); let manifestPath = path_1.default.join(pluginDir, 'manifest.json'); // If manifest.json doesn't exist, try package.json if (!fs_1.default.existsSync(manifestPath)) { manifestPath = path_1.default.join(pluginDir, 'package.json'); if (!fs_1.default.existsSync(manifestPath)) { continue; } } try { const manifestContent = fs_1.default.readFileSync(manifestPath, 'utf8'); const manifest = JSON.parse(manifestContent); // Check if this is a valid plugin manifest if (manifest.id || (manifest.name && manifest.version)) { discoveredPlugins.push({ id: manifest.id || manifest.name, path: pluginDir, manifest, source, }); } } catch (error) { console.warn(`Error reading manifest for plugin ${item.name}:`, error); } } } catch (error) { console.warn(`Error scanning directory ${dir}:`, error); } return discoveredPlugins; } /** * Find all node_modules directories up the directory tree */ findNodeModulesDirs() { const dirs = []; let currentDir = process.cwd(); // Add the immediate node_modules directory dirs.push(path_1.default.join(currentDir, 'node_modules')); // Add node_modules directories up the tree while (currentDir !== path_1.default.dirname(currentDir)) { currentDir = path_1.default.dirname(currentDir); dirs.push(path_1.default.join(currentDir, 'node_modules')); } return dirs; } } exports.PluginDiscovery = PluginDiscovery; /** * Create a plugin discovery system */ function createPluginDiscovery(options) { return new PluginDiscovery(options); } //# sourceMappingURL=plugin-discovery.js.map