From 00ba950cd980bad8ea19e7e89aea54b391450de9 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Sat, 23 May 2026 20:15:24 +0100 Subject: [PATCH] zed: delete context_servers key to fix serde parse error; update tests --- .crew/audit/prune.jsonl | 1 + internal/adapters/zed/zed.go | 14 +++++++++++--- internal/adapters/zed/zed_test.go | 20 +++++++------------- 3 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 .crew/audit/prune.jsonl diff --git a/.crew/audit/prune.jsonl b/.crew/audit/prune.jsonl new file mode 100644 index 0000000..c854baa --- /dev/null +++ b/.crew/audit/prune.jsonl @@ -0,0 +1 @@ +{"action":"prune","keep":10,"kept":[],"removed":[],"auditedAt":"2026-05-23T19:08:40.613Z"} diff --git a/internal/adapters/zed/zed.go b/internal/adapters/zed/zed.go index e780b57..d730ff9 100644 --- a/internal/adapters/zed/zed.go +++ b/internal/adapters/zed/zed.go @@ -52,7 +52,7 @@ func (a *Adapter) Capabilities() adapter.HarnessCapabilities { return adapter.HarnessCapabilities{ ManagesProviders: true, ManagesModels: true, - ManagesMCP: true, + ManagesMCP: false, // Agent panel uses Extensions; context_servers key causes serde parse errors ManagesSkills: false, ManagesInstructions: false, HasBuiltInSub: false, @@ -67,14 +67,22 @@ func (a *Adapter) Detect() bool { // Render produces the FileSet that applies the canonical bundle to Zed. // settings.json is MERGED to preserve all user-managed Zed configuration. -// Manages: context_servers (MCP), language_models.openai, agent.default_model. +// Manages: language_models.openai_compatible, agent.default_model. +// +// NOTE: context_servers is NOT written. Zed 1.3+ uses Extension-based MCP +// servers in the Agent panel; writing context_servers causes a serde parse +// error (ContextServerSettingsContent untagged enum bug) that aborts loading +// the entire settings.json. We clear any existing context_servers key to fix +// pre-existing parse errors from user-configured entries. func (a *Adapter) Render(b *canonical.Bundle) (*adapter.FileSet, error) { fs := adapter.NewFileSet() cfgPath := filepath.Join(a.home, ".config", "zed", "settings.json") existing, _ := os.ReadFile(cfgPath) + // Set context_servers to nil so MergeJSONKeys removes the key entirely, + // clearing any entries that trigger the serde ContextServerSettingsContent bug. overlay := map[string]any{ - "context_servers": common.BuildMCPMapStyled(&b.MCP, common.MCPZedStyle), + "context_servers": nil, } if b.Profile.Gateway.URL != "" { diff --git a/internal/adapters/zed/zed_test.go b/internal/adapters/zed/zed_test.go index bab4860..ab08ad8 100644 --- a/internal/adapters/zed/zed_test.go +++ b/internal/adapters/zed/zed_test.go @@ -58,13 +58,9 @@ func TestZedRenderProducesExpectedTargets(t *testing.T) { gw := oc["harness-sync-gateway"].(map[string]any) assert.Equal(t, "https://llmgw.example.com/v1", gw["api_url"]) - // context_servers — no "enabled" or "source" (Zed serde bug workaround). - cs := parsed["context_servers"].(map[string]any) - fp := cs["filepuff"].(map[string]any) - assert.Equal(t, "/bin/filepuff", fp["command"]) - assert.Equal(t, []any{"--serve"}, fp["args"]) - assert.NotContains(t, fp, "enabled") - assert.NotContains(t, fp, "source") + // context_servers must be absent — Zed serde untagged-enum bug aborts + // settings loading when this key is present; we delete it via nil overlay. + assert.NotContains(t, parsed, "context_servers") } func TestZedRenderMergesExistingKeys(t *testing.T) { @@ -96,9 +92,9 @@ func TestZedRenderMergesExistingKeys(t *testing.T) { assert.Equal(t, "One Dark", parsed["theme"]) assert.Equal(t, float64(16), parsed["font_size"]) assert.Equal(t, true, parsed["vim_mode"]) - // Managed keys present. + // Managed keys present; context_servers absent (serde bug — we delete it). assert.Contains(t, parsed, "agent") - assert.Contains(t, parsed, "context_servers") + assert.NotContains(t, parsed, "context_servers") } func TestZedRenderNoMCP(t *testing.T) { @@ -118,10 +114,8 @@ func TestZedRenderNoMCP(t *testing.T) { cfgDest := filepath.Join(home, ".config", "zed", "settings.json") var parsed map[string]any require.NoError(t, json.Unmarshal(seen[cfgDest].Content, &parsed)) - // context_servers key present but empty map. - cs, ok := parsed["context_servers"] - assert.True(t, ok) - assert.Empty(t, cs) + // context_servers must be absent (nil overlay deletes the key). + assert.NotContains(t, parsed, "context_servers") } func TestZedRenderEmitsLanguageModelsOpenAICompatible(t *testing.T) {