Gnome toolbar for Tangled code review.

feat: mute repos and authors from the menu #34

Merged permadeath.com
targeting main from azurite-frogmouth.test.pds.did.bot/gnome-shell-extension-tangled-reviewer:claude/mute-repos-and-authors
Merged opened by and assigned to permadeath.com
targeting main from azurite-frogmouth.test.pds.did.bot/gnome-shell-extension-tangled-reviewer:claude/mute-repos-and-authors

Each PR in the menu gets a mute button (a crossed-out eye). It opens "Mute " and "Mute @author" just under that PR, and each repo group's submenu ends with "Mute this repo". Muted PRs leave the list, the pills, overview search and notifications. A line under the list says what's muted ("1 repo and 2 authors muted…") and opens Settings, where a new Muted group lists each mute with a remove button. The group is hidden while nothing is muted.

The helper does the filtering, because that saves requests. A muted repo isn't listed at all: no listPulls, no lookups, and its Jetstream events don't trigger refreshes. A muted author's PRs are dropped right after listing, before any revision, comment, merge or CI lookup. If a config change only mutes or unmutes, the list stays up minus the muted PRs instead of going back to "Loading…", and the next refresh sends no "new PR" notifications, so unmuted PRs don't notify. The helper never looks into muted PRs, so the menu counts mutes rather than muted PRs.

New settings and protocol fields, for review: settings keys muted-repos and muted-authors, typed a{ss} (DID → the name shown in Settings) rather than as. That lets the helper filter by stable DIDs, and Settings can show names without a lookup. The config message gains mutedRepos and mutedAuthors (DID arrays), Item gains repoDid and authorDid, and the engine gains one rule (a mutes-only config keeps the list). There are no new messages or engine states. Tests: tests/engine/mute.test.js; tests/driver/mute.test.js, which runs the real helper against the mock server and checks it sends no requests for a muted repo or for a muted author's PR; and a headless-shell smoke step that clicks a PR's mute button (the PR doesn't open), mutes its author and checks the list and the muted line.

Menu, before and after (one repo muted, a PR's mute choices open):

Menu before Menu after

A repo group, before and after:

Group before Group after

Settings, before and after (a repo and an author muted):

Settings before Settings after

🤖 Generated with Claude Code

Commits 0