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 |
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>
5bad833 to
9430403
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
58688bd to
bb6ed80
Compare
roborev: Combined Review (
|
Repositories can be hidden from interactive catalogs without removing them from configuration. The preference is stored against the provider-verified stable repository identity, filtering is server-owned and scoped to interactive catalogs, and each exact repository row in Settings gains a gear menu with the local clone editor and a Hide from UI / Show in UI action. Squashed from: - fix: keep reused-route notification e2e green past its seeded week - feat: key repository UI visibility to stable catalog identity - feat: hide repositories from interactive catalogs server-side - feat: hide repositories in a per-row repository gear menu - docs: describe hiding a repository from the UI - test: drive the local clone editor through the repo gear menu - fix: correlate repository visibility by stable provider id - fix: clear hidden repository selections from the global repo filter - fix: clear filter selections keyed to a hidden repo's renamed route - test: cover hidden-repo filtering on the repository overview summaries - fix: reject visibility mutations that target a displaced repository - fix: require a repo choice when a workspace dialog seed is unavailable - test: cover the hide/show workflow through the real backend - fix: write repository visibility atomically with lifecycle validation - fix: release an orphaned hidden preference when its exact entry is removed - fix: sweep orphaned hidden-repo preferences on every config change Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bb6ed80 to
34c79f6
Compare
roborev: Combined Review (
|
Three review findings against the visibility feature: The visibility sweep panicked at startup or hot reload on servers constructed without a syncer once hidden rows existed, because visibilityLookupIdentity dereferenced the syncer unconditionally. It now falls back to the configured route identity. Host-pinned scopes (ui.hideRepoSelector) were fed through interactive selection normalization, so pinning an embed to a hidden repository silently unscoped every pull, issue, and activity request. Pinned selections now bypass normalization: with no picker there is nothing to rescope with. Switching a new-workspace dialog from Kata back to the repository source rebuilt the selection with the old last-used/first-repo fallback, so an unavailable explicit seed could divert the workspace to the wrong repository. Both load paths now share the seed-aware selection that leaves the choice empty. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
roborev: Combined Review (
|
…te without tracked identities Two review findings against the visibility feature: A visibility PUT validated exact-entry membership outside any lock shared with reconcileOrphanedRepoVisibility, so a concurrent delete or hot reload could sweep between the check and the write, letting the PUT recreate an orphaned preference that a glob then keeps hidden with no Show in UI control. Mutations and the sweep now serialize on a shared repoVisibilityMu, with membership revalidated inside the critical section; a deterministic blocked-PUT test drives the race. The success response then called s.syncer.TrackedRepos unconditionally, panicking on syncerless servers after the write persisted, and hidden correlation skipped tracked refs without stable provider ids, so route-only refs reported hidden_from_ui=false for a repository that was just hidden. Response construction is now nil-safe and falls back to resolving exact entries to their catalog row ids the same way the mutation path does. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
roborev: Combined Review (
|
|
Tested and working |


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