runbooks 1.1.3__py3-none-any.whl → 1.1.5__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 (247) 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/WEIGHT_CONFIG_README.md +1 -1
  8. runbooks/cfat/assessment/compliance.py +8 -8
  9. runbooks/cfat/assessment/runner.py +1 -0
  10. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  11. runbooks/cfat/models.py +6 -2
  12. runbooks/cfat/tests/__init__.py +6 -1
  13. runbooks/cli/__init__.py +13 -0
  14. runbooks/cli/commands/cfat.py +274 -0
  15. runbooks/cli/commands/finops.py +1164 -0
  16. runbooks/cli/commands/inventory.py +379 -0
  17. runbooks/cli/commands/operate.py +239 -0
  18. runbooks/cli/commands/security.py +248 -0
  19. runbooks/cli/commands/validation.py +825 -0
  20. runbooks/cli/commands/vpc.py +310 -0
  21. runbooks/cli/registry.py +107 -0
  22. runbooks/cloudops/__init__.py +23 -30
  23. runbooks/cloudops/base.py +96 -107
  24. runbooks/cloudops/cost_optimizer.py +549 -547
  25. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  26. runbooks/cloudops/interfaces.py +226 -227
  27. runbooks/cloudops/lifecycle_manager.py +5 -4
  28. runbooks/cloudops/mcp_cost_validation.py +252 -235
  29. runbooks/cloudops/models.py +78 -53
  30. runbooks/cloudops/monitoring_automation.py +5 -4
  31. runbooks/cloudops/notebook_framework.py +179 -215
  32. runbooks/cloudops/security_enforcer.py +125 -159
  33. runbooks/common/accuracy_validator.py +11 -0
  34. runbooks/common/aws_pricing.py +349 -326
  35. runbooks/common/aws_pricing_api.py +211 -212
  36. runbooks/common/aws_profile_manager.py +341 -0
  37. runbooks/common/aws_utils.py +75 -80
  38. runbooks/common/business_logic.py +127 -105
  39. runbooks/common/cli_decorators.py +36 -60
  40. runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
  41. runbooks/common/cross_account_manager.py +198 -205
  42. runbooks/common/date_utils.py +27 -39
  43. runbooks/common/decorators.py +235 -0
  44. runbooks/common/dry_run_examples.py +173 -208
  45. runbooks/common/dry_run_framework.py +157 -155
  46. runbooks/common/enhanced_exception_handler.py +15 -4
  47. runbooks/common/enhanced_logging_example.py +50 -64
  48. runbooks/common/enhanced_logging_integration_example.py +65 -37
  49. runbooks/common/env_utils.py +16 -16
  50. runbooks/common/error_handling.py +40 -38
  51. runbooks/common/lazy_loader.py +41 -23
  52. runbooks/common/logging_integration_helper.py +79 -86
  53. runbooks/common/mcp_cost_explorer_integration.py +478 -495
  54. runbooks/common/mcp_integration.py +63 -74
  55. runbooks/common/memory_optimization.py +140 -118
  56. runbooks/common/module_cli_base.py +37 -58
  57. runbooks/common/organizations_client.py +176 -194
  58. runbooks/common/patterns.py +204 -0
  59. runbooks/common/performance_monitoring.py +67 -71
  60. runbooks/common/performance_optimization_engine.py +283 -274
  61. runbooks/common/profile_utils.py +248 -39
  62. runbooks/common/rich_utils.py +643 -92
  63. runbooks/common/sre_performance_suite.py +177 -186
  64. runbooks/enterprise/__init__.py +1 -1
  65. runbooks/enterprise/logging.py +144 -106
  66. runbooks/enterprise/security.py +187 -204
  67. runbooks/enterprise/validation.py +43 -56
  68. runbooks/finops/__init__.py +29 -33
  69. runbooks/finops/account_resolver.py +1 -1
  70. runbooks/finops/advanced_optimization_engine.py +980 -0
  71. runbooks/finops/automation_core.py +268 -231
  72. runbooks/finops/business_case_config.py +184 -179
  73. runbooks/finops/cli.py +660 -139
  74. runbooks/finops/commvault_ec2_analysis.py +157 -164
  75. runbooks/finops/compute_cost_optimizer.py +336 -320
  76. runbooks/finops/config.py +20 -20
  77. runbooks/finops/cost_optimizer.py +488 -622
  78. runbooks/finops/cost_processor.py +332 -214
  79. runbooks/finops/dashboard_runner.py +1006 -172
  80. runbooks/finops/ebs_cost_optimizer.py +991 -657
  81. runbooks/finops/elastic_ip_optimizer.py +317 -257
  82. runbooks/finops/enhanced_mcp_integration.py +340 -0
  83. runbooks/finops/enhanced_progress.py +40 -37
  84. runbooks/finops/enhanced_trend_visualization.py +3 -2
  85. runbooks/finops/enterprise_wrappers.py +230 -292
  86. runbooks/finops/executive_export.py +203 -160
  87. runbooks/finops/helpers.py +130 -288
  88. runbooks/finops/iam_guidance.py +1 -1
  89. runbooks/finops/infrastructure/__init__.py +80 -0
  90. runbooks/finops/infrastructure/commands.py +506 -0
  91. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  92. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  93. runbooks/finops/markdown_exporter.py +338 -175
  94. runbooks/finops/mcp_validator.py +1952 -0
  95. runbooks/finops/nat_gateway_optimizer.py +1513 -482
  96. runbooks/finops/network_cost_optimizer.py +657 -587
  97. runbooks/finops/notebook_utils.py +226 -188
  98. runbooks/finops/optimization_engine.py +1136 -0
  99. runbooks/finops/optimizer.py +25 -29
  100. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  101. runbooks/finops/reservation_optimizer.py +427 -363
  102. runbooks/finops/scenario_cli_integration.py +77 -78
  103. runbooks/finops/scenarios.py +1278 -439
  104. runbooks/finops/schemas.py +218 -182
  105. runbooks/finops/snapshot_manager.py +2289 -0
  106. runbooks/finops/tests/test_finops_dashboard.py +3 -3
  107. runbooks/finops/tests/test_reference_images_validation.py +2 -2
  108. runbooks/finops/tests/test_single_account_features.py +17 -17
  109. runbooks/finops/tests/validate_test_suite.py +1 -1
  110. runbooks/finops/types.py +3 -3
  111. runbooks/finops/validation_framework.py +263 -269
  112. runbooks/finops/vpc_cleanup_exporter.py +191 -146
  113. runbooks/finops/vpc_cleanup_optimizer.py +593 -575
  114. runbooks/finops/workspaces_analyzer.py +171 -182
  115. runbooks/hitl/enhanced_workflow_engine.py +1 -1
  116. runbooks/integration/__init__.py +89 -0
  117. runbooks/integration/mcp_integration.py +1920 -0
  118. runbooks/inventory/CLAUDE.md +816 -0
  119. runbooks/inventory/README.md +3 -3
  120. runbooks/inventory/Tests/common_test_data.py +30 -30
  121. runbooks/inventory/__init__.py +2 -2
  122. runbooks/inventory/cloud_foundations_integration.py +144 -149
  123. runbooks/inventory/collectors/aws_comprehensive.py +28 -11
  124. runbooks/inventory/collectors/aws_networking.py +111 -101
  125. runbooks/inventory/collectors/base.py +4 -0
  126. runbooks/inventory/core/collector.py +495 -313
  127. runbooks/inventory/discovery.md +2 -2
  128. runbooks/inventory/drift_detection_cli.py +69 -96
  129. runbooks/inventory/find_ec2_security_groups.py +1 -1
  130. runbooks/inventory/inventory_mcp_cli.py +48 -46
  131. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  132. runbooks/inventory/mcp_inventory_validator.py +549 -465
  133. runbooks/inventory/mcp_vpc_validator.py +359 -442
  134. runbooks/inventory/organizations_discovery.py +56 -52
  135. runbooks/inventory/rich_inventory_display.py +33 -32
  136. runbooks/inventory/unified_validation_engine.py +278 -251
  137. runbooks/inventory/vpc_analyzer.py +733 -696
  138. runbooks/inventory/vpc_architecture_validator.py +293 -348
  139. runbooks/inventory/vpc_dependency_analyzer.py +382 -378
  140. runbooks/inventory/vpc_flow_analyzer.py +3 -3
  141. runbooks/main.py +152 -9147
  142. runbooks/main_final.py +91 -60
  143. runbooks/main_minimal.py +22 -10
  144. runbooks/main_optimized.py +131 -100
  145. runbooks/main_ultra_minimal.py +7 -2
  146. runbooks/mcp/__init__.py +36 -0
  147. runbooks/mcp/integration.py +679 -0
  148. runbooks/metrics/dora_metrics_engine.py +2 -2
  149. runbooks/monitoring/performance_monitor.py +9 -4
  150. runbooks/operate/dynamodb_operations.py +3 -1
  151. runbooks/operate/ec2_operations.py +145 -137
  152. runbooks/operate/iam_operations.py +146 -152
  153. runbooks/operate/mcp_integration.py +1 -1
  154. runbooks/operate/networking_cost_heatmap.py +33 -10
  155. runbooks/operate/privatelink_operations.py +1 -1
  156. runbooks/operate/rds_operations.py +223 -254
  157. runbooks/operate/s3_operations.py +107 -118
  158. runbooks/operate/vpc_endpoints.py +1 -1
  159. runbooks/operate/vpc_operations.py +648 -618
  160. runbooks/remediation/base.py +1 -1
  161. runbooks/remediation/commons.py +10 -7
  162. runbooks/remediation/commvault_ec2_analysis.py +71 -67
  163. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  164. runbooks/remediation/multi_account.py +24 -21
  165. runbooks/remediation/rds_snapshot_list.py +91 -65
  166. runbooks/remediation/remediation_cli.py +92 -146
  167. runbooks/remediation/universal_account_discovery.py +83 -79
  168. runbooks/remediation/workspaces_list.py +49 -44
  169. runbooks/security/__init__.py +19 -0
  170. runbooks/security/assessment_runner.py +1150 -0
  171. runbooks/security/baseline_checker.py +812 -0
  172. runbooks/security/cloudops_automation_security_validator.py +509 -535
  173. runbooks/security/compliance_automation_engine.py +17 -17
  174. runbooks/security/config/__init__.py +2 -2
  175. runbooks/security/config/compliance_config.py +50 -50
  176. runbooks/security/config_template_generator.py +63 -76
  177. runbooks/security/enterprise_security_framework.py +1 -1
  178. runbooks/security/executive_security_dashboard.py +519 -508
  179. runbooks/security/integration_test_enterprise_security.py +5 -3
  180. runbooks/security/multi_account_security_controls.py +959 -1210
  181. runbooks/security/real_time_security_monitor.py +422 -444
  182. runbooks/security/run_script.py +1 -1
  183. runbooks/security/security_baseline_tester.py +1 -1
  184. runbooks/security/security_cli.py +143 -112
  185. runbooks/security/test_2way_validation.py +439 -0
  186. runbooks/security/two_way_validation_framework.py +852 -0
  187. runbooks/sre/mcp_reliability_engine.py +6 -6
  188. runbooks/sre/production_monitoring_framework.py +167 -177
  189. runbooks/tdd/__init__.py +15 -0
  190. runbooks/tdd/cli.py +1071 -0
  191. runbooks/utils/__init__.py +14 -17
  192. runbooks/utils/logger.py +7 -2
  193. runbooks/utils/version_validator.py +51 -48
  194. runbooks/validation/__init__.py +6 -6
  195. runbooks/validation/cli.py +9 -3
  196. runbooks/validation/comprehensive_2way_validator.py +754 -708
  197. runbooks/validation/mcp_validator.py +906 -228
  198. runbooks/validation/terraform_citations_validator.py +104 -115
  199. runbooks/validation/terraform_drift_detector.py +447 -451
  200. runbooks/vpc/README.md +617 -0
  201. runbooks/vpc/__init__.py +8 -1
  202. runbooks/vpc/analyzer.py +577 -0
  203. runbooks/vpc/cleanup_wrapper.py +476 -413
  204. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  205. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  206. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  207. runbooks/vpc/config.py +92 -97
  208. runbooks/vpc/cost_engine.py +411 -148
  209. runbooks/vpc/cost_explorer_integration.py +553 -0
  210. runbooks/vpc/cross_account_session.py +101 -106
  211. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  212. runbooks/vpc/eni_gate_validator.py +961 -0
  213. runbooks/vpc/heatmap_engine.py +190 -162
  214. runbooks/vpc/mcp_no_eni_validator.py +681 -640
  215. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  216. runbooks/vpc/networking_wrapper.py +15 -8
  217. runbooks/vpc/pdca_remediation_planner.py +528 -0
  218. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  219. runbooks/vpc/runbooks_adapter.py +1167 -241
  220. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  221. runbooks/vpc/test_data_loader.py +358 -0
  222. runbooks/vpc/tests/conftest.py +314 -4
  223. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  224. runbooks/vpc/tests/test_cost_engine.py +0 -2
  225. runbooks/vpc/topology_generator.py +326 -0
  226. runbooks/vpc/unified_scenarios.py +1302 -1129
  227. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  228. runbooks-1.1.5.dist-info/METADATA +328 -0
  229. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
  230. runbooks/finops/README.md +0 -414
  231. runbooks/finops/accuracy_cross_validator.py +0 -647
  232. runbooks/finops/business_cases.py +0 -950
  233. runbooks/finops/dashboard_router.py +0 -922
  234. runbooks/finops/ebs_optimizer.py +0 -956
  235. runbooks/finops/embedded_mcp_validator.py +0 -1629
  236. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  237. runbooks/finops/finops_dashboard.py +0 -584
  238. runbooks/finops/finops_scenarios.py +0 -1218
  239. runbooks/finops/legacy_migration.py +0 -730
  240. runbooks/finops/multi_dashboard.py +0 -1519
  241. runbooks/finops/single_dashboard.py +0 -1113
  242. runbooks/finops/unlimited_scenarios.py +0 -393
  243. runbooks-1.1.3.dist-info/METADATA +0 -799
  244. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
  245. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
  246. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
  247. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,825 @@
1
+ """
2
+ Validation Commands Module - MCP Validation & Testing Framework
3
+
4
+ KISS Principle: Focused on validation and testing operations
5
+ DRY Principle: Centralized validation patterns and enterprise accuracy standards
6
+
7
+ Context: Provides CLI interface for comprehensive MCP validation framework
8
+ with enterprise-grade accuracy targets and universal profile support.
9
+ """
10
+
11
+ import click
12
+ from rich.console import Console
13
+
14
+ # Import common utilities and decorators
15
+ from runbooks.common.decorators import common_aws_options
16
+
17
+ console = Console()
18
+
19
+
20
+ def create_validation_group():
21
+ """
22
+ Create the validation command group with all subcommands.
23
+
24
+ Returns:
25
+ Click Group object with all validation commands
26
+
27
+ Performance: Lazy creation only when needed by DRYCommandRegistry
28
+ Context Reduction: Enterprise validation framework with universal profile support
29
+ """
30
+
31
+ @click.group(invoke_without_command=True)
32
+ @common_aws_options
33
+ @click.pass_context
34
+ def validation(ctx, profile, region, dry_run):
35
+ """
36
+ MCP validation and testing framework for enterprise accuracy standards.
37
+
38
+ Comprehensive validation framework ensuring ≥99.5% accuracy across all
39
+ AWS operations with enterprise-grade performance and reliability testing.
40
+
41
+ Validation Operations:
42
+ • Cost Explorer data accuracy validation
43
+ • Organizations API consistency checking
44
+ • Resource inventory validation across 50+ AWS services
45
+ • Security baseline compliance verification
46
+ • Performance benchmarking with <30s targets
47
+
48
+ Examples:
49
+ runbooks validation validate-all --profile billing-profile
50
+ runbooks validation costs --tolerance 2.0
51
+ runbooks validation benchmark --iterations 10
52
+ """
53
+ ctx.obj.update({"profile": profile, "region": region, "dry_run": dry_run})
54
+
55
+ if ctx.invoked_subcommand is None:
56
+ click.echo(ctx.get_help())
57
+
58
+ @validation.command("validate-all")
59
+ @common_aws_options
60
+ @click.option("--tolerance", default=5.0, help="Tolerance percentage for variance detection")
61
+ @click.option("--performance-target", default=30.0, help="Performance target in seconds")
62
+ @click.option("--save-report", is_flag=True, help="Save detailed report to artifacts")
63
+ @click.option("--all", is_flag=True, help="Use all available AWS profiles for multi-account validation")
64
+ @click.pass_context
65
+ def validate_all(ctx, profile, region, dry_run, tolerance, performance_target, save_report, all):
66
+ """
67
+ Run comprehensive validation across all critical operations with universal profile support.
68
+
69
+ Enterprise Validation Features:
70
+ • ≥99.5% accuracy target across all operations
71
+ • Performance benchmarking with <30s targets
72
+ • Multi-account validation with --all flag
73
+ • Comprehensive reporting with variance analysis
74
+ • Real-time progress monitoring with Rich UI
75
+
76
+ Examples:
77
+ runbooks validation validate-all --tolerance 2.0
78
+ runbooks validation validate-all --performance-target 20
79
+ runbooks validation validate-all --all --save-report # Multi-account validation
80
+ """
81
+ try:
82
+ from runbooks.validation.mcp_validator import MCPValidator
83
+ from runbooks.common.profile_utils import get_profile_for_operation
84
+ import asyncio
85
+
86
+ console.print("[bold blue]🔍 Starting comprehensive MCP validation[/bold blue]")
87
+ console.print(f"Target Accuracy: ≥99.5% | Tolerance: ±{tolerance}% | Performance: <{performance_target}s")
88
+
89
+ # Use ProfileManager for dynamic profile resolution
90
+ resolved_profile = get_profile_for_operation("operational", profile)
91
+
92
+ # Initialize validator with resolved profile
93
+ profiles = None
94
+ if resolved_profile:
95
+ profiles = {
96
+ "billing": resolved_profile,
97
+ "management": resolved_profile,
98
+ "centralised_ops": resolved_profile,
99
+ "single_aws": resolved_profile,
100
+ }
101
+
102
+ validator = MCPValidator(
103
+ profiles=profiles, tolerance_percentage=tolerance, performance_target_seconds=performance_target
104
+ )
105
+
106
+ # Run comprehensive validation
107
+ report = asyncio.run(validator.validate_all_operations())
108
+
109
+ # Display results
110
+ validator.display_validation_report(report)
111
+
112
+ # Save report if requested
113
+ if save_report:
114
+ validator.save_validation_report(report)
115
+
116
+ # Return results for further processing
117
+ return report
118
+
119
+ except ImportError as e:
120
+ console.print(f"[red]❌ Validation framework not available: {e}[/red]")
121
+ raise click.ClickException("Validation functionality not available")
122
+ except Exception as e:
123
+ console.print(f"[red]❌ Validation failed: {e}[/red]")
124
+ raise click.ClickException(str(e))
125
+
126
+ @validation.command()
127
+ @common_aws_options
128
+ @click.option("--tolerance", default=5.0, help="Cost variance tolerance percentage")
129
+ @click.option("--all", is_flag=True, help="Use all available AWS profiles for multi-account cost validation")
130
+ @click.pass_context
131
+ def costs(ctx, profile, region, dry_run, tolerance, all):
132
+ """
133
+ Validate Cost Explorer data accuracy with universal profile support.
134
+
135
+ Cost Validation Features:
136
+ • Real-time cost data accuracy verification
137
+ • Variance analysis with configurable tolerance
138
+ • Multi-account cost validation with --all flag
139
+ • Performance benchmarking for cost operations
140
+
141
+ Examples:
142
+ runbooks validation costs --tolerance 2.0
143
+ runbooks validation costs --profile billing-profile
144
+ runbooks validation costs --all --tolerance 1.0 # Multi-account validation
145
+ """
146
+ try:
147
+ from runbooks.validation.mcp_validator import MCPValidator
148
+ from runbooks.common.profile_utils import get_profile_for_operation
149
+ import asyncio
150
+
151
+ console.print(f"[bold cyan]💰 Validating Cost Explorer data accuracy[/bold cyan]")
152
+
153
+ # Use ProfileManager for dynamic profile resolution (billing operation)
154
+ resolved_profile = get_profile_for_operation("billing", profile)
155
+
156
+ validator = MCPValidator(profiles={"billing": resolved_profile}, tolerance_percentage=tolerance)
157
+
158
+ result = asyncio.run(validator.validate_cost_explorer())
159
+
160
+ # Display detailed results
161
+ validator.display_validation_result(result, "Cost Explorer")
162
+
163
+ return result
164
+
165
+ except ImportError as e:
166
+ console.print(f"[red]❌ Cost validation module not available: {e}[/red]")
167
+ raise click.ClickException("Cost validation functionality not available")
168
+ except Exception as e:
169
+ console.print(f"[red]❌ Cost validation failed: {e}[/red]")
170
+ raise click.ClickException(str(e))
171
+
172
+ @validation.command()
173
+ @common_aws_options
174
+ @click.option(
175
+ "--all", is_flag=True, help="Use all available AWS profiles for multi-account organizations validation"
176
+ )
177
+ @click.pass_context
178
+ def organizations(ctx, profile, region, dry_run, all):
179
+ """
180
+ Validate Organizations API data accuracy with universal profile support.
181
+
182
+ Organizations Validation Features:
183
+ • Account discovery consistency verification
184
+ • Organizational unit structure validation
185
+ • Multi-account organizations validation with --all flag
186
+ • Cross-account permission validation
187
+
188
+ Examples:
189
+ runbooks validation organizations
190
+ runbooks validation organizations --profile management-profile
191
+ runbooks validation organizations --all # Multi-account validation
192
+ """
193
+ try:
194
+ from runbooks.validation.mcp_validator import MCPValidator
195
+ from runbooks.common.profile_utils import get_profile_for_operation
196
+ import asyncio
197
+
198
+ console.print(f"[bold cyan]🏢 Validating Organizations API data[/bold cyan]")
199
+
200
+ # Use ProfileManager for dynamic profile resolution (management operation)
201
+ resolved_profile = get_profile_for_operation("management", profile)
202
+
203
+ validator = MCPValidator(profiles={"management": resolved_profile})
204
+
205
+ result = asyncio.run(validator.validate_organizations_data())
206
+
207
+ # Display detailed results
208
+ validator.display_validation_result(result, "Organizations")
209
+
210
+ return result
211
+
212
+ except ImportError as e:
213
+ console.print(f"[red]❌ Organizations validation module not available: {e}[/red]")
214
+ raise click.ClickException("Organizations validation functionality not available")
215
+ except Exception as e:
216
+ console.print(f"[red]❌ Organizations validation failed: {e}[/red]")
217
+ raise click.ClickException(str(e))
218
+
219
+ @validation.command()
220
+ @common_aws_options
221
+ @click.option("--target-accuracy", default=99.5, help="Target accuracy percentage")
222
+ @click.option("--iterations", default=5, help="Number of benchmark iterations")
223
+ @click.option("--performance-target", default=30.0, help="Performance target in seconds")
224
+ @click.option("--all", is_flag=True, help="Use all available AWS profiles for multi-account benchmarking")
225
+ @click.pass_context
226
+ def benchmark(ctx, profile, region, dry_run, target_accuracy, iterations, performance_target, all):
227
+ """
228
+ Run performance benchmark for MCP validation framework with universal profile support.
229
+
230
+ Benchmark Features:
231
+ • Comprehensive performance testing across all operations
232
+ • Configurable accuracy targets and iteration counts
233
+ • Multi-account benchmarking with --all flag
234
+ • Statistical analysis with confidence intervals
235
+ • Enterprise readiness assessment
236
+
237
+ Examples:
238
+ runbooks validation benchmark --target-accuracy 99.0 --iterations 10
239
+ runbooks validation benchmark --performance-target 20
240
+ runbooks validation benchmark --all --iterations 3 # Multi-account benchmark
241
+ """
242
+ try:
243
+ from runbooks.validation.mcp_validator import MCPValidator
244
+ from runbooks.common.profile_utils import get_profile_for_operation
245
+ import asyncio
246
+
247
+ console.print(f"[bold magenta]🎯 Running MCP validation benchmark[/bold magenta]")
248
+ console.print(
249
+ f"Target: {target_accuracy}% | Iterations: {iterations} | Performance: <{performance_target}s"
250
+ )
251
+
252
+ # Use ProfileManager for dynamic profile resolution
253
+ resolved_profile = get_profile_for_operation("operational", profile)
254
+
255
+ validator = MCPValidator(performance_target_seconds=performance_target)
256
+
257
+ results = []
258
+
259
+ # Run benchmark iterations
260
+ for i in range(iterations):
261
+ console.print(f"\n[cyan]Iteration {i + 1}/{iterations}[/cyan]")
262
+
263
+ report = asyncio.run(validator.validate_all_operations())
264
+ results.append(report)
265
+
266
+ console.print(
267
+ f"Accuracy: {report.overall_accuracy:.1f}% | "
268
+ f"Time: {report.execution_time:.1f}s | "
269
+ f"Status: {'✅' if report.overall_accuracy >= target_accuracy else '❌'}"
270
+ )
271
+
272
+ # Generate benchmark summary
273
+ benchmark_summary = validator.generate_benchmark_summary(results, target_accuracy)
274
+
275
+ console.print(f"\n[bold green]📊 Benchmark Complete[/bold green]")
276
+ console.print(f"Average Accuracy: {benchmark_summary['avg_accuracy']:.2f}%")
277
+ console.print(f"Success Rate: {benchmark_summary['success_rate']:.1f}%")
278
+
279
+ return benchmark_summary
280
+
281
+ except ImportError as e:
282
+ console.print(f"[red]❌ Benchmark module not available: {e}[/red]")
283
+ raise click.ClickException("Benchmark functionality not available")
284
+ except Exception as e:
285
+ console.print(f"[red]❌ Benchmark failed: {e}[/red]")
286
+ raise click.ClickException(str(e))
287
+
288
+ @validation.command()
289
+ @common_aws_options
290
+ @click.option(
291
+ "--operation",
292
+ type=click.Choice(["costs", "organizations", "ec2", "security", "vpc"]),
293
+ required=True,
294
+ help="Specific operation to validate",
295
+ )
296
+ @click.option("--tolerance", default=5.0, help="Tolerance percentage")
297
+ @click.option(
298
+ "--all", is_flag=True, help="Use all available AWS profiles for multi-account single operation validation"
299
+ )
300
+ @click.pass_context
301
+ def single(ctx, profile, region, dry_run, operation, tolerance, all):
302
+ """
303
+ Validate a single operation with universal profile support.
304
+
305
+ Single Operation Validation Features:
306
+ • Focused validation on specific AWS service operations
307
+ • Configurable tolerance for variance detection
308
+ • Multi-account single operation validation with --all flag
309
+ • Detailed error analysis and recommendations
310
+
311
+ Examples:
312
+ runbooks validation single --operation costs --tolerance 2.0
313
+ runbooks validation single --operation security --profile ops-profile
314
+ runbooks validation single --operation vpc --all # Multi-account single operation
315
+ """
316
+ try:
317
+ from runbooks.validation.mcp_validator import MCPValidator
318
+ from runbooks.common.profile_utils import get_profile_for_operation
319
+ import asyncio
320
+
321
+ console.print(f"[bold cyan]🔍 Validating {operation.title()} operation[/bold cyan]")
322
+
323
+ # Use ProfileManager for dynamic profile resolution based on operation type
324
+ operation_type_map = {
325
+ "costs": "billing",
326
+ "organizations": "management",
327
+ "ec2": "operational",
328
+ "security": "operational",
329
+ "vpc": "operational",
330
+ }
331
+
332
+ resolved_profile = get_profile_for_operation(operation_type_map.get(operation, "operational"), profile)
333
+
334
+ validator = MCPValidator(tolerance_percentage=tolerance)
335
+
336
+ # Map operations to validator methods
337
+ operation_map = {
338
+ "costs": validator.validate_cost_explorer,
339
+ "organizations": validator.validate_organizations_data,
340
+ "ec2": validator.validate_ec2_inventory,
341
+ "security": validator.validate_security_baseline,
342
+ "vpc": validator.validate_vpc_analysis,
343
+ }
344
+
345
+ result = asyncio.run(operation_map[operation]())
346
+
347
+ # Display detailed results
348
+ validator.display_validation_result(result, operation.title())
349
+
350
+ return result
351
+
352
+ except ImportError as e:
353
+ console.print(f"[red]❌ Single validation module not available: {e}[/red]")
354
+ raise click.ClickException("Single validation functionality not available")
355
+ except Exception as e:
356
+ console.print(f"[red]❌ {operation.title()} validation failed: {e}[/red]")
357
+ raise click.ClickException(str(e))
358
+
359
+ @validation.command()
360
+ @common_aws_options
361
+ @click.option("--all", is_flag=True, help="Check status for all available AWS profiles")
362
+ @click.pass_context
363
+ def status(ctx, profile, region, dry_run, all):
364
+ """
365
+ Show MCP validation framework status with universal profile support.
366
+
367
+ Status Check Features:
368
+ • Component availability and readiness verification
369
+ • AWS profile validation and connectivity testing
370
+ • MCP integration status and configuration validation
371
+ • Multi-account status checking with --all flag
372
+
373
+ Examples:
374
+ runbooks validation status
375
+ runbooks validation status --profile management-profile
376
+ runbooks validation status --all # Multi-account status check
377
+ """
378
+ try:
379
+ from runbooks.validation.mcp_validator import MCPValidator
380
+ from runbooks.common.profile_utils import get_profile_for_operation, list_available_profiles
381
+
382
+ console.print("[bold blue]🔍 MCP Validation Framework Status[/bold blue]")
383
+
384
+ # Use ProfileManager for dynamic profile resolution
385
+ resolved_profile = get_profile_for_operation("operational", profile)
386
+
387
+ # Check available profiles if --all flag is used
388
+ if all:
389
+ profiles = list_available_profiles()
390
+ console.print(f"[dim]Checking {len(profiles)} available profiles[/dim]")
391
+ else:
392
+ profiles = [resolved_profile] if resolved_profile else []
393
+
394
+ validator = MCPValidator()
395
+ status_report = validator.generate_status_report(profiles)
396
+
397
+ # Display status report
398
+ validator.display_status_report(status_report)
399
+
400
+ return status_report
401
+
402
+ except ImportError as e:
403
+ console.print(f"[red]❌ Status module not available: {e}[/red]")
404
+ raise click.ClickException("Status functionality not available")
405
+ except Exception as e:
406
+ console.print(f"[red]❌ Status check failed: {e}[/red]")
407
+ raise click.ClickException(str(e))
408
+
409
+ @validation.command()
410
+ @common_aws_options
411
+ @click.option(
412
+ "--module",
413
+ type=click.Choice(["finops", "inventory", "security", "vpc", "cfat", "operate"]),
414
+ required=True,
415
+ help="Module to test",
416
+ )
417
+ @click.option("--component", help="Specific component within module (e.g., 'ec2-snapshots' for finops module)")
418
+ @click.option(
419
+ "--test-type",
420
+ type=click.Choice(["basic", "profile-tests", "mcp-validation", "full-validation"]),
421
+ default="basic",
422
+ help="Type of testing to perform",
423
+ )
424
+ @click.option("--performance-target", default=30.0, help="Performance target in seconds")
425
+ @click.option("--accuracy-target", default=99.5, help="MCP validation accuracy target percentage")
426
+ @click.option(
427
+ "--generate-evidence", is_flag=True, help="Generate comprehensive evidence reports for manager review"
428
+ )
429
+ @click.option("--export-results", is_flag=True, help="Export test results to JSON file")
430
+ @click.pass_context
431
+ def test(
432
+ ctx,
433
+ profile,
434
+ region,
435
+ dry_run,
436
+ module,
437
+ component,
438
+ test_type,
439
+ performance_target,
440
+ accuracy_target,
441
+ generate_evidence,
442
+ export_results,
443
+ ):
444
+ """
445
+ Comprehensive test command integration for Sprint 1 validation framework.
446
+
447
+ STRATEGIC CONTEXT: Enterprise framework requires `/test` command validation
448
+ with ≥99.5% MCP validation accuracy for ALL deployments before completion claims.
449
+
450
+ Test Framework Features:
451
+ • Real AWS profile testing across all resolution scenarios
452
+ • MCP validation testing with configurable accuracy targets
453
+ • CLI parameter testing for all command combinations
454
+ • Evidence generation testing for manager reports
455
+ • Performance testing with enterprise targets (<30s analysis time)
456
+
457
+ Test Types:
458
+ • basic: Core functionality and CLI integration
459
+ • profile-tests: All AWS profile resolution scenarios
460
+ • mcp-validation: MCP accuracy validation ≥99.5%
461
+ • full-validation: Comprehensive end-to-end testing
462
+
463
+ Examples:
464
+ # Test finops ec2-snapshots with basic validation
465
+ runbooks validation test --module finops --component ec2-snapshots --test-type basic
466
+
467
+ # Test profile resolution scenarios
468
+ runbooks validation test --module finops --component ec2-snapshots --test-type profile-tests
469
+
470
+ # Test MCP validation accuracy
471
+ runbooks validation test --module finops --component ec2-snapshots --test-type mcp-validation --accuracy-target 99.5
472
+
473
+ # Full validation with evidence generation
474
+ runbooks validation test --module finops --component ec2-snapshots --test-type full-validation --generate-evidence --export-results
475
+
476
+ # Performance testing
477
+ runbooks validation test --module finops --component ec2-snapshots --test-type basic --performance-target 20
478
+
479
+ Sprint 1 Context:
480
+ Required for Sprint 1, Task 1 completion validation ensuring all identified
481
+ issues are fixed and comprehensive evidence generated for manager review.
482
+ """
483
+ try:
484
+ import asyncio
485
+ import time
486
+ import subprocess
487
+ import sys
488
+ from pathlib import Path
489
+
490
+ if component:
491
+ console.print(
492
+ f"\n[bold blue]🧪 Enterprise Test Framework - {module.upper()} Component: {component}[/bold blue]"
493
+ )
494
+ else:
495
+ console.print(f"\n[bold blue]🧪 Enterprise Test Framework - {module.upper()}[/bold blue]")
496
+ console.print(
497
+ f"[dim]Type: {test_type} | Performance: <{performance_target}s | Accuracy: ≥{accuracy_target}%[/dim]\n"
498
+ )
499
+
500
+ # Resolve profile for testing
501
+ resolved_profile = profile or "default"
502
+
503
+ # Test execution tracking
504
+ test_results = {
505
+ "module": module,
506
+ "component": component,
507
+ "test_type": test_type,
508
+ "profile": resolved_profile,
509
+ "start_time": time.time(),
510
+ "tests_executed": [],
511
+ "failures": [],
512
+ "performance_metrics": {},
513
+ "mcp_validation_results": {},
514
+ "evidence_generated": [],
515
+ }
516
+
517
+ # Basic functionality testing
518
+ if test_type in ["basic", "full-validation"]:
519
+ console.print("[cyan]🔧 Basic Functionality Testing[/cyan]")
520
+
521
+ # Test module import
522
+ try:
523
+ if module == "finops" and component == "ec2-snapshots":
524
+ from runbooks.finops.snapshot_manager import EC2SnapshotManager
525
+
526
+ console.print(" ✅ Module import successful")
527
+ test_results["tests_executed"].append("module_import")
528
+ else:
529
+ console.print(f" ⚠️ Test configuration for {module}/{component} not implemented yet")
530
+ test_results["tests_executed"].append("module_import_skipped")
531
+ except ImportError as e:
532
+ console.print(f" ❌ Module import failed: {e}")
533
+ test_results["failures"].append(f"module_import: {e}")
534
+
535
+ # Test CLI command availability
536
+ try:
537
+ if module == "finops" and component == "ec2-snapshots":
538
+ result = subprocess.run(
539
+ [sys.executable, "-m", "runbooks", "finops", "ec2-snapshots", "--help"],
540
+ capture_output=True,
541
+ text=True,
542
+ timeout=10,
543
+ )
544
+
545
+ if result.returncode == 0:
546
+ console.print(" ✅ CLI command available")
547
+ test_results["tests_executed"].append("cli_available")
548
+ else:
549
+ console.print(f" ❌ CLI command failed: {result.stderr}")
550
+ test_results["failures"].append(f"cli_available: {result.stderr}")
551
+ else:
552
+ console.print(f" ⚠️ CLI test for {module}/{component} not configured")
553
+ test_results["tests_executed"].append("cli_test_skipped")
554
+ except Exception as e:
555
+ console.print(f" ❌ CLI test failed: {e}")
556
+ test_results["failures"].append(f"cli_test: {e}")
557
+
558
+ # Profile resolution testing
559
+ if test_type in ["profile-tests", "full-validation"]:
560
+ console.print("\n[cyan]🔐 Profile Resolution Testing[/cyan]")
561
+
562
+ try:
563
+ from runbooks.common.profile_utils import get_profile_for_operation
564
+
565
+ # Test different profile scenarios
566
+ profile_scenarios = [
567
+ ("billing", resolved_profile),
568
+ ("management", resolved_profile),
569
+ ("operational", resolved_profile),
570
+ ]
571
+
572
+ for operation_type, test_profile in profile_scenarios:
573
+ try:
574
+ resolved = get_profile_for_operation(operation_type, test_profile)
575
+ console.print(f" ✅ {operation_type}: {resolved or 'default'}")
576
+ test_results["tests_executed"].append(f"profile_{operation_type}")
577
+ except Exception as e:
578
+ console.print(f" ❌ {operation_type}: {e}")
579
+ test_results["failures"].append(f"profile_{operation_type}: {e}")
580
+
581
+ except ImportError as e:
582
+ console.print(f" ❌ Profile utils not available: {e}")
583
+ test_results["failures"].append(f"profile_utils: {e}")
584
+
585
+ # MCP validation testing
586
+ if test_type in ["mcp-validation", "full-validation"]:
587
+ console.print(f"\n[cyan]🎯 MCP Validation Testing (Target: ≥{accuracy_target}%)[/cyan]")
588
+
589
+ try:
590
+ from runbooks.validation.mcp_validator import MCPValidator
591
+
592
+ validator = MCPValidator(tolerance_percentage=5.0)
593
+
594
+ if module == "finops":
595
+ # Test cost validation
596
+ start_time = time.time()
597
+ result = asyncio.run(validator.validate_cost_explorer())
598
+ validation_time = time.time() - start_time
599
+
600
+ accuracy = result.get("accuracy_percentage", 0)
601
+ if accuracy >= accuracy_target:
602
+ console.print(f" ✅ Cost validation: {accuracy:.2f}% accuracy ({validation_time:.1f}s)")
603
+ test_results["mcp_validation_results"]["cost_validation"] = {
604
+ "accuracy": accuracy,
605
+ "time": validation_time,
606
+ "passed": True,
607
+ }
608
+ else:
609
+ console.print(
610
+ f" ❌ Cost validation: {accuracy:.2f}% accuracy (Required: ≥{accuracy_target}%)"
611
+ )
612
+ test_results["mcp_validation_results"]["cost_validation"] = {
613
+ "accuracy": accuracy,
614
+ "time": validation_time,
615
+ "passed": False,
616
+ }
617
+ test_results["failures"].append(f"mcp_accuracy: {accuracy}% < {accuracy_target}%")
618
+ else:
619
+ console.print(f" ⚠️ MCP validation for {module} not configured")
620
+ test_results["tests_executed"].append("mcp_validation_skipped")
621
+
622
+ except ImportError as e:
623
+ console.print(f" ❌ MCP validator not available: {e}")
624
+ test_results["failures"].append(f"mcp_validator: {e}")
625
+ except Exception as e:
626
+ console.print(f" ❌ MCP validation failed: {e}")
627
+ test_results["failures"].append(f"mcp_validation: {e}")
628
+
629
+ # Performance testing
630
+ if test_type in ["basic", "full-validation"]:
631
+ console.print(f"\n[cyan]⚡ Performance Testing (Target: <{performance_target}s)[/cyan]")
632
+
633
+ try:
634
+ if module == "finops" and component == "ec2-snapshots":
635
+ from runbooks.finops.snapshot_manager import EC2SnapshotManager
636
+
637
+ manager = EC2SnapshotManager(profile=resolved_profile, dry_run=True)
638
+
639
+ # Test session initialization performance
640
+ start_time = time.time()
641
+ session_result = manager.initialize_session()
642
+ init_time = time.time() - start_time
643
+
644
+ if init_time < performance_target:
645
+ console.print(f" ✅ Session initialization: {init_time:.2f}s")
646
+ test_results["performance_metrics"]["session_init"] = {
647
+ "time": init_time,
648
+ "target": performance_target,
649
+ "passed": True,
650
+ }
651
+ else:
652
+ console.print(
653
+ f" ❌ Session initialization: {init_time:.2f}s (Target: <{performance_target}s)"
654
+ )
655
+ test_results["performance_metrics"]["session_init"] = {
656
+ "time": init_time,
657
+ "target": performance_target,
658
+ "passed": False,
659
+ }
660
+ test_results["failures"].append(f"performance: {init_time:.2f}s > {performance_target}s")
661
+ else:
662
+ console.print(f" ⚠️ Performance test for {module}/{component} not configured")
663
+ test_results["tests_executed"].append("performance_test_skipped")
664
+
665
+ except Exception as e:
666
+ console.print(f" ❌ Performance test failed: {e}")
667
+ test_results["failures"].append(f"performance_test: {e}")
668
+
669
+ # Unit test execution
670
+ if test_type in ["full-validation"]:
671
+ console.print("\n[cyan]🧪 Unit Test Execution[/cyan]")
672
+
673
+ try:
674
+ if module == "finops" and component == "ec2-snapshots":
675
+ test_file = "tests/finops/test_ec2_snapshot_manager.py"
676
+
677
+ # Run the comprehensive test suite
678
+ result = subprocess.run(
679
+ [sys.executable, "-m", "pytest", test_file, "-v", "--tb=short"],
680
+ capture_output=True,
681
+ text=True,
682
+ timeout=300,
683
+ )
684
+
685
+ if result.returncode == 0:
686
+ passed_tests = result.stdout.count("PASSED")
687
+ failed_tests = result.stdout.count("FAILED")
688
+ console.print(f" ✅ Unit tests: {passed_tests} passed, {failed_tests} failed")
689
+ test_results["tests_executed"].append("unit_tests")
690
+ test_results["unit_test_results"] = {
691
+ "passed": passed_tests,
692
+ "failed": failed_tests,
693
+ "output": result.stdout[:1000], # Truncate for storage
694
+ }
695
+ else:
696
+ console.print(f" ❌ Unit tests failed: {result.stderr[:200]}")
697
+ test_results["failures"].append(f"unit_tests: {result.stderr[:200]}")
698
+ else:
699
+ console.print(f" ⚠️ Unit tests for {module}/{component} not configured")
700
+ test_results["tests_executed"].append("unit_tests_skipped")
701
+
702
+ except Exception as e:
703
+ console.print(f" ❌ Unit test execution failed: {e}")
704
+ test_results["failures"].append(f"unit_tests: {e}")
705
+
706
+ # Calculate final results
707
+ test_results["end_time"] = time.time()
708
+ test_results["total_duration"] = test_results["end_time"] - test_results["start_time"]
709
+ test_results["success_count"] = len(test_results["tests_executed"])
710
+ test_results["failure_count"] = len(test_results["failures"])
711
+ test_results["success_rate"] = (
712
+ (test_results["success_count"] / (test_results["success_count"] + test_results["failure_count"])) * 100
713
+ if (test_results["success_count"] + test_results["failure_count"]) > 0
714
+ else 0
715
+ )
716
+
717
+ # Generate summary
718
+ console.print(f"\n[bold green]📊 Test Summary[/bold green]")
719
+ console.print(f"Duration: {test_results['total_duration']:.1f}s")
720
+ console.print(f"Tests Executed: {test_results['success_count']}")
721
+ console.print(f"Failures: {test_results['failure_count']}")
722
+ console.print(f"Success Rate: {test_results['success_rate']:.1f}%")
723
+
724
+ # Success/failure indicator
725
+ if test_results["failure_count"] == 0:
726
+ console.print(f"\n[bold green]✅ ALL TESTS PASSED[/bold green]")
727
+ console.print(f"[green]Enterprise validation requirements satisfied[/green]")
728
+ else:
729
+ console.print(f"\n[bold red]❌ {test_results['failure_count']} TEST(S) FAILED[/bold red]")
730
+ console.print(f"[red]Review failures and re-run validation[/red]")
731
+
732
+ # Evidence generation
733
+ if generate_evidence:
734
+ console.print(f"\n[cyan]📋 Generating Evidence Reports[/cyan]")
735
+
736
+ try:
737
+ evidence_dir = Path("artifacts/test_evidence")
738
+ evidence_dir.mkdir(parents=True, exist_ok=True)
739
+
740
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
741
+ evidence_file = evidence_dir / f"test_evidence_{module}_{component}_{timestamp}.json"
742
+
743
+ import json
744
+
745
+ with open(evidence_file, "w") as f:
746
+ json.dump(test_results, f, indent=2, default=str)
747
+
748
+ console.print(f" ✅ Evidence saved: {evidence_file}")
749
+ test_results["evidence_generated"].append(str(evidence_file))
750
+
751
+ # Generate manager summary
752
+ manager_summary = evidence_dir / f"manager_summary_{module}_{component}_{timestamp}.md"
753
+ with open(manager_summary, "w") as f:
754
+ f.write(f"# Test Validation Report: {module.upper()}")
755
+ if component:
756
+ f.write(f" - {component}")
757
+ f.write(f"\n\n**Date**: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
758
+ f.write(f"**Test Type**: {test_type}\n")
759
+ f.write(f"**Profile**: {resolved_profile}\n\n")
760
+ f.write(f"## Summary\n")
761
+ f.write(f"- **Duration**: {test_results['total_duration']:.1f}s\n")
762
+ f.write(f"- **Tests Executed**: {test_results['success_count']}\n")
763
+ f.write(f"- **Failures**: {test_results['failure_count']}\n")
764
+ f.write(f"- **Success Rate**: {test_results['success_rate']:.1f}%\n\n")
765
+
766
+ if test_results["failure_count"] == 0:
767
+ f.write("## ✅ VALIDATION STATUS: PASSED\n")
768
+ f.write("All enterprise validation requirements satisfied.\n\n")
769
+ else:
770
+ f.write("## ❌ VALIDATION STATUS: FAILED\n")
771
+ f.write("Review failures below and re-run validation.\n\n")
772
+ f.write("### Failures:\n")
773
+ for failure in test_results["failures"]:
774
+ f.write(f"- {failure}\n")
775
+ f.write("\n")
776
+
777
+ f.write("## Strategic Context\n")
778
+ f.write(
779
+ "Enterprise framework requires `/test` command validation with ≥99.5% MCP validation accuracy for ALL deployments before completion claims.\n\n"
780
+ )
781
+ f.write(
782
+ "**Agent Coordination**: qa-testing-specialist [3] (Primary), python-runbooks-engineer [1] (Support)\n"
783
+ )
784
+
785
+ console.print(f" ✅ Manager summary: {manager_summary}")
786
+ test_results["evidence_generated"].append(str(manager_summary))
787
+
788
+ except Exception as e:
789
+ console.print(f" ❌ Evidence generation failed: {e}")
790
+ test_results["failures"].append(f"evidence_generation: {e}")
791
+
792
+ # Export results if requested
793
+ if export_results:
794
+ try:
795
+ export_dir = Path("artifacts/test_results")
796
+ export_dir.mkdir(parents=True, exist_ok=True)
797
+
798
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
799
+ export_file = export_dir / f"test_results_{module}_{component}_{timestamp}.json"
800
+
801
+ import json
802
+
803
+ with open(export_file, "w") as f:
804
+ json.dump(test_results, f, indent=2, default=str)
805
+
806
+ console.print(f"\n[cyan]📤 Results exported: {export_file}[/cyan]")
807
+
808
+ except Exception as e:
809
+ console.print(f"\n[red]❌ Export failed: {e}[/red]")
810
+
811
+ # Enterprise coordination confirmation
812
+ console.print(f"\n[dim]🏢 Enterprise coordination: qa-testing-specialist [3] (Primary)[/dim]")
813
+ console.print(f"[dim]🎯 Supporting: python-runbooks-engineer [1][/dim]")
814
+ console.print(f"[dim]📋 Strategic: ALL deployments require `/test` validation[/dim]")
815
+
816
+ return test_results
817
+
818
+ except ImportError as e:
819
+ console.print(f"[red]❌ Test framework not available: {e}[/red]")
820
+ raise click.ClickException("Test functionality not available")
821
+ except Exception as e:
822
+ console.print(f"[red]❌ Test execution failed: {e}[/red]")
823
+ raise click.ClickException(str(e))
824
+
825
+ return validation