#!/usr/bin/env python """ GAIA Project File Organizer This script organizes files in the GAIA project by moving them to appropriate directories: 1. Moves deployment-related files to the deployment directory 2. Moves example notebooks to the examples directory 3. Moves utility scripts to the utils directory Usage: python src/gaia/utils/cli/organize_files.py [--dry-run] """ import os import sys import shutil import logging import argparse from pathlib import Path from typing import Dict, List, Tuple # Configure logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[ logging.StreamHandler() ] ) logger = logging.getLogger("organize_files") # Files to move to deployment directory DEPLOYMENT_FILES = [ "prepare_for_hf_deployment.py", "hf_deployment_instructions.md", "huggingface_space_deployment_guide.md", "huggingface_space_update_guide.md", "huggingface_space_update_guide.md", "huggingface_space_cleanup.md", "huggingface_space_deployment_summary.md", "space_config.json", "deploy_to_hf.py", "deploy_to_huggingface_credential.py", "deploy_to_huggingface_dotenv.py", "deploy_to_huggingface_env.py", "deploy_to_huggingface.py", "deploy_with_token.py", "deployment_checklist.md", "deployment_readiness_report.json", "deployment_readiness_report.md", "deployment_verification.py", "final_deployment_guide.md", "complete_deployment_guide.md", "complete_deployment_solution.md", "get_huggingface_token.py", "test_deployment_readiness.py", "verify_deployment_readiness.py", "production_cleanup.py", "production_readiness_check.py", "production_test.py", "production_verification_report.md", ] # Example notebooks to move to examples directory EXAMPLE_FILES = [ "mail_sorting.ipynb", "agent.ipynb" ] # Utility scripts to move to utils directory UTIL_FILES = [ "generate_env_template.py", "fix_encoding.py", "fix_graph_imports.py", "remove_debug_statements.py", "remove_duplicate_tests.py", "run_verification_tests.py", "simple_memory_test.py", "simple_test.py", "validate_app_simple.py", "validate_app.py", "update_agent.py", "verify_components.py", "verify_minimal.py", "create_env_and_test.py" ] def move_file(src: str, dest_dir: str, dry_run: bool = False) -> bool: """ Move a file to the specified directory Args: src: Source file path dest_dir: Destination directory dry_run: If True, only show what would be moved without making changes Returns: bool: True if successful or would be successful, False otherwise """ if not os.path.exists(src): logger.warning(f"Source file does not exist: {src}") return False if not os.path.exists(dest_dir): if dry_run: logger.info(f"DRY RUN: Would create directory: {dest_dir}") else: os.makedirs(dest_dir, exist_ok=True) logger.info(f"Created directory: {dest_dir}") dest_path = os.path.join(dest_dir, os.path.basename(src)) if dry_run: logger.info(f"DRY RUN: Would move {src} -> {dest_path}") return True try: shutil.move(src, dest_path) logger.info(f"Moved {src} -> {dest_path}") return True except Exception as e: logger.error(f"Error moving {src} to {dest_path}: {str(e)}") return False def main(): """Main function to organize files.""" parser = argparse.ArgumentParser(description="GAIA Project File Organizer") parser.add_argument("--dry-run", action="store_true", help="Show what would be moved without making changes") args = parser.parse_args() if args.dry_run: logger.info("Running in DRY RUN mode - no files will be moved") # Track results results = { "deployment": {"success": 0, "failed": 0, "missing": 0}, "examples": {"success": 0, "failed": 0, "missing": 0}, "utils": {"success": 0, "failed": 0, "missing": 0} } # Move deployment files logger.info("\n=== Moving deployment files ===") for file in DEPLOYMENT_FILES: if os.path.exists(file): success = move_file(file, "deployment", args.dry_run) if success: results["deployment"]["success"] += 1 else: results["deployment"]["failed"] += 1 else: logger.info(f"File not found (skipping): {file}") results["deployment"]["missing"] += 1 # Move example files logger.info("\n=== Moving example files ===") for file in EXAMPLE_FILES: if os.path.exists(file): success = move_file(file, "examples", args.dry_run) if success: results["examples"]["success"] += 1 else: results["examples"]["failed"] += 1 else: logger.info(f"File not found (skipping): {file}") results["examples"]["missing"] += 1 # Move utility files logger.info("\n=== Moving utility files ===") for file in UTIL_FILES: if os.path.exists(file): success = move_file(file, "utils", args.dry_run) if success: results["utils"]["success"] += 1 else: results["utils"]["failed"] += 1 else: logger.info(f"File not found (skipping): {file}") results["utils"]["missing"] += 1 # Print summary logger.info("\n=== File Organization Summary ===") logger.info(f"Deployment Files: {results['deployment']['success']} moved, {results['deployment']['failed']} failed, {results['deployment']['missing']} not found") logger.info(f"Example Files: {results['examples']['success']} moved, {results['examples']['failed']} failed, {results['examples']['missing']} not found") logger.info(f"Utility Files: {results['utils']['success']} moved, {results['utils']['failed']} failed, {results['utils']['missing']} not found") # Return success code if no failures total_failures = sum(result["failed"] for result in results.values()) return 0 if total_failures == 0 else 1 if __name__ == "__main__": sys.exit(main())