ClaudeCode 到 OpenCode 适配通用指南

本文提炼 ClaudeCode 生态能力迁移到 OpenCode 时的通用设计关注点。适配的重点不是逐文件复制 .claude 目录,也不是把一个宿主的术语机械映射到另一个宿主,而是先识别产品能力、宿主加载机制、 运行边界、交付形态和验证方式,再用 OpenCode 原生模型重新落地。

Capability-first migration Host-native loading Isolation before convenience Observable validation

一、先判断迁移对象

适配前应先回答“要迁移的到底是什么”。ClaudeCode 项目里常见的目录、命令、skill、hook、agent、脚本和文档并不一定都是产品能力,有些只是 ClaudeCode 宿主下的加载形式。 通用做法是先抽象能力,再选择 OpenCode 中对应的承载方式。

产品能力

用户真正需要的命令、流程、自动化判断、代码生成、审计、测试、发布等能力。迁移时应保持这些能力,而不是保持旧目录结构。

宿主加载形式

ClaudeCode 的 command、skill、hook、settings 和 subagent 需要重新评估,分别落到 OpenCode 的 command、agent、plugin、config 或外部 runtime。

运行控制面

复杂流程不宜全部写进提示词或插件。稳定逻辑应进入脚本/runtime,宿主命令只做入口、参数转交和结果展示。

交付对象

要区分“适配包自身如何被 OpenCode 加载”和“适配包生成或修改的目标项目资产如何被 OpenCode 加载”。这两类契约不能混在同一个 schema 中。

二、ClaudeCode 到 OpenCode 的常见映射

ClaudeCode 侧概念 OpenCode 侧候选承载 适配判断
Slash command / prompt command .opencode/commands/*.md 适合保留为用户可见入口,但命令体应尽量薄,只调用确定性 runtime 或明确的 agent 流程。
Skill OpenCode agent、command 文档、项目规则或 runtime 模块 不要默认迁移成同名 skill。先判断它是角色能力、操作步骤、知识库,还是可执行工具。
Hook .opencode/plugins/*.ts 适合做事件监听、命令桥接、工具前后处理。不要把完整业务编排塞进 plugin hook。
Subagent / 单个 reviewer role .opencode/agents/*.md 这里指 OpenCode 可加载、可被调用的单个执行角色。它是执行机制,不负责表达完整团队结构。
Agent team / 多角色协作流程 runtime team plan、orchestrator 配置或运行证据 这里指团队结构和阶段职责,例如谁负责设计、谁负责验证、如何 fan-out/fan-in。它不是 OpenCode 独立加载的 agent 文件。
Settings / permissions opencode.json + 项目安装 manifest 权限要最小化;全局设置只放通用 bootstrap 或用户明确接受的配置,项目行为应本地可复现。
工具脚本和 validator 项目内 runtime、包内 runtime 或外部 CLI 稳定逻辑应自包含交付,避免运行时偷偷依赖开发仓库路径。

三、核心设计关注点

加载边界

明确哪些资产由 OpenCode 自动发现,哪些资产只是 runtime 内部实现。不要把内部实现字段写进用户项目的工作流 schema。

命名空间

为产品命令、生成命令、插件 ID、agent 名称预留不同命名空间。冲突不是小问题,会直接导致用户运行错入口。

安装半径

全局安装方便但污染范围大;项目本地安装隔离好但首次使用麻烦。常见折中是全局轻量 bootstrap + 项目本地物化。

依赖封装

如果 runtime 依赖 Python、Node、第三方包或外部 CLI,应提供版本、锁定依赖、环境诊断和失败降级路径。

写入安全

对目标项目的写入应先生成候选产物,再做 diff、冲突检测、确认、apply 和 rollback,而不是让 agent 直接改目标文件。

可观测验证

区分静态文件存在、runtime 可执行、OpenCode 宿主可见、真实模型执行成功。不同层级的测试不能互相替代。

四、主要难点与解决方案

难点 风险 解决方案
两个宿主的概念不是一一映射 把旧宿主的加载模型复制到新宿主,导致交付形态混乱 采用 capability-first 迁移:先列产品能力,再选择 OpenCode 原生 command、agent、plugin、config 或 runtime 承载。
产品包自身和目标项目都可能包含 OpenCode 资产 产品命令、生成命令、package plugin、target plugin 互相覆盖 定义清晰根路径和命名空间。例如产品包根、目标项目根、运行证据根分别管理,生成资产不得占用产品命名空间。
宿主会读取全局配置和第三方资产 用户以为运行的是当前项目能力,实际入口来自全局目录或其它工具包 提供 doctor/source inventory:列出 project、global、旧宿主目录、第三方包来源,并报告 shadowing 风险。
全局安装和项目安装的取舍困难 全局安装污染强,项目安装体验弱 将“部署器”全局化,将“完整能力”项目本地化。全局只提供 install/status/upgrade/uninstall 这类 bootstrap 入口。
runtime 依赖在用户环境中不可控 命令在开发机可用,在用户项目或 CI 中失败 声明依赖、锁定版本、提供专用 venv 或 bundle 策略,并在 doctor 中显式诊断解释器、依赖和路径问题。
真实 OpenCode 执行依赖 provider/API 和宿主状态 测试假阳性或把环境问题误判为设计失败 测试结果分为 PASSFAILENVIRONMENT-SKIP;无 API 时不声称真实宿主执行成功。

五、推荐架构取舍

通用建议是:全局只放低风险引导器,项目本地承载完整能力,runtime 负责确定性逻辑,OpenCode 原生命令和插件负责宿主接入。 这样可以同时控制用户体验、隔离性、可复现性和可验证性。

方案 结论 原因
完整全局安装 谨慎采用 只适合极小、无项目状态、无写入目标文件的工具;复杂工作流容易造成命令污染和版本串扰。
纯项目本地安装 适合作为基础能力 隔离性和可复现性最好,但新项目首次使用不够友好。
全局轻量 bootstrap 推荐 用户只需全局安装一次部署器;每个项目仍获得完整、可诊断、可回滚的本地安装。
外部 runtime 编排 推荐用于复杂流程 把确定性逻辑、状态机、validator、rollback、报告生成放到可测试 runtime 中,降低提示词漂移风险。

六、黑盒验收口径

七、WorkflowProgram 案例

WorkflowProgram 的 OpenCode 适配采用了上述通用原则。它没有复制 ClaudeCode 版的目录结构,而是把产品入口落到 .opencode/commands/wp-*.md,把角色能力落到 .opencode/agents/*.md,把 hook bridge 落到 .opencode/plugins/workflowprogram.ts,把确定性编排和 validator 放到 Python runtime。

安装模型上,WorkflowProgram 没有把完整能力全局安装,而是新增全局轻量 bootstrap: /wp-install/wp-status/wp-upgrade/wp-uninstall。 完整 /wp-develop/wp-validate、agent pack、plugin 和 runtime 仍物化到每个目标项目中。

这个案例的特殊命名如 WP_PACKAGE_ROOTTARGET_ROOTRUN_ROOT/wp-* 不是通用规定, 但背后的通用原则是:产品包根、目标项目根、运行证据根必须分离;产品命名空间和生成命名空间必须分离;全局便利性不能破坏项目隔离性。