架构 · 难度:参考
CLI 与平台
位于 src/ 的 Bun/TypeScript CLI(52 个文件、11,086 行)将单一源插件转换为每一个目标平台。本页描绘全部模块、全部转换器、全部目标写入器以及全部平台清单。
模块结构
源码树。最大的文件是
legacy-cleanup.ts(1,200 行);其次是 codex.ts(881 行)。数据流
数据流:磁盘 → 解析器 → 规范化模型 → 转换器 → 写入器 → 宿主安装到磁盘。
子命令
| 子命令 | 文件 | 行数 | 用途 |
|---|---|---|---|
convert | src/commands/convert.ts | 229 | 加载一个 Claude 插件,转换并写入到一个或多个目标。 |
install | src/commands/install.ts | 343 | 与 convert 相同,但从插件名解析源(捆绑包、GitHub 克隆或本地路径)。 |
list | src/commands/list.ts | 41 | 打印工作副本中的 Claude 插件名称。 |
plugin-path | src/commands/plugin-path.ts | 122 | 将插件分支克隆到 ~/.cache/compound-engineering/branches/,并打印供 claude --plugin-dir 使用的路径。 |
cleanup | src/commands/cleanup.ts | 739 | 在 8 个目标(codex/opencode/pi/kiro/copilot/droid/qwen/windsurf)上备份陈旧的 CE 工件。 |
转换器
| 转换器 | 文件 | 行数 | 关键导出 |
|---|---|---|---|
| Claude → OpenCode | src/converters/claude-to-opencode.ts | 518 | convertClaudeToOpenCode、ClaudeToOpenCodeOptions、PermissionMode |
| Claude → Codex | src/converters/claude-to-codex.ts | 285 | convertClaudeToCodex、ClaudeToCodexOptions |
| Claude → Pi | src/converters/claude-to-pi.ts | 189 | convertClaudeToPi、transformContentForPi |
| Claude → Antigravity | src/converters/claude-to-antigravity.ts | 205 | convertClaudeToAntigravity |
| Claude → Kiro | src/converters/claude-to-kiro.ts | 294 | convertClaudeToKiro |
| Claude → Copilot | src/converters/claude-to-copilot.ts | 213 | convertClaudeToCopilot |
| Claude → Droid | src/converters/claude-to-droid.ts | 176 | convertClaudeToDroid |
Claude 是规范的源
不存在反向转换器。其他所有目标都由 Claude 源生成。更新的路径始终是:编辑 Claude 源 → 重新转换。
目标写入器
| 目标 | 文件 | 行数 | 关键函数 | 显著行为 |
|---|---|---|---|---|
| OpenCode | src/targets/opencode.ts | 287 | writeOpenCodeBundle | 深度合并到现有的 opencode.json;通过安装清单保留用户符号链接。 |
| Codex | src/targets/codex.ts | 881 | writeCodexBundle | 最大的写入器。完整的清单读写 + 所有权门控 + externallyManagedSkillNames 清理。 |
| Pi | src/targets/pi.ts | 590 | writePiBundle | 在 AGENTS.md 中保留 Pi 伴生横幅块;符号链接清单。 |
| Kiro | src/targets/kiro.ts | 165 | writeKiroBundle | Agent 以 JSON + prompt 形式呈现;由命令生成技能;steering 文件源自 AGENTS.md。 |
| Antigravity | src/targets/antigravity.ts | 61 | writeAntigravityBundle | 自包含的 .agy/ 目录;用户通过 agy plugin install <dir> 安装。 |
| 受管工件 | src/targets/managed-artifacts.ts | 325 | ManagedInstallManifest 读 / 写 / 清理 | 所有管理安装路径的写入器共用基础设施。包含安装清单不变量的实现。 |
类型
| 类型 | 文件 | 行数 |
|---|---|---|
| ClaudePlugin | src/types/claude.ts | 101 |
| OpenCodeBundle | src/types/opencode.ts | 72 |
| CodexBundle | src/types/codex.ts | 50 |
| PiBundle | src/types/pi.ts | 47 |
| AntigravityBundle | src/types/antigravity.ts | 50 |
| KiroBundle | src/types/kiro.ts | 47 |
| CopilotBundle | src/types/copilot.ts | 32 |
| DroidBundle | src/types/droid.ts | 21 |
工具
| 工具 | 行数 | 用途 |
|---|---|---|
| files.ts | 205 | 文件系统包装与路径安全(pathExists、ensureDir、writeTextSecure、walkFiles 等) |
| frontmatter.ts | 83 | YAML frontmatter 的解析 / 格式化 |
| json-config.ts | 47 | 按 JSON 键进行安全的深度合并 |
| model.ts | 94 | 跨平台模型归一化(CLAUDE_FAMILY_ALIASES) |
| codex-agents.ts | 57 | 从 $CODEX_HOME/AGENTS.md 中剥离遗留的 Codex 工具映射块 |
| codex-content.ts | 138 | 面向 Codex 输出的内容转换 |
| detect-tools.ts | 113 | 检测本机安装了哪些 AI 编程工具 |
| legacy-cleanup.ts | 1,200 | 陈旧技能 / agent 名称登记表 + 所有权启发式(src/ 中最大的文件) |
| opencode-config.ts | 25 | 解析 OPENCODE_CONFIG_DIR / ~/.config/opencode |
| resolve-home.ts | 26 | 展开 ~,解析每个目标的主目录 |
| resolve-output.ts | 49 | 决定目标的输出落在何处 |
| secrets.ts | 24 | 启发式检测看起来像机密的 env 变量名 |
| slash-command.ts | 42 | 共享的 /command 检测器 + 保留路径白名单 |
| symlink.ts | 41 | 技能名校验 + 拒绝覆盖真实目录的 forceSymlink |
发布系统
| 文件 | 行数 | 用途 |
|---|---|---|
| src/release/components.ts | 261 | 将文件映射到发布组件(compound-engineering、marketplace、cursor-marketplace) |
| src/release/config.ts | 78 | release-please 的 release-as 钉死陈旧度检测器 |
| src/release/metadata.ts | 694 | 为每个插件 + marketplace 文件读写版本元数据 |
| src/release/types.ts | 43 | 仅类型定义 |
平台清单
每个平台都有自己的清单文件(们),位于仓库根:
| 平台 | 清单路径 | 关键内容 |
|---|---|---|
| Claude Code | .claude-plugin/marketplace.json + .claude-plugin/plugin.json | name, owner, metadata.version(1.0.3 / 3.26.3),plugins[], interface{} |
| Codex | .codex-plugin/plugin.json | name, owner, metadata |
| Cursor | .cursor-plugin/marketplace.json + .cursor-plugin/plugin.json | 与 Claude Code 相同;独立的 marketplace |
| OpenCode | .opencode/ + package.json 字段 main | TS 插件入口 |
| Pi | .pi/extensions/ + package.json 中的 pi.extensions[] + pi.skills[] | TS 扩展 |
| Antigravity | 通过 cli convert | 自包含的 .agy/ |
| Kiro | 通过 cli convert | agent JSON + 生成的技能 |
| Copilot | 通过 cli convert | agents + skills |
| Droid | 通过 cli convert | agents(droids)+ commands + skill 目录 |
npm 脚本
// 转换所有目标
"dev": "bun run src/index.ts"
"convert": "bun run src/index.ts convert"
// 安装 + 清理
"cli:install": "bun run src/index.ts install"
"cleanup": "bun run src/index.ts cleanup"
// Codex 本地开发
"codex:dev": "bun run scripts/codex-dev.ts"
// 测试
"test": "bun run scripts/run-tests.ts"
"test:skill-eval-cell": "bun tests/skill-eval-cell/run.ts"
"test:skill-eval-pack": "bun tests/skill-eval-cell/pack.ts"
// 校验
"plugin:validate": "claude plugin validate --strict .claude-plugin/marketplace.json && claude plugin validate --strict .claude-plugin/plugin.json"
"release:validate": "bun run scripts/release/validate.ts"
不要使用
claude plugin validate .那样只会校验 marketplace(因为存在 .claude-plugin/marketplace.json)。务必使用 --strict 显式传入两个路径。
安装清单不变量
install-manifest.json 中的安装清单记录了每个写入器声明的路径。其不变量为:写入器绝不声明其并未实际写入的路径。这一自愈式账本是 targets/managed-artifacts.ts 与所有清理门控的基础。当你删除一个技能时,它原先的声明会被转为备份,清单也会被原子地更新。
codex:dev 脚本
# 链接本工作区的技能(符号链接到 $CODEX_HOME/skills/compound-engineering-local)
bun run codex:dev -- local # 别名:refresh = local
# 显示 local / remote 状态以及检出来源
bun run codex:dev -- status
# 恢复官方 marketplace 提供的插件
bun run codex:dev -- remote
# 移除两个受支持的 CE 安装面
bun run codex:dev -- remove
源码:src/dev/codex-dev.ts(738 行)。local 模式仅管理精确的符号链接与 CE 插件 ID;不得改动用户无关的技能。切换模式后需要开启一个新的 Codex 会话。