9adcdc8c0de97190ea0f95dc31b39a2c51edf9b2
Phase 2 (both lines) — done. The headless review spawns the enabled subagents and prints each verdict under its own heading (src/bot.py), proven end-to-end on ten31-site PR #4; the `agents +/-` handler updates and atomically persists each room's enabled set. Finished milestone, and the record already lives in AGENTS.md Decisions + Current state. Phase 4 (Spark Control tile) — already built elsewhere. spark-control's Bots tab has had a first-class gitea-review-bot entry since v0.28.0, same code path as matrix-bridge; the running dashboard reports it live. The work was never this repo's. Left a one-line pointer under Deferred. Phase 3, deploy-on-a-non-static-repo — dropped. No repo needs it (only the static ten31-site is onboarded), and it isn't doable as written: the deploy step is hardcoded to the static-site publish script and the only per-repo knob is on/off, not a per-repo deploy command. Exercising it means a real deploy plus a force-merge against a live service. Revisit when a concrete non-static repo needs it — that repo is the honest test target, and the deploy-command field comes first. Phase 3, three-repo onboarding — kept, annotated with its check plan and a correction: reviews run serially, so the stated "no interleaving" exit is trivially satisfied. What matters at 3+ repos is a long review head-of-line-blocking the next room's poll. New: heartbeat for wedge detection. Scoped to the gap the tile leaves — it reads container state, so it catches a crash but not a stuck sync/poll loop, which looks identical to healthy from outside.
gitea-review-bot
A thin Matrix bot that reviews and merges your Gitea pull requests, one review room per repo.
Separate from matrix-bridge (which runs interactive Claude Code sessions) — this bot's only job
is PR review.
How it works
- Create a Matrix room named like a repo and invite the bot. It auto-joins and maps the room to
<owner>/<repo>(and~/Projects/<repo>on the Mac), then posts an onboarding message. - It polls that repo's open PRs and posts each as a thread: a headless
claude -preview (with an optional subagent panel) run on the Mac over SSH. - In the thread:
merge(thenyes) orreject. A merge auto-deploys (if enabled) and then redacts the thread, so the room shows only open PRs; if the deploy fails, the thread still clears and a standalone "deploy manually" warning stays in the room.clearredacts an orphaned thread without touching the PR.
Pick which review agents run per room in chat: agents +reviewer +security -adjudicator.
Run (on the Spark)
- Copy
config.example.toml→config.tomland.env.example→.env; fill them in (Matrix creds,GITEA_TOKEN, the[mac]SSH alias + reused matrix-bridge wrapper paths,[gitea]). docker compose up -d --build. Logs:docker compose logs -f.
See AGENTS.md for the full design, placement, and decisions.
Languages
Python
93.5%
Shell
3.7%
Dockerfile
2.8%