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.mdskills/migrate-plugin/references/

Coverage Audit

Use this before implementing a migration, and again when Claude Code or OpenCode plugin docs change.

The goal is not to force every Claude plugin feature into OpenCode. The goal is to classify every discovered Claude surface so maintainers know what is shared, wrapped, rewritten, manually configured, or Claude-only.

Audit Matrix

For each documented or discovered Claude plugin feature, record:

ColumnMeaning
Claude feature/sourceManifest field, root path, config file, or runtime behavior.
Claude behaviorWhat Claude Code does for users.
OpenCode equivalentNative OpenCode feature, config key, plugin event, or none.
Support statusfull, partial, missing, or not-applicable.
Migration outputFile, config snippet, test, or documentation note to produce.
VerificationCommand, automated test, or manual check.
CaveatTiming, packaging, secret handling, or user-visible difference.

Use assets/coverage-audit-table.md as the starting checklist.

Status Definitions

  • full: The skill has explicit guidance and a deterministic verification path.
  • partial: The skill has a safe migration stance, but parity depends on project-specific code or manual OpenCode config.
  • missing: The skill does not yet tell the agent what to do. Add guidance before implementing.
  • not-applicable: OpenCode has no equivalent or the Claude feature is distribution-only metadata. Document why.

Claude Plugin Surfaces To Check

Manifest and metadata:

  • .claude-plugin/plugin.json
  • .claude-plugin/marketplace.json
  • Nested manifests such as plugin/.claude-plugin/plugin.json
  • Any .claude-plugin/ directory that lacks plugin.json (record the directory and files explicitly)
  • name, version, description, author, homepage, repository, license, keywords
  • install scopes and enabledPlugins

Component fields and root paths:

  • skills and skills/*/SKILL.md
  • commands and commands/*.md
  • agents and agents/*.md
  • hooks and hooks/hooks.json
  • mcpServers, .mcp.json, and inline MCP config
  • outputStyles and output-styles/
  • themes and themes/
  • lspServers and .lsp.json
  • monitors and monitors/monitors.json
  • dependencies
  • settings.json
  • bin/
  • userConfig
  • channels

Runtime substitutions and storage:

  • ${CLAUDE_PLUGIN_ROOT}
  • ${CLAUDE_PLUGIN_DATA}
  • ${user_config.KEY}
  • CLAUDE_PLUGIN_OPTION_*
  • Hook stdin/stdout/exit-code contracts
  • Plugin bin/ PATH behavior

Default Migration Stances

Claude surfaceOpenCode stanceStatusNotes
Root .claude-plugin/plugin.jsonInput-only Claude manifest; map only safe metadata to opencode-plugin/package.json.fullKeep distinct from nested plugin manifests in reports.
Nested plugin/.claude-plugin/plugin.jsonInput-only Claude manifest for plugin assets under plugin/.fullInventory separately from root .claude-plugin/; do not collapse it into marketplace metadata.
SkillsPrefer shared .agents/skills/; package-local copy only when needed for npm distribution.fullVerify with opencode debug skill.
CommandsPrefer shared command text or .opencode/commands/ wrapper with frontmatter when OpenCode-specific.fullVerify in / palette.
AgentsPrefer shared agent prompt or .opencode/agents/ wrapper with frontmatter when OpenCode-specific.fullVerify in @ picker.
HooksRewrite by user-visible intent as OpenCode plugin event handlers.fullRequires per-hook parity record and tests.
MCP serversConvert to OpenCode config mcp, separate from the npm plugin package.fullVerify with opencode mcp list; OAuth may need opencode mcp auth <name>.
MetadataMap safe package metadata to opencode-plugin/package.json; keep Claude plugin metadata input-only.fullDo not generate .claude-plugin/.
outputStylesNo direct migration target in the current OpenCode docs used by this skill.not-applicableDocument as Claude-only unless OpenCode docs add parity.
themesOpenCode has themes/config, but Claude plugin theme packaging is not 1:1.partialTreat as manual OpenCode config unless a tested mapping exists.
lspServersOpenCode exposes LSP events, but Claude .lsp.json packaging has no proven 1:1 config mapping here.partialDocument as manual/rewrite pending docs-backed mapping.
monitorsNo direct OpenCode monitor primitive found in current docs.partialRewrite as plugin/session/file/message behavior only when intent is clear and tested.
bin/OpenCode does not document Claude-style automatic plugin bin/ PATH behavior.partialUse explicit package scripts, absolute/relative command paths, or bundled imports.
settings.jsonClaude plugin defaults are input-only unless a known OpenCode config equivalent exists.partialMap only documented equivalents; otherwise note as Claude-only.
userConfigNo plugin-enable prompt equivalent found in current OpenCode docs.partialPrefer documented env vars, config placeholders, or README setup; never inline secrets.
channelsTied to Claude plugin MCP servers and message injection.partialMigrate MCP separately; reimplement channel behavior only with tested OpenCode plugin code.
dependenciesMap runtime package dependencies to opencode-plugin/package.json.partialDo not assume Claude plugin dependency semantics or enable-time prompts.
${CLAUDE_PLUGIN_ROOT}Replace only after deciding where equivalent files live.fullOften opencode-plugin/ or an existing repo path.
${CLAUDE_PLUGIN_DATA}Use OpenCode/XDG-safe state or documented env var.fullNever point OpenCode state at Claude plugin data.
${user_config.KEY}Replace with env/config placeholders or documented setup.partialSensitive values need user-managed secret storage.
CLAUDE_PLUGIN_OPTION_*No direct OpenCode equivalent assumed.partialUse explicit env vars if needed.

Required Output

Before writing migration files, produce a short coverage table for discovered surfaces. Do not leave a feature implicit because it is unsupported. Unsupported features need an explicit not-applicable or partial row with a caveat.

If the task provides an offline fixture path, document whether the pinned upstream clone or the fixture path was used. Tests that validate source equality should prefer the fixture path as the deterministic fallback before using any transient clone directory.

If the audit finds a missing row, update this skill's guidance before continuing with implementation.

Verification

  • Search the migration notes or generated PR summary for every discovered Claude manifest field and root path.
  • Run scripts/validate_skills.py <repo> --format markdown when skills are present.
  • Run scripts/validate_opencode_package.py <repo> --format markdown after package files exist.
  • For MCP, validate OpenCode config shape and run opencode mcp list when available.
  • For hooks, require an event fixture test or documented manual smoke test for each ported behavior.

README.md

tile.json