Skip to content

Commit 4420993

Browse files
feat: add support for getting Copilot cloud agent configuration
Signed-off-by: maishivamhoo123 <maishivamhoo@gmail.com>
1 parent bb700bf commit 4420993

5 files changed

Lines changed: 394 additions & 0 deletions

File tree

github/copilot_cloud_agent.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright 2026 The go-github AUTHORS. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style
4+
// license that can be found in the LICENSE file.
5+
6+
package github
7+
8+
import (
9+
"context"
10+
"encoding/json"
11+
"fmt"
12+
)
13+
14+
// CopilotCloudAgentConfiguration represents the Copilot cloud agent configuration for a repository.
15+
//
16+
// GitHub API docs: https://docs.github.com/en/rest/copilot/copilot-cloud-agent-management?apiVersion=2026-03-10#get-copilot-cloud-agent-configuration-for-a-repository
17+
type CopilotCloudAgentConfiguration struct {
18+
McpConfiguration *json.RawMessage `json:"mcp_configuration,omitempty"`
19+
EnabledTools *EnabledTools `json:"enabled_tools,omitempty"`
20+
RequireActionsWorkflowApproval *bool `json:"require_actions_workflow_approval,omitempty"`
21+
IsFirewallEnabled *bool `json:"is_firewall_enabled,omitempty"`
22+
IsFirewallRecommendedAllowlistEnabled *bool `json:"is_firewall_recommended_allowlist_enabled,omitempty"`
23+
CustomAllowlist []string `json:"custom_allowlist,omitempty"`
24+
}
25+
26+
// EnabledTools represents the enabled review tools for Copilot cloud agent.
27+
type EnabledTools struct {
28+
Codeql *bool `json:"codeql,omitempty"`
29+
CopilotCodeReview *bool `json:"copilot_code_review,omitempty"`
30+
SecretScanning *bool `json:"secret_scanning,omitempty"`
31+
DependencyVulnerabilityChecks *bool `json:"dependency_vulnerability_checks,omitempty"`
32+
}
33+
34+
// GetCopilotCloudAgentConfiguration gets the Copilot cloud agent configuration for a repository.
35+
//
36+
// GitHub API docs: https://docs.github.com/rest/copilot/copilot-cloud-agent-management?apiVersion=2026-03-10#get-copilot-cloud-agent-configuration-for-a-repository
37+
//
38+
//meta:operation GET /repos/{owner}/{repo}/copilot/cloud-agent/configuration
39+
func (s *CopilotService) GetCopilotCloudAgentConfiguration(ctx context.Context, owner, repo string) (*CopilotCloudAgentConfiguration, *Response, error) {
40+
u := fmt.Sprintf("repos/%v/%v/copilot/cloud-agent/configuration", owner, repo)
41+
42+
req, err := s.client.NewRequest(ctx, "GET", u, nil)
43+
if err != nil {
44+
return nil, nil, err
45+
}
46+
47+
var config CopilotCloudAgentConfiguration
48+
resp, err := s.client.Do(req, &config)
49+
if err != nil {
50+
return nil, resp, err
51+
}
52+
53+
return &config, resp, nil
54+
}

github/copilot_cloud_agent_test.go

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Copyright 2026 The go-github AUTHORS. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style
4+
// license that can be found in the LICENSE file.
5+
6+
package github
7+
8+
import (
9+
"fmt"
10+
"net/http"
11+
"testing"
12+
13+
"github.com/google/go-cmp/cmp"
14+
)
15+
16+
func TestCopilotService_GetCopilotCloudAgentConfiguration(t *testing.T) {
17+
t.Parallel()
18+
client, mux, _ := setup(t)
19+
20+
mux.HandleFunc("/repos/o/r/copilot/cloud-agent/configuration", func(w http.ResponseWriter, r *http.Request) {
21+
testMethod(t, r, "GET")
22+
fmt.Fprint(w, `{
23+
"mcp_configuration": null,
24+
"enabled_tools": {
25+
"codeql": true,
26+
"copilot_code_review": true,
27+
"secret_scanning": true,
28+
"dependency_vulnerability_checks": true
29+
},
30+
"require_actions_workflow_approval": true,
31+
"is_firewall_enabled": true,
32+
"is_firewall_recommended_allowlist_enabled": true,
33+
"custom_allowlist": []
34+
}`)
35+
})
36+
37+
ctx := t.Context()
38+
config, _, err := client.Copilot.GetCopilotCloudAgentConfiguration(ctx, "o", "r")
39+
if err != nil {
40+
t.Errorf("GetCopilotCloudAgentConfiguration returned error: %v", err)
41+
}
42+
43+
want := &CopilotCloudAgentConfiguration{
44+
McpConfiguration: nil,
45+
EnabledTools: &EnabledTools{
46+
Codeql: Ptr(true),
47+
CopilotCodeReview: Ptr(true),
48+
SecretScanning: Ptr(true),
49+
DependencyVulnerabilityChecks: Ptr(true),
50+
},
51+
RequireActionsWorkflowApproval: Ptr(true),
52+
IsFirewallEnabled: Ptr(true),
53+
IsFirewallRecommendedAllowlistEnabled: Ptr(true),
54+
CustomAllowlist: []string{},
55+
}
56+
57+
if !cmp.Equal(config, want) {
58+
t.Errorf("GetCopilotCloudAgentConfiguration returned %+v, want %+v", config, want)
59+
}
60+
61+
const methodName = "GetCopilotCloudAgentConfiguration"
62+
testBadOptions(t, methodName, func() (err error) {
63+
_, _, err = client.Copilot.GetCopilotCloudAgentConfiguration(ctx, "\n", "\n")
64+
return err
65+
})
66+
67+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
68+
got, resp, err := client.Copilot.GetCopilotCloudAgentConfiguration(ctx, "o", "r")
69+
if got != nil {
70+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
71+
}
72+
return resp, err
73+
})
74+
}
75+
76+
func TestCopilotService_GetCopilotCloudAgentConfiguration_InvalidOwner(t *testing.T) {
77+
t.Parallel()
78+
client, _, _ := setup(t)
79+
80+
ctx := t.Context()
81+
_, _, err := client.Copilot.GetCopilotCloudAgentConfiguration(ctx, "%", "r")
82+
testURLParseError(t, err)
83+
}
84+
85+
func TestCopilotService_GetCopilotCloudAgentConfiguration_InvalidRepo(t *testing.T) {
86+
t.Parallel()
87+
client, _, _ := setup(t)
88+
89+
ctx := t.Context()
90+
_, _, err := client.Copilot.GetCopilotCloudAgentConfiguration(ctx, "o", "%")
91+
testURLParseError(t, err)
92+
}
93+
94+
func TestCopilotService_GetCopilotCloudAgentConfiguration_NotFound(t *testing.T) {
95+
t.Parallel()
96+
client, mux, _ := setup(t)
97+
98+
mux.HandleFunc("/repos/o/r/copilot/cloud-agent/configuration", func(w http.ResponseWriter, r *http.Request) {
99+
testMethod(t, r, "GET")
100+
w.WriteHeader(http.StatusNotFound)
101+
})
102+
103+
ctx := t.Context()
104+
config, resp, err := client.Copilot.GetCopilotCloudAgentConfiguration(ctx, "o", "r")
105+
if err == nil {
106+
t.Error("Expected HTTP 404 response")
107+
}
108+
if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want {
109+
t.Errorf("GetCopilotCloudAgentConfiguration return status %v, want %v", got, want)
110+
}
111+
if config != nil {
112+
t.Errorf("GetCopilotCloudAgentConfiguration return %+v, want nil", config)
113+
}
114+
}
115+
116+
func TestCopilotCloudAgentConfiguration_Marshal(t *testing.T) {
117+
t.Parallel()
118+
testJSONMarshal(t, &CopilotCloudAgentConfiguration{}, "{}")
119+
120+
u := &CopilotCloudAgentConfiguration{
121+
McpConfiguration: nil,
122+
EnabledTools: &EnabledTools{
123+
Codeql: Ptr(true),
124+
CopilotCodeReview: Ptr(false),
125+
SecretScanning: Ptr(true),
126+
DependencyVulnerabilityChecks: Ptr(false),
127+
},
128+
RequireActionsWorkflowApproval: Ptr(true),
129+
IsFirewallEnabled: Ptr(false),
130+
IsFirewallRecommendedAllowlistEnabled: Ptr(true),
131+
CustomAllowlist: []string{"192.168.0.0/16"},
132+
}
133+
134+
want := `{
135+
"enabled_tools": {
136+
"codeql": true,
137+
"copilot_code_review": false,
138+
"secret_scanning": true,
139+
"dependency_vulnerability_checks": false
140+
},
141+
"require_actions_workflow_approval": true,
142+
"is_firewall_enabled": false,
143+
"is_firewall_recommended_allowlist_enabled": true,
144+
"custom_allowlist": ["192.168.0.0/16"]
145+
}`
146+
147+
testJSONMarshal(t, u, want)
148+
}

github/github-accessors.go

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)