F6 — Web app: repo picker #488

Closed
opened 2026-04-27 21:43:48 +00:00 by claude-desktop · 0 comments
Collaborator

As an operator, I want a /settings/repos screen listing the active forge's repos with watch/unwatch toggles, so that I can pick which to watch without typing owner/name.

Acceptance criteria

  • Route renders a header showing "Connected to as <account_login>" with a "Disconnect & switch" link to /logout.
  • Body lists the operator's repos via GET /forges/active/repos?page=&search=, paginated 20 per page, with a search input that hits ?search=.
  • Each row shows the repo name, "private" badge, watch toggle, and (when watched) the dispatch-enabled switch from F5 PATCH.
  • Watch toggle shows a 200 ms optimistic spinner; rollback on error with a toast.
  • "Refresh" button at the section header busts the 60 s cache.
  • ForgePort.listOperatorRepos({ page, search }) → { repos: RepoSummary[], next_page?: number } implemented per adapter.
  • RepoSummary shape: { owner, name, default_branch, private, archived, html_url }. html_url carries the per-repo URL the web app needs for §F8 link construction.
  • 401 from the forge → automatic refresh-then-retry; second 401 → 412 { error: 'oauth_expired' } → web app forces logout.
  • Server caches the listing in-memory for 60 s.

Out of scope

  • Multi-forge picker (single-active-forge by design).

References

  • Spec: docs/specs/forge-auth-repo-selection.md §F6

Dependencies

  • Blocked by F5 (watch/unwatch endpoints)
As an operator, I want a `/settings/repos` screen listing the active forge's repos with watch/unwatch toggles, so that I can pick which to watch without typing `owner/name`. ## Acceptance criteria - [ ] Route renders a header showing "Connected to **<forge>** as **<account_login>**" with a "Disconnect & switch" link to `/logout`. - [ ] Body lists the operator's repos via `GET /forges/active/repos?page=&search=`, paginated 20 per page, with a search input that hits `?search=`. - [ ] Each row shows the repo name, "private" badge, watch toggle, and (when watched) the dispatch-enabled switch from F5 PATCH. - [ ] Watch toggle shows a 200 ms optimistic spinner; rollback on error with a toast. - [ ] "Refresh" button at the section header busts the 60 s cache. - [ ] `ForgePort.listOperatorRepos({ page, search }) → { repos: RepoSummary[], next_page?: number }` implemented per adapter. - [ ] `RepoSummary` shape: `{ owner, name, default_branch, private, archived, html_url }`. `html_url` carries the per-repo URL the web app needs for §F8 link construction. - [ ] 401 from the forge → automatic refresh-then-retry; second 401 → 412 `{ error: 'oauth_expired' }` → web app forces logout. - [ ] Server caches the listing in-memory for 60 s. ## Out of scope - Multi-forge picker (single-active-forge by design). ## References - Spec: `docs/specs/forge-auth-repo-selection.md` §F6 ## Dependencies - Blocked by F5 (watch/unwatch endpoints)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks#488
No description provided.