| | """ |
| | Code Quality Agent - Main orchestration script. |
| | |
| | This is the main entry point for the automated code quality agent. |
| | It coordinates all modules and generates comprehensive quality reports. |
| | |
| | Usage: |
| | python code_quality_agent.py [options] |
| | |
| | Options: |
| | --dry-run Preview changes without applying them |
| | --module <name> Run specific module only (clean, security, connections, test) |
| | --all Run all modules (default) |
| | --config <path> Path to custom config file |
| | --help Show this help message |
| | """ |
| |
|
| | import sys |
| | import argparse |
| | import logging |
| | import yaml |
| | from pathlib import Path |
| | from typing import Dict, Any |
| |
|
| | from modules import ( |
| | CodeCleaner, |
| | VulnerabilityChecker, |
| | ConnectionTester, |
| | CodeTester, |
| | ReportGenerator |
| | ) |
| |
|
| |
|
| | class CodeQualityAgent: |
| | """Main code quality agent orchestrator.""" |
| | |
| | def __init__(self, config_path: str = "agent_config.yaml"): |
| | """ |
| | Initialize the code quality agent. |
| | |
| | Args: |
| | config_path: Path to configuration file |
| | """ |
| | self.project_root = Path(__file__).parent |
| | self.config = self._load_config(config_path) |
| | self._setup_logging() |
| | |
| | self.results = {} |
| | |
| | def _load_config(self, config_path: str) -> Dict[str, Any]: |
| | """Load configuration from YAML file.""" |
| | config_file = self.project_root / config_path |
| | |
| | if not config_file.exists(): |
| | print(f"Warning: Config file {config_path} not found. Using defaults.") |
| | return self._get_default_config() |
| | |
| | try: |
| | with open(config_file, 'r') as f: |
| | config = yaml.safe_load(f) |
| | return config |
| | except Exception as e: |
| | print(f"Error loading config: {e}. Using defaults.") |
| | return self._get_default_config() |
| | |
| | def _get_default_config(self) -> Dict[str, Any]: |
| | """Get default configuration.""" |
| | return { |
| | "general": { |
| | "project_name": "Project", |
| | "project_root": ".", |
| | "output_dir": "quality_reports", |
| | "log_level": "INFO" |
| | }, |
| | "modules": { |
| | "code_cleaner": True, |
| | "vulnerability_checker": True, |
| | "connection_tester": True, |
| | "code_tester": True |
| | }, |
| | "code_cleaner": {"enabled": True}, |
| | "vulnerability_checker": {"enabled": True}, |
| | "connection_tester": {"enabled": True}, |
| | "code_tester": {"enabled": True}, |
| | "reporting": { |
| | "generate_html": True, |
| | "generate_json": True, |
| | "generate_console_summary": True |
| | } |
| | } |
| | |
| | def _setup_logging(self): |
| | """Setup logging configuration.""" |
| | log_level = self.config.get("general", {}).get("log_level", "INFO") |
| | output_dir = self.project_root / self.config.get("general", {}).get("output_dir", "quality_reports") |
| | |
| | |
| | output_dir.mkdir(exist_ok=True) |
| | |
| | logging.basicConfig( |
| | level=getattr(logging, log_level), |
| | format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
| | handlers=[ |
| | logging.StreamHandler(sys.stdout), |
| | logging.FileHandler(output_dir / "agent.log") |
| | ] |
| | ) |
| | |
| | self.logger = logging.getLogger(__name__) |
| | |
| | def run_all(self, dry_run: bool = False): |
| | """ |
| | Run all enabled modules. |
| | |
| | Args: |
| | dry_run: If True, preview changes without applying them |
| | """ |
| | self.logger.info("="*70) |
| | self.logger.info("CODE QUALITY AGENT STARTED") |
| | self.logger.info("="*70) |
| | |
| | project_name = self.config.get("general", {}).get("project_name", "Project") |
| | self.logger.info(f"Project: {project_name}") |
| | self.logger.info(f"Dry run: {dry_run}") |
| | |
| | |
| | if self.config.get("modules", {}).get("code_cleaner", True): |
| | self.logger.info("\n" + "-"*70) |
| | self.logger.info("MODULE: Code Cleaner") |
| | self.logger.info("-"*70) |
| | cleaner = CodeCleaner( |
| | self.config.get("code_cleaner", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["code_cleaner"] = cleaner.run(dry_run=dry_run) |
| | self.logger.info(cleaner.get_summary()) |
| | |
| | |
| | if self.config.get("modules", {}).get("vulnerability_checker", True): |
| | self.logger.info("\n" + "-"*70) |
| | self.logger.info("MODULE: Vulnerability Checker") |
| | self.logger.info("-"*70) |
| | vuln_checker = VulnerabilityChecker( |
| | self.config.get("vulnerability_checker", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["vulnerability_checker"] = vuln_checker.run() |
| | self.logger.info(vuln_checker.get_summary()) |
| | |
| | |
| | if self.config.get("modules", {}).get("connection_tester", True): |
| | self.logger.info("\n" + "-"*70) |
| | self.logger.info("MODULE: Connection Tester") |
| | self.logger.info("-"*70) |
| | conn_tester = ConnectionTester( |
| | self.config.get("connection_tester", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["connection_tester"] = conn_tester.run() |
| | self.logger.info(conn_tester.get_summary()) |
| | |
| | |
| | if self.config.get("modules", {}).get("code_tester", True): |
| | self.logger.info("\n" + "-"*70) |
| | self.logger.info("MODULE: Code Tester") |
| | self.logger.info("-"*70) |
| | code_tester = CodeTester( |
| | self.config.get("code_tester", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["code_tester"] = code_tester.run() |
| | self.logger.info(code_tester.get_summary()) |
| | |
| | |
| | self.logger.info("\n" + "-"*70) |
| | self.logger.info("Generating Reports") |
| | self.logger.info("-"*70) |
| | report_gen = ReportGenerator( |
| | self.config.get("reporting", {}), |
| | str(self.project_root) |
| | ) |
| | report_gen.generate_reports(self.results) |
| | |
| | self.logger.info("\n" + "="*70) |
| | self.logger.info("CODE QUALITY AGENT COMPLETED") |
| | self.logger.info("="*70) |
| | |
| | def run_module(self, module_name: str, dry_run: bool = False): |
| | """ |
| | Run a specific module. |
| | |
| | Args: |
| | module_name: Name of module to run (clean, security, connections, test) |
| | dry_run: If True, preview changes without applying them |
| | """ |
| | self.logger.info(f"Running module: {module_name}") |
| | |
| | if module_name == "clean": |
| | cleaner = CodeCleaner( |
| | self.config.get("code_cleaner", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["code_cleaner"] = cleaner.run(dry_run=dry_run) |
| | self.logger.info(cleaner.get_summary()) |
| | |
| | elif module_name == "security": |
| | vuln_checker = VulnerabilityChecker( |
| | self.config.get("vulnerability_checker", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["vulnerability_checker"] = vuln_checker.run() |
| | self.logger.info(vuln_checker.get_summary()) |
| | |
| | elif module_name == "connections": |
| | conn_tester = ConnectionTester( |
| | self.config.get("connection_tester", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["connection_tester"] = conn_tester.run() |
| | self.logger.info(conn_tester.get_summary()) |
| | |
| | elif module_name == "test": |
| | code_tester = CodeTester( |
| | self.config.get("code_tester", {}), |
| | str(self.project_root) |
| | ) |
| | self.results["code_tester"] = code_tester.run() |
| | self.logger.info(code_tester.get_summary()) |
| | |
| | else: |
| | self.logger.error(f"Unknown module: {module_name}") |
| | return |
| | |
| | |
| | report_gen = ReportGenerator( |
| | self.config.get("reporting", {}), |
| | str(self.project_root) |
| | ) |
| | report_gen.generate_reports(self.results) |
| |
|
| |
|
| | def main(): |
| | """Main entry point.""" |
| | parser = argparse.ArgumentParser( |
| | description="Automated Code Quality Agent", |
| | formatter_class=argparse.RawDescriptionHelpFormatter, |
| | epilog=""" |
| | Examples: |
| | python code_quality_agent.py --all |
| | python code_quality_agent.py --dry-run |
| | python code_quality_agent.py --module clean |
| | python code_quality_agent.py --module security |
| | """ |
| | ) |
| | |
| | parser.add_argument( |
| | "--dry-run", |
| | action="store_true", |
| | help="Preview changes without applying them" |
| | ) |
| | |
| | parser.add_argument( |
| | "--module", |
| | choices=["clean", "security", "connections", "test"], |
| | help="Run specific module only" |
| | ) |
| | |
| | parser.add_argument( |
| | "--all", |
| | action="store_true", |
| | help="Run all modules (default)" |
| | ) |
| | |
| | parser.add_argument( |
| | "--config", |
| | default="agent_config.yaml", |
| | help="Path to custom config file" |
| | ) |
| | |
| | args = parser.parse_args() |
| | |
| | |
| | agent = CodeQualityAgent(config_path=args.config) |
| | |
| | |
| | if args.module: |
| | agent.run_module(args.module, dry_run=args.dry_run) |
| | else: |
| | agent.run_all(dry_run=args.dry_run) |
| |
|
| |
|
| | if __name__ == "__main__": |
| | main() |
| |
|