@ace-sdk/cli
Version:
ACE CLI - Command-line tool for intelligent pattern learning and playbook management
267 lines β’ 9.64 kB
JavaScript
/**
* 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