@tamyla/clodo-framework 3.1.21 → 3.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +283 -1
  3. package/dist/{bin → cli}/clodo-service.js +47 -15
  4. package/dist/cli/commands/assess.js +183 -0
  5. package/dist/{bin → cli}/commands/create.js +5 -5
  6. package/dist/{bin → cli}/commands/deploy.js +122 -90
  7. package/dist/{bin → cli}/commands/diagnose.js +5 -5
  8. package/dist/cli/commands/helpers/deployment-ui.js +138 -0
  9. package/dist/cli/commands/helpers/deployment-verification.js +250 -0
  10. package/dist/cli/commands/helpers/error-recovery.js +80 -0
  11. package/dist/cli/commands/helpers/resource-detection.js +113 -0
  12. package/dist/{bin → cli}/commands/helpers.js +0 -28
  13. package/dist/cli/commands/init-config.js +57 -0
  14. package/dist/{bin → cli}/commands/update.js +5 -5
  15. package/dist/{bin → cli}/commands/validate.js +5 -5
  16. package/dist/cli/security-cli.js +118 -0
  17. package/dist/config/FeatureManager.js +6 -0
  18. package/dist/config/clodo-create.example.json +26 -0
  19. package/dist/config/clodo-deploy.example.json +41 -0
  20. package/dist/config/clodo-update.example.json +46 -0
  21. package/dist/config/clodo-validate.example.json +41 -0
  22. package/dist/config/customers/template/development.env.template +37 -0
  23. package/dist/config/customers/template/production.env.template +39 -0
  24. package/dist/config/customers/template/staging.env.template +37 -0
  25. package/dist/config/customers.js +28 -26
  26. package/dist/config/domain-examples/README.md +464 -0
  27. package/dist/config/domain-examples/environment-mapped.json +168 -0
  28. package/dist/config/domain-examples/multi-domain.json +144 -0
  29. package/dist/config/domain-examples/single-domain.json +50 -0
  30. package/dist/config/examples +12 -0
  31. package/dist/config/features.js +61 -0
  32. package/dist/config/staging-deployment.json +60 -0
  33. package/dist/config/validation-config.json +347 -0
  34. package/dist/deployment/wrangler-deployer.js +1 -1
  35. package/dist/{bin → lib}/deployment/modules/DeploymentOrchestrator.js +2 -2
  36. package/dist/{bin → lib}/deployment/modules/EnvironmentManager.js +2 -2
  37. package/dist/lib/deployment/orchestration/EnterpriseOrchestrator.js +21 -0
  38. package/dist/lib/shared/cache/configuration-cache.js +82 -0
  39. package/dist/{bin → lib}/shared/cloudflare/domain-discovery.js +1 -1
  40. package/dist/{bin → lib}/shared/cloudflare/domain-manager.js +1 -1
  41. package/dist/{bin → lib}/shared/cloudflare/index.js +1 -1
  42. package/dist/{bin → lib}/shared/cloudflare/ops.js +10 -8
  43. package/dist/{bin → lib}/shared/config/ConfigurationManager.js +23 -1
  44. package/dist/{bin → lib}/shared/config/command-config-manager.js +19 -3
  45. package/dist/{bin → lib}/shared/config/index.js +1 -1
  46. package/dist/{bin → lib}/shared/deployment/credential-collector.js +30 -7
  47. package/dist/lib/shared/deployment/index.js +10 -0
  48. package/dist/lib/shared/deployment/rollback-manager.js +7 -0
  49. package/dist/lib/shared/deployment/utilities/d1-error-recovery.js +177 -0
  50. package/dist/{bin → lib}/shared/deployment/validator.js +40 -10
  51. package/dist/lib/shared/deployment/workflows/deployment-summary.js +214 -0
  52. package/dist/lib/shared/deployment/workflows/interactive-confirmation.js +188 -0
  53. package/dist/lib/shared/deployment/workflows/interactive-database-workflow.js +234 -0
  54. package/dist/lib/shared/deployment/workflows/interactive-domain-info-gatherer.js +240 -0
  55. package/dist/lib/shared/deployment/workflows/interactive-secret-workflow.js +228 -0
  56. package/dist/lib/shared/deployment/workflows/interactive-testing-workflow.js +235 -0
  57. package/dist/lib/shared/deployment/workflows/interactive-validation.js +218 -0
  58. package/dist/lib/shared/error-handling/error-classifier.js +46 -0
  59. package/dist/{bin → lib}/shared/monitoring/health-checker.js +129 -1
  60. package/dist/{bin → lib}/shared/monitoring/memory-manager.js +17 -6
  61. package/dist/{bin → lib}/shared/routing/domain-router.js +1 -1
  62. package/dist/lib/shared/utils/deployment-validator.js +97 -0
  63. package/dist/{bin → lib}/shared/utils/formatters.js +10 -0
  64. package/dist/{bin → lib}/shared/utils/index.js +13 -1
  65. package/dist/{bin → lib}/shared/utils/interactive-prompts.js +34 -18
  66. package/dist/{bin → lib}/shared/utils/progress-manager.js +2 -2
  67. package/dist/lib/shared/utils/progress-spinner.js +53 -0
  68. package/dist/lib/shared/utils/sensitive-redactor.js +91 -0
  69. package/dist/{bin → lib}/shared/validation/ValidationRegistry.js +1 -1
  70. package/dist/migration/MigrationAdapters.js +50 -4
  71. package/dist/orchestration/cross-domain-coordinator.js +5 -5
  72. package/dist/orchestration/multi-domain-orchestrator.js +63 -22
  73. package/dist/security/index.js +2 -2
  74. package/dist/security/patterns/insecure-patterns.js +1 -1
  75. package/dist/service-management/ConfirmationEngine.js +1 -1
  76. package/dist/service-management/ErrorTracker.js +1 -1
  77. package/dist/service-management/InputCollector.js +1 -1
  78. package/dist/service-management/ServiceCreator.js +11 -255
  79. package/dist/service-management/ServiceOrchestrator.js +0 -2
  80. package/dist/service-management/generators/testing/UnitTestsGenerator.js +4 -4
  81. package/dist/service-management/index.js +1 -1
  82. package/dist/utils/cloudflare/ops.js +1 -1
  83. package/dist/utils/constants.js +102 -0
  84. package/dist/utils/deployment/wrangler-config-manager.js +215 -48
  85. package/dist/utils/file-manager.js +1 -1
  86. package/dist/utils/formatters.js +1 -1
  87. package/dist/utils/framework-config.js +2 -2
  88. package/dist/utils/interactive-prompts.js +10 -59
  89. package/dist/utils/logger.js +1 -1
  90. package/dist/version/VersionDetector.js +99 -9
  91. package/dist/worker/integration.js +1 -1
  92. package/package.json +10 -10
  93. package/dist/bin/clodo-service-old.js +0 -868
  94. package/dist/bin/clodo-service-test.js +0 -10
  95. package/dist/bin/commands/assess.js +0 -91
  96. package/dist/bin/database/enterprise-db-manager.js +0 -457
  97. package/dist/bin/deployment/enterprise-deploy.js +0 -877
  98. package/dist/bin/deployment/master-deploy.js +0 -1376
  99. package/dist/bin/deployment/modular-enterprise-deploy.js +0 -466
  100. package/dist/bin/deployment/orchestration/EnterpriseOrchestrator.js +0 -401
  101. package/dist/bin/deployment/test-interactive-utils.js +0 -66
  102. package/dist/bin/portfolio/portfolio-manager.js +0 -487
  103. package/dist/bin/security/security-cli.js +0 -108
  104. package/dist/bin/service-management/create-service.js +0 -122
  105. package/dist/bin/service-management/init-service.js +0 -79
  106. package/dist/bin/shared/deployment/index.js +0 -10
  107. package/dist/bin/shared/deployment/rollback-manager.js +0 -523
  108. package/dist/deployment/orchestration/EnterpriseOrchestrator.js +0 -401
  109. package/dist/service-management/ServiceInitializer.js +0 -453
  110. /package/dist/{bin → lib}/database/deployment-db-manager.js +0 -0
  111. /package/dist/{bin → lib}/database/wrangler-d1-manager.js +0 -0
  112. /package/dist/{bin → lib}/deployment/modules/DeploymentConfiguration.js +0 -0
  113. /package/dist/{bin → lib}/deployment/modules/MonitoringIntegration.js +0 -0
  114. /package/dist/{bin → lib}/deployment/modules/ValidationManager.js +0 -0
  115. /package/dist/{bin → lib}/deployment/orchestration/BaseDeploymentOrchestrator.js +0 -0
  116. /package/dist/{bin → lib}/deployment/orchestration/PortfolioOrchestrator.js +0 -0
  117. /package/dist/{bin → lib}/deployment/orchestration/SingleServiceOrchestrator.js +0 -0
  118. /package/dist/{bin → lib}/deployment/orchestration/UnifiedDeploymentOrchestrator.js +0 -0
  119. /package/dist/{bin → lib}/shared/config/cache.js +0 -0
  120. /package/dist/{bin → lib}/shared/config/cloudflare-service-validator.js +0 -0
  121. /package/dist/{bin → lib}/shared/config/manager.js +0 -0
  122. /package/dist/{bin → lib}/shared/config/manifest-loader.js +0 -0
  123. /package/dist/{bin → lib}/shared/database/connection-manager.js +0 -0
  124. /package/dist/{bin → lib}/shared/database/index.js +0 -0
  125. /package/dist/{bin → lib}/shared/database/orchestrator.js +0 -0
  126. /package/dist/{bin → lib}/shared/deployment/auditor.js +0 -0
  127. /package/dist/{bin → lib}/shared/index.js +0 -0
  128. /package/dist/{bin → lib}/shared/logging/Logger.js +0 -0
  129. /package/dist/{bin → lib}/shared/monitoring/index.js +0 -0
  130. /package/dist/{bin → lib}/shared/monitoring/production-monitor.js +0 -0
  131. /package/dist/{bin → lib}/shared/production-tester/api-tester.js +0 -0
  132. /package/dist/{bin → lib}/shared/production-tester/auth-tester.js +0 -0
  133. /package/dist/{bin → lib}/shared/production-tester/core.js +0 -0
  134. /package/dist/{bin → lib}/shared/production-tester/database-tester.js +0 -0
  135. /package/dist/{bin → lib}/shared/production-tester/index.js +0 -0
  136. /package/dist/{bin → lib}/shared/production-tester/load-tester.js +0 -0
  137. /package/dist/{bin → lib}/shared/production-tester/performance-tester.js +0 -0
  138. /package/dist/{bin → lib}/shared/security/api-token-manager.js +0 -0
  139. /package/dist/{bin → lib}/shared/security/index.js +0 -0
  140. /package/dist/{bin → lib}/shared/security/secret-generator.js +0 -0
  141. /package/dist/{bin → lib}/shared/security/secure-token-manager.js +0 -0
  142. /package/dist/{bin → lib}/shared/utils/ErrorHandler.js +0 -0
  143. /package/dist/{bin → lib}/shared/utils/cli-options.js +0 -0
  144. /package/dist/{bin → lib}/shared/utils/config-loader.js +0 -0
  145. /package/dist/{bin → lib}/shared/utils/error-recovery.js +0 -0
  146. /package/dist/{bin → lib}/shared/utils/file-manager.js +0 -0
  147. /package/dist/{bin → lib}/shared/utils/graceful-shutdown-manager.js +0 -0
  148. /package/dist/{bin → lib}/shared/utils/interactive-utils.js +0 -0
  149. /package/dist/{bin → lib}/shared/utils/output-formatter.js +0 -0
  150. /package/dist/{bin → lib}/shared/utils/rate-limiter.js +0 -0
@@ -1,10 +0,0 @@
1
- import { Command } from 'commander';
2
- const program = new Command();
3
- program.name('clodo-service-test').description('Test Clodo Framework CLI').version('1.0.0');
4
- program.command('hello').description('Say hello').action(() => {
5
- console.log('Hello from Clodo Service CLI!');
6
- });
7
- program.command('create').description('Create a new service').action(() => {
8
- console.log('Create command would run here...');
9
- });
10
- program.parse();
@@ -1,91 +0,0 @@
1
- /**
2
- * Assess Command - Run intelligent capability assessment
3
- * Requires @tamyla/clodo-orchestration package for professional edition
4
- */
5
-
6
- import chalk from 'chalk';
7
- import { StandardOptions } from '../shared/utils/cli-options.js';
8
- import { ConfigLoader } from '../shared/utils/config-loader.js';
9
- export function registerAssessCommand(program) {
10
- const command = program.command('assess [service-path]').description('Run intelligent capability assessment (requires @tamyla/clodo-orchestration)').option('--export <file>', 'Export assessment results to JSON file').option('--domain <domain>', 'Domain name for assessment').option('--service-type <type>', 'Service type for assessment').option('--token <token>', 'Cloudflare API token');
11
-
12
- // Add standard options (--verbose, --quiet, --json, --no-color, --config-file)
13
- StandardOptions.define(command).action(async (servicePath, options) => {
14
- try {
15
- const output = new (await import('../shared/utils/output-formatter.js')).OutputFormatter(options);
16
- const configLoader = new ConfigLoader({
17
- verbose: options.verbose,
18
- quiet: options.quiet,
19
- json: options.json
20
- });
21
-
22
- // Load config from file if specified
23
- let configFileData = {};
24
- if (options.configFile) {
25
- configFileData = configLoader.loadSafe(options.configFile, {});
26
- if (options.verbose && !options.quiet) {
27
- output.info(`Loaded configuration from: ${options.configFile}`);
28
- }
29
- }
30
-
31
- // Substitute environment variables
32
- configFileData = configLoader.substituteEnvironmentVariables(configFileData);
33
-
34
- // Merge config file defaults with CLI options (CLI takes precedence)
35
- const mergedOptions = configLoader.merge(configFileData, options);
36
-
37
- // Try to load professional orchestration package
38
- let orchestrationModule;
39
- try {
40
- orchestrationModule = await import('@tamyla/clodo-orchestration');
41
- } catch (err) {
42
- output.error('❌ clodo-orchestration package not found');
43
- output.info('💡 Install with: npm install @tamyla/clodo-orchestration');
44
- process.exit(1);
45
- }
46
- const {
47
- CapabilityAssessmentEngine,
48
- ServiceAutoDiscovery,
49
- runAssessmentWorkflow
50
- } = orchestrationModule;
51
- const targetPath = servicePath || process.cwd();
52
- output.section('Professional Capability Assessment');
53
- output.list([`Service Path: ${targetPath}`, mergedOptions.domain ? `Domain: ${mergedOptions.domain}` : null, mergedOptions.serviceType ? `Service Type: ${mergedOptions.serviceType}` : null].filter(Boolean));
54
-
55
- // Use the assessment workflow
56
- const assessment = await runAssessmentWorkflow({
57
- servicePath: targetPath,
58
- domain: mergedOptions.domain,
59
- serviceType: mergedOptions.serviceType,
60
- token: mergedOptions.token || process.env.CLOUDFLARE_API_TOKEN
61
- });
62
-
63
- // Display results
64
- output.section('✅ Assessment Results');
65
- output.list([`Service Type: ${assessment.mergedInputs?.serviceType || assessment.serviceType || 'Not determined'}`, `Confidence: ${assessment.confidence}%`]);
66
- if (assessment.gapAnalysis?.missing) {
67
- if (assessment.gapAnalysis.missing.length > 0) {
68
- output.warning('⚠️ Missing Capabilities:');
69
- const missingItems = assessment.gapAnalysis.missing.map(gap => `${gap.capability}: ${gap.reason || 'Not available'}`);
70
- output.list(missingItems);
71
- }
72
- }
73
-
74
- // Export results if requested
75
- if (mergedOptions.export) {
76
- const {
77
- writeFileSync
78
- } = await import('fs');
79
- writeFileSync(mergedOptions.export, JSON.stringify(assessment, null, 2));
80
- output.success(`📄 Results exported to: ${mergedOptions.export}`);
81
- }
82
- } catch (error) {
83
- const output = new (await import('../shared/utils/output-formatter.js')).OutputFormatter(options || {});
84
- output.error(`Assessment failed: ${error.message}`);
85
- if (process.env.DEBUG) {
86
- output.debug(error.stack);
87
- }
88
- process.exit(1);
89
- }
90
- });
91
- }
@@ -1,457 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Enterprise Database Manager CLI
5
- *
6
- * Advanced database operations and management system for multi-environment
7
- * database coordination across the entire portfolio using database orchestrator.
8
- *
9
- * Database Features:
10
- * - Multi-environment database operations and coordination
11
- * - Safe migration execution with rollback capabilities
12
- * - Cross-domain database synchronization
13
- * - Advanced backup and restore operations
14
- * - Database health monitoring and performance tracking
15
- * - Schema validation and consistency checks
16
- * - Data integrity verification and repair
17
- * - Automated maintenance and optimization
18
- * - Comprehensive audit and compliance reporting
19
- * - Database disaster recovery management
20
- *
21
- * @version 2.0.0 - Enterprise Edition
22
- */
23
- import { program } from 'commander';
24
- import { existsSync, readFileSync, writeFileSync } from 'fs';
25
- import { join } from 'path';
26
-
27
- // Enterprise module imports - from src/ (framework source)
28
- import { DatabaseOrchestrator } from "../../database/database-orchestrator.js";
29
- import { DeploymentAuditor } from "../../deployment/deployment-auditor.js";
30
- import { CrossDomainCoordinator } from "../../orchestration/cross-domain-coordinator.js";
31
-
32
- // Shared utilities from bin/shared/
33
- import { ConfigurationCacheManager } from '../shared/config/cache.js';
34
- class EnterpriseDatabaseManagerCLI {
35
- constructor() {
36
- this.version = '2.0.0';
37
- this.modules = {};
38
- this.dbConfig = this.loadDatabaseConfig();
39
- }
40
-
41
- /**
42
- * Initialize the CLI asynchronously
43
- */
44
- async initialize() {
45
- await this.initializeModules();
46
- this.setupCommands();
47
- }
48
-
49
- /**
50
- * Load database configuration
51
- */
52
- loadDatabaseConfig() {
53
- const configPath = join(process.cwd(), 'database.config.json');
54
- if (existsSync(configPath)) {
55
- try {
56
- return JSON.parse(readFileSync(configPath, 'utf8'));
57
- } catch (error) {
58
- console.warn('⚠️ Failed to load database config, using defaults');
59
- }
60
- }
61
- return {
62
- environments: ['development', 'staging', 'production'],
63
- defaultEnvironment: 'production',
64
- safeMode: true,
65
- backupBeforeMigration: true,
66
- maxConcurrentOperations: 3,
67
- migrationTimeout: 300000,
68
- // 5 minutes
69
- healthCheckInterval: 60000,
70
- // 1 minute
71
- retentionPeriod: 90,
72
- // days
73
- auditLevel: 'detailed',
74
- complianceMode: false
75
- };
76
- }
77
-
78
- /**
79
- * Initialize enterprise modules
80
- */
81
- async initializeModules() {
82
- this.modules = {
83
- databaseOrchestrator: new DatabaseOrchestrator({
84
- enableSafeMode: this.dbConfig.safeMode,
85
- portfolioMode: true,
86
- maxConcurrentOperations: this.dbConfig.maxConcurrentOperations,
87
- migrationTimeout: this.dbConfig.migrationTimeout
88
- }),
89
- auditor: new DeploymentAuditor({
90
- auditLevel: this.dbConfig.auditLevel,
91
- databaseAudit: true
92
- }),
93
- coordinator: new CrossDomainCoordinator({
94
- portfolioName: 'database-portfolio'
95
- }),
96
- configCache: new ConfigurationCacheManager({
97
- enableRuntimeDiscovery: true,
98
- databaseTemplates: true
99
- })
100
- };
101
-
102
- // Initialize async components
103
- await this.modules.auditor.initialize();
104
- await this.modules.configCache.initialize();
105
- }
106
-
107
- /**
108
- * Setup CLI commands
109
- */
110
- setupCommands() {
111
- program.name('enterprise-db-manager').description('Enterprise Database Management System - Advanced multi-environment database operations').version(this.version);
112
-
113
- // Migration commands
114
- program.command('migrate <domain>').description('Run database migrations for specific domain').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--create-db', 'create database if it doesn\'t exist').option('--backup', 'create backup before migration').option('--dry-run', 'show migrations without executing').option('--force', 'force migration even with validation failures').option('--rollback', 'rollback previous migration').option('--target <version>', 'migrate to specific version').action((domain, options) => this.migrateDomain(domain, options));
115
- program.command('migrate-all').description('Run database migrations across entire portfolio').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('-f, --filter <pattern>', 'filter domains by pattern').option('--exclude <pattern>', 'exclude domains matching pattern').option('--parallel', 'run migrations in parallel').option('--batch-size <size>', 'batch size for parallel operations', '3').option('--safe-mode', 'enable extra safety checks').option('--dry-run', 'show migrations without executing').option('--rollback', 'rollback all migrations').action(options => this.migrateAll(options));
116
- program.command('migration-status [domain]').description('Check migration status for domain or entire portfolio').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--format <format>', 'output format (table|json|yaml)', 'table').option('--pending', 'show only pending migrations').action((domain, options) => this.migrationStatus(domain, options));
117
-
118
- // Schema management
119
- program.command('schema-validate <domain>').description('Validate database schema for domain').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--fix', 'attempt to fix schema issues').option('--compare <env>', 'compare schema with another environment').option('--report <format>', 'generate validation report (json|html)', 'json').action((domain, options) => this.validateSchema(domain, options));
120
- program.command('schema-sync').description('Synchronize database schemas across environments').option('--source <env>', 'source environment', 'production').option('--target <env>', 'target environment for sync').option('-f, --filter <pattern>', 'filter domains by pattern').option('--schema-only', 'sync schema only, not data').option('--dry-run', 'show sync plan without executing').option('--force', 'force sync even with conflicts').action(options => this.syncSchemas(options));
121
- program.command('schema-diff').description('Compare database schemas between environments').option('--source <env>', 'source environment', 'production').option('--target <env>', 'target environment', 'staging').option('-d, --domain <domain>', 'specific domain to compare').option('--format <format>', 'output format (text|json|html)', 'text').action(options => this.schemaDiff(options));
122
-
123
- // Backup and restore
124
- program.command('backup <domain>').description('Create database backup for domain').option('-e, --env <environment>', 'source environment', this.dbConfig.defaultEnvironment).option('--compress', 'compress backup files').option('--encrypt', 'encrypt backup data').option('--remote', 'store backup remotely').option('--type <type>', 'backup type (full|schema|data)', 'full').action((domain, options) => this.backupDomain(domain, options));
125
- program.command('backup-all').description('Create backups for entire portfolio').option('-e, --env <environment>', 'source environment', this.dbConfig.defaultEnvironment).option('-f, --filter <pattern>', 'filter domains by pattern').option('--parallel', 'run backups in parallel').option('--compress', 'compress backup files').option('--encrypt', 'encrypt backup data').option('--type <type>', 'backup type (full|schema|data)', 'full').action(options => this.backupAll(options));
126
- program.command('restore <domain>').description('Restore database from backup for domain').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--backup-id <id>', 'specific backup ID to restore').option('--backup-file <file>', 'backup file to restore from').option('--type <type>', 'restore type (full|schema|data)', 'full').option('--force', 'force restore without confirmation').action((domain, options) => this.restoreDomain(domain, options));
127
- program.command('list-backups [domain]').description('List available backups for domain or entire portfolio').option('-e, --env <environment>', 'environment filter').option('--format <format>', 'output format (table|json)', 'table').option('--days <days>', 'show backups from last N days', '30').action((domain, options) => this.listBackups(domain, options));
128
-
129
- // Health and monitoring
130
- program.command('health [domain]').description('Check database health for domain or entire portfolio').option('-e, --env <environment>', 'environment to check', this.dbConfig.defaultEnvironment).option('--detailed', 'show detailed health information').option('--format <format>', 'output format (table|json|yaml)', 'table').option('--performance', 'include performance metrics').action((domain, options) => this.checkHealth(domain, options));
131
- program.command('monitor').description('Start continuous database monitoring').option('-e, --env <environment>', 'environment to monitor', this.dbConfig.defaultEnvironment).option('--interval <ms>', 'monitoring interval', this.dbConfig.healthCheckInterval.toString()).option('--alert-webhook <url>', 'webhook URL for alerts').option('--log-file <path>', 'log monitoring results to file').option('--performance', 'include performance monitoring').action(options => this.startMonitoring(options));
132
- program.command('stats [domain]').description('Get database statistics and metrics').option('-e, --env <environment>', 'environment to analyze', this.dbConfig.defaultEnvironment).option('--period <days>', 'analysis period in days', '7').option('--format <format>', 'output format (table|json|html)', 'table').option('--export <file>', 'export statistics to file').action((domain, options) => this.getStats(domain, options));
133
-
134
- // Data management
135
- program.command('cleanup <domain>').description('Clean up old data from domain database').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--days <days>', 'retention period in days', this.dbConfig.retentionPeriod.toString()).option('--table <table>', 'specific table to clean').option('--dry-run', 'show what would be cleaned').option('--backup', 'create backup before cleanup').action((domain, options) => this.cleanupDomain(domain, options));
136
- program.command('cleanup-all').description('Clean up old data across entire portfolio').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--days <days>', 'retention period in days', this.dbConfig.retentionPeriod.toString()).option('-f, --filter <pattern>', 'filter domains by pattern').option('--parallel', 'run cleanup in parallel').option('--dry-run', 'show what would be cleaned').action(options => this.cleanupAll(options));
137
- program.command('optimize <domain>').description('Optimize database performance for domain').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--analyze', 'analyze query performance').option('--reindex', 'rebuild indexes').option('--vacuum', 'vacuum database').option('--dry-run', 'show optimization plan').action((domain, options) => this.optimizeDomain(domain, options));
138
-
139
- // Data integrity and validation
140
- program.command('validate <domain>').description('Validate data integrity for domain').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--fix', 'attempt to fix data integrity issues').option('--report <format>', 'generate validation report (json|html)', 'json').option('--deep', 'perform deep validation checks').action((domain, options) => this.validateData(domain, options));
141
- program.command('validate-all').description('Validate data integrity across entire portfolio').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('-f, --filter <pattern>', 'filter domains by pattern').option('--parallel', 'run validation in parallel').option('--report <format>', 'generate consolidated report (json|html)', 'html').action(options => this.validateAll(options));
142
-
143
- // Connection and access management
144
- program.command('connections [domain]').description('Manage database connections for domain or portfolio').option('-e, --env <environment>', 'environment', this.dbConfig.defaultEnvironment).option('--show', 'show active connections').option('--kill <connection-id>', 'kill specific connection').option('--format <format>', 'output format (table|json)', 'table').action((domain, options) => this.manageConnections(domain, options));
145
- program.command('access').description('Manage database access and permissions').option('--grant <user>', 'grant access to user').option('--revoke <user>', 'revoke access from user').option('--list-users', 'list database users').option('--audit', 'audit access permissions').action(options => this.manageAccess(options));
146
-
147
- // Disaster recovery
148
- program.command('disaster-recovery').description('Execute disaster recovery procedures').option('--mode <mode>', 'recovery mode (full|partial|test)', 'test').option('--backup-id <id>', 'backup ID for recovery').option('--target-env <env>', 'target environment for recovery').option('--force', 'force recovery without confirmation').action(options => this.disasterRecovery(options));
149
-
150
- // Audit and compliance
151
- program.command('audit [domain]').description('Generate database audit report').option('-e, --env <environment>', 'environment to audit', this.dbConfig.defaultEnvironment).option('--period <days>', 'audit period in days', '30').option('--format <format>', 'report format (json|html|csv)', 'html').option('--compliance', 'include compliance checks').option('--operations', 'include operation history').action((domain, options) => this.generateAudit(domain, options));
152
- program.command('compliance').description('Run compliance checks on database portfolio').option('--standard <standard>', 'compliance standard (gdpr|hipaa|sox)', 'gdpr').option('--format <format>', 'report format (json|html|pdf)', 'html').option('--fix', 'attempt to fix compliance issues').action(options => this.complianceCheck(options));
153
-
154
- // Configuration and setup
155
- program.command('config').description('Manage database configuration').option('--show', 'show current configuration').option('--edit', 'edit configuration interactively').option('--validate', 'validate configuration').option('--template <name>', 'apply configuration template').action(options => this.manageConfig(options));
156
- program.command('init <domain>').description('Initialize database for new domain').option('-e, --env <environment>', 'target environment', this.dbConfig.defaultEnvironment).option('--template <template>', 'database template to use').option('--seed', 'seed with sample data').option('--force', 'force initialization even if database exists').action((domain, options) => this.initializeDomain(domain, options));
157
-
158
- // Information and status
159
- program.command('list').description('List all database domains and their status').option('-e, --env <environment>', 'environment filter').option('--format <format>', 'output format (table|json|yaml)', 'table').option('--show-size', 'include database sizes').option('--show-health', 'include health status').action(options => this.listDomains(options));
160
- program.command('info <domain>').description('Get detailed information about domain database').option('-e, --env <environment>', 'environment', this.dbConfig.defaultEnvironment).option('--format <format>', 'output format (table|json|yaml)', 'table').option('--schema', 'include schema information').option('--connections', 'include connection information').action((domain, options) => this.getDomainInfo(domain, options));
161
-
162
- // Global options
163
- program.option('--verbose', 'verbose output').option('--quiet', 'quiet mode - minimal output').option('--no-color', 'disable colored output').option('--config <file>', 'custom database configuration file');
164
-
165
- // Parse CLI arguments
166
- program.parse();
167
- }
168
-
169
- /**
170
- * Migrate specific domain
171
- */
172
- async migrateDomain(domain, options) {
173
- try {
174
- this.logOutput(`🗄️ Running database migration: ${domain}`, 'info');
175
- const migrationId = this.generateOperationId('migration');
176
-
177
- // Start audit
178
- const auditContext = this.modules.auditor.startDeploymentAudit(migrationId, domain, {
179
- operation: 'database_migration',
180
- environment: options.env,
181
- options
182
- });
183
- const migrationOptions = {
184
- environment: options.env,
185
- createDatabase: options.createDb,
186
- backupBeforeMigration: options.backup !== false,
187
- dryRun: options.dryRun,
188
- force: options.force,
189
- rollback: options.rollback,
190
- targetVersion: options.target
191
- };
192
- const result = await this.modules.databaseOrchestrator.executeMigration(domain, migrationOptions);
193
- this.modules.auditor.endDeploymentAudit(migrationId, 'success', {
194
- migrationsApplied: result.migrationsApplied,
195
- duration: result.duration
196
- });
197
- this.logOutput(`✅ Migration completed: ${result.migrationsApplied} migrations applied`, 'success');
198
- if (result.warnings?.length > 0) {
199
- this.logOutput('⚠️ Migration warnings:', 'warn');
200
- result.warnings.forEach(warning => this.logOutput(` - ${warning}`, 'warn'));
201
- }
202
- } catch (error) {
203
- this.logOutput(`❌ Migration failed: ${error.message}`, 'error');
204
- process.exit(1);
205
- }
206
- }
207
-
208
- /**
209
- * Migrate all domains
210
- */
211
- async migrateAll(options) {
212
- try {
213
- this.logOutput('🌍 Running portfolio-wide database migrations...', 'info');
214
-
215
- // Discover portfolio
216
- const portfolio = await this.modules.coordinator.discoverPortfolio();
217
- let domains = portfolio.domains.map(d => d.name || d.domain);
218
-
219
- // Apply filters
220
- if (options.filter) {
221
- const filterRegex = new RegExp(options.filter);
222
- domains = domains.filter(domain => filterRegex.test(domain));
223
- }
224
- if (options.exclude) {
225
- const excludeRegex = new RegExp(options.exclude);
226
- domains = domains.filter(domain => !excludeRegex.test(domain));
227
- }
228
- this.logOutput(`📊 Migrating ${domains.length} domains`, 'info');
229
- const migrationOptions = {
230
- environment: options.env,
231
- parallel: options.parallel,
232
- batchSize: parseInt(options.batchSize || '3'),
233
- safeMode: options.safeMode !== false,
234
- dryRun: options.dryRun,
235
- rollback: options.rollback
236
- };
237
- const results = await this.modules.databaseOrchestrator.coordinateMigrations(domains, migrationOptions);
238
- this.logOutput('✅ Portfolio migration completed', 'success');
239
- console.log(` ✅ Successful: ${results.successful.length}`);
240
- console.log(` ❌ Failed: ${results.failed.length}`);
241
- console.log(` ⏱️ Total Duration: ${results.totalDuration}s`);
242
- if (results.failed.length > 0) {
243
- console.log('\\n❌ Failed Migrations:');
244
- results.failed.forEach(failure => {
245
- console.log(` - ${failure.domain}: ${failure.error}`);
246
- });
247
- }
248
- } catch (error) {
249
- this.logOutput(`❌ Portfolio migration failed: ${error.message}`, 'error');
250
- process.exit(1);
251
- }
252
- }
253
-
254
- /**
255
- * Check database health
256
- */
257
- async checkHealth(domain, options) {
258
- try {
259
- if (domain) {
260
- this.logOutput(`❤️ Checking database health: ${domain}`, 'info');
261
- const health = await this.modules.databaseOrchestrator.checkDatabaseHealth(domain, {
262
- environment: options.env,
263
- detailed: options.detailed,
264
- includePerformance: options.performance
265
- });
266
- this.displayHealthResults(health, options);
267
- } else {
268
- this.logOutput('❤️ Checking portfolio database health...', 'info');
269
- const portfolioHealth = await this.modules.databaseOrchestrator.checkPortfolioHealth({
270
- environment: options.env,
271
- detailed: options.detailed,
272
- includePerformance: options.performance
273
- });
274
- this.displayPortfolioHealthResults(portfolioHealth, options);
275
- }
276
- } catch (error) {
277
- this.logOutput(`❌ Health check failed: ${error.message}`, 'error');
278
- process.exit(1);
279
- }
280
- }
281
-
282
- /**
283
- * Display health results
284
- */
285
- displayHealthResults(health, options) {
286
- if (options.format === 'table') {
287
- console.log(`\\n📊 Database Health: ${health.status}`);
288
- console.log(` 🔗 Connection: ${health.connection ? '✅' : '❌'}`);
289
- console.log(` 📊 Size: ${health.size || 'N/A'}`);
290
- console.log(` 🔢 Tables: ${health.tableCount || 'N/A'}`);
291
- if (options.detailed && health.details) {
292
- console.log('\\n📋 Detailed Information:');
293
- Object.entries(health.details).forEach(([key, value]) => {
294
- console.log(` ${key}: ${value}`);
295
- });
296
- }
297
- if (options.performance && health.performance) {
298
- console.log('\\n⚡ Performance Metrics:');
299
- Object.entries(health.performance).forEach(([key, value]) => {
300
- console.log(` ${key}: ${value}`);
301
- });
302
- }
303
- } else {
304
- console.log(JSON.stringify(health, null, 2));
305
- }
306
- }
307
-
308
- /**
309
- * Display portfolio health results
310
- */
311
- displayPortfolioHealthResults(portfolioHealth, options) {
312
- if (options.format === 'table') {
313
- console.log('\\n📊 Portfolio Database Health Summary:');
314
- console.log(` 📊 Total Databases: ${portfolioHealth.summary.total}`);
315
- console.log(` ✅ Healthy: ${portfolioHealth.summary.healthy}`);
316
- console.log(` ⚠️ Warnings: ${portfolioHealth.summary.warnings || 0}`);
317
- console.log(` ❌ Unhealthy: ${portfolioHealth.summary.unhealthy}`);
318
- if (options.detailed) {
319
- console.log('\\n📋 Database Details:');
320
- portfolioHealth.databases.forEach(db => {
321
- const status = db.healthy ? '✅' : '❌';
322
- console.log(` ${status} ${db.domain} (${db.environment})`);
323
- if (db.issues?.length > 0) {
324
- db.issues.forEach(issue => console.log(` - ${issue}`));
325
- }
326
- });
327
- }
328
- } else {
329
- console.log(JSON.stringify(portfolioHealth, null, 2));
330
- }
331
- }
332
-
333
- /**
334
- * Generate operation ID
335
- */
336
- generateOperationId(operation) {
337
- const timestamp = Date.now().toString(36);
338
- const random = Math.random().toString(36).substr(2, 9);
339
- return `${operation}_${timestamp}_${random}`;
340
- }
341
-
342
- /**
343
- * Log output with different levels
344
- */
345
- logOutput(message, level = 'info') {
346
- if (program.opts().quiet && level !== 'error') return;
347
- const colors = {
348
- info: '\\x1b[36m',
349
- // Cyan
350
- success: '\\x1b[32m',
351
- // Green
352
- warn: '\\x1b[33m',
353
- // Yellow
354
- error: '\\x1b[31m',
355
- // Red
356
- reset: '\\x1b[0m' // Reset
357
- };
358
- const useColor = !program.opts().noColor;
359
- const colorCode = useColor ? colors[level] || colors.info : '';
360
- const resetCode = useColor ? colors.reset : '';
361
- console.log(`${colorCode}${message}${resetCode}`);
362
- }
363
-
364
- /**
365
- * Placeholder implementations for remaining methods
366
- */
367
- async migrationStatus(domain, options) {
368
- this.logOutput(`📊 Migration status for ${domain || 'portfolio'} not yet implemented`, 'warn');
369
- }
370
- async validateSchema(domain, options) {
371
- this.logOutput(`🔍 Schema validation for ${domain} not yet implemented`, 'warn');
372
- }
373
- async syncSchemas(options) {
374
- this.logOutput(`🔄 Schema synchronization not yet implemented`, 'warn');
375
- }
376
- async schemaDiff(options) {
377
- this.logOutput(`📊 Schema diff between ${options.source} and ${options.target} not yet implemented`, 'warn');
378
- }
379
- async backupDomain(domain, options) {
380
- this.logOutput(`💾 Database backup for ${domain} not yet implemented`, 'warn');
381
- }
382
- async backupAll(options) {
383
- this.logOutput(`💾 Portfolio backup not yet implemented`, 'warn');
384
- }
385
- async restoreDomain(domain, options) {
386
- this.logOutput(`🔄 Database restore for ${domain} not yet implemented`, 'warn');
387
- }
388
- async listBackups(domain, options) {
389
- this.logOutput(`📋 Backup listing for ${domain || 'portfolio'} not yet implemented`, 'warn');
390
- }
391
- async startMonitoring(options) {
392
- this.logOutput(`📊 Database monitoring not yet implemented`, 'warn');
393
- }
394
- async getStats(domain, options) {
395
- this.logOutput(`📊 Database statistics for ${domain || 'portfolio'} not yet implemented`, 'warn');
396
- }
397
- async cleanupDomain(domain, options) {
398
- this.logOutput(`🧹 Database cleanup for ${domain} not yet implemented`, 'warn');
399
- }
400
- async cleanupAll(options) {
401
- this.logOutput(`🧹 Portfolio database cleanup not yet implemented`, 'warn');
402
- }
403
- async optimizeDomain(domain, options) {
404
- this.logOutput(`⚡ Database optimization for ${domain} not yet implemented`, 'warn');
405
- }
406
- async validateData(domain, options) {
407
- this.logOutput(`🔍 Data validation for ${domain} not yet implemented`, 'warn');
408
- }
409
- async validateAll(options) {
410
- this.logOutput(`🔍 Portfolio data validation not yet implemented`, 'warn');
411
- }
412
- async manageConnections(domain, options) {
413
- this.logOutput(`🔗 Connection management for ${domain || 'portfolio'} not yet implemented`, 'warn');
414
- }
415
- async manageAccess(options) {
416
- this.logOutput(`🔐 Access management not yet implemented`, 'warn');
417
- }
418
- async disasterRecovery(options) {
419
- this.logOutput(`🚨 Disaster recovery (${options.mode} mode) not yet implemented`, 'warn');
420
- }
421
- async generateAudit(domain, options) {
422
- this.logOutput(`📋 Database audit for ${domain || 'portfolio'} not yet implemented`, 'warn');
423
- }
424
- async complianceCheck(options) {
425
- this.logOutput(`📋 Compliance check (${options.standard}) not yet implemented`, 'warn');
426
- }
427
- async manageConfig(options) {
428
- this.logOutput(`⚙️ Configuration management not yet implemented`, 'warn');
429
- }
430
- async initializeDomain(domain, options) {
431
- this.logOutput(`🚀 Database initialization for ${domain} not yet implemented`, 'warn');
432
- }
433
- async listDomains(options) {
434
- this.logOutput(`📋 Database domain listing not yet implemented`, 'warn');
435
- }
436
- async getDomainInfo(domain, options) {
437
- this.logOutput(`📊 Domain information for ${domain} not yet implemented`, 'warn');
438
- }
439
- }
440
-
441
- // Initialize and run CLI
442
- const cli = new EnterpriseDatabaseManagerCLI();
443
- cli.initialize().catch(error => {
444
- console.error('❌ Failed to initialize CLI:', error.message);
445
- process.exit(1);
446
- });
447
-
448
- // Handle unhandled errors
449
- process.on('uncaughtException', error => {
450
- console.error('❌ Uncaught Exception:', error.message);
451
- process.exit(1);
452
- });
453
- process.on('unhandledRejection', (reason, promise) => {
454
- console.error('❌ Unhandled Rejection at:', promise, 'reason:', reason);
455
- process.exit(1);
456
- });
457
- export { EnterpriseDatabaseManagerCLI };