Remember server settings between sessions
- Server URLs are now saved to ~/.artdag/config.json when provided - Subsequent commands use saved settings without needing --server/--l2 - Priority: CLI args > env vars > saved config > defaults - Added 'artdag config' command to view/clear settings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@ __pycache__/
|
||||
*.py[cod]
|
||||
.venv/
|
||||
venv/
|
||||
.scripts
|
||||
|
||||
118
artdag.py
118
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()
|
||||
|
||||
Reference in New Issue
Block a user