From 7ab8c4cbae2692b8b22ce85bb80f771055da8f60 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 05:57:44 +0000 Subject: [PATCH 1/5] Initial plan From 55ef3fc1bdc7b057f5576093afcfed04c19c6e9f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 06:09:44 +0000 Subject: [PATCH 2/5] Fix Serena container selection for Go language support - Remove "go" from DefaultSerenaMCPServerContainer supported languages - Add array handling in selectSerenaContainer to detect language from short syntax - System now correctly falls back to OraiosSerenaContainer when Go is requested - Fixes Duplicate Code Detector and other Go-based Serena workflows Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/duplicate-code-detector.lock.yml | 4 ++-- pkg/constants/constants.go | 5 ++++- pkg/workflow/mcp_config_serena_renderer.go | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index dcd5a77556..8c137bbe83 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -439,7 +439,7 @@ jobs: Authorization = "$GH_AW_SAFE_OUTPUTS_API_KEY" [mcp_servers.serena] - container = "ghcr.io/github/serena-mcp-server:latest" + container = "ghcr.io/oraios/serena:latest" args = [ "--network", "host", @@ -476,7 +476,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index 3e7de73d82..fe15b28088 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -333,9 +333,12 @@ const DefaultSerenaMCPServerContainer = "ghcr.io/github/serena-mcp-server" const OraiosSerenaContainer = "ghcr.io/oraios/serena" // SerenaLanguageSupport defines the supported languages for each Serena container image +// NOTE: Go is not included in DefaultSerenaMCPServerContainer as the container image +// does not have the Go runtime installed, which is required for gopls language server. +// Use OraiosSerenaContainer for Go support. var SerenaLanguageSupport = map[string][]string{ DefaultSerenaMCPServerContainer: { - "go", "typescript", "javascript", "python", "java", "rust", "csharp", + "typescript", "javascript", "python", "java", "rust", "csharp", "cpp", "c", "ruby", "php", "bash", "swift", "kotlin", "scala", "haskell", "elixir", "erlang", "clojure", "lua", "perl", "r", "dart", "julia", "fortran", "nix", "rego", "terraform", "yaml", diff --git a/pkg/workflow/mcp_config_serena_renderer.go b/pkg/workflow/mcp_config_serena_renderer.go index 69507781f2..73ac97461f 100644 --- a/pkg/workflow/mcp_config_serena_renderer.go +++ b/pkg/workflow/mcp_config_serena_renderer.go @@ -15,6 +15,20 @@ func selectSerenaContainer(serenaTool any) string { // Extract languages from the serena tool configuration var requestedLanguages []string + // Handle direct array format (from ToMap conversion of short syntax) + if langArray, ok := serenaTool.([]any); ok { + for _, lang := range langArray { + if langStr, ok := lang.(string); ok { + requestedLanguages = append(requestedLanguages, langStr) + } + } + } + + // Handle []string format (another possible array representation) + if langStrArray, ok := serenaTool.([]string); ok { + requestedLanguages = append(requestedLanguages, langStrArray...) + } + if toolMap, ok := serenaTool.(map[string]any); ok { // Check for short syntax (array of language names) if langs, ok := toolMap["langs"].([]any); ok { From 8d2822f323b5a732a2b8fdff024b7b36d469374c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 06:20:24 +0000 Subject: [PATCH 3/5] Update tests to reflect Go using Oraios container - Fix test expectations for Serena container selection - Update tests to accept either Oraios or GitHub container for Go - All unit tests passing - All workflows recompiled successfully Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/archie.lock.yml | 2 +- .github/workflows/cloclo.lock.yml | 2 +- .../workflows/daily-compiler-quality.lock.yml | 2 +- .github/workflows/daily-file-diet.lock.yml | 2 +- .../daily-testify-uber-super-expert.lock.yml | 2 +- .../developer-docs-consolidator.lock.yml | 2 +- .../workflows/glossary-maintainer.lock.yml | 2 +- .github/workflows/go-fan.lock.yml | 2 +- .github/workflows/mcp-inspector.lock.yml | 2 +- .github/workflows/q.lock.yml | 2 +- .../repository-quality-improver.lock.yml | 2 +- .github/workflows/sergo.lock.yml | 2 +- .github/workflows/smoke-claude.lock.yml | 2 +- .github/workflows/smoke-codex.lock.yml | 4 +- .github/workflows/smoke-copilot.lock.yml | 2 +- .github/workflows/terminal-stylist.lock.yml | 2 +- .github/workflows/typist.lock.yml | 2 +- pkg/workflow/importable_tools_test.go | 19 +++--- pkg/workflow/mcp_config_comprehensive_test.go | 2 +- .../serena_container_selection_test.go | 66 +++++++++++++++++-- 20 files changed, 90 insertions(+), 33 deletions(-) diff --git a/.github/workflows/archie.lock.yml b/.github/workflows/archie.lock.yml index a2ae66bf2e..0aa3a03d02 100644 --- a/.github/workflows/archie.lock.yml +++ b/.github/workflows/archie.lock.yml @@ -437,7 +437,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/cloclo.lock.yml b/.github/workflows/cloclo.lock.yml index 4159c92de0..32829fa291 100644 --- a/.github/workflows/cloclo.lock.yml +++ b/.github/workflows/cloclo.lock.yml @@ -594,7 +594,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/.github/workflows/daily-compiler-quality.lock.yml b/.github/workflows/daily-compiler-quality.lock.yml index 54053d7ed4..c498862a50 100644 --- a/.github/workflows/daily-compiler-quality.lock.yml +++ b/.github/workflows/daily-compiler-quality.lock.yml @@ -426,7 +426,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index b16bb202a3..4ed60266d3 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -439,7 +439,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index 792120e151..c872a0174b 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -449,7 +449,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/developer-docs-consolidator.lock.yml b/.github/workflows/developer-docs-consolidator.lock.yml index 7c8518ad55..2e04ac80b7 100644 --- a/.github/workflows/developer-docs-consolidator.lock.yml +++ b/.github/workflows/developer-docs-consolidator.lock.yml @@ -493,7 +493,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/.github/workflows/glossary-maintainer.lock.yml b/.github/workflows/glossary-maintainer.lock.yml index 293668a188..54d1f562fa 100644 --- a/.github/workflows/glossary-maintainer.lock.yml +++ b/.github/workflows/glossary-maintainer.lock.yml @@ -448,7 +448,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/go-fan.lock.yml b/.github/workflows/go-fan.lock.yml index 9581c3ff18..886ebd247f 100644 --- a/.github/workflows/go-fan.lock.yml +++ b/.github/workflows/go-fan.lock.yml @@ -429,7 +429,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index a37be17b45..3dd40a8b11 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -699,7 +699,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index efb9ce2ebd..f5906fc556 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -562,7 +562,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/repository-quality-improver.lock.yml b/.github/workflows/repository-quality-improver.lock.yml index 1fe0afdd3e..ed4706fef3 100644 --- a/.github/workflows/repository-quality-improver.lock.yml +++ b/.github/workflows/repository-quality-improver.lock.yml @@ -428,7 +428,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/sergo.lock.yml b/.github/workflows/sergo.lock.yml index 51de8a0402..6d9f61d6dc 100644 --- a/.github/workflows/sergo.lock.yml +++ b/.github/workflows/sergo.lock.yml @@ -430,7 +430,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 579330dd4c..aaefe4df81 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -1178,7 +1178,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index ef5259062e..10dd2a9c83 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -1133,7 +1133,7 @@ jobs: Authorization = "$GH_AW_SAFE_OUTPUTS_API_KEY" [mcp_servers.serena] - container = "ghcr.io/github/serena-mcp-server:latest" + container = "ghcr.io/oraios/serena:latest" args = [ "--network", "host", @@ -1198,7 +1198,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 722b0a4958..5d1c5200a4 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1159,7 +1159,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/terminal-stylist.lock.yml b/.github/workflows/terminal-stylist.lock.yml index cef4176efe..a632e77a1a 100644 --- a/.github/workflows/terminal-stylist.lock.yml +++ b/.github/workflows/terminal-stylist.lock.yml @@ -409,7 +409,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/typist.lock.yml b/.github/workflows/typist.lock.yml index 417c825347..26b876ccad 100644 --- a/.github/workflows/typist.lock.yml +++ b/.github/workflows/typist.lock.yml @@ -417,7 +417,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/github/serena-mcp-server:latest", + "container": "ghcr.io/oraios/serena:latest", "args": [ "--network", "host" diff --git a/pkg/workflow/importable_tools_test.go b/pkg/workflow/importable_tools_test.go index 42194a92dc..a4a5a9aa26 100644 --- a/pkg/workflow/importable_tools_test.go +++ b/pkg/workflow/importable_tools_test.go @@ -155,9 +155,10 @@ Uses imported serena tool. t.Error("Expected compiled workflow to contain serena tool") } - // Verify serena container (now using Docker instead of uvx) - if !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { - t.Error("Expected compiled workflow to contain serena Docker container") + // Verify serena container (should use Oraios for Go support) + if !strings.Contains(workflowData, "ghcr.io/oraios/serena:latest") && + !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { + t.Error("Expected compiled workflow to contain serena Docker container (Oraios or GitHub)") } // Verify that language service setup steps are NOT present @@ -321,8 +322,9 @@ Uses all imported tools. if !strings.Contains(workflowData, "mcr.microsoft.com/playwright/mcp") { t.Error("Expected compiled workflow to contain playwright Docker image") } - if !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { - t.Error("Expected compiled workflow to contain serena Docker container") + if !strings.Contains(workflowData, "ghcr.io/oraios/serena:latest") && + !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { + t.Error("Expected compiled workflow to contain serena Docker container (Oraios or GitHub)") } if !strings.Contains(workflowData, "example.com") { t.Error("Expected compiled workflow to contain example.com domain for playwright") @@ -404,9 +406,10 @@ Uses imported serena with language config. t.Error("Did not expect Node.js setup step (Serena runs in container)") } - // Verify serena container is present - if !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server") { - t.Error("Expected serena to use Docker container") + // Verify serena container is present (should use Oraios for Go) + if !strings.Contains(workflowData, "ghcr.io/oraios/serena") && + !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server") { + t.Error("Expected serena to use Docker container (Oraios or GitHub)") } } diff --git a/pkg/workflow/mcp_config_comprehensive_test.go b/pkg/workflow/mcp_config_comprehensive_test.go index ebdf841491..4192055287 100644 --- a/pkg/workflow/mcp_config_comprehensive_test.go +++ b/pkg/workflow/mcp_config_comprehensive_test.go @@ -1163,7 +1163,7 @@ func TestRenderSerenaMCPConfigLocalMode(t *testing.T) { expectedContent: []string{ `"serena": {`, `"type": "stdio"`, - `"container": "ghcr.io/github/serena-mcp-server:latest"`, + `"container": "ghcr.io/oraios/serena:latest"`, // Falls back to Oraios for Go }, unexpectedContent: []string{ `"url"`, diff --git a/pkg/workflow/serena_container_selection_test.go b/pkg/workflow/serena_container_selection_test.go index 78da04d2ec..98d5a1f49c 100644 --- a/pkg/workflow/serena_container_selection_test.go +++ b/pkg/workflow/serena_container_selection_test.go @@ -22,23 +22,47 @@ func TestSelectSerenaContainer(t *testing.T) { expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "supported languages - uses default", + name: "go language - falls back to Oraios", + serenaTool: map[string]any{ + "langs": []any{"go"}, + }, + expectedContainer: constants.OraiosSerenaContainer, + }, + { + name: "go with typescript - falls back to Oraios", serenaTool: map[string]any{ "langs": []any{"go", "typescript"}, }, + expectedContainer: constants.OraiosSerenaContainer, + }, + { + name: "supported languages without go - uses default", + serenaTool: map[string]any{ + "langs": []any{"typescript", "python"}, + }, expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "all supported languages - uses default", + name: "all default supported languages - uses default", serenaTool: map[string]any{ "languages": map[string]any{ - "go": map[string]any{}, "typescript": map[string]any{}, "python": map[string]any{}, }, }, expectedContainer: constants.DefaultSerenaMCPServerContainer, }, + { + name: "go with detailed config - falls back to Oraios", + serenaTool: map[string]any{ + "languages": map[string]any{ + "go": map[string]any{}, + "typescript": map[string]any{}, + "python": map[string]any{}, + }, + }, + expectedContainer: constants.OraiosSerenaContainer, + }, { name: "unsupported language - still uses default", serenaTool: map[string]any{ @@ -47,14 +71,21 @@ func TestSelectSerenaContainer(t *testing.T) { expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "SerenaToolConfig with short syntax", + name: "SerenaToolConfig with go in short syntax - falls back to Oraios", serenaTool: &SerenaToolConfig{ ShortSyntax: []string{"go", "rust"}, }, + expectedContainer: constants.OraiosSerenaContainer, + }, + { + name: "SerenaToolConfig without go - uses default", + serenaTool: &SerenaToolConfig{ + ShortSyntax: []string{"rust", "python"}, + }, expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "SerenaToolConfig with detailed languages", + name: "SerenaToolConfig with detailed languages without go - uses default", serenaTool: &SerenaToolConfig{ Languages: map[string]*SerenaLangConfig{ "python": {}, @@ -63,6 +94,16 @@ func TestSelectSerenaContainer(t *testing.T) { }, expectedContainer: constants.DefaultSerenaMCPServerContainer, }, + { + name: "array format with go - falls back to Oraios", + serenaTool: []any{"go"}, + expectedContainer: constants.OraiosSerenaContainer, + }, + { + name: "string array format with go - falls back to Oraios", + serenaTool: []string{"go"}, + expectedContainer: constants.OraiosSerenaContainer, + }, } for _, tt := range tests { @@ -94,7 +135,8 @@ func TestSerenaLanguageSupport(t *testing.T) { } // Verify some expected languages are present in default container - expectedLangs := []string{"go", "typescript", "python", "java", "rust"} + // Note: "go" is NOT in the default container as it lacks Go runtime + expectedLangs := []string{"typescript", "python", "java", "rust"} for _, lang := range expectedLangs { found := false for _, supportedLang := range defaultLangs { @@ -107,4 +149,16 @@ func TestSerenaLanguageSupport(t *testing.T) { t.Errorf("Expected language '%s' not found in default container support list", lang) } } + + // Verify Go is in Oraios container + goFound := false + for _, lang := range oraiosLangs { + if lang == "go" { + goFound = true + break + } + } + if !goFound { + t.Error("Expected 'go' language in Oraios container support list") + } } From 6c638d969e1eeb0fc4504b50c75575c630e723a6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 06:22:13 +0000 Subject: [PATCH 4/5] Address code review feedback - Refactor array handling to use switch statement for clarity - Add tests for malformed arrays (mixed types, non-strings) - All tests passing Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/mcp_config_serena_renderer.go | 37 +++++++++---------- .../serena_container_selection_test.go | 10 +++++ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/pkg/workflow/mcp_config_serena_renderer.go b/pkg/workflow/mcp_config_serena_renderer.go index 73ac97461f..bb523c60b1 100644 --- a/pkg/workflow/mcp_config_serena_renderer.go +++ b/pkg/workflow/mcp_config_serena_renderer.go @@ -15,23 +15,22 @@ func selectSerenaContainer(serenaTool any) string { // Extract languages from the serena tool configuration var requestedLanguages []string - // Handle direct array format (from ToMap conversion of short syntax) - if langArray, ok := serenaTool.([]any); ok { - for _, lang := range langArray { + // Handle different input formats + switch tool := serenaTool.(type) { + case []any: + // Direct array format (from ToMap conversion of short syntax) + for _, lang := range tool { if langStr, ok := lang.(string); ok { requestedLanguages = append(requestedLanguages, langStr) } } - } - - // Handle []string format (another possible array representation) - if langStrArray, ok := serenaTool.([]string); ok { - requestedLanguages = append(requestedLanguages, langStrArray...) - } - - if toolMap, ok := serenaTool.(map[string]any); ok { + case []string: + // String array format (another possible array representation) + requestedLanguages = append(requestedLanguages, tool...) + case map[string]any: + // Map format with language configuration // Check for short syntax (array of language names) - if langs, ok := toolMap["langs"].([]any); ok { + if langs, ok := tool["langs"].([]any); ok { for _, lang := range langs { if langStr, ok := lang.(string); ok { requestedLanguages = append(requestedLanguages, langStr) @@ -40,18 +39,16 @@ func selectSerenaContainer(serenaTool any) string { } // Check for detailed language configuration - if langs, ok := toolMap["languages"].(map[string]any); ok { + if langs, ok := tool["languages"].(map[string]any); ok { for langName := range langs { requestedLanguages = append(requestedLanguages, langName) } } - } - - // If we parsed serena from SerenaToolConfig - if serenaConfig, ok := serenaTool.(*SerenaToolConfig); ok { - requestedLanguages = append(requestedLanguages, serenaConfig.ShortSyntax...) - if serenaConfig.Languages != nil { - for langName := range serenaConfig.Languages { + case *SerenaToolConfig: + // SerenaToolConfig struct format + requestedLanguages = append(requestedLanguages, tool.ShortSyntax...) + if tool.Languages != nil { + for langName := range tool.Languages { requestedLanguages = append(requestedLanguages, langName) } } diff --git a/pkg/workflow/serena_container_selection_test.go b/pkg/workflow/serena_container_selection_test.go index 98d5a1f49c..849e53a421 100644 --- a/pkg/workflow/serena_container_selection_test.go +++ b/pkg/workflow/serena_container_selection_test.go @@ -104,6 +104,16 @@ func TestSelectSerenaContainer(t *testing.T) { serenaTool: []string{"go"}, expectedContainer: constants.OraiosSerenaContainer, }, + { + name: "array with mixed types - only extracts strings", + serenaTool: []any{"go", 123, nil, "typescript"}, + expectedContainer: constants.OraiosSerenaContainer, // Has "go" + }, + { + name: "array with only non-strings - uses default", + serenaTool: []any{123, nil, true}, + expectedContainer: constants.DefaultSerenaMCPServerContainer, + }, } for _, tt := range tests { From d7c1baafe77f97b751c79f58bdbed231f99ee967 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:25:36 +0000 Subject: [PATCH 5/5] Revert Go language exclusion - test with latest Serena container As requested by @lpcox, testing with the latest ghcr.io/github/serena-mcp-server:latest to check if Go support has been added upstream. Changes: - Reverted removal of "go" from DefaultSerenaMCPServerContainer supported languages - Kept the array handling bug fix in selectSerenaContainer() - Added array format test cases ([]any, []string, mixed types) - All workflows now use default Serena container for Go This assumes the upstream container has been updated with Go runtime support. Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com> --- .github/workflows/archie.lock.yml | 2 +- .github/workflows/cloclo.lock.yml | 2 +- .../workflows/daily-compiler-quality.lock.yml | 2 +- .github/workflows/daily-file-diet.lock.yml | 2 +- .../daily-testify-uber-super-expert.lock.yml | 2 +- .../developer-docs-consolidator.lock.yml | 2 +- .../duplicate-code-detector.lock.yml | 4 +- .../workflows/glossary-maintainer.lock.yml | 2 +- .github/workflows/go-fan.lock.yml | 2 +- .github/workflows/mcp-inspector.lock.yml | 2 +- .github/workflows/q.lock.yml | 2 +- .../repository-quality-improver.lock.yml | 2 +- .github/workflows/sergo.lock.yml | 2 +- .github/workflows/smoke-claude.lock.yml | 2 +- .github/workflows/smoke-codex.lock.yml | 4 +- .github/workflows/smoke-copilot.lock.yml | 2 +- .github/workflows/terminal-stylist.lock.yml | 2 +- .github/workflows/typist.lock.yml | 2 +- pkg/constants/constants.go | 5 +- pkg/workflow/importable_tools_test.go | 19 +++--- pkg/workflow/mcp_config_comprehensive_test.go | 2 +- .../serena_container_selection_test.go | 66 ++++--------------- 22 files changed, 41 insertions(+), 91 deletions(-) diff --git a/.github/workflows/archie.lock.yml b/.github/workflows/archie.lock.yml index 0aa3a03d02..a2ae66bf2e 100644 --- a/.github/workflows/archie.lock.yml +++ b/.github/workflows/archie.lock.yml @@ -437,7 +437,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/cloclo.lock.yml b/.github/workflows/cloclo.lock.yml index 32829fa291..4159c92de0 100644 --- a/.github/workflows/cloclo.lock.yml +++ b/.github/workflows/cloclo.lock.yml @@ -594,7 +594,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/daily-compiler-quality.lock.yml b/.github/workflows/daily-compiler-quality.lock.yml index c498862a50..54053d7ed4 100644 --- a/.github/workflows/daily-compiler-quality.lock.yml +++ b/.github/workflows/daily-compiler-quality.lock.yml @@ -426,7 +426,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index 4ed60266d3..b16bb202a3 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -439,7 +439,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index c872a0174b..792120e151 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -449,7 +449,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/developer-docs-consolidator.lock.yml b/.github/workflows/developer-docs-consolidator.lock.yml index 2e04ac80b7..7c8518ad55 100644 --- a/.github/workflows/developer-docs-consolidator.lock.yml +++ b/.github/workflows/developer-docs-consolidator.lock.yml @@ -493,7 +493,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 8c137bbe83..dcd5a77556 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -439,7 +439,7 @@ jobs: Authorization = "$GH_AW_SAFE_OUTPUTS_API_KEY" [mcp_servers.serena] - container = "ghcr.io/oraios/serena:latest" + container = "ghcr.io/github/serena-mcp-server:latest" args = [ "--network", "host", @@ -476,7 +476,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/glossary-maintainer.lock.yml b/.github/workflows/glossary-maintainer.lock.yml index 54d1f562fa..293668a188 100644 --- a/.github/workflows/glossary-maintainer.lock.yml +++ b/.github/workflows/glossary-maintainer.lock.yml @@ -448,7 +448,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/go-fan.lock.yml b/.github/workflows/go-fan.lock.yml index 886ebd247f..9581c3ff18 100644 --- a/.github/workflows/go-fan.lock.yml +++ b/.github/workflows/go-fan.lock.yml @@ -429,7 +429,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index 3dd40a8b11..a37be17b45 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -699,7 +699,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index f5906fc556..efb9ce2ebd 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -562,7 +562,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/repository-quality-improver.lock.yml b/.github/workflows/repository-quality-improver.lock.yml index ed4706fef3..1fe0afdd3e 100644 --- a/.github/workflows/repository-quality-improver.lock.yml +++ b/.github/workflows/repository-quality-improver.lock.yml @@ -428,7 +428,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/sergo.lock.yml b/.github/workflows/sergo.lock.yml index 6d9f61d6dc..51de8a0402 100644 --- a/.github/workflows/sergo.lock.yml +++ b/.github/workflows/sergo.lock.yml @@ -430,7 +430,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index aaefe4df81..579330dd4c 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -1178,7 +1178,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index 10dd2a9c83..ef5259062e 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -1133,7 +1133,7 @@ jobs: Authorization = "$GH_AW_SAFE_OUTPUTS_API_KEY" [mcp_servers.serena] - container = "ghcr.io/oraios/serena:latest" + container = "ghcr.io/github/serena-mcp-server:latest" args = [ "--network", "host", @@ -1198,7 +1198,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 5d1c5200a4..722b0a4958 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1159,7 +1159,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/terminal-stylist.lock.yml b/.github/workflows/terminal-stylist.lock.yml index a632e77a1a..cef4176efe 100644 --- a/.github/workflows/terminal-stylist.lock.yml +++ b/.github/workflows/terminal-stylist.lock.yml @@ -409,7 +409,7 @@ jobs: }, "serena": { "type": "stdio", - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": ["--network", "host"], "entrypoint": "serena", "entrypointArgs": ["start-mcp-server", "--context", "codex", "--project", "${{ github.workspace }}"], diff --git a/.github/workflows/typist.lock.yml b/.github/workflows/typist.lock.yml index 26b876ccad..417c825347 100644 --- a/.github/workflows/typist.lock.yml +++ b/.github/workflows/typist.lock.yml @@ -417,7 +417,7 @@ jobs: } }, "serena": { - "container": "ghcr.io/oraios/serena:latest", + "container": "ghcr.io/github/serena-mcp-server:latest", "args": [ "--network", "host" diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index fe15b28088..3e7de73d82 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -333,12 +333,9 @@ const DefaultSerenaMCPServerContainer = "ghcr.io/github/serena-mcp-server" const OraiosSerenaContainer = "ghcr.io/oraios/serena" // SerenaLanguageSupport defines the supported languages for each Serena container image -// NOTE: Go is not included in DefaultSerenaMCPServerContainer as the container image -// does not have the Go runtime installed, which is required for gopls language server. -// Use OraiosSerenaContainer for Go support. var SerenaLanguageSupport = map[string][]string{ DefaultSerenaMCPServerContainer: { - "typescript", "javascript", "python", "java", "rust", "csharp", + "go", "typescript", "javascript", "python", "java", "rust", "csharp", "cpp", "c", "ruby", "php", "bash", "swift", "kotlin", "scala", "haskell", "elixir", "erlang", "clojure", "lua", "perl", "r", "dart", "julia", "fortran", "nix", "rego", "terraform", "yaml", diff --git a/pkg/workflow/importable_tools_test.go b/pkg/workflow/importable_tools_test.go index a4a5a9aa26..42194a92dc 100644 --- a/pkg/workflow/importable_tools_test.go +++ b/pkg/workflow/importable_tools_test.go @@ -155,10 +155,9 @@ Uses imported serena tool. t.Error("Expected compiled workflow to contain serena tool") } - // Verify serena container (should use Oraios for Go support) - if !strings.Contains(workflowData, "ghcr.io/oraios/serena:latest") && - !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { - t.Error("Expected compiled workflow to contain serena Docker container (Oraios or GitHub)") + // Verify serena container (now using Docker instead of uvx) + if !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { + t.Error("Expected compiled workflow to contain serena Docker container") } // Verify that language service setup steps are NOT present @@ -322,9 +321,8 @@ Uses all imported tools. if !strings.Contains(workflowData, "mcr.microsoft.com/playwright/mcp") { t.Error("Expected compiled workflow to contain playwright Docker image") } - if !strings.Contains(workflowData, "ghcr.io/oraios/serena:latest") && - !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { - t.Error("Expected compiled workflow to contain serena Docker container (Oraios or GitHub)") + if !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server:latest") { + t.Error("Expected compiled workflow to contain serena Docker container") } if !strings.Contains(workflowData, "example.com") { t.Error("Expected compiled workflow to contain example.com domain for playwright") @@ -406,10 +404,9 @@ Uses imported serena with language config. t.Error("Did not expect Node.js setup step (Serena runs in container)") } - // Verify serena container is present (should use Oraios for Go) - if !strings.Contains(workflowData, "ghcr.io/oraios/serena") && - !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server") { - t.Error("Expected serena to use Docker container (Oraios or GitHub)") + // Verify serena container is present + if !strings.Contains(workflowData, "ghcr.io/github/serena-mcp-server") { + t.Error("Expected serena to use Docker container") } } diff --git a/pkg/workflow/mcp_config_comprehensive_test.go b/pkg/workflow/mcp_config_comprehensive_test.go index 4192055287..ebdf841491 100644 --- a/pkg/workflow/mcp_config_comprehensive_test.go +++ b/pkg/workflow/mcp_config_comprehensive_test.go @@ -1163,7 +1163,7 @@ func TestRenderSerenaMCPConfigLocalMode(t *testing.T) { expectedContent: []string{ `"serena": {`, `"type": "stdio"`, - `"container": "ghcr.io/oraios/serena:latest"`, // Falls back to Oraios for Go + `"container": "ghcr.io/github/serena-mcp-server:latest"`, }, unexpectedContent: []string{ `"url"`, diff --git a/pkg/workflow/serena_container_selection_test.go b/pkg/workflow/serena_container_selection_test.go index 849e53a421..f95ebb9b01 100644 --- a/pkg/workflow/serena_container_selection_test.go +++ b/pkg/workflow/serena_container_selection_test.go @@ -22,38 +22,14 @@ func TestSelectSerenaContainer(t *testing.T) { expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "go language - falls back to Oraios", - serenaTool: map[string]any{ - "langs": []any{"go"}, - }, - expectedContainer: constants.OraiosSerenaContainer, - }, - { - name: "go with typescript - falls back to Oraios", + name: "supported languages - uses default", serenaTool: map[string]any{ "langs": []any{"go", "typescript"}, }, - expectedContainer: constants.OraiosSerenaContainer, - }, - { - name: "supported languages without go - uses default", - serenaTool: map[string]any{ - "langs": []any{"typescript", "python"}, - }, expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "all default supported languages - uses default", - serenaTool: map[string]any{ - "languages": map[string]any{ - "typescript": map[string]any{}, - "python": map[string]any{}, - }, - }, - expectedContainer: constants.DefaultSerenaMCPServerContainer, - }, - { - name: "go with detailed config - falls back to Oraios", + name: "all supported languages - uses default", serenaTool: map[string]any{ "languages": map[string]any{ "go": map[string]any{}, @@ -61,7 +37,7 @@ func TestSelectSerenaContainer(t *testing.T) { "python": map[string]any{}, }, }, - expectedContainer: constants.OraiosSerenaContainer, + expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { name: "unsupported language - still uses default", @@ -71,21 +47,14 @@ func TestSelectSerenaContainer(t *testing.T) { expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "SerenaToolConfig with go in short syntax - falls back to Oraios", + name: "SerenaToolConfig with short syntax", serenaTool: &SerenaToolConfig{ ShortSyntax: []string{"go", "rust"}, }, - expectedContainer: constants.OraiosSerenaContainer, - }, - { - name: "SerenaToolConfig without go - uses default", - serenaTool: &SerenaToolConfig{ - ShortSyntax: []string{"rust", "python"}, - }, expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "SerenaToolConfig with detailed languages without go - uses default", + name: "SerenaToolConfig with detailed languages", serenaTool: &SerenaToolConfig{ Languages: map[string]*SerenaLangConfig{ "python": {}, @@ -95,19 +64,19 @@ func TestSelectSerenaContainer(t *testing.T) { expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "array format with go - falls back to Oraios", + name: "array format with go - uses default", serenaTool: []any{"go"}, - expectedContainer: constants.OraiosSerenaContainer, + expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { - name: "string array format with go - falls back to Oraios", + name: "string array format with go - uses default", serenaTool: []string{"go"}, - expectedContainer: constants.OraiosSerenaContainer, + expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { name: "array with mixed types - only extracts strings", serenaTool: []any{"go", 123, nil, "typescript"}, - expectedContainer: constants.OraiosSerenaContainer, // Has "go" + expectedContainer: constants.DefaultSerenaMCPServerContainer, }, { name: "array with only non-strings - uses default", @@ -145,8 +114,7 @@ func TestSerenaLanguageSupport(t *testing.T) { } // Verify some expected languages are present in default container - // Note: "go" is NOT in the default container as it lacks Go runtime - expectedLangs := []string{"typescript", "python", "java", "rust"} + expectedLangs := []string{"go", "typescript", "python", "java", "rust"} for _, lang := range expectedLangs { found := false for _, supportedLang := range defaultLangs { @@ -159,16 +127,4 @@ func TestSerenaLanguageSupport(t *testing.T) { t.Errorf("Expected language '%s' not found in default container support list", lang) } } - - // Verify Go is in Oraios container - goFound := false - for _, lang := range oraiosLangs { - if lang == "go" { - goFound = true - break - } - } - if !goFound { - t.Error("Expected 'go' language in Oraios container support list") - } }