UNPKG

@ace-sdk/cli

Version:

ACE CLI - Command-line tool for intelligent pattern learning and playbook management

267 lines β€’ 9.64 kB
/** * Plugin management commands */ import { getPluginLoader } from '../services/plugin-loader.js'; import { globalOptions } from '../cli.js'; import { Logger } from '../services/logger.js'; import chalk from 'chalk'; import * as readline from 'readline/promises'; import { stdin, stdout } from 'process'; /** * List all available plugins */ export async function pluginListCommand() { const logger = new Logger(globalOptions); try { const loader = getPluginLoader(logger); const plugins = loader.discoverPlugins(); // Note: registry available via loader.getRegistry() if needed if (logger.isJson()) { logger.output({ plugins: plugins.map(p => ({ name: p.name, version: p.version, description: p.description, enabled: loader.isEnabled(p.name), trusted: loader.isTrusted(p), commands: p.commands?.length || 0 })) }); } else { if (plugins.length === 0) { logger.info('No plugins found'); logger.info(chalk.dim(`Install plugins to ~/.ace/plugins/`)); return; } logger.info(chalk.bold(`\nπŸ”Œ Available Plugins (${plugins.length})\n`)); for (const plugin of plugins) { const trusted = loader.isTrusted(plugin); const enabled = loader.isEnabled(plugin.name); const statusIcon = !trusted ? chalk.yellow('⚠') : enabled ? chalk.green('βœ“') : chalk.dim('β—‹'); const statusText = !trusted ? chalk.yellow('UNTRUSTED') : enabled ? chalk.green('ENABLED') : chalk.dim('DISABLED'); logger.info(`${statusIcon} ${chalk.cyan(plugin.name)} ${chalk.dim(`v${plugin.version}`)} [${statusText}]`); if (plugin.description) { logger.info(chalk.dim(` ${plugin.description}`)); } if (plugin.commands && plugin.commands.length > 0) { logger.info(chalk.dim(` Commands: ${plugin.commands.map(c => c.name).join(', ')}`)); } if (!trusted) { logger.info(chalk.yellow(` ⚠ Run 'ce-ace plugin trust ${plugin.name}' to trust this plugin`)); } logger.info(''); } logger.info(chalk.dim('Run \'ce-ace plugin trust <name>\' to trust a plugin')); logger.info(chalk.dim('Run \'ce-ace plugin enable <name>\' to enable a plugin')); logger.info(chalk.dim('Run \'ce-ace plugin disable <name>\' to disable a plugin\n')); } } catch (error) { if (logger.isJson()) { logger.output({ success: false, error: error instanceof Error ? error.message : String(error) }); } else { logger.error('Failed to list plugins', error instanceof Error ? error : String(error)); } process.exit(1); } } /** * Trust a plugin */ export async function pluginTrustCommand(name, options) { const logger = new Logger(globalOptions); try { const loader = getPluginLoader(logger); const plugins = loader.discoverPlugins(); // Find plugin const plugin = plugins.find(p => p.name === name); if (!plugin) { throw new Error(`Plugin not found: ${name}`); } // Check if already trusted if (loader.isTrusted(plugin)) { if (logger.isJson()) { logger.output({ success: true, message: 'Plugin already trusted', plugin: name }); } else { logger.info(chalk.yellow(`Plugin "${name}" is already trusted`)); } return; } // Show warning and get confirmation if (!options.yes && !logger.isJson()) { logger.warn(`⚠️ Security Warning: Trusting plugins`); logger.info(''); logger.info(chalk.dim('Plugins can execute arbitrary code with access to:')); if (plugin.permissions?.network) { logger.info(chalk.dim(' β€’ Network requests')); } if (plugin.permissions?.filesystem) { logger.info(chalk.dim(` β€’ Filesystem (${plugin.permissions.filesystem})`)); } if (plugin.permissions?.environment) { logger.info(chalk.dim(' β€’ Environment variables')); } if (plugin.permissions?.subprocess) { logger.info(chalk.dim(' β€’ Subprocess execution')); } logger.info(''); logger.info(chalk.dim('Only trust plugins from sources you trust.')); logger.info(''); const rl = readline.createInterface({ input: stdin, output: stdout }); const answer = await rl.question(chalk.yellow(`Trust plugin "${name}" v${plugin.version}? (y/N): `)); rl.close(); if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 'yes') { logger.info(chalk.dim('Cancelled')); return; } } // Trust plugin loader.trustPlugin(name, plugin.version); if (logger.isJson()) { logger.output({ success: true, plugin: name, version: plugin.version }); } else { logger.success(`βœ… Plugin "${name}" v${plugin.version} is now trusted`); logger.info(chalk.dim(`Run 'ce-ace plugin enable ${name}' to enable it`)); } } catch (error) { if (logger.isJson()) { logger.output({ success: false, error: error instanceof Error ? error.message : String(error) }); } else { logger.error('Failed to trust plugin', error instanceof Error ? error : String(error)); } process.exit(1); } } /** * Untrust a plugin */ export async function pluginUntrustCommand(name) { const logger = new Logger(globalOptions); try { const loader = getPluginLoader(logger); loader.untrustPlugin(name); if (logger.isJson()) { logger.output({ success: true, plugin: name }); } else { logger.success(`πŸ”“ Plugin "${name}" is no longer trusted`); logger.info(chalk.dim('The plugin has been automatically disabled')); } } catch (error) { if (logger.isJson()) { logger.output({ success: false, error: error instanceof Error ? error.message : String(error) }); } else { logger.error('Failed to untrust plugin', error instanceof Error ? error : String(error)); } process.exit(1); } } /** * Enable a plugin */ export async function pluginEnableCommand(name) { const logger = new Logger(globalOptions); try { const loader = getPluginLoader(logger); const plugins = loader.discoverPlugins(); // Find plugin const plugin = plugins.find(p => p.name === name); if (!plugin) { throw new Error(`Plugin not found: ${name}`); } // Check if trusted if (!loader.isTrusted(plugin)) { throw new Error(`Plugin "${name}" is not trusted. Run "ce-ace plugin trust ${name}" first.`); } // Enable plugin loader.enablePlugin(name); if (logger.isJson()) { logger.output({ success: true, plugin: name }); } else { logger.success(`βœ… Plugin "${name}" enabled`); if (plugin.commands && plugin.commands.length > 0) { logger.info(chalk.dim('Available commands:')); for (const cmd of plugin.commands) { logger.info(chalk.dim(` β€’ ce-ace ${name}:${cmd.name} - ${cmd.description}`)); } } } } catch (error) { if (logger.isJson()) { logger.output({ success: false, error: error instanceof Error ? error.message : String(error) }); } else { logger.error('Failed to enable plugin', error instanceof Error ? error : String(error)); } process.exit(1); } } /** * Disable a plugin */ export async function pluginDisableCommand(name) { const logger = new Logger(globalOptions); try { const loader = getPluginLoader(logger); loader.disablePlugin(name); if (logger.isJson()) { logger.output({ success: true, plugin: name }); } else { logger.success(`⏸️ Plugin "${name}" disabled`); logger.info(chalk.dim(`Run 'ce-ace plugin enable ${name}' to re-enable it`)); } } catch (error) { if (logger.isJson()) { logger.output({ success: false, error: error instanceof Error ? error.message : String(error) }); } else { logger.error('Failed to disable plugin', error instanceof Error ? error : String(error)); } process.exit(1); } } //# sourceMappingURL=plugin.js.map