import argparse import asyncio import os import sys from crawler import Crawler, CrawlerConfig async def run_cli(): config = CrawlerConfig.from_env_or_prompt() crawler = Crawler(config) await crawler.run() def main(): parser = argparse.ArgumentParser(description="Clickduck - Web Crawler & Link Explorer") parser.add_argument("--web", action="store_true", help="Launch the Web Frontend dashboard") parser.add_argument("--host", type=str, default=os.getenv("HOST", "127.0.0.1"), help="Host IP for web UI (default: 127.0.0.1 or $HOST)") parser.add_argument("--port", type=int, default=int(os.getenv("PORT", "8000")), help="Port for web UI (default: 8000 or $PORT)") args = parser.parse_args() if args.web: from web import run_server run_server(host=args.host, port=args.port) else: try: asyncio.run(run_cli()) except KeyboardInterrupt: print("\nCrawling interrupted by user.") sys.exit(0) if __name__ == "__main__": if sys.platform == "win32": asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) main()