> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 插件

> 从代码仓库、git URL 或本地文件夹安装并共享技能包。

<Note>
  插件目前处于 **beta** 阶段。其行为和配置可能会在后续版本中发生变化。
</Note>

**插件**是一组可复用的[技能](/zh/cli/extensibility/skills/overview)，你可以从 GitHub 代码仓库、git URL 或本地文件夹安装，并在多个项目之间复用。安装插件后，其中的技能会以 `/<plugin>:<skill>` 斜杠命令的形式提供，并且还会自动拉取其依赖的其他插件。

插件本质上只是一个包含以下内容的来源：

```
my-plugin/
├── .devin-plugin/
│   └── plugin.json     # 插件清单
├── AGENTS.md           # 可选规则
└── skills/
    └── review/
        └── SKILL.md    # 常规技能
```

`skills/` 目录用于存放常规技能——插件不会引入新的技能
格式。有关 `SKILL.md` 的格式，请参阅[创建技能](/zh/cli/extensibility/skills/creating-skills)。

插件也可以附带**规则**：位于插件根目录的 `AGENTS.md` 会作为始终生效的规则注入到每个会话中，与项目自身的规则一同生效。`rules/` 文件夹中的 Markdown 文件也会一并加载，并使用与[Windsurf 规则](/zh/cli/extensibility/rules#rules-from-other-tools)相同的 `trigger`
frontmatter 和[激活类型](/zh/cli/extensibility/rules#rule-activation-types)。

***

<div id="installing-a-plugin">
  ## 安装插件
</div>

插件来源可以是 GitHub `owner/repo`、git URL 或本地路径：

```bash theme={null}
# 从 GitHub 安装
devin plugins install acme/review-tools

# 从任意 git 托管平台安装
devin plugins install https://gitlab.com/acme/review-tools.git

# 从本地文件夹安装（非常适合本地开发调试）
devin plugins install ./my-plugin
```

安装前，Devin 会显示该插件将添加的内容——它提供的技能、
将自动安装的所有必需插件，以及它引入的任何策略
(例如，是否禁止其他插件) 。传入 `-y` / `--yes` 可跳过
提示。

插件以 **user** 级别安装，并可在你的所有
项目中使用。

***

<div id="managing-plugins">
  ## 管理插件
</div>

```bash theme={null}
# 列出已安装的插件、其版本以及是否有插件被策略阻止
devin plugins list

# 显示插件的 技能 及其必需/可选/禁止列表
devin plugins info review-tools

# 重新拉取某个插件（或所有插件）的最新版本
devin plugins update review-tools
devin plugins update

# 移除插件（自动安装的必需插件将保留原位）
devin plugins remove review-tools
```

本地插件会直接链接到源文件夹，因此编辑会立即生效：
`devin plugins install ./my-plugin` → 编辑 `skills/<name>/SKILL.md` → 所做更改
会在下一次会话中生效，无需执行 `update`。

***

<div id="the-manifest">
  ## 清单
</div>

`.devin-plugin/plugin.json` 用于描述插件。只有 `name` 是必填项，
并且它在已安装插件中必须唯一 (即 `/<name>:…` 命名空间) 。

```jsonc theme={null}
{
  "name": "review-tools",
  "version": "1.0.0",
  "description": "Code-review skills for our team",
  "requiredPlugins": [
    "acme/secure-base",
    { "source": "github", "repo": "acme/audit-logging" }
  ],
  "optionalPlugins": [
    "acme/deploy-tools",
    { "source": "url", "url": "https://gitlab.com/acme/extra.git" }
  ],
  "forbiddenPlugins": ["sketchy-org/bad-plugin", "acme/*", "*"]
}
```

支持的元数据字段：`name`、`version`、`description`、`author`
(`{ name, email }`) 、`homepage`、`repository`、`license` 和 `keywords`。

依赖项条目表示一个**来源**——可以是字符串简写，也可以是对象：

| 形式                                                                 | 含义              |
| ------------------------------------------------------------------ | --------------- |
| `"owner/repo"`                                                     | GitHub 代码仓库     |
| `"https://…"`, `"git@…"`, `"ssh://…"`                              | 任意 git URL      |
| `{ "source": "github", "repo": "owner/repo" }`                     | GitHub，对象形式     |
| `{ "source": "url", "url": "https://gitlab.com/team/plugin.git" }` | git URL，对象形式    |
| `{ "source": "git-subdir", "url": "…", "path": "sub/dir" }`        | 位于共享代码仓库子目录中的插件 |

同一代码仓库的所有 GitHub 表示形式 (`owner/repo`、HTTPS URL、`.git` URL、SSH 形式) 都对应同一个插件标识。

***

<div id="dependencies-and-governance">
  ## 依赖与治理
</div>

插件可以声明三个列表，使单个插件能够作为由其他插件构成的精选、受管控的集合。

<div id="requiredplugins">
  ### `requiredPlugins`
</div>

安装插件时会自动 (递归) 安装这些插件。如果某个必需插件被策略阻止，整个安装都会失败——不支持部分安装。

<div id="optionalplugins">
  ### `optionalPlugins`
</div>

该插件认可的插件**允许列表**。这些插件**不会**自动安装；此列表仅用于将某个被禁用的条目设为例外
(见下文) 。

<div id="forbiddenplugins">
  ### `forbiddenPlugins`
</div>

一个由插件标识和 glob 模式组成的**禁止列表**。

`forbiddenPlugins` 条目会与插件标识进行匹配：

* **精确标识**，写作 `owner/repo` 或 git URL。同一代码仓库的所有 GitHub 形式 (`owner/repo`、HTTPS URL、`.git` URL、SSH 形式) 都对应同一个标识。
* **glob 模式**——任何包含 `*` 的条目。`*` 可匹配任意字符序列 (包括 `/`) ：`acme/*` 匹配 `acme` 的所有 GitHub 代码仓库，`*/secrets` 匹配任意所有者下名为 `secrets` 的代码仓库，`https://gitlab.com/acme/*` 则匹配该路径下的任意代码仓库。
* 单独的 `"*"`，它会匹配其他所有内容 (即完全锁定) 。

这些列表按 deny 优先生效：

* **Deny 优先。** 只要任何一个活动中的清单或已安装插件禁止某个插件，该插件就会被阻止。如果没有任何规则禁止任何内容，就不会有插件被阻止。
* **自身覆盖例外。** 清单 (或插件) 自身的 `requiredPlugins` 和 `optionalPlugins`——以及对于插件而言，插件本身——不受其**自身** forbidden 列表的限制。因此，`"forbiddenPlugins": ["*"]` 加上 `"optionalPlugins": ["acme/approved"]` 的含义是“只允许此清单列出的内容；禁止其他所有内容”。该例外仅适用于这些直接条目，不包括必需插件的传递依赖——在锁定模式下，需要将这些内容显式列出。
* **不允许跨作用域重新放行。** 一个清单或插件的允许列表，不能重新放行被**另一个**清单或插件禁止的内容。\`"forbiddenPlugins": \["\*"]\`\` 这种完全锁定，无法从更低作用域绕过。

强制执行发生在两个时间点：

* **安装时**——如果要安装的插件已被阻止 (或其必需插件无法满足，或其名称与已安装插件冲突) ，安装会被拒绝。
* **加载时**——如果某个插件在安装后才被阻止，它仍会保留在磁盘上，但其技能会在会话开始时被跳过，并显示一条警告，指出是哪个禁止方导致的。

除上述 `owner/repo` 和 git URL 形式外，被列入禁止列表的标识也可以是**本地路径** (适用于从本地文件夹安装的插件) 。
