概述
创建和分发 marketplace 涉及:- 创建 plugins:使用 skills、agents、hooks、MCP servers 或 LSP servers 构建一个或多个 plugins。本指南假设你已经有要分发的 plugins;有关如何创建 plugins 的详细信息,请参阅创建 plugins。
- 创建 marketplace 文件:定义一个
marketplace.json,列出你的 plugins 及其位置。请参阅创建 marketplace 文件。 - 托管 marketplace:推送到 GitHub、GitLab 或其他 git 主机。请参阅托管和分发 marketplaces。
- 与用户共享:用户使用
/plugin marketplace add添加你的 marketplace 并安装单个 plugins。请参阅发现和安装 plugins。
/plugin marketplace update 刷新他们的本地副本。
演练:创建本地 marketplace
此示例创建一个包含一个 plugin 的 marketplace:一个用于代码审查的quality-review skill。你将创建目录结构、添加 skill、创建 plugin manifest 和 marketplace 目录,然后安装并测试它。
1
创建目录结构
2
创建 skill
创建一个
SKILL.md 文件,定义 quality-review skill 的功能。my-marketplace/plugins/quality-review-plugin/skills/quality-review/SKILL.md
3
创建 plugin manifest
创建一个
plugin.json 文件,描述该 plugin。manifest 位于 .claude-plugin/ 目录中。my-marketplace/plugins/quality-review-plugin/.claude-plugin/plugin.json
设置
version 意味着用户仅在你更改此字段时才会收到更新,因此在每次发布时都要提升版本号。具有 command source 的 plugin 不会被此字段固定。如果你省略 version,版本来自 版本管理 中的下一个来源。4
创建 marketplace 文件
创建列出你的 plugin 的 marketplace 目录。
my-marketplace/.claude-plugin/marketplace.json
5
添加和安装
从包含
my-marketplace 的目录启动 Claude Code 并运行以下命令。install 命令打开一个 plugin 详情视图,你可以在其中选择安装范围来确认安装。检查安装摘要:如果它报告 Run /reload-plugins to activate.,请参阅 不重启应用而应用 plugin 更改。6
尝试一下
在编辑器中选择一些代码并运行你的新 skill。Plugin skills 使用 plugin 名称进行命名空间划分。
plugins 如何安装:当用户安装 plugin 时,Claude Code 将 plugin 目录复制到缓存位置,除了 link mode 中的 command source,它被就地使用。复制的 plugins 无法使用
../shared-utils 之类的路径引用其目录外的文件,因为这些文件不会被复制。如果你需要在 plugins 之间共享文件,请使用符号链接。有关详细信息,请参阅 Plugin 缓存和文件解析。创建 marketplace 文件
在你的存储库根目录中创建.claude-plugin/marketplace.json。此文件定义你的 marketplace 的名称、所有者信息以及包含其源的 plugins 列表。
每个 plugin 条目至少需要一个 name 和 source(告诉 Claude Code 从哪里获取它)。有关所有可用字段,请参阅下面的完整架构。
Marketplace 架构
必需字段
保留名称:以下 marketplace 名称为 Anthropic 官方使用保留,第三方 marketplaces 无法使用:
claude-code-marketplace、claude-code-plugins、claude-plugins-official、claude-plugins-community、claude-community、anthropic-marketplace、anthropic-plugins、agent-skills、anthropic-agent-skills、knowledge-work-plugins、life-sciences、claude-for-legal、claude-for-financial-services、financial-services-plugins、first-party-plugins、claude-tag-plugins、healthcare。冒充官方 marketplaces 的名称(如 official-claude-plugins 或 anthropic-plugins-v2)也被阻止。保留这些名称可防止第三方 marketplace 将自己呈现为 Anthropic 发布的来源。Claude Code 每次加载 marketplace 时都会重新检查保留名称,而不仅仅是在添加时。在该名称成为保留名称之前以其中一个名称注册的 marketplace 停止加载,并报告它是从不受信任的来源注册的。移除该 marketplace 并从官方 Anthropic 来源重新添加它。受新保留名称影响的第三方 marketplace 在你以不同名称重新添加它后立即再次加载。在 v2.1.205 之前,first-party-plugins 和 healthcare 不是保留的,已在保留名称下注册的 marketplace 继续加载。在 v2.1.265 之前,claude-tag-plugins 不是保留的。所有者字段
可选字段
description 和 version 也可以在 metadata 下接受,以实现向后兼容性。
Plugin 条目
plugins 数组中的每个 plugin 条目描述一个 plugin 及其位置。你可以包含 plugin manifest 架构中的任何字段,如 description、version、author、commands 和 hooks,加上这些 marketplace 特定的字段:source、category、tags、strict、relevance、headers 和 headersHelper。
必需字段
可选 plugin 字段
标准元数据字段:
条目和 plugin 自己的
plugin.json 都可以设置显示字段 displayName、description、author、homepage、repository、license 和 keywords。在 plugin 列表和详情中,安装前后:
- 对于你在条目上设置的字段,用户会看到条目的值,即使
plugin.json设置了不同的值。 - 对于条目未设置的字段,用户会看到
plugin.json的值。
plugin.json,其 plugin 文件位于 marketplace 内部。对于具有任何其他源类型的条目,用户在安装 plugin 之前只会看到条目自己的字段。
组件配置字段:
存档身份验证字段:
当条目在需要凭证的服务器上具有
archive 源时设置这些字段。
Plugin 源
Plugin 源告诉 Claude Code 在你的 marketplace 中列出的每个单独 plugin 从哪里获取。这些在marketplace.json 中每个 plugin 条目的 source 字段中设置。
Claude Code 将每个已安装的 plugin 复制到本地版本化 plugin 缓存中,位置为 ~/.claude/plugins/cache,除了链接模式中的 command 源,Claude Code 会就地使用。Claude Code 还会将 plugin 的符合条件的 Node.js 包依赖项安装到缓存副本中。
Marketplace 源与 plugin 源:这些是控制不同事物的不同概念。
- Marketplace 源:从哪里获取
marketplace.json目录本身。在用户运行/plugin marketplace add或在extraKnownMarketplaces设置中设置。基于 Git 的 marketplace 源支持ref(分支/标签)但不支持sha。 - Plugin 源:从哪里获取 marketplace 中列出的单个 plugin。在
marketplace.json内每个 plugin 条目的source字段中设置。基于 Git 的 plugin 源支持ref(分支/标签)和sha(精确提交)。
acme-corp/plugin-catalog 的 marketplace(marketplace 源)可以列出从 acme-corp/code-formatter 获取的 plugin(plugin 源)。marketplace 源和 plugin 源指向不同的存储库,并独立固定。github、url 和 git-subdir。当在其中任何一个上同时设置 ref 和 sha 时,sha 是有效的固定。Claude Code 直接获取并检出固定的提交。
在大多数 git 主机上,包括 GitHub、GitLab 和 Bitbucket,这意味着即使上游的 ref 命名的分支或标签已被删除,只要提交仍然可从存储库到达,安装也会成功。某些服务器(如 AWS CodeCommit)不支持通过 SHA 获取提交。在这些服务器上,ref 必须仍然存在,固定的提交必须可从其到达。
如果你通过组织设置 > Plugins 分发 plugins,只允许某些源类型。见通过组织设置分发。
相对路径
对于同一存储库中的 plugins,使用以./ 开头的路径:
.claude-plugin/ 的目录。在上面的示例中,./plugins/my-plugin 指向 <repo>/plugins/my-plugin,即使 marketplace.json 位于 <repo>/.claude-plugin/marketplace.json。不要使用 ../ 来引用 marketplace 根目录外的路径。在 macOS 和 Linux 上,Claude Code 拒绝在前导 ./ 之后任何地方包含反斜杠的条目路径,所以在每个平台上将分隔符写为 /。
裸名是没有 / 的单个目录名,例如 "formatter"。要写裸名而不是 ./ 路径,请设置 metadata.pluginRoot 为它们解析的目录。使用 "pluginRoot": "./plugins",Claude Code 将 "source": "formatter" 解析为 ./plugins/formatter。需要 Claude Code v2.1.239 或更高版本。
metadata.pluginRoot 本身必须是 marketplace 内的相对路径。Claude Code 对已经以 ./ 开头的源忽略它。包含 / 的源,例如 team-a/formatter,不是裸名,即使设置了 metadata.pluginRoot,仍然需要 ./ 前缀。
GitHub 存储库
Git 存储库
Git 子目录
使用git-subdir 指向位于 git 存储库子目录中的 plugin。Claude Code 使用稀疏的部分克隆来仅获取子目录,最小化大型 monorepos 的带宽。
url 字段也接受 GitHub 简写(owner/repo)或 SSH URL(git@github.com:owner/repo.git)。
npm 包
作为 npm 包分发的 Plugins 使用npm install 安装。这适用于公共 npm registry 上的任何包或你的团队托管的私有 registry。
version 字段:
registry 字段:
Zip 存档
使用archive 将 plugin 分发为 Claude Code 通过 HTTPS 下载的 zip 文件,这样安装在用户机器上无需 git 或 npm 即可工作。在任何静态文件服务器或工件存储库上托管文件,例如 S3 bucket、Artifactory 通用存储库或 nginx。需要 Claude Code v2.1.224 或更高版本。在 v2.1.120 到 v2.1.223 版本上,安装 plugin 失败并显示 This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again.;在更早的版本上,包含 archive 条目的 marketplace 完全无法加载。
此条目从工件服务器上的 zip 文件安装 plugin:
.claude-plugin/,然后在单个顶级文件夹内查找,所以两种布局都可以安装:
sha256 字段,其中包含存档的摘要:
Plugin archive integrity check failed。
存档源接受这些字段:
sha256 摘要也用作 plugin 的版本,当 plugin.json 和 marketplace 条目都未声明版本时。见版本管理。如果你声明 version,该版本字符串是更新信号,所以在更改 zip 及其摘要后,也要提升版本,否则用户保留缓存副本。
验证存档下载
要验证存档下载,例如从私有 registry 下载,请设置 Claude Code 随之发送的 HTTP 标头。在你注册 marketplace 的url 源上设置 headers,例如 extraKnownMarketplaces 条目。在 Claude Code v2.1.238 或更高版本上,你可以在 plugin 的条目上设置它,在 source 旁边。
如果你要放在 headers 中的值是短期的,例如你的 registry 按需生成的令牌,请在同一位置设置 headersHelper 命令。Claude Code 运行命令并将其打印的 JSON 对象作为该位置的标头发送。需要 Claude Code v2.1.238 或更高版本。
你选择的位置决定了哪些下载获得标头以及 Claude Code 何时运行命令:
当两个位置都设置相同名称的标头时,Claude Code 发送条目的值。在一个位置内,命令打印的标头覆盖相同名称的列出的标头。
此条目在
source 旁边设置 headersHelper。它还设置 "strict": false,这是 Claude Code 对设置 headersHelper 的 marketplace.json 条目所需的。使用 "strict": false,marketplace 条目是 plugin 的完整定义,所以用户可以在接受命令之前查看 plugin 包含的内容:
claude plugin install my-plugin@your-marketplace。Claude Code 显示你命令和存档 URL,并在你接受后下载 zip。
在 v2.1.238 之前,Claude Code 下载条目的存档时不带其 headers 或 headersHelper,所以依赖它们的安装失败并显示 HTTP 401 while downloading plugin archive from,后跟 URL,registry 的状态代码代替 401。
编写 headersHelper 命令
无论你在 marketplace 的url 源还是在 plugin 条目上设置 headersHelper,编写命令以满足这些要求:
- 命令文本:最多 500 个可打印 ASCII 字符,没有四个或更多空格的运行。
- 输出:在 stdout 上打印一个标头名称和字符串值的 JSON 对象,然后在 10 秒内以 0 退出。
- Shell 和工作目录:Claude Code 通过
sh运行命令,或在 Windows 上通过cmd.exe,从配置目录~/.claude或CLAUDE_CONFIG_DIR。给出绝对路径或PATH上的命令,因为相对路径相对于该目录解析,而不是用户的项目。 - Claude Code 移除的变量:从
marketplace.json条目或项目的.claude/settings.json或.claude/settings.local.json中设置的命令的环境中,Claude Code 移除每个名称包含TOKEN、SECRET、KEY或AUTH等词的变量,包括ANTHROPIC_API_KEY。Claude Code 不对用户设置、--settings文件或托管设置中设置的命令应用此移除。 - Claude Code 设置的变量:
CLAUDE_CODE_MARKETPLACE_URL和CLAUDE_CODE_MARKETPLACE_NAME用于url源的命令,以及CLAUDE_CODE_PLUGIN_NAME和CLAUDE_CODE_PLUGIN_ARCHIVE_URL用于条目的命令。CLAUDE_CODE_MARKETPLACE_NAME在用户通过 URL 添加 marketplace 后的第一次获取时未设置,因为该获取是提供名称的。
Claude Code 何时跳过 headersHelper 命令或丢弃其输出
Claude Code 不运行headersHelper 命令,或在这些情况下丢弃来自 headers 或命令输出的标头:
- 命令失败:如果命令以非零退出、运行超过 10 秒或打印除 JSON 字符串值对象之外的任何内容,Claude Code 不进行它运行命令的获取或下载。
- Marketplace URL 不以
https://开头:Claude Code 不运行该url源的命令,仅发送其headers字段中列出的标头。 - 重定向离开源:当下载被重定向离开存档 URL 的源时,Claude Code 丢弃 marketplace
url源和 plugin 条目的headers值和命令输出。 - 条目设置路由或身份标头:Claude Code 从条目的
headers和命令输出中丢弃请求路由和客户端身份名称,例如Host、Cookie和X-Forwarded-*,并保留身份验证名称,例如Authorization。Claude Code 以这种方式过滤每个marketplace.json条目,以及内联设置条目取决于哪个文件声明它。 - 命令在
--add-dir目录的设置中设置:Claude Code 忽略它,在url源和内联 plugin 条目上都一样,仅发送该文件的headers。 - 托管设置阻止命令:将
disableCommandPluginSources设置为true阻止headersHelper命令,allowManagedHooksOnly也阻止它们,除非disableCommandPluginSources明确为false。在任一阻止下,Claude Code 仍然为托管设置本身声明的 marketplace 运行命令。
用户如何接受 headersHelper 命令
用户每次从 plugin 的自己的视图在/plugin 或使用 claude plugin install 或 claude plugin update 自己安装或更新该单个 plugin 时接受 plugin 条目的命令。Claude Code 显示命令和存档 URL,并仅在用户接受后运行命令。在非交互式 shell 中,传递 --yes 以接受它。
Claude Code 仅运行它显示的命令,用于它显示的存档 URL。如果条目的命令或存档 URL 在此期间更改,Claude Code 拒绝安装或更新。仅查询字符串中的更改不计算。
在任何其他操作上,而不是单个 plugin 安装或更新,Claude Code 既不运行条目的命令也不下载其存档,所以 plugin 保持其已安装版本或保持未安装。用户看到的取决于操作:
- 一次安装多个 plugins、从 plugin 建议或作为另一个 plugin 的依赖项:Claude Code 拒绝具有命令的 plugin 并将用户指向该 plugin 在
/plugin中的自己的视图。批量安装中的其他 plugins 仍然安装。依赖被拒绝 plugin 的 plugin 无法安装,直到用户自己安装被拒绝的 plugin。 - 后台自动更新,或会话启动用于从未下载其存档的 plugin:Claude Code 在
/plugin错误选项卡中列出 plugin,以便用户知道手动安装或更新它。找到条目的自动更新仍然宣传已安装版本列表无。
url 源的 headersHelper 在设置文件中声明,例如 extraKnownMarketplaces 条目,而不是在 marketplace 发布的目录中,所以 Claude Code 不会在每次安装或更新时要求用户接受它。声明它的设置文件决定了 Claude Code 何时运行它:
在
-p 或 SDK 会话中,Claude Code 无法显示安全批准对话框。它应用其他交付的设置,但 marketplace 获取和任何需要命令的存档下载失败,直到用户在交互式会话中批准。
对于这些文件之一中的内联 plugin 条目,Claude Code 要求与该文件中 marketplace 级别命令相同的文件夹信任或设置批准,用户也在每次安装或更新时接受条目的命令。
Command 源
当本地安装的工具生成 plugin 目录时使用command,例如为当前选定的工具链呈现其 plugin 的 IDE。Claude Code 在用户安装 plugin 时运行命令,并在后台每个会话重新运行一次,所以你的用户无需重新安装即可获取工具的更改输出。需要 Claude Code v2.1.229 或更高版本。在 v2.1.120 到 v2.1.228 上,安装 plugin 失败并显示 This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again.,在更早的版本上整个 marketplace 无法加载。
此条目从工具打印的任何目录安装 plugin:
sh 或 Windows 上的 cmd.exe,从用户的主目录。命令必须在 stdout 上打印恰好一行并以代码 0 退出。该行是包含完整 plugin 的目录的绝对路径,在命令退出时,路径可能在运行之间更改。
Claude Code 停止运行超过 timeout 秒的命令,安装或更新失败。Claude Code 也在这些情况下拒绝打印的路径,安装或更新以相同方式失败:
- 目录在其顶级没有 plugin 内容,例如
.claude-plugin/目录或skills/、commands/、agents/或hooks/目录 - 目录是 Claude Code 启动的目录,或其父目录之一
- 在 Windows 上,路径是 UNC 路径
复制模式和链接模式
使用默认的"mode": "copy",Claude Code 将打印的目录复制到版本化 plugin 缓存中,并从目录内容的哈希派生plugin 版本。你的工具可以在命令退出后删除或重写目录,产生相同内容的重新运行计为最新。Claude Code 拒绝安装大于 256 MiB 或包含超过 20,000 个条目的目录。
为大型 plugin 目录设置 "mode": "link",不应复制,例如呈现的 SDK 导出。Claude Code 用打印目录的每个顶级条目的链接填充 plugin 的缓存条目,并就地使用文件,所以没有复制、文件内容未哈希,大小限制不适用。如果顶级条目是指向打印目录外的符号链接,安装失败。Claude Code 也跳过链接模式 plugin 的Node.js 包依赖项安装,所以打印已包含 plugin 需要的任何 node_modules 的目录。
保持打印的目录就位,只要 plugin 保持安装,因为 Claude Code 在每次启动时通过这些链接加载 plugin。Claude Code 从打印目录的真实路径及其顶级条目派生plugin 版本,而不是文件内部,所以打印不同的路径以表示新内容。在打印目录中或其下方启动的会话中,Claude Code 根本不加载 plugin。
Claude Code 不支持 Windows 上的链接模式,拒绝在那里安装链接模式 plugin。改为声明 "mode": "copy"。
用户如何接受命令
Claude Code 在用户的机器上运行你的命令,所以它将每次运行绑定到用户的明确接受:- 当用户从
/plugin中的 plugin 详情屏幕安装 plugin,或在交互式终端中使用claude plugin install或claude plugin update安装或更新它时,Claude Code 首先向他们显示确切的命令字符串,并为该安装记录接受的命令。可以在接受相同命令的记录接受上进行的claude plugin update显示无。在非交互式 shell 中,例如配置脚本,传递--yes到claude plugin install或claude plugin update以接受它打印的命令。 - 每条其他路径仅运行用户已接受的命令。这包括从
/plugin启动的更新和何时 Claude Code 重新运行命令中描述的后台运行。当未接受任何内容时,Claude Code 拒绝运行命令并告诉用户如何查看它。Claude Code 从不将 command 源 plugin 安装为另一个 plugin 的依赖项,所以用户自己先安装它。 - 如果你更改条目的
command或切换其mode,用户保留他们已有的版本,Claude Code 停止重新运行命令。在交互式会话中,/plugin错误选项卡显示新命令,直到用户通过运行claude plugin update <plugin>@<marketplace>查看并接受它。
disableCommandPluginSources 在整个组织中阻止 command 源。如果组织设置 allowManagedHooksOnly,Claude Code 默认阻止 command 源。
Claude Code 何时重新运行命令
打印的目录反映工具在命令运行时的状态,所以 Claude Code 在这些时间重新运行命令:- 每次用户安装或更新 plugin 时
- 每个会话一次用于每个启用的 command 源 plugin,在后台,会话启动后不久。此运行不通过 marketplace 自动更新,所以它不依赖 marketplace 的自动更新设置
- 在启动或
/reload-plugins时,当启用的 plugin 的已安装版本从 plugin 缓存中丢失时
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 时,Claude Code 跳过两个后台运行。显式安装和更新仍然使用该变量集运行命令。
当命令的哈希输出已更改时,Claude Code 将结果安装为新版本并在运行的交互式会话中重新加载它,切换/reload-plugins 切换的相同组件。用户看到 plugin 已重新加载的通知。如果就地重新加载会使会话的提示缓存失效,Claude Code 改为提示用户运行 /reload-plugins,它警告缓存成本并在使用 --force 重新运行时应用。
高级 plugin 条目
此示例显示了使用许多可选字段的 plugin 条目,包括命令、agents、hooks 和 MCP servers 的自定义路径:commands和agents:你可以指定多个目录或单个文件。路径相对于 plugin 根目录,必须保持在其内部。- Claude Code 拒绝解析到 plugin 目录外的路径,例如
./../shared.md,带有path escapes plugin directory错误,仍然加载 plugin 而不带该组件
- Claude Code 拒绝解析到 plugin 目录外的路径,例如
${CLAUDE_PLUGIN_ROOT}:在 hook 命令和 MCP server 配置中使用此变量来引用 plugin 安装目录中的文件。- 查看替换表了解每个服务器类型在哪些配置字段中替换它
- 对于应该在 plugin 更新后保留的依赖项或状态,请改用
${CLAUDE_PLUGIN_DATA}
strict: false:由于这设置为 false,plugin 不需要自己的plugin.json。marketplace 条目定义了一切。见下面的 Strict 模式。
source 下的 skills/ 目录加载。skills 字段中列出的路径添加到该扫描中:
source: "./")共享一个 skills/ 文件夹时,改为列出特定子目录,以便每个条目仅加载自己的 skills:
skills/ 文件夹中的其他目录不会加载。列出 ./skills/ 本身或 plugin 根目录会保持完整扫描。如果列出的路径都不存在,则改为运行默认扫描。
Strict 模式
strict 字段控制 plugin.json 是否是组件定义(skills、agents、hooks、MCP servers、输出样式)的权威。
何时使用每种模式:
strict: true:plugin 有自己的plugin.json并管理自己的组件。marketplace 条目可以在顶部添加额外的 skills 或 hooks。这是默认值,适用于大多数 plugins。strict: false:marketplace 操作员想要完全控制。plugin repo 提供原始文件,marketplace 条目定义这些文件中的哪些被公开为 skills、agents、hooks 等。当 marketplace 以不同于 plugin 作者意图的方式重组或策划 plugin 的组件时很有用。
托管和分发 marketplaces
在 GitHub 上托管(推荐)
GitHub 是托管和分发 marketplace 的推荐方式:- 创建存储库:为你的 marketplace 设置一个新存储库
- 添加 marketplace 文件:使用你的 plugin 定义创建
.claude-plugin/marketplace.json - 与团队共享:用户使用
/plugin marketplace add owner/repo添加你的 marketplace
在其他 git 服务上托管
任何 git 托管服务都可以工作,例如 GitLab、Bitbucket 和自托管服务器。用户使用完整的存储库 URL 添加:私有存储库
Claude Code 支持从私有存储库安装 plugins。如果你通过组织设置 > Plugins分发你的 marketplace,你的 git 凭证不涉及:组织同步通过 Claude GitHub App 或你的组织的 GitHub Enterprise App 读取 marketplace 存储库,plugin 源如果无法进行身份验证必须是公开的。有关完整规则,请参阅通过组织设置分发。你运行的命令
当你运行/plugin marketplace add、/plugin install、/plugin update 或 /plugin marketplace update 时,Claude Code 使用你现有的 git 凭证助手,所以通过 gh auth login、macOS Keychain 或 git-credential-store 的 HTTPS 访问工作方式与你的终端中相同。SSH 访问工作,只要主机已经在你的 known_hosts 文件中,并且密钥已加载到 ssh-agent 中,因为 Claude Code 会抑制主机指纹和密钥密码的交互式 SSH 提示。GitHub owner/repo 简写源默认通过 SSH 克隆;设置 CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 以改为通过 HTTPS 克隆它们。
后台自动更新
默认情况下,后台刷新会为其git pull 禁用 git 凭证助手,所以即使配置了助手,pull 也无法对 HTTPS 上的私有存储库进行身份验证。SSH 远程不受影响:加载到 ssh-agent 中的密钥以与你运行的命令相同的方式对后台 pulls 进行身份验证。当后台 pull 失败时,Claude Code 会回退到从头重新克隆 marketplace。重新克隆确实使用你存储的 git 凭证,但它可能在大型存储库上超时,所以私有 marketplace 自动更新可能会间歇性失败。
两个设置使私有 marketplaces 的行为可预测:
- 设置
CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1以在后台 pull 失败时保留现有克隆,而不是删除并重新克隆。你的 plugins 继续从最后同步的状态工作,使用/plugin marketplace update的手动更新仍然使用你的凭证进行 pull。 - 配置 git 凭证助手,例如使用
gh auth setup-git用于 GitHub,以便重新克隆回退可以在不提示的情况下进行身份验证。
GITHUB_TOKEN)本身不会启用后台身份验证。令牌仅通过配置的凭证助手(例如 gh CLI 的助手,它读取 GH_TOKEN 和 GITHUB_TOKEN)生效。
要使后台 pull 本身通过 HTTPS 进行身份验证,请配置全局 git URL 重写。重写在远程 URL 中嵌入令牌,所以即使后台 pull 禁用凭证助手,它也会生效,成功的 pull 会跳过重新克隆回退。以下示例重写 marketplace 存储库的 URL 以包含访问令牌:
重写以纯文本形式在你的 gitconfig 中存储令牌,所以使用对 marketplace 存储库具有只读访问权限的令牌。
在 CI/CD 环境中,在从私有存储库安装 plugins 之前配置 git 凭证助手。在 GitHub Actions 上,导出对 marketplace 存储库具有读取访问权限的令牌作为
GH_TOKEN,然后运行 gh auth setup-git。默认工作流令牌只能访问工作流自己的存储库,所以另一个存储库中的私有 marketplace 需要个人访问令牌或应用令牌。在管道中配置的全局 URL 重写也直接对后台 pull 进行身份验证。通过组织设置分发
如果你在 Team 或 Enterprise 计划上通过组织设置 > Plugins分发 plugins,这些源规则适用:- marketplace 存储库必须是私有或内部的。组织同步通过 Claude GitHub App 或你的组织的 GitHub Enterprise App 读取它。
- 每个 plugin 源必须是
github、url或git-subdir类型,或相对路径,以./开头。如果你在metadata.pluginRoot下按裸名称列出 plugin,组织同步会将其拒绝为不支持的源,所以写出路径,例如./plugins/deploy-tools。 - plugin 源可以在两种情况下是私有的:
- 与 marketplace 存储库的所有者共享的 github.com 源
- 在你的组织的 GitHub Enterprise 主机上安装了 GHE App 的源
- 组织同步在没有凭证的情况下获取所有其他源,所以不同所有者下的 github.com 存储库和其他主机上的存储库(例如 GitLab 或 Bitbucket)必须是公开的。
marketplace.json plugin 条目引用你在 marketplace 存储库中的 plugins/deploy-tools 处提交的 plugin:
将可执行文件保留在顶级 bin 目录之外
不要在你通过组织设置分发的任何 plugin 中包含顶级bin/ 目录。claude.ai 拒绝具有该目录的 plugin,无论 plugin 是通过 marketplace 同步还是直接上传到达:
- Marketplace 同步:组织同步拒绝该 plugin 并同步 marketplace 的其余部分。错误消息以
Plugin contains a top-level bin/ directory开头。 - 直接上传:如果你改为在组织设置 > Plugins中上传 plugin,claude.ai 会以相同的消息拒绝上传。
scripts/,并从你的skills、hooks 或 MCP server 配置中将它们引用为 ${CLAUDE_PLUGIN_ROOT}/scripts/<name>。
为你的团队要求 marketplaces
你可以配置你的存储库,以便当团队成员信任项目文件夹时,Claude Code 会为他们添加你的 marketplace,无需单独的提示。将你的 marketplace 添加到.claude/settings.json:
如果你使用带有相对路径的本地
directory 或 file 源,路径将相对于你的存储库的主检出解析。当你从 git worktree 运行 Claude Code 时,路径仍然指向主检出,所以所有 worktrees 共享相同的 marketplace 位置。Marketplace 状态存储一次每个用户在 ~/.claude/plugins/known_marketplaces.json 中,而不是每个项目。为容器预填充 plugins
对于容器镜像和 CI 环境,你可以在构建时预填充 plugins 目录,以便 Claude Code 启动时已经有 marketplaces 和 plugins 可用,无需在运行时克隆任何内容。设置CLAUDE_CODE_PLUGIN_SEED_DIR 环境变量以指向此目录。
要分层多个种子目录,请在 Unix 上用 : 分隔路径,或在 Windows 上用 ; 分隔。Claude Code 按顺序搜索每个目录,第一个包含给定 marketplace 或 plugin 缓存的种子获胜。
种子目录镜像 ~/.claude/plugins 的结构:
~/.claude/plugins 目录复制到你的镜像中,并将 CLAUDE_CODE_PLUGIN_SEED_DIR 指向它。
要跳过复制步骤,请在构建期间将 CLAUDE_CODE_PLUGIN_CACHE_DIR 设置为你的目标种子路径,以便 plugins 直接安装到那里:
CLAUDE_CODE_PLUGIN_SEED_DIR=/opt/claude-seed,以便 Claude Code 在启动时从种子读取。
在启动时,Claude Code 将种子的 known_marketplaces.json 中找到的 marketplaces 注册到主配置中,并使用在 cache/ 下找到的 plugin 缓存,而无需重新克隆。这在交互模式和使用 -p 标志的非交互模式中都有效。
行为详情:
- 只读:种子目录永远不会被写入。由于 git pull 会在只读文件系统上失败,种子 marketplaces 的自动更新被禁用。
- 种子条目优先:在每次启动时,种子中声明的 marketplaces 会覆盖用户配置中的任何匹配条目。要选择退出种子 plugin,请使用
/plugin disable而不是删除 marketplace。 - 路径解析:Claude Code 通过在运行时探测
$CLAUDE_CODE_PLUGIN_SEED_DIR/marketplaces/<name>/来定位 marketplace 内容,而不是信任存储在种子 JSON 内的路径。这意味着即使在与构建时不同的路径上挂载,种子也能正确工作。 - 变更被阻止:针对种子管理的 marketplace 运行
/plugin marketplace remove或/plugin marketplace update会失败,并提示你要求管理员更新种子镜像。 - 与设置组合:如果
extraKnownMarketplaces或enabledPlugins声明的 marketplace 已经存在于种子中,Claude Code 使用种子副本而不是克隆。
托管 marketplace 限制
对于需要严格控制 plugin 源的组织,管理员可以使用托管设置中的strictKnownMarketplaces 设置限制用户允许添加哪些 plugin marketplaces。要同时拒绝为单次运行 sideload plugins、agents 和 MCP servers 的 CLI 标志,请将其与 disableSideloadFlags 配对。要允许列表哪些 marketplaces 的 plugins 可以作为上下文安装建议出现,请设置 pluginSuggestionMarketplaces。
strictKnownMarketplaces 匹配 plugin 来自的 marketplace,而不是其中的条目,所以用户仍然可以从允许的 marketplace 安装具有command 源的 plugin。要同时阻止 command 源,请设置 disableCommandPluginSources。
当在托管设置中配置 strictKnownMarketplaces 时,限制行为取决于值:
常见配置
禁用所有 marketplace 添加,包括官方 Anthropic marketplace:ref 或 path 变体:
- 在机器首次交互启动之前运行的非交互环境。
- Claude Code 已在阻止 marketplace 的策略下以交互方式运行的机器,例如空数组锁定。Claude Code 记录被阻止的尝试,在策略更改后不重试。
managed-settings.json 中的 extraKnownMarketplaces,以便 Claude Code 自动注册它,或运行 claude plugin marketplace add anthropics/claude-plugins-official。
仅允许特定 marketplaces:
".*" 作为 pathPattern 来允许任何文件系统路径,同时仍然使用 hostPattern 控制网络源。
strictKnownMarketplaces 限制用户可以添加的内容,但不会自行注册 marketplaces。要为用户自动注册允许的 marketplace,请在同一 managed-settings.json 中将其添加到 extraKnownMarketplaces。官方 Anthropic marketplace 是唯一 Claude Code 自行注册的,仅当允许列表允许时。自动注册也遗漏一些机器,例如非交互环境和早期策略阻止它的机器。要覆盖这些机器,也将官方 marketplace 添加到 extraKnownMarketplaces。有关两个设置并排,请参阅 strictKnownMarketplaces 参考。限制如何工作
限制在任何网络或文件系统操作之前进行检查。检查在 marketplace 添加以及 plugin 安装、更新、刷新和自动更新时运行。如果 marketplace 在配置策略之前被添加,其源不再与允许列表匹配,Claude Code 会拒绝从中安装或更新 plugins。相同的强制执行也适用于blockedMarketplaces。
要阻止 GitHub 所有者下的每个 marketplace 存储库,请在 blockedMarketplaces 条目中使用所有者通配符形式:{ "source": "github", "repo": "untrusted-org/*" }。需要 Claude Code v2.1.223 或更高版本。有关匹配规则(在阻止列表和允许列表之间不同),请参阅所有者通配符。
当用户添加 Claude Code 克隆而不是获取的 https:// 存储库 URL(例如裸 github.com 或 gitlab.com 存储库 URL)时,Claude Code 也会根据 blockedMarketplaces 中的 url 条目检查它。如果条目命名相同的 URL,Claude Code 会阻止添加。在该比较中,Claude Code 忽略 .git 后缀和用户在 # 后附加的任何 ref。需要 Claude Code v2.1.232 或更高版本。在 v2.1.232 之前,Claude Code 仅针对它作为托管 marketplace.json 文件获取的 URL 匹配 url 条目。
允许列表对大多数源类型使用精确匹配,除了所有者通配符 github 条目。要允许 marketplace,所有指定的字段必须匹配:
- 对于 GitHub 源:
repo是必需的,要么命名一个存储库,要么使用所有者通配符形式owner/*来覆盖该所有者下的每个存储库。有关通配符条目如何匹配(包括大小写规则),请参阅所有者通配符。对于单个存储库条目,ref必须完全匹配或在 marketplace 源和允许列表条目中都不存在,相同的规则适用于path - 对于 URL 源:完整 URL 必须完全匹配
- 对于
hostPattern源:marketplace 主机与正则表达式模式匹配 - 对于
pathPattern源:marketplace 的文件系统路径与正则表达式模式匹配
.git 后缀或 ssh:// 和 https:// 方案不同的 URL 视为不同的值。如果你的组织的 marketplace 可以通过多个 URL 形式克隆,优先使用 hostPattern 条目而不是字面 URL,以便 https://、ssh:// 和 user@host:path 形式都匹配。
因为 strictKnownMarketplaces 在托管设置中设置,个别用户和项目配置无法覆盖这些限制。
有关完整的配置详细信息,包括所有支持的源类型和与 extraKnownMarketplaces 的比较,请参阅 strictKnownMarketplaces 参考。
版本解析和发布渠道
Plugin 版本确定缓存路径和更新检测:如果解析的版本与用户已有的版本匹配,/plugin update 和自动更新会跳过该 plugin。对于 git 源,如果你省略 version,Claude Code 使用源的解析提交 SHA,所以用户在该提交更改时获得更新;这是内部或积极开发的 plugins 的最简单设置。有关完整的解析顺序(包括 archive 源),请参阅版本管理。
设置发布渠道
要为你的 plugins 支持”稳定”和”最新”发布渠道,你可以设置两个指向同一 repo 的不同 refs 或 SHAs 的 marketplaces。然后你可以通过托管设置以两种方式之一将每个用户组分配给其自己的 marketplace:- 部署单独的端点管理设置(例如托管设置文件或 MDM 配置文件)到每个组的设备。Claude Code 如何组合托管源说明每个组的文件或配置文件是否适用于也有组织范围源的设备。
- 为每个组定义一个 Claude apps gateway 策略。网关应用第一个匹配规则适合用户的策略,所以对策略进行排序,以便每个用户到达其组的策略。组策略的
extraKnownMarketplaces替换全局策略的映射而不是与其合并,所以在组的策略中列出组需要的每个 marketplace,而不仅仅是其渠道 marketplace。
latest-tools:
固定依赖版本
Plugin 可以将其依赖约束到 semver 范围,以便对依赖的更新不会破坏依赖的 plugin。有关{plugin-name}--v{version} git 标签约定、范围语法以及如何组合对同一依赖的多个约束,请参阅约束 plugin 依赖版本。
重命名或删除 plugin
Plugin 的name 是其稳定标识符。用户在 enabledPlugins、pluginConfigs 和 /plugin install 命令中引用它,所以改变它会破坏每个现有的安装。要改变 UI 中显示的标签而不破坏安装,请设置 displayName 并保持 name 不变。
如果你必须改变 plugin 的 name,或者你从 plugins 数组中删除 plugin,请添加顶级 renames 条目,以便现有用户迁移而不是看到 plugin-not-found 错误。自动迁移需要 Claude Code v2.1.193 或更高版本。将每个前名称映射到其当前名称,或映射到 null 如果 plugin 不再存在。以下示例将 formatter 重命名为 code-formatter 并记录 legacy-linter 已被删除:
renames 映射:
- 如果条目指向新名称,Claude Code 在其新名称下加载 plugin 并显示一行通知,例如
在"acme-tools" marketplace 中重命名为"code-formatter"。然后它在用户、项目和本地设置范围中为enabledPlugins和pluginConfigs都将旧键重写为新键,所以通知只出现一次。 - 对于
null条目,Claude Code 删除旧键,通知报告 plugin 已从 marketplace 中删除。 - 如果重命名的 plugin 使用远程源,例如
github或npm,Claude Code 在重命名后报告plugin-cache-miss,用户必须运行/plugin install一次以在新名称下获取它。
renames 视为仅追加历史:即使在你期望每个用户都已迁移后,也要保持旧条目就位。Claude Code 遵循链,所以如果你稍后将 code-formatter 重命名为 formatter-pro,请添加第二个条目而不是编辑第一个。仍然启用原始 formatter 的用户然后通过两个条目解析到 formatter-pro。
在编辑映射后运行 claude plugin validate .;它拒绝任何链形成循环或不终止于 null 或 plugins 中列出的名称的条目。
托管和策略设置对 Claude Code 是只读的,所以在那里启用的 plugins 无法自动重写。重命名的 plugin 仍然在每个会话中加载,但重命名通知会重复出现,直到管理员更新托管设置文件中的
enabledPlugins 以使用新名称。相同的情况适用于通过其他只读源(例如 --add-dir)启用的 plugins。renames 字段并为旧名称报告 plugin-not-found。
验证和测试
在共享前测试你的 marketplace。验证检查文件结构;要测试 plugin 是否改变了 Claude 在实际提示上的行为,请在发布新版本前使用claude plugin eval 运行其 eval 套件。
从你的 marketplace 目录验证 JSON 语法:
从 CLI 管理 marketplaces
Claude Code 提供非交互式claude plugin marketplace 子命令用于脚本编写和自动化。这些等同于交互式会话中可用的 /plugin marketplace 命令。
Plugin marketplace add
从 GitHub 存储库、git URL、远程 URL 或本地路径添加 marketplace。<source>:GitHubowner/repo简写、git URL、指向marketplace.json文件的远程 URL 或本地目录路径。要固定到分支或标签,请将@ref附加到 GitHub 简写或#ref附加到 git URL
gitlab.example.com/team/plugins)被拒绝为无效的 owner/repo 简写,错误会告诉你添加 https:// 或为本地路径使用 ./。早期版本会将其误读为 GitHub 存储库路径,并在克隆时失败,出现 GitHub 未找到错误。
选项:
从 GitHub 使用
owner/repo 简写添加 marketplace:
@ref 固定到特定分支或标签:
marketplace.json 文件的远程 URL 添加:
.claude/settings.json 与你的团队共享:
Plugin marketplace list
列出所有配置的 marketplaces。
使用
--json,每个条目包括 name、source、一个包含 marketplace 存储的本地缓存路径的 installLocation 字段,以及源特定字段:GitHub 源的 repo、git 和 URL 源的 url,以及本地源的 path。当 marketplace 使用固定分支或标签添加时,GitHub 和 git 源也包括 ref 字段。
Plugin marketplace remove
删除配置的 marketplace。别名rm 也被接受。
<name>:marketplace 名称要删除,如claude plugin marketplace list所示。这是来自marketplace.json的name,而不是你传递给add的源
Plugin marketplace update
从其源刷新 marketplaces 以检索新 plugins 和版本更改。使用分支或标签ref 添加的 marketplace 会更新到该 ref 的最新提交,而不是存储库的默认分支。
[name]:marketplace 名称要更新,如claude plugin marketplace list所示。如果省略,更新所有 marketplaces
remove 和 update 在针对种子管理的 marketplace 运行时都会失败,这是只读的。更新所有 marketplaces 时,种子管理的条目被跳过,其他 marketplaces 仍然更新。要更改种子提供的 plugins,请要求你的管理员更新种子镜像。见 为容器预填充 plugins。
故障排除
Marketplace 未加载
症状:无法添加 marketplace 或从中看到 plugins 解决方案:- 验证 marketplace URL 是否可访问
- 检查
.claude-plugin/marketplace.json是否存在于指定路径 - 使用
claude plugin validate .或/plugin validate .确保 JSON 语法有效。要检查 skill、agent 和 command frontmatter,请参阅验证没有 manifest 的 plugin 或目录 - 对于私有存储库,确认你有访问权限
Marketplace 验证错误
从你的 marketplace 目录运行claude plugin validate . 或 /plugin validate . 来检查问题。当指向 marketplace 目录时,验证器检查 marketplace.json 是否存在 schema 错误、重复的 plugin 名称和源路径遍历。对于 source 是本地路径的每个条目,它还验证该 plugin 自己的 plugin.json,并在条目的 version 与 plugin.json 中的版本不匹配时发出警告。在 plugin 的 plugin.json 中发现的问题以条目索引为前缀,形式为 plugins[2] plugin.json →。
从 Claude Code v2.1.196 开始,每个条目的检查还会:
- 包括
source为.的 plugins - 在
marketplace.json位于.claude-plugin目录外时运行,针对文件自己的目录解析源 - 即使文件的另一部分有 schema 错误,也报告每个条目的问题
.claude-plugin/marketplace.json 开始下降。
从 marketplace 目录,Claude Code 不会打开 plugins 的 skill、agent、command 或 hook 文件。要查找这些文件中的错误,请参阅验证没有 manifest 的 plugin 或目录。下表列出了从 marketplace 目录中最常见的错误,以及每个错误的原因和修复方法:
警告(非阻止):
Marketplace has no plugins defined:将至少一个 plugin 添加到plugins数组No marketplace description provided:添加顶级description以帮助用户理解你的 marketplacePlugin name "x" is not kebab-case:重命名为仅包含小写字母、数字和连字符(例如,my-plugin)。Claude Code 接受其他形式,但 claude.ai marketplace 同步会拒绝它们。Marketplace name "x" is reserved in Claude Desktop:marketplace 名称为org、org-provisioned或unknown,任何大小写。Claude Code 接受这些名称,但 Claude Desktop 的托管 marketplace 同步会拒绝整个 marketplace。重命名 marketplace。在 v2.1.221 之前,claude plugin validate没有运行此检查。Marketplace name "x" is not accepted by Claude Desktop或Plugin name "x" is not accepted by Claude Desktop:Claude Desktop 接受最多 128 个字符的名称,由字母、数字、.、_和-组成,以字母或数字开头。Claude Code 接受其他形式,但 Claude Desktop 的托管 marketplace 同步会拒绝名称检查失败的 marketplace,并静默删除名称检查失败的 plugin 条目。重命名 marketplace 或 plugin。在 v2.1.221 之前,claude plugin validate没有运行这些检查。
验证没有 manifest 的 plugin 或目录
要查找 skill、agent 和 command 文件,其 frontmatter 无法解析,请运行claude plugin validate 并命名包含它们的目录。Claude Code 不会查看你命名的目录之外。除了一次针对具有 plugin.json 的 plugin 的运行外,每次运行都需要 Claude Code v2.1.233 或更高版本。
Claude Code 根据你命名的目录检查不同的文件。在第一列中找到你想检查的内容,并运行该行的命令:
当你针对 plugin 目录运行
claude plugin validate 时,Claude Code 不会检查 plugin 根目录下的 SKILL.md。当 plugin 位于名为 skills 的目录中时,运行该命令两次:
- 命名该
skills目录以检查 plugin 的根SKILL.md。 - 命名 plugin 目录以检查其余部分。
plugins/)时,skills 目录运行不可用,没有运行检查其根 SKILL.md。
当你运行 claude plugin validate 时,Claude Code 不会跟随你命名的目录内的符号链接。它所做的取决于链接的位置:
- plugin 或
.claude根目录下的链接skills、agents或commands目录:Claude Code 警告其中没有任何内容被读取。 skills、agents或commands目录内的链接条目:Claude Code 跳过它并警告,每个目录,它跳过了多少条目,会话会加载。- 你命名的
skills、agents或commands目录本身是符号链接,或其父.claude目录是:Claude Code 报告错误并检查其中的任何内容。改为命名真实目录。
- 其
skills目录链接到同级 plugin 的 skills 的 plugin:命名同级 plugin 的目录。 ~/.claude/skills或.claude/skills中的符号链接 skill 条目:Claude Code 在会话中跟随该条目。要检查它,命名一个名为skills的目录,该目录包含真实文件夹。
Validation passed 结束。
No manifest found in directory 意味着 Claude Code 在那里找不到 plugin.json 或 marketplace.json,也找不到它在其下探测的目录中的 skill、agent 或 command 文件。改为命名包含你的文件的 skills、agents 或 commands 目录。
Claude Code 从这些运行中报告的两个错误,以及每个错误的修复:
YAML frontmatter failed to parse: ...:修复 skill、agent 或 command 文件的 frontmatter 块中的 YAML。在你这样做之前,会话从文件中读取不到 frontmatter 字段Invalid JSON syntax: ...在hooks/hooks.json上:修复 JSON 语法。在你这样做之前,会话加载 plugin 时不带该文件中的 hooks。Claude Code 仅在 plugin 运行中报告此错误
CLAUDE.md。对于你通过 component path fields 在 plugin.json 中设置的路径,Claude Code 检查每个路径是否存在,但不读取那里的文件。
Plugin 安装失败
症状:Marketplace 出现但 plugin 安装失败 解决方案:- 验证 plugin 源 URL 是否可访问
- 检查 plugin 目录是否包含必需的文件
- 对于 GitHub 源,确保存储库是公开的或你有访问权限
- 通过手动克隆/下载来测试 plugin 源
- 如果源同时固定了
ref和sha,删除的上游分支或标签不会阻止大多数 git 主机(包括 GitHub、GitLab 和 Bitbucket)上的安装。在不支持通过 SHA 获取提交的服务器上(如 AWS CodeCommit),ref必须仍然存在,固定的提交必须可从其到达。如果安装仍然失败,请确认固定的提交仍然存在于存储库中
私有存储库身份验证失败
症状:从私有存储库安装 plugins 时出现身份验证错误 解决方案: 对于手动安装和更新:- 验证你已使用你的 git 提供商进行身份验证(例如,对于 GitHub 运行
gh auth status) - 检查你的凭证助手是否配置正确:
git config --global credential.helper - 运行
git ls-remote <marketplace-url>来测试 git 是否可以自行进行身份验证。如果 git 要求输入用户名或密码,请先存储凭证:对于 GitHub over HTTPS,运行gh auth setup-git,对于 SSH 远程,将你的密钥加载到ssh-agent
- 默认情况下,后台刷新会为拉取禁用 git 凭证助手,因此拉取无法通过 HTTPS 进行身份验证。在
ssh-agent中加载了密钥的 SSH 远程仍然可以进行身份验证。失败的拉取会触发从头重新克隆,这使用你存储的凭证,但在大型存储库上可能超时 - 设置
CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1以在后台拉取失败时保留现有克隆 - 配置 git 凭证助手,例如
gh auth setup-git,以便重新克隆回退可以进行身份验证 - 如果重新克隆在大型存储库上超时,请使用
CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS增加限制 - 配置一个 git URL 重写 作用于 marketplace 存储库,以便后台拉取直接进行身份验证
- 或使用
/plugin marketplace update <name>手动更新私有 marketplaces,这使用你的凭证
Marketplace 更新在离线环境中失败
症状:Marketplacegit pull 在后台失败,Claude Code 反复尝试无法成功的重新克隆。
原因:默认情况下,当 git pull 失败时,Claude Code 会尝试从头重新克隆。在离线或隔离的环境中,重新克隆以相同的方式失败,之后对先前缓存的恢复是尽力而为的。刷新在启动后在后台运行,因此不会延迟启动,但每个会话都会重复失败的尝试,每个 git 操作都可以等待 120 秒超时。
解决方案:设置 CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 以在拉取失败时跳过重新克隆尝试并继续使用现有缓存:
CLAUDE_CODE_PLUGIN_SEED_DIR 在构建时预填充 plugins 目录。
Git 操作超时
症状:Plugin 安装或 marketplace 更新失败,出现超时错误,如”Git clone timed out after 120s”或”Git pull timed out after 120s”。 原因:Claude Code 对所有 git 操作使用 120 秒超时,包括克隆 plugin 存储库和拉取 marketplace 更新。大型存储库或缓慢的网络连接可能超过此限制。 解决方案:使用CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS 环境变量增加超时。该值以毫秒为单位:
相对路径 Plugins 在基于 URL 的 Marketplaces 中失败
症状:通过 URL(如https://example.com/marketplace.json)添加了 marketplace,但具有相对路径源(如 "./plugins/my-plugin")的 plugins 无法安装,出现 its marketplace entry path does not stay inside the marketplace directory 错误。已安装的 plugins 无法加载,出现 Plugin source path refused 错误。两条消息都有一个错误参考条目。
原因:添加基于 URL 的 marketplace 仅下载 marketplace.json 文件本身,Claude Code 不会从该服务器按相对路径获取 plugin 文件。marketplace 条目中的相对路径引用远程服务器上未下载的文件。
解决方案:
- 使用外部源:将 plugin 条目更改为除相对路径外的任何 plugin 源:
- 使用基于 Git 的 Marketplace:在 Git 存储库中托管你的 marketplace 并使用 git URL 添加它。基于 Git 的 marketplaces 克隆整个存储库,使相对路径有效。
安装后文件未找到
症状:Plugin 安装但对文件的引用失败,特别是 plugin 目录外的文件 原因:Plugins 被复制到缓存目录而不是就地使用,除了链接模式中的command 源。引用 plugin 目录外文件的路径(如 ../shared-utils)不会工作,因为这些文件不会被复制。
解决方案:见 Plugin 缓存和文件解析 了解解决方法,包括符号链接和目录重组。
有关其他调试工具和常见问题,请参阅调试和开发工具。
另见
- 发现和安装预构建的 plugins - 从现有 marketplaces 安装 plugins
- Plugins - 创建你自己的 plugins
- Plugins 参考 - 完整的技术规范和架构
- Plugin 设置 - Plugin 配置选项
- strictKnownMarketplaces 参考 - 托管 marketplace 限制