OpenAI and OpenCode skill/plugin format compatibility with Claude
INV 0001: OpenAI and OpenCode skill/plugin format compatibility with Claude
Section titled “INV 0001: OpenAI and OpenCode skill/plugin format compatibility with Claude”Status: Open Author: Donald Gifford Date: 2026-04-18
Question
Section titled “Question”Can claudelint provide a useful bidirectional convert subcommand
between Claude skill/plugin artifacts and the equivalent artifacts in
(a) OpenAI’s Apps / Custom GPTs ecosystem and (b) OpenCode? Specifically:
- Is there a meaningful schema overlap (name, description, trigger, instructions, tool allowlist, attachments) such that best-effort translation is useful?
- Which fields are lossy in each direction, and can we detect and report loss deterministically?
- Is a pure static translator sufficient, or do semantics diverge enough that round-tripping is not achievable even in principle?
Hypothesis
Section titled “Hypothesis”- Claude ↔ OpenCode: high overlap. OpenCode’s skill/plugin model was influenced by Claude’s, and both use Markdown-with-frontmatter. Expect round-trippable for ≥80% of non-trivial skills, with small fixed-shape losses on tool identifiers and hook semantics.
- Claude ↔ OpenAI (Apps / Custom GPTs): partial overlap. GPT “Actions” map loosely to tool use, “Instructions” to system prompts, and “Knowledge” to skill reference files, but the hook/subagent model has no direct equivalent. Expect useful one-way import (OpenAI → Claude) and a diagnostics-heavy export (Claude → OpenAI).
Context
Section titled “Context”This investigation gates Phase 3 of IMPL-0001 (claudelint convert)
and the stretch goal in RFC-0001. Before spending engineering time on a
translator, we need to know whether the overlap is large enough to be
useful, and where the unavoidable losses are.
Triggered by: RFC-0001, IMPL-0001 (Phase 3)
Approach
Section titled “Approach”- Collect canonical specs and sample artifacts.
- Claude:
SKILL.mdfrontmatter,.claude/settings.jsonhooks, plugin manifests, slash-command frontmatter, subagent frontmatter. - OpenCode: its skill and plugin schemas (frontmatter + manifest).
- OpenAI: Custom GPT “Instructions”, “Conversation starters”, “Knowledge” files, “Actions” (OpenAPI), and the newer “Apps” platform manifest if available.
- Claude:
- Build a field-level mapping table (source field → target field →
transform → loss class). Loss classes:
lossless,defaulted,approximated,dropped. - Prototype translators for the three most common skill shapes: (a) pure-prompt skill, (b) skill with reference files, (c) skill with tool allowlist.
- Run round-trip experiments. For each direction, encode in source, convert to target, convert back, and diff. Quantify loss.
- Document divergent semantics. Identify concepts present in one
ecosystem but not the others (e.g., Claude hooks → no GPT
equivalent; OpenAI Knowledge files → Claude skill
references/). - Summarize in a findings matrix and recommend a scope.
Environment
Section titled “Environment”| Component | Version / Value |
|---|---|
| Claude Code CLI | latest at investigation time |
| OpenAI platform | Custom GPTs + Apps manifest as of investigation date |
| OpenCode | latest release at investigation time |
| Go (prototype) | 1.23+ (matches claudelint) |
Findings
Section titled “Findings”Fill in as experiments run. Expected structure below.
Observation 1 — Field overlap matrix
Section titled “Observation 1 — Field overlap matrix”Placeholder for the mapping table. Populate with rows of the form:
| Claude field | OpenCode field | OpenAI field | Loss class | Notes |
|---|---|---|---|---|
name (frontmatter) | name | GPT name | lossless | |
description | description | GPT description | lossless | |
allowed-tools | tools | Action operationIds | approximated | tool naming differs |
hooks (settings.json) | hooks | — | dropped (→ OpenAI) | no GPT equivalent |
references/ | resources/ | Knowledge files | approximated | upload mechanics differ |
slash command argument-hint | — | conversation starter | approximated | |
subagent tools list | — | — | dropped (→ OpenAI) |
Observation 2 — Round-trip loss quantification
Section titled “Observation 2 — Round-trip loss quantification”Prototype results per skill shape (pure-prompt, with-refs, with-tools) and per direction. Expected format: % of fields preserved, % approximated, % dropped.
Observation 3 — Semantic divergences that cannot be bridged
Section titled “Observation 3 — Semantic divergences that cannot be bridged”- Claude hooks execute shell in the user’s harness; GPT has no hook concept. Translation direction Claude → OpenAI will drop hooks with a mandatory diagnostic.
- OpenAI Actions are OpenAPI specs; Claude’s
allowed-toolslists built-in tool names. Bidirectional mapping only exists for a small set of tools with obvious equivalents (web search, code execution). - OpenCode and Claude differ on plugin command syntax in ways that require a translation table rather than structural mapping.
Conclusion
Section titled “Conclusion”Fill in at investigation close. Draft expectations below.
Answer: Inconclusive — pending experiment runs.
Working thesis:
- Yes for a useful Claude ↔ OpenCode translator with a documented small set of approximated fields.
- Partial for Claude ↔ OpenAI: one-way import (OpenAI → Claude) is tractable; export (Claude → OpenAI) requires dropping hooks, subagents, and most plugin semantics with clear diagnostics.
Recommendation
Section titled “Recommendation”Tentative, pending experiments:
- Proceed with Phase 3, but scope to two translators:
convert claude-to-opencodeandconvert opencode-to-claudeas the primary flow, withconvert openai-importas a secondary one-way tool. - Always emit a loss report. The subcommand must print (or write alongside the output) a structured summary of every approximated or dropped field. Non-zero exit if loss exceeds a configurable budget.
- Freeze the translation table. Check in the field-mapping matrix
as data (
internal/convert/mappings/*.hclor.yaml) so that additions can be reviewed without code changes. - Revisit OpenAI export after the OpenAI Apps manifest stabilizes; until then, only one-way import is supported.
References
Section titled “References”- RFC-0001 — Claudelint
- IMPL-0001 — Phase 1 core linter (this investigation gates Phase 3)
- DESIGN-0001 — Architecture (see
internal/convert/stub) - OpenAI GPT Actions spec (OpenAPI): link TBD
- OpenAI Apps platform docs: link TBD
- OpenCode skill/plugin docs: link TBD
- Claude plugin, skill, hook references in this project’s
.claude/