Skip to content

Commit ab5b5ab

Browse files
refactor: remove minimal_output opt-out from search_code
The full CodeResult only adds a bloated Repository object (~3KB of template URLs) and a derivable HTMLURL. Nothing in the full output is useful beyond what the minimal type already provides, so always return the compact form. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent f11bf9a commit ab5b5ab

4 files changed

Lines changed: 39 additions & 102 deletions

File tree

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1273,7 +1273,6 @@ The following sets of tools are available:
12731273

12741274
- **search_code** - Search code
12751275
- **Required OAuth Scopes**: `repo`
1276-
- `minimal_output`: Return minimal repository information (default: true). When false, returns full GitHub API repository objects. (boolean, optional)
12771276
- `order`: Sort order for results (string, optional)
12781277
- `page`: Page number for pagination (min 1) (number, optional)
12791278
- `perPage`: Results per page for pagination (min 1, max 100) (number, optional)

pkg/github/__toolsnaps__/search_code.snap

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66
"description": "Fast and precise code search across ALL GitHub repositories using GitHub's native search engine. Best for finding exact symbols, functions, classes, or specific code patterns.",
77
"inputSchema": {
88
"properties": {
9-
"minimal_output": {
10-
"default": true,
11-
"description": "Return minimal repository information (default: true). When false, returns full GitHub API repository objects.",
12-
"type": "boolean"
13-
},
149
"order": {
1510
"description": "Sort order for results",
1611
"enum": [

pkg/github/search.go

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,6 @@ func SearchCode(t translations.TranslationHelperFunc) inventory.ServerTool {
234234
Description: "Sort order for results",
235235
Enum: []any{"asc", "desc"},
236236
},
237-
"minimal_output": {
238-
Type: "boolean",
239-
Description: "Return minimal repository information (default: true). When false, returns full GitHub API repository objects.",
240-
Default: json.RawMessage(`true`),
241-
},
242237
},
243238
Required: []string{"query"},
244239
}
@@ -273,10 +268,6 @@ func SearchCode(t translations.TranslationHelperFunc) inventory.ServerTool {
273268
if err != nil {
274269
return utils.NewToolResultError(err.Error()), nil, nil
275270
}
276-
minimalOutput, err := OptionalBoolParamWithDefault(args, "minimal_output", true)
277-
if err != nil {
278-
return utils.NewToolResultError(err.Error()), nil, nil
279-
}
280271

281272
opts := &github.SearchOptions{
282273
Sort: sort,
@@ -311,37 +302,29 @@ func SearchCode(t translations.TranslationHelperFunc) inventory.ServerTool {
311302
return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to search code", resp, body), nil, nil
312303
}
313304

314-
var r []byte
315-
if minimalOutput {
316-
minimalItems := make([]MinimalCodeResult, 0, len(result.CodeResults))
317-
for _, code := range result.CodeResults {
318-
item := MinimalCodeResult{
319-
Name: code.GetName(),
320-
Path: code.GetPath(),
321-
SHA: code.GetSHA(),
322-
TextMatches: code.TextMatches,
323-
}
324-
if code.Repository != nil {
325-
item.Repository = code.Repository.GetFullName()
326-
}
327-
minimalItems = append(minimalItems, item)
305+
minimalItems := make([]MinimalCodeResult, 0, len(result.CodeResults))
306+
for _, code := range result.CodeResults {
307+
item := MinimalCodeResult{
308+
Name: code.GetName(),
309+
Path: code.GetPath(),
310+
SHA: code.GetSHA(),
311+
TextMatches: code.TextMatches,
328312
}
329-
330-
minimalResult := &MinimalCodeSearchResult{
331-
TotalCount: result.GetTotal(),
332-
IncompleteResults: result.GetIncompleteResults(),
333-
Items: minimalItems,
313+
if code.Repository != nil {
314+
item.Repository = code.Repository.GetFullName()
334315
}
316+
minimalItems = append(minimalItems, item)
317+
}
335318

336-
r, err = json.Marshal(minimalResult)
337-
if err != nil {
338-
return utils.NewToolResultErrorFromErr("failed to marshal minimal response", err), nil, nil
339-
}
340-
} else {
341-
r, err = json.Marshal(result)
342-
if err != nil {
343-
return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil, nil
344-
}
319+
minimalResult := &MinimalCodeSearchResult{
320+
TotalCount: result.GetTotal(),
321+
IncompleteResults: result.GetIncompleteResults(),
322+
Items: minimalItems,
323+
}
324+
325+
r, err := json.Marshal(minimalResult)
326+
if err != nil {
327+
return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil, nil
345328
}
346329

347330
return utils.NewToolResultText(string(r)), nil, nil

pkg/github/search_test.go

Lines changed: 19 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,6 @@ func Test_SearchCode(t *testing.T) {
422422
assert.Contains(t, schema.Properties, "order")
423423
assert.Contains(t, schema.Properties, "perPage")
424424
assert.Contains(t, schema.Properties, "page")
425-
assert.Contains(t, schema.Properties, "minimal_output")
426425
assert.ElementsMatch(t, schema.Required, []string{"query"})
427426

428427
// Setup mock search results
@@ -467,7 +466,6 @@ func Test_SearchCode(t *testing.T) {
467466
expectError bool
468467
expectedResult *github.CodeSearchResult
469468
expectedErrMsg string
470-
minimalOutput bool
471469
}{
472470
{
473471
name: "successful code search with all parameters",
@@ -491,7 +489,6 @@ func Test_SearchCode(t *testing.T) {
491489
},
492490
expectError: false,
493491
expectedResult: mockSearchResult,
494-
minimalOutput: true,
495492
},
496493
{
497494
name: "code search with minimal parameters",
@@ -509,26 +506,6 @@ func Test_SearchCode(t *testing.T) {
509506
},
510507
expectError: false,
511508
expectedResult: mockSearchResult,
512-
minimalOutput: true,
513-
},
514-
{
515-
name: "code search with full output",
516-
mockedClient: MockHTTPClientWithHandlers(map[string]http.HandlerFunc{
517-
GetSearchCode: expectQueryParams(t, map[string]string{
518-
"q": "fmt.Println language:go",
519-
"page": "1",
520-
"per_page": "30",
521-
}).withHeaders(textMatchAcceptHeader).andThen(
522-
mockResponse(t, http.StatusOK, mockSearchResult),
523-
),
524-
}),
525-
requestArgs: map[string]any{
526-
"query": "fmt.Println language:go",
527-
"minimal_output": false,
528-
},
529-
expectError: false,
530-
expectedResult: mockSearchResult,
531-
minimalOutput: false,
532509
},
533510
{
534511
name: "search code fails",
@@ -575,43 +552,26 @@ func Test_SearchCode(t *testing.T) {
575552

576553
textContent := getTextResult(t, result)
577554

578-
if tc.minimalOutput {
579-
// Unmarshal and verify the minimal result
580-
var returnedResult MinimalCodeSearchResult
581-
err = json.Unmarshal([]byte(textContent.Text), &returnedResult)
582-
require.NoError(t, err)
583-
assert.Equal(t, *tc.expectedResult.Total, returnedResult.TotalCount)
584-
assert.Equal(t, *tc.expectedResult.IncompleteResults, returnedResult.IncompleteResults)
585-
assert.Len(t, returnedResult.Items, len(tc.expectedResult.CodeResults))
586-
for i, code := range returnedResult.Items {
587-
assert.Equal(t, tc.expectedResult.CodeResults[i].GetName(), code.Name)
588-
assert.Equal(t, tc.expectedResult.CodeResults[i].GetPath(), code.Path)
589-
assert.Equal(t, tc.expectedResult.CodeResults[i].GetSHA(), code.SHA)
590-
assert.Equal(t, tc.expectedResult.CodeResults[i].Repository.GetFullName(), code.Repository)
591-
}
555+
var returnedResult MinimalCodeSearchResult
556+
err = json.Unmarshal([]byte(textContent.Text), &returnedResult)
557+
require.NoError(t, err)
558+
assert.Equal(t, *tc.expectedResult.Total, returnedResult.TotalCount)
559+
assert.Equal(t, *tc.expectedResult.IncompleteResults, returnedResult.IncompleteResults)
560+
assert.Len(t, returnedResult.Items, len(tc.expectedResult.CodeResults))
561+
for i, code := range returnedResult.Items {
562+
assert.Equal(t, tc.expectedResult.CodeResults[i].GetName(), code.Name)
563+
assert.Equal(t, tc.expectedResult.CodeResults[i].GetPath(), code.Path)
564+
assert.Equal(t, tc.expectedResult.CodeResults[i].GetSHA(), code.SHA)
565+
assert.Equal(t, tc.expectedResult.CodeResults[i].Repository.GetFullName(), code.Repository)
566+
}
592567

593-
// Verify text matches are included when present
594-
if len(tc.expectedResult.CodeResults[0].TextMatches) > 0 {
595-
require.NotEmpty(t, returnedResult.Items[0].TextMatches)
596-
assert.Equal(t,
597-
tc.expectedResult.CodeResults[0].TextMatches[0].GetFragment(),
598-
returnedResult.Items[0].TextMatches[0].GetFragment(),
599-
)
600-
}
601-
} else {
602-
// Verify the full result is returned
603-
var returnedResult github.CodeSearchResult
604-
err = json.Unmarshal([]byte(textContent.Text), &returnedResult)
605-
require.NoError(t, err)
606-
assert.Equal(t, *tc.expectedResult.Total, *returnedResult.Total)
607-
assert.Equal(t, *tc.expectedResult.IncompleteResults, *returnedResult.IncompleteResults)
608-
assert.Len(t, returnedResult.CodeResults, len(tc.expectedResult.CodeResults))
609-
for i, code := range returnedResult.CodeResults {
610-
assert.Equal(t, *tc.expectedResult.CodeResults[i].Name, *code.Name)
611-
assert.Equal(t, *tc.expectedResult.CodeResults[i].Path, *code.Path)
612-
assert.Equal(t, *tc.expectedResult.CodeResults[i].SHA, *code.SHA)
613-
assert.Equal(t, *tc.expectedResult.CodeResults[i].Repository.FullName, *code.Repository.FullName)
614-
}
568+
// Verify text matches are included when present
569+
if len(tc.expectedResult.CodeResults[0].TextMatches) > 0 {
570+
require.NotEmpty(t, returnedResult.Items[0].TextMatches)
571+
assert.Equal(t,
572+
tc.expectedResult.CodeResults[0].TextMatches[0].GetFragment(),
573+
returnedResult.Items[0].TextMatches[0].GetFragment(),
574+
)
615575
}
616576
})
617577
}

0 commit comments

Comments
 (0)