feat: hide repositories from the UI via a per-repo gear menu - #862
Conversation
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
554d1ec to
efafb71
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
e7dd346 to
7592e9b
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
809bee9 to
e707f9f
Compare
|
clanking |
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
|
This one spiralled out of control and is going to require a redo |
TestNotificationSyncReconcilesReusedRouteE2E pinned its seeded activity to 2026-08-03; the activity endpoint's default window is 7d, so the assertion silently became date-dependent and began failing on 2026-08-10 on every branch. Seed a now-relative instant like the neighboring tests so the fixture stays inside the default window on any calendar day. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hiding a repository from interactive catalogs is an operator presentation preference, so it lives in SQLite keyed by the internal catalog row id rather than in operator config. Config entries are mutable routes: keying visibility by them forced a parallel route-to-identity binding reconciler (the abandoned PR #862 approach) that raced catalog reconciliation. Keyed by the stable row, renames keep the preference through ordinary catalog reconciliation, route reuse cannot inherit it because reuse creates a distinct row, and deleting the row cascades the preference away. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PUT /repo/{provider}/{owner}/{name}/ui-visibility (plus the host-prefixed
form) toggles the hidden-from-UI preference for an exact configured
repository. The entry must resolve to a provider-verified catalog row —
the preference attaches to stable identity, so an unverified repository
conflicts until sync verifies it, and glob entries are rejected because
visibility belongs to exact repositories.
Filtering happens once, server-side, in /repos and /repos/summaries so
every selector and picker consistently omits hidden repositories without
client-side matching. Item feeds, provider-aware direct routes, and the
settings surface stay unfiltered; settings responses carry an explicit
hidden_from_ui flag per configured entry so the management surface can
offer the restore action.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Each exact repository row in Settings gets a compact gear menu holding the existing local-clone editor entry and a one-click Hide from UI / Show in UI action, replacing the previous standalone clone icon without adding permanent row chrome. The action saves through the ordered settings workflow, disables at the menu item while pending, gates at the items in embedded mode so the menu stays inspectable, and reports save failures through the flash banner while keeping server-confirmed state. Glob rows get no menu: visibility belongs to exact repositories. Selector consumers gate on the server's hidden_from_ui flag instead of reimplementing matching — the typeahead and mobile repo options skip flagged entries, and global-filter normalization drops a hidden repo from the current selection. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hiding is a Settings-row gear-menu action scoped to exact repositories; sync and direct links are unaffected, so the note lives with the repository configuration guidance rather than the workflow tours. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5bad833 to
9430403
Compare
roborev: Combined Review (
|
The standalone per-row local clone button was replaced by the repository gear menu, so the real-backend settings specs now open the editor via the menu and verify the saved path by reopening the editor instead of asserting the removed button's tooltip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hidden-state correlation on the settings surface and visibility mutation resolution both keyed on route strings. A repository displaced by route reuse keeps its old display route, so a replacement repository at that route inherited the displaced row's hidden flag, and a mutation resolved by route could land on whichever repository currently occupies it. Correlation now uses the stable (provider, host, provider id) identity key, and mutations resolve through the tracked ref's provider id, falling back to the route only when no verified identity exists. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
General selection normalization preserves unknown provider-qualified values because glob-resolved repositories have no configured entry of their own. A selected repository that was then hidden matched no interactive identity but survived normalization the same way, so it kept filtering activity after disappearing from every picker. Selection normalization now drops selections naming a hidden exact repository before the general pass, while unmatched glob-resolved selections stay. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
roborev: Combined Review (
|
Selection cleanup matched hidden repositories by their configured repo_path, but selections created from catalog rows use the provider-verified current route, which diverges after a provider-side rename — hiding a renamed repository left the global filter scoped to it. Settings entries now expose the tracked repository's current route as tracked_repo_path, and selection normalization clears hidden selections against both the configured and current routes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
roborev: Combined Review (
|
The summaries endpoint drives the repository overview but its hidden filtering was only covered indirectly; the wire-level e2e test now verifies hiding removes the repository from /api/v1/repos/summary and showing restores it. Verified the assertion catches a regression by disabling the summaries filter and watching the test fail. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
roborev: Combined Review (
|
A tracked-repository snapshot that lags catalog reconciliation still names the prior provider id after route reuse. Resolving that id returned the displaced, inactive row, so a hide request silently updated the old repository while the active replacement stayed visible. Visibility mutations now require the resolved row to be lifecycle-active and answer conflict-retry-after-sync otherwise, the same as unverified entries. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The new-workspace dialog fell back to the last-used or first repository when its explicit seed was missing from the loaded list — for example a repository hidden from the UI — so creating a workspace from that context silently targeted a different repository. An unresolvable seed now leaves the selection empty and submission disabled until the user picks a repository; the last-used and first-repo defaults still apply when no seed was given. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The settings gear-menu hide/show cycle now has browser coverage against the real API and SQLite database: hiding drops the repository from the repos overview and releases a persisted global filter scoped to it, the preference survives a reload, and Show in UI restores the card. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
roborev: Combined Review (
|


Repositories can now be hidden from the UI without removing them from configuration.
🤖 Generated with Claude Code