Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions pkg/github/issues.go
Original file line number Diff line number Diff line change
Expand Up @@ -376,12 +376,9 @@ func GetIssue(ctx context.Context, client *github.Client, deps ToolDependencies,
}
}

r, err := json.Marshal(issue)
if err != nil {
return nil, fmt.Errorf("failed to marshal issue: %w", err)
}
minimalIssue := convertToMinimalIssue(issue)

return utils.NewToolResultText(string(r)), nil
return MarshalledTextResult(minimalIssue), nil
}

func GetIssueComments(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int, pagination PaginationParams) (*mcp.CallToolResult, error) {
Expand Down
14 changes: 7 additions & 7 deletions pkg/github/issues_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -345,15 +345,15 @@ func Test_GetIssue(t *testing.T) {

textContent := getTextResult(t, result)

var returnedIssue github.Issue
var returnedIssue MinimalIssue
err = json.Unmarshal([]byte(textContent.Text), &returnedIssue)
require.NoError(t, err)
assert.Equal(t, *tc.expectedIssue.Number, *returnedIssue.Number)
assert.Equal(t, *tc.expectedIssue.Title, *returnedIssue.Title)
assert.Equal(t, *tc.expectedIssue.Body, *returnedIssue.Body)
assert.Equal(t, *tc.expectedIssue.State, *returnedIssue.State)
assert.Equal(t, *tc.expectedIssue.HTMLURL, *returnedIssue.HTMLURL)
assert.Equal(t, *tc.expectedIssue.User.Login, *returnedIssue.User.Login)
assert.Equal(t, tc.expectedIssue.GetNumber(), returnedIssue.Number)
assert.Equal(t, tc.expectedIssue.GetTitle(), returnedIssue.Title)
assert.Equal(t, tc.expectedIssue.GetBody(), returnedIssue.Body)
assert.Equal(t, tc.expectedIssue.GetState(), returnedIssue.State)
assert.Equal(t, tc.expectedIssue.GetHTMLURL(), returnedIssue.HTMLURL)
assert.Equal(t, tc.expectedIssue.GetUser().GetLogin(), returnedIssue.User.Login)
})
}
}
Expand Down
101 changes: 101 additions & 0 deletions pkg/github/minimal_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,42 @@ type MinimalProject struct {
OwnerType string `json:"owner_type,omitempty"`
}

// MinimalReactions is the trimmed output type for reaction summaries, dropping the API URL.
type MinimalReactions struct {
TotalCount int `json:"total_count"`
PlusOne int `json:"+1"`
MinusOne int `json:"-1"`
Laugh int `json:"laugh"`
Confused int `json:"confused"`
Heart int `json:"heart"`
Hooray int `json:"hooray"`
Rocket int `json:"rocket"`
Eyes int `json:"eyes"`
}

// MinimalIssue is the trimmed output type for issue objects to reduce verbosity.
type MinimalIssue struct {
Number int `json:"number"`
Title string `json:"title"`
Body string `json:"body,omitempty"`
State string `json:"state"`
StateReason string `json:"state_reason,omitempty"`
Draft bool `json:"draft,omitempty"`
Locked bool `json:"locked,omitempty"`
HTMLURL string `json:"html_url"`
User *MinimalUser `json:"user,omitempty"`
Labels []string `json:"labels,omitempty"`
Assignees []string `json:"assignees,omitempty"`
Milestone string `json:"milestone,omitempty"`
Comments int `json:"comments,omitempty"`
Reactions *MinimalReactions `json:"reactions,omitempty"`
CreatedAt string `json:"created_at,omitempty"`
UpdatedAt string `json:"updated_at,omitempty"`
ClosedAt string `json:"closed_at,omitempty"`
ClosedBy string `json:"closed_by,omitempty"`
IssueType string `json:"issue_type,omitempty"`
}

// MinimalPullRequest is the trimmed output type for pull request objects to reduce verbosity.
type MinimalPullRequest struct {
Number int `json:"number"`
Expand Down Expand Up @@ -180,6 +216,71 @@ type MinimalPRBranchRepo struct {

// Helper functions

func convertToMinimalIssue(issue *github.Issue) MinimalIssue {
m := MinimalIssue{
Number: issue.GetNumber(),
Title: issue.GetTitle(),
Body: issue.GetBody(),
State: issue.GetState(),
StateReason: issue.GetStateReason(),
Draft: issue.GetDraft(),
Locked: issue.GetLocked(),
HTMLURL: issue.GetHTMLURL(),
User: convertToMinimalUser(issue.GetUser()),
Comments: issue.GetComments(),
}

if issue.CreatedAt != nil {
m.CreatedAt = issue.CreatedAt.Format(time.RFC3339)
}
if issue.UpdatedAt != nil {
m.UpdatedAt = issue.UpdatedAt.Format(time.RFC3339)
}
if issue.ClosedAt != nil {
m.ClosedAt = issue.ClosedAt.Format(time.RFC3339)
}

for _, label := range issue.Labels {
if label != nil {
m.Labels = append(m.Labels, label.GetName())
}
}

for _, assignee := range issue.Assignees {
if assignee != nil {
m.Assignees = append(m.Assignees, assignee.GetLogin())
}
}

if closedBy := issue.GetClosedBy(); closedBy != nil {
m.ClosedBy = closedBy.GetLogin()
}

if milestone := issue.GetMilestone(); milestone != nil {
m.Milestone = milestone.GetTitle()
}

if issueType := issue.GetType(); issueType != nil {
m.IssueType = issueType.GetName()
}

if r := issue.Reactions; r != nil {
m.Reactions = &MinimalReactions{
TotalCount: r.GetTotalCount(),
PlusOne: r.GetPlusOne(),
MinusOne: r.GetMinusOne(),
Laugh: r.GetLaugh(),
Confused: r.GetConfused(),
Heart: r.GetHeart(),
Hooray: r.GetHooray(),
Rocket: r.GetRocket(),
Eyes: r.GetEyes(),
}
}

return m
}

func convertToMinimalPullRequest(pr *github.PullRequest) MinimalPullRequest {
m := MinimalPullRequest{
Number: pr.GetNumber(),
Expand Down