一、项目结构

├── .claude-plugin/
│   └── marketplace.json            # 市场定义(唯一必需的配置文件)
├── plugins/
│   ├── plugin-a/                   # 插件 A
│   │   ├── .claude-plugin/plugin.json
│   │   ├── hooks/
│   │   ├── scripts/
│   │   └── skills/
│   ├── plugin-b/                   # 插件 B
│   └── plugin-c/                   # 插件 C
└── dist/                           # 打包输出目录

核心要点: 一个 Git 仓库可以包含多个插件,每个插件放在 plugins/ 下的独立子目录中。


二、关键文件说明

marketplace.json

市场只需要 一个 配置文件:.claude-plugin/marketplace.json

{
  "name": "my-marketplace",
  "plugins": [
    {
      "name": "plugin-a",
      "source": "./plugins/plugin-a",
      "description": "插件描述",
      "version": "0.0.1"
    }
  ]
}
  • source 使用相对路径即可,无论本地安装还是远程安装都适用
  • 不需要 额外创建 marketplace-remote.json,Claude Code 会先 clone 仓库再解析相对路径

plugin.json

每个插件必须有 .claude-plugin/plugin.json,定义插件的元信息。


三、安装方式

用户安装流程(两步)

# 1. 添加市场源(一次性)
/plugin marketplace add git@your-git-server.com:org/marketplace-repo.git

# 2. 安装具体插件
/plugin install plugin-a@my-marketplace

本地开发调试

/plugin marketplace add /path/to/local/marketplace-repo
/plugin install plugin-a@my-marketplace

四、git-subdir 机制

当用户通过 Git URL 添加市场后,安装插件时 Claude Code 使用 git-subdir 机制:

  1. clone 整个仓库到本地缓存
  2. 定位到插件子目录(如 plugins/plugin-a
  3. 提取该子目录作为插件内容安装

这就是"一个仓库、多个插件"能工作的原因。


五、SSH vs HTTPS 踩坑记录

问题现象

协议 marketplace add plugin install
HTTPS ❌ 认证失败(内网 Git 平台不支持匿名 HTTPS) -
SSH ✅ 成功 ❌ 报错:地址被转换为错误的 HTTP URL

根因分析

Claude Code 在处理 git-subdir 源时,会内部将 SSH 地址转换为 HTTP 地址进行 clone。如果内网 Git 平台的 HTTP 服务返回了重定向或格式不兼容,就会导致 clone 失败。

转换链路:

git@server.com:org/repo.git
    ↓ Claude Code 内部 SSH→HTTP 转换
http://server.com/org/repo.git
    ↓ 平台 HTTP 重定向
http://other-domain.com/path/org/repo.git  ← 不可用

解决方案

利用 Git 的 insteadOf URL 重写机制,将错误的 HTTP 地址拦截并替换回 SSH。

语法结构:

[url "<替换后的前缀>"]
    insteadOf = <要被替换的前缀>

示例:

git config --global url."git@your-git-server.com:".insteadOf "http://redirected-domain.com/path/"

原理: Git 在发起网络请求前,会先检查 URL 是否匹配 insteadOf 规则,匹配则做前缀替换:

输入:  http://redirected-domain.com/path/org/repo.git
匹配:  http://redirected-domain.com/path/
替换为: git@your-git-server.com:
结果:  git@your-git-server.com:org/repo.git  ← 走 SSH,正常工作

注意事项

  • 这条 insteadOf 规则需要每个团队成员都配置一次
  • 建议写入 README 的前置配置步骤中
  • 只做前缀替换,后面的路径部分原样保留

六、常见问题

Q: marketplace.json 和 marketplace-remote.json 都需要吗?

不需要。 只保留 marketplace.json 即可。Claude Code 通过 Git URL 添加市场时,会先 clone 仓库,然后读取 marketplace.json,其中的相对路径会基于 clone 后的本地目录解析。

Q: HTTPS 认证失败怎么办?

如果内网 Git 平台不支持匿名 HTTPS clone,直接使用 SSH 地址 + insteadOf 配置方案。

Q: 更新插件后用户如何获取最新版?

将代码 push 到 Git 仓库后,用户重新执行 /plugin install 即可拉取最新版本。


七、发布 Checklist

  1. ✅ 插件目录下有 .claude-plugin/plugin.json
  2. marketplace.json 中已注册该插件
  3. ✅ 代码已 push 到远程 Git 仓库
  4. ✅ README 中包含前置配置说明(如需要 insteadOf
  5. ✅ 团队成员已配置 Git URL 重写规则
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐