#!/usr/bin/env python3 """ Helper script to publish constitution to Mastodon. Usage: python scripts/publish_constitution.py [--summary "What changed"] """ import sys import argparse from pathlib import Path # Add src to path sys.path.insert(0, str(Path(__file__).parent.parent)) from src.govbot.utils.config import load_config from src.govbot.platforms.mastodon import MastodonAdapter def main(): parser = argparse.ArgumentParser(description="Publish constitution to Mastodon") parser.add_argument( "--summary", "-s", default="Constitution updated", help="Summary of changes made" ) parser.add_argument( "--constitution", "-c", default="constitution.md", help="Path to constitution file (default: constitution.md)" ) parser.add_argument( "--config", default="config/config.yaml", help="Path to config file (default: config/config.yaml)" ) args = parser.parse_args() # Load constitution constitution_path = Path(args.constitution) if not constitution_path.exists(): print(f"āŒ Constitution file not found: {constitution_path}") sys.exit(1) constitution_text = constitution_path.read_text() print(f"šŸ“œ Loaded constitution from {constitution_path} ({len(constitution_text)} chars)") # Load config try: config = load_config(args.config) except FileNotFoundError: print(f"āŒ Config file not found: {args.config}") print(" Copy config/config.example.yaml to config/config.yaml and configure") sys.exit(1) # Connect to Mastodon print(f"šŸ”Œ Connecting to {config.platform.mastodon.instance_url}...") adapter = MastodonAdapter(config.platform.mastodon.model_dump()) if not adapter.connect(): print("āŒ Failed to connect to Mastodon") sys.exit(1) print(f"āœ… Connected as @{adapter.bot_username}") # Publish constitution print(f"\nšŸ“¤ Publishing constitution...") print(f" Change summary: {args.summary}") result = adapter.execute_skill( skill_name="publish_constitution", parameters={ "constitution_text": constitution_text, "change_summary": args.summary, }, actor="@admin" ) if result["success"]: print(f"\nāœ… {result['message']}") print(f"\nšŸ“Š Details:") print(f" - Thread length: {result['data']['thread_length']} posts") print(f" - First post ID: {result['data']['first_post_id']}") if result['data'].get('previous_post_id'): print(f" - Previous post ID: {result['data']['previous_post_id']} (deprecated)") # Generate profile URL profile_url = f"{adapter.instance_url}/@{adapter.bot_username}" print(f"\nšŸ”— View at: {profile_url}") else: print(f"\nāŒ Failed: {result['message']}") sys.exit(1) # Disconnect adapter.disconnect() print("\n✨ Done!") if __name__ == "__main__": main()