runbooks 1.1.4__py3-none-any.whl → 1.1.6__py3-none-any.whl

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 (273) hide show
  1. runbooks/__init__.py +31 -2
  2. runbooks/__init___optimized.py +18 -4
  3. runbooks/_platform/__init__.py +1 -5
  4. runbooks/_platform/core/runbooks_wrapper.py +141 -138
  5. runbooks/aws2/accuracy_validator.py +812 -0
  6. runbooks/base.py +7 -0
  7. runbooks/cfat/assessment/compliance.py +1 -1
  8. runbooks/cfat/assessment/runner.py +1 -0
  9. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  10. runbooks/cli/__init__.py +1 -1
  11. runbooks/cli/commands/cfat.py +64 -23
  12. runbooks/cli/commands/finops.py +1005 -54
  13. runbooks/cli/commands/inventory.py +135 -91
  14. runbooks/cli/commands/operate.py +9 -36
  15. runbooks/cli/commands/security.py +42 -18
  16. runbooks/cli/commands/validation.py +432 -18
  17. runbooks/cli/commands/vpc.py +81 -17
  18. runbooks/cli/registry.py +22 -10
  19. runbooks/cloudops/__init__.py +20 -27
  20. runbooks/cloudops/base.py +96 -107
  21. runbooks/cloudops/cost_optimizer.py +544 -542
  22. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  23. runbooks/cloudops/interfaces.py +224 -225
  24. runbooks/cloudops/lifecycle_manager.py +5 -4
  25. runbooks/cloudops/mcp_cost_validation.py +252 -235
  26. runbooks/cloudops/models.py +78 -53
  27. runbooks/cloudops/monitoring_automation.py +5 -4
  28. runbooks/cloudops/notebook_framework.py +177 -213
  29. runbooks/cloudops/security_enforcer.py +125 -159
  30. runbooks/common/accuracy_validator.py +17 -12
  31. runbooks/common/aws_pricing.py +349 -326
  32. runbooks/common/aws_pricing_api.py +211 -212
  33. runbooks/common/aws_profile_manager.py +40 -36
  34. runbooks/common/aws_utils.py +74 -79
  35. runbooks/common/business_logic.py +126 -104
  36. runbooks/common/cli_decorators.py +36 -60
  37. runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
  38. runbooks/common/cross_account_manager.py +197 -204
  39. runbooks/common/date_utils.py +27 -39
  40. runbooks/common/decorators.py +29 -19
  41. runbooks/common/dry_run_examples.py +173 -208
  42. runbooks/common/dry_run_framework.py +157 -155
  43. runbooks/common/enhanced_exception_handler.py +15 -4
  44. runbooks/common/enhanced_logging_example.py +50 -64
  45. runbooks/common/enhanced_logging_integration_example.py +65 -37
  46. runbooks/common/env_utils.py +16 -16
  47. runbooks/common/error_handling.py +40 -38
  48. runbooks/common/lazy_loader.py +41 -23
  49. runbooks/common/logging_integration_helper.py +79 -86
  50. runbooks/common/mcp_cost_explorer_integration.py +476 -493
  51. runbooks/common/mcp_integration.py +99 -79
  52. runbooks/common/memory_optimization.py +140 -118
  53. runbooks/common/module_cli_base.py +37 -58
  54. runbooks/common/organizations_client.py +175 -193
  55. runbooks/common/patterns.py +23 -25
  56. runbooks/common/performance_monitoring.py +67 -71
  57. runbooks/common/performance_optimization_engine.py +283 -274
  58. runbooks/common/profile_utils.py +111 -37
  59. runbooks/common/rich_utils.py +315 -141
  60. runbooks/common/sre_performance_suite.py +177 -186
  61. runbooks/enterprise/__init__.py +1 -1
  62. runbooks/enterprise/logging.py +144 -106
  63. runbooks/enterprise/security.py +187 -204
  64. runbooks/enterprise/validation.py +43 -56
  65. runbooks/finops/__init__.py +26 -30
  66. runbooks/finops/account_resolver.py +1 -1
  67. runbooks/finops/advanced_optimization_engine.py +980 -0
  68. runbooks/finops/automation_core.py +268 -231
  69. runbooks/finops/business_case_config.py +184 -179
  70. runbooks/finops/cli.py +660 -139
  71. runbooks/finops/commvault_ec2_analysis.py +157 -164
  72. runbooks/finops/compute_cost_optimizer.py +336 -320
  73. runbooks/finops/config.py +20 -20
  74. runbooks/finops/cost_optimizer.py +484 -618
  75. runbooks/finops/cost_processor.py +332 -214
  76. runbooks/finops/dashboard_runner.py +1006 -172
  77. runbooks/finops/ebs_cost_optimizer.py +991 -657
  78. runbooks/finops/elastic_ip_optimizer.py +317 -257
  79. runbooks/finops/enhanced_mcp_integration.py +340 -0
  80. runbooks/finops/enhanced_progress.py +32 -29
  81. runbooks/finops/enhanced_trend_visualization.py +3 -2
  82. runbooks/finops/enterprise_wrappers.py +223 -285
  83. runbooks/finops/executive_export.py +203 -160
  84. runbooks/finops/helpers.py +130 -288
  85. runbooks/finops/iam_guidance.py +1 -1
  86. runbooks/finops/infrastructure/__init__.py +80 -0
  87. runbooks/finops/infrastructure/commands.py +506 -0
  88. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  89. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  90. runbooks/finops/markdown_exporter.py +337 -174
  91. runbooks/finops/mcp_validator.py +1952 -0
  92. runbooks/finops/nat_gateway_optimizer.py +1512 -481
  93. runbooks/finops/network_cost_optimizer.py +657 -587
  94. runbooks/finops/notebook_utils.py +226 -188
  95. runbooks/finops/optimization_engine.py +1136 -0
  96. runbooks/finops/optimizer.py +19 -23
  97. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  98. runbooks/finops/reservation_optimizer.py +427 -363
  99. runbooks/finops/scenario_cli_integration.py +64 -65
  100. runbooks/finops/scenarios.py +1277 -438
  101. runbooks/finops/schemas.py +218 -182
  102. runbooks/finops/snapshot_manager.py +2289 -0
  103. runbooks/finops/types.py +3 -3
  104. runbooks/finops/validation_framework.py +259 -265
  105. runbooks/finops/vpc_cleanup_exporter.py +189 -144
  106. runbooks/finops/vpc_cleanup_optimizer.py +591 -573
  107. runbooks/finops/workspaces_analyzer.py +171 -182
  108. runbooks/integration/__init__.py +89 -0
  109. runbooks/integration/mcp_integration.py +1920 -0
  110. runbooks/inventory/CLAUDE.md +816 -0
  111. runbooks/inventory/__init__.py +2 -2
  112. runbooks/inventory/aws_decorators.py +2 -3
  113. runbooks/inventory/check_cloudtrail_compliance.py +2 -4
  114. runbooks/inventory/check_controltower_readiness.py +152 -151
  115. runbooks/inventory/check_landingzone_readiness.py +85 -84
  116. runbooks/inventory/cloud_foundations_integration.py +144 -149
  117. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  118. runbooks/inventory/collectors/aws_networking.py +109 -99
  119. runbooks/inventory/collectors/base.py +4 -0
  120. runbooks/inventory/core/collector.py +495 -313
  121. runbooks/inventory/core/formatter.py +11 -0
  122. runbooks/inventory/draw_org_structure.py +8 -9
  123. runbooks/inventory/drift_detection_cli.py +69 -96
  124. runbooks/inventory/ec2_vpc_utils.py +2 -2
  125. runbooks/inventory/find_cfn_drift_detection.py +5 -7
  126. runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
  127. runbooks/inventory/find_cfn_stackset_drift.py +5 -6
  128. runbooks/inventory/find_ec2_security_groups.py +48 -42
  129. runbooks/inventory/find_landingzone_versions.py +4 -6
  130. runbooks/inventory/find_vpc_flow_logs.py +7 -9
  131. runbooks/inventory/inventory_mcp_cli.py +48 -46
  132. runbooks/inventory/inventory_modules.py +103 -91
  133. runbooks/inventory/list_cfn_stacks.py +9 -10
  134. runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
  135. runbooks/inventory/list_cfn_stackset_operations.py +79 -57
  136. runbooks/inventory/list_cfn_stacksets.py +8 -10
  137. runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
  138. runbooks/inventory/list_ds_directories.py +65 -53
  139. runbooks/inventory/list_ec2_availability_zones.py +2 -4
  140. runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
  141. runbooks/inventory/list_ec2_instances.py +23 -28
  142. runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
  143. runbooks/inventory/list_elbs_load_balancers.py +22 -20
  144. runbooks/inventory/list_enis_network_interfaces.py +26 -33
  145. runbooks/inventory/list_guardduty_detectors.py +2 -4
  146. runbooks/inventory/list_iam_policies.py +2 -4
  147. runbooks/inventory/list_iam_roles.py +5 -7
  148. runbooks/inventory/list_iam_saml_providers.py +4 -6
  149. runbooks/inventory/list_lambda_functions.py +38 -38
  150. runbooks/inventory/list_org_accounts.py +6 -8
  151. runbooks/inventory/list_org_accounts_users.py +55 -44
  152. runbooks/inventory/list_rds_db_instances.py +31 -33
  153. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  154. runbooks/inventory/list_route53_hosted_zones.py +3 -5
  155. runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
  156. runbooks/inventory/list_sns_topics.py +2 -4
  157. runbooks/inventory/list_ssm_parameters.py +4 -7
  158. runbooks/inventory/list_vpc_subnets.py +2 -4
  159. runbooks/inventory/list_vpcs.py +7 -10
  160. runbooks/inventory/mcp_inventory_validator.py +554 -468
  161. runbooks/inventory/mcp_vpc_validator.py +359 -442
  162. runbooks/inventory/organizations_discovery.py +63 -55
  163. runbooks/inventory/recover_cfn_stack_ids.py +7 -8
  164. runbooks/inventory/requirements.txt +0 -1
  165. runbooks/inventory/rich_inventory_display.py +35 -34
  166. runbooks/inventory/run_on_multi_accounts.py +3 -5
  167. runbooks/inventory/unified_validation_engine.py +281 -253
  168. runbooks/inventory/verify_ec2_security_groups.py +1 -1
  169. runbooks/inventory/vpc_analyzer.py +735 -697
  170. runbooks/inventory/vpc_architecture_validator.py +293 -348
  171. runbooks/inventory/vpc_dependency_analyzer.py +384 -380
  172. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  173. runbooks/main.py +49 -34
  174. runbooks/main_final.py +91 -60
  175. runbooks/main_minimal.py +22 -10
  176. runbooks/main_optimized.py +131 -100
  177. runbooks/main_ultra_minimal.py +7 -2
  178. runbooks/mcp/__init__.py +36 -0
  179. runbooks/mcp/integration.py +679 -0
  180. runbooks/monitoring/performance_monitor.py +9 -4
  181. runbooks/operate/dynamodb_operations.py +3 -1
  182. runbooks/operate/ec2_operations.py +145 -137
  183. runbooks/operate/iam_operations.py +146 -152
  184. runbooks/operate/networking_cost_heatmap.py +29 -8
  185. runbooks/operate/rds_operations.py +223 -254
  186. runbooks/operate/s3_operations.py +107 -118
  187. runbooks/operate/vpc_operations.py +646 -616
  188. runbooks/remediation/base.py +1 -1
  189. runbooks/remediation/commons.py +10 -7
  190. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  191. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  192. runbooks/remediation/multi_account.py +24 -21
  193. runbooks/remediation/rds_snapshot_list.py +86 -60
  194. runbooks/remediation/remediation_cli.py +92 -146
  195. runbooks/remediation/universal_account_discovery.py +83 -79
  196. runbooks/remediation/workspaces_list.py +46 -41
  197. runbooks/security/__init__.py +19 -0
  198. runbooks/security/assessment_runner.py +1150 -0
  199. runbooks/security/baseline_checker.py +812 -0
  200. runbooks/security/cloudops_automation_security_validator.py +509 -535
  201. runbooks/security/compliance_automation_engine.py +17 -17
  202. runbooks/security/config/__init__.py +2 -2
  203. runbooks/security/config/compliance_config.py +50 -50
  204. runbooks/security/config_template_generator.py +63 -76
  205. runbooks/security/enterprise_security_framework.py +1 -1
  206. runbooks/security/executive_security_dashboard.py +519 -508
  207. runbooks/security/multi_account_security_controls.py +959 -1210
  208. runbooks/security/real_time_security_monitor.py +422 -444
  209. runbooks/security/security_baseline_tester.py +1 -1
  210. runbooks/security/security_cli.py +143 -112
  211. runbooks/security/test_2way_validation.py +439 -0
  212. runbooks/security/two_way_validation_framework.py +852 -0
  213. runbooks/sre/production_monitoring_framework.py +167 -177
  214. runbooks/tdd/__init__.py +15 -0
  215. runbooks/tdd/cli.py +1071 -0
  216. runbooks/utils/__init__.py +14 -17
  217. runbooks/utils/logger.py +7 -2
  218. runbooks/utils/version_validator.py +50 -47
  219. runbooks/validation/__init__.py +6 -6
  220. runbooks/validation/cli.py +9 -3
  221. runbooks/validation/comprehensive_2way_validator.py +745 -704
  222. runbooks/validation/mcp_validator.py +906 -228
  223. runbooks/validation/terraform_citations_validator.py +104 -115
  224. runbooks/validation/terraform_drift_detector.py +461 -454
  225. runbooks/vpc/README.md +617 -0
  226. runbooks/vpc/__init__.py +8 -1
  227. runbooks/vpc/analyzer.py +577 -0
  228. runbooks/vpc/cleanup_wrapper.py +476 -413
  229. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  230. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  231. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  232. runbooks/vpc/config.py +92 -97
  233. runbooks/vpc/cost_engine.py +411 -148
  234. runbooks/vpc/cost_explorer_integration.py +553 -0
  235. runbooks/vpc/cross_account_session.py +101 -106
  236. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  237. runbooks/vpc/eni_gate_validator.py +961 -0
  238. runbooks/vpc/heatmap_engine.py +185 -160
  239. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  240. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  241. runbooks/vpc/networking_wrapper.py +15 -8
  242. runbooks/vpc/pdca_remediation_planner.py +528 -0
  243. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  244. runbooks/vpc/runbooks_adapter.py +1167 -241
  245. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  246. runbooks/vpc/test_data_loader.py +358 -0
  247. runbooks/vpc/tests/conftest.py +314 -4
  248. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  249. runbooks/vpc/tests/test_cost_engine.py +0 -2
  250. runbooks/vpc/topology_generator.py +326 -0
  251. runbooks/vpc/unified_scenarios.py +1297 -1124
  252. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  253. runbooks-1.1.6.dist-info/METADATA +327 -0
  254. runbooks-1.1.6.dist-info/RECORD +489 -0
  255. runbooks/finops/README.md +0 -414
  256. runbooks/finops/accuracy_cross_validator.py +0 -647
  257. runbooks/finops/business_cases.py +0 -950
  258. runbooks/finops/dashboard_router.py +0 -922
  259. runbooks/finops/ebs_optimizer.py +0 -973
  260. runbooks/finops/embedded_mcp_validator.py +0 -1629
  261. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  262. runbooks/finops/finops_dashboard.py +0 -584
  263. runbooks/finops/finops_scenarios.py +0 -1218
  264. runbooks/finops/legacy_migration.py +0 -730
  265. runbooks/finops/multi_dashboard.py +0 -1519
  266. runbooks/finops/single_dashboard.py +0 -1113
  267. runbooks/finops/unlimited_scenarios.py +0 -393
  268. runbooks-1.1.4.dist-info/METADATA +0 -800
  269. runbooks-1.1.4.dist-info/RECORD +0 -468
  270. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
  271. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
  272. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
  273. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/top_level.txt +0 -0
@@ -21,12 +21,18 @@ from rich.panel import Panel
21
21
  from rich.table import Table
22
22
 
23
23
  from runbooks.common.rich_utils import (
24
- console, print_header, print_success, print_error, print_warning, print_info,
25
- create_table, create_progress_bar, format_cost, STATUS_INDICATORS
26
- )
27
- from runbooks.common.cli_decorators import (
28
- common_aws_options, rich_output_options, enterprise_safety_options
24
+ console,
25
+ print_header,
26
+ print_success,
27
+ print_error,
28
+ print_warning,
29
+ print_info,
30
+ create_table,
31
+ create_progress_bar,
32
+ format_cost,
33
+ STATUS_INDICATORS,
29
34
  )
35
+ from runbooks.common.cli_decorators import common_aws_options, rich_output_options, enterprise_safety_options
30
36
  from runbooks.common.error_handling import handle_aws_errors, handle_validation_errors
31
37
  from runbooks.common.profile_utils import get_profile_for_operation, validate_profile_access_decorator
32
38
  from runbooks.common.business_logic import BusinessMetrics, OptimizationResult, UniversalBusinessLogic
@@ -35,6 +41,7 @@ from runbooks.common.business_logic import BusinessMetrics, OptimizationResult,
35
41
  @dataclass
36
42
  class ModuleConfig:
37
43
  """Configuration for runbooks module CLI."""
44
+
38
45
  name: str
39
46
  version: str
40
47
  description: str
@@ -69,11 +76,7 @@ class ModuleCLIBase(abc.ABC):
69
76
  """Print standardized module header with Rich formatting."""
70
77
  print_header(self.config.name, self.config.version)
71
78
  self.console.print(
72
- Panel(
73
- f"[cyan]{self.config.description}[/cyan]",
74
- title=f"🚀 {self.config.name} Module",
75
- border_style="blue"
76
- )
79
+ Panel(f"[cyan]{self.config.description}[/cyan]", title=f"🚀 {self.config.name} Module", border_style="blue")
77
80
  )
78
81
 
79
82
  def validate_prerequisites(self, profile: Optional[str] = None) -> bool:
@@ -88,15 +91,12 @@ class ModuleCLIBase(abc.ABC):
88
91
  """
89
92
  try:
90
93
  # Validate AWS profile access
91
- selected_profile = get_profile_for_operation(
92
- self.config.primary_operation_type,
93
- profile
94
- )
94
+ selected_profile = get_profile_for_operation(self.config.primary_operation_type, profile)
95
95
 
96
96
  if not validate_profile_access(selected_profile, self.config.name):
97
97
  return False
98
98
 
99
- self._session_data['validated_profile'] = selected_profile
99
+ self._session_data["validated_profile"] = selected_profile
100
100
  return True
101
101
 
102
102
  except Exception as e:
@@ -125,8 +125,7 @@ class ModuleCLIBase(abc.ABC):
125
125
  """
126
126
  pass
127
127
 
128
- def create_results_table(self, title: str, data: List[Dict[str, Any]],
129
- columns: List[str]) -> Table:
128
+ def create_results_table(self, title: str, data: List[Dict[str, Any]], columns: List[str]) -> Table:
130
129
  """
131
130
  Create standardized results table with Rich formatting.
132
131
 
@@ -138,18 +137,19 @@ class ModuleCLIBase(abc.ABC):
138
137
  Returns:
139
138
  Configured Rich Table object
140
139
  """
141
- table = create_table(title=title, columns=[
142
- {"name": col, "style": "cyan" if "name" in col.lower() else "default"}
143
- for col in columns
144
- ])
140
+ table = create_table(
141
+ title=title,
142
+ columns=[{"name": col, "style": "cyan" if "name" in col.lower() else "default"} for col in columns],
143
+ )
145
144
 
146
145
  for row in data:
147
146
  table.add_row(*[str(row.get(col, "N/A")) for col in columns])
148
147
 
149
148
  return table
150
149
 
151
- def export_results(self, results: Dict[str, Any], format_type: str = "json",
152
- output_path: Optional[str] = None) -> bool:
150
+ def export_results(
151
+ self, results: Dict[str, Any], format_type: str = "json", output_path: Optional[str] = None
152
+ ) -> bool:
153
153
  """
154
154
  Export results in specified format.
155
155
 
@@ -166,9 +166,7 @@ class ModuleCLIBase(abc.ABC):
166
166
  return False
167
167
 
168
168
  try:
169
- export_handler = self.business_logic.create_export_handler(
170
- format_type, output_path
171
- )
169
+ export_handler = self.business_logic.create_export_handler(format_type, output_path)
172
170
 
173
171
  success = export_handler.export_data(results)
174
172
 
@@ -205,6 +203,7 @@ class ModuleCLIBase(abc.ABC):
205
203
  Returns:
206
204
  Decorated click command function
207
205
  """
206
+
208
207
  @click.command(name=command_name)
209
208
  @common_aws_options
210
209
  @rich_output_options
@@ -212,8 +211,7 @@ class ModuleCLIBase(abc.ABC):
212
211
  @handle_aws_errors(module_name=self.config.name)
213
212
  @handle_validation_errors
214
213
  @validate_profile_access_decorator(operation_type=self.config.primary_operation_type)
215
- def standardized_command(profile=None, region=None, dry_run=True,
216
- export_format=None, quiet=False, **kwargs):
214
+ def standardized_command(profile=None, region=None, dry_run=True, export_format=None, quiet=False, **kwargs):
217
215
  """Execute standardized module operation with enterprise safety."""
218
216
 
219
217
  # Module header
@@ -227,19 +225,11 @@ class ModuleCLIBase(abc.ABC):
227
225
  # Execute with performance monitoring
228
226
  try:
229
227
  with create_progress_bar() as progress:
230
- task = progress.add_task(
231
- f"[cyan]Executing {self.config.name} operation...",
232
- total=100
233
- )
228
+ task = progress.add_task(f"[cyan]Executing {self.config.name} operation...", total=100)
234
229
 
235
230
  # Execute primary operation
236
231
  results = self.execute_primary_operation(
237
- profile=profile,
238
- region=region,
239
- dry_run=dry_run,
240
- progress=progress,
241
- task=task,
242
- **kwargs
232
+ profile=profile, region=region, dry_run=dry_run, progress=progress, task=task, **kwargs
243
233
  )
244
234
 
245
235
  progress.update(task, completed=100)
@@ -252,9 +242,7 @@ class ModuleCLIBase(abc.ABC):
252
242
  metrics = self.calculate_business_metrics(results)
253
243
 
254
244
  if not quiet and metrics.annual_savings > 0:
255
- print_success(
256
- f"💰 Potential annual savings: {format_cost(metrics.annual_savings)}"
257
- )
245
+ print_success(f"💰 Potential annual savings: {format_cost(metrics.annual_savings)}")
258
246
 
259
247
  # Export if requested
260
248
  if export_format:
@@ -294,17 +282,13 @@ class AnalysisModuleCLI(ModuleCLIBase):
294
282
  if metrics.roi_percentage > 0:
295
283
  summary_content.append(f"📊 ROI: {metrics.roi_percentage:.1f}%")
296
284
 
297
- if hasattr(metrics, 'resources_analyzed'):
285
+ if hasattr(metrics, "resources_analyzed"):
298
286
  summary_content.append(f"🔍 Resources Analyzed: {metrics.resources_analyzed:,}")
299
287
 
300
288
  summary_content.append(f"⏱️ Execution Time: <{self.config.performance_target_seconds}s target")
301
289
  summary_content.append(f"✅ Confidence: {metrics.confidence_level:.1f}%")
302
290
 
303
- return Panel(
304
- "\n".join(summary_content),
305
- title="📈 Executive Summary",
306
- border_style="green"
307
- )
291
+ return Panel("\n".join(summary_content), title="📈 Executive Summary", border_style="green")
308
292
 
309
293
 
310
294
  class OperationsModuleCLI(ModuleCLIBase):
@@ -330,7 +314,7 @@ class OperationsModuleCLI(ModuleCLIBase):
330
314
  True if operation is safe to proceed
331
315
  """
332
316
  # Always require explicit approval for destructive operations
333
- destructive_operations = ['delete', 'terminate', 'remove', 'destroy']
317
+ destructive_operations = ["delete", "terminate", "remove", "destroy"]
334
318
 
335
319
  if any(op in operation.lower() for op in destructive_operations):
336
320
  print_warning(f"⚠️ Destructive operation requested: {operation}")
@@ -360,19 +344,14 @@ class OperationsModuleCLI(ModuleCLIBase):
360
344
  "timestamp": datetime.now().isoformat(),
361
345
  "module": self.config.name,
362
346
  "operation": operation,
363
- "user": self._session_data.get('validated_profile', 'unknown'),
364
- "resources_affected": results.get('resources_affected', []),
365
- "success": results.get('success', False),
366
- "execution_time": results.get('execution_time_seconds', 0)
347
+ "user": self._session_data.get("validated_profile", "unknown"),
348
+ "resources_affected": results.get("resources_affected", []),
349
+ "success": results.get("success", False),
350
+ "execution_time": results.get("execution_time_seconds", 0),
367
351
  }
368
352
 
369
353
  return json.dumps(audit_entry, indent=2)
370
354
 
371
355
 
372
356
  # Export standardized classes for module implementations
373
- __all__ = [
374
- "ModuleConfig",
375
- "ModuleCLIBase",
376
- "AnalysisModuleCLI",
377
- "OperationsModuleCLI"
378
- ]
357
+ __all__ = ["ModuleConfig", "ModuleCLIBase", "AnalysisModuleCLI", "OperationsModuleCLI"]