From 2934656f996ceb056032a82893391657c70b0efd Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Jul 2026 11:50:17 +0000 Subject: [PATCH 1/3] docs: editor release research for July 2026 Add research documents for Claude Code 2.1.215, Codex 0.144.6, Copilot CLI 1.0.71, Cursor 3.11, Gemini CLI 0.51.0, OpenCode 1.18.3, Windsurf/Devin Desktop 3.4.27, and Zed 1.11.3, plus an implementation plan covering the follow-ups (Windsurf user-scope hooks path, Copilot project MCP target, filename/description validations, and changelog URL moves). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01HCX71AiLij6vrJy5o1n6UR --- docs/editor-research/claude-code/2.1.215.md | 72 +++++++++++++ docs/editor-research/codex/0.144.6.md | 67 ++++++++++++ docs/editor-research/copilot/1.0.71.md | 54 ++++++++++ docs/editor-research/cursor/3.11.md | 38 +++++++ docs/editor-research/gemini/0.51.0.md | 55 ++++++++++ docs/editor-research/opencode/1.18.3.md | 49 +++++++++ docs/editor-research/windsurf/3.4.27.md | 63 +++++++++++ docs/editor-research/zed/1.11.3.md | 61 +++++++++++ docs/implementation-plan.md | 113 ++++++++++++++++++++ 9 files changed, 572 insertions(+) create mode 100644 docs/editor-research/claude-code/2.1.215.md create mode 100644 docs/editor-research/codex/0.144.6.md create mode 100644 docs/editor-research/copilot/1.0.71.md create mode 100644 docs/editor-research/cursor/3.11.md create mode 100644 docs/editor-research/gemini/0.51.0.md create mode 100644 docs/editor-research/opencode/1.18.3.md create mode 100644 docs/editor-research/windsurf/3.4.27.md create mode 100644 docs/editor-research/zed/1.11.3.md create mode 100644 docs/implementation-plan.md diff --git a/docs/editor-research/claude-code/2.1.215.md b/docs/editor-research/claude-code/2.1.215.md new file mode 100644 index 0000000..c8d5190 --- /dev/null +++ b/docs/editor-research/claude-code/2.1.215.md @@ -0,0 +1,72 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "claude-code" +editor_version: "2.1.215" +sources: + - "https://code.claude.com/docs/en/changelog" + - "https://www.npmjs.com/package/@anthropic-ai/claude-code" +--- + +## Changes affecting aix + +- Claude Code 2.1.214 changed hook `if:` glob semantics: a single-segment `dir/**` + condition now matches only `/dir`, and `**/dir/**` is required for any-depth + matching. + - aix status: needs follow-up. aix passes the `if` field through on Claude Code + command hooks (`packages/core/src/editors/strategies/claude-code/hooks.ts`), so + user-authored patterns can change meaning under 2.1.214. No format change is + needed, but docs or a lint-style warning for single-segment `dir/**` patterns + would help migrating users. +- Claude Code 2.1.214 made `SessionStart` hooks report `source: "fork"` when a session + begins as a fork, and 2.1.198 added `Notification` hook payloads + `agent_needs_input` / `agent_completed` for background agents. + - aix status: no config schema change needed. aix writes hook definitions, not + runtime payload schemas, and `SessionStart` / `Notification` are already valid + event names in the supported list. +- Claude Code 2.1.178 added nested `.claude/skills/` discovery (with `:` + disambiguation) and closest-wins resolution for nested `.claude/` agents, workflows, + and output styles; 2.1.211 and 2.1.195 fixed nested `.claude/rules/*.md` loading. + - aix status: no implementation change needed. aix writes top-level `.claude/` + directories, which remain valid; nested discovery is additive editor behavior. +- Claude Code 2.1.178 added `Tool(param:value)` permission-rule syntax and 2.1.200 + renamed the "default" permission mode to "manual" (`"defaultMode": "manual"`). + - aix status: no implementation change needed today. aix does not generate Claude + Code permission rules or `defaultMode`. Re-check if aix adds a portable + permissions feature. +- Claude Code 2.1.196 stopped `claude mcp list` / `get` from spawning `.mcp.json` + servers that were self-approved via a committed `.claude/settings.json`. + - aix status: no format change needed. aix `.mcp.json` output is unchanged; users + may see extra approval steps at runtime. +- Claude Code 2.1.169 added `--safe-mode` / `CLAUDE_CODE_SAFE_MODE` (disables all + customizations) and `disableBundledSkills`. + - aix status: no config change needed, but safe mode disables aix-written rules, + prompts, skills, agents, and hooks at runtime. Worth a docs note if users report + aix output "not loading". +- Claude Code 2.1.207 stopped reading plugin option values from project-level + `.claude/settings.json` and rejected `${user_config.*}` in shell-form plugin hook + commands. + - aix status: no implementation change needed. aix does not generate Claude Code + plugin manifests or plugin options; aix-managed hooks in `.claude/settings.json` + are not plugin hooks. +- Claude Code 2.1.172 / 2.1.198 changed subagent execution: subagents run in the + background by default, can nest up to 5 levels, and are capped per session + (`CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION`). + - aix status: no config schema change needed. aix agent frontmatter + (`description`, `mode`, `model`, `tools`, `permissions`, `mcp`) is unchanged by + these runtime behaviors. +- Claude Code 2.1.166–2.1.215 added many new settings keys (`axScreenReader`, + `vimInsertModeRemaps`, `sandbox.credentials`, `autoMode.classifyAllShell`, + `language`, `attribution.sessionUrl`, `enforceAvailableModels`, and others). + - aix status: no implementation change needed, but aix's section-managed writes to + `.claude/settings.json` must keep preserving unknown keys. Existing merge behavior + should be covered by tests before any hooks change. + +## Baseline evidence + +- `packages/core/src/editors/strategies/claude-code/hooks.ts` owns Claude Code hook + output, including the `if` passthrough field. +- `packages/core/src/editors/strategies/claude-code/mcp.ts` owns Claude Code MCP output. +- `packages/core/src/editors/adapters/claude-code.ts` wires rules, prompts, MCP, skills, + agents, and hooks for Claude Code. +- `packages/schema/src/editor-support.ts` lists the supported Claude Code hook events, + including `SessionStart` and `Notification`. diff --git a/docs/editor-research/codex/0.144.6.md b/docs/editor-research/codex/0.144.6.md new file mode 100644 index 0000000..aac4b6a --- /dev/null +++ b/docs/editor-research/codex/0.144.6.md @@ -0,0 +1,67 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "codex" +editor_version: "0.144.6" +sources: + - "https://learn.chatgpt.com/docs/changelog" + - "https://github.com/openai/codex/releases" + - "https://www.npmjs.com/package/@openai/codex" + - "https://releasebot.io/updates/openai/codex" +--- + +## Changes affecting aix + +- The official Codex changelog moved: `https://developers.openai.com/codex/changelog` + now returns a 308 redirect to `https://learn.chatgpt.com/docs/changelog`. + - aix status: needs follow-up in this repo only for the + `examples/custom/skills/editor-release-research/SKILL.md` source hints, which + still list the old URL. No generated editor config is affected. +- Codex 0.144.0 added a `writes` app-approval mode (declared read-only actions run + without prompting; writes still prompt). + - aix status: no implementation change needed. aix does not write Codex approval + or permission config. Re-check if aix adds a portable permissions feature. +- Codex 0.144.0 let MCP tools request interactive authentication without an + experimental opt-in, and 0.142.2/0.143.0 turned on MCP tool search by default. + - aix status: no config shape change needed. `~/.codex/config.toml` MCP entries that + aix writes are unchanged; these are runtime behaviors. +- Codex 0.140.0 made disabled MCP servers persist across runtime overlays, resolved MCP + server registrations through a catalog system, and added encrypted local storage for + CLI and MCP OAuth credentials. + - aix status: no implementation change needed. aix writes server definitions, not + enable/disable state or credentials. +- Codex 0.140.0 decoupled the skills extension from core and improved parallel skill + metadata reads (0.142.0); 0.142.0 also improved plugin loading across "multiple skill + paths". + - aix status: no path change identified. aix-managed skills at + `.agents/skills/{name}/` and `~/.codex/skills/{name}/` remain the documented + surfaces. Re-verify skill paths in the Codex docs if a future release note names + new locations. +- Codex 0.142.0 extended remote environments to support executor-native `AGENTS.md` + discovery, and 0.140.0 made AGENTS.md loadable "from all bound environments". + - aix status: no implementation change needed. aix writes root and directory-level + AGENTS.md files, which remain the native rule surface. +- Codex 0.143.0 enabled remote plugins by default with npm marketplace sources. + - aix status: no implementation change needed. aix does not manage Codex plugins. +- Detailed official release notes for 0.136.0–0.141.0 are no longer exposed on the + changelog page or the visible GitHub releases pages. Externally sourced summaries + (releasebot.io, havoptic.com) describe 0.136 (archived sessions), 0.137 (TUI and + enterprise credit limits), 0.138 (Codex Desktop handoff), and 0.139 (code-mode web + search) with no config-surface changes. + - aix status: no implementation change identified for 0.136–0.141. These facts are + externally sourced; re-verify against official docs if any related bug reports + arrive. +- No hook-related changes were found for 0.136.0–0.144.6. + - aix status: no change to `.codex/hooks.json` output. The supported event list + (`PermissionRequest`, `PostToolUse`, `PreToolUse`, `SessionStart`, `Stop`, + `UserPromptSubmit`) remains current. + +## Baseline evidence + +- `packages/core/src/editors/strategies/codex/rules.ts` writes Codex AGENTS.md content. +- `packages/core/src/editors/strategies/codex/mcp.ts` writes global + `~/.codex/config.toml` MCP config. +- `packages/core/src/editors/strategies/codex/prompts.ts` converts prompts into skills. +- `packages/core/src/editors/strategies/codex/hooks.ts` maps supported aix hook events + into Codex `hooks.json`. +- `packages/schema/src/editor-support.ts` documents Codex support, including the + global-only MCP note and the prompt-to-skill shim. diff --git a/docs/editor-research/copilot/1.0.71.md b/docs/editor-research/copilot/1.0.71.md new file mode 100644 index 0000000..70e6ef6 --- /dev/null +++ b/docs/editor-research/copilot/1.0.71.md @@ -0,0 +1,54 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "copilot" +editor_version: "1.0.71" +sources: + - "https://raw.githubusercontent.com/github/copilot-cli/main/changelog.md" + - "https://www.npmjs.com/package/@github/copilot" +--- + +## Changes affecting aix + +- Copilot CLI 1.0.61 auto-loads MCP servers from the `.github/mcp.json` workspace + config file. + - aix status: needs follow-up. aix currently writes project Copilot MCP config to + `.mcp.json` and only imports `.github/mcp.json` as a fallback. Now that + `.github/mcp.json` is a documented first-class auto-load surface, verify whether + `.mcp.json` is still read by Copilot CLI and decide whether aix installs should + target `.github/mcp.json` instead (or in addition). +- Copilot CLI 1.0.63 rejects custom-agent names that would create hidden files. + - aix status: needs follow-up for validation only. aix writes agent files under + `.github/agents/*.md` from configured names; confirm aix name normalization can + never emit a leading-dot filename, and add a guard or test if it can. +- Copilot CLI 1.0.66 lets skills with the same name from different plugins coexist, and + 1.0.69 keeps embedded `/skill` tokens in skill prompt context. + - aix status: no implementation change needed. aix-managed skills under + `.github/skills/{name}/` and `~/.config/github-copilot/skills/{name}/` are + unaffected by plugin-skill namespacing. +- Copilot CLI 1.0.67–1.0.69 preserve custom-agent tool filters in nested subagents and + show warnings when host custom agents fail to load. + - aix status: no config schema change needed. This is runtime enforcement of the + existing `tools` frontmatter aix already writes. +- Copilot CLI 1.0.70 lets custom agents that request a shell tool by alias also receive + the matching read, list, and stop shell tools. + - aix status: no implementation change needed. aix passes `tools` lists through; + alias expansion happens in the editor. +- Copilot CLI 1.0.70 persists GitHub MCP toolset/tool config via `settings.json`, and + 1.0.61 added a `/settings` dialog plus a `tabs` setting. + - aix status: no implementation change needed. These are editor-managed settings + files, not surfaces aix generates. +- Copilot CLI 1.0.62 lets plugins ship extensions via the plugin marketplace. + - aix status: no implementation change needed. aix does not manage Copilot plugins. +- No hook event or hook schema changes were found in 1.0.61–1.0.71. + - aix status: no change to `.github/hooks/hooks.json` output or the supported event + list. + +## Baseline evidence + +- `packages/core/src/editors/strategies/copilot/hooks.ts` owns Copilot hook output. +- `packages/core/src/editors/strategies/copilot/prompts.ts` writes project prompt files + and converts user-scope prompts into skills. +- `packages/core/src/editors/adapters/copilot.ts` wires Copilot rules, prompts, MCP, + skills, agents, and hooks. +- `packages/schema/src/editor-support.ts` documents the `.mcp.json` project path with + the `.github/mcp.json` import fallback note. diff --git a/docs/editor-research/cursor/3.11.md b/docs/editor-research/cursor/3.11.md new file mode 100644 index 0000000..2bb47d2 --- /dev/null +++ b/docs/editor-research/cursor/3.11.md @@ -0,0 +1,38 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "cursor" +editor_version: "3.11" +sources: + - "https://cursor.com/changelog" +--- + +## Changes affecting aix + +- Cursor 3.9 added a Customize page that consolidates plugins, skills, MCPs, subagents, + rules, commands, and hooks, with user, team, or workspace-level customization. + - aix status: no generated config change identified. The changelog describes a + management UI over the existing surfaces aix writes (`.cursor/rules`, + `.cursor/commands`, `.cursor/agents`, `.cursor/skills`, `.cursor/mcp.json`, + `.cursor/hooks.json`). Re-check Cursor docs if team/workspace scopes gain + file-backed local config aix could target. +- Cursor 3.10 added team MCP server configuration distributed across cloud agents, IDE, + and CLI through team marketplaces. + - aix status: no implementation change needed. Team MCP distribution is + cloud-managed, not a local config file. aix project and user `mcp.json` output is + unchanged. +- Cursor 3.11 added side chats (`/side`, `/btw`) and conversation search; 3.9 added the + iOS app and marketplace leaderboard. + - aix status: no implementation change needed. These are editor UI features. +- No changes to rules, commands, agents, hooks events, skills paths, or AGENTS.md + compatibility were found in the 3.8–3.11 changelog entries. + - aix status: no change needed. The Cursor hook event list and config paths in + `packages/schema/src/editor-support.ts` remain current as documented. + +## Baseline evidence + +- `packages/core/src/editors/strategies/cursor/hooks.ts` writes Cursor hooks with a + `version: 1` wrapper and camelCase event names. +- `packages/core/src/editors/strategies/cursor/prompts.ts` writes `.cursor/commands/`. +- `packages/core/src/editors/strategies/shared/standard-mcp.ts` owns Cursor MCP output. +- `packages/core/src/editors/adapters/cursor.ts` wires Cursor native rules, commands, + MCP, skills, agents, and hooks. diff --git a/docs/editor-research/gemini/0.51.0.md b/docs/editor-research/gemini/0.51.0.md new file mode 100644 index 0000000..c56ab71 --- /dev/null +++ b/docs/editor-research/gemini/0.51.0.md @@ -0,0 +1,55 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "gemini" +editor_version: "0.51.0" +sources: + - "https://github.com/google-gemini/gemini-cli/releases" + - "https://github.com/google-gemini/gemini-cli/blob/main/docs/changelogs/index.md" + - "https://www.npmjs.com/package/@google/gemini-cli" + - "https://releasebot.io/updates/google/gemini-cli" +--- + +## Changes affecting aix + +- Gemini CLI 0.49.0 migrated the `coreTools` setting to `tools.core` in + `settings.json`. + - aix status: needs follow-up for verification only. aix writes `mcpServers` and + `hooks` blocks into `.gemini/settings.json` and does not emit `coreTools`, but the + merge path must preserve both old and new keys in user-owned settings. Confirm the + settings merge tests cover unknown-key preservation. +- Gemini CLI 0.49.0 added path-traversal prevention during skill install, and 0.51.0 + fixed a "symbolic link directory escape in memory import processor". + - aix status: needs follow-up for verification only. aix installs Gemini skills as + symlinks from `.gemini/skills/{name}/` (and `.agents/skills/`) into `.aix/skills/`. + Verify on a current Gemini CLI that symlinked skill directories and GEMINI.md + imports still load under the stricter symlink handling. +- Gemini CLI 0.47.0 shipped Antigravity transition banners and migration commands for + the Antigravity CLI (externally sourced from release summaries). + - aix status: needs follow-up as a watch item. If Gemini CLI rebrands or merges into + Antigravity the config directories (`.gemini/`, `~/.gemini/`) and context file + (`GEMINI.md`) could move, similar to the Windsurf → Devin Desktop rebrand. No path + change is documented yet, so no aix change now. +- Gemini CLI 0.50.0 added tool registry discovery for automated tool detection. + - aix status: no config shape change identified. MCP config in + `.gemini/settings.json` is unchanged. +- Gemini CLI 0.49.0 standardized tool output formatting, fixed zero-quota fail-fast + behavior, and pinned dependencies; 0.51.0 added caretaker service work and escape + sequence handling fixes. + - aix status: no implementation change needed. These are runtime behaviors. +- No changes to GEMINI.md handling, TOML command files, agent frontmatter, or hook + event names were found for 0.46.0–0.51.0. + - aix status: no change needed to Gemini rules, prompts, agents, or hooks output. + The 0.46.0–0.48.0 release notes are thinly documented upstream (the changelog + index only carries announcements for select versions); re-verify if a bug report + points at one of those versions. + +## Baseline evidence + +- `packages/core/src/editors/strategies/gemini/hooks.ts` writes hooks into + `.gemini/settings.json` alongside MCP config. +- `packages/core/src/editors/strategies/gemini/mcp.ts` owns Gemini MCP output. +- `packages/core/src/editors/strategies/gemini/prompts.ts` writes TOML command files. +- `packages/core/src/editors/adapters/gemini.ts` uses native Gemini skills under + `.gemini/skills/{name}/` with `.agents/skills/` compatibility. +- `packages/schema/src/editor-support.ts` documents Gemini's current aix feature + support, including the shared `settings.json` merge note. diff --git a/docs/editor-research/opencode/1.18.3.md b/docs/editor-research/opencode/1.18.3.md new file mode 100644 index 0000000..ba3a72d --- /dev/null +++ b/docs/editor-research/opencode/1.18.3.md @@ -0,0 +1,49 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "opencode" +editor_version: "1.18.3" +sources: + - "https://github.com/anomalyco/opencode/releases" + - "https://opencode.ai/docs/skills/" + - "https://www.npmjs.com/package/opencode-ai" +--- + +## Changes affecting aix + +- OpenCode 1.18.2 stopped subagents from launching nested subagents by default and + added a configurable `subagent_depth` limit. + - aix status: no implementation change needed today. aix does not write OpenCode + agent-depth settings. Re-check if aix's portable agent config grows a nesting or + depth field that should map to `subagent_depth`. +- The OpenCode skills docs now list a native `skill` tool plus pattern-based skill + permissions in `opencode.json` (`allow` / `deny` / `ask`, per-agent overrides, and + `skill: false` to disable). + - aix status: needs follow-up only if aix adds portable skill permissions. Skill + discovery paths are unchanged and match aix output: `.opencode/skills/`, + `.claude/skills/`, and `.agents/skills/` at project scope, with + `~/.config/opencode/skills/`, `~/.claude/skills/`, and `~/.agents/skills/` at + user scope. +- OpenCode 1.17.10 introduced namespaced plugin hook APIs and a V2 plugin API. + - aix status: no implementation change needed. These are JavaScript plugin surfaces, + not the lifecycle hook config files aix models; OpenCode hooks remain + `unsupported` in the aix matrix. +- OpenCode 1.17.12–1.17.14 added MCP resource template listing/read tools, a code-mode + MCP adapter, scoped MCP auth status per server URL, and preserved metadata in + paginated tool catalogs; 1.17.7 sends the current workspace as the MCP client root. + - aix status: no config shape change needed. `opencode.json` `mcp` entries that aix + writes are unchanged; these are runtime MCP behaviors. +- OpenCode 1.18.0 completed the Desktop v2 migration; 1.17.16–1.17.19 are composer and + model-picker UI changes. + - aix status: no implementation change needed. +- No changes to AGENTS.md handling, command files, or agent frontmatter were found in + 1.16.1–1.18.3. + - aix status: no change needed to OpenCode rules, prompts, or agents output. + +## Baseline evidence + +- `packages/core/src/editors/strategies/opencode/` owns OpenCode rules, prompts, MCP, + and skills output. +- `packages/core/src/editors/adapters/opencode.ts` wires OpenCode support and marks + hooks unsupported. +- `packages/schema/src/editor-support.ts` documents OpenCode paths, including + `.opencode/skills/{name}/` and the `.agents/skills/` compatibility note. diff --git a/docs/editor-research/windsurf/3.4.27.md b/docs/editor-research/windsurf/3.4.27.md new file mode 100644 index 0000000..35e54ce --- /dev/null +++ b/docs/editor-research/windsurf/3.4.27.md @@ -0,0 +1,63 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "windsurf" +editor_version: "3.4.27" +sources: + - "https://docs.devin.ai/desktop/changelog" + - "https://docs.devin.ai/desktop/cascade/hooks" +--- + +## Changes affecting aix + +- Windsurf's rebrand to Devin Desktop is now fully reflected in its web presence: + `https://windsurf.com/changelog` returns a 308 redirect to + `https://docs.devin.ai/desktop/changelog`. + - aix status: needs follow-up in two places. First, the + `examples/custom/skills/editor-release-research/SKILL.md` source hints still list + `windsurf.com` URLs. Second, decide whether aix should surface "Devin Desktop" + naming (display name, docs) while keeping the `windsurf` editor ID and `.windsurf` + paths, which the Devin docs still use for all config surfaces. +- The Devin Desktop hooks docs list the user-level hooks file at + `~/.codeium/windsurf/hooks.json` (Devin Desktop IDE) and `~/.codeium/hooks.json` + (JetBrains plugin), with workspace hooks at `.windsurf/hooks.json`. + - aix status: needs follow-up. aix writes user-scope Windsurf hooks to + `~/.windsurf/hooks.json` per `packages/schema/src/editor-support.ts`, which does + not match the documented `~/.codeium/windsurf/hooks.json` path. Verify against a + real install and correct the user-scope hooks path if aix is writing to an + unread location. +- The hooks docs confirm the same twelve events aix already maps + (`pre_read_code` … `post_setup_worktree`), hook fields `command`, `powershell`, + `show_output`, and `working_directory`, and exit-code-2 blocking for pre-hooks only. + - aix status: mostly no change. Event names and blocking semantics match aix output. + `show_output` and `working_directory` are documented fields aix does not currently + expose; consider passing them through if portable hook config grows equivalents. +- Devin Desktop 3.4.22 made skill `permissions:` frontmatter apply to auto-approvals. + - aix status: needs follow-up. aix-managed skills are symlinked from + `.windsurf/skills/{name}/` into `.aix/skills/`; if aix skill definitions carry + permission metadata, decide whether to emit Windsurf-compatible `permissions:` + frontmatter. No change if aix skills stay permissionless. +- Devin Desktop 3.3.18 made subagents configurable with a default model, and 3.2.16 let + subagents call MCP tools directly. + - aix status: needs follow-up for investigation. aix currently marks Windsurf agents + as `unsupported` because no safe file-backed agent config was documented. Check + whether Devin Desktop now documents a subagent config file aix could write; if so, + Windsurf agents support could be upgraded. +- Devin Desktop 3.4.22 added `sandbox.excluded` allow/ask/deny config, 3.3.18 added an + `attribution` option to the Devin Local config file, and 3.1.7 added `.devinignore` + support alongside `.windsurfignore` and `.codeiumignore`. + - aix status: no implementation change needed. aix does not manage sandbox settings, + attribution config, or ignore files for Windsurf. +- Devin Desktop 3.2.16 added an opt-in enterprise plugin system (preview). + - aix status: no implementation change needed. aix does not manage Windsurf plugins. + +## Baseline evidence + +- `packages/core/src/editors/strategies/windsurf/hooks.ts` maps aix hook events to the + twelve snake_case Windsurf events. +- `packages/core/src/editors/strategies/windsurf/skills.ts` owns Windsurf skill output. +- `packages/core/src/editors/strategies/windsurf/mcp.ts` owns global-only Windsurf MCP + output at `~/.codeium/windsurf/mcp_config.json`. +- `packages/core/src/editors/adapters/windsurf.ts` uses the `windsurf` editor ID and + `.windsurf` project directory. +- `packages/schema/src/editor-support.ts` currently documents user-scope hooks at + `~/.windsurf/hooks.json`, which conflicts with the Devin Desktop docs. diff --git a/docs/editor-research/zed/1.11.3.md b/docs/editor-research/zed/1.11.3.md new file mode 100644 index 0000000..990ccb9 --- /dev/null +++ b/docs/editor-research/zed/1.11.3.md @@ -0,0 +1,61 @@ +--- +research_performed_at: "2026-07-19T11:45:00+00:00" +editor_id: "zed" +editor_version: "1.11.3" +sources: + - "https://zed.dev/releases/stable" + - "https://zed.dev/releases/stable/1.6.3" + - "https://zed.dev/releases/stable/1.7.2" + - "https://releasebot.io/updates/zed" + - "https://byteiota.com/zed-1-4-2-agent-skills-agents-md-mcp/" +--- + +## Changes affecting aix + +- Zed 1.6.3 added a manual trigger for the Rules-to-Skills migration, and 1.7.2 fixed + old threads that mention Rules being inaccessible after migration. Zed's docs now + describe always-on guidance as "Instructions" (project `.rules` / AGENTS.md files and + the global AGENTS.md) while reusable on-demand rules became Skills. + - aix status: mostly no change, verification needed. aix already writes project + `.rules` and user `~/.config/zed/AGENTS.md`, and both remain documented instruction + surfaces per search results (`zed.dev/docs/ai/rules`, `zed.dev/docs/ai/skills` + were unreachable through the research proxy, so the docs facts here are externally + sourced). Verify the docs pages directly before renaming any aix-facing + terminology from "rules" to "instructions". +- Zed 1.6.3 added support for symlinked global skill directories and improved project + skills for remote workspaces. + - aix status: no change needed; this strengthens aix's approach. aix installs Zed + skills as symlinks into `.agents/skills/{name}/` and `~/.agents/skills/{name}/`, + which is now explicitly supported at global scope. +- Zed 1.7.2 moved agent skills management into the settings UI and now allows loading + skills whose descriptions exceed the 1024-byte limit (warning instead of failure). + - aix status: needs follow-up for validation only. aix skill descriptions flow into + SKILL.md frontmatter; consider warning when a description exceeds 1024 bytes so + Zed does not degrade or warn on aix-generated skills. +- Zed 1.10.0 moved key agent-related settings (LLM providers, external agents, MCP + servers) into the settings editor. + - aix status: needs follow-up for verification only. Externally sourced summaries + describe this as a settings-editor consolidation; confirm the `context_servers` + key that aix writes into `.zed/settings.json` and `~/.config/zed/settings.json` + is still the on-disk format and was not renamed. +- Zed 1.8.2 added `agent.terminal_init_command` and Anthropic-compatible provider + support; 1.9.0 added a remote MCP server quick-add entry in the Agent Panel. + - aix status: no implementation change needed. These are editor settings and UI + affordances; aix MCP output is unchanged. +- Zed 1.11.3 added terminal-thread search and turn-end slash commands (`/helpful`, + `/not-helpful`). + - aix status: no implementation change needed. Zed still has no file-based prompt + format, so aix's prompt-to-skill conversion remains correct. +- No hook support was found in any release through 1.11.3. + - aix status: no change; Zed hooks remain `unsupported` in the aix matrix. + +## Baseline evidence + +- `packages/core/src/editors/strategies/zed/rules.ts` writes project `.rules` and + user-scope `~/.config/zed/AGENTS.md`. +- `packages/core/src/editors/adapters/zed.ts` uses native Zed Agent Skills at + `.agents/skills/{name}/` and converts prompts to skills. +- `packages/core/src/editors/strategies/zed/mcp.ts` writes `context_servers` into Zed + settings files. +- `packages/schema/src/editor-support.ts` documents Zed rules, skills, MCP, and the + prompt-to-skill shim. diff --git a/docs/implementation-plan.md b/docs/implementation-plan.md new file mode 100644 index 0000000..6d3f456 --- /dev/null +++ b/docs/implementation-plan.md @@ -0,0 +1,113 @@ +# aix: Editor Integration Update Plan (2026-07-19) + +## 1) Context + +This plan is the output of an `editor-release-research` pass performed on 2026-07-19. +It is based on the eight research documents added in `docs/editor-research/` for: +Claude Code 2.1.215, Codex 0.144.6, Copilot CLI 1.0.71, Cursor 3.11, Gemini CLI +0.51.0, OpenCode 1.18.3, Windsurf/Devin Desktop 3.4.27, and Zed 1.11.3. + +Note: the research skill references `.aix/skills/plan/SKILL.md`, which does not exist +in this repository checkout, so this plan follows the structure of the previously +committed `docs/implementation-plan.md` instead. + +Note: an unmerged branch `editor-release-research-june-2026-18136254819821240469` +contains an earlier partial pass (including a `devin-desktop` adapter experiment). +This plan does not depend on it; reconcile or delete that branch when picking up the +work below. + +## 2) Summary + +No editor made a breaking change to a config surface aix writes. The highest-value +follow-ups are: correcting the Windsurf user-scope hooks path, deciding the Copilot +project MCP target file, and adding small validations (Copilot agent filenames, Zed +skill description length). Everything else is verification or watch-item work. + +## 3) Objectives & Scope + +- In scope: + - Verifying and correcting paths in `packages/schema/src/editor-support.ts`. + - Small strategy changes in `packages/core/src/editors/strategies/`. + - Updating the research skill's stale source-hint URLs. + - Updating each research document with resolution notes as items land. +- Out of scope: + - Modeling editor runtime behaviors (approval modes, subagent depth limits). + - Backfilling research for versions older than the previous checked versions. + - A `devin-desktop` editor ID split (tracked as an open question). + +## 4) Work Items + +### P1 — Likely bugs or user-visible gaps + +- WI-1 (Windsurf): Verify the user-scope hooks path. Devin Desktop docs say + `~/.codeium/windsurf/hooks.json`; aix writes `~/.windsurf/hooks.json`. If the docs + are right, fix `packages/core/src/editors/strategies/windsurf/hooks.ts` and + `packages/schema/src/editor-support.ts`, plus tests. + Research: `docs/editor-research/windsurf/3.4.27.md`. +- WI-2 (Copilot): Decide the project MCP target. Copilot CLI 1.0.61 auto-loads + `.github/mcp.json`; aix writes `.mcp.json` with `.github/mcp.json` as an import + fallback. Confirm whether `.mcp.json` is still read; if not, switch installs to + `.github/mcp.json` in the Copilot adapter and update the support matrix. + Research: `docs/editor-research/copilot/1.0.71.md`. + +### P2 — Validations and hardening + +- WI-3 (Copilot): Ensure generated agent filenames can never start with a dot + (Copilot 1.0.63 rejects hidden-file agent names). Add a normalization guard/test. + Research: `docs/editor-research/copilot/1.0.71.md`. +- WI-4 (Zed): Warn when a skill description exceeds 1024 bytes (Zed's documented + limit; oversized descriptions now warn in Zed 1.7.2). + Research: `docs/editor-research/zed/1.11.3.md`. +- WI-5 (Claude Code): Document (or warn on) single-segment `dir/**` hook `if:` + patterns, whose matching semantics changed in 2.1.214. + Research: `docs/editor-research/claude-code/2.1.215.md`. + +### P3 — Verification-only items + +- WI-6 (Zed): Confirm `context_servers` remains the on-disk MCP key in Zed settings + after the 1.10.0 settings-editor consolidation, and confirm `.rules` / + `~/.config/zed/AGENTS.md` remain documented instruction surfaces (Zed docs were + unreachable through the research proxy). +- WI-7 (Gemini): Confirm the `.gemini/settings.json` merge preserves unknown keys + (`coreTools` → `tools.core` migration) and that symlinked skills still load under + the 0.49.0/0.51.0 symlink hardening. +- WI-8 (Windsurf): Investigate whether Devin Desktop now documents a file-backed + subagent config (3.3.18 "subagents configurable with default model"); if so, + consider upgrading Windsurf agents from `unsupported`. +- WI-9 (Windsurf): Consider passing through documented hook fields `show_output` and + `working_directory`, and skill `permissions:` frontmatter (3.4.22), if portable + equivalents exist or are added. + +### P4 — Repo housekeeping + +- WI-10 (Skill): Update `examples/custom/skills/editor-release-research/SKILL.md` + source hints: Codex changelog moved to `https://learn.chatgpt.com/docs/changelog`; + Windsurf changelog moved to `https://docs.devin.ai/desktop/changelog`. +- WI-11 (Watch items, no code): Gemini CLI ↔ Antigravity transition (possible future + rebrand of `.gemini/` paths); Cursor team/workspace customization scopes (currently + cloud-managed, not file-backed); Windsurf "Devin Desktop" display naming. + +## 5) Research document upkeep + +For every work item above, when it is resolved (implemented, verified, or rejected), +update the matching research document's `aix status:` bullet in place with how it was +addressed, referencing the commit or test. The research documents to maintain are: + +- `docs/editor-research/claude-code/2.1.215.md` (WI-5) +- `docs/editor-research/codex/0.144.6.md` (WI-10) +- `docs/editor-research/copilot/1.0.71.md` (WI-2, WI-3) +- `docs/editor-research/cursor/3.11.md` (WI-11) +- `docs/editor-research/gemini/0.51.0.md` (WI-7, WI-11) +- `docs/editor-research/opencode/1.18.3.md` (no open items; watch `subagent_depth`) +- `docs/editor-research/windsurf/3.4.27.md` (WI-1, WI-8, WI-9, WI-10, WI-11) +- `docs/editor-research/zed/1.11.3.md` (WI-4, WI-6) + +## 6) Verification + +Run after any implementation work from this plan: + +```sh +npm run standards +npm test +npm run build +``` From 489bbf2c56cd514899f01f3856645c2d3c9377e9 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Jul 2026 12:02:14 +0000 Subject: [PATCH 2/3] fix: apply July 2026 editor research follow-ups - Correct Windsurf user-scope hooks path to ~/.codeium/windsurf/hooks.json, matching the Devin Desktop docs and aix's own site docs - Warn when a skill description exceeds the 1024-byte limit shared by Zed and OpenCode - Document the Claude Code 2.1.214 hook if-glob semantics change in the support matrix and note that Copilot documents both .mcp.json and .github/mcp.json for project MCP - Lock in hidden-filename protection for Copilot agents with a regression test and update the research skill's moved changelog URLs - Record resolutions in the research documents and implementation plan Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01HCX71AiLij6vrJy5o1n6UR --- docs/editor-research/claude-code/2.1.215.md | 9 ++- docs/editor-research/codex/0.144.6.md | 7 +- docs/editor-research/copilot/1.0.71.md | 19 ++--- docs/editor-research/gemini/0.51.0.md | 8 +-- docs/editor-research/windsurf/3.4.27.md | 29 ++++---- docs/editor-research/zed/1.11.3.md | 7 +- docs/implementation-plan.md | 69 ++++++++++--------- .../skills/editor-release-research/SKILL.md | 8 +-- .../src/__tests__/editors/adapters.test.ts | 20 +++++- .../editors/hooks-strategies.test.ts | 4 ++ .../src/__tests__/skills/validate.test.ts | 39 +++++++++++ .../core/src/editors/adapters/windsurf.ts | 3 +- .../src/editors/strategies/windsurf/hooks.ts | 5 +- packages/core/src/skills/validate.ts | 12 ++++ packages/schema/src/editor-support.ts | 5 +- 15 files changed, 165 insertions(+), 79 deletions(-) diff --git a/docs/editor-research/claude-code/2.1.215.md b/docs/editor-research/claude-code/2.1.215.md index c8d5190..57aa8d5 100644 --- a/docs/editor-research/claude-code/2.1.215.md +++ b/docs/editor-research/claude-code/2.1.215.md @@ -12,11 +12,10 @@ sources: - Claude Code 2.1.214 changed hook `if:` glob semantics: a single-segment `dir/**` condition now matches only `/dir`, and `**/dir/**` is required for any-depth matching. - - aix status: needs follow-up. aix passes the `if` field through on Claude Code - command hooks (`packages/core/src/editors/strategies/claude-code/hooks.ts`), so - user-authored patterns can change meaning under 2.1.214. No format change is - needed, but docs or a lint-style warning for single-segment `dir/**` patterns - would help migrating users. + - aix status: addressed 2026-07-19. aix passes the `if` field through unchanged + (`packages/core/src/editors/strategies/claude-code/hooks.ts`); the new matching + semantics are now documented in the Claude Code hooks notes in + `packages/schema/src/editor-support.ts`, which feeds the support matrix docs. - Claude Code 2.1.214 made `SessionStart` hooks report `source: "fork"` when a session begins as a fork, and 2.1.198 added `Notification` hook payloads `agent_needs_input` / `agent_completed` for background agents. diff --git a/docs/editor-research/codex/0.144.6.md b/docs/editor-research/codex/0.144.6.md index aac4b6a..3197a90 100644 --- a/docs/editor-research/codex/0.144.6.md +++ b/docs/editor-research/codex/0.144.6.md @@ -13,9 +13,10 @@ sources: - The official Codex changelog moved: `https://developers.openai.com/codex/changelog` now returns a 308 redirect to `https://learn.chatgpt.com/docs/changelog`. - - aix status: needs follow-up in this repo only for the - `examples/custom/skills/editor-release-research/SKILL.md` source hints, which - still list the old URL. No generated editor config is affected. + - aix status: addressed 2026-07-19. The + `examples/custom/skills/editor-release-research/SKILL.md` source hints now list + `https://learn.chatgpt.com/docs/changelog`. No generated editor config is + affected. - Codex 0.144.0 added a `writes` app-approval mode (declared read-only actions run without prompting; writes still prompt). - aix status: no implementation change needed. aix does not write Codex approval diff --git a/docs/editor-research/copilot/1.0.71.md b/docs/editor-research/copilot/1.0.71.md index 70e6ef6..5ee8e1b 100644 --- a/docs/editor-research/copilot/1.0.71.md +++ b/docs/editor-research/copilot/1.0.71.md @@ -11,15 +11,18 @@ sources: - Copilot CLI 1.0.61 auto-loads MCP servers from the `.github/mcp.json` workspace config file. - - aix status: needs follow-up. aix currently writes project Copilot MCP config to - `.mcp.json` and only imports `.github/mcp.json` as a fallback. Now that - `.github/mcp.json` is a documented first-class auto-load surface, verify whether - `.mcp.json` is still read by Copilot CLI and decide whether aix installs should - target `.github/mcp.json` instead (or in addition). + - aix status: verified 2026-07-19, no change needed. The Copilot CLI config-dir + reference documents both `.mcp.json` and `.github/mcp.json` as project-level MCP + files with equal standing ("Project-level MCP configurations (in `.mcp.json` or + `.github/mcp.json`) take precedence over user-level definitions"). aix keeps + writing `.mcp.json` (shared with Claude Code) and imports either path; the + support-matrix note was updated to say so. - Copilot CLI 1.0.63 rejects custom-agent names that would create hidden files. - - aix status: needs follow-up for validation only. aix writes agent files under - `.github/agents/*.md` from configured names; confirm aix name normalization can - never emit a leading-dot filename, and add a guard or test if it can. + - aix status: verified 2026-07-19, guard already present. `sanitizeFileName` in + `packages/core/src/editors/adapters/base.ts` converts non-alphanumerics to dashes + and strips leading dashes, so a leading-dot filename cannot be emitted; a + regression test was added in + `packages/core/src/__tests__/editors/adapters.test.ts`. - Copilot CLI 1.0.66 lets skills with the same name from different plugins coexist, and 1.0.69 keeps embedded `/skill` tokens in skill prompt context. - aix status: no implementation change needed. aix-managed skills under diff --git a/docs/editor-research/gemini/0.51.0.md b/docs/editor-research/gemini/0.51.0.md index c56ab71..082e91e 100644 --- a/docs/editor-research/gemini/0.51.0.md +++ b/docs/editor-research/gemini/0.51.0.md @@ -13,10 +13,10 @@ sources: - Gemini CLI 0.49.0 migrated the `coreTools` setting to `tools.core` in `settings.json`. - - aix status: needs follow-up for verification only. aix writes `mcpServers` and - `hooks` blocks into `.gemini/settings.json` and does not emit `coreTools`, but the - merge path must preserve both old and new keys in user-owned settings. Confirm the - settings merge tests cover unknown-key preservation. + - aix status: verified 2026-07-19, no change needed. aix does not emit `coreTools`, + and the existing test "preserves user-authored keys in .gemini/settings.json + across installs" in `packages/core/src/__tests__/editors/adapters.test.ts` covers + unknown-key preservation for both old and new key shapes. - Gemini CLI 0.49.0 added path-traversal prevention during skill install, and 0.51.0 fixed a "symbolic link directory escape in memory import processor". - aix status: needs follow-up for verification only. aix installs Gemini skills as diff --git a/docs/editor-research/windsurf/3.4.27.md b/docs/editor-research/windsurf/3.4.27.md index 35e54ce..d66ad6a 100644 --- a/docs/editor-research/windsurf/3.4.27.md +++ b/docs/editor-research/windsurf/3.4.27.md @@ -12,25 +12,24 @@ sources: - Windsurf's rebrand to Devin Desktop is now fully reflected in its web presence: `https://windsurf.com/changelog` returns a 308 redirect to `https://docs.devin.ai/desktop/changelog`. - - aix status: needs follow-up in two places. First, the - `examples/custom/skills/editor-release-research/SKILL.md` source hints still list - `windsurf.com` URLs. Second, decide whether aix should surface "Devin Desktop" - naming (display name, docs) while keeping the `windsurf` editor ID and `.windsurf` - paths, which the Devin docs still use for all config surfaces. + - aix status: partially addressed 2026-07-19. The + `examples/custom/skills/editor-release-research/SKILL.md` source hints now point + at `docs.devin.ai`. Display naming stays "Windsurf" with the `windsurf` editor ID + and `.windsurf` paths, which the Devin docs still use for all config surfaces; + revisit only if the editor changes its on-disk directories. - The Devin Desktop hooks docs list the user-level hooks file at `~/.codeium/windsurf/hooks.json` (Devin Desktop IDE) and `~/.codeium/hooks.json` (JetBrains plugin), with workspace hooks at `.windsurf/hooks.json`. - - aix status: needs follow-up. aix writes user-scope Windsurf hooks to - `~/.windsurf/hooks.json` per `packages/schema/src/editor-support.ts`, which does - not match the documented `~/.codeium/windsurf/hooks.json` path. Verify against a - real install and correct the user-scope hooks path if aix is writing to an - unread location. + - aix status: fixed 2026-07-19. `WindsurfHooksStrategy.getGlobalConfigPath()` and + the support matrix now use the documented `~/.codeium/windsurf/hooks.json` path + (the site docs already said this), with a test locking the path in + `packages/core/src/__tests__/editors/hooks-strategies.test.ts`. - The hooks docs confirm the same twelve events aix already maps (`pre_read_code` … `post_setup_worktree`), hook fields `command`, `powershell`, `show_output`, and `working_directory`, and exit-code-2 blocking for pre-hooks only. - - aix status: mostly no change. Event names and blocking semantics match aix output. - `show_output` and `working_directory` are documented fields aix does not currently - expose; consider passing them through if portable hook config grows equivalents. + - aix status: verified 2026-07-19, no change needed. Event names and blocking + semantics match aix output, and `WindsurfHooksStrategy` already passes + `show_output` and `working_directory` through on both install and import. - Devin Desktop 3.4.22 made skill `permissions:` frontmatter apply to auto-approvals. - aix status: needs follow-up. aix-managed skills are symlinked from `.windsurf/skills/{name}/` into `.aix/skills/`; if aix skill definitions carry @@ -59,5 +58,5 @@ sources: output at `~/.codeium/windsurf/mcp_config.json`. - `packages/core/src/editors/adapters/windsurf.ts` uses the `windsurf` editor ID and `.windsurf` project directory. -- `packages/schema/src/editor-support.ts` currently documents user-scope hooks at - `~/.windsurf/hooks.json`, which conflicts with the Devin Desktop docs. +- `packages/schema/src/editor-support.ts` documents user-scope hooks at + `~/.codeium/windsurf/hooks.json`, matching the Devin Desktop docs as of 2026-07-19. diff --git a/docs/editor-research/zed/1.11.3.md b/docs/editor-research/zed/1.11.3.md index 990ccb9..543bf5b 100644 --- a/docs/editor-research/zed/1.11.3.md +++ b/docs/editor-research/zed/1.11.3.md @@ -29,9 +29,10 @@ sources: which is now explicitly supported at global scope. - Zed 1.7.2 moved agent skills management into the settings UI and now allows loading skills whose descriptions exceed the 1024-byte limit (warning instead of failure). - - aix status: needs follow-up for validation only. aix skill descriptions flow into - SKILL.md frontmatter; consider warning when a description exceeds 1024 bytes so - Zed does not degrade or warn on aix-generated skills. + - aix status: addressed 2026-07-19. `validateSkill` in + `packages/core/src/skills/validate.ts` now warns when a skill description + exceeds 1024 bytes (the documented Zed and OpenCode limit), with tests in + `packages/core/src/__tests__/skills/validate.test.ts`. - Zed 1.10.0 moved key agent-related settings (LLM providers, external agents, MCP servers) into the settings editor. - aix status: needs follow-up for verification only. Externally sourced summaries diff --git a/docs/implementation-plan.md b/docs/implementation-plan.md index 6d3f456..b05a9cf 100644 --- a/docs/implementation-plan.md +++ b/docs/implementation-plan.md @@ -37,55 +37,60 @@ skill description length). Everything else is verification or watch-item work. ## 4) Work Items +Status updated 2026-07-19 after the implementation pass on this branch. + ### P1 — Likely bugs or user-visible gaps -- WI-1 (Windsurf): Verify the user-scope hooks path. Devin Desktop docs say - `~/.codeium/windsurf/hooks.json`; aix writes `~/.windsurf/hooks.json`. If the docs - are right, fix `packages/core/src/editors/strategies/windsurf/hooks.ts` and - `packages/schema/src/editor-support.ts`, plus tests. +- WI-1 (Windsurf) — DONE 2026-07-19: User-scope hooks path corrected to + `~/.codeium/windsurf/hooks.json` in + `packages/core/src/editors/strategies/windsurf/hooks.ts` and + `packages/schema/src/editor-support.ts`, with a locking test. The site docs already + documented the correct path, confirming the strategy was the outlier. Research: `docs/editor-research/windsurf/3.4.27.md`. -- WI-2 (Copilot): Decide the project MCP target. Copilot CLI 1.0.61 auto-loads - `.github/mcp.json`; aix writes `.mcp.json` with `.github/mcp.json` as an import - fallback. Confirm whether `.mcp.json` is still read; if not, switch installs to - `.github/mcp.json` in the Copilot adapter and update the support matrix. +- WI-2 (Copilot) — DONE 2026-07-19 (no code change): The Copilot CLI config-dir + reference documents both `.mcp.json` and `.github/mcp.json` as project MCP files, + so aix keeps writing `.mcp.json` and importing either. Support-matrix note updated. Research: `docs/editor-research/copilot/1.0.71.md`. ### P2 — Validations and hardening -- WI-3 (Copilot): Ensure generated agent filenames can never start with a dot - (Copilot 1.0.63 rejects hidden-file agent names). Add a normalization guard/test. +- WI-3 (Copilot) — DONE 2026-07-19: `sanitizeFileName` already prevents leading-dot + filenames; added a regression test covering hidden agent filenames. Research: `docs/editor-research/copilot/1.0.71.md`. -- WI-4 (Zed): Warn when a skill description exceeds 1024 bytes (Zed's documented - limit; oversized descriptions now warn in Zed 1.7.2). +- WI-4 (Zed) — DONE 2026-07-19: `validateSkill` now warns when a skill description + exceeds 1024 bytes, with tests. Research: `docs/editor-research/zed/1.11.3.md`. -- WI-5 (Claude Code): Document (or warn on) single-segment `dir/**` hook `if:` - patterns, whose matching semantics changed in 2.1.214. +- WI-5 (Claude Code) — DONE 2026-07-19: The 2.1.214 `if:` glob semantics change is + documented in the Claude Code hooks notes in `packages/schema/src/editor-support.ts`. Research: `docs/editor-research/claude-code/2.1.215.md`. ### P3 — Verification-only items -- WI-6 (Zed): Confirm `context_servers` remains the on-disk MCP key in Zed settings - after the 1.10.0 settings-editor consolidation, and confirm `.rules` / +- WI-6 (Zed) — OPEN: Confirm `context_servers` remains the on-disk MCP key in Zed + settings after the 1.10.0 settings-editor consolidation, and confirm `.rules` / `~/.config/zed/AGENTS.md` remain documented instruction surfaces (Zed docs were - unreachable through the research proxy). -- WI-7 (Gemini): Confirm the `.gemini/settings.json` merge preserves unknown keys - (`coreTools` → `tools.core` migration) and that symlinked skills still load under - the 0.49.0/0.51.0 symlink hardening. -- WI-8 (Windsurf): Investigate whether Devin Desktop now documents a file-backed - subagent config (3.3.18 "subagents configurable with default model"); if so, - consider upgrading Windsurf agents from `unsupported`. -- WI-9 (Windsurf): Consider passing through documented hook fields `show_output` and - `working_directory`, and skill `permissions:` frontmatter (3.4.22), if portable - equivalents exist or are added. + unreachable through the research proxy; requires direct docs access or a real + install). +- WI-7 (Gemini) — PARTIALLY DONE 2026-07-19: Unknown-key preservation in + `.gemini/settings.json` is covered by an existing test. OPEN: verify on a real + Gemini CLI install that symlinked skill directories still load under the + 0.49.0/0.51.0 symlink hardening. +- WI-8 (Windsurf) — OPEN: Investigate whether Devin Desktop now documents a + file-backed subagent config (3.3.18 "subagents configurable with default model"); + if so, consider upgrading Windsurf agents from `unsupported`. +- WI-9 (Windsurf) — DONE 2026-07-19 (already implemented): `show_output` and + `working_directory` were already passed through by the Windsurf hooks strategy. + OPEN: skill `permissions:` frontmatter passthrough remains a watch item until aix + skills carry permission metadata. ### P4 — Repo housekeeping -- WI-10 (Skill): Update `examples/custom/skills/editor-release-research/SKILL.md` - source hints: Codex changelog moved to `https://learn.chatgpt.com/docs/changelog`; - Windsurf changelog moved to `https://docs.devin.ai/desktop/changelog`. -- WI-11 (Watch items, no code): Gemini CLI ↔ Antigravity transition (possible future - rebrand of `.gemini/` paths); Cursor team/workspace customization scopes (currently - cloud-managed, not file-backed); Windsurf "Devin Desktop" display naming. +- WI-10 (Skill) — DONE 2026-07-19: Source hints updated — Codex changelog now + `https://learn.chatgpt.com/docs/changelog`; Windsurf changelog now + `https://docs.devin.ai/desktop/changelog`. +- WI-11 (Watch items, no code) — OPEN: Gemini CLI ↔ Antigravity transition (possible + future rebrand of `.gemini/` paths); Cursor team/workspace customization scopes + (currently cloud-managed, not file-backed); Windsurf "Devin Desktop" display naming. ## 5) Research document upkeep diff --git a/examples/custom/skills/editor-release-research/SKILL.md b/examples/custom/skills/editor-release-research/SKILL.md index 8a057b0..cf0de80 100644 --- a/examples/custom/skills/editor-release-research/SKILL.md +++ b/examples/custom/skills/editor-release-research/SKILL.md @@ -69,7 +69,7 @@ it in a research document. - Settings docs: `https://code.claude.com/docs/en/settings` - Package metadata: `npm view @anthropic-ai/claude-code version` - Codex: - - Changelog: `https://developers.openai.com/codex/changelog` + - Changelog: `https://learn.chatgpt.com/docs/changelog` - Repository releases: `https://github.com/openai/codex/releases` - Package metadata: `npm view @openai/codex version` - GitHub Copilot: @@ -92,9 +92,9 @@ it in a research document. - Agent docs: `https://opencode.ai/docs/agents/` - Repository releases: `https://github.com/anomalyco/opencode/releases` - Package metadata: `npm view opencode-ai version` -- Windsurf: - - Changelog: `https://windsurf.com/changelog` - - Docs: `https://docs.windsurf.com/` +- Windsurf (now Devin Desktop): + - Changelog: `https://docs.devin.ai/desktop/changelog` + - Docs: `https://docs.devin.ai/desktop/` - Zed: - Stable releases: `https://zed.dev/releases/stable` - Docs: `https://zed.dev/docs` diff --git a/packages/core/src/__tests__/editors/adapters.test.ts b/packages/core/src/__tests__/editors/adapters.test.ts index d385b54..fe4492d 100644 --- a/packages/core/src/__tests__/editors/adapters.test.ts +++ b/packages/core/src/__tests__/editors/adapters.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { existsSync } from 'node:fs'; -import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises'; import { join } from 'pathe'; import { homedir, tmpdir } from 'node:os'; import type { AiJsonConfig, McpServerConfig } from '@a1st/aix-schema'; @@ -442,6 +442,24 @@ describe('Editor Adapters', () => { expect(ruleContent).toContain('GitHub Copilot rule'); }); + it('never writes hidden agent files, which Copilot CLI rejects', async () => { + const config = createConfig({ + agents: { + '.sneaky': { + description: 'Agent whose name starts with a dot.', + content: 'Do the thing.', + }, + }, + }); + + await installToEditor('copilot', config, testDir); + + const agentFiles = await readdir(join(testDir, '.github/agents')); + + expect(agentFiles.every((file) => !file.startsWith('.'))).toBe(true); + expect(agentFiles).toContain('sneaky.md'); + }); + it('writes MCP config to project-root .mcp.json', async () => { const config = createConfig({ mcp: { diff --git a/packages/core/src/__tests__/editors/hooks-strategies.test.ts b/packages/core/src/__tests__/editors/hooks-strategies.test.ts index 69557ef..761ee17 100644 --- a/packages/core/src/__tests__/editors/hooks-strategies.test.ts +++ b/packages/core/src/__tests__/editors/hooks-strategies.test.ts @@ -647,6 +647,10 @@ describe('WindsurfHooksStrategy', () => { expect(strategy.getConfigPath()).toBe('hooks.json'); }); + it('returns the documented Devin Desktop user-level hooks path', () => { + expect(strategy.getGlobalConfigPath()).toBe('.codeium/windsurf/hooks.json'); + }); + it('maps pre_command to pre_run_command', () => { const hooks: HooksConfig = { pre_command: [{ hooks: [{ command: 'echo pre' }] }], diff --git a/packages/core/src/__tests__/skills/validate.test.ts b/packages/core/src/__tests__/skills/validate.test.ts index b9480dd..136602b 100644 --- a/packages/core/src/__tests__/skills/validate.test.ts +++ b/packages/core/src/__tests__/skills/validate.test.ts @@ -93,6 +93,45 @@ Content. ); }); + it('warns when description exceeds the 1024-byte editor limit', async () => { + const skillDir = join(testDir, 'long-desc'); + + await mkdir(skillDir, { recursive: true }); + await writeFile(join(skillDir, 'SKILL.md'), ''); + + const description = 'x'.repeat(1030); + const skill = createParsedSkill({ + basePath: skillDir, + frontmatter: { + name: 'long-desc', + description, + }, + }); + const result = await validateSkill(skill); + + expect(result.warnings).toContain( + 'Description is 1030 bytes - some editors (Zed, OpenCode) limit skill descriptions to 1024 bytes', + ); + }); + + it('does not warn on a description at exactly 1024 bytes', async () => { + const skillDir = join(testDir, 'max-desc'); + + await mkdir(skillDir, { recursive: true }); + await writeFile(join(skillDir, 'SKILL.md'), ''); + + const skill = createParsedSkill({ + basePath: skillDir, + frontmatter: { + name: 'max-desc', + description: 'x'.repeat(1024), + }, + }); + const result = await validateSkill(skill); + + expect(result.warnings.some((warning) => warning.includes('limit skill descriptions'))).toBe(false); + }); + it('errors when SKILL.md is missing', async () => { const skillDir = join(testDir, 'no-skill-md'); diff --git a/packages/core/src/editors/adapters/windsurf.ts b/packages/core/src/editors/adapters/windsurf.ts index 18cc6c5..82c1ade 100644 --- a/packages/core/src/editors/adapters/windsurf.ts +++ b/packages/core/src/editors/adapters/windsurf.ts @@ -21,7 +21,8 @@ import type { /** * Windsurf editor adapter. Writes rules to `.windsurf/rules/*.md`. Skills are installed * into `.aix/skills/{name}/` and symlinked into `.windsurf/skills/{name}/`. - * Hooks are written to `.windsurf/hooks.json`. MCP is global-only + * Hooks are written to `.windsurf/hooks.json` (project) and + * `~/.codeium/windsurf/hooks.json` (user). MCP is global-only * (`~/.codeium/windsurf/mcp_config.json`) and requires user confirmation to modify. */ export class WindsurfAdapter extends BaseEditorAdapter { diff --git a/packages/core/src/editors/strategies/windsurf/hooks.ts b/packages/core/src/editors/strategies/windsurf/hooks.ts index 714efe2..4b2cf0b 100644 --- a/packages/core/src/editors/strategies/windsurf/hooks.ts +++ b/packages/core/src/editors/strategies/windsurf/hooks.ts @@ -122,7 +122,10 @@ export class WindsurfHooksStrategy implements HooksStrategy { } getGlobalConfigPath(): string { - return '.windsurf/hooks.json'; + // Devin Desktop (formerly Windsurf) reads user-level hooks from + // ~/.codeium/windsurf/hooks.json, alongside its global MCP config. + // Source: https://docs.devin.ai/desktop/cascade/hooks + return '.codeium/windsurf/hooks.json'; } getUnsupportedEvents(hooks: HooksConfig): string[] { diff --git a/packages/core/src/skills/validate.ts b/packages/core/src/skills/validate.ts index be0c551..f416c56 100644 --- a/packages/core/src/skills/validate.ts +++ b/packages/core/src/skills/validate.ts @@ -54,6 +54,18 @@ export async function validateSkill(skill: ParsedSkill): Promise 1024) { + warnings.push( + `Description is ${descriptionBytes} bytes - some editors (Zed, OpenCode) limit skill descriptions to 1024 bytes`, + ); + } + } + return { valid: errors.length === 0, errors, diff --git a/packages/schema/src/editor-support.ts b/packages/schema/src/editor-support.ts index 74ae267..9cdb68d 100644 --- a/packages/schema/src/editor-support.ts +++ b/packages/schema/src/editor-support.ts @@ -316,7 +316,7 @@ export const editorSupportProfiles = [ summary: 'Native project prompts, skill-backed user prompts, hooks, and repo-root MCP config.', migrationPitch: 'Copilot keeps most features native, but its repo instruction surfaces differ from other editors.', notes: [ - 'aix writes project MCP config to `.mcp.json` and still imports `.github/mcp.json` as a fallback.', + 'aix writes project MCP config to `.mcp.json`; Copilot CLI documents both `.mcp.json` and `.github/mcp.json` as project MCP files, and aix imports either.', 'Project Copilot prompt installs use explicit frontmatter so slash commands keep the configured prompt name.', 'User-scope Copilot prompt installs are converted into native skills under `~/.config/github-copilot/skills/`.', ], @@ -531,6 +531,7 @@ export const editorSupportProfiles = [ notes: [ 'Command hooks surface `async`, `asyncRewake`, `shell`, `if`, `statusMessage`, and `once`.', 'Non-command hook types (`http`, `mcp_tool`, `prompt`, `agent`) are translated by aix.', + 'Since Claude Code 2.1.214, a single-segment `dir/**` glob in `if` matches only `/dir`; use `**/dir/**` for any-depth matching.', ], }, ), @@ -624,7 +625,7 @@ export const editorSupportProfiles = [ 'Hooks', 'JSON hook configuration using snake_case Windsurf event names with cross-platform `command` / `powershell` fields.', nativeScope('.windsurf/hooks.json'), - nativeScope('~/.windsurf/hooks.json'), + nativeScope('~/.codeium/windsurf/hooks.json'), { supportedValues: [ 'post_cascade_response', From 84e26dd43989cf83b63c28868f4790f95cfe6da2 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Jul 2026 13:53:13 +0000 Subject: [PATCH 3/3] fix: make editor research parsing and tests Windows-compatible The site package's editor-research parser required LF-only frontmatter delimiters, and the research-root test asserted forward-slash paths. Windows CI checks out CRLF files (no .gitattributes), so the seeded-docs test failed with 'Missing YAML frontmatter' and the root test failed on backslashes. Normalize CRLF before parsing, accept either path separator in the test, and add a CRLF regression test. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01HCX71AiLij6vrJy5o1n6UR --- packages/site/src/lib/editor-research.test.ts | 26 ++++++++++++++++++- packages/site/src/lib/editor-research.ts | 5 +++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/site/src/lib/editor-research.test.ts b/packages/site/src/lib/editor-research.test.ts index cc8f965..202e6ba 100644 --- a/packages/site/src/lib/editor-research.test.ts +++ b/packages/site/src/lib/editor-research.test.ts @@ -55,7 +55,8 @@ describe('editor research notes', () => { }); it('resolves the default research root from the monorepo', () => { - expect(getEditorResearchRoot()).toMatch(/docs\/editor-research$/u); + // Windows paths use backslashes, so match either separator. + expect(getEditorResearchRoot()).toMatch(/docs[\\/]editor-research$/u); expect(fs.existsSync(getEditorResearchRoot())).toStrictEqual(true); }); @@ -82,6 +83,29 @@ describe('editor research notes', () => { })).toEqual([ '3.5', '3.4' ]); }); + it('parses research files with CRLF line endings', () => { + const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aix-editor-research-')); + + writeResearchFile({ + rootDir, + editorID: 'cursor', + version: '3.5', + timestamp: '2026-05-21T10:00:00-04:00', + }); + + const filePath = path.join(rootDir, 'cursor', '3.5.md'), + crlfContent = fs.readFileSync(filePath, 'utf8').replace(/\n/gu, '\r\n'); + + fs.writeFileSync(filePath, crlfContent, 'utf8'); + + const entries = listEditorResearchEntries(rootDir); + + expect(entries).toHaveLength(1); + expect(entries[0]?.editorVersion).toStrictEqual('3.5'); + expect(entries[0]?.changes.length).toBeGreaterThan(0); + expect(entries[0]?.changes[0]?.summary).toStrictEqual('Added a config file.'); + }); + it('rejects notes missing required frontmatter fields', () => { const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aix-editor-research-')); diff --git a/packages/site/src/lib/editor-research.ts b/packages/site/src/lib/editor-research.ts index 96e3f46..3ce1084 100644 --- a/packages/site/src/lib/editor-research.ts +++ b/packages/site/src/lib/editor-research.ts @@ -73,7 +73,10 @@ function isSupportedEditorName(value: unknown): value is SupportedEditorName { } function parseResearchFileContent(content: string): ParsedResearchFile { - const frontmatterMatch = /^---\n(?[\s\S]*?)\n---\n?(?[\s\S]*)$/u.exec(content); + // Windows checkouts without .gitattributes produce CRLF files; normalize so the + // frontmatter delimiter and line-based change parsing behave identically everywhere. + const normalized = content.replace(/\r\n/gu, '\n'), + frontmatterMatch = /^---\n(?[\s\S]*?)\n---\n?(?[\s\S]*)$/u.exec(normalized); if (!frontmatterMatch?.groups) { throw new Error('Missing YAML frontmatter');