feat(agents): team updates on Matrix, with a sign-in, rate-limited post script and a skill #2606
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
question
testing wanted
wontfix
No milestone
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot!2606
Loading…
Reference in a new issue
No description provided.
Delete branch "agents/team-updates"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Agents working on Hookshot have no shared place to say what they claimed, found or opened, so two of them can fix the same thing without knowing. This adds a team room on Matrix (
#agent-updates:magicbean.dev) that agents sign in to with Discord and post to sparingly, and that people read too. Each post is also copied to Discord #dev-agents under the poster's Discord name.How it works for a contributor
/team-updatesin Claude Code, or just "turn on team updates").What changed
scripts/team_chat.py(standard library only, Windows and Linux):login,whoami,status,read,post,logout.loginsigns in with Discord through the server's single sign-on: it prints the link, and the browser comes back to a one-time listener on 127.0.0.1.--access-token-stdintakes a token from Element instead.~/.config/hookshot/team_chat.json,%APPDATA%\Hookshot\team_chat.json), mode 600.postsends at most one message an hour (configurable) and never the same text twice. It exits 3 with the reason otherwise.--forceskips the hour, for when the person asked for an update. Posts carry a 🤖 prefix so readers can tell agents from people.readprints the room's latest messages, so agents check others' claims before claiming..claude/skills/team-updates/SKILL.md(/team-updatesin Claude Code, plain steps for other agents): guided setup, what is worth posting (claims, findings, PRs, blockers, finished work) and what isn't ("still working", "no updates"), message format, and hourly updates as a recurring check (/loop 60m /team-updates) that only posts when something happened. It repeats the rule about game files.AGENTS.md: a short Team updates section.docs/workflow.md: the room in Where work comes from and in For agents.Testing
tests/test_team_chat.pyruns the whole flow against a stand-in homeserver on 127.0.0.1: the sign-on redirect to the listener, session file permissions, joining the room once, the prefix, the hourly refusal,--force, the repeat refusal (also with--force), the configurable interval,readorder, a revoked session and logout.tests/test_team_chat.pypasses in CI on Linux and Windows. The other red Python checks andappimagefail the same way onmain(8568959, Game-free source regressions and Linux AppImage), not from this PR.Against the live server (
matrix.magicbean.dev, behind Cloudflare):login --access-token-stdin,whoami,statusandreadwork. That run found that Cloudflare answers 403 to urllib's defaultPython-urllibUser-Agent, so the script now sends its own, and the test checks every request does.End to end, live, from this branch, as a contributor would:
loginprinted the link, I signed in with Discord through git.magicbean.dev, and the tab came back to the script, which saved the session (mode 600).postwent to#agent-updates(exit 0). A secondpostright after was refused with exit 3 and "next can go out in 60 minutes".readshows the post, and it reached Discord #dev-agents under my Discord name and avatar a few seconds later.Not tested
Windows: the script uses only the standard library and the test runs in CI on Windows, but nobody has run the browser login there yet.
github-sync referenced this pull request2026-11-12 06:22:54 +00:00