From 808b4c8307fe62674d5ebf74dff64e53103b06b6 Mon Sep 17 00:00:00 2001 From: Samuel K <69881238+skevetter@users.noreply.github.com> Date: Mon, 28 Sep 2026 23:35:18 -0600 Subject: [PATCH] fix(agentcontainer): format VS Code settings log --- cmd/internal/agentcontainer/setup.go | 17 ++++++++-- .../agentcontainer/setup_internal_test.go | 34 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/cmd/internal/agentcontainer/setup.go b/cmd/internal/agentcontainer/setup.go index b06dd77488..c5e593f1af 100644 --- a/cmd/internal/agentcontainer/setup.go +++ b/cmd/internal/agentcontainer/setup.go @@ -750,7 +750,11 @@ func (cmd *SetupContainerCmd) setupVSCode( ) error { log.Debugf("setup %s", flavor.DisplayName()) vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) - log.Debugf("vscode settings: %v", vsCodeConfiguration.Settings) + formattedSettings, err := formatVSCodeSettings(vsCodeConfiguration.Settings) + if err != nil { + return err + } + log.Debugf("vscode settings:\n%s", formattedSettings) settings := "" if len(vsCodeConfiguration.Settings) > 0 { out, err := json.Marshal(vsCodeConfiguration.Settings) @@ -762,7 +766,7 @@ func (cmd *SetupContainerCmd) setupVSCode( } user := config.GetRemoteUser(setupInfo) - err := vscode.NewVSCodeServer(vscode.ServerOptions{ + err = vscode.NewVSCodeServer(vscode.ServerOptions{ Extensions: vsCodeConfiguration.Extensions, Settings: settings, UserName: user, @@ -805,6 +809,15 @@ func (cmd *SetupContainerCmd) setupVSCode( }) } +func formatVSCodeSettings(settings map[string]any) (string, error) { + formatted, err := json.MarshalIndent(settings, "", " ") + if err != nil { + return "", err + } + + return string(formatted), nil +} + // setupBrowserIDE installs and starts any of the browser-based IDEs // (openvscode, code-server, VS Code Web). The per-IDE differences live in the // browserIDEs registry, so the install/extensions/start flow is written once. diff --git a/cmd/internal/agentcontainer/setup_internal_test.go b/cmd/internal/agentcontainer/setup_internal_test.go index aab746e01e..94b6fe006f 100644 --- a/cmd/internal/agentcontainer/setup_internal_test.go +++ b/cmd/internal/agentcontainer/setup_internal_test.go @@ -62,6 +62,40 @@ func TestCompressSetupInfoPreservesSubstitutedValues(t *testing.T) { assert.Equal(t, "/home/testuser", *gotHome) } +func TestFormatVSCodeSettings(t *testing.T) { + settings := map[string]any{ + "python": map[string]any{ + "editor.defaultFormatter": "ms-python.autopep8", + }, + "editor": map[string]any{ + "codeActionsOnSave": []any{"source.organizeImports", "source.fixAll"}, + }, + } + + formatted, err := formatVSCodeSettings(settings) + require.NoError(t, err) + assert.Equal(t, `{ + "editor": { + "codeActionsOnSave": [ + "source.organizeImports", + "source.fixAll" + ] + }, + "python": { + "editor.defaultFormatter": "ms-python.autopep8" + } +}`, formatted) + + repeated, err := formatVSCodeSettings(settings) + require.NoError(t, err) + assert.Equal(t, formatted, repeated) +} + +func TestFormatVSCodeSettingsReturnsSerializationError(t *testing.T) { + _, err := formatVSCodeSettings(map[string]any{"unsupported": func() {}}) + require.Error(t, err) +} + func TestSecretsEnvRoundTripPreservesMultilineValues(t *testing.T) { entries := []string{ "TLS_KEY=-----BEGIN KEY-----\nline1\nline2\n-----END KEY-----",