Skip to content

feat(sync): plugin folders in every assistant, Cursor and Antigravity settings - #5

Closed
Fenish wants to merge 5 commits into
fix/opencode-v2-mcp-pluginsfrom
feat/plugins-everywhere
Closed

Fenish wants to merge 5 commits into
fix/opencode-v2-mcp-pluginsfrom
feat/plugins-everywhere

Conversation

@Fenish

@Fenish Fenish commented Oct 12, 2026

Copy link
Copy Markdown
Contributor

Builds on #4; merge that first.

Plugin folders everywhere. A plugin folder (a Claude Code plugin) stays one item in the pouch. Claude Code installs it natively; every other assistant gets its parts, written where and how that assistant expects them: skills, agents, commands (TOML for Gemini CLI and Qwen Code), hooks and MCP servers.

  • Hooks get CLAUDE_PLUGIN_ROOT exported before the original command, which is left unchanged. MCP servers get it in their env. On Windows, hooks get the path written into the command instead.
  • If a part's name clashes with a pouch item or with another plugin's part, it's left out and the sync reports it.
  • Edits to linked or copied skill, agent and command parts go back into the plugin. Edited plugin hooks and MCP entries are restored from the plugin rather than adopted as standalone items.
  • Factory Droid only loads plugins it installed itself, so it gets the parts too. Qwen Code now gets skills in ~/.agents/skills, which it reads.

Settings. Cursor CLI's cli-config.json (~/.cursor, CURSOR_CONFIG_DIR, or XDG_CONFIG_HOME/cursor on Linux) and Antigravity CLI's ~/.gemini/antigravity-cli/settings.json now sync. Settings are never written inside a git checkout, and the background service passes the config-location variables through. Windsurf stays unsupported: its preferences are a binary protobuf file.

Crush MCP servers sync to mcp in crush.json.

Docker test. scripts/e2e-plugins.sh uses two computers with the real CLIs (one on OpenCode 1, one on OpenCode 2). It adds a test plugin through the web editor and ponytail from GitHub, syncs, then asks each assistant what it loaded. Hooks and MCP servers record that they ran and found their plugin folder. All 10 assistants with a Linux CLI pass. Codex hooks show as written but not run, because Codex asks the user to trust new hooks. Cursor hooks are the same, because Cursor needs an account to run a prompt. The helpers it shares with scripts/e2e-settings.sh move to scripts/e2e-settings/stack.sh, and that test still passes.

Checks: cargo fmt, cargo clippy -D warnings, cargo test --workspace (315 passed).

Claude Code and Factory install a plugin folder from the pouch themselves.
Every other assistant now gets its parts: skills linked, agents and
commands translated to its dialect, hooks and MCP servers written into
its config, with CLAUDE_PLUGIN_ROOT pointing at the plugin's folder.

The pouch's own items win over a plugin's of the same name and clashes
are reported. Parts are never items of their own: deleting, replacing or
editing one in an assistant doesn't touch the pouch, and the next sync
puts the plugin's version back.
Cursor's CLI keeps its preferences in cli-config.json (moved by CURSOR_CONFIG_DIR, or XDG_CONFIG_HOME on Linux) and the Antigravity CLI in ~/.gemini/antigravity-cli/settings.json, so targets now carry the folder their settings files are in. Crush's MCP servers are read from and written to the mcp key of crush.json. Windsurf's preferences are a binary file and stay unsupported.
… checkout

Cursor counts as installed when only its CLI's moved config folder exists, settings are not written into a settings folder inside a git checkout, and the background service keeps the variables that move assistants' folders.
Droid only loads plugins it installed itself and rejects a directory
marketplace in settings.json, so Factory now gets a plugin folder's parts
like the assistants without plugins. Qwen Code reads ~/.qwen/skills and
the shared ~/.agents/skills; both were left out.
scripts/e2e-plugins.sh adds a plugin written in the web app and ponytail from GitHub, syncs two computers with the real assistant CLIs, and asks each one what it loaded. The shared parts of scripts/e2e-settings.sh move to scripts/e2e-settings/stack.sh.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant