UNPKG

@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
#!/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