feat: reins group / ungroup — create, edit and dissolve tab groups - #35
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Daemon fans list_groups out across connected browsers, tagging each group with browserId + browser. A browser that fails (no tab-group support, or an older extension) contributes nothing; only when every targeted browser fails is the first error rethrown. Adds the groups command, groupsText, and a g<id> marker on grouped tabs in reins tabs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Route group_tabs, update_group and ungroup_tabs through dispatch. The gate checks every target tab's host (for ungroup --group, the group's current tabs); the first denial refuses the whole call with that tab's id in PolicyDenied.meta. The resolved tabIds are pinned into params so gate and handler act on the same set. update_group has no host check. The unsupported-browser check runs before any lookup or policy check. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
One command covers two bridge methods: --tab groups tabs (group_tabs), --group alone edits a group (update_group). ToolCommand gains an optional methodFor(params) hook, used at the single rpc call site. Also folds the duplicated tabs/groups build bodies into browserOnly. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6 tasks
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Dia was verified live: groups show in its sidebar (cyan renders as blue). Remove the claim that Dia (and, unverified, Arc) lack tab groups from the changeset and comments, use a neutral browser in test fixtures, and bring the spec in line with the skipped-browser reporting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Also correct the skill: Dia supports tab groups (cyan shows as blue); browsers without the API now get an error naming them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
karngyan
added this pull request to stack #36
September 26, 2026 18:55
main's tree equals the pre-squash PR1 tip, so every conflict resolves to this branch's side; the net diff against main is unchanged PR2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #34. Review that one first; this PR's diff is against
feat/tab-groups.What
This is the write side of tab groups. The agent can mark the tabs it works in, or organize the user's tabs when asked. reins still never groups anything on its own.
GroupTabsParams,UpdateGroupParams(needs at least one prop), andUngroupTabsParams(exactly one oftabIds/groupId).read, because grouping touches the tab strip, never page content. Readonly sites can be grouped; denied ones can't.createProperties.windowId. Chrome's default is the focused window, which would drag tabs across windows.group_tabs/ungroup_tabscheck every target tab's host. Forungroup --group, that means the group's current tabs.ungroupTabsonly accepts that set, so the handler can't act on a tab the gate didn't check.tabs.query({groupId})may ignore the filter and return every tab.update_grouponly edits the label and has no host check.reins groupcovers both create/add and edit through a smallmethodForhook onToolCommand.--collapseand--expandtogether, a missing--tab/--group, and an unknown color are all usage errors.Test plan
pnpm build && pnpm test && pnpm typecheck && pnpm lint: all green (515 tests).ungroup --groupresolves the group's tabs once and ungroups exactly those,update_groupungated, schema validation, unsupported before any policy check.groups/tabsshow them → collapse → expand + rename + recolor → ungroup one tab → dissolve (tabs stayed open) → close.🤖 Generated with Claude Code