| #!/usr/bin/env python3 |
| """ |
| Build script for creating three independent deployable packages: |
| 1. supervisor-agent (includes common + supervisor_agent) |
| 2. travel-agent (includes common + travel_agent) |
| 3. weather-agent (includes common + weather_agent) |
| |
| All packages share a single .env file at the root level. |
| """ |
| |
| import shutil |
| import sys |
| from pathlib import Path |
| |
| # Project root directory (parent of scripts/) |
| PROJECT_ROOT = Path(__file__).parent.parent |
| BUILD_DIR = PROJECT_ROOT / "dist" |
| |
| |
| def clean_build_dir(): |
| """Clean the build directory""" |
| if BUILD_DIR.exists(): |
| shutil.rmtree(BUILD_DIR) |
| BUILD_DIR.mkdir(parents=True, exist_ok=True) |
| print("✓ Cleaned build directory") |
| |
| |
| def create_package_structure(package_name: str, modules: list): |
| """ |
| Create package structure with selected modules |
| |
| Args: |
| package_name: Name of the package |
| modules: List of module directories to include |
| """ |
| package_dir = BUILD_DIR / package_name |
| package_dir.mkdir(parents=True, exist_ok=True) |
| |
| # Copy modules |
| for module in modules: |
| src = PROJECT_ROOT / module |
| dst = package_dir / module |
| if src.exists(): |
| shutil.copytree(src, dst, dirs_exist_ok=True) |
| print(f" ✓ Copied {module}") |
| else: |
| print(f" ✗ Warning: {module} not found") |
| |
| # Copy pyproject.toml and uv.lock for uv sync |
| shutil.copy2(PROJECT_ROOT / "pyproject.toml", package_dir / "pyproject.toml") |
| print(" ✓ Copied pyproject.toml") |
| uv_lock = PROJECT_ROOT / "uv.lock" |
| if uv_lock.exists(): |
| shutil.copy2(uv_lock, package_dir / "uv.lock") |
| print(" ✓ Copied uv.lock") |
| |
| return package_dir |
| |
| |
| def create_supervisor_package(): |
| """Create supervisor-agent package""" |
| print("\n📦 Building supervisor-agent package...") |
| package_dir = create_package_structure( |
| "supervisor-agent", |
| ["common", "supervisor_agent"] |
| ) |
| |
| # Create startup script |
| startup_script = package_dir / "start.sh" |
| startup_script.write_text("""#!/bin/bash |
| # Supervisor Agent Startup Script |
| |
| set -e |
| |
| echo "Starting Supervisor Agent..." |
| |
| # Install dependencies using uv |
| if ! command -v uv &> /dev/null; then |
| echo "Error: uv is not installed. Please install it first: https://docs.astral.sh/uv/getting-started/installation/" |
| exit 1 |
| fi |
| |
| uv sync |
| |
| # Load environment variables from shared .env file |
| if [ -f "../.env" ]; then |
| set -a |
| source ../.env |
| set +a |
| echo "✓ Loaded environment variables from ../.env" |
| fi |
| |
| # Start the application |
| uv run -m supervisor_agent.supervisor_agent_start |
| """) |
| startup_script.chmod(0o755) |
| print(" ✓ Created start.sh") |
| |
| print(f"✓ supervisor-agent package created at: {package_dir}") |
| return package_dir |
| |
| |
| def create_travel_package(): |
| """Create travel-agent package""" |
| print("\n📦 Building travel-agent package...") |
| package_dir = create_package_structure( |
| "travel-agent", |
| ["common", "travel_agent"] |
| ) |
| |
| # Create startup script |
| startup_script = package_dir / "start.sh" |
| startup_script.write_text("""#!/bin/bash |
| # Travel Agent Startup Script |
| |
| set -e |
| |
| echo "Starting Travel Agent..." |
| |
| # Install dependencies using uv |
| if ! command -v uv &> /dev/null; then |
| echo "Error: uv is not installed. Please install it first: https://docs.astral.sh/uv/getting-started/installation/" |
| exit 1 |
| fi |
| |
| uv sync |
| |
| # Load environment variables from shared .env file |
| if [ -f "../.env" ]; then |
| set -a |
| source ../.env |
| set +a |
| echo "✓ Loaded environment variables from ../.env" |
| fi |
| |
| # Start the application |
| uv run -m travel_agent.travel_agent_start |
| """) |
| startup_script.chmod(0o755) |
| print(" ✓ Created start.sh") |
| |
| print(f"✓ travel-agent package created at: {package_dir}") |
| return package_dir |
| |
| |
| def create_weather_package(): |
| """Create weather-agent package""" |
| print("\n📦 Building weather-agent package...") |
| package_dir = create_package_structure( |
| "weather-agent", |
| ["common", "weather_agent"] |
| ) |
| |
| # Create startup script |
| startup_script = package_dir / "start.sh" |
| startup_script.write_text("""#!/bin/bash |
| # Weather Agent Startup Script |
| |
| set -e |
| |
| echo "Starting Weather Agent..." |
| |
| # Install dependencies using uv |
| if ! command -v uv &> /dev/null; then |
| echo "Error: uv is not installed. Please install it first: https://docs.astral.sh/uv/getting-started/installation/" |
| exit 1 |
| fi |
| |
| uv sync |
| |
| # Load environment variables from shared .env file |
| if [ -f "../.env" ]; then |
| set -a |
| source ../.env |
| set +a |
| echo "✓ Loaded environment variables from ../.env" |
| fi |
| |
| # Start the application |
| uv run -m weather_agent.weather_agent_start |
| """) |
| startup_script.chmod(0o755) |
| print(" ✓ Created start.sh") |
| |
| print(f"✓ weather-agent package created at: {package_dir}") |
| return package_dir |
| |
| |
| def copy_shared_env(): |
| """Copy the shared .env file to dist directory""" |
| env_file = PROJECT_ROOT / ".env" |
| if env_file.exists(): |
| shutil.copy2(env_file, BUILD_DIR / ".env") |
| print("✓ Copied shared .env to dist/") |
| else: |
| print("⚠ Warning: .env file not found in project root") |
| |
| |
| def main(): |
| """Main build process""" |
| print("=" * 60) |
| print("Building RocketMQ Multi-Agent Packages") |
| print("=" * 60) |
| |
| # Step 1: Clean build directory |
| clean_build_dir() |
| |
| # Step 2: Build packages |
| try: |
| create_supervisor_package() |
| create_travel_package() |
| create_weather_package() |
| |
| # Step 3: Copy shared .env file |
| copy_shared_env() |
| |
| print("\n" + "=" * 60) |
| print("✅ Build completed successfully!") |
| print("=" * 60) |
| print(f"\nPackages location: {BUILD_DIR}") |
| print("\nAvailable packages:") |
| print(" 1. supervisor-agent/") |
| print(" 2. travel-agent/") |
| print(" 3. weather-agent/") |
| print(" 4. .env (shared configuration)") |
| print("\nTo run each service:") |
| print(f" cd {BUILD_DIR}/supervisor-agent && ./start.sh") |
| print(f" cd {BUILD_DIR}/travel-agent && ./start.sh") |
| print(f" cd {BUILD_DIR}/weather-agent && ./start.sh") |
| print("\nNote: All services share the same .env file in dist/") |
| print(" Edit dist/.env to configure all services") |
| print("\nPrerequisite: Install uv (https://docs.astral.sh/uv/getting-started/installation/)") |
| |
| except Exception as e: |
| print(f"\n❌ Build failed: {e}", file=sys.stderr) |
| import traceback |
| traceback.print_exc() |
| sys.exit(1) |
| |
| |
| if __name__ == "__main__": |
| main() |