#!/usr/bin/env python3 # Arm or disarm the gate in Claude Code's settings.json (the `env` block is # applied to EVERY launcher — desktop, background jobs, the plain `claude`). # # bikoret-settings on put ANTHROPIC_BASE_URL + ANTHROPIC_CUSTOM_HEADERS in # bikoret-settings off remove them (the fallback when the gate is down) # bikoret-settings status say which # # `on` writes the courtyard key into a config file, so the transmitter runs it: # the builder is not allowed to write a credential there. `off` writes none. import json, os, sys p = os.path.expanduser("~/.claude/settings.json") KEYS = ("ANTHROPIC_BASE_URL", "ANTHROPIC_CUSTOM_HEADERS") mode = sys.argv[1] if len(sys.argv) > 1 else "status" d = json.load(open(p)) env = d.get("env", {}) if mode == "on": k = [l.split()[1] for l in open(os.path.expanduser("~/.config/shorashim/api_keys")) if l.startswith("courtyard")][0] env.update({"ANTHROPIC_BASE_URL": "https://bikoret.ch/gate/anthropic", "ANTHROPIC_CUSTOM_HEADERS": "X-Bikoret-Key: " + k}) d["env"] = env elif mode == "off": for key in KEYS: env.pop(key, None) if env: d["env"] = env else: d.pop("env", None) elif mode != "status": sys.exit("usage: bikoret-settings on|off|status") if mode in ("on", "off"): json.dump(d, open(p, "w"), indent=2) os.chmod(p, 0o600) armed = all(k in d.get("env", {}) for k in KEYS) print("gate in settings.json:", "ARMED (every launcher goes through bikoret.ch)" if armed else "off (direct to Anthropic)")