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..57aa8d5 --- /dev/null +++ b/docs/editor-research/claude-code/2.1.215.md @@ -0,0 +1,71 @@ +--- +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: 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. + - 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..3197a90 --- /dev/null +++ b/docs/editor-research/codex/0.144.6.md @@ -0,0 +1,68 @@ +--- +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: 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 + 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..5ee8e1b --- /dev/null +++ b/docs/editor-research/copilot/1.0.71.md @@ -0,0 +1,57 @@ +--- +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: 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: 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 + `.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..082e91e --- /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: 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 + 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..d66ad6a --- /dev/null +++ b/docs/editor-research/windsurf/3.4.27.md @@ -0,0 +1,62 @@ +--- +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: 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: 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: 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 + 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` 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 new file mode 100644 index 0000000..543bf5b --- /dev/null +++ b/docs/editor-research/zed/1.11.3.md @@ -0,0 +1,62 @@ +--- +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: 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 + 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..b05a9cf --- /dev/null +++ b/docs/implementation-plan.md @@ -0,0 +1,118 @@ +# 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 + +Status updated 2026-07-19 after the implementation pass on this branch. + +### P1 — Likely bugs or user-visible gaps + +- 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) — 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) — 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) — 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) — 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) — 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; 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) — 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 + +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 +``` 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', 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');