Zed (zed)
Output
.rules # canonical entry-point pointer body + inlined rules (written by sync)
.agents/skills/<name>/SKILL.md # one folder per skill (shared tree with codex/amp/crush)
.zed/settings.json # when MCP entries exist (merged with existing user config)
.zed/tasks.json # one task per hook, only when tasks-file is set
- Rules: Zed 1.4.2 retired its rules library, so always-on project instructions are now an instruction file.
syncwrites the pointer body plus the sentinel-marked## Rulesblock to the root.rules. Zed reads the first matching file from.rules,.cursorrules,.windsurfrules,.clinerules,.github/copilot-instructions.md,AGENT.md,AGENTS.md,CLAUDE.md,GEMINI.mdand stops there.AGENTS.mdis rank 7, behind Copilot's entry-point at rank 5, which carries the pointer body alone since Copilot delivers its rules through.github/instructions/, so writing the rules toAGENTS.mdleft Zed with none of them whenever copilot was enabled too (target-audit 2026-08-27, #624)..rulesis rank 1 and nothing agnostic-ai emits can outrank it.- Zed still calls
AGENTS.mdits primary instruction file and.rulesa compatibility one, so a Zed release dropping.rulesmoves this back. Setoutputs.zed.rules-file: .rulesto replace the pointer body with the legacy merged document (which also carries agent bodies) for older Zed versions.
- Skills: native Zed skills folders at
.agents/skills/<name>/SKILL.md, the cross-tool path codex, amp, and crush emit too. Identical rendered bytes dedupe into one write; divergentx-zedoverrides surface through the collision check. Zed also documentsdisable-model-invocation("Set to true to hide from the agent's catalog (invocable via slash command or @-mention only)"): it reaches the emitted file viax-zed: {disable-model-invocation: true}, since this renderer merges onlyx-zedkeys. A plain top-leveldisable-model-invocation:field, the form Cursor promotes to a native key, has no effect here. - Agents: no per-agent surface in current Zed; sync prints a coverage note unless
outputs.zed.rules-fileis set (the merged document carries agent sections). - MCP: written into
.zed/settings.jsonundercontext_servers(Zed's key, notmcpServers). Stdio servers use a flatcommand/args/envshape; remote (HTTP / SSE) servers use a nativeurl/headersshape. A spec'sdisabled: trueemits as Zed's ownenabled: false; an enabled server gets no key, since Zed defaults it to true.- That toggle is file-backed, not UI-only. The evidence is Zed's Rust settings struct rather than its docs: every variant of
ContextServerSettingsContentincrates/settings_content/src/project.rscarries/// Whether the context server is enabled.over#[serde(default = "default_true")] enabled: bool, andcontext_serversis a field ofProjectSettingsContent, the struct.zed/settings.jsondeserializes into (target-audit 2026-08-27, #641). zed.dev/docs/ai/mcp names none of it; its onlyenabled-family key isenable_all_context_servers, an agent-profile key rather than a per-server one, which is why earlier audits missed this. - The same source carries three more per-server fields no doc page names:
timeouton either transport,oauthon an HTTP server, andremoteon stdio and extension servers. Those reach the file throughx-zed, since no other target documents a same-named field with the same meaning.timeoutis on both transports because theStdiovariant#[serde(flatten)]sContextServerCommand, whose own field reads "Timeout for tool calls in seconds. Defaults to 60 if not specified" (target-audit 2026-09-11, #737). - User-managed keys (theme, buffer_font_size) are preserved. See
disabledsupport by target.
- That toggle is file-backed, not UI-only. The evidence is Zed's Rust settings struct rather than its docs: every variant of
- Hooks: when
outputs.zed.tasks-fileis set, hook specs emit as Zed Tasks usingsh -c "<hook command>".WorktreeCreatewriteshooks: ["create_worktree"], so Zed runs the task after creating a linked worktree; import restores that event. Tasks without that hook import asOnDemandand run from the command palette. The adapter manageslabel,command,args, andhooks. Any other documented Zed Task field passes through underx-zed, such ascwd,env,shell,reveal,hide,save,allow_concurrent_runs,use_new_terminal,tags, andreevaluate_context.hooksis managed soWorktreeCreatecan addcreate_worktreewithout dropping other native hook names.
Zed skill names must contain 1-64 lowercase letters or digits, with single hyphens between segments. Invalid names such as Deploy, my_skill, and my--skill fail sync with the name and required format; they are not renamed.
Config keys
| Key | Default | Notes |
|---|---|---|
outputs.zed.skills-dir | .agents/skills | |
outputs.zed.mcp-file | .zed/settings.json | |
outputs.zed.tasks-file | empty | opt-in |
outputs.zed.rules-file | unset | writes the legacy merged document and skips the pointer-body write, so pointing it at .rules replaces the entry-point rather than colliding with it |
Import
agnostic-ai import zed reads .rules, .zed/tasks.json (back into hook specs, as described under Hooks), and MCP servers from .zed/settings.json. It copies .agents/skills/<name>/SKILL.md and all bundled assets.
Verify
- Install Zed from zed.dev.
- Check the tree:
ls .rules .agents/skills/ .zed/settings.json .zed/tasks.json,test -f .agents/skills/*/SKILL.md,python -m json.tool .zed/settings.json > /dev/null,python -m json.tool .zed/tasks.json > /dev/null. - Open the project. The agent panel reads
.rulesas project instructions and lists each.agents/skills/<name>/as a skill (@skill/ slash command). - The MCP picker shows each
context_servers.<name>ready. - The command palette runs every entry from
.zed/tasks.jsonas a Zed Task.