4 4
5# Plugins 参考5# Plugins 参考
6 6
7> Claude Code 插件系统的完整技术参考,包括架构、CLI 命令和组件规范。7> Claude Code 插件系统的完整技术参考,包括模式、CLI 命令和组件规范。
8 8
9<Tip>9<Tip>
10 想要安装插件?请参阅[发现和安装插件](/docs/zh-CN/discover-plugins)。如需创建插件,请参阅[Plugins](/docs/zh-CN/plugins)。如需分发插件,请参阅[Plugin marketplaces](/docs/zh-CN/plugin-marketplaces)。10 想要安装插件?请参阅 [发现和安装插件](/docs/zh-CN/discover-plugins)。有关创建插件,请参阅 [Plugins](/docs/zh-CN/plugins)。有关分发插件,请参阅 [Plugin marketplaces](/docs/zh-CN/plugin-marketplaces)。
11</Tip>11</Tip>
12 12
13本参考提供了 Claude Code 插件系统的完整技术规范,包括组件架构、CLI 命令和开发工具。13**插件**是一个自包含的组件目录,使用自定义功能扩展 Claude Code。插件组件包括 skills、agents、hooks、MCP servers、LSP servers 和 monitors。
14
15**plugin** 是一个自包含的组件目录,用于扩展 Claude Code 的自定义功能。插件组件包括 skills、agents、hooks、MCP servers、LSP servers 和 monitors。
16 14
17<h2 id="plugin-components-reference">15<h2 id="plugin-components-reference">
18 Plugin 组件参考16 插件组件参考
19</h2>17</h2>
20 18
21<h3 id="skills">19<h3 id="skills">
22 Skills20 Skills
23</h3>21</h3>
24 22
25Plugins 向 Claude Code 添加 skills,创建可由您或 Claude 调用的 `/name` 快捷方式。23插件向 Claude Code 添加 skills,创建可由您或 Claude 调用的 `/name` 快捷方式。
26 24
27**位置**:插件根目录中的 `skills/` 或 `commands/` 目录,或插件根目录中的单个 `SKILL.md` 文件25**位置**:插件根目录中的 `skills/` 或 `commands/` 目录,或插件根目录中的单个 `SKILL.md` 文件
28 26
34skills/32skills/
35├── pdf-processor/33├── pdf-processor/
36│ ├── SKILL.md34│ ├── SKILL.md
37│ ├── reference.md (可选)35│ ├── reference.md (optional)
38│ └── scripts/ (可选)36│ └── scripts/ (optional)
39└── code-reviewer/37└── code-reviewer/
40 └── SKILL.md38 └── SKILL.md
41```39```
42 40
43**集成行为**:41安装插件时会自动发现 Skills 和 commands。
44 42
45* 安装插件时会自动发现 Skills 和 commands43如果插件没有 `skills/` 目录且没有 `skills` manifest 字段,则插件根目录中的 `SKILL.md` 会作为单个 skill 加载。设置 frontmatter `name` 字段来控制 skill 的调用名称。如果没有设置,Claude Code 会回退到安装目录名称,对于从市场安装的插件,这是一个在每次更新时都会改变的版本字符串。对于包含多个 skill 的插件,请使用上面所示的 `skills/` 目录布局。
46* Claude 可以根据任务上下文自动调用它们
47* Skills 可以在 SKILL.md 旁边包含支持文件
48 44
49如果插件没有 `skills/` 目录且没有 `skills` manifest 字段,则插件根目录中的 `SKILL.md` 会作为单个 skill 加载。设置 frontmatter `name` 字段以控制 skill 的调用名称。如果没有设置,Claude Code 会回退到安装目录名称,对于从市场安装的插件,这是一个在每次更新时都会改变的版本字符串。对于提供多个 skill 的插件,请使用上面所示的 `skills/` 目录布局。45在插件 skills 和 commands 中,Boolean frontmatter 字段(如 `disable-model-invocation`)接受 `yes`、`no`、`on`、`off`、`1` 和 `0`(任何字母大小写),以及 `true` 和 `false`。在 v2.1.218 之前,Claude Code 仅识别 `true` 和 `false`。
50 46
51有关完整详情,请参阅 [Skills](/docs/zh-CN/skills)。47有关完整详情,请参阅 [Skills](/docs/zh-CN/skills)。
52 48
54 Agents50 Agents
55</h3>51</h3>
56 52
57Plugins 可以为特定任务提供专门的 subagents,Claude 可以在适当时自动调用。53插件可以为特定任务提供专门的子代理,Claude 可以在适当时自动调用这些代理。
58 54
59**位置**:插件根目录中的 `agents/` 目录55**位置**:插件根目录中的 `agents/` 目录
60 56
61**文件格式**:描述 agent 功能的 Markdown 文件57**文件格式**:描述代理功能的 markdown 文件
62 58
63**Agent 结构**:59**Agent 结构**:
64 60
65```markdown theme={null}61```markdown theme={null}
66---62---
67name: agent-name63name: agent-name
68description: 该 agent 的专长以及 Claude 应何时调用它64description: What this agent specializes in and when Claude should invoke it
69model: sonnet65model: sonnet
70effort: medium66effort: medium
71maxTurns: 2067maxTurns: 20
72disallowedTools: Write, Edit68disallowedTools: Write, Edit
73---69---
74 70
75详细的系统提示,描述 agent 的角色、专业知识和行为。71Detailed system prompt for the agent describing its role, expertise, and behavior.
76```72```
77 73
78Plugin agents 支持 `name`、`description`、`model`、`effort`、`maxTurns`、`tools`、`disallowedTools`、`skills`、`memory`、`background` 和 `isolation` frontmatter 字段。唯一有效的 `isolation` 值是 `"worktree"`。出于安全原因,plugin 提供的 agents 不支持 `hooks`、`mcpServers` 和 `permissionMode`。74插件代理支持 `name`、`description`、`model`、`effort`、`maxTurns`、`tools`、`disallowedTools`、`skills`、`memory`、`background` 和 `isolation` frontmatter 字段。唯一有效的 `isolation` 值是 `"worktree"`。出于安全原因,插件提供的代理不支持 `hooks`、`mcpServers` 和 `permissionMode`。
75
76Claude Code 会加载插件代理,即使其 frontmatter 没有 `name` 或无法解析:
77
78* 没有 `name`:Claude Code 根据文件名命名代理,因此名为 `my-plugin` 的插件中的 `agents/reviewer.md` 会加载为 `my-plugin:reviewer`
79* Frontmatter 无法解析:Claude Code 根据文件名命名代理,使用 `Agent from my-plugin plugin` 作为其描述,并忽略文件中的每个字段
80
81相比之下,Claude Code 会跳过其 frontmatter 没有 `name` 或无法解析的项目、用户或托管代理文件。
82
83要查找插件默认 `agents/` 目录中 frontmatter 无法解析的文件,请运行 `claude plugin validate`。您传递的路径取决于插件是否有 manifest,两个示例都使用 `./my-plugin` 作为插件目录:
79 84
80**集成点**:85* 具有 manifest 的插件:`claude plugin validate ./my-plugin`
86* 没有 manifest 的插件:`claude plugin validate ./my-plugin/agents`。需要 Claude Code v2.1.233 或更高版本。
81 87
82* Agents 在 [@-mention 类型提前](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 中显示,使用其作用域名称,例如 `my-plugin:code-reviewer`,一旦启用插件88启用插件后,代理会在 [@-mention 类型提示](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 中显示其作用域名称,例如 `my-plugin:code-reviewer`。
83* Claude 可以根据任务上下文自动调用 agents
84* Agents 可以由用户手动调用
85* Plugin agents 与内置 Claude agents 一起工作
86 89
87有关完整详情,请参阅 [Subagents](/docs/zh-CN/sub-agents)。90有关完整详情,请参阅 [Subagents](/docs/zh-CN/sub-agents)。
88 91
90 Hooks93 Hooks
91</h3>94</h3>
92 95
93Plugins 可以提供事件处理程序,自动响应 Claude Code 事件。96插件可以提供事件处理程序,自动响应 Claude Code 事件。
94 97
95**位置**:插件根目录中的 `hooks/hooks.json`,或在 plugin.json 中内联98**位置**:插件根目录中的 `hooks/hooks.json`,或在 plugin.json 中内联
96 99
116}119}
117```120```
118 121
119Plugin hooks 响应与 [用户定义的 hooks](/docs/zh-CN/hooks) 相同的生命周期事件:122插件 hooks 响应与 [用户定义的 hooks](/docs/zh-CN/hooks) 相同的生命周期事件:
120 123
121| Event | When it fires |124| Event | When it fires |
122| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |125| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
159* `command`:执行 shell 命令或脚本162* `command`:执行 shell 命令或脚本
160* `http`:将事件 JSON 作为 POST 请求发送到 URL163* `http`:将事件 JSON 作为 POST 请求发送到 URL
161* `mcp_tool`:在配置的 [MCP server](/docs/zh-CN/mcp) 上调用工具164* `mcp_tool`:在配置的 [MCP server](/docs/zh-CN/mcp) 上调用工具
162* `prompt`:使用 LLM 评估提示(使用 `$ARGUMENTS` 占位符表示上下文)165* `prompt`:使用 LLM 评估提示(使用 `$ARGUMENTS` 占位符作为上下文)
163* `agent`:运行具有工具的 agentic 验证器以完成复杂验证任务166* `agent`:运行具有工具的代理验证器以完成复杂验证任务
164 167
165针对插件自己的 [捆绑 MCP server](#mcp-servers) 的 Hooks 必须使用其作用域名称。工具匹配器和 `if` 字段采用作用域工具名称 `mcp__plugin_<plugin-name>_<server-name>__<tool>`,而 `mcp_tool` hook 的 `server` 字段采用 `plugin:<plugin-name>:<server-name>`。针对裸服务器密钥编写的匹配器永远不会触发。请参阅 [匹配 MCP 工具](/docs/zh-CN/hooks#match-mcp-tools) 和 [Plugin 提供的 MCP servers](/docs/zh-CN/mcp#plugin-provided-mcp-servers)。168针对插件自己的 [捆绑 MCP server](#mcp-servers) 的 hooks 必须使用其作用域名称。工具匹配器和 `if` 字段采用作用域工具名称 `mcp__plugin_<plugin-name>_<server-name>__<tool>`,`mcp_tool` hook 的 `server` 字段采用 `plugin:<plugin-name>:<server-name>`。针对裸服务器密钥编写的匹配器永远不会触发。请参阅 [Match MCP tools](/docs/zh-CN/hooks#match-mcp-tools) 和 [Plugin-provided MCP servers](/docs/zh-CN/mcp#plugin-provided-mcp-servers)。
166 169
167<h3 id="mcp-servers">170<h3 id="mcp-servers">
168 MCP servers171 MCP servers
169</h3>172</h3>
170 173
171Plugins 可以捆绑 Model Context Protocol (MCP) servers 以将 Claude Code 与外部工具和服务连接。174插件可以捆绑 Model Context Protocol (MCP) 服务器,以将 Claude Code 与外部工具和服务连接。
172 175
173**位置**:插件根目录中的 `.mcp.json`,或在 plugin.json 中内联176**位置**:插件根目录中的 `.mcp.json`,或在 plugin.json 中内联
174 177
175**格式**:标准 MCP server 配置178**格式**:标准 MCP 服务器配置
176 179
177**MCP server 配置**:180**MCP 服务器配置**:
178 181
179```json theme={null}182```json theme={null}
180{183{
196 199
197**集成行为**:200**集成行为**:
198 201
199* 启用插件时,Plugin MCP servers 会自动启动202* 启用插件时,插件 MCP 服务器会自动启动
200* Servers 在 Claude 的工具包中显示为标准 MCP 工具203* 服务器在 Claude 的工具包中显示为标准 MCP 工具
201* Server 功能与 Claude 的现有工具无缝集成204* 插件服务器可以独立于用户 MCP 服务器进行配置
202* Plugin servers 可以独立于用户 MCP servers 进行配置205* 如果您在会话中途运行 [`/reload-plugins`](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting),Claude Code 会保持配置未更改的服务器的实时连接
203 206
204<h3 id="lsp-servers">207<h3 id="lsp-servers">
205 LSP servers208 LSP servers
206</h3>209</h3>
207 210
208<Tip>211<Tip>
209 想要使用 LSP plugins?从官方市场安装它们:在 `/plugin` Discover 选项卡中搜索"lsp"。本部分记录了如何为官方市场未涵盖的语言创建 LSP plugins。212 想要使用 LSP 插件?从官方市场安装它们:在 `/plugin` Discover 选项卡中搜索"lsp"。本部分记录如何为官方市场未涵盖的语言创建 LSP 插件。
210</Tip>213</Tip>
211 214
212Plugins 可以提供 [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) servers,在处理代码库时为 Claude 提供实时代码智能。215插件可以提供 [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) 服务器,以在处理您的代码库时为 Claude 提供 [实时代码智能](/docs/zh-CN/discover-plugins#code-intelligence)。
213
214LSP 集成提供:
215
216* **即时诊断**:Claude 在每次编辑后立即看到错误和警告
217* **代码导航**:转到定义、查找引用和悬停信息
218* **语言感知**:代码符号的类型信息和文档
219 216
220**位置**:插件根目录中的 `.lsp.json`,或在 `plugin.json` 中内联217**位置**:插件根目录中的 `.lsp.json`,或在 `plugin.json` 中内联
221 218
262**可选字段:**259**可选字段:**
263 260
264| 字段 | 描述 |261| 字段 | 描述 |
265| :---------------------- | :----------------------------------------------------------------- |262| :---------------------- | :------------------------------------------------------------------------------------------ |
266| `args` | LSP server 的命令行参数 |263| `args` | LSP 服务器的命令行参数 |
267| `transport` | 通信传输:`stdio`(默认)或 `socket` |264| `transport` | 通信传输:`stdio`(默认)或 `socket`。Claude Code 接受 `socket` 但在 stdio 上运行每个服务器,因此 stdout 协议规则适用于所有服务器 |
268| `env` | 启动 server 时要设置的环境变量 |265| `env` | 启动服务器时要设置的环境变量 |
269| `initializationOptions` | 在初始化期间传递给 server 的选项 |266| `initializationOptions` | 在初始化期间传递给服务器的选项 |
270| `settings` | 通过 `workspace/didChangeConfiguration` 传递的设置 |267| `settings` | 通过 `workspace/didChangeConfiguration` 传递的设置 |
271| `workspaceFolder` | server 的工作区文件夹路径 |268| `workspaceFolder` | 服务器的工作区文件夹路径 |
272| `startupTimeout` | 等待 server 启动的最长时间(毫秒) |269| `startupTimeout` | 等待服务器启动的最长时间(毫秒) |
273| `shutdownTimeout` | 等待正常关闭的最长时间(毫秒)。当超时时间过去时,Claude Code 会终止 server 进程。未设置时,不适用超时 |270| `shutdownTimeout` | 等待正常关闭的最长时间(毫秒)。当超时时间过去时,Claude Code 会终止服务器进程。未设置时,不适用超时 |
274| `restartOnCrash` | server 崩溃后是否重启。默认为 `true`。设置为 `false` 以保持崩溃的 server 停止而不是重启它 |271| `restartOnCrash` | 服务器崩溃后是否重新启动。默认为 `true`。设置为 `false` 以保持崩溃的服务器停止而不是重新启动它 |
275| `maxRestarts` | 放弃前的最大重启尝试次数 |272| `maxRestarts` | 放弃前的最大重启尝试次数 |
276| `diagnostics` | 是否在编辑后将诊断推送到 Claude 的上下文中(默认 `true`)。设置为 `false` 以保持代码导航但禁止自动诊断注入。 |273| `diagnostics` | 编辑后是否将诊断推送到 Claude 的上下文中(默认 `true`)。设置为 `false` 以保持代码导航但禁止自动诊断注入。 |
274
275`restartOnCrash` 和 `shutdownTimeout` 需要 Claude Code v2.1.205 或更高版本。在 v2.1.205 之前,配置架构接受两个选项,但设置其中任何一个都会导致 Claude Code 在启动时完全跳过该 LSP 服务器,原因仅在 `claude --debug` 输出中可见。
277 276
278`restartOnCrash` 和 `shutdownTimeout` 需要 Claude Code v2.1.205 或更高版本。在 v2.1.205 之前,配置架构接受两个选项,但设置其中任何一个会导致 Claude Code 在启动时完全跳过该 LSP server,原因仅在 `claude --debug` 输出中可见。277**同一扩展名的多个服务器**:当多个启用的 LSP 服务器在 `extensionToLanguage` 中声明相同的文件扩展名时,无论服务器来自一个插件还是来自不同的插件,第一个注册的服务器处理具有该扩展名的文件,其他服务器永远不会启动。`/plugin` 界面显示一个警告,命名其服务器处于活动状态的插件。
279 278
280**同一扩展名的多个 servers**:当多个启用的 LSP server 在 `extensionToLanguage` 中声明相同的文件扩展名时,无论 servers 来自一个插件还是来自不同的插件,第一个注册的 server 处理具有该扩展名的文件,其他的永远不会启动。`/plugin` 界面显示一个警告,命名其 server 处于活动状态的插件。279**无法初始化的服务器**:Claude Code 会跳过配置无效的服务器,例如缺少 `command` 或 `extensionToLanguage` 的服务器,其他配置的服务器仍会启动。运行 `claude --debug` 以查看服务器被跳过的原因。
281 280
282**初始化失败的 Servers**:Claude Code 会跳过配置无效的 server,例如缺少 `command` 或 `extensionToLanguage` 的 server,其他配置的 servers 仍然会启动。运行 `claude --debug` 以查看为什么 server 被跳过。281被跳过的服务器不会声明其文件扩展名,因此声明相同扩展名的另一个有效服务器(来自同一插件或不同插件)仍会处理这些文件。
283 282
284被跳过的 server 不会声明其文件扩展名,因此声明相同扩展名的另一个有效 server(来自同一个或不同的插件)仍然会处理这些文件。在 v2.1.205 之前,初始化失败的 server 仍然会声明其扩展名并阻止另一个有效 server 处理相同的扩展名。283**将日志输出发送到 stderr,而不是 stdout**:Claude Code 仅将服务器的 stdout 读取为协议消息,并接受最大 64 KiB 的消息头和最大 32 MiB 的消息体。Claude Code 会断开超过任一限制或向 stdout 写入非协议输出的服务器,并将断开连接计为 `restartOnCrash` 和 `maxRestarts` 的崩溃。当您使用 `--debug` 运行时,Claude Code 会将命名原因的错误写入调试日志。
285 284
286<Warning>285<Warning>
287 **您必须单独安装语言服务器二进制文件。** LSP plugins 配置 Claude Code 如何连接到语言服务器,但它们不包括服务器本身。如果在 `/plugin` Errors 选项卡中看到 `Executable not found in $PATH`,请为您的语言安装所需的二进制文件。286 **您必须单独安装语言服务器二进制文件。** LSP 插件配置 Claude Code 如何连接到语言服务器,但它们不包括服务器本身。如果您在 `/plugin` Errors 选项卡中看到 `Executable not found in $PATH`,请为您的语言安装所需的二进制文件。
288</Warning>287</Warning>
289 288
290**可用的 LSP plugins:**289**可用的 LSP 插件:**
291 290
292| Plugin | 语言服务器 | 安装命令 |291| 插件 | 语言服务器 | 安装命令 |
293| :------------------ | :------------------------- | :------------------------------------------------------------------------------ |292| :------------------ | :------------------------- | :------------------------------------------------------------------------------ |
294| `pyright-lsp` | Pyright (Python) | `pip install pyright` 或 `npm install -g pyright` |293| `pyright-lsp` | Pyright (Python) | `pip install pyright` 或 `npm install -g pyright` |
295| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |294| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |
296| `rust-analyzer-lsp` | rust-analyzer | [参阅 rust-analyzer 安装](https://rust-analyzer.github.io/manual.html#installation) |295| `rust-analyzer-lsp` | rust-analyzer | [参见 rust-analyzer 安装](https://rust-analyzer.github.io/manual.html#installation) |
297 296
298首先安装语言服务器,然后从市场安装 plugin。297首先安装语言服务器,然后从市场安装插件。
299 298
300<h3 id="monitors">299<h3 id="monitors">
301 Monitors300 Monitors
302</h3>301</h3>
303 302
304Plugins 可以声明后台 monitors,Claude Code 在 plugin 激活时自动启动。每个 monitor 为会话的生命周期运行一个 shell 命令,并将每个 stdout 行作为通知传递给 Claude,以便 Claude 可以对日志条目、状态更改或轮询事件做出反应,而无需被要求启动监视本身。303插件可以声明后台监视器,Claude Code 在插件处于活动状态时自动启动。每个监视器在会话的生命周期内运行 shell 命令,并将每个 stdout 行作为通知传递给 Claude,以便 Claude 可以对日志条目、状态更改或轮询事件做出反应,而无需被要求自己启动监视。
305 304
306Plugin monitors 使用与 [Monitor tool](/docs/zh-CN/tools-reference#monitor-tool) 相同的机制,并共享其可用性约束。它们仅在交互式 CLI 会话中运行,在与 [hooks](#hooks) 相同的信任级别上无沙箱运行,并在 Monitor tool 不可用的主机上跳过。305插件监视器使用与 [Monitor tool](/docs/zh-CN/tools-reference#monitor-tool) 相同的机制,并共享其可用性约束。它们仅在交互式 CLI 会话中运行,以与 [hooks](#hooks) 相同的信任级别在非沙箱环境中运行,并在 Monitor tool 不可用的主机上被跳过。
307 306
308**位置**:插件根目录中的 `monitors/monitors.json`,或在 plugin.json 中内联307**位置**:插件根目录中的 `monitors/monitors.json`,或在 `plugin.json` 中内联
309 308
310**格式**:监视器条目的 JSON 数组309**格式**:监视器条目的 JSON 数组
311 310
327]326]
328```327```
329 328
330要内联声明 monitors,请将 `plugin.json` 中的 `experimental.monitors` 设置为相同的数组。要从非默认路径加载,请将 `experimental.monitors` 设置为相对路径字符串,例如 `"./config/monitors.json"`。Monitors 是一个 [实验性组件](#experimental-components)。329要内联声明监视器,请在 `plugin.json` 中将 `experimental.monitors` 设置为相同的数组。要从非默认路径加载,请将 `experimental.monitors` 设置为相对路径字符串,例如 `"./config/monitors.json"`。监视器是 [实验性组件](#experimental-components)。
331 330
332**必需字段:**331**必需字段:**
333 332
340**可选字段:**339**可选字段:**
341 340
342| 字段 | 描述 |341| 字段 | 描述 |
343| :----- | :---------------------------------------------------------------------------------------------------------- |342| :----- | :---------------------------------------------------------------------------------------------------- |
344| `when` | 控制 monitor 何时启动。`"always"` 在会话启动和插件重新加载时启动它,这是默认值。`"on-skill-invoke:<skill-name>"` 在此插件中的命名 skill 首次被分派时启动它 |343| `when` | 控制监视器何时启动。`"always"` 在会话启动和插件重新加载时启动它,这是默认值。`"on-skill-invoke:<skill-name>"` 在第一次调度此插件中的命名 skill 时启动它 |
345 344
346`command` 值支持 [路径替换](#environment-variables) `${CLAUDE_PLUGIN_ROOT}`、`${CLAUDE_PLUGIN_DATA}` 和 `${CLAUDE_PROJECT_DIR}`,加上环境中的任何 `${ENV_VAR}`。如果脚本需要从插件自己的目录运行,请在命令前加上 `cd "${CLAUDE_PLUGIN_ROOT}" && `。345`command` 值支持 [路径替换](#environment-variables) `${CLAUDE_PLUGIN_ROOT}`、`${CLAUDE_PLUGIN_DATA}` 和 `${CLAUDE_PROJECT_DIR}`,以及环境中的任何 `${ENV_VAR}`。如果脚本需要从插件自己的目录运行,请在命令前加上 `cd "${CLAUDE_PLUGIN_ROOT}" && `。
347 346
348monitor `command` 不能引用 [`${user_config.*}`](#user-configuration) 值。该命令通过 shell 运行,因此 Claude Code 会拒绝该 monitor 并显示 [错误](/docs/zh-CN/errors#plugin-command-references-user-config),而不是替换该值。Monitor 进程不会接收 `CLAUDE_PLUGIN_OPTION_<KEY>` 环境变量,因此让 monitor 脚本从它拥有的配置文件中读取该值。在 v2.1.207 之前,monitor 命令替换了 `${user_config.*}` 值。347监视器 `command` 不能引用 [`${user_config.*}`](#user-configuration) 值。命令通过 shell 运行,因此 Claude Code 会拒绝监视器并显示 [错误](/docs/zh-CN/errors#plugin-command-references-user-config),而不是替换该值。监视器进程不会接收 `CLAUDE_PLUGIN_OPTION_<KEY>` 环境变量,因此让监视器脚本从它拥有的配置文件中读取该值。
349 348
350在会话中途禁用插件不会停止已在运行的 monitors。它们在会话结束时停止。349如果您在会话中途禁用插件,Claude Code 不会停止已在运行的监视器;它们在会话结束时停止。
351 350
352<h3 id="themes">351<h3 id="themes">
353 Themes352 Themes
354</h3>353</h3>
355 354
356Plugins 可以提供颜色主题,这些主题与内置预设和用户的本地主题一起出现在 `/theme` 中。主题是 `themes/` 中的 JSON 文件,具有 `base` 预设和稀疏的 `overrides` 颜色令牌映射。Themes 是一个 [实验性组件](#experimental-components)。355插件可以提供颜色主题,这些主题与内置预设和用户的本地主题一起显示在 `/theme` 中。主题是 `themes/` 中的 JSON 文件,具有 `base` 预设和稀疏的 `overrides` 颜色令牌映射。主题是 [实验性组件](#experimental-components)。
357 356
358```json theme={null}357```json theme={null}
359{358{
367}366}
368```367```
369 368
370选择 plugin 主题会在用户的配置中持久化 `custom:<plugin-name>:<slug>`。Plugin 主题是只读的;在 `/theme` 中按 `Ctrl+E` 会将其复制到 `~/.claude/themes/`,以便用户可以编辑副本。369当用户选择插件主题时,Claude Code 会在其配置中保存 `custom:<plugin-name>:<slug>`。插件主题是只读的:当用户在 `/theme` 中按 `Ctrl+E` 时,Claude Code 会将其复制到 `~/.claude/themes/` 中,以便他们可以编辑副本。
371 370
372***371***
373 372
374<h2 id="plugin-installation-scopes">373<h2 id="plugin-installation-scopes">
375 Plugin 安装范围374 Plugin 安装作用域
376</h2>375</h2>
377 376
378安装 plugin 时,您选择一个**范围**,确定 plugin 的可用位置以及谁可以使用它:377当你安装一个 plugin 时,你选择一个**作用域**来确定 plugin 在哪里可用以及谁可以使用它:
379 378
380| 范围 | 设置文件 | 用例 |379| 作用域 | 设置文件 | 用例 |
381| :-------- | :------------------------------------------------- | :----------------------- |380| :-------- | :------------------------------------------ | :----------------------------------------------- |
382| `user` | `~/.claude/settings.json` | 在所有项目中可用的个人 plugins(默认) |381| `user` | `~/.claude/settings.json` | 在所有项目中可用的个人 plugins(默认) |
383| `project` | `.claude/settings.json` | 通过版本控制共享的团队 plugins |382| `project` | `.claude/settings.json` | 通过版本控制共享的团队 plugins |
384| `local` | `.claude/settings.local.json` | 项目特定的 plugins,gitignored |383| `local` | `.claude/settings.local.json` | 项目特定的 plugins,当 Claude Code 保存设置到其中时被 gitignored |
385| `managed` | [Managed settings](/docs/zh-CN/settings#settings-files) | 托管 plugins(只读,仅更新) |384| `managed` | [Managed settings](/docs/zh-CN/managed-settings) | 托管 plugins(只读,仅更新) |
386 385
387Plugins 使用与其他 Claude Code 配置相同的范围系统。有关安装说明和范围标志,请参阅[安装 plugins](/docs/zh-CN/discover-plugins#install-plugins)。有关范围的完整说明,请参阅[Configuration scopes](/docs/zh-CN/settings#configuration-scopes)。386Plugins 使用与其他 Claude Code 配置相同的作用域系统。有关安装说明和作用域标志,请参阅 [Install plugins](/docs/zh-CN/discover-plugins#install-plugins)。有关作用域的完整说明,请参阅 [Configuration scopes](/docs/zh-CN/settings#where-settings-live)。
388 387
389***388***
390 389
391<h2 id="skills-directory-plugins">390<h2 id="skills-directory-plugins">
392 Skills 目录 plugins391 Skills-directory plugins
393</h2>392</h2>
394 393
395任何 skills 目录下包含 `.claude-plugin/plugin.json` 清单的文件夹都会在下一个会话中作为名为 `<name>@skills-dir` 的 plugin 加载,无需市场和无需安装步骤。使用 [`plugin init`](#plugin-init) 搭建一个。与市场安装不同,plugin 在原地被发现而不是复制到 plugin 缓存中。394任何 skills 目录下包含 `.claude-plugin/plugin.json` 清单的文件夹都会在下一个会话中作为名为 `<name>@skills-dir` 的 plugin 加载,无需 marketplace,也无需安装步骤。使用 [`plugin init`](#plugin-init) 来搭建一个。与复制的 marketplace 安装不同,该 plugin 是在原地发现的,而不是复制到 plugin 缓存中。
396 395
397skills 目录树支持三个不同的东西:396A skills directory tree supports three distinct things:
398 397
399| 您拥有的 | 它是什么 |398| What you have | What it is |
400| :-------------------------------------------- | :------------------------------------------------------- |399| :-------------------------------------------- | :------------------------------------------------------- |
401| `<skills-dir>/foo/SKILL.md` 没有清单 | 一个名为 `foo` 的普通 [skill](/docs/zh-CN/skills) |400| `<skills-dir>/foo/SKILL.md` with no manifest | 一个名为 `foo` 的普通 [skill](/docs/zh-CN/skills) |
402| `<skills-dir>/foo/.claude-plugin/plugin.json` | 一个 plugin `foo@skills-dir`,可以捆绑自己的 skills、agents、hooks 等 |401| `<skills-dir>/foo/.claude-plugin/plugin.json` | 一个 plugin `foo@skills-dir`,可以捆绑自己的 skills、agents、hooks 等 |
403| `<plugin>/skills/bar/SKILL.md` | 一个 skill `bar` 打包在 plugin 内 |402| `<plugin>/skills/bar/SKILL.md` | 一个 skill `bar`,打包在 plugin 内部 |
404 403
405<h3 id="choose-where-the-plugin-loads-from">404<h3 id="choose-where-the-plugin-loads-from">
406 选择 plugin 加载的位置405 选择 plugin 从哪里加载
407</h3>406</h3>
408 407
409| Skills 目录 | 范围 | 加载 |408| Skills directory | Scope | Loads |
410| :---------------------- | :- | :---------------------------------------------- |409| :---------------------- | :------- | :--------------------------------------------------------------------------------------- |
411| `~/.claude/skills/` | 个人 | 在每个项目中,因为位置仅属于您 |410| `~/.claude/skills/` | personal | 在每个项目中加载,因为该位置仅属于你 |
412| `<cwd>/.claude/skills/` | 项目 | 仅在您接受该文件夹的工作区 [trust dialog](/docs/zh-CN/settings) 后 |411| `<cwd>/.claude/skills/` | project | 仅在你接受该文件夹的工作区 [trust dialog](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder) 后加载 |
413 412
414项目范围的 plugin 被检入存储库,并到达克隆它的每个协作者。因为该内容来自存储库而不是来自您,它仅在与 `.claude/settings.json` 相同的信任门后加载,并且运行代码的组件受到进一步限制:413项目范围的 plugin 被检入到仓库中,并到达克隆它的每个协作者。因为该内容来自仓库而不是来自你,它仅在与 `.claude/settings.json` 中的项目允许规则相同的信任门控后加载,所以信任父文件夹或使用 `-p` 运行是不够的,运行代码的组件受到进一步限制:
415 414
416* 它声明的 MCP servers 通过与项目 `.mcp.json` 相同的 [per-server approval](/docs/zh-CN/mcp)415* 它声明的 MCP servers 会经过与项目 `.mcp.json` 相同的 [per-server approval](/docs/zh-CN/mcp)
417* LSP servers 仅在您信任工作区后启动416* LSP servers 仅在你信任工作区后启动
418* [Background monitors](#monitors) 不加载417* [Background monitors](#monitors) 不加载
419 418
420个人范围的 plugins 没有这些限制。419Personal-scope plugins 没有这些限制。
421 420
422<Warning>421<Warning>
423 项目范围的 `@skills-dir` plugins 仅从启动 Claude Code 的目录的 `.claude/skills/` 加载。它们不会 [walk up to the repository root](/docs/zh-CN/skills#automatic-discovery-from-parent-and-nested-directories) 的方式与普通 skills 和 commands 相同,因此从子目录启动会错过位于存储库根目录的 plugin。从存储库根目录启动,或在更改目录后运行 `/reload-plugins`。422 Project-scope `@skills-dir` plugins 仅从会话的 [primary working directory](/docs/zh-CN/permissions#working-directories) 的 `.claude/skills/` 加载。它们不会像普通 skills 和 commands 那样 [walk up to the repository root](/docs/zh-CN/skills#discovery-from-parent-and-nested-directories),所以从子目录启动会错过位于仓库根目录的 plugin。从仓库根目录启动,或在 v2.1.246 或更高版本上 [使用 `/cd` 将会话移动到那里](/docs/zh-CN/permissions#move-the-session-to-another-directory)。
424</Warning>423</Warning>
425 424
426<h3 id="edit-reload-and-disable-a-skills-directory-plugin">425<h3 id="edit-reload-and-disable-a-skills-directory-plugin">
427 编辑、重新加载和禁用 skills 目录 plugin426 编辑、重新加载和禁用 skills-directory plugin
428</h3>427</h3>
429 428
430您对 skill 的 `SKILL.md` 所做的更改在当前会话中立即生效。对 plugin 的其他组件(如 `hooks/`、`.mcp.json`、`agents/` 和 `output-styles/`)的更改则不会。运行 `/reload-plugins` 或重启 Claude Code 以获取这些更改。请参阅 [Live change detection](/docs/zh-CN/skills#live-change-detection)。429你对 skill 的 `SKILL.md` 所做的更改会立即在当前会话中生效。对 plugin 的其他组件(如 `hooks/`、`.mcp.json`、`agents/` 和 `output-styles/`)的更改则不会。运行 `/reload-plugins` 或重启 Claude Code 来获取这些更改。参见 [Live change detection](/docs/zh-CN/skills#live-change-detection)。
431 430
432要停止加载 skills 目录 plugin,请删除其文件夹或按名称禁用它。没有 `uninstall` 步骤,因为没有从市场安装任何东西。431要停止加载 skills-directory plugin,删除其文件夹或按名称禁用它。没有 `uninstall` 步骤,因为没有从 marketplace 安装任何东西。
433 432
434```bash theme={null}433```bash theme={null}
435claude plugin disable my-tool@skills-dir434claude plugin disable my-tool@skills-dir
437 436
438***437***
439 438
439<h2 id="synced-plugins">
440 从 claude.ai 同步的插件
441</h2>
442
443在 [Cowork](https://claude.com/product/cowork) 和[云会话](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)中,Claude Code 会将为你的 claude.ai 账户启用的插件下载到会话自身环境中的 `~/.claude/plugins/synced/` 目录,并将每个插件加载为 `<name>@synced`,没有 marketplace 和没有安装记录。Claude Code 不会在你在自己的终端中启动的会话中加载它们。在该 Cowork 或云环境中,`claude plugin list` 会在 `Synced from claude.ai` 标题下显示下载的副本。在 v2.1.239 之前,Claude Code 将这些插件加载为 `<name>@inline`,这是 `--plugin-dir` 插件使用的身份。
444
445通过 `claude plugin list` 打印的 `<name>@synced` ID 来管理同步的插件:
446
447* **关闭一个插件**:在同步会话中,运行 `claude plugin disable <name>@synced`,或要求 Claude 运行它。Claude Code 会将该选择保存为该环境的用户级 [`enabledPlugins`](/docs/zh-CN/settings-reference#enabledplugins) 中的 `"<name>@synced": false`。要重新打开该插件,在同一会话中运行 `claude plugin enable <name>@synced`。要将插件排除在每个同步会话之外,[为你的 claude.ai 账户关闭它](/docs/zh-CN/desktop#extend-claude-code)。要将其排除在一个项目的每个环境中的同步会话之外,在该项目的已提交 `.claude/settings.json` 中的 `enabledPlugins` 下设置 `"<name>@synced": false`。
448* **在 claude.ai 上管理插件本身**:`claude plugin install`、`update` 和 `uninstall` 不适用于同步的插件。要删除一个,为你的 claude.ai 账户关闭该插件;下一个同步会话将在没有它的情况下启动。
449
450当来自任何其他来源的启用插件(例如 marketplace 安装、[skills-directory 插件](#skills-directory-plugins)或 `--plugin-dir` 插件)与同步插件的名称匹配时,Claude Code 会加载该插件并报告同步副本未加载。要改用 claude.ai 副本,请禁用你自己的副本。在 v2.1.239 之前,Claude Code 会加载同步副本而不是同名的 marketplace 安装。
451
452***
453
440<h2 id="plugin-manifest-schema">454<h2 id="plugin-manifest-schema">
441 Plugin 清单架构455 Plugin manifest schema
442</h2>456</h2>
443 457
444`.claude-plugin/plugin.json` 文件定义了您的 plugin 的元数据和配置。本部分记录了所有支持的字段和选项。458`.claude-plugin/plugin.json` 文件定义了你的 plugin 的元数据和配置。
445 459
446清单是可选的。如果省略,Claude Code 会自动发现[默认位置](#file-locations-reference)中的组件,并从目录名称派生 plugin 名称。当您需要提供元数据或自定义组件路径时,使用清单。460manifest 是可选的。如果省略,Claude Code 会在[默认位置](#file-locations-reference)自动发现组件,并从目录名称派生 plugin 名称。当你需要提供元数据或自定义组件路径时,使用 manifest。
447 461
448<h3 id="complete-schema">462<h3 id="complete-schema">
449 完整架构463 Complete schema
450</h3>464</h3>
451 465
452```json theme={null}466```json theme={null}
464 "repository": "https://github.com/author/plugin",478 "repository": "https://github.com/author/plugin",
465 "license": "MIT",479 "license": "MIT",
466 "keywords": ["keyword1", "keyword2"],480 "keywords": ["keyword1", "keyword2"],
481 "metadata": { "catalogId": "cat-123", "tier": "pro" },
467 "skills": "./custom/skills/",482 "skills": "./custom/skills/",
468 "commands": ["./custom/commands/special.md"],483 "commands": ["./custom/commands/special.md"],
469 "agents": ["./custom/agents/reviewer.md"],484 "agents": ["./custom/agents/reviewer.md"],
486 必需字段501 必需字段
487</h3>502</h3>
488 503
489如果包含清单,`name` 是唯一必需的字段。504如果你包含 manifest,`name` 是唯一必需的字段。
490 505
491| 字段 | 类型 | 描述 | 示例 |506| 字段 | 类型 | 描述 | 示例 |
492| :----- | :----- | :------------------------------------------------------------------------------------------------------------------------------------ | :------------------- |507| :----- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------- |
493| `name` | string | 唯一标识符(kebab-case,无空格)。当[市场条目](/docs/zh-CN/plugin-marketplaces#plugin-entries)以不同的名称列出 plugin 时,市场条目名称是 `enabledPlugins` 键和 `/plugin` 使用的名称 | `"deployment-tools"` |508| `name` | string | 唯一标识符,采用 kebab-case,不包含空格、控制字符或双向格式化字符。当[marketplace 条目](/docs/zh-CN/plugin-marketplaces#plugin-entries)以不同的名称列出 plugin 时,marketplace 条目名称是 `enabledPlugins` 键和 `/plugin` 使用的名称 | `"deployment-tools"` |
494 509
495此名称用于命名空间组件。例如,在 UI 中,名为 `plugin-dev` 的 plugin 的 agent `agent-creator` 将显示为 `plugin-dev:agent-creator`。510此名称用于命名空间组件。例如,在 UI 中,名为 `plugin-dev` 的 plugin 的 agent `agent-creator` 将显示为 `plugin-dev:agent-creator`。
496 511
497<h3 id="unrecognized-fields">512<h3 id="unrecognized-fields">
498 未识别的字段513 无法识别的字段
499</h3>514</h3>
500 515
501Claude Code 忽略它不识别的顶级字段。您可以在 `plugin.json` 中保留来自另一个生态系统的元数据,plugin 仍然会加载。这使得维护一个清单变得实用,该清单可以同时用作 VS Code 或 Cursor 扩展清单、npm `package.json` 或 MCPB/DXT 包清单。516Claude Code 忽略它不识别的顶级字段。你可以在 `plugin.json` 中保留来自另一个生态系统的元数据,plugin 仍然会加载。这使得维护一个 manifest 作为 VS Code 或 Cursor 扩展 manifest、npm `package.json` 或 MCPB/DXT bundle manifest 变得实用。
517
518`claude plugin validate` 将无法识别的字段报告为警告,而不是错误。如果一个字段与识别的字段相差一两个字符,警告会建议可能的预期名称。仅具有无法识别字段警告的 plugin 仍然通过验证并在运行时加载。
502 519
503`claude plugin validate` 将未识别的字段报告为警告,而不是错误。如果字段与识别的字段相差一两个字符,警告会建议可能的预期名称。仅具有未识别字段警告的 plugin 仍然通过验证并在运行时加载。520Claude Code 如何处理值类型错误的识别字段取决于该字段:
504 521
505具有错误类型的字段仍然会失败。例如,`keywords` 值是字符串而不是数组是加载错误,`claude plugin validate` 会将其报告为错误。522* **大多数字段**:plugin 无法加载。例如,`keywords` 值是字符串而不是数组是加载错误,`claude plugin validate` 会将其报告为错误。
523* **`experimental` 和 `metadata`**:Claude Code 忽略非对象值,`claude plugin validate` 报告警告。
506 524
507传递 `--strict` 以将警告视为错误。在 CI 中使用它来捕获拼写错误的字段名称或来自另一个工具清单的遗留字段,然后再发布,即使 plugin 在运行时会加载。525传递 `--strict` 以将警告视为错误。在 CI 中使用它来捕获拼写错误的字段名称或来自另一个工具的 manifest 中遗留的字段,然后再发布,即使 plugin 在运行时会加载。
508 526
509```bash theme={null}527```bash theme={null}
510claude plugin validate ./my-plugin --strict528claude plugin validate ./my-plugin --strict
515</h3>533</h3>
516 534
517| 字段 | 类型 | 描述 | 示例 |535| 字段 | 类型 | 描述 | 示例 |
518| :--------------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- |536| :--------------- | :------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- |
519| `$schema` | string | 用于编辑器自动完成和验证的 JSON Schema URL。Claude Code 在加载时忽略此字段。 | `"https://json.schemastore.org/claude-code-plugin-manifest.json"` |537| `$schema` | string | JSON Schema URL,用于编辑器自动完成和验证。Claude Code 在加载时忽略此字段。 | `"https://json.schemastore.org/claude-code-plugin-manifest.json"` |
520| `displayName` | string | 在 `/plugin` 选择器和其他 UI 界面中显示的人类可读名称。当省略时回退到 `name`。与 `name` 不同,可以包含空格和任何大小写。不用于命名空间或查找。需要 Claude Code v2.1.143 或更高版本。 | `"Deployment Tools"` |538| `displayName` | string | 在 `/plugin` 选择器和其他 UI 表面中显示的人类可读名称。对于 marketplace 安装的 plugin,[marketplace 条目](/docs/zh-CN/plugin-marketplaces#optional-plugin-fields)上的 `displayName` 优先于此值。当两个地方都未设置显示名称时,用户会看到 `name`。与 `name` 不同,可以包含空格和任何大小写。不用于命名空间或查找。 | `"Deployment Tools"` |
521| `version` | string | 可选。语义版本。设置此项会将 plugin 固定到该版本字符串,因此用户仅在您提升版本时才会收到更新。如果省略,Claude Code 会回退到 git commit SHA,因此每个 commit 都被视为新版本。如果也在市场条目中设置,`plugin.json` 优先。请参阅[版本管理](#version-management)。 | `"2.1.0"` |539| `version` | string | 可选。语义版本。设置此项会将 plugin 固定到该版本字符串,因此用户仅在你提升版本时才会收到更新,除了[`command` 源](/docs/zh-CN/plugin-marketplaces#command-sources)外;请参阅[版本管理](#version-management)。如果也在 marketplace 条目中设置,`plugin.json` 优先。如果省略,版本来自[版本管理](#version-management)中的下一个源。 | `"2.1.0"` |
522| `description` | string | plugin 目的的简要说明 | `"Deployment automation tools"` |540| `description` | string | plugin 用途的简要说明 | `"Deployment automation tools"` |
523| `author` | object | 作者信息 | `{"name": "Dev Team", "email": "dev@company.com"}` |541| `author` | object | 作者信息 | `{"name": "Dev Team", "email": "dev@company.com"}` |
524| `homepage` | string | 文档 URL | `"https://docs.example.com"` |542| `homepage` | string | 文档 URL | `"https://docs.example.com"` |
525| `repository` | string | 源代码 URL | `"https://github.com/user/plugin"` |543| `repository` | string | 源代码 URL | `"https://github.com/user/plugin"` |
526| `license` | string | 许可证标识符 | `"MIT"`、`"Apache-2.0"` |544| `license` | string | 许可证标识符 | `"MIT"`、`"Apache-2.0"` |
527| `keywords` | array | 发现标签 | `["deployment", "ci-cd"]` |545| `keywords` | array | 发现标签 | `["deployment", "ci-cd"]` |
528| `defaultEnabled` | boolean | 当用户未设置时,plugin 是否在启用状态下启动。默认为 `true`。请参阅[默认启用](#default-enablement)。需要 Claude Code v2.1.154 或更高版本。 | `false` |546| `metadata` | object | 自由格式对象,用于你自己的数据,例如权利或目录字段。Claude Code 不读取它,因此值永远不会影响 plugin 行为。Claude Code 忽略非对象值,`claude plugin validate` 将其报告为警告。在 v2.1.222 之前,Claude Code 将该键视为[无法识别的字段](#unrecognized-fields)。 | `{"catalogId": "cat-123"}` |
547| `defaultEnabled` | boolean | 当用户未设置 plugin 状态时,plugin 是否以启用状态启动。默认为 `true`。请参阅[默认启用](#default-enablement)。 | `false` |
529 548
530<h3 id="default-enablement">549<h3 id="default-enablement">
531 默认启用550 默认启用
532</h3>551</h3>
533 552
534在 `plugin.json` 中设置 `defaultEnabled: false` 以提供一个安装时禁用的 plugin。用户使用 `claude plugin enable <plugin>` 或 `/plugin` 界面将其打开。对于添加成本或用户应选择加入的范围的 plugins 使用此功能,例如连接到外部服务的 plugin。这需要 Claude Code v2.1.154 或更高版本。早期版本忽略该字段并在安装时启用 plugin。553在 `plugin.json` 中设置 `defaultEnabled: false` 以发布已禁用安装的 plugin。用户使用 `claude plugin enable <plugin>` 或 `/plugin` 界面将其打开。对于添加成本或用户应该选择加入的范围的 plugin 使用此选项,例如连接到外部服务的 plugin。
535 554
536`defaultEnabled` 是当没有其他东西决定 plugin 状态时的后备。两件事优先于它:555`defaultEnabled` 是当没有其他因素决定 plugin 状态时的后备。两件事优先于它:
537 556
538* **用户的设置**:任何设置范围中 `enabledPlugins` 中的 plugin 条目。一旦写入,它在 plugin 更新和重新安装中持续,因此在后续版本中更改 `defaultEnabled` 不会翻转现有用户。557* **用户的设置**:任何设置范围内 `enabledPlugins` 中的 plugin 条目。一旦写入,它会在 plugin 更新和重新安装中持续存在,因此在后续版本中更改 `defaultEnabled` 不会翻转现有用户。
539* **依赖项要求**:当 plugin 被另一个活跃的 plugin 需要时,Claude Code 在安装或启用时为其写入 `true`。这给了它一个显式设置,所以它自己的默认值不再适用。请参阅[启用或禁用具有依赖项的 plugin](/docs/zh-CN/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies)。558* **依赖项要求**:当 plugin 被另一个活跃的 plugin 需要时,Claude Code 在安装或启用时为其写入 `true`。这给了它一个显式设置,所以它自己的默认值不再适用。请参阅[启用或禁用具有依赖项的 plugin](/docs/zh-CN/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies)。
540 559
541相同的字段可以出现在 plugin 的市场条目中,其中它优先于 `plugin.json` 中的值。请参阅[可选 plugin 字段](/docs/zh-CN/plugin-marketplaces#optional-plugin-fields)。560同一字段可以出现在 plugin 的 marketplace 条目中,其中它优先于 `plugin.json` 中的值。请参阅[可选 plugin 字段](/docs/zh-CN/plugin-marketplaces#optional-plugin-fields)。
542 561
543<h3 id="component-path-fields">562<h3 id="component-path-fields">
544 组件路径字段563 组件路径字段
545</h3>564</h3>
546 565
547| 字段 | 类型 | 描述 | 示例 |566| 字段 | 类型 | 描述 | 示例 |
548| :---------------------- | :-------------------- | :----------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |567| :---------------------- | :-------------------- | :------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------- |
549| `skills` | string\|array | 包含 `<name>/SKILL.md` 的自定义 skill 目录。添加到默认 `skills/` 扫描。请参阅[路径行为规则](#path-behavior-rules)了解市场根异常 | `"./custom/skills/"` |568| `skills` | string\|array | 包含 `<name>/SKILL.md` 的自定义 skill 目录。添加到默认 `skills/` 扫描。请参阅[路径行为规则](#path-behavior-rules)了解 marketplace-root 异常 | `"./custom/skills/"` |
550| `commands` | string\|array | 自定义平面 `.md` skill 文件或目录(替换默认 `commands/`) | `"./custom/cmd.md"` 或 `["./cmd1.md"]` |569| `commands` | string\|array | 自定义平面 `.md` skill 文件或目录(替换默认 `commands/`) | `"./custom/cmd.md"` 或 `["./cmd1.md"]` |
551| `agents` | string\|array | 自定义 agent 文件(替换默认 `agents/`) | `"./custom/agents/reviewer.md"` |570| `agents` | string\|array | 自定义 agent 文件(替换默认 `agents/`) | `"./custom/agents/reviewer.md"` |
571| `workflows` | string\|array | 自定义[workflow](/docs/zh-CN/workflows) 脚本文件或目录(替换默认 `workflows/`) | `"./custom/workflows/"` |
552| `hooks` | string\|array\|object | Hook 配置路径或内联配置 | `"./my-extra-hooks.json"` |572| `hooks` | string\|array\|object | Hook 配置路径或内联配置 | `"./my-extra-hooks.json"` |
553| `mcpServers` | string\|array\|object | MCP 配置路径或内联配置 | `"./my-extra-mcp-config.json"` |573| `mcpServers` | string\|array\|object | MCP 配置路径或内联配置 | `"./my-extra-mcp-config.json"` |
554| `outputStyles` | string\|array | 自定义输出样式文件/目录(替换默认 `output-styles/`) | `"./styles/"` |574| `outputStyles` | string\|array | 自定义输出样式文件/目录(替换默认 `output-styles/`) | `"./styles/"` |
555| `lspServers` | string\|array\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) 配置用于代码智能(转到定义、查找引用等) | `"./.lsp.json"` |575| `lspServers` | string\|array\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) 配置,用于代码智能(转到定义、查找引用等) | `"./.lsp.json"` |
556| `experimental.themes` | string\|array | 颜色主题文件/目录(替换默认 `themes/`)。请参阅[Themes](#themes) | `"./themes/"` |576| `experimental.themes` | string\|array | 颜色主题文件/目录(替换默认 `themes/`)。请参阅[主题](#themes) | `"./themes/"` |
557| `experimental.monitors` | string\|array | 后台[Monitor](/docs/zh-CN/tools-reference#monitor-tool)配置,在 plugin 激活时自动启动。请参阅[Monitors](#monitors) | `"./monitors.json"` |577| `experimental.monitors` | string\|array | 后台[Monitor](/docs/zh-CN/tools-reference#monitor-tool) 配置,在 plugin 活跃时自动启动。请参阅[监视器](#monitors) | `"./monitors.json"` |
558| `userConfig` | object | 用户可配置的值,在启用时提示。请参阅[用户配置](#user-configuration) | 见下文 |578| `userConfig` | object | 在启用时提示的用户可配置值。请参阅[用户配置](#user-configuration) | 见下文 |
559| `channels` | array | 消息注入的频道声明(Telegram、Slack、Discord 风格)。请参阅[Channels](#channels) | 见下文 |579| `channels` | array | 消息注入的频道声明(Telegram、Slack、Discord 风格)。请参阅[频道](#channels) | 见下文 |
560| `dependencies` | array | 此 plugin 需要的其他 plugins,可选择带有 semver 版本约束。请参阅[约束 plugin 依赖版本](/docs/zh-CN/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |580| `dependencies` | array | 此 plugin 需要的其他 plugin,可选择带有 semver 版本约束。请参阅[约束 plugin 依赖项版本](/docs/zh-CN/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |
561 581
562<h3 id="experimental-components">582<h3 id="experimental-components">
563 实验性组件583 实验性组件
564</h3>584</h3>
565 585
566`experimental` 键下的组件,`themes` 和 `monitors`,具有在稳定期间可能在版本之间更改的清单架构。您声明它们的位置是一个单独的迁移:顶级仍然有效,`claude plugin validate` 发出警告,未来的版本将需要 `experimental.*`。586`experimental` 键下的组件 `themes` 和 `monitors` 具有在版本之间可能会改变的 manifest schema,同时它们稳定下来。你声明它们的位置是一个单独的迁移:顶级仍然有效,`claude plugin validate` 发出警告,未来版本将需要 `experimental.*`。
567 587
568<h3 id="user-configuration">588<h3 id="user-configuration">
569 用户配置589 用户配置
570</h3>590</h3>
571 591
572`userConfig` 字段声明了 Claude Code 在启用 plugin 时提示用户的值。使用此字段而不是要求用户手动编辑 `settings.json`。592`userConfig` 字段声明当 plugin 启用时 Claude Code 提示用户的值。使用此选项而不是要求用户手动编辑 `settings.json`。
573 593
574```json theme={null}594```json theme={null}
575{595{
592键必须是有效的标识符。每个选项支持这些字段:612键必须是有效的标识符。每个选项支持这些字段:
593 613
594| 字段 | 必需 | 描述 |614| 字段 | 必需 | 描述 |
595| :------------ | :- | :---------------------------------------------------- |615| :------------ | :- | :-------------------------------------------------- |
596| `type` | 是 | 以下之一:`string`、`number`、`boolean`、`directory` 或 `file` |616| `type` | 是 | `string`、`number`、`boolean`、`directory` 或 `file` 之一 |
597| `title` | 是 | 在配置对话框中显示的标签 |617| `title` | 是 | 在配置对话框中显示的标签 |
598| `description` | 是 | 显示在字段下方的帮助文本 |618| `description` | 是 | 在字段下方显示的帮助文本 |
599| `sensitive` | 否 | 如果为 `true`,掩盖输入并将值存储在安全存储中而不是 `settings.json` |619| `sensitive` | 否 | 如果为 `true`,掩盖输入并将值存储在安全存储中而不是 `settings.json` |
600| `required` | 否 | 如果为 `true`,当字段为空时验证失败 |620| `required` | 否 | 如果为 `true`,当字段为空时验证失败 |
601| `default` | 否 | 用户未提供任何内容时使用的值 |621| `default` | 否 | 当用户未提供任何内容时使用的值 |
602| `multiple` | 否 | 对于 `string` 类型,允许字符串数组 |622| `multiple` | 否 | 对于 `string` 类型,允许字符串数组 |
603| `min` / `max` | 否 | `number` 类型的边界 |623| `min` / `max` | 否 | `number` 类型的边界 |
604 624
605每个值都可用于在 MCP 和 LSP server 配置和 hook 命令中作为 `${user_config.KEY}` 进行替换。非敏感值也可以在 skill 和 agent 内容中替换。所有值都作为 `CLAUDE_PLUGIN_OPTION_<KEY>` 环境变量导出到 hook 进程和 MCP 及 LSP server 子进程,其中 `<KEY>` 是选项键的大写形式。625每个值都可用于在 MCP 和 LSP 服务器配置以及 hook 命令中作为 `${user_config.KEY}` 进行替换。非敏感值也可以在 skill 和 agent 内容中替换。所有值都作为 `CLAUDE_PLUGIN_OPTION_<KEY>` 环境变量导出到 hook 进程,其中 `<KEY>` 是选项键的大写形式。
606 626
607在 shell 中运行的字段拒绝 `${user_config.*}`:将配置的值替换到 shell 命令中会让 shell 运行该值包含的任何内容,因此组件会失败并出现[错误](/docs/zh-CN/errors#plugin-command-references-user-config)。每个被拒绝的字段都有一种替代方式来传递值:627在 shell 中运行的字段拒绝 `${user_config.*}`:将配置的值替换到 shell 命令中会让 shell 运行该值包含的任何内容,因此组件失败并出现[错误](/docs/zh-CN/errors#plugin-command-references-user-config)。每个被拒绝的字段都有一种替代方式来传递值:
608 628
609| 被拒绝的字段 | 如何传递值 |629| 被拒绝的字段 | 如何传递值 |
610| :------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------- |630| :------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------- |
611| Shell 形式的 hook 命令 | 使用[执行形式](/docs/zh-CN/hooks#exec-form-and-shell-form)与 `args`,或从 hook 的环境中读取 `CLAUDE_PLUGIN_OPTION_<KEY>` |631| Shell 形式的 hook 命令 | 使用带有 `args` 的 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form),或从 hook 的环境中读取 `CLAUDE_PLUGIN_OPTION_<KEY>` |
612| [Monitor](#monitors) 命令 | 从脚本中的配置文件读取值 |632| [Monitor](#monitors) 命令 | 从脚本中的配置文件读取值 |
613| MCP [`headersHelper`](/docs/zh-CN/mcp#use-dynamic-headers-for-custom-authentication) | 从脚本中的配置文件读取值 |633| MCP [`headersHelper`](/docs/zh-CN/mcp#use-dynamic-headers-for-custom-authentication) | 从脚本中的配置文件读取值 |
614 634
615在 v2.1.207 之前,这些字段替换了 `${user_config.KEY}` 值;更新依赖此功能的 plugins。635在 v2.1.207 之前,这些字段替换了 `${user_config.KEY}` 值;更新依赖此功能的 plugin。
636
637非敏感值存储在用户 `settings.json` 中 [`pluginConfigs`](/docs/zh-CN/settings-reference#pluginconfigs) 键下,作为 `pluginConfigs[<plugin-id>].options`。
638
639在 macOS 上,Claude Code 将敏感值存储在 macOS Keychain 中,当 Keychain 拒绝写入时回退到 `~/.claude/.credentials.json`。在没有支持的 keychain 的平台上,它将它们存储在 `~/.claude/.credentials.json` 中。Keychain 存储与 OAuth 令牌共享,总限制约为 2 KB,因此保持敏感值较小。
640
641Claude Code 仅从三个设置源读取所有 `pluginConfigs` 值:
616 642
617非敏感值存储在 `settings.json` 中的 [`pluginConfigs`](/docs/zh-CN/settings#pluginconfigs) 键下,作为 `pluginConfigs[<plugin-id>].options`。Claude Code 将键写入用户设置并从用户设置、`--settings` 标志和托管设置中读取它;项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的条目被忽略。在 v2.1.207 之前,Claude Code 也读取项目和本地设置。643* **用户设置**:`~/.claude/settings.json`,启用时提示写入的文件
644* **`--settings`**:CLI 标志或 SDK 内联设置
645* **托管设置**:[组织控制的策略](/docs/zh-CN/permissions#managed-settings)
618 646
619敏感值进入 macOS Keychain,或在没有支持的钥匙链的平台上进入 `~/.claude/.credentials.json`。钥匙链存储与 OAuth 令牌共享,总限制约为 2 KB,因此请保持敏感值较小。647当多个源设置相同的键时,托管设置优先,然后是 `--settings`,然后是用户设置。你可以从此列表中删除的唯一源是用户设置:传递不包含 `user` 的 [`--setting-sources`](/docs/zh-CN/cli-reference#cli-flags),Claude Code 会跳过它们。托管设置和 `--settings` 保持你传递的任何内容。SDK 的 [`settingSources`](/docs/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) 选项设置相同的列表。
648
649项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的条目被忽略。两个文件都位于工作区中,因此克隆的存储库可以在那里提供值,这些值会流入 plugin hook 命令、MCP 服务器配置、LSP 命令和监视器命令。在 v2.1.207 之前,这些条目被读取。限制特定于 `pluginConfigs`:[`enabledPlugins`](/docs/zh-CN/settings-reference#enabledplugins) 仍然遵守项目和本地设置。
620 650
621<h3 id="channels">651<h3 id="channels">
622 Channels652 频道
623</h3>653</h3>
624 654
625`channels` 字段允许 plugin 声明一个或多个消息频道,将内容注入到对话中。每个频道绑定到 plugin 提供的 MCP server。655`channels` 字段让 plugin 声明一个或多个消息频道,将内容注入到对话中。每个频道绑定到 plugin 提供的 MCP 服务器。
626 656
627```json theme={null}657```json theme={null}
628{658{
647}677}
648```678```
649 679
650`server` 字段是必需的,必须与 plugin 的 `mcpServers` 中的键匹配。可选的每个频道 `userConfig` 使用与顶级字段相同的架构,允许 plugin 在启用 plugin 时提示输入机器人令牌或所有者 ID。680`server` 字段是必需的,必须与 plugin 的 `mcpServers` 中的键匹配。可选的每个频道 `userConfig` 使用与顶级字段相同的 schema,让 plugin 在启用时提示输入机器人令牌或所有者 ID。
651 681
652<h3 id="path-behavior-rules">682<h3 id="path-behavior-rules">
653 路径行为规则683 路径行为规则
654</h3>684</h3>
655 685
656自定义路径是否替换或扩展 plugin 的默认目录取决于该字段:686自定义路径是替换还是扩展 plugin 的默认目录取决于该字段:
657 687
658* **替换默认值**:`commands`、`agents`、`outputStyles`、`experimental.themes`、`experimental.monitors`。例如,当清单指定 `commands` 时,不会扫描默认 `commands/` 目录。要保留默认值并添加更多,请明确列出它:`"commands": ["./commands/", "./extras/"]`688* **替换默认值**:`commands`、`agents`、`workflows`、`outputStyles`、`experimental.themes`、`experimental.monitors`。例如,当 manifest 指定 `commands` 时,不会扫描默认 `commands/` 目录。要保留默认值并添加更多,请明确列出:`"commands": ["./commands/", "./extras/"]`
659* **添加到默认值**:`skills`。默认 `skills/` 目录始终被扫描,`skills` 中列出的目录与其一起加载。异常:对于[其 `source` 解析为市场根的市场条目](/docs/zh-CN/plugin-marketplaces#advanced-plugin-entries),声明特定子目录会替换默认 `skills/` 扫描689* **添加到默认值**:`skills`。默认 `skills/` 目录始终被扫描,`skills` 中列出的目录与其一起加载。异常:对于[源解析为 marketplace 根的 marketplace 条目](/docs/zh-CN/plugin-marketplaces#advanced-plugin-entries),声明特定子目录会替换默认 `skills/` 扫描
660* **自己的合并规则**:[hooks](#hooks)、[MCP servers](#mcp-servers) 和 [LSP servers](#lsp-servers)。请参阅每个部分了解多个源如何组合690* **自己的合并规则**:[hooks](#hooks)、[MCP 服务器](#mcp-servers) 和 [LSP 服务器](#lsp-servers)。请参阅每个部分了解多个源如何组合
661 691
662当 plugin 同时具有默认文件夹和匹配的清单键时,Claude Code v2.1.140 及更高版本在 `claude plugin list` 和 `/plugin` 详细视图中标记被忽略的文件夹。plugin 仍然使用清单路径加载。当清单键指向默认文件夹时不显示警告,例如 `"commands": ["./commands/deploy.md"]`,因为在这种情况下文件夹被明确寻址。692当 plugin 同时具有默认文件夹和匹配的 manifest 键时,Claude Code 在 `claude plugin list` 和 `/plugin` 详细视图中警告被忽略的文件夹。plugin 仍然使用 manifest 路径加载。当 manifest 键指向默认文件夹时,Claude Code 不会发出警告,例如 `"commands": ["./commands/deploy.md"]`,因为该路径明确命名了文件夹。
663 693
664对于所有路径字段:694对于所有路径字段:
665 695
666* 所有路径必须相对于 plugin 根目录,并以 `./` 开头696* 所有路径必须相对于 plugin 根目录并以 `./` 开头,除了 `skills` 字段也接受 `"."`
697 * `"."` 和 `"./"` 都表示 plugin 根目录本身
698 * 在 v2.1.221 之前,`"."` 无法通过 manifest 验证,plugin 无法加载,因此使用 `"./"` 来支持早期版本
667* 来自自定义路径的组件使用相同的命名和命名空间规则699* 来自自定义路径的组件使用相同的命名和命名空间规则
668* 可以将多个路径指定为数组700* 可以将多个路径指定为数组
669* 当 skill 路径指向直接包含 `SKILL.md` 的目录时,例如 `"skills": ["./"]` 指向 plugin 根目录,frontmatter 中的 `name` 字段确定 skill 的调用名称。这提供了一个稳定的名称,无论安装目录如何。如果 frontmatter 中未设置 `name`,则使用目录基名作为后备。701* skill 路径可以指向直接包含 `SKILL.md` 的目录,例如 `"skills": ["."]` 用于 plugin 根目录
702 * Claude Code 从 `SKILL.md` 中的 frontmatter `name` 字段获取 skill 的调用名称,因此无论安装目录的名称如何,名称都保持稳定
703 * 如果 frontmatter 中未设置 `name`,Claude Code 会回退到目录基名
670 704
671在其根目录中具有 `SKILL.md`、没有 `skills/` 子目录且没有 `skills` 清单字段的 plugin 在 Claude Code v2.1.142 及更高版本中自动作为单一 skill plugin 加载。您不需要在 `plugin.json` 中设置 `"skills": ["./"]` 来使用此布局。skill 的调用名称遵循与上述相同的规则:frontmatter `name` 字段,或目录基名作为后备。705具有根目录中的 `SKILL.md`、没有 `skills/` 子目录且没有 `skills` manifest 字段的 plugin 会自动作为单 skill plugin 加载。对于此布局,你不需要在 `plugin.json` 中设置 `"skills": ["./"]`。
672 706
673**路径示例**:707**路径示例**:
674 708
692Claude Code 提供三个变量用于引用路径:726Claude Code 提供三个变量用于引用路径:
693 727
694| 变量 | 解析为 | 用途 |728| 变量 | 解析为 | 用途 |
695| :---------------------- | :-------------------------------------------------------- | :---------------------------------------------- |729| :---------------------- | :--------------------------------------------------------- | :----------------------------------------------- |
696| `${CLAUDE_PLUGIN_ROOT}` | plugin 安装目录的绝对路径 | 与 plugin 捆绑的脚本、二进制文件和配置文件 |730| `${CLAUDE_PLUGIN_ROOT}` | plugin 安装目录的绝对路径 | 与 plugin 捆绑的脚本、二进制文件和配置文件 |
697| `${CLAUDE_PLUGIN_DATA}` | [持久目录](#persistent-data-directory),在 plugin 更新后保留,首次引用时创建 | 已安装的依赖项,如 `node_modules` 或 Python 虚拟环境、生成的代码和缓存 |731| `${CLAUDE_PLUGIN_DATA}` | [持久目录](#persistent-data-directory),在首次引用时创建,在 plugin 更新中存活 | 已安装的依赖项,例如 `node_modules` 或 Python 虚拟环境、生成的代码和缓存 |
698| `${CLAUDE_PROJECT_DIR}` | 项目根目录 | 项目本地脚本和配置文件 |732| `${CLAUDE_PROJECT_DIR}` | 项目根目录 | 项目本地脚本和配置文件 |
699 733
700所有三个都作为环境变量导出到 hook 进程和 MCP 及 LSP server 子进程。哪些字段内联替换它们取决于 plugin 组件:734所有三个都作为环境变量导出到 hook 进程以及 MCP 和 LSP 服务器子进程。哪些字段内联替换它们取决于 plugin 组件:
701 735
702| Plugin 组件 | 占位符解析的字段 |736| Plugin 组件 | 占位符解析的字段 |
703| :---------------------------- | :--------------------------------------- |737| :------------------------ | :--------------------------------------- |
704| Skill 和 agent 内容 | 占位符出现的任何地方 |738| Skill 和 agent 内容 | 占位符出现的任何地方 |
705| Hook 和 monitor 命令 | 占位符出现的任何地方 |739| Hook 和 monitor 命令 | 占位符出现的任何地方 |
706| MCP `stdio` servers | `command`、`args`、`env` |740| MCP `stdio` 服务器 | `command`、`args`、`env` |
707| MCP `http`、`sse`、`ws` servers | `url`、`headers`、`headersHelper` |741| MCP `http`、`sse`、`ws` 服务器 | `url`、`headers`、`headersHelper` |
708| LSP servers | `command`、`args`、`env`、`workspaceFolder` |742| LSP 服务器 | `command`、`args`、`env`、`workspaceFolder` |
709 743
710在 hook 命令中,使用[执行形式](/docs/zh-CN/hooks#exec-form-and-shell-form)与 `args` 以便每个路径作为一个参数传递,无需引用。在 shell 形式的 hooks 和 monitor 命令中,用双引号包装变量,如 `"${CLAUDE_PROJECT_DIR}/scripts/server.sh"`。此 shell 形式的 hook 运行与 plugin 捆绑的脚本:744在 hook 命令中,使用带有 `args` 的 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form),以便每个路径作为一个参数传递,无需引用。在 shell 形式的 hooks 和 monitor 命令中,用双引号包装变量,如 `"${CLAUDE_PROJECT_DIR}/scripts/server.sh"`。此 shell 形式的 hook 运行与 plugin 捆绑的脚本:
711 745
712```json theme={null}746```json theme={null}
713{747{
726}760}
727```761```
728 762
729`${CLAUDE_PLUGIN_ROOT}` 在 plugin 更新时更改。前一个版本的目录在更新后约七天内保留在磁盘上以进行清理,但应将其视为临时的,不要在此处写入状态。763`${CLAUDE_PLUGIN_ROOT}` 在 plugin 更新时改变。前一个版本的目录在更新后的宽限期内保留在磁盘上,但将其视为临时的,不要在那里写入状态。请参阅 [plugin 缓存](#plugin-caching-and-file-resolution)了解清理语义。
764
765当 plugin 在会话中期更新时,hook 命令、monitors、MCP 服务器和 LSP 服务器继续使用前一个版本的路径。运行 `/reload-plugins` 将 hooks、MCP 服务器和 LSP 服务器切换到新路径;monitors 需要会话重启。在没有交互式终端的会话中,重新加载会将 plugin MCP 服务器保留在旧路径上,直到下一个会话。
730 766
731当 plugin 在会话中期更新时,hook 命令、monitors、MCP servers 和 LSP servers 继续使用前一个版本的路径。运行 `/reload-plugins` 以将 hooks、MCP servers 和 LSP servers 切换到新路径;monitors 需要会话重启。767对于具有 `command` 源的 plugin,Claude Code [可以重新加载 plugin 本身](/docs/zh-CN/plugin-marketplaces#when-claude-code-re-runs-the-command)。
732 768
733MCP servers 也可以调用 `roots/list` 请求来在运行时读取会话的工作目录。请参阅[`roots/list` 返回的内容以及 Claude Code 何时通知服务器更改](/docs/zh-CN/mcp#option-3-add-a-local-stdio-server)。769MCP 服务器也可以调用 `roots/list` 请求在运行时读取会话的工作目录。请参阅[`roots/list` 返回的内容以及 Claude Code 何时通知服务器更改](/docs/zh-CN/mcp#option-3-add-a-local-stdio-server)。
734 770
735<h4 id="persistent-data-directory">771<h4 id="persistent-data-directory">
736 持久数据目录772 持久数据目录
737</h4>773</h4>
738 774
739`${CLAUDE_PLUGIN_DATA}` 目录解析为 `~/.claude/plugins/data/{id}/`,其中 `{id}` 是 plugin 标识符,其中 `a-z`、`A-Z`、`0-9`、`_` 和 `-` 之外的字符被替换为 `-`。对于安装为 `formatter@my-marketplace` 的 plugin,目录是 `~/.claude/plugins/data/formatter-my-marketplace/`。775`${CLAUDE_PLUGIN_DATA}` 目录解析为 `~/.claude/plugins/data/{id}/`,其中 `{id}` 是 plugin 标识符,其中 `a-z`、`A-Z`、`0-9`、`_` 和 `-` 之外的字符被替换为 `-`。对于作为 `formatter@my-marketplace` 安装的 plugin,目录是 `~/.claude/plugins/data/formatter-my-marketplace/`。
776
777常见用途是一次安装语言依赖项并在会话和 plugin 更新中重复使用它们。将其用于 Python 依赖项、使用 Yarn 或 pnpm 锁定的依赖项以及生命周期脚本必须运行的包。对于 marketplace 安装的 plugin,你可能根本不需要它:Claude Code 在缓存 plugin 时自动安装符合条件的 [Node.js 包依赖项](#node-js-package-dependencies)。
740 778
741常见用途是一次安装语言依赖项并在会话和 plugin 更新中重复使用它们。由于数据目录的生命周期长于任何单个 plugin 版本,仅检查目录存在性无法检测到更新何时更改了 plugin 的依赖项清单。推荐的模式是将捆绑的清单与数据目录中的副本进行比较,并在它们不同时重新安装。779因为数据目录的生命周期超过任何单个 plugin 版本,仅检查目录存在性无法检测到更新何时更改 plugin 的依赖项 manifest。推荐的模式是将捆绑的 manifest 与数据目录中的副本进行比较,并在它们不同时重新安装。
742 780
743此 `SessionStart` hook 在第一次运行时安装 `node_modules`,并在 plugin 更新包含更改的 `package.json` 时再次安装:781此 `SessionStart` hook 在首次运行时安装 `node_modules`,并在 plugin 更新包含更改的 `package.json` 时再次安装:
744 782
745```json theme={null}783```json theme={null}
746{784{
759}797}
760```798```
761 799
762当存储的副本缺失或与捆绑的副本不同时,`diff` 退出非零,涵盖第一次运行和依赖项更改的更新。如果 `npm install` 失败,尾部的 `rm` 会删除复制的清单,以便下一个会话重试。800当存储的副本缺失或与捆绑的副本不同时,`diff` 退出非零,涵盖首次运行和依赖项更改更新。如果 `npm install` 失败,尾部 `rm` 会删除复制的 manifest,以便下一个会话重试。
763 801
764捆绑在 `${CLAUDE_PLUGIN_ROOT}` 中的脚本可以针对持久的 `node_modules` 运行:802捆绑在 `${CLAUDE_PLUGIN_ROOT}` 中的脚本可以针对持久化的 `node_modules` 运行:
765 803
766```json theme={null}804```json theme={null}
767{805{
777}815}
778```816```
779 817
780当您从最后一个安装了 plugin 的范围卸载 plugin 时,数据目录会自动删除。`/plugin` 界面显示目录大小并在删除前提示。CLI 默认删除;传递 [`--keep-data`](#plugin-uninstall) 以保留它。818当你从最后一个安装 plugin 的范围卸载 plugin 时,数据目录会自动删除。`/plugin` 界面显示目录大小并在删除前提示。CLI 默认删除;传递 [`--keep-data`](#plugin-uninstall) 以保留它。
781 819
782***820***
783 821
785 Plugin 缓存和文件解析823 Plugin 缓存和文件解析
786</h2>824</h2>
787 825
788Plugins 通过以下两种方式之一指定:826Plugin 可以通过以下两种方式指定:
827
828* 通过 `claude --plugin-dir` 或 `claude --plugin-url`,在会话期间使用。
829* 通过 marketplace,为未来的会话安装。
830
831出于安全和验证目的,Claude Code 将 *marketplace* plugin 复制到用户的本地 **plugin 缓存**(`~/.claude/plugins/cache`)中,而不是就地使用它们,除了 [link 模式下的 `command` 源](/docs/zh-CN/plugin-marketplaces#copy-mode-and-link-mode),Claude Code 通过缓存条目中的链接就地使用这些源。
832
833对于复制的 plugin,每个已安装的版本都是缓存中的一个单独目录,按 marketplace 和 plugin 分组,并以解析的版本命名,包含 plugin 文件和 [Node.js 包依赖](#node-js-package-dependencies) 的自己的副本。从 [release tag](/docs/zh-CN/plugin-dependencies#tag-plugin-releases-for-version-resolution) 解析的依赖会获得一个带有 commit-SHA 后缀的目录名。
834
835当你更新或卸载 plugin 时,Claude Code 会将之前的版本目录标记为孤立,并在大约 14 天后的后台扫描中将其删除。宽限期允许已加载旧版本的并发 Claude Code 会话继续运行而不出错。Claude Code 仅在至少安装了一个 plugin 时才运行扫描;在卸载最后一个 plugin 后,孤立目录会保留在磁盘上,直到你再次安装 plugin。
836
837Claude Code 仅在 plugin 或 marketplace 文件夹不再包含任何目录或符号链接时才将其从缓存中删除。如果你将开发检出符号链接到缓存中作为 plugin 的版本条目,Claude Code 永远不会将该链接标记为孤立,也永远不会删除它或保存它的文件夹。Claude Code 也永远不会在链接的检出中写入其版本跟踪文件。
838
839Claude 的 Glob 和 Grep 工具在搜索期间跳过孤立的版本目录,因此文件结果不包括过时的 plugin 代码。
840
841<h3 id="node-js-package-dependencies">
842 Node.js 包依赖
843</h3>
789 844
790* 通过 `claude --plugin-dir` 或 `claude --plugin-url`,用于会话期间。845当 Claude Code 将 plugin 复制到缓存中时,它也会在那里安装 plugin 的 Node.js 包依赖,以便 plugin 的 hooks 和 MCP 服务器可以加载它们。本节涵盖 plugin 在其自己的 `package.json` 中声明的 npm 和 Bun 包。对于依赖其他 plugin 的 plugin,请参阅 [plugin 依赖版本](/docs/zh-CN/plugin-dependencies)。
791* 通过市场,为将来的会话安装。
792 846
793出于安全和验证目的,Claude Code 将\_市场\_ plugins 复制到用户的本地 **plugin 缓存**(`~/.claude/plugins/cache`),而不是就地使用它们。在开发引用外部文件的 plugins 时,理解此行为很重要。847Claude Code 在每次创建复制的版本目录时在其中运行安装:当你安装 plugin 时、当 Claude Code 将 plugin 更新到新版本时,以及在会话启动时当启用的 plugin 尚未缓存时(例如在新机器上)。仅当 plugin 的根目录同时包含 `package.json` 和受支持的 lockfile 时,安装才会运行:
794 848
795每个已安装的版本是缓存中的单独目录。当您更新或卸载 plugin 时,前一个版本目录被标记为孤立,并在 7 天后自动删除。宽限期允许已加载旧版本的并发 Claude Code 会话继续运行而不出错。849| Lockfile | 命令 |
850| :------------------------------------------ | :----------------------------------------------- |
851| `bun.lock` 或 `bun.lockb` | `bun install --frozen-lockfile --ignore-scripts` |
852| `npm-shrinkwrap.json` 或 `package-lock.json` | `npm ci --ignore-scripts` |
796 853
797Claude 的 Glob 和 Grep 工具在搜索期间跳过孤立版本目录,因此文件结果不包括过时的插件代码。854如果 plugin 包含多个这些 lockfile,Claude Code 使用第一个匹配项,按顺序检查:`bun.lock`、`bun.lockb`、`npm-shrinkwrap.json`、`package-lock.json`。Claude Code 跳过 `yarn.lock` 和 `pnpm-lock.yaml`,因为 Yarn 和 pnpm 支持绕过 `--ignore-scripts` 的分辨率时间配置钩子。
855
856为了获得最广泛的覆盖范围,请提供 npm lockfile。Claude Code 从用户的 PATH 运行匹配的 lockfile 的包管理器,如果缺少其他 lockfile,不会回退到它。对于通过 npm 源分发的 plugin,使用 `npm-shrinkwrap.json`;npm 从已发布的包中排除 `package-lock.json`。
857
858Claude Code 对此依赖安装进行了约束,以便 plugin 或其包中的任何代码在安装期间都不会执行,并限制其运行时间:
859
860* **冻结分辨率:** Bun 和 npm 安装 lockfile 精确指定的内容,当 `package.json` 和 lockfile 不一致时失败而不是重新分辨版本。
861* **无生命周期脚本:** `--ignore-scripts` 防止 `preinstall`、`install` 和 `postinstall` 脚本运行,因此在这些脚本中构建本机模块的依赖会下载但在此安装期间不会编译。
862* **60 秒超时:** Claude Code 停止运行时间较长的安装并将其视为失败。
863
864获取 npm 源 plugin 本身会在此依赖安装运行之前运行启用了生命周期脚本的 `npm install`。
865
866失败或跳过的安装永远不会阻止 plugin。当安装失败或 Claude Code 跳过 yarn 或 pnpm lockfile 时,它会在 [debug 输出](#debugging-commands) 中将原因记录为警告。具有 `package.json` 但没有 lockfile 的 plugin 会被跳过而不记录日志条目。超时的安装可能会在缓存副本中留下部分 `node_modules` 树。
867
868你无法关闭自动安装;没有设置或环境变量可以禁用它。在受限网络中,请参阅 [网络访问要求](/docs/zh-CN/network-config#network-access-requirements) 以了解要允许的主机。
869
870对于自动安装无法提供的依赖,例如需要其生命周期脚本来构建的包、Python 依赖或使用 Yarn 或 pnpm 锁定的 plugin,请从 hook 将它们安装到 [持久数据目录](#persistent-data-directory)。
798 871
799<h3 id="path-traversal-limitations">872<h3 id="path-traversal-limitations">
800 路径遍历限制873 路径遍历限制
801</h3>874</h3>
802 875
803已安装的 plugins 无法引用其目录外的文件。遍历 plugin 根目录外的路径(例如 `../shared-utils`)在安装后将不起作用,因为这些外部文件不会被复制到缓存中。876Claude Code 不允许 plugin 引用其自己目录之外的文件。它拒绝解析到 plugin 根目录之外的组件路径,无论该路径是在 `plugin.json` 中声明还是在 [marketplace 条目](/docs/zh-CN/plugin-marketplaces#plugin-entries) 中声明。这涵盖指向 plugin 外部的路径(如 `../shared-utils`)和导向 plugin 外部的符号链接,除了 [一个 marketplace 内的链接](#share-files-within-a-marketplace-with-symlinks)。
877
878在 macOS 和 Linux 上,Claude Code 也拒绝包含反斜杠的组件路径,即使该路径保留在 plugin 内。因此,使用反斜杠路径声明的组件仅在 Windows 上加载。使用正斜杠编写组件路径,例如 `./commands/deploy.md`。
879
880当 Claude Code 拒绝路径时,它会报告 [`path escapes plugin directory`](/docs/zh-CN/errors#path-escapes-plugin-directory) 错误,并在没有该组件的情况下加载 plugin。
881
882Claude Code 在安装 plugin 时也不会将 plugin 目录之外的文件复制到缓存中,因此当复制的 plugin 内的脚本读取 plugin 根目录上方的路径时,它也找不到这些文件。
804 883
805<h3 id="share-files-within-a-marketplace-with-symlinks">884<h3 id="share-files-within-a-marketplace-with-symlinks">
806 使用符号链接在市场内共享文件885 使用符号链接在 marketplace 内共享文件
807</h3>886</h3>
808 887
809如果您的 plugin 需要与同一市场的其他部分共享文件,您可以在 plugin 目录中创建符号链接。当 plugin 被复制到缓存中时,符号链接的处理方式取决于其目标的解析位置:888如果你的 plugin 需要与同一 marketplace 的其他部分共享文件,你可以在 plugin 目录内创建符号链接。当 plugin 被复制到缓存中时,符号链接的处理方式取决于其目标的解析位置:
810 889
811* **在 plugin 自己的目录内:** 符号链接在缓存中被保留为相对符号链接,因此它在运行时继续解析到复制的目标。890* **在 plugin 自己的目录内:** 符号链接在缓存中被保留为相对符号链接,因此它在运行时继续解析到复制的目标。
812* **在同一市场内的其他位置:** 符号链接被解引用。目标的内容被复制到缓存中以替代它。这允许元 plugin 的 `skills/` 目录链接到市场中其他 plugins 定义的技能。891* **在同一 marketplace 内的其他位置:** 符号链接被解引用。目标的内容被复制到缓存中以代替它。这允许元 plugin 的 `skills/` 目录链接到 marketplace 中其他 plugin 定义的技能。
813* **在市场外:** 符号链接出于安全考虑被跳过。这防止 plugins 从任意主机文件(如系统路径)拉入缓存。892* **在 marketplace 外:** 符号链接出于安全原因被跳过。这防止 plugin 将任意主机文件(如系统路径)拉入缓存。
814 893
815对于使用 `--plugin-dir` 安装或从本地路径安装的 plugins,只有解析到 plugin 自己目录内的符号链接被保留。所有其他的都被跳过。894对于使用 `--plugin-dir` 安装的 plugin、来自本地路径的 plugin 或 来自 [copy 模式下的 `command` 源](/docs/zh-CN/plugin-marketplaces#copy-mode-and-link-mode) 的 plugin,仅保留解析到 plugin 自己目录内的符号链接。所有其他的都被跳过。
816 895
817以下命令创建从市场 plugin 内部到由同级 plugin 定义的共享技能的链接。在 Windows 上,从提升的命令提示符使用 `mklink /D` 或启用开发者模式:896以下命令创建从 marketplace plugin 内部到由兄弟 plugin 定义的共享技能的链接。在 Windows 上,从提升的命令提示符使用 `mklink /D` 或启用开发者模式:
818 897
819```bash theme={null}898```bash theme={null}
820ln -s ../../shared-plugin/skills/foo ./skills/foo899ln -s ../../shared-plugin/skills/foo ./skills/foo
821```900```
822 901
823这在保持缓存系统安全优势的同时提供了灵活性。
824
825***902***
826 903
827<h2 id="plugin-directory-structure">904<h2 id="plugin-directory-structure">
832 标准 plugin 布局909 标准 plugin 布局
833</h3>910</h3>
834 911
835完整的 plugin 遵循此结构:912一个完整的 plugin 遵循以下结构:
836 913
837```text theme={null}914```text theme={null}
838enterprise-plugin/915enterprise-plugin/
851│ ├── security-reviewer.md928│ ├── security-reviewer.md
852│ ├── performance-tester.md929│ ├── performance-tester.md
853│ └── compliance-checker.md930│ └── compliance-checker.md
931├── workflows/ # Workflow 脚本
932│ └── release-audit.js
854├── output-styles/ # 输出样式定义933├── output-styles/ # 输出样式定义
855│ └── terse.md934│ └── terse.md
856├── themes/ # 颜色主题定义935├── themes/ # 颜色主题定义
857│ └── dracula.json936│ └── dracula.json
858├── monitors/ # 后台 monitor 配置937├── monitors/ # 后台监视器配置
859│ └── monitors.json938│ └── monitors.json
860├── hooks/ # Hook 配置939├── hooks/ # Hook 配置
861│ ├── hooks.json # 主 hook 配置940│ ├── hooks.json # 主 hook 配置
863├── bin/ # 添加到 PATH 的 plugin 可执行文件942├── bin/ # 添加到 PATH 的 plugin 可执行文件
864│ └── my-tool # 在 Bash tool 中可作为裸命令调用943│ └── my-tool # 在 Bash tool 中可作为裸命令调用
865├── settings.json # plugin 的默认设置944├── settings.json # plugin 的默认设置
866├── .mcp.json # MCP server 定义945├── .mcp.json # MCP 服务器定义
867├── .lsp.json # LSP server 配置946├── .lsp.json # LSP 服务器配置
868├── scripts/ # Hook 和实用脚本947├── scripts/ # Hook 和实用脚本
869│ ├── security-scan.sh948│ ├── security-scan.sh
870│ ├── format-code.py949│ ├── format-code.py
874```953```
875 954
876<Warning>955<Warning>
877 `.claude-plugin/` 目录包含 `plugin.json` 文件。所有其他目录(commands/、agents/、skills/、output-styles/、themes/、monitors/、hooks/)必须在 plugin 根目录,而不是在 `.claude-plugin/` 内。956 `.claude-plugin/` 目录包含 `plugin.json` 文件。所有其他目录(commands/、agents/、skills/、workflows/、output-styles/、themes/、monitors/、hooks/)必须位于 plugin 根目录,而不是在 `.claude-plugin/` 内部。
878</Warning>957</Warning>
879 958
880plugin 根目录中的 `CLAUDE.md` 文件不会作为项目上下文加载。Plugins 通过 skills、agents 和 hooks 而不是 CLAUDE.md 来贡献上下文。要提供加载到 Claude 上下文中的说明,请将其放在 [skill](#skills) 中。959plugin 根目录中的 `CLAUDE.md` 文件不会作为项目上下文加载。Plugins 通过 skills、agents 和 hooks 而不是 CLAUDE.md 来贡献上下文。要提供加载到 Claude 上下文中的说明,请将其放在 [skill](#skills) 中。
883 文件位置参考962 文件位置参考
884</h3>963</h3>
885 964
886| 组件 | 默认位置 | 目的 |965| 组件 | 默认位置 | 用途 |
887| :---------------- | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------ |966| :------------ | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
888| **清单** | `.claude-plugin/plugin.json` | Plugin 元数据和配置(可选) |967| **清单** | `.claude-plugin/plugin.json` | Plugin 元数据和配置(可选) |
889| **Skills** | `skills/` | 具有 `<name>/SKILL.md` 结构的 Skills |968| **Skills** | `skills/` | 具有 `<name>/SKILL.md` 结构的 Skills |
890| **Commands** | `commands/` | Skills 作为平面 Markdown 文件。新 plugins 使用 `skills/` |969| **Commands** | `commands/` | 作为平面 Markdown 文件的 Skills。新 plugins 请使用 `skills/` |
891| **Agents** | `agents/` | Subagent Markdown 文件 |970| **Agents** | `agents/` | Subagent Markdown 文件 |
892| **Output styles** | `output-styles/` | 输出样式定义 |971| **Workflows** | `workflows/` | [Workflow](/docs/zh-CN/workflows) 脚本文件 |
893| **Themes** | `themes/` | 颜色主题定义 |972| **输出样式** | `output-styles/` | 输出样式定义 |
973| **主题** | `themes/` | 颜色主题定义 |
894| **Hooks** | `hooks/hooks.json` | Hook 配置 |974| **Hooks** | `hooks/hooks.json` | Hook 配置 |
895| **MCP servers** | `.mcp.json` | MCP server 定义 |975| **MCP 服务器** | `.mcp.json` | MCP 服务器定义 |
896| **LSP servers** | `.lsp.json` | 语言服务器配置 |976| **LSP 服务器** | `.lsp.json` | 语言服务器配置 |
897| **Monitors** | `monitors/monitors.json` | 后台 monitor 配置 |977| **监视器** | `monitors/monitors.json` | 后台监视器配置 |
898| **Executables** | `bin/` | 添加到 Bash tool 的 `PATH` 的可执行文件。此处的文件在 plugin 启用时可作为任何 Bash tool 调用中的裸命令调用 |978| **可执行文件** | `bin/` | 添加到 Bash tool 的 `PATH` 中的可执行文件,在 plugin 启用时可作为裸命令调用。如果您 [通过 claude.ai 组织设置分发 plugin](/docs/zh-CN/plugin-marketplaces#keep-executables-out-of-the-top-level-bin-directory),则不能在其中包含此目录 |
899| **Settings** | `settings.json` | 启用 plugin 时应用的默认配置。目前仅支持 [`agent`](/docs/zh-CN/sub-agents) 和 [`subagentStatusLine`](/docs/zh-CN/statusline#subagent-status-lines) 键 |979| **设置** | `settings.json` | 启用 plugin 时应用的默认配置。仅支持 [`agent`](/docs/zh-CN/sub-agents) 和 [`subagentStatusLine`](/docs/zh-CN/statusline#subagent-status-lines) 键 |
900 980
901***981***
902 982
904 CLI 命令参考984 CLI 命令参考
905</h2>985</h2>
906 986
907Claude Code 提供了用于非交互式 plugin 管理的 CLI 命令,对脚本和自动化很有用。987Claude Code 提供 CLI 命令用于非交互式插件管理,适用于脚本和自动化。
908 988
909<h3 id="plugin-init">989<h3 id="plugin-init">
910 plugin init990 plugin init
911</h3>991</h3>
912 992
913在 `~/.claude/skills/<name>/` 处搭建一个新 plugin。在下一个 Claude Code 会话中,它会自动作为 `<name>@skills-dir` 加载,并在 `/plugin` 和 `claude plugin list` 中出现,无需安装步骤。993在 `~/.claude/skills/<name>/` 处搭建一个新插件。在下一个 Claude Code 会话中,它会自动加载为 `<name>@skills-dir`,并在 `/plugin` 和 `claude plugin list` 中显示,无需安装步骤。
914 994
915请参阅 [Skills 目录 plugins](#skills-directory-plugins) 了解范围和信任要求。995请参阅 [Skills-directory plugins](#skills-directory-plugins) 了解范围和信任要求。
916 996
917```bash theme={null}997```bash theme={null}
918claude plugin init <name> [options]998claude plugin init <name> [options]
920 1000
921**参数:**1001**参数:**
922 1002
923* `<name>`:Plugin 名称。成为 skill 命名空间和 `~/.claude/skills/` 下的目录名称,因此不能包含空格或路径分隔符。1003* `<name>`:插件名称。成为技能命名空间和 `~/.claude/skills/` 下的目录名称,因此不能包含空格或路径分隔符。
924 1004
925**选项:**1005**选项:**
926 1006
930| `--author <name>` | 作者名称 | `git config user.name` |1010| `--author <name>` | 作者名称 | `git config user.name` |
931| `--author-email <email>` | 作者电子邮件 | `git config user.email` |1011| `--author-email <email>` | 作者电子邮件 | `git config user.email` |
932| `--with <components...>` | 同时搭建组件文件夹。有效值:`skills`、`agents`、`hooks`、`mcp`、`lsp`、`output-style`、`channel` | |1012| `--with <components...>` | 同时搭建组件文件夹。有效值:`skills`、`agents`、`hooks`、`mcp`、`lsp`、`output-style`、`channel` | |
933| `-f, --force` | 覆盖目标处的现有 `.claude-plugin/` | |1013| `-f, --force` | 覆盖目标处现有的 `.claude-plugin/` | |
934| `-h, --help` | 显示命令帮助 | |1014| `-h, --help` | 显示命令帮助 | |
935 1015
936**别名:** `new`1016**别名:** `new`
937 1017
938每个 `--with` 值为该组件添加一个启动文件,准备编辑:1018每个 `--with` 值都会为该组件添加一个启动文件,准备好编辑:
939 1019
940| 组件 | 它搭建什么 |1020| 组件 | 搭建内容 |
941| :------------- | :---------------------------------------------------------------------------------------------------- |1021| :------------- | :----------------------------------------------------------------------------------------------- |
942| `skills` | 一个额外的命名空间 `<name>:example` skill 与默认的一起 |1022| `skills` | 一个额外的命名空间 `<name>:example` 技能,与默认技能并列 |
943| `agents` | 一个 `agents/` subagent 定义 |1023| `agents` | 一个 `agents/` 子代理定义 |
944| `hooks` | 一个 `hooks/hooks.json` 带有示例事件处理程序 |1024| `hooks` | 一个 `hooks/hooks.json`,包含示例事件处理程序 |
945| `mcp` | 一个 `.mcp.json` 带有 HTTP 和 stdio server 示例 |1025| `mcp` | 一个 `.mcp.json`,包含 HTTP 和 stdio 服务器示例 |
946| `lsp` | 一个 `.lsp.json` 语言服务器示例 |1026| `lsp` | 一个 `.lsp.json` 语言服务器示例 |
947| `output-style` | 一个 `output-styles/<name>.md` 在 plugin 启用时自动应用 |1027| `output-style` | 一个 `output-styles/<name>.md`,在插件启用时自动应用 |
948| `channel` | 一个基于 MCP 的 [channel](/docs/zh-CN/channels):一个 stdio server (`server.ts`)、它的 `.mcp.json` 和一个 `package.json` |1028| `channel` | 一个基于 MCP 的 [channel](/docs/zh-CN/channels):一个 stdio 服务器(`server.ts`)、其 `.mcp.json` 和一个 `package.json` |
949 1029
950搭建的 plugin 使用 `@skills-dir` 源而不是市场。管理员可以使用 `strictKnownMarketplaces` 或通过在 [managed settings](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) 中添加 `{"source": "skills-dir"}` 到 `blockedMarketplaces` 来阻止此源。当被阻止时,`plugin init` 在写入前失败。1030搭建的插件使用 `@skills-dir` 源而不是市场。管理员可以通过 `strictKnownMarketplaces` 或在 [managed settings](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) 中添加 `{"source": "skills-dir"}` 到 `blockedMarketplaces` 来阻止此源。当被阻止时,`plugin init` 在写入前失败。
951 1031
952**示例:**1032**示例:**
953 1033
954```bash theme={null}1034```bash theme={null}
955# 搭建最小 plugin1035# 搭建最小插件
956claude plugin init my-helper1036claude plugin init my-helper
957 1037
958# 使用 skill 和 hook 文件夹搭建1038# 搭建带有技能和钩子文件夹的插件
959claude plugin init my-helper --with skills hooks1039claude plugin init my-helper --with skills hooks
960 1040
961# 覆盖现有搭建1041# 覆盖现有搭建
966 plugin install1046 plugin install
967</h3>1047</h3>
968 1048
969从可用市场安装 plugin。1049从可用市场安装插件。
970 1050
971```bash theme={null}1051```bash theme={null}
972claude plugin install <plugin> [options]1052claude plugin install <plugin> [options]
974 1054
975**参数:**1055**参数:**
976 1056
977* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name` 用于特定市场1057* `<plugin>`:插件名称或 `plugin-name@marketplace-name` 用于特定市场
978 1058
979**选项:**1059**选项:**
980 1060
981| 选项 | 描述 | 默认值 |1061| 选项 | 描述 | 默认值 |
982| :-------------------- | :------------------------------ | :----- |1062| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- |
983| `-s, --scope <scope>` | 安装范围:`user`、`project` 或 `local` | `user` |1063| `-s, --scope <scope>` | 安装范围:`user`、`project` 或 `local` | `user` |
1064| `--config <key=value>` | 设置插件清单中声明的 [`userConfig`](#user-configuration) 选项。重复该标志以设置多个选项 | |
1065| `-y, --yes` | 接受插件市场声明的命令,无需确认提示:生成具有 [`command` source](/docs/zh-CN/plugin-marketplaces#command-sources) 的插件的命令,或验证存档下载的 [`headersHelper`](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads)。接受 `headersHelper` 需要 Claude Code v2.1.238 或更高版本。Claude Code 仍会首先打印命令。当 stdin 或 stdout 不是 TTY 时需要。在 Claude Code 会话内无效,因此从您自己的终端运行命令 | |
984| `-h, --help` | 显示命令帮助 | |1066| `-h, --help` | 显示命令帮助 | |
985 1067
986范围确定将已安装的 plugin 添加到哪个设置文件。例如,`--scope project` 写入 `.claude/settings.json` 中的 `enabledPlugins`,使 plugin 对克隆项目存储库的每个人都可用。1068范围决定了已安装插件添加到哪个设置文件。例如,`--scope project` 写入 .claude/settings.json 中的 `enabledPlugins`,使插件对克隆项目存储库的每个人都可用。
987 1069
988**示例:**1070**示例:**
989 1071
994# 安装到项目范围(与团队共享)1076# 安装到项目范围(与团队共享)
995claude plugin install formatter@my-marketplace --scope project1077claude plugin install formatter@my-marketplace --scope project
996 1078
997# 安装到本地范围(gitignored)1079# 安装到本地范围(不与团队共享)
998claude plugin install formatter@my-marketplace --scope local1080claude plugin install formatter@my-marketplace --scope local
999```1081```
1000 1082
1002 plugin uninstall1084 plugin uninstall
1003</h3>1085</h3>
1004 1086
1005删除已安装的 plugin。1087删除已安装的插件。
1006 1088
1007```bash theme={null}1089```bash theme={null}
1008claude plugin uninstall <plugin> [options]1090claude plugin uninstall <plugin> [options]
1010 1092
1011**参数:**1093**参数:**
1012 1094
1013* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`1095* `<plugin>`:插件名称或 `plugin-name@marketplace-name`
1014 1096
1015**选项:**1097**选项:**
1016 1098
1017| 选项 | 描述 | 默认值 |1099| 选项 | 描述 | 默认值 |
1018| :-------------------- | :---------------------------------------------------------- | :----- |1100| :-------------------- | :------------------------------------------------------------ | :----- |
1019| `-s, --scope <scope>` | 从范围卸载:`user`、`project` 或 `local` | `user` |1101| `-s, --scope <scope>` | 从范围卸载:`user`、`project` 或 `local` | `user` |
1020| `--keep-data` | 保留插件的[持久数据目录](#persistent-data-directory) | |1102| `--keep-data` | 保留插件的 [persistent data directory](#persistent-data-directory) | |
1021| `--prune` | 同时删除其他 plugin 不需要的自动安装依赖项。请参阅 [plugin prune](#plugin-prune) | |1103| `--prune` | 同时删除没有其他插件需要的自动安装依赖项。请参阅 [plugin prune](#plugin-prune) | |
1022| `-y, --yes` | 跳过 `--prune` 确认提示。当 stdin 或 stdout 不是 TTY 时需要 | |1104| `-y, --yes` | 跳过 `--prune` 确认提示。当 stdin 或 stdout 不是 TTY 时需要 | |
1023| `-h, --help` | 显示命令帮助 | |1105| `-h, --help` | 显示命令帮助 | |
1024 1106
1025**别名:** `remove`、`rm`1107**别名:** `remove`、`rm`
1026 1108
1027默认情况下,从最后一个剩余范围卸载也会删除插件的 `${CLAUDE_PLUGIN_DATA}` 目录。使用 `--keep-data` 保留它,例如在测试新版本后重新安装时。1109默认情况下,从最后剩余的范围卸载也会删除插件的 `${CLAUDE_PLUGIN_DATA}` 目录。使用 `--keep-data` 保留它,例如在测试新版本后重新安装时。
1110
1111<Note>
1112 当来自不同市场的已安装插件共享一个名称时,`plugin-name@marketplace-name` 形式仅卸载来自命名市场的插件。在 v2.1.212 之前,限定形式可能会匹配并卸载来自不同市场的同名插件。
1113</Note>
1028 1114
1029<h3 id="plugin-prune">1115<h3 id="plugin-prune">
1030 plugin prune1116 plugin prune
1031</h3>1117</h3>
1032 1118
1033删除不再被任何已安装 plugin 需要的自动安装 plugin 依赖项。Claude Code 为满足另一个 plugin 的 [`dependencies`](/docs/zh-CN/plugin-dependencies) 字段而引入的依赖项将被删除;您直接安装的 plugin 永远不会被触及。1119删除不再被任何已安装插件需要的自动安装插件依赖项。Claude Code 为满足另一个插件的 [`dependencies`](/docs/zh-CN/plugin-dependencies) 字段而拉入的依赖项会被删除;您直接安装的插件永远不会被触及。
1034 1120
1035```bash theme={null}1121```bash theme={null}
1036claude plugin prune [options]1122claude plugin prune [options]
1047 1133
1048**别名:** `autoremove`1134**别名:** `autoremove`
1049 1135
1050该命令列出孤立的依赖项,并在删除前要求确认。要在一个步骤中删除 plugin 并清理其依赖项,请运行 `claude plugin uninstall <plugin> --prune`。1136该命令列出孤立的依赖项并在删除前请求确认。要在一个步骤中删除插件并清理其依赖项,请运行 `claude plugin uninstall <plugin> --prune`。
1051
1052<Note>
1053 `claude plugin prune` 需要 Claude Code v2.1.121 或更高版本。
1054</Note>
1055 1137
1056<h3 id="plugin-enable">1138<h3 id="plugin-enable">
1057 plugin enable1139 plugin enable
1058</h3>1140</h3>
1059 1141
1060启用已禁用的 plugin。如果 plugin 声明了[依赖项](/docs/zh-CN/plugin-dependencies),Claude Code 会在同一范围内以传递方式启用它们,当依赖项未安装时命令会失败。1142启用已禁用的插件。当目标从市场安装并声明 [dependencies](/docs/zh-CN/plugin-dependencies) 时,Claude Code 在同一范围内以传递方式启用它们。该命令在 [Enable or disable a plugin with dependencies](/docs/zh-CN/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies) 列出的条件下失败。
1061 1143
1062```bash theme={null}1144```bash theme={null}
1063claude plugin enable <plugin> [options]1145claude plugin enable <plugin> [options]
1065 1147
1066**参数:**1148**参数:**
1067 1149
1068* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`1150* `<plugin>`:插件名称或 `plugin-name@marketplace-name`
1069 1151
1070**选项:**1152**选项:**
1071 1153
1072| 选项 | 描述 | 默认值 |1154| 选项 | 描述 | 默认值 |
1073| :-------------------- | :-------------------------------- | :----- |1155| :-------------------- | :-------------------------------------------------------- | :--- |
1074| `-s, --scope <scope>` | 要启用的范围:`user`、`project` 或 `local` | `user` |1156| `-s, --scope <scope>` | 启用范围:`user`、`project` 或 `local`。省略时,Claude Code 检测安装插件的范围 | 自动检测 |
1075| `-h, --help` | 显示命令帮助 | |1157| `-h, --help` | 显示命令帮助 | |
1076 1158
1077<h3 id="plugin-disable">1159<h3 id="plugin-disable">
1078 plugin disable1160 plugin disable
1079</h3>1161</h3>
1080 1162
1081禁用 plugin 而不卸载它。当另一个已启用的 plugin [依赖于](/docs/zh-CN/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies)目标时失败。错误消息包括一个链式命令,首先禁用每个依赖项。1163禁用插件而不卸载它。当目标从市场安装时,如果另一个启用的插件 [depends on](/docs/zh-CN/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies) 它,该命令会失败。错误消息包含一个链式命令,首先禁用每个依赖项。
1082 1164
1083```bash theme={null}1165```bash theme={null}
1084claude plugin disable <plugin> [options]1166claude plugin disable [plugin] [options]
1085```1167```
1086 1168
1087**参数:**1169**参数:**
1088 1170
1089* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`1171* `[plugin]`:插件名称或 `plugin-name@marketplace-name`。使用 `--all` 时可选
1090 1172
1091**选项:**1173**选项:**
1092 1174
1093| 选项 | 描述 | 默认值 |1175| 选项 | 描述 | 默认值 |
1094| :-------------------- | :-------------------------------- | :----- |1176| :-------------------- | :-------------------------------------------------------- | :--- |
1095| `-s, --scope <scope>` | 要禁用的范围:`user`、`project` 或 `local` | `user` |1177| `-a, --all` | 禁用所有启用的插件。不能与 `--scope` 组合 | |
1178| `-s, --scope <scope>` | 禁用范围:`user`、`project` 或 `local`。省略时,Claude Code 检测安装插件的范围 | 自动检测 |
1096| `-h, --help` | 显示命令帮助 | |1179| `-h, --help` | 显示命令帮助 | |
1097 1180
1098<h3 id="plugin-update">1181<h3 id="plugin-update">
1099 plugin update1182 plugin update
1100</h3>1183</h3>
1101 1184
1102将 plugin 更新到最新版本。1185将插件更新到最新版本。
1103 1186
1104```bash theme={null}1187```bash theme={null}
1105claude plugin update <plugin> [options]1188claude plugin update <plugin> [options]
1107 1190
1108**参数:**1191**参数:**
1109 1192
1110* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`1193* `<plugin>`:插件名称或 `plugin-name@marketplace-name`
1111 1194
1112**选项:**1195**选项:**
1113 1196
1114| 选项 | 描述 | 默认值 |1197| 选项 | 描述 | 默认值 |
1115| :-------------------- | :------------------------------------------ | :----- |1198| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- |
1116| `-s, --scope <scope>` | 要更新的范围:`user`、`project`、`local` 或 `managed` | `user` |1199| `-s, --scope <scope>` | 更新范围:`user`、`project`、`local` 或 `managed` | `user` |
1200| `-y, --yes` | 接受插件市场声明的命令,无需确认提示:生成具有 [`command` source](/docs/zh-CN/plugin-marketplaces#command-sources) 的插件的命令,或验证存档下载的 [`headersHelper`](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads)。接受 `headersHelper` 需要 Claude Code v2.1.238 或更高版本。Claude Code 仍会首先打印命令。当 stdin 或 stdout 不是 TTY 时需要。在 Claude Code 会话内无效,因此从您自己的终端运行命令 | |
1117| `-h, --help` | 显示命令帮助 | |1201| `-h, --help` | 显示命令帮助 | |
1118 1202
1203<Note>
1204 Claude Code 根据您已安装的插件解析裸插件名称。当来自不同市场的已安装插件共享该名称时,Claude Code 拒绝更新并列出要运行的限定 `plugin-name@marketplace-name` 命令。在 v2.1.246 之前,Claude Code 仅接受限定形式并拒绝裸名称为未找到。
1205</Note>
1206
1119***1207***
1120 1208
1121<h3 id="plugin-list">1209<h3 id="plugin-list">
1122 plugin list1210 plugin list
1123</h3>1211</h3>
1124 1212
1125列出已安装的 plugins 及其版本、源市场和启用状态。1213列出已安装的插件及其版本、源市场和启用状态。
1126 1214
1127```bash theme={null}1215```bash theme={null}
1128claude plugin list [options]1216claude plugin list [options]
1131**选项:**1219**选项:**
1132 1220
1133| 选项 | 描述 | 默认值 |1221| 选项 | 描述 | 默认值 |
1134| :------------ | :---------------------------- | :-- |1222| :------------ | :--------------------- | :-- |
1135| `--json` | 输出为 JSON | |1223| `--json` | 输出为 JSON | |
1136| `--available` | 包括来自市场的可用 plugins。需要 `--json` | |1224| `--available` | 包括市场中的可用插件。需要 `--json` | |
1137| `-h, --help` | 显示命令帮助 | |1225| `-h, --help` | 显示命令帮助 | |
1138 1226
1139在交互式会话中,`/plugin list` 打印相同的列表内联。交互式形式接受 `--enabled` 或 `--disabled` 以仅显示处于该状态的 plugins,以及 `ls` 作为 `list` 的简写。1227在交互式会话中,`/plugin list` 打印类似的列表内联,但仅涵盖市场安装的插件:
1228
1229* 从技能目录加载的插件出现在 `/plugin` 界面和 `claude plugin list` 中,但不出现在内联 `/plugin list` 输出中。
1230* 在 Claude Code v2.1.239 或更高版本上,[从 claude.ai 同步的插件](#synced-plugins) 在您在同步会话下载它们的环境中运行 `claude plugin list` 时出现。它们不出现在内联 `/plugin list` 输出中。
1231* 使用 `--plugin-dir` 或 `--plugin-url` 为会话加载的插件出现在 `/plugin` 界面中,仅当相同标志在子命令前时才出现在 `claude plugin list` 中,如 `claude --plugin-dir <dir> plugin list`。仅标志名称标识其位置,因此裸 `claude plugin list` 无法找到它们,不同于同步插件和技能目录插件,其固定目录 Claude Code 扫描。
1232
1233交互式形式接受 `--enabled` 或 `--disabled` 以仅显示该状态中的插件,以及 `ls` 作为 `list` 的简写。
1140 1234
1141<h3 id="plugin-details">1235<h3 id="plugin-details">
1142 plugin details1236 plugin details
1143</h3>1237</h3>
1144 1238
1145显示 plugin 的组件清单和预计令牌成本。输出列出 plugin 贡献的所有组件,分组为 Skills、Agents、Hooks、MCP servers 和 LSP servers,以及它为每个会话添加多少令牌的估计。Skills 组包括 `skills/` 和 `commands/` 条目。1239显示插件的组件清单和预计令牌成本。输出列出插件贡献的所有组件,分组为 Skills、Agents、Hooks、MCP 服务器和 LSP 服务器,以及它为每个会话添加多少令牌的估计。Skills 组包括 `skills/` 和 `commands/` 条目。
1146 1240
1147```bash theme={null}1241```bash theme={null}
1148claude plugin details <name>1242claude plugin details <name>
1150 1244
1151**参数:**1245**参数:**
1152 1246
1153* `<name>`:Plugin 名称或 `plugin-name@marketplace-name`1247* `<name>`:插件名称或 `plugin-name@marketplace-name`
1154 1248
1155**选项:**1249**选项:**
1156 1250
1160 1254
1161输出为每个组件显示两个成本数字:1255输出为每个组件显示两个成本数字:
1162 1256
1163* **Always-on:** plugin 的列表文本(如 skill 描述、agent 描述和命令名称)添加到每个会话的令牌,无论是否有任何组件触发。1257* **Always-on:** 插件的列表文本(如技能描述、代理描述和命令名称)添加到每个会话的令牌,无论任何组件是否触发。
1164* **On-invoke:** 组件触发时的成本令牌。按组件显示,而不是作为 plugin 总计,因为典型会话仅调用组件的子集。1258* **On-invoke:** 组件触发时的成本。按组件显示,而不是作为插件总计,因为典型会话仅调用组件的子集。
1165 1259
1166此示例显示具有两个 skills 的 plugin 的输出外观:1260此示例显示具有两个技能的插件的输出外观:
1167 1261
1168```1262```
1169dependency-guard 1.2.01263dependency-guard 1.2.0
1173Component inventory1267Component inventory
1174 Skills (2) scan-dependencies, review-changes1268 Skills (2) scan-dependencies, review-changes
1175 Agents (0)1269 Agents (0)
1176 Hooks (1) (harness-only — no model context cost)1270 Hooks (1) SessionStart (harness-only — no model context cost)
1177 MCP servers (0)1271 MCP servers (0)
1178 LSP servers (0)1272 LSP servers (0)
1179 1273
1189 Token counts are estimates and may differ from actual usage.1283 Token counts are estimates and may differ from actual usage.
1190```1284```
1191 1285
1192always-on 总计通过您的活跃模型的 `count_tokens` API 计算。按组件的数字按比例从该总计缩放。如果 API 无法访问,该命令会回退到基于字符的估计。1286always-on 总计通过您的活跃模型的 `count_tokens` API 计算。按组件的数字按比例从该总计缩放。如果 API 无法访问,该命令回退到基于字符的估计。
1287
1288<h3 id="plugin-validate">
1289 plugin validate
1290</h3>
1291
1292在发布前检查插件或市场的语法和架构错误。
1293
1294当验证通过时命令退出 0,失败时退出 1,验证运行本身失败时退出 2,例如当您传递的路径不可读时。
1295
1296```bash theme={null}
1297claude plugin validate <path> [options]
1298```
1299
1300**参数:**
1301
1302* `<path>`:插件目录或市场目录的路径。请参阅 [Validate a plugin or a directory without a manifest](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest) 了解插件运行涵盖的文件。
1303
1304**选项:**
1305
1306| 选项 | 描述 | 默认值 |
1307| :----------- | :---------------------------------------------------------------------------------- | :-- |
1308| `--strict` | 将警告视为错误,在警告时退出 1。在 CI 中使用以捕获运行时容忍的问题,例如 [unrecognized fields](#unrecognized-fields) | |
1309| `--json` | 将验证报告输出为一个 JSON 对象,具有相同的退出代码。需要 Claude Code v2.1.259 或更高版本 | |
1310| `-h, --help` | 显示命令帮助 | |
1311
1312使用 `--json`,Claude Code 将报告写入 stdout 作为一个 JSON 对象,具有这些顶级字段:
1313
1314* `success`:退出代码给出的相同判决
1315* `strict`:运行是否将警告视为错误
1316* `target`:Claude Code 验证的已解析路径
1317* `manifest`:清单自己的结果,或 `null` 用于 [run without a manifest](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest)
1318* `contents`:按文件结果,每个命名其 `file` 并携带 `errors`、`warnings` 和 `notes` 数组
1319
1320在退出 2 时,该命令不向 stdout 写入任何内容;错误消息转到 stderr。
1321
1322在交互式会话中,`/plugin validate <path>` 内联运行相同的检查。
1193 1323
1194<h3 id="plugin-tag">1324<h3 id="plugin-tag">
1195 plugin tag1325 plugin tag
1196</h3>1326</h3>
1197 1327
1198为当前目录中的 plugin 创建发布 git 标签。从 plugin 的文件夹内运行。请参阅[标记 plugin 发布](/docs/zh-CN/plugin-dependencies#tag-plugin-releases-for-version-resolution)。1328为插件创建发布 git 标签。默认情况下,该命令标记当前目录中的插件;传递路径以标记其他地方的插件。请参阅 [Tag plugin releases](/docs/zh-CN/plugin-dependencies#tag-plugin-releases-for-version-resolution)。
1199 1329
1200```bash theme={null}1330```bash theme={null}
1201claude plugin tag [options]1331claude plugin tag [path] [options]
1202```1332```
1203 1333
1334**参数:**
1335
1336* `[path]`:插件目录的路径。默认为当前目录。
1337
1204**选项:**1338**选项:**
1205 1339
1206| 选项 | 描述 | 默认值 |1340| 选项 | 描述 | 默认值 |
1207| :------------ | :------------------- | :-- |1341| :-------------------- | :---------------------- | :------- |
1208| `--push` | 创建标签后将其推送到远程 | |1342| `--push` | 创建标签后将其推送到远程 | |
1209| `--dry-run` | 打印将被标记的内容而不创建标签 | |1343| `--dry-run` | 打印将被标记的内容而不创建标签 | |
1210| `-f, --force` | 即使工作树是脏的或标签已存在,也创建标签 | |1344| `-f, --force` | 即使工作树脏或标签已存在也创建标签 | |
1345| `-m, --message <msg>` | 标签注释消息。使用 `%s` 作为版本的占位符 | |
1346| `--remote <name>` | 使用 `--push` 推送到的远程 | `origin` |
1211| `-h, --help` | 显示命令帮助 | |1347| `-h, --help` | 显示命令帮助 | |
1212 1348
1213***1349***
1220 调试命令1356 调试命令
1221</h3>1357</h3>
1222 1358
1223使用 `claude --debug` 查看 plugin 加载详情:1359使用 `claude --debug` 查看插件加载详情:
1224 1360
1225这显示:1361这会显示:
1226 1362
1227* 正在加载哪些 plugins1363* 正在加载哪些插件
1228* plugin 清单中的任何错误1364* 插件清单中的任何错误
1229* Skill、agent 和 hook 注册1365* Skill、agent 和 hook 注册
1230* MCP server 初始化1366* MCP 服务器初始化
1231 1367
1232<h3 id="common-issues">1368<h3 id="common-issues">
1233 常见问题1369 常见问题
1234</h3>1370</h3>
1235 1371
1236| 问题 | 原因 | 解决方案 |1372| 问题 | 原因 | 解决方案 |
1237| :---------------------------------- | :------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |1373| :---------------------------------- | :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1238| Plugin 未加载 | 无效的 `plugin.json` | 运行 `claude plugin validate` 或 `/plugin validate` 检查 `plugin.json`、skill/agent/command frontmatter 和 `hooks/hooks.json` 的语法和架构错误 |1374| 插件未加载 | 无效的 `plugin.json` | 运行 `claude plugin validate ./my-plugin` 或 `/plugin validate ./my-plugin`,其中 `./my-plugin` 是你的插件目录,以检查 `plugin.json`、`hooks/hooks.json` 以及插件默认目录中的 skills、agents 和 commands 的前置元数据是否存在语法和模式错误。参见 [验证插件或没有清单的目录](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest) 了解运行涵盖的内容 |
1239| Skills 未出现 | 目录结构错误 | 确保 `skills/` 或 `commands/` 在根目录,而不是在 `.claude-plugin/` 中 |1375| Skills 未显示 | 目录结构错误 | 确保 `skills/` 或 `commands/` 在插件根目录,而不是在 `.claude-plugin/` 内 |
1240| Hooks 未触发 | 脚本不可执行 | 运行 `chmod +x script.sh` |1376| Hooks 未触发 | 脚本不可执行 | 运行 `chmod +x script.sh` |
1241| MCP server 失败 | 缺少 `${CLAUDE_PLUGIN_ROOT}` | 对所有 plugin 路径使用变量 |1377| MCP 服务器失败 | 缺少 `${CLAUDE_PLUGIN_ROOT}` | 对所有插件路径使用变量 |
1242| 路径错误 | 使用了绝对路径 | 所有路径必须是相对的,并以 `./` 开头 |1378| 路径错误 | 使用了绝对路径 | 使路径相对,以 `./` 开头;参见 [路径行为规则](#path-behavior-rules),其中涵盖了 `skills` 字段的 `"."` 例外 |
1243| LSP `Executable not found in $PATH` | 语言服务器未安装 | 安装二进制文件(例如,`npm install -g typescript-language-server typescript`) |1379| LSP `Executable not found in $PATH` | 语言服务器未安装 | 安装二进制文件(例如,`npm install -g typescript-language-server typescript`) |
1244 1380
1245<h3 id="example-error-messages">1381<h3 id="example-error-messages">
1248 1384
1249**清单验证错误**:1385**清单验证错误**:
1250 1386
1251* `Invalid JSON syntax: Unexpected token } in JSON at position 142`:检查缺少的逗号、多余的逗号或未引用的字符串1387* `Invalid JSON syntax: Unexpected token } in JSON at position 142`:检查是否缺少逗号、多余逗号或未引用的字符串
1252* `Plugin has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Required`:缺少必需字段1388* `Plugin <name> has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Invalid input: expected string, received undefined`:缺少必需字段
1253* `Plugin has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`:JSON 语法错误1389* `Plugin <name> has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`:JSON 语法错误。在 v2.1.246 之前,Claude Code 也会为保存为带有字节顺序标记 (BOM) 的 UTF-8 的 `plugin.json` 产生此错误,即使 JSON 在其他方面有效。
1254 1390
1255**Plugin 加载错误**:1391**插件加载错误**:
1256 1392
1257* `Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.`:命令路径存在但不包含有效的命令文件1393* `Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.`:命令路径存在但不包含有效的命令文件
1258* `Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.`:marketplace.json 中的 `source` 路径指向不存在的目录1394* `Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.`:marketplace.json 中的 `source` 路径指向不存在的目录
1259* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`:删除重复的组件定义或删除 marketplace 条目中的 `strict: false`1395* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`:删除重复的组件定义或在 marketplace 条目中删除 `strict: false`
1260 1396
1261<h3 id="hook-troubleshooting">1397<h3 id="hook-troubleshooting">
1262 Hook 故障排除1398 Hook 故障排除
1265**Hook 脚本未执行**:1401**Hook 脚本未执行**:
1266 1402
12671. 检查脚本是否可执行:`chmod +x ./scripts/your-script.sh`14031. 检查脚本是否可执行:`chmod +x ./scripts/your-script.sh`
12682. 验证 shebang 行:第一行应该是 `#!/bin/bash` 或 `#!/usr/bin/env bash`14042. 验证 shebang 行:第一行应为 `#!/bin/bash` 或 `#!/usr/bin/env bash`
12693. 检查路径是否使用 `${CLAUDE_PLUGIN_ROOT}`:`"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh"`14053. 检查路径是否使用 `${CLAUDE_PLUGIN_ROOT}`:`"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh"`
12704. 手动测试脚本:`./scripts/your-script.sh`14064. 手动测试脚本:`./scripts/your-script.sh`
1271 1407
1272**Hook 未在预期事件上触发**:1408**Hook 未在预期事件上触发**:
1273 1409
12741. 验证事件名称是否正确(区分大小写):`PostToolUse`,而不是 `postToolUse`14101. 验证事件名称正确(区分大小写):`PostToolUse`,而不是 `postToolUse`
12752. 检查匹配器模式是否与您的工具匹配:`"matcher": "Write|Edit"` 用于文件操作14112. 检查匹配器模式是否与你的工具匹配:`"matcher": "Write|Edit"` 用于文件操作
12763. 确认 hook 类型有效:`command`、`http`、`mcp_tool`、`prompt` 或 `agent`14123. 确认 hook 类型有效:`command`、`http`、`mcp_tool`、`prompt` 或 `agent`
1277 1413
1278<h3 id="mcp-server-troubleshooting">1414<h3 id="mcp-server-troubleshooting">
1279 MCP server 故障排除1415 MCP 服务器故障排除
1280</h3>1416</h3>
1281 1417
1282**Server 未启动**:1418**服务器未启动**:
1283 1419
12841. 检查命令是否存在且可执行14201. 检查命令是否存在且可执行
12852. 验证所有路径是否使用 `${CLAUDE_PLUGIN_ROOT}` 变量14212. 验证所有路径是否使用 `${CLAUDE_PLUGIN_ROOT}` 变量
12863. 检查 MCP server 日志:`claude --debug` 显示初始化错误14223. 检查 MCP 服务器日志:`claude --debug` 显示初始化错误
12874. 在 Claude Code 外手动测试 server14234. 在 Claude Code 外手动测试服务器
1288 1424
1289**Server 工具未出现**:1425**服务器工具未显示**:
1290 1426
12911. 确保 server 在 `.mcp.json` 或 `plugin.json` 中正确配置14271. 确保服务器在 `.mcp.json` 或 `plugin.json` 中正确配置
12922. 验证 server 是否正确实现 MCP 协议14282. 验证服务器是否正确实现 MCP 协议
12933. 检查调试输出中的连接超时14293. 检查调试输出中的连接超时
1294 1430
1295<h3 id="directory-structure-mistakes">1431<h3 id="directory-structure-mistakes">
1296 目录结构错误1432 目录结构错误
1297</h3>1433</h3>
1298 1434
1299**症状**:Plugin 加载但组件(skills、agents、hooks)缺失。1435**症状**:插件加载但组件(skills、agents、hooks)缺失。
1300
1301**正确结构**:组件必须在 plugin 根目录,而不是在 `.claude-plugin/` 内。只有 `plugin.json` 属于 `.claude-plugin/`。
1302
1303```text theme={null}
1304my-plugin/
1305├── .claude-plugin/
1306│ └── plugin.json ← 仅清单在此处
1307├── commands/ ← 在根级别
1308├── agents/ ← 在根级别
1309└── hooks/ ← 在根级别
1310```
1311 1436
1312如果您的组件在 `.claude-plugin/` 内,请将它们移到 plugin 根目录。1437**正确结构**:组件必须在插件根目录,而不是在 `.claude-plugin/` 内。只有 `plugin.json` 属于 `.claude-plugin/`。
1313 1438
1314**调试清单**:1439**调试检查清单**:
1315 1440
13161. 运行 `claude --debug` 并查找"loading plugin"消息14411. 运行 `claude --debug` 并查找"loading plugin"消息
13172. 检查每个组件目录是否在调试输出中列出14422. 检查每个组件目录是否在调试输出中列出
13183. 验证文件权限允许读取 plugin 文件14433. 验证文件权限允许读取插件文件
1319 1444
1320***1445***
1321 1446
1327 版本管理1452 版本管理
1328</h3>1453</h3>
1329 1454
1330Claude Code 使用 plugin 的版本作为缓存键,以确定是否有可用的更新。当你运行 `/plugin update` 或自动更新触发时,Claude Code 会计算当前版本,如果与已安装的版本匹配,则跳过更新。1455Claude Code 使用插件的版本作为缓存键,以确定是否有可用的更新。当你运行 `/plugin update` 或自动更新触发时,Claude Code 会计算当前版本,如果与已安装的版本匹配,则跳过更新。
1331 1456
1332版本从以下第一个设置的字段解析:1457对于除 `command` 之外的每种源类型,Claude Code 从以下第一个设置的项中解析版本:
1333 1458
13341. plugin 的 `plugin.json` 中的 `version` 字段14591. 插件 `plugin.json` 中的 `version` 字段
13352. plugin 的 `marketplace.json` 中的市场条目中的 `version` 字段14602. 插件在 `marketplace.json` 中的市场条目中的 `version` 字段
13363. plugin 源的 git 提交 SHA,用于 git 托管市场中的 `github`、`url`、`git-subdir` 和相对路径源14613. 插件源的 git 提交 SHA,适用于 git 托管市场中的 `github`、`url`、`git-subdir` 和相对路径源
13374. `unknown`,用于 `npm` 源或不在 git 仓库内的本地目录14624. SHA-256 摘要,适用于 [`archive` 源](/docs/zh-CN/plugin-marketplaces#zip-archives):市场条目中的 `sha256` 固定值,或当你未设置固定值时下载文件的摘要。Claude Code 将其缩短为前 12 个字符
14635. `unknown`,适用于 `npm` 源或不在 git 仓库内的本地目录
1338 1464
1339这为你提供了两种方式来对 plugin 进行版本管理:1465对于 [`command` 源](/docs/zh-CN/plugin-marketplaces#command-sources),Claude Code 始终从命令生成的内容中派生版本:单独的 12 字符内容哈希,或在设置了版本时附加到 `plugin.json` 版本作为 `<version>-<hash>`。Claude Code 忽略命令源的市场条目中的 `version` 字段。因此,命令的哈希输出发生变化会产生新版本,即使编写的版本字符串保持不变。在 [link mode](/docs/zh-CN/plugin-marketplaces#copy-mode-and-link-mode) 中,哈希覆盖打印目录的真实路径及其顶级条目,而不是文件内容。
1340 1466
1341| 方法 | 如何操作 | 更新行为 | 最适合 |1467对于这些源类型,这为你提供了三种版本控制插件的方式:
1342| :------------ | :--------------------------------------- | :---------------------------------------------------------- | :------------------ |
1343| **显式版本** | 在 `plugin.json` 中设置 `"version": "2.1.0"` | 用户仅在你提升此字段时获得更新。推送新提交而不提升它没有效果,`/plugin update` 报告"已是最新版本"。 | 具有稳定发布周期的已发布 plugin |
1344| **提交 SHA 版本** | 从 `plugin.json` 和市场条目中省略 `version` | 用户在每次对 plugin 的 git 源进行新提交时获得更新 | 正在积极开发的内部或团队 plugin |
1345 1468
1346<Warning>1469| 方法 | 如何操作 | 更新行为 | 最适合 |
1347 如果你在 `plugin.json` 中设置 `version`,你必须在每次想让用户接收更改时提升它。仅推送新提交是不够的,因为 Claude Code 看到相同的版本字符串并保留缓存副本。如果你迭代速度很快,请不设置 `version`,以便改用 git 提交 SHA。1470| :------------ | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------- | :------------------------ |
1348</Warning>1471| **显式版本** | 在 `plugin.json` 中设置 `"version": "2.1.0"` | 用户仅在你更新此字段时获得更新。推送新提交而不更新它没有效果,`/plugin update` 报告"已是最新版本"。 | 具有稳定发布周期的已发布插件 |
1472| **提交 SHA 版本** | 从 `plugin.json` 和市场条目中都省略 `version` | 每当源的已解析提交发生变化时,用户获得更新 | 正在积极开发的内部或团队插件 |
1473| **摘要版本** | 使用 [`archive` 源](/docs/zh-CN/plugin-marketplaces#zip-archives) 并从 `plugin.json` 和市场条目中都省略 `version` | 使用 `sha256` 固定值时,当你更改固定值时用户获得更新。没有固定值时,每当托管 zip 文件的字节发生变化时用户获得更新 | 作为 zip 文件发布到静态服务器或工件仓库的插件 |
1349 1474
1350如果你使用显式版本,请遵循[语义版本控制](https://semver.org)(`MAJOR.MINOR.PATCH`):为破坏性更改提升 MAJOR,为新功能提升 MINOR,为错误修复提升 PATCH。在 `CHANGELOG.md` 中记录更改。1475如果你使用显式版本,请遵循 [semantic versioning](https://semver.org)(`MAJOR.MINOR.PATCH`):对于破坏性更改,增加 MAJOR;对于新功能,增加 MINOR;对于错误修复,增加 PATCH。在 `CHANGELOG.md` 中记录更改。
1351 1476
1352***1477***
1353 1478