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:
gilesb
2026-01-12 17:28:40 +00:00
parent 599f181f8c
commit d69ed09575
2 changed files with 108 additions and 11 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@ __pycache__/
*.py[cod] *.py[cod]
.venv/ .venv/
venv/ venv/
.scripts

114
artdag.py
View File

@@ -15,14 +15,39 @@ import click
import requests import requests
import yaml 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" CONFIG_DIR = Path.home() / ".artdag"
TOKEN_FILE = CONFIG_DIR / "token.json" 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(): def get_server():
"""Get server URL from env or default.""" """Get server URL."""
return DEFAULT_SERVER return DEFAULT_SERVER
@@ -82,20 +107,59 @@ def api_post(path: str, data: dict = None, params: dict = None, auth: bool = Fal
return resp.json() 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.group()
@click.option("--server", "-s", envvar="ARTDAG_SERVER", default=DEFAULT_SERVER, @click.option("--server", "-s", default=None,
help="L1 server URL") help="L1 server URL (saved for future use)")
@click.option("--l2", envvar="ARTDAG_L2", default=DEFAULT_L2_SERVER, @click.option("--l2", default=None,
help="L2 server URL") help="L2 server URL (saved for future use)")
@click.pass_context @click.pass_context
def cli(ctx, server, l2): def cli(ctx, server, l2):
"""Art DAG Client - interact with L1 rendering server.""" """Art DAG Client - interact with L1 rendering server."""
ctx.ensure_object(dict) ctx.ensure_object(dict)
ctx.obj["server"] = server
ctx.obj["l2"] = l2
global DEFAULT_SERVER, DEFAULT_L2_SERVER global DEFAULT_SERVER, DEFAULT_L2_SERVER
config = load_config()
config_changed = False
# Use provided value, or fall back to saved/default
if server:
DEFAULT_SERVER = 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 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 ============ # ============ Auth Commands ============
@@ -245,6 +309,38 @@ def whoami():
click.echo(f"Error: {e}", err=True) 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 ============ # ============ Server Commands ============
@cli.command() @cli.command()