@vooodooo/magic
Version:
Vooodooo - AI orchestration platform
178 lines • 7.04 kB
JavaScript
;
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