"""CLI entry point: python -m monitor [path/to/file.dfasm]""" import argparse import sys from pathlib import Path from monitor.backend import SimulationBackend from monitor.commands import LoadCmd from monitor.repl import MonitorREPL def main() -> None: parser = argparse.ArgumentParser( prog="monitor", description="Interactive OR1 dataflow CPU simulation monitor.", ) parser.add_argument( "file", nargs="?", type=Path, default=None, help="Optional .dfasm file to load on startup", ) parser.add_argument( "--web", action="store_true", help="Start web server instead of CLI REPL", ) parser.add_argument( "--port", type=int, default=8421, help="Port for web server (default: 8421)", ) args = parser.parse_args() backend = SimulationBackend() backend.start() try: if args.web: import uvicorn from monitor.server import create_app app = create_app(backend) if args.file is not None: if not args.file.exists(): print(f"Error: file not found: {args.file}", file=sys.stderr) sys.exit(1) source = args.file.resolve().read_text() backend.send_command(LoadCmd(source=source), timeout=10.0) uvicorn.run(app, host="127.0.0.1", port=args.port, log_level="info") else: repl = MonitorREPL(backend) if args.file is not None: if not args.file.exists(): print(f"Error: file not found: {args.file}", file=sys.stderr) sys.exit(1) repl.do_load(str(args.file.resolve())) repl.cmdloop() finally: backend.stop() if __name__ == "__main__": main()