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
{
"context": "Tests whether the agent can apply the Claude Code to OpenCode migration skill to a pinned, complex, real-world Claude plugin. The task uses claude-mem's lifecycle hooks, tool hooks, worker process, MCP server, package-local skills, custom installer, and existing upstream OpenCode integration as evidence. The output should show careful classification, intent-based hook porting, OpenCode package generation, installer comparison, tests, and honest caveats.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Pinned evidence",
"description": "The output records the upstream repository URL and exact commit `bb1f86949db425bd80cc00bb52ed2611332f2fb9`, and does not describe the migration as based on an unpinned latest branch.",
"max_score": 6
},
{
"name": "Offline fallback",
"description": "The solution uses or preserves the provided offline fixture files when network access is unavailable, rather than failing because GitHub cannot be reached.",
"max_score": 5
},
{
"name": "Complete surface inventory",
"description": "A migration note or report inventories at least these surfaces: root `.claude-plugin/plugin.json`, `plugin/.claude-plugin/plugin.json`, `plugin/hooks/hooks.json`, `plugin/.mcp.json`, `plugin/skills/`, `plugin/scripts/`, worker/service entrypoints, `src/npx-cli/commands/install.ts`, `OpenCodeInstaller.ts`, and `opencode-plugin/index.ts`.",
"max_score": 8
},
{
"name": "Coverage labels",
"description": "The migration evidence classifies discovered Claude and OpenCode-adjacent surfaces with support labels such as full, partial, missing, or not-applicable, and does not proceed with an unaddressed missing row.",
"max_score": 7
},
{
"name": "Hook parity records",
"description": "The output includes parity records or equivalent documentation for every hook event in `plugin/hooks/hooks.json`: `Setup`, `SessionStart`, `UserPromptSubmit`, `PostToolUse`, `PreToolUse` with matcher `Read`, and `Stop`, including intended user-visible behavior, OpenCode mapping, tests, and caveats.",
"max_score": 10
},
{
"name": "Intent porting",
"description": "OpenCode code ports the observable intent of memory capture, worker startup expectations, session initialization, read/file context, observations, summarization, and search access rather than blindly shelling out to Claude hook commands with `${CLAUDE_PLUGIN_ROOT}` or relying on Claude stdin JSON contracts unchanged.",
"max_score": 10
},
{
"name": "Upstream OpenCode comparison",
"description": "The output explicitly compares the generated approach with upstream `src/services/integrations/OpenCodeInstaller.ts` and `src/integrations/opencode-plugin/index.ts`, including plugin install destination, `AGENTS.md` context injection, `tool.execute.after`, event handlers, and `claude_mem_search` behavior.",
"max_score": 10
},
{
"name": "MCP migration",
"description": "The solution handles `plugin/.mcp.json` by producing or documenting an OpenCode `mcp` config entry for `mcp-search`, converting command/args shape appropriately, avoiding bundled-MCP claims, and resolving `${CLAUDE_PLUGIN_ROOT}` safely without inlining secrets.",
"max_score": 8
},
{
"name": "Shared skills and package assets",
"description": "Existing `plugin/skills/*/SKILL.md` assets are reused as shared or package-local runtime content without creating divergent Claude/OpenCode copies, and the output validates skill frontmatter, including explicitly handling the upstream `version-bump` directory/name mismatch.",
"max_score": 7
},
{
"name": "Safe state and paths",
"description": "Generated OpenCode state handling avoids using Claude config/cache/marketplace paths as the OpenCode source of truth, and documents or tests worker port, data directory, plugin root, and XDG/OpenCode config path behavior.",
"max_score": 8
},
{
"name": "Package layout",
"description": "Generated package files live under `opencode-plugin/` by default, with `.opencode/` used only if explicitly documented as an optional local dogfooding harness.",
"max_score": 6
},
{
"name": "Package metadata",
"description": "`opencode-plugin/package.json` is ESM, points `main`/`exports` at an existing plugin entrypoint, includes OpenCode-oriented keywords, and limits published files to runtime/package assets rather than `.claude/`, local config, tests, or unrelated agent metadata.",
"max_score": 6
},
{
"name": "Hook and package tests",
"description": "Tests import or instantiate the OpenCode plugin and exercise OpenCode-like fixtures for key behavior: tool observation capture, session creation/init, assistant message capture, compaction/summarization caveat handling, file edit capture, search tool fallback, and MCP config validation if generated.",
"max_score": 9
},
{
"name": "Honest caveats",
"description": "The solution does not claim exact parity for worker lifecycle, context injection timing, compaction behavior, transcript semantics, or MCP installation unless those behaviors are directly tested; caveats are visible in `OPENCODE_SUPPORT.md` or equivalent notes.",
"max_score": 6
},
{
"name": "Scoped finish",
"description": "The solution does not add GitHub Actions workflows, npm publishing automation, release workflows, PR draft files, or claim that `opencode plugin <package>` is already publicly installable before publication.",
"max_score": 7
}
]
}