gh pr edit: Add support for Copilot as reviewer with search capability, performance and accessibility improvements#12567
Open
gh pr edit: Add support for Copilot as reviewer with search capability, performance and accessibility improvements#12567
gh pr edit: Add support for Copilot as reviewer with search capability, performance and accessibility improvements#12567Conversation
gh pr editAdd CCR and reviewer MultiSelectWithSearchgh pr edit: Add CCR and reviewer MultiSelectWithSearch
gh pr edit: Add CCR and reviewer MultiSelectWithSearchgh pr edit: Add support for Copilot as reviewer with search capability, performance and accessibility improvements
Enables Copilot to be requested as a pull request reviewer, supporting both interactive and non-interactive flows. Introduces new reviewer search functionality, updates reviewer partitioning to distinguish users, bots, and teams, and adds a GraphQL mutation for reviewer management on github.com. Updates help text, tests, and internal APIs to support Copilot reviewer login and display names, while maintaining compatibility with GitHub Enterprise Server.
617a88d to
738b82d
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
Adds Copilot Code Review (CCR) support and a multi-select-with-search experience for editing PR reviewers via gh pr edit, including new API queries/mutations to support bots and improved reviewer display names.
Changes:
- Introduces reviewer search plumbing in the edit flow and adds a github.com-specific GraphQL mutation path for setting reviewers (including Copilot bot).
- Extends PR review-request GraphQL selection to include
Botand adds display-name helpers for reviewers (e.g., “Copilot (AI)”). - Adds
@copilotreviewer replacement support and related unit tests.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| pkg/cmd/pr/shared/params_test.go | Adds tests for @copilot reviewer replacement behavior. |
| pkg/cmd/pr/shared/params.go | Splits Copilot replacement into assignee vs reviewer logins. |
| pkg/cmd/pr/shared/editable.go | Introduces EditableReviewers, wires reviewer search prompting, and optimizes metadata fetching decisions. |
| pkg/cmd/pr/edit/edit_test.go | Updates edit command tests for new reviewer flow/mutation behavior and GHES compatibility. |
| pkg/cmd/pr/edit/edit.go | Wires reviewer search, partitions reviewers by type, and adds github.com GraphQL vs GHES REST reviewer update paths. |
| api/query_builder.go | Adds ...on Bot{login} to PR review request selection for Copilot support. |
| api/queries_repo.go | Introduces separate constants for Copilot assignee vs reviewer bot logins. |
| api/queries_pr.go | Adds display helpers, REST team slug extraction, new reviewer mutation, and reviewer suggestion query/types. |
Comments suppressed due to low confidence (1)
pkg/cmd/pr/edit/edit.go:582
partitionReviewersByTypeclassifies bots only when the value equalsapi.CopilotReviewerLogin. If the search flow (or existing review requests) yields any other bot login, it will be treated as a user and sent to the wrong mutation input. Either broaden bot detection (e.g., by encoding type in the selection key or maintaining a map of login→type from search results) or ensure only Copilot bots can be selected.
// partitionReviewersByType splits reviewer identifiers into users, bots, and teams.
// Team identifiers are in the form "org/slug" and are returned as-is.
// Bot logins (currently only Copilot) are identified and returned separately.
func partitionReviewersByType(values []string) (users []string, bots []string, teams []string) {
for _, v := range values {
if v == "" {
continue
}
if strings.ContainsRune(v, '/') {
// Team: org/slug format, pass as-is
teams = append(teams, v)
} else if v == api.CopilotReviewerLogin {
bots = append(bots, v)
} else {
users = append(users, v)
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Always send explicit lists for userLogins, botLogins, and teamSlugs in RequestReviewsByLogin mutation, even when empty. Previously, empty slices were omitted due to omitempty JSON behavior and len > 0 checks, which prevented clearing all reviewers when using replace mode. Empty slices are harmless no-ops in union mode, so we now send them unconditionally for simpler logic. Add test to verify the mutation receives empty slices when all reviewers are removed.
Each source (suggestions, collaborators, teams) has base quota of 5. Unfilled slots cascade to later sources, allowing up to 15 total. Adds unit tests with HTTP mocks.
Fetch name field in reviewRequests GraphQL query and show as 'login (Name)'.
Query aliased fields without search filter to get stable counts.
Reword the comment for CopilotAssigneeLogin to indicate it refers to Copilot when retrieved as an assignee. This updates wording from the previous 'Actor/assignable actors' phrasing for clarity; no code behavior changed.
Remove a redundant struct-level comment and update the DefaultLogins field comment in pkg/cmd/pr/shared/editable.go to more accurately describe its purpose: used to disambiguate actors from display names rather than to compute add/remove sets.
Add clarifying comment in pkg/cmd/pr/edit/edit.go to note that missing assignee/reviewer search functions trigger a downstream fallback to legacy fetching. In pkg/cmd/pr/shared/editable.go remove a redundant line and add a TODO urging migration of non-interactive assignee updates to use the new logins input with ReplaceActorsForAssignable to avoid unnecessary fetching. These are comment and doc changes to clarify intent and future improvements.
Update comment in FetchOptions to specify that the APIs used for both GHES and GitHub.com accept user logins and team slugs directly, clarifying why non-interactive flows with Add/Remove don't need to fetch reviewers/teams. Comment-only change; no functional modifications.
Address PR review comments: code consistency and DRY improvements - Add botTypeName const for consistency with teamTypeName - Create extractTeamSlugs helper using strings.SplitN to simplify team slug extraction logic - Replace duplicate code in AddPullRequestReviews and RemovePullRequestReviews with extractTeamSlugs helper - Fix ClientMutationId naming with explicit graphql tag for consistency with other mutations in the codebase
d7e41c1 to
ebf932a
Compare
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.
Description
Adds Copilot Code Review (CCR) support and multiselect-with-search for reviewers in
gh pr edit.Key changes
API layer (
api/queries_pr.go):RequestReviewsByLoginGraphQL mutation withuserLogins,botLogins,teamSlugs(github.com only)SuggestedReviewerActorsquery combiningsuggestedReviewerActors, collaborators, and org teamsReviewerCandidateinterface withReviewerUser,ReviewerBot,ReviewerTeamtypesDisplayName()/DisplayNames()methods for user-friendly display (e.g., "Copilot (AI)")org/slug→slug) moved into REST functionsQuery builder (
api/query_builder.go):...on Bot{login}toprReviewRequestsfor Copilot support (silently ignored on GHES)Edit command (
pkg/cmd/pr/edit/edit.go):reviewerSearchFuncfor multiselect-with-searchupdatePullRequestReviewsGraphQL(github.com) vsupdatePullRequestReviewsREST(GHES)partitionReviewersByTypeto separate users, bots, teams@copilotflag support for--add-reviewer/--remove-reviewerShared (
pkg/cmd/pr/shared/):EditableReviewersstruct with separateDefault(display) andDefaultLogins(API)NewCopilotReviewerReplacerfor@copilot→copilot-pull-request-reviewerNotes for reviewers
requestReviewsByLoginusesunion: false(replace mode) to set the entire reviewer set[bot]suffix in API layer before mutation