Add and ship OpenCode support for one Claude Code plugin at a time. Includes core migration to a reviewable `opencode-plugin/` adapter, maintainer-facing docs, and follow-up CI/versioning setup for package publishing or skill-copy drift checks.
92
92%
Does it follow best practices?
Impact
97%
1.25xAverage score across 2 eval scenarios
Passed
No known issues
| Claude feature/source | Claude behavior | OpenCode equivalent | Support status | Migration output | Verification | Caveat |
|---|---|---|---|---|---|---|
root .claude-plugin/plugin.json | Plugin manifest metadata and component paths | Input-only; selected metadata maps to opencode-plugin/package.json | full | Asset inventory row; package metadata if creating package | Package validation | Do not generate .claude-plugin/ for OpenCode support |
nested plugin/.claude-plugin/plugin.json | Plugin manifest metadata under a package/plugin subdirectory | Input-only; selected metadata maps to opencode-plugin/package.json | full | Separate asset inventory row; package metadata if creating package | Package validation | Do not collapse this into root marketplace metadata |
.claude-plugin/marketplace.json | Claude marketplace plugin listing | Scope decision for OpenCode package(s) | full | One package per plugin by default, or documented family package | Maintainer review | No OpenCode marketplace parity assumed |
skills/ / .claude/skills/ | Agent Skill source | Shared .agents/skills/, existing discoverable path, or package-local copy | full | Shared skill or documented copy/sync relation | opencode debug skill | Avoid divergent Claude/OpenCode skill copies |
commands/ / .claude/commands/ | Slash-command prompt files | Shared command text or .opencode/commands/ wrapper | full | Wrapper with frontmatter only when needed | / palette | .opencode/ is active config, not neutral output |
agents/ / .claude/agents/ | Specialized subagent prompts | Shared agent text or .opencode/agents/ wrapper | full | Wrapper with frontmatter only when needed | @ picker | Map tool/permission fields intentionally |
hooks/hooks.json / plugin.json.hooks | Claude lifecycle handlers | OpenCode plugin event handlers | full | Hook parity record and opencode-plugin/src/plugin.ts code | Fixture tests | Port by intent, not event name |
.mcp.json / plugin.json.mcpServers | MCP server config | opencode.jsonc / opencode.json mcp entries | full | Config patch/snippet and MCP migration record | opencode mcp list | MCP config is separate from npm plugin package |
outputStyles / output-styles/ | Claude output style files | No direct target in current skill docs | not-applicable | Documentation note | Maintainer review | Revisit if OpenCode adds documented parity |
themes / themes/ | Claude plugin theme files | OpenCode theme/config only if manually mapped | partial | Manual config note or tested mapping | OpenCode theme smoke check | Packaging semantics differ |
lspServers / .lsp.json | Claude LSP server config | No proven 1:1 OpenCode config mapping here | partial | Manual/rewrite note | Docs-backed check or smoke test | OpenCode LSP events are not config parity |
monitors / monitors/monitors.json | Background monitors | Rewrite via OpenCode plugin events when possible | partial | Intent-specific plugin code or caveat | Event smoke test | No direct monitor primitive assumed |
bin/ | Executables added to Claude Bash PATH | Explicit package command/import/path | partial | Package file or README setup | Command path test | No automatic PATH behavior assumed |
settings.json | Claude plugin defaults | OpenCode config only for known equivalents | partial | Config snippet or Claude-only note | Config validation | Do not copy unknown settings blindly |
userConfig | Enable-time user prompts and secure values | Env vars/config placeholders/README setup | partial | Setup docs and placeholders | Secret review | Do not inline secrets |
channels | MCP-backed message channels | MCP config plus custom plugin code if needed | partial | MCP migration and channel caveat | MCP/tool smoke test | No direct channel injection parity assumed |
dependencies | Claude plugin dependency constraints | opencode-plugin/package.json dependencies | partial | Package dependency entries | Package install/import test | Do not assume enable-time dependency behavior |
${CLAUDE_PLUGIN_ROOT} | Installed plugin path substitution | Explicit repo/package path | full | Rewritten path after placement decision | Path existence test | Path changes when files are copied |
${CLAUDE_PLUGIN_DATA} | Persistent Claude plugin state | OpenCode/XDG-safe state path or env var | full | State-path plan | State test | Never reuse Claude plugin data path |
${user_config.KEY} / CLAUDE_PLUGIN_OPTION_* | User-config substitutions/env | Explicit env vars or config placeholders | partial | README setup and placeholder config | Secret review | No direct secure prompt equivalent assumed |