Plugins
Plugins 模块实现 Claude Code 的内置插件系统,通过 builtinPlugins.ts 管理以 {name}@builtin 格式标识的内置插件。每个插件可包含 Skills(命令)、Hooks(生命周期钩子)和 MCP Servers(外部工具服务器)三种组件。插件支持用户级启用/禁用(持久化到 settings),支持可用性检测(isAvailable),并通过 bundled/ 目录承载实际的插件实现。插件系统与 Marketplace 插件共享 LoadedPlugin 接口,但通过 isBuiltin 标志区分来源。
职责与设计理念
职责说明
内置插件注册表,管理可启用/禁用的内置插件生态
设计理念
插件即能力单元——每个插件是 Skills + Hooks + MCP 的原子组合,用户可以像开关一样控制 AI 的能力边界。内置与市场插件共享接口,差异仅在来源。
架构决策
为什么内置插件和市场插件共享同一个接口?
统一 LoadedPlugin 接口,通过 isBuiltin 标志区分来源
对消费者(Commands、UI)来说,插件的来源不影响使用方式。统一接口让命令发现、权限检查、UI 渲染等逻辑只需写一份。来源差异只在加载和更新时有意义。
为什么插件支持 isAvailable 检测?
运行时可用性检测,而非编译时排除
某些插件依赖外部工具(如 GitHub CLI),这些工具可能未安装。isAvailable 在运行时检测环境,让插件在不满足条件时优雅隐藏,而非报错。
文件清单
| 文件名 | 用途 |
|---|---|
| builtinPlugins.ts | 内置插件注册表,管理注册、查询、启用/禁用和 Skill 转换 |
| bundled/ | 内置插件实现目录,承载各插件的具体逻辑 |
使用场景
用户在设置面板中启用/禁用内置插件,状态持久化到 settings.json
已启用插件的 Skills 自动出现在 / 命令列表中
getCommands() → getBuiltinPluginSkillCommands() → 聚合到命令列表
插件注册的 MCP Server 自动启动,其工具可在对话中使用
关键代码片段
内置插件注册与加载
type BuiltinPluginDefinition = {
name: string
description: string
version: string
defaultEnabled?: boolean
isAvailable?: () => boolean
skills?: BundledSkillDefinition[]
hooks?: HooksConfig
mcpServers?: McpServerConfig[]
}
function registerBuiltinPlugin(def: BuiltinPluginDefinition) {
BUILTIN_PLUGINS.set(def.name, def)
}
function getBuiltinPlugins(): {
enabled: LoadedPlugin[], disabled: LoadedPlugin[]
} {
for (const [name, def] of BUILTIN_PLUGINS) {
if (def.isAvailable && !def.isAvailable()) continue
const isEnabled = userSetting ?? def.defaultEnabled ?? true
// ...分流到 enabled/disabled
}
} 插件三要素(Skills/Hooks/MCP)+ 用户级开关 + 可用性检测的完整生命周期
插件能力组合模式
// 一个插件可以同时提供命令、钩子和 MCP 服务器
const codeReviewPlugin: BuiltinPluginDefinition = {
name: 'code-review',
description: 'AI-powered code review',
version: '1.0.0',
skills: [
{ name: 'review', description: 'Review PR changes' }
],
hooks: {
preCommit: async (ctx) => { /* 提交前自动审查 */ }
},
mcpServers: [
{ name: 'github', config: { /* GitHub API 配置 */ } }
],
} 插件是 Skills + Hooks + MCP 的原子组合,三种能力可任意搭配
技术笔记
插件版本冲突
内置插件和市场插件可能同名。内置插件通过 {name}@builtin 命名空间隔离,市场插件通过 {name}@{author} 隔离。