launch-report: default to opencode-go/glm-5.2 + fix opencode run invocation

Report launcher now defaults backend=opencode, model=opencode-go/glm-5.2 (claude
override → opus). Replaced the broken opencode 'attach + send-keys' path with the
same 'opencode run -m … --share --attach --title' pattern as the upgrader (the
old path passed no model and injected the prompt via keystrokes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
autonomic-bot
2026-06-22 20:28:55 +00:00
co-authored by Claude Opus 4.8
parent 5351ec2e40
commit 165eb62070
+18 -10
View File
@@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""cc-ci recipe-report launcher — one-shot agent that runs /recipe-report after the weekly upgrade. """cc-ci recipe-report launcher — one-shot agent that runs /recipe-report after the weekly upgrade.
The report agent's model is configured SEPARATELY from the upgrader (so e.g. the upgrader runs on The report agent's model is configured SEPARATELY from the upgrader (REPORT_BACKEND/REPORT_MODEL),
sonnet while the report is written by opus). Defaults: REPORT_MODEL=opus, REPORT_BACKEND=claude. but defaults to the same OpenCode Go subscription on glm-5.2. The model default tracks the backend
(opencode→opencode-go/glm-5.2, claude→opus).
Usage: Usage:
launch-report.py start [DATE] use-or-create the session; runs /recipe-report [DATE] launch-report.py start [DATE] use-or-create the session; runs /recipe-report [DATE]
@@ -10,7 +11,8 @@ Usage:
launch-report.py stop kill the session launch-report.py stop kill the session
launch-report.py status show session state launch-report.py status show session state
Env: REPORT_MODEL (default opus), REPORT_BACKEND (default claude), REPORT_SESSION, REPORT_DIR. Env: REPORT_BACKEND (default opencode), REPORT_MODEL (default opencode-go/glm-5.2 | opus for claude),
OPENCODE_SHARE (1=attach web server + public --share link), REPORT_SESSION, REPORT_DIR.
""" """
import os, subprocess, sys, time import os, subprocess, sys, time
from pathlib import Path from pathlib import Path
@@ -19,12 +21,14 @@ from datetime import datetime, timezone
SESSION = os.environ.get("REPORT_SESSION", "cc-ci-report") SESSION = os.environ.get("REPORT_SESSION", "cc-ci-report")
WORKDIR = os.environ.get("REPORT_DIR", "/srv/cc-ci") WORKDIR = os.environ.get("REPORT_DIR", "/srv/cc-ci")
LOG_DIR = os.environ.get("LOG_DIR", "/srv/cc-ci/.cc-ci-logs") LOG_DIR = os.environ.get("LOG_DIR", "/srv/cc-ci/.cc-ci-logs")
BACKEND = os.environ.get("REPORT_BACKEND", "claude") BACKEND = os.environ.get("REPORT_BACKEND", "opencode")
MODEL = os.environ.get("REPORT_MODEL", "opus") _DEFAULT_MODEL = "opencode-go/glm-5.2" if BACKEND == "opencode" else "opus"
MODEL = os.environ.get("REPORT_MODEL", _DEFAULT_MODEL)
CLAUDE_BIN = os.environ.get("CLAUDE_BIN", "claude") CLAUDE_BIN = os.environ.get("CLAUDE_BIN", "claude")
CLAUDE_FLAGS = os.environ.get("CLAUDE_FLAGS", "--dangerously-skip-permissions") CLAUDE_FLAGS = os.environ.get("CLAUDE_FLAGS", "--dangerously-skip-permissions")
OPENCODE_BIN = os.environ.get("OPENCODE_BIN", "/home/loops/.local/bin/opencode") OPENCODE_BIN = os.environ.get("OPENCODE_BIN", "/home/loops/.local/bin/opencode")
OPENCODE_SERVER = os.environ.get("OPENCODE_SERVER", "http://127.0.0.1:4096") OPENCODE_SERVER = os.environ.get("OPENCODE_SERVER", "http://127.0.0.1:4096")
OPENCODE_SHARE = os.environ.get("OPENCODE_SHARE", "1") == "1"
def log(m): print(f"[report {datetime.now(timezone.utc):%H:%M:%S}] {m}", flush=True) def log(m): print(f"[report {datetime.now(timezone.utc):%H:%M:%S}] {m}", flush=True)
@@ -70,17 +74,21 @@ def start(mode, date):
cmd = f"{CLAUDE_BIN} --remote-control '{SESSION}' {model_flag} {CLAUDE_FLAGS} \"$(cat '{kf}')\"" cmd = f"{CLAUDE_BIN} --remote-control '{SESSION}' {model_flag} {CLAUDE_FLAGS} \"$(cat '{kf}')\""
cwd = WORKDIR cwd = WORKDIR
elif BACKEND == "opencode": elif BACKEND == "opencode":
# -m/--model/--attach/--title/--share are `run` SUBCOMMAND flags — must come AFTER `run`.
cwd = "/srv/cc-ci-orch/cc-ci" cwd = "/srv/cc-ci-orch/cc-ci"
cmd = f"set -a; . /srv/cc-ci/.testenv; set +a; NO_COLOR=1 {OPENCODE_BIN} attach {OPENCODE_SERVER} --dir {cwd}" share_flag = "--share" if OPENCODE_SHARE else ""
cmd = (
f"set -a; . /srv/cc-ci/.testenv; set +a; "
f"{OPENCODE_BIN} run {model_flag} {share_flag} --attach '{OPENCODE_SERVER}' "
f"--title '{SESSION}' --dir {cwd} \"$(cat '{kf}')\""
)
else: else:
die(f"unknown REPORT_BACKEND '{BACKEND}'") die(f"unknown REPORT_BACKEND '{BACKEND}'")
log(f"starting {SESSION} (backend={BACKEND}, model={MODEL}, date={date or 'today'})") log(f"starting {SESSION} (backend={BACKEND}, model={MODEL}, date={date or 'today'})")
subprocess.run(["tmux", "new-session", "-d", "-s", SESSION, "-c", cwd, cmd]) subprocess.run(["tmux", "new-session", "-d", "-s", SESSION, "-c", cwd, cmd])
subprocess.run(["tmux", "pipe-pane", "-o", "-t", SESSION, f"cat >> '{LOG_DIR}/{SESSION}.log'"]) subprocess.run(["tmux", "pipe-pane", "-o", "-t", SESSION, f"cat >> '{LOG_DIR}/{SESSION}.log'"])
if BACKEND == "opencode": if BACKEND == "opencode" and OPENCODE_SHARE:
time.sleep(12) log(f" attached to {OPENCODE_SERVER} → http://oc.commoninternet.net +public --share link")
subprocess.run(["tmux", "send-keys", "-t", SESSION, "-l", "--", f"Read {kf} and follow it."])
time.sleep(0.5); subprocess.run(["tmux", "send-keys", "-t", SESSION, "C-m"])
log(f"started. attach: tmux attach -t {SESSION}") log(f"started. attach: tmux attach -t {SESSION}")