sead-method-core
Version:
Specification Enforced Agentic Agile Development - A hybrid methodology preventing AI agent drift through catalog-based constraints with comprehensive external asset integration
117 lines (103 loc) • 2.92 kB
JavaScript
/**
* Module Manager - Centralized dynamic import management
* Handles loading and caching of ES modules to reduce memory overhead
*/
class ModuleManager {
constructor() {
this._cache = new Map();
this._loadingPromises = new Map();
}
/**
* Initialize all commonly used ES modules at once
* @returns {Promise<Object>} Object containing all loaded modules
*/
async initializeCommonModules() {
const modules = await Promise.all([
this.getModule('chalk'),
this.getModule('ora'),
this.getModule('inquirer'),
]);
return {
chalk: modules[0],
ora: modules[1],
inquirer: modules[2],
};
}
/**
* Get a module by name, with caching
* @param {string} moduleName - Name of the module to load
* @returns {Promise<any>} The loaded module
*/
async getModule(moduleName) {
// Return from cache if available
if (this._cache.has(moduleName)) {
return this._cache.get(moduleName);
}
// If already loading, return the existing promise
if (this._loadingPromises.has(moduleName)) {
return this._loadingPromises.get(moduleName);
}
// Start loading the module
const loadPromise = this._loadModule(moduleName);
this._loadingPromises.set(moduleName, loadPromise);
try {
const module = await loadPromise;
this._cache.set(moduleName, module);
this._loadingPromises.delete(moduleName);
return module;
} catch (error) {
this._loadingPromises.delete(moduleName);
throw error;
}
}
/**
* Internal method to load a specific module
* @private
*/
async _loadModule(moduleName) {
switch (moduleName) {
case 'chalk': {
return (await import('chalk')).default;
}
case 'ora': {
return (await import('ora')).default;
}
case 'inquirer': {
return (await import('inquirer')).default;
}
case 'glob': {
// For glob v7, the default export is the glob function
const glob = require('glob');
return glob;
}
case 'globSync': {
return (await import('glob')).globSync;
}
default: {
throw new Error(`Unknown module: ${moduleName}`);
}
}
}
/**
* Clear the module cache to free memory
*/
clearCache() {
this._cache.clear();
this._loadingPromises.clear();
}
/**
* Get multiple modules at once
* @param {string[]} moduleNames - Array of module names
* @returns {Promise<Object>} Object with module names as keys
*/
async getModules(moduleNames) {
const modules = await Promise.all(moduleNames.map((name) => this.getModule(name)));
return moduleNames.reduce((accumulator, name, index) => {
accumulator[name] = modules[index];
return accumulator;
}, {});
}
}
// Singleton instance
const moduleManager = new ModuleManager();
module.exports = moduleManager;