@re-shell/cli
Version:
Full-stack development platform uniting microservices and microfrontends. Build complete applications with .NET (ASP.NET Core Web API, Minimal API), Java (Spring Boot, Quarkus, Micronaut, Vert.x), Rust (Actix-Web, Warp, Rocket, Axum), Python (FastAPI, Dja
1,012 lines • 187 kB
JavaScript
#!/usr/bin/env node
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// Start performance tracking
const startup_optimizer_1 = require("./startup-optimizer");
(0, startup_optimizer_1.mark)('startup-begin');
// Ensure immediate output for better terminal experience
process.env.FORCE_COLOR = '1'; // Enable colors in terminal
if (process.stdout.isTTY) {
process.stdout.setEncoding('utf8');
}
if (process.stderr.isTTY) {
process.stderr.setEncoding('utf8');
}
(0, startup_optimizer_1.mark)('env-setup-done');
// Get version from package.json (cached)
let version = ''; // fallback
const packageVersion = (0, startup_optimizer_1.getFromCache)('package-version');
if (typeof packageVersion === 'string') {
version = packageVersion;
}
else {
try {
const fs = require('fs');
const packageJsonPath = path.resolve(__dirname, '../package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
version = packageJson.version;
(0, startup_optimizer_1.setCache)('package-version', version);
}
catch {
// Use fallback
}
}
// Fast path for version requests
if ((0, startup_optimizer_1.isVersionRequest)()) {
(0, startup_optimizer_1.mark)('version-fast-path');
const chalk = require('chalk');
console.log(chalk.cyan(`
██████╗ ███████╗ ███████╗██╗ ██╗███████╗██╗ ██╗
██╔══██╗██╔════╝ ██╔════╝██║ ██║██╔════╝██║ ██║
██████╔╝█████╗ ████████╗ ███████╗███████║█████╗ ██║ ██║
██╔══██╗██╔══╝ ╚═══════╝ ╚════██║██╔══██║██╔══╝ ██║ ██║
██║ ██║███████╗ ███████║██║ ██║███████╗███████╗███████╗
╚═╝ ╚═╝╚══════╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝
v${version}
`));
console.log(version);
process.exit(0);
}
(0, startup_optimizer_1.mark)('version-check-done');
// Enhanced error handling and signal management
const error_handler_1 = require("./utils/error-handler");
// Core imports only
const commander_1 = require("commander");
const path = __importStar(require("path"));
const chalk_1 = __importDefault(require("chalk"));
// Additional imports for functions used in commands
const spinner_1 = require("./utils/spinner");
const checkUpdate_1 = require("./utils/checkUpdate");
const init_1 = require("./commands/init");
const create_1 = require("./commands/create");
const add_1 = require("./commands/add");
const remove_1 = require("./commands/remove");
const list_1 = require("./commands/list");
const build_1 = require("./commands/build");
const serve_1 = require("./commands/serve");
const workspace_1 = require("./commands/workspace");
const submodule_1 = require("./commands/submodule");
const doctor_1 = require("./commands/doctor");
const analyze_1 = require("./commands/analyze");
const cicd_1 = require("./commands/cicd");
const migrate_1 = require("./commands/migrate");
const config_1 = require("./commands/config");
const environment_1 = require("./commands/environment");
const migration_1 = require("./commands/migration");
const validate_1 = require("./commands/validate");
const project_config_1 = require("./commands/project-config");
const workspace_config_1 = require("./commands/workspace-config");
const template_1 = require("./commands/template");
const config_diff_1 = require("./commands/config-diff");
const backup_1 = require("./commands/backup");
const generate_1 = require("./commands/generate");
const platform_test_1 = require("./commands/platform-test");
const dev_mode_1 = require("./commands/dev-mode");
const backend_1 = require("./commands/backend");
const workspace_definition_1 = require("./commands/workspace-definition");
const workspace_graph_1 = require("./commands/workspace-graph");
const workspace_health_1 = require("./commands/workspace-health");
const workspace_state_1 = require("./commands/workspace-state");
const workspace_template_1 = require("./commands/workspace-template");
const workspace_backup_1 = require("./commands/workspace-backup");
const workspace_migration_1 = require("./commands/workspace-migration");
const workspace_conflict_1 = require("./commands/workspace-conflict");
const file_watcher_1 = require("./commands/file-watcher");
const change_detector_1 = require("./commands/change-detector");
const change_impact_1 = require("./commands/change-impact");
const incremental_build_1 = require("./commands/incremental-build");
const tui_1 = require("./commands/tui");
// Plugin-related imports
const plugin_1 = require("./commands/plugin");
const plugin_cache_1 = require("./commands/plugin-cache");
const plugin_command_1 = require("./commands/plugin-command");
const plugin_conflicts_1 = require("./commands/plugin-conflicts");
const plugin_dependency_1 = require("./commands/plugin-dependency");
const plugin_docs_1 = require("./commands/plugin-docs");
const plugin_marketplace_1 = require("./commands/plugin-marketplace");
const plugin_middleware_1 = require("./commands/plugin-middleware");
const plugin_security_1 = require("./commands/plugin-security");
const plugin_validation_1 = require("./commands/plugin-validation");
(0, startup_optimizer_1.mark)('core-imports-done');
// Defer heavy imports until needed (simplified)
const lazyImports = {
spinner: () => Promise.resolve().then(() => __importStar(require('./utils/spinner'))),
errorHandler: () => Promise.resolve().then(() => __importStar(require('./utils/error-handler'))),
// Commands - loaded on demand
create: () => Promise.resolve().then(() => __importStar(require('./commands/create'))),
add: () => Promise.resolve().then(() => __importStar(require('./commands/add'))),
remove: () => Promise.resolve().then(() => __importStar(require('./commands/remove'))),
list: () => Promise.resolve().then(() => __importStar(require('./commands/list'))),
build: () => Promise.resolve().then(() => __importStar(require('./commands/build'))),
serve: () => Promise.resolve().then(() => __importStar(require('./commands/serve'))),
init: () => Promise.resolve().then(() => __importStar(require('./commands/init'))),
workspace: () => Promise.resolve().then(() => __importStar(require('./commands/workspace'))),
submodule: () => Promise.resolve().then(() => __importStar(require('./commands/submodule'))),
doctor: () => Promise.resolve().then(() => __importStar(require('./commands/doctor'))),
migrate: () => Promise.resolve().then(() => __importStar(require('./commands/migrate'))),
analyze: () => Promise.resolve().then(() => __importStar(require('./commands/analyze'))),
cicd: () => Promise.resolve().then(() => __importStar(require('./commands/cicd'))),
generate: () => Promise.resolve().then(() => __importStar(require('./commands/generate'))),
config: () => Promise.resolve().then(() => __importStar(require('./commands/config'))),
environment: () => Promise.resolve().then(() => __importStar(require('./commands/environment'))),
migration: () => Promise.resolve().then(() => __importStar(require('./commands/migration'))),
validate: () => Promise.resolve().then(() => __importStar(require('./commands/validate'))),
projectConfig: () => Promise.resolve().then(() => __importStar(require('./commands/project-config'))),
workspaceConfig: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-config'))),
template: () => Promise.resolve().then(() => __importStar(require('./commands/template'))),
configDiff: () => Promise.resolve().then(() => __importStar(require('./commands/config-diff'))),
backup: () => Promise.resolve().then(() => __importStar(require('./commands/backup'))),
devMode: () => Promise.resolve().then(() => __importStar(require('./commands/dev-mode'))),
workspaceDefinition: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-definition'))),
workspaceGraph: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-graph'))),
workspaceHealth: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-health'))),
workspaceState: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-state'))),
workspaceTemplate: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-template'))),
workspaceBackup: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-backup'))),
workspaceMigration: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-migration'))),
workspaceConflict: () => Promise.resolve().then(() => __importStar(require('./commands/workspace-conflict'))),
fileWatcher: () => Promise.resolve().then(() => __importStar(require('./commands/file-watcher'))),
changeDetector: () => Promise.resolve().then(() => __importStar(require('./commands/change-detector'))),
changeImpact: () => Promise.resolve().then(() => __importStar(require('./commands/change-impact'))),
incrementalBuild: () => Promise.resolve().then(() => __importStar(require('./commands/incremental-build'))),
platformTest: () => Promise.resolve().then(() => __importStar(require('./commands/platform-test'))),
plugin: () => Promise.resolve().then(() => __importStar(require('./commands/plugin'))),
pluginDependency: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-dependency'))),
pluginMarketplace: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-marketplace'))),
pluginSecurity: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-security'))),
pluginCommand: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-command'))),
pluginMiddleware: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-middleware'))),
pluginConflicts: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-conflicts'))),
pluginDocs: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-docs'))),
pluginValidation: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-validation'))),
pluginCache: () => Promise.resolve().then(() => __importStar(require('./commands/plugin-cache'))),
// Utils - loaded on demand
checkUpdate: () => Promise.resolve().then(() => __importStar(require('./utils/checkUpdate')))
};
(0, startup_optimizer_1.mark)('version-resolved');
// Lazy banner generation
const getBanner = () => {
return chalk_1.default.cyan(`
██████╗ ███████╗ ███████╗██╗ ██╗███████╗██╗ ██╗
██╔══██╗██╔════╝ ██╔════╝██║ ██║██╔════╝██║ ██║
██████╔╝█████╗ ████████╗ ███████╗███████║█████╗ ██║ ██║
██╔══██╗██╔══╝ ╚═══════╝ ╚════██║██╔══██║██╔══╝ ██║ ██║
██║ ██║███████╗ ███████║██║ ██║███████╗███████╗███████╗
╚═╝ ╚═╝╚══════╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝
v${version}
`);
};
const program = new commander_1.Command();
(0, startup_optimizer_1.mark)('program-created');
// Defer update check to avoid blocking startup
const checkUpdate = () => {
setTimeout(async () => {
if (!process.argv.includes('update') &&
!process.argv.includes('--version') &&
!process.argv.includes('-V')) {
try {
const { checkForUpdates } = await lazyImports.checkUpdate();
checkForUpdates(version);
}
catch {
// Ignore update check errors
}
}
}, 100);
};
checkUpdate();
(0, startup_optimizer_1.mark)('update-check-deferred');
// Display banner for main command
if (process.argv.length <= 2 ||
(process.argv.length === 3 && ['-h', '--help', '-V', '--version'].includes(process.argv[2]))) {
console.log(getBanner());
}
program
.name('re-shell')
.description('Re-Shell CLI - Tools for managing multi-framework monorepo and microfrontend architecture')
.version(version);
// Initialize monorepo command
program
.command('init')
.description('Initialize a new monorepo workspace')
.argument('<name>', 'Name of the monorepo')
.option('--package-manager <pm>', 'Package manager to use (npm, yarn, pnpm, bun)', 'pnpm')
.option('--template <template>', 'Template to use (blank, ecommerce, dashboard, saas)', 'blank')
.option('--preset <name>', 'Use saved configuration preset')
.option('--skip-install', 'Skip dependency installation')
.option('--no-git', 'Skip Git repository initialization')
.option('--no-submodules', 'Skip submodule support setup')
.option('--force', 'Overwrite existing directory')
.option('--debug', 'Enable debug output')
.option('-y, --yes', 'Skip interactive prompts and use defaults')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)('Initializing monorepo...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, init_1.initMonorepo)(name, {
packageManager: options.packageManager,
template: options.template,
preset: options.preset,
skipInstall: options.skipInstall,
git: options.git !== false,
submodules: options.submodules !== false,
force: options.force,
debug: options.debug,
yes: options.yes,
spinner: spinner,
});
}, 300000); // 5 minute timeout for init
// Get success info stored by initMonorepo
const successInfo = global.__RE_SHELL_INIT_SUCCESS__;
spinner.succeed(chalk_1.default.green(`Monorepo "${name}" initialized successfully!`));
// Display next steps
console.log('\nNext steps:');
console.log(` 1. cd ${successInfo?.name || name}`);
console.log(` 2. ${successInfo?.packageManager || 'pnpm'} install`);
console.log(' 3. re-shell create my-app --framework react-ts');
console.log(' 4. re-shell workspace list');
if (successInfo?.submodules) {
console.log('\nSubmodule commands:');
console.log(' • re-shell submodule add <url> <path>');
console.log(' • re-shell submodule status');
}
// Clean up global state
delete global.__RE_SHELL_INIT_SUCCESS__;
}));
// Create project command
program
.command('create')
.description('Create a new Re-Shell project with shell application')
.argument('<name>', 'Name of the project')
.option('-t, --team <team>', 'Team name')
.option('-o, --org <organization>', 'Organization name', 're-shell')
.option('-d, --description <description>', 'Project description')
.option('--template <template>', 'Template to use (react, react-ts)', 'react-ts')
.option('--framework <framework>', 'Framework to use (react|react-ts|vue|vue-ts|svelte|svelte-ts)')
.option('--type <type>', 'Workspace type (app|package|lib|tool) - monorepo only')
.option('--port <port>', 'Development server port [default: 5173]')
.option('--route <route>', 'Route path (for apps)')
.option('--package-manager <pm>', 'Package manager to use (npm, yarn, pnpm)', 'pnpm')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
// Handle backward compatibility: if template is provided but not framework, map it
if (options.template && !options.framework) {
options.framework = options.template;
}
const spinner = (0, spinner_1.createSpinner)('Creating Re-Shell project...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, create_1.createProject)(name, { ...options, isProject: true, spinner });
}, 180000); // 3 minute timeout
spinner.succeed(chalk_1.default.green(`Re-Shell project "${name}" created successfully!`));
}));
// Add microfrontend command
program
.command('add')
.description('Add a new microfrontend to existing Re-Shell project')
.argument('<name>', 'Name of the microfrontend')
.option('-t, --team <team>', 'Team name')
.option('-o, --org <organization>', 'Organization name', 're-shell')
.option('-d, --description <description>', 'Microfrontend description')
.option('--template <template>', 'Template to use (react, react-ts)', 'react-ts')
.option('--route <route>', 'Route path for the microfrontend')
.option('--port <port>', 'Dev server port', '5173')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)('Adding microfrontend...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, add_1.addMicrofrontend)(name, { ...options, spinner });
}, 120000); // 2 minute timeout
spinner.succeed(chalk_1.default.green(`Microfrontend "${name}" added successfully!`));
}));
// Remove microfrontend command
program
.command('remove')
.description('Remove a microfrontend from existing Re-Shell project')
.argument('<name>', 'Name of the microfrontend to remove')
.option('--force', 'Force removal without confirmation')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)('Removing microfrontend...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, remove_1.removeMicrofrontend)(name, { ...options, spinner });
}, 60000); // 1 minute timeout
spinner.succeed(chalk_1.default.green(`Microfrontend "${name}" removed successfully!`));
}));
// Backend command
program.addCommand((0, backend_1.createBackendCommand)());
// List microfrontends command
program
.command('list')
.description('List all microfrontends in the current project')
.option('--json', 'Output as JSON')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Loading microfrontends...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, list_1.listMicrofrontends)({ ...options, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Microfrontends listed successfully!'));
}
else {
spinner.stop();
}
}));
// TUI command - Interactive Terminal User Interface
program
.command('tui')
.description('Launch interactive Terminal User Interface (TUI)')
.option('--project <path>', 'Project path', process.cwd())
.option('--mode <mode>', 'TUI mode (dashboard|init|manage|config)', 'dashboard')
.option('--debug', 'Enable debug output')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
// No spinner for TUI - it has its own interface
error_handler_1.processManager.addCleanup(() => {
// Cleanup will be handled by TUI process
});
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, tui_1.launchTUI)({
project: options.project,
mode: options.mode,
debug: options.debug
});
}, 300000); // 5 minute timeout for TUI session
}));
// Build command
program
.command('build')
.description('Build all or specific microfrontends')
.argument('[name]', 'Name of the microfrontend to build (builds all if omitted)')
.option('--production', 'Build for production environment')
.option('--analyze', 'Analyze bundle size')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)('Building...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, build_1.buildMicrofrontend)(name, { ...options, spinner });
}, 600000); // 10 minute timeout for builds
spinner.succeed(chalk_1.default.green(name
? `Microfrontend "${name}" built successfully!`
: 'All microfrontends built successfully!'));
}));
// Serve command
program
.command('serve')
.description('Start development server')
.argument('[name]', 'Name of the microfrontend to serve (serves all if omitted)')
.option('--port <port>', 'Port to serve on', '3000')
.option('--host <host>', 'Host to serve on', 'localhost')
.option('--open', 'Open in browser')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)('Starting development server...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, serve_1.serveMicrofrontend)(name, { ...options, spinner });
}));
// Workspace management commands
const workspaceCommand = program.command('workspace').description('Manage monorepo workspaces');
workspaceCommand
.command('list')
.description('List all workspaces')
.option('--json', 'Output as JSON')
.option('--type <type>', 'Filter by workspace type (app, package, lib, tool)')
.option('--framework <framework>', 'Filter by framework')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Loading workspaces...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, workspace_1.listWorkspaces)({ ...options, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Workspaces listed successfully!'));
}
else {
spinner.stop();
}
}));
workspaceCommand
.command('update')
.description('Update workspace dependencies')
.option('--workspace <name>', 'Update specific workspace')
.option('--dependency <name>', 'Update specific dependency')
.option('--version <version>', 'Target version for dependency')
.option('--dev', 'Update dev dependency')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Updating workspaces...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, workspace_1.updateWorkspaces)({ ...options, spinner });
}, 300000); // 5 minute timeout for updates
spinner.succeed(chalk_1.default.green('Workspaces updated successfully!'));
}));
workspaceCommand
.command('graph')
.description('Generate workspace dependency graph')
.option('--output <file>', 'Output file path')
.option('--format <format>', 'Output format (text, json, mermaid)', 'text')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Generating workspace graph...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, workspace_1.generateWorkspaceGraph)({ ...options, spinner });
}, 60000); // 1 minute timeout
spinner.succeed(chalk_1.default.green('Workspace graph generated successfully!'));
}));
// Submodule management commands
const submoduleCommand = program.command('submodule').description('Manage Git submodules');
submoduleCommand
.command('add <url>')
.description('Add a new Git submodule')
.option('--path <path>', 'Submodule path')
.option('--branch <branch>', 'Branch to track', 'main')
.action((0, error_handler_1.createAsyncCommand)(async (url, options) => {
const spinner = (0, spinner_1.createSpinner)('Adding submodule...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, submodule_1.addGitSubmodule)(url, { ...options, spinner });
}, 120000); // 2 minute timeout
spinner.succeed(chalk_1.default.green('Submodule added successfully!'));
}));
submoduleCommand
.command('remove <path>')
.description('Remove a Git submodule')
.option('--force', 'Force removal without confirmation')
.action((0, error_handler_1.createAsyncCommand)(async (path, options) => {
const spinner = (0, spinner_1.createSpinner)('Removing submodule...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, submodule_1.removeGitSubmodule)(path, { ...options, spinner });
}, 60000); // 1 minute timeout
spinner.succeed(chalk_1.default.green('Submodule removed successfully!'));
}));
submoduleCommand
.command('update')
.description('Update Git submodules')
.option('--path <path>', 'Update specific submodule')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Updating submodules...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, submodule_1.updateGitSubmodules)({ ...options, spinner });
}, 180000); // 3 minute timeout
spinner.succeed(chalk_1.default.green('Submodules updated successfully!'));
}));
submoduleCommand
.command('status')
.description('Show Git submodule status')
.action((0, error_handler_1.createAsyncCommand)(async () => {
await (0, error_handler_1.withTimeout)(async () => {
await (0, submodule_1.showSubmoduleStatus)();
}, 30000); // 30 second timeout
}));
// Submodule init command
submoduleCommand
.command('init')
.description('Initialize Git submodules')
.action((0, error_handler_1.createAsyncCommand)(async () => {
const spinner = (0, spinner_1.createSpinner)('Initializing submodules...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, submodule_1.initSubmodules)(); // No spinner param for this function
}, 120000); // 2 minute timeout
spinner.succeed(chalk_1.default.green('Submodules initialized successfully!'));
}));
submoduleCommand
.command('manage')
.description('Interactive submodule management')
.action((0, error_handler_1.createAsyncCommand)(async () => {
await (0, submodule_1.manageSubmodules)();
}));
// Update command
program
.command('update')
.description('Check for CLI updates')
.action(async () => {
await (0, checkUpdate_1.runUpdateCommand)();
});
// Doctor command - Health check and diagnostics
program
.command('doctor')
.description('Diagnose project health and identify issues')
.option('--fix', 'Automatically fix issues where possible')
.option('--verbose', 'Show detailed information')
.option('--json', 'Output results as JSON')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Running health check...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, doctor_1.runDoctorCheck)({ ...options, spinner });
}, 120000); // 2 minute timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Health check completed!'));
}
else {
spinner.stop();
}
}));
// Analyze command - Bundle and dependency analysis
program
.command('analyze')
.description('Analyze bundle size, dependencies, and performance')
.option('--workspace <name>', 'Analyze specific workspace')
.option('--type <type>', 'Analysis type (bundle, dependencies, performance, security, all)', 'all')
.option('--output <file>', 'Save results to file')
.option('--verbose', 'Show detailed information')
.option('--json', 'Output results as JSON')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Analyzing project...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, analyze_1.analyzeProject)({ ...options, spinner });
}, 300000); // 5 minute timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Analysis completed!'));
}
else {
spinner.stop();
}
}));
// Migration commands
const migrateCommand = program.command('migrate').description('Import/export projects and manage migrations');
migrateCommand
.command('import <source>')
.description('Import existing project into Re-Shell monorepo')
.option('--dry-run', 'Show what would be imported without making changes')
.option('--verbose', 'Show detailed information')
.option('--backup', 'Create backup before import')
.option('--force', 'Overwrite existing files')
.action((0, error_handler_1.createAsyncCommand)(async (source, options) => {
const spinner = (0, spinner_1.createSpinner)('Importing project...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migrate_1.importProject)(source, { ...options, spinner });
}, 600000); // 10 minute timeout
spinner.succeed(chalk_1.default.green('Project imported successfully!'));
}));
migrateCommand
.command('export <target>')
.description('Export Re-Shell project to external location')
.option('--force', 'Overwrite target directory if it exists')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (target, options) => {
const spinner = (0, spinner_1.createSpinner)('Exporting project...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migrate_1.exportProject)(target, { ...options, spinner });
}, 300000); // 5 minute timeout
spinner.succeed(chalk_1.default.green('Project exported successfully!'));
}));
migrateCommand
.command('backup')
.description('Create backup of current project')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Creating backup...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migrate_1.backupProject)({ ...options, spinner });
}, 300000); // 5 minute timeout
spinner.succeed(chalk_1.default.green('Backup created successfully!'));
}));
migrateCommand
.command('restore <backup> <target>')
.description('Restore project from backup')
.option('--force', 'Overwrite target directory if it exists')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (backup, target, options) => {
const spinner = (0, spinner_1.createSpinner)('Restoring from backup...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migrate_1.restoreProject)(backup, target, { ...options, spinner });
}, 300000); // 5 minute timeout
spinner.succeed(chalk_1.default.green('Project restored successfully!'));
}));
// CI/CD commands
const cicdCommand = program.command('cicd').description('Generate CI/CD configurations and deployment scripts');
cicdCommand
.command('generate')
.description('Generate CI/CD configuration files')
.option('--provider <provider>', 'CI/CD provider (github, gitlab, jenkins, circleci, azure)', 'github')
.option('--template <template>', 'Configuration template (basic, advanced, custom)', 'basic')
.option('--force', 'Overwrite existing configuration')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Generating CI/CD configuration...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, cicd_1.generateCICDConfig)({ ...options, spinner });
}, 120000); // 2 minute timeout
spinner.succeed(chalk_1.default.green('CI/CD configuration generated!'));
}));
cicdCommand
.command('deploy <environment>')
.description('Generate deployment configuration for environment')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (environment, options) => {
const spinner = (0, spinner_1.createSpinner)(`Generating deployment config for ${environment}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, cicd_1.generateDeployConfig)(environment, { ...options, spinner });
}, 120000); // 2 minute timeout
spinner.succeed(chalk_1.default.green(`Deployment configuration for ${environment} generated!`));
}));
// Configuration management commands
const configCommand = program.command('config').description('Manage Re-Shell configuration');
configCommand
.command('show')
.description('Show current configuration')
.option('--global', 'Show only global configuration')
.option('--project', 'Show only project configuration')
.option('--json', 'Output as JSON')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Loading configuration...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, config_1.manageConfig)({ ...options, list: true, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Configuration loaded successfully!'));
}
else {
spinner.stop();
}
}));
configCommand
.command('get <key>')
.description('Get configuration value')
.option('--json', 'Output as JSON')
.action((0, error_handler_1.createAsyncCommand)(async (key, options) => {
const spinner = (0, spinner_1.createSpinner)(`Getting ${key}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, config_1.manageConfig)({ ...options, get: key, spinner });
}, 15000); // 15 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Configuration value retrieved!'));
}
else {
spinner.stop();
}
}));
configCommand
.command('set <key> <value>')
.description('Set configuration value')
.option('--global', 'Set in global configuration')
.option('--project', 'Set in project configuration')
.action((0, error_handler_1.createAsyncCommand)(async (key, value, options) => {
const spinner = (0, spinner_1.createSpinner)(`Setting ${key}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, config_1.manageConfig)({ ...options, set: key, value, spinner });
}, 15000); // 15 second timeout
spinner.succeed(chalk_1.default.green(`Configuration updated: ${key}`));
}));
configCommand
.command('preset <action> [name]')
.description('Manage configuration presets (save|load|list|delete)')
.option('--json', 'Output as JSON')
.action((0, error_handler_1.createAsyncCommand)(async (action, name, options) => {
const spinner = (0, spinner_1.createSpinner)(`Managing preset...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
let presetOptions = { ...options, spinner };
switch (action) {
case 'save':
if (!name)
throw new Error('Preset name required for save action');
presetOptions = { ...presetOptions, save: name };
break;
case 'load':
if (!name)
throw new Error('Preset name required for load action');
presetOptions = { ...presetOptions, load: name };
break;
case 'list':
presetOptions = { ...presetOptions, list: true };
break;
case 'delete':
if (!name)
throw new Error('Preset name required for delete action');
presetOptions = { ...presetOptions, delete: name };
break;
default:
throw new Error(`Unknown action: ${action}`);
}
await (0, error_handler_1.withTimeout)(async () => {
await (0, config_1.manageConfig)(presetOptions);
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green(`Preset ${action} completed successfully!`));
}
else {
spinner.stop();
}
}));
configCommand
.command('backup')
.description('Create configuration backup')
.action((0, error_handler_1.createAsyncCommand)(async () => {
const spinner = (0, spinner_1.createSpinner)('Creating backup...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, config_1.manageConfig)({ backup: true, spinner });
}, 30000); // 30 second timeout
spinner.succeed(chalk_1.default.green('Configuration backup created!'));
}));
configCommand
.command('restore <backup>')
.description('Restore configuration from backup')
.action((0, error_handler_1.createAsyncCommand)(async (backup) => {
const spinner = (0, spinner_1.createSpinner)('Restoring configuration...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, config_1.manageConfig)({ restore: backup, spinner });
}, 30000); // 30 second timeout
spinner.succeed(chalk_1.default.green('Configuration restored!'));
}));
configCommand
.command('interactive')
.description('Interactive configuration management')
.action((0, error_handler_1.createAsyncCommand)(async () => {
await (0, config_1.manageConfig)({ interactive: true });
}));
// Environment management commands
const envCommand = program.command('env').description('Manage environment configurations');
envCommand
.command('list')
.description('List all environments')
.option('--json', 'Output as JSON')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Loading environments...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ ...options, list: true, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Environments loaded successfully!'));
}
else {
spinner.stop();
}
}));
envCommand
.command('active')
.description('Show active environment')
.option('--json', 'Output as JSON')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Getting active environment...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ ...options, active: true, spinner });
}, 15000); // 15 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Active environment retrieved!'));
}
else {
spinner.stop();
}
}));
envCommand
.command('set <name>')
.description('Set active environment')
.action((0, error_handler_1.createAsyncCommand)(async (name) => {
const spinner = (0, spinner_1.createSpinner)(`Setting active environment to ${name}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ set: name, spinner });
}, 15000); // 15 second timeout
spinner.succeed(chalk_1.default.green(`Environment '${name}' activated!`));
}));
envCommand
.command('create <name>')
.description('Create new environment')
.option('--extends <env>', 'Inherit from existing environment')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)(`Creating environment ${name}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ ...options, create: name, spinner });
}, 30000); // 30 second timeout
spinner.succeed(chalk_1.default.green(`Environment '${name}' created!`));
}));
envCommand
.command('delete <name>')
.description('Delete environment')
.action((0, error_handler_1.createAsyncCommand)(async (name) => {
const spinner = (0, spinner_1.createSpinner)(`Deleting environment ${name}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ delete: name, spinner });
}, 15000); // 15 second timeout
spinner.succeed(chalk_1.default.green(`Environment '${name}' deleted!`));
}));
envCommand
.command('compare <env1> <env2>')
.description('Compare two environments')
.option('--json', 'Output as JSON')
.action((0, error_handler_1.createAsyncCommand)(async (env1, env2, options) => {
const spinner = (0, spinner_1.createSpinner)(`Comparing ${env1} and ${env2}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ ...options, compare: [env1, env2], spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Environment comparison completed!'));
}
else {
spinner.stop();
}
}));
envCommand
.command('generate <name>')
.description('Generate .env file for environment')
.option('--output <file>', 'Output file path')
.action((0, error_handler_1.createAsyncCommand)(async (name, options) => {
const spinner = (0, spinner_1.createSpinner)(`Generating .env file for ${name}...`).start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, environment_1.manageEnvironment)({ ...options, generate: name, spinner });
}, 15000); // 15 second timeout
spinner.succeed(chalk_1.default.green(`Environment file generated for '${name}'!`));
}));
envCommand
.command('interactive')
.description('Interactive environment management')
.action((0, error_handler_1.createAsyncCommand)(async () => {
await (0, environment_1.manageEnvironment)({ interactive: true });
}));
// Configuration migration commands
const configMigrateCommand = program.command('config-migrate').description('Manage configuration migrations');
configMigrateCommand
.command('auto')
.description('Auto-migrate all configurations')
.option('--json', 'Output as JSON')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Running auto-migration...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migration_1.manageMigration)({ ...options, auto: true, spinner });
}, 60000); // 60 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Auto-migration completed!'));
}
else {
spinner.stop();
}
}));
configMigrateCommand
.command('check')
.description('Check migration status')
.option('--json', 'Output as JSON')
.option('--verbose', 'Show detailed information')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Checking migration status...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migration_1.manageMigration)({ ...options, check: true, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Migration status checked!'));
}
else {
spinner.stop();
}
}));
configMigrateCommand
.command('global')
.description('Migrate global configuration')
.option('--json', 'Output as JSON')
.option('--force', 'Force migration without confirmation')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Migrating global configuration...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migration_1.manageMigration)({ ...options, global: true, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Global configuration migrated!'));
}
else {
spinner.stop();
}
}));
configMigrateCommand
.command('project')
.description('Migrate project configuration')
.option('--json', 'Output as JSON')
.option('--force', 'Force migration without confirmation')
.action((0, error_handler_1.createAsyncCommand)(async (options) => {
const spinner = (0, spinner_1.createSpinner)('Migrating project configuration...').start();
error_handler_1.processManager.addCleanup(() => spinner.stop());
(0, spinner_1.flushOutput)();
await (0, error_handler_1.withTimeout)(async () => {
await (0, migration_1.manageMigration)({ ...options, project: true, spinner });
}, 30000); // 30 second timeout
if (!options.json) {
spinner.succeed(chalk_1.default.green('Project configuration migrated!'));
}
else {
spinner.stop();
}
}));
configMigrateCommand
.command('rollback <version>')
.description('Rollback to previous version')
.option('--global', 'Rollback global configu