架构 · 难度:参考

CLI 与平台

位于 src/ 的 Bun/TypeScript CLI(52 个文件、11,086 行)将单一源插件转换为每一个目标平台。本页描绘全部模块、全部转换器、全部目标写入器以及全部平台清单。

模块结构

CLI 模块结构 — 入口、命令、解析、转换、目标、辅助、发布 src/index.ts citty CLI 根 (25 行) src/commands/ 5 个子命令(1,474 行) src/parsers/ claude.ts (270 行) src/converters/ 8 个文件 · 1,946 行 src/targets/ 7 个文件 · 2,306 行 src/types/ 8 个文件 · 419 行 src/utils/ 13 个文件 · 2,112 行 src/utils/legacy-cleanup.ts 1,200 行 —— src/ 中最大的文件 src/release/ 4 个文件 · 1,076 行 src/data/ 1 个文件 · 674 行
源码树。最大的文件是 legacy-cleanup.ts(1,200 行);其次是 codex.ts(881 行)。

数据流

CLI 数据流 — Disk → Claude 解析 → 内存模型 → 转换器 → 目标产物 Disk claude.ts loadClaudePlugin() ClaudePlugin 规范化内存模型 converter/*.ts 内存中转换 target writer writeBundle + manifest Disk → host
数据流:磁盘 → 解析器 → 规范化模型 → 转换器 → 写入器 → 宿主安装到磁盘。

子命令

子命令文件行数用途
convertsrc/commands/convert.ts229加载一个 Claude 插件,转换并写入到一个或多个目标。
installsrc/commands/install.ts343与 convert 相同,但从插件名解析源(捆绑包、GitHub 克隆或本地路径)。
listsrc/commands/list.ts41打印工作副本中的 Claude 插件名称。
plugin-pathsrc/commands/plugin-path.ts122将插件分支克隆到 ~/.cache/compound-engineering/branches/,并打印供 claude --plugin-dir 使用的路径。
cleanupsrc/commands/cleanup.ts739在 8 个目标(codex/opencode/pi/kiro/copilot/droid/qwen/windsurf)上备份陈旧的 CE 工件。

转换器

转换器文件行数关键导出
Claude → OpenCodesrc/converters/claude-to-opencode.ts518convertClaudeToOpenCodeClaudeToOpenCodeOptionsPermissionMode
Claude → Codexsrc/converters/claude-to-codex.ts285convertClaudeToCodexClaudeToCodexOptions
Claude → Pisrc/converters/claude-to-pi.ts189convertClaudeToPitransformContentForPi
Claude → Antigravitysrc/converters/claude-to-antigravity.ts205convertClaudeToAntigravity
Claude → Kirosrc/converters/claude-to-kiro.ts294convertClaudeToKiro
Claude → Copilotsrc/converters/claude-to-copilot.ts213convertClaudeToCopilot
Claude → Droidsrc/converters/claude-to-droid.ts176convertClaudeToDroid
Claude 是规范的源

不存在反向转换器。其他所有目标都由 Claude 源生成。更新的路径始终是:编辑 Claude 源 → 重新转换。

目标写入器

目标文件行数关键函数显著行为
OpenCodesrc/targets/opencode.ts287writeOpenCodeBundle深度合并到现有的 opencode.json;通过安装清单保留用户符号链接。
Codexsrc/targets/codex.ts881writeCodexBundle最大的写入器。完整的清单读写 + 所有权门控 + externallyManagedSkillNames 清理。
Pisrc/targets/pi.ts590writePiBundleAGENTS.md 中保留 Pi 伴生横幅块;符号链接清单。
Kirosrc/targets/kiro.ts165writeKiroBundleAgent 以 JSON + prompt 形式呈现;由命令生成技能;steering 文件源自 AGENTS.md
Antigravitysrc/targets/antigravity.ts61writeAntigravityBundle自包含的 .agy/ 目录;用户通过 agy plugin install <dir> 安装。
受管工件src/targets/managed-artifacts.ts325ManagedInstallManifest 读 / 写 / 清理所有管理安装路径的写入器共用基础设施。包含安装清单不变量的实现。

类型

类型文件行数
ClaudePluginsrc/types/claude.ts101
OpenCodeBundlesrc/types/opencode.ts72
CodexBundlesrc/types/codex.ts50
PiBundlesrc/types/pi.ts47
AntigravityBundlesrc/types/antigravity.ts50
KiroBundlesrc/types/kiro.ts47
CopilotBundlesrc/types/copilot.ts32
DroidBundlesrc/types/droid.ts21

工具

工具行数用途
files.ts205文件系统包装与路径安全(pathExistsensureDirwriteTextSecurewalkFiles 等)
frontmatter.ts83YAML frontmatter 的解析 / 格式化
json-config.ts47按 JSON 键进行安全的深度合并
model.ts94跨平台模型归一化(CLAUDE_FAMILY_ALIASES
codex-agents.ts57$CODEX_HOME/AGENTS.md 中剥离遗留的 Codex 工具映射块
codex-content.ts138面向 Codex 输出的内容转换
detect-tools.ts113检测本机安装了哪些 AI 编程工具
legacy-cleanup.ts1,200陈旧技能 / agent 名称登记表 + 所有权启发式(src/ 中最大的文件)
opencode-config.ts25解析 OPENCODE_CONFIG_DIR / ~/.config/opencode
resolve-home.ts26展开 ~,解析每个目标的主目录
resolve-output.ts49决定目标的输出落在何处
secrets.ts24启发式检测看起来像机密的 env 变量名
slash-command.ts42共享的 /command 检测器 + 保留路径白名单
symlink.ts41技能名校验 + 拒绝覆盖真实目录的 forceSymlink

发布系统

文件行数用途
src/release/components.ts261将文件映射到发布组件(compound-engineeringmarketplacecursor-marketplace
src/release/config.ts78release-please 的 release-as 钉死陈旧度检测器
src/release/metadata.ts694为每个插件 + marketplace 文件读写版本元数据
src/release/types.ts43仅类型定义

平台清单

每个平台都有自己的清单文件(们),位于仓库根:

平台清单路径关键内容
Claude Code.claude-plugin/marketplace.json + .claude-plugin/plugin.jsonname, owner, metadata.version(1.0.3 / 3.26.3),plugins[], interface{}
Codex.codex-plugin/plugin.jsonname, owner, metadata
Cursor.cursor-plugin/marketplace.json + .cursor-plugin/plugin.json与 Claude Code 相同;独立的 marketplace
OpenCode.opencode/ + package.json 字段 mainTS 插件入口
Pi.pi/extensions/ + package.json 中的 pi.extensions[] + pi.skills[]TS 扩展
Antigravity通过 cli convert自包含的 .agy/
Kiro通过 cli convertagent JSON + 生成的技能
Copilot通过 cli convertagents + skills
Droid通过 cli convertagents(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 会话。