CtrlK
BlogDocsLog inGet started
Tessl Logo

punkdev/cc2oc

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

1.25x
Quality

92%

Does it follow best practices?

Impact

97%

1.25x

Average score across 2 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

coverage-audit-table.mdskills/migrate-plugin/assets/

Claude feature/sourceClaude behaviorOpenCode equivalentSupport statusMigration outputVerificationCaveat
root .claude-plugin/plugin.jsonPlugin manifest metadata and component pathsInput-only; selected metadata maps to opencode-plugin/package.jsonfullAsset inventory row; package metadata if creating packagePackage validationDo not generate .claude-plugin/ for OpenCode support
nested plugin/.claude-plugin/plugin.jsonPlugin manifest metadata under a package/plugin subdirectoryInput-only; selected metadata maps to opencode-plugin/package.jsonfullSeparate asset inventory row; package metadata if creating packagePackage validationDo not collapse this into root marketplace metadata
.claude-plugin/marketplace.jsonClaude marketplace plugin listingScope decision for OpenCode package(s)fullOne package per plugin by default, or documented family packageMaintainer reviewNo OpenCode marketplace parity assumed
skills/ / .claude/skills/Agent Skill sourceShared .agents/skills/, existing discoverable path, or package-local copyfullShared skill or documented copy/sync relationopencode debug skillAvoid divergent Claude/OpenCode skill copies
commands/ / .claude/commands/Slash-command prompt filesShared command text or .opencode/commands/ wrapperfullWrapper with frontmatter only when needed/ palette.opencode/ is active config, not neutral output
agents/ / .claude/agents/Specialized subagent promptsShared agent text or .opencode/agents/ wrapperfullWrapper with frontmatter only when needed@ pickerMap tool/permission fields intentionally
hooks/hooks.json / plugin.json.hooksClaude lifecycle handlersOpenCode plugin event handlersfullHook parity record and opencode-plugin/src/plugin.ts codeFixture testsPort by intent, not event name
.mcp.json / plugin.json.mcpServersMCP server configopencode.jsonc / opencode.json mcp entriesfullConfig patch/snippet and MCP migration recordopencode mcp listMCP config is separate from npm plugin package
outputStyles / output-styles/Claude output style filesNo direct target in current skill docsnot-applicableDocumentation noteMaintainer reviewRevisit if OpenCode adds documented parity
themes / themes/Claude plugin theme filesOpenCode theme/config only if manually mappedpartialManual config note or tested mappingOpenCode theme smoke checkPackaging semantics differ
lspServers / .lsp.jsonClaude LSP server configNo proven 1:1 OpenCode config mapping herepartialManual/rewrite noteDocs-backed check or smoke testOpenCode LSP events are not config parity
monitors / monitors/monitors.jsonBackground monitorsRewrite via OpenCode plugin events when possiblepartialIntent-specific plugin code or caveatEvent smoke testNo direct monitor primitive assumed
bin/Executables added to Claude Bash PATHExplicit package command/import/pathpartialPackage file or README setupCommand path testNo automatic PATH behavior assumed
settings.jsonClaude plugin defaultsOpenCode config only for known equivalentspartialConfig snippet or Claude-only noteConfig validationDo not copy unknown settings blindly
userConfigEnable-time user prompts and secure valuesEnv vars/config placeholders/README setuppartialSetup docs and placeholdersSecret reviewDo not inline secrets
channelsMCP-backed message channelsMCP config plus custom plugin code if neededpartialMCP migration and channel caveatMCP/tool smoke testNo direct channel injection parity assumed
dependenciesClaude plugin dependency constraintsopencode-plugin/package.json dependenciespartialPackage dependency entriesPackage install/import testDo not assume enable-time dependency behavior
${CLAUDE_PLUGIN_ROOT}Installed plugin path substitutionExplicit repo/package pathfullRewritten path after placement decisionPath existence testPath changes when files are copied
${CLAUDE_PLUGIN_DATA}Persistent Claude plugin stateOpenCode/XDG-safe state path or env varfullState-path planState testNever reuse Claude plugin data path
${user_config.KEY} / CLAUDE_PLUGIN_OPTION_*User-config substitutions/envExplicit env vars or config placeholderspartialREADME setup and placeholder configSecret reviewNo direct secure prompt equivalent assumed

README.md

tile.json