diff --git a/github/copilot_cloud_agent.go b/github/copilot_cloud_agent.go index b323af5efc8..8d879a0aa57 100644 --- a/github/copilot_cloud_agent.go +++ b/github/copilot_cloud_agent.go @@ -49,3 +49,26 @@ func (s *CopilotService) GetCloudAgentConfiguration(ctx context.Context, owner, return config, resp, nil } + +// UpdateCloudAgentConfiguration updates the Copilot cloud agent configuration for a repository. +// +// GitHub API docs: https://docs.github.com/rest/copilot/copilot-cloud-agent-management?apiVersion=2022-11-28#update-copilot-cloud-agent-configuration-for-a-repository +// +//meta:operation PATCH /repos/{owner}/{repo}/copilot/cloud-agent/configuration +func (s *CopilotService) UpdateCloudAgentConfiguration(ctx context.Context, owner, repo string, opts *CopilotCloudAgentConfiguration) (*CopilotCloudAgentConfiguration, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/copilot/cloud-agent/configuration", owner, repo) + + req, err := s.client.NewRequest(ctx, "PATCH", u, opts) + if err != nil { + return nil, nil, err + } + + var config *CopilotCloudAgentConfiguration + resp, err := s.client.Do(req, &config) + if err != nil { + return nil, resp, err + } + + return config, resp, nil +} + diff --git a/github/copilot_cloud_agent_test.go b/github/copilot_cloud_agent_test.go index f29cedad554..2f1639b2943 100644 --- a/github/copilot_cloud_agent_test.go +++ b/github/copilot_cloud_agent_test.go @@ -237,3 +237,70 @@ func TestCopilotService_GetCloudAgentConfiguration_MalformedJSON(t *testing.T) { t.Errorf("GetCloudAgentConfiguration should return nil on error, got %+v", config) } } + +func TestCopilotService_UpdateCloudAgentConfiguration(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := &CopilotCloudAgentConfiguration{ + MCPConfiguration: map[string]any{ + "type": "resource", + "uri": "stdio://server", + }, + EnabledTools: &CopilotCloudAgentEnabledTools{ + Codeql: true, + CopilotCodeReview: true, + }, + RequireActionsWorkflowApproval: true, + IsFirewallEnabled: true, + IsFirewallRecommendedAllowlistEnabled: true, + CustomAllowlist: []string{"example.com"}, + } + + mux.HandleFunc("/repos/o/r/copilot/cloud-agent/configuration", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testJSONBody(t, r, input) + fmt.Fprint(w, `{ + "mcp_configuration": { + "type": "resource", + "uri": "stdio://server" + }, + "enabled_tools": { + "codeql": true, + "copilot_code_review": true, + "secret_scanning": false, + "dependency_vulnerability_checks": false + }, + "require_actions_workflow_approval": true, + "is_firewall_enabled": true, + "is_firewall_recommended_allowlist_enabled": true, + "custom_allowlist": ["example.com"] + }`) + }) + + ctx := t.Context() + config, _, err := client.Copilot.UpdateCloudAgentConfiguration(ctx, "o", "r", input) + if err != nil { + t.Errorf("UpdateCloudAgentConfiguration returned error: %v", err) + } + + want := &CopilotCloudAgentConfiguration{ + MCPConfiguration: map[string]any{ + "type": "resource", + "uri": "stdio://server", + }, + EnabledTools: &CopilotCloudAgentEnabledTools{ + Codeql: true, + CopilotCodeReview: true, + }, + RequireActionsWorkflowApproval: true, + IsFirewallEnabled: true, + IsFirewallRecommendedAllowlistEnabled: true, + CustomAllowlist: []string{"example.com"}, + } + + if !cmp.Equal(config, want) { + t.Errorf("UpdateCloudAgentConfiguration returned %+v, want %+v", config, want) + } +} +