#!/usr/bin/env python3
"""
CodeBase Optimizer - Simple Command Line Interface
==================================================
Easy-to-use wrapper for the codebase optimizer that works without MCP dependencies.
Perfect for local development and quick project analysis.
Usage:
python3 analyze.py /path/to/project
python3 analyze.py /path/to/project --detailed
python3 analyze.py /path/to/project --function detect_duplicates
"""
import argparse
import sys
import os
from pathlib import Path
# Add current directory to path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
try:
from codebase_optimizer_engine import CodebaseAnalyzer
except ImportError as e:
print(f"โ Error importing CodebaseAnalyzer: {e}")
sys.exit(1)
def main():
parser = argparse.ArgumentParser(
description="Analyze and optimize your codebase",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
python3 analyze.py ~/my-project
python3 analyze.py ~/my-project --detailed
python3 analyze.py ~/my-project --function detect_duplicates
python3 analyze.py ~/my-project --function validate_microservices
"""
)
parser.add_argument(
'project_path',
help='Path to the project directory to analyze'
)
parser.add_argument(
'--function',
choices=[
'structure', 'duplicates', 'microservices',
'config', 'report', 'complete'
],
help='Run specific analysis function'
)
parser.add_argument(
'--detailed',
action='store_true',
help='Show detailed analysis results'
)
parser.add_argument(
'--output',
help='Save results to file'
)
args = parser.parse_args()
# Validate project path
project_path = Path(args.project_path).resolve()
if not project_path.exists():
print(f"โ Error: Project path '{project_path}' does not exist")
sys.exit(1)
if not project_path.is_dir():
print(f"โ Error: '{project_path}' is not a directory")
sys.exit(1)
print(f"๐ Analyzing project: {project_path}")
print("=" * 60)
try:
analyzer = CodebaseAnalyzer(str(project_path))
if args.function == 'structure':
result = analyzer.analyze_project_structure()
print("๐ PROJECT STRUCTURE ANALYSIS")
print(f"Health Score: {result.health_score:.1f}/100")
print(f"Total Files: {result.metrics.total_files}")
print(f"Organization Score: {result.metrics.organization_score:.2f}")
elif args.function == 'duplicates':
result = analyzer.detect_code_duplicates()
print("๐ CODE DUPLICATION ANALYSIS")
print(f"Duplication Percentage: {result.metrics.duplication_percentage:.1f}%")
print(f"Duplicate Functions: {len(result.duplicate_functions)}")
if result.duplicate_functions:
print("\nDuplicate Functions Found:")
for func in result.duplicate_functions[:5]: # Show first 5
print(f" โข {func}")
elif args.function == 'microservices':
result = analyzer.validate_microservices_architecture()
print("๐๏ธ MICROSERVICES ARCHITECTURE VALIDATION")
print(f"Architecture Score: {result.architecture_score:.1f}/100")
elif args.function == 'config':
result = analyzer.optimize_configurations()
print("โ๏ธ CONFIGURATION OPTIMIZATION")
print(f"Configuration Score: {result.config_score:.1f}/100")
elif args.function == 'report':
# Need to run other analyses first to generate report
structure_result = analyzer.analyze_project_structure()
duplicate_result = analyzer.detect_code_duplicates()
microservices_result = analyzer.validate_microservices_architecture()
config_result = analyzer.optimize_configurations()
all_results = [structure_result, duplicate_result, microservices_result, config_result]
result = analyzer.generate_improvement_report(all_results)
print("๐ IMPROVEMENT REPORT")
print(result.summary)
else:
# Run complete analysis (default)
print("๐ Running complete project analysis...")
# Structure analysis
print("\n1๏ธโฃ Analyzing project structure...")
structure_result = analyzer.analyze_project_structure()
# Duplicate detection
print("2๏ธโฃ Detecting code duplicates...")
duplicate_result = analyzer.detect_code_duplicates()
# Microservices validation
print("3๏ธโฃ Validating architecture...")
microservices_result = analyzer.validate_microservices_architecture()
# Configuration optimization
print("4๏ธโฃ Optimizing configurations...")
config_result = analyzer.optimize_configurations()
# Generate report
print("5๏ธโฃ Generating improvement report...")
all_results = [structure_result, duplicate_result, microservices_result, config_result]
report_result = analyzer.generate_improvement_report(all_results)
# Display comprehensive results
print("\n" + "=" * 60)
print("๐ฏ COMPLETE ANALYSIS RESULTS")
print("=" * 60)
print(f"๐ Health Score: {structure_result.health_score:.1f}/100")
print(f"๐ Total Files: {structure_result.metrics.total_files}")
print(f"๐ Lines of Code: {structure_result.metrics.lines_of_code:,}")
print(f"๐ Code Duplication: {duplicate_result.metrics.duplication_percentage:.1f}%")
print(f"๐๏ธ Organization Score: {structure_result.metrics.organization_score:.2f}")
if duplicate_result.duplicate_functions:
print(f"\n๐จ Found {len(duplicate_result.duplicate_functions)} duplicate functions:")
for func in duplicate_result.duplicate_functions[:3]:
print(f" โข {func}")
if len(duplicate_result.duplicate_functions) > 3:
print(f" ... and {len(duplicate_result.duplicate_functions) - 3} more")
print(f"\n๐ Top Recommendations:")
for i, rec in enumerate(report_result.recommendations[:3], 1):
print(f" {i}. [{rec.priority.upper()}] {rec.description}")
# Save output if requested
if args.output:
with open(args.output, 'w') as f:
f.write(f"CodeBase Analysis Results for {project_path}\n")
f.write("=" * 60 + "\n")
f.write(f"Generated: {analyzer.get_timestamp()}\n")
# Add more detailed output here if needed
print(f"\n๐พ Results saved to: {args.output}")
print(f"\nโ
Analysis complete!")
except Exception as e:
print(f"โ Analysis failed: {e}")
if args.detailed:
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()