diff --git a/.gitignore b/.gitignore index 65776d1..b5e701c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__/ *.py[cod] .venv/ venv/ +.scripts diff --git a/artdag.py b/artdag.py index 0422add..3b42c51 100755 --- a/artdag.py +++ b/artdag.py @@ -15,14 +15,39 @@ import click import requests import yaml -DEFAULT_SERVER = os.environ.get("ARTDAG_SERVER", "http://localhost:8100") -DEFAULT_L2_SERVER = os.environ.get("ARTDAG_L2", "http://localhost:8200") CONFIG_DIR = Path.home() / ".artdag" TOKEN_FILE = CONFIG_DIR / "token.json" +CONFIG_FILE = CONFIG_DIR / "config.json" + +# Defaults - can be overridden by env vars, config file, or CLI args +_DEFAULT_SERVER = "http://localhost:8100" +_DEFAULT_L2_SERVER = "http://localhost:8200" + +# Active server URLs (set during CLI init) +DEFAULT_SERVER = None +DEFAULT_L2_SERVER = None + + +def load_config() -> dict: + """Load saved config (server URLs, etc.).""" + if CONFIG_FILE.exists(): + try: + with open(CONFIG_FILE) as f: + return json.load(f) + except (json.JSONDecodeError, IOError): + return {} + return {} + + +def save_config(config: dict): + """Save config to file.""" + CONFIG_DIR.mkdir(parents=True, exist_ok=True) + with open(CONFIG_FILE, "w") as f: + json.dump(config, f, indent=2) def get_server(): - """Get server URL from env or default.""" + """Get server URL.""" return DEFAULT_SERVER @@ -82,20 +107,59 @@ def api_post(path: str, data: dict = None, params: dict = None, auth: bool = Fal return resp.json() +def _get_default_server(): + """Get default server from env, config, or builtin default.""" + if os.environ.get("ARTDAG_SERVER"): + return os.environ["ARTDAG_SERVER"] + config = load_config() + return config.get("server", _DEFAULT_SERVER) + + +def _get_default_l2(): + """Get default L2 server from env, config, or builtin default.""" + if os.environ.get("ARTDAG_L2"): + return os.environ["ARTDAG_L2"] + config = load_config() + return config.get("l2", _DEFAULT_L2_SERVER) + + @click.group() -@click.option("--server", "-s", envvar="ARTDAG_SERVER", default=DEFAULT_SERVER, - help="L1 server URL") -@click.option("--l2", envvar="ARTDAG_L2", default=DEFAULT_L2_SERVER, - help="L2 server URL") +@click.option("--server", "-s", default=None, + help="L1 server URL (saved for future use)") +@click.option("--l2", default=None, + help="L2 server URL (saved for future use)") @click.pass_context def cli(ctx, server, l2): """Art DAG Client - interact with L1 rendering server.""" ctx.ensure_object(dict) - ctx.obj["server"] = server - ctx.obj["l2"] = l2 global DEFAULT_SERVER, DEFAULT_L2_SERVER - DEFAULT_SERVER = server - DEFAULT_L2_SERVER = l2 + + config = load_config() + config_changed = False + + # Use provided value, or fall back to saved/default + if server: + DEFAULT_SERVER = server + if config.get("server") != server: + config["server"] = server + config_changed = True + else: + DEFAULT_SERVER = _get_default_server() + + if l2: + DEFAULT_L2_SERVER = l2 + if config.get("l2") != l2: + config["l2"] = l2 + config_changed = True + else: + DEFAULT_L2_SERVER = _get_default_l2() + + # Save config if changed + if config_changed: + save_config(config) + + ctx.obj["server"] = DEFAULT_SERVER + ctx.obj["l2"] = DEFAULT_L2_SERVER # ============ Auth Commands ============ @@ -245,6 +309,38 @@ def whoami(): click.echo(f"Error: {e}", err=True) +@cli.command("config") +@click.option("--clear", is_flag=True, help="Clear saved server settings") +def show_config(clear): + """Show or clear saved configuration.""" + if clear: + if CONFIG_FILE.exists(): + CONFIG_FILE.unlink() + click.echo("Configuration cleared") + else: + click.echo("No configuration to clear") + return + + config = load_config() + click.echo(f"Config file: {CONFIG_FILE}") + click.echo() + click.echo(f"L1 Server: {DEFAULT_SERVER}") + if config.get("server"): + click.echo(f" (saved)") + elif os.environ.get("ARTDAG_SERVER"): + click.echo(f" (from ARTDAG_SERVER env)") + else: + click.echo(f" (default)") + + click.echo(f"L2 Server: {DEFAULT_L2_SERVER}") + if config.get("l2"): + click.echo(f" (saved)") + elif os.environ.get("ARTDAG_L2"): + click.echo(f" (from ARTDAG_L2 env)") + else: + click.echo(f" (default)") + + # ============ Server Commands ============ @cli.command()