插件与技能系统
Claude Code 的扩展性通过插件(Plugins)和技能(Skills)两个系统实现。
架构关系
┌─────────────┐ ┌─────────────┐
│ Plugins │ │ Skills │
│ (容器/包) │ │ (能力单元) │
│ │ │ │
│ ┌─────────┐ │ │ ┌─────────┐ │
│ │ Skill A │ │ │ │ Skill X │ │
│ │ Skill B │ │ │ │ Skill Y │ │
│ └─────────┘ │ │ └─────────┘ │
└─────────────┘ └─────────────┘
│ │
└────────┬─────────┘
▼
Command[] 注册
│
▼
命令面板可用插件系统 (plugins/)
builtinPlugins.ts
builtinPlugins.ts 管理内置插件的注册和获取。
主要导出:
BUILTIN_MARKETPLACE_NAME = 'builtin'registerBuiltinPlugin(definition)— 注册内置插件到BUILTIN_PLUGINSMapisBuiltinPluginId(pluginId)— 检查是否以@builtin结尾getBuiltinPlugins()— 返回{ enabled, disabled }插件分组(基于用户设置的defaultEnabled字段)getBuiltinPluginSkillCommands()— 将启用的插件技能转为 Command 对象
bundled/index.ts
typescript
function initBuiltinPlugins(): void {
// 当前为脚手架 — 尚无内置插件注册
}技能系统 (skills/)
bundledSkills.ts — 技能注册
typescript
interface BundledSkillDefinition {
name: string
description: string
aliases?: string[]
whenToUse?: string
argumentHint?: string
allowedTools?: string[]
model?: string
disableModelInvocation?: boolean
userInvocable?: boolean
isEnabled?: () => boolean
hooks?: HooksSettings
context?: string
agent?: string
files?: Record<string, string> // 内嵌文件
getPromptForCommand(): Promise<string> // 懒加载提示
}
// 注册技能(含文件提取)
function registerBundledSkill(definition: BundledSkillDefinition): void {
// 1. 添加到内部注册表
// 2. 处理文件提取(如果有 files 字段)
}
// 确定性提取路径
function getBundledSkillExtractDir(skillName: string): string
// 安全文件提取
// - O_NOFOLLOW | O_EXCL (防符号链接攻击)
// - 0o700 目录权限,0o600 文件权限
// - TOCTOU 安全内置技能清单
常驻技能
| 技能名 | 功能 |
|---|---|
updateConfig | 更新项目配置 |
keybindings | 快捷键配置 |
verify | 代码验证(Anthropic 内部) |
debug | 启用调试日志 |
loremIpsum | Lorem Ipsum 生成 |
skillify | 技能文件生成 |
remember | 记忆审查 — 分类/提升 |
simplify | 简化代码 |
batch | 批量并行编排(5-30 workers) |
stuck | 卡住时的调试辅助 |
特性门控技能
| 技能名 | 特性门控 | 功能 |
|---|---|---|
dream | KAIROS | 后台思考 |
hunter | REVIEW_ARTIFACT | 代码审查 |
loop | AGENT_TRIGGERS | Agent 循环触发 |
scheduleRemoteAgents | AGENT_TRIGGERS_REMOTE | 远程 Agent 调度 |
claudeApi | BUILDING_CLAUDE_APPS | Claude API 辅助 |
claudeInChrome | - | Chrome 集成 |
runSkillGenerator | RUN_SKILL_GENERATOR | 技能生成器 |
loadSkillsDir.ts — 技能加载
技能加载模块的主要导出:
LoadedFrom类型:'commands_DEPRECATED' | 'skills' | 'plugin' | 'managed' | 'bundled' | 'mcp'getSkillsPath(source, dir)— 解析技能路径estimateSkillFrontmatterTokens(skill)— 估算 Token 数getFileIdentity(filePath)— 通过realpath解析符号链接,返回Promise<string | null>(async 函数),确保同一文件不重复加载parseSkillFrontmatterFields(frontmatter, markdownContent, skillName)— 解析 YAML frontmatter(前 30 行),提取 name、description、whenToUse、model、hooks、paths 等字段。注意实际接受 3 个参数。
技能加载流程
┌──────────────────┐
│ initBundledSkills │
│ (启动时) │
└────────┬─────────┘
▼
┌──────────────────┐ ┌──────────────────┐
│ 扫描 skills/ 目录 │ │ 加载 MCP 技能 │
│ (文件系统) │ │ (MCP 服务器) │
└────────┬─────────┘ └────────┬──────────┘
│ │
└──────────┬───────────┘
▼
┌─────────────────┐
│ 去重(realpath) │
│ .gitignore 过滤 │
└────────┬────────┘
▼
┌──────────────────┐
│ Command[] 注册 │
│ (skils → commands)│
└──────────────────┘mcpSkillBuilders.ts — 依赖解耦
typescript
interface MCPSkillBuilders {
createSkillCommand: (def: MCPSkillDef) => Command
parseSkillFrontmatterFields: (content: string) => SkillMetadata
}
// 一次性注册(打破循环依赖)
function registerMCPSkillBuilders(b: MCPSkillBuilders): void
function getMCPSkillBuilders(): MCPSkillBuildersbatch 技能详解
/batch "为所有 API 端点添加日志"
┌─────────────────────────────┐
│ 1. Research Phase │
│ 扫描代码库,理解模式 │
├─────────────────────────────┤
│ 2. Decompose Phase │
│ 拆分为 5-30 个独立任务 │
├─────────────────────────────┤
│ 3. Spawn Workers Phase │
│ 为每个任务创建 git worktree│
│ 启动并行 Agent │
├─────────────────────────────┤
│ 4. Track PRs Phase │
│ 监控各 PR 状态 │
│ 处理失败重试 │
└─────────────────────────────┘remember 技能详解
/remember
1. 扫描自动记忆目录
2. 逐条分类(保留/删除/提升)
3. 提升到 CLAUDE.md 或 CLAUDE.local.md
4. 清理冗余记忆