Skip to content

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

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:

  1. Is there a meaningful schema overlap (name, description, trigger, instructions, tool allowlist, attachments) such that best-effort translation is useful?
  2. Which fields are lossy in each direction, and can we detect and report loss deterministically?
  3. Is a pure static translator sufficient, or do semantics diverge enough that round-tripping is not achievable even in principle?
  • 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).

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)

  1. Collect canonical specs and sample artifacts.
    • Claude: SKILL.md frontmatter, .claude/settings.json hooks, 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.
  2. Build a field-level mapping table (source field → target field → transform → loss class). Loss classes: lossless, defaulted, approximated, dropped.
  3. Prototype translators for the three most common skill shapes: (a) pure-prompt skill, (b) skill with reference files, (c) skill with tool allowlist.
  4. Run round-trip experiments. For each direction, encode in source, convert to target, convert back, and diff. Quantify loss.
  5. 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/).
  6. Summarize in a findings matrix and recommend a scope.
ComponentVersion / Value
Claude Code CLIlatest at investigation time
OpenAI platformCustom GPTs + Apps manifest as of investigation date
OpenCodelatest release at investigation time
Go (prototype)1.23+ (matches claudelint)

Fill in as experiments run. Expected structure below.

Placeholder for the mapping table. Populate with rows of the form:

Claude fieldOpenCode fieldOpenAI fieldLoss classNotes
name (frontmatter)nameGPT namelossless
descriptiondescriptionGPT descriptionlossless
allowed-toolstoolsAction operationIdsapproximatedtool naming differs
hooks (settings.json)hooksdropped (→ OpenAI)no GPT equivalent
references/resources/Knowledge filesapproximatedupload mechanics differ
slash command argument-hintconversation starterapproximated
subagent tools listdropped (→ 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-tools lists 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.

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.

Tentative, pending experiments:

  1. Proceed with Phase 3, but scope to two translators: convert claude-to-opencode and convert opencode-to-claude as the primary flow, with convert openai-import as a secondary one-way tool.
  2. 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.
  3. Freeze the translation table. Check in the field-mapping matrix as data (internal/convert/mappings/*.hcl or .yaml) so that additions can be reviewed without code changes.
  4. Revisit OpenAI export after the OpenAI Apps manifest stabilizes; until then, only one-way import is supported.
  • 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/