OpenClaw Skill Registry Skills注册中心管理
世界上有一种Skill叫做注册在中心的Skill。它不需要每次手动加载,Agent启动时自动发现,版本更新时自动提醒,依赖缺失时自动告警。
Skill Registry是Agent能力的图书馆。一个好的Registry能让你的Agent像"pip install"一样轻松获得新能力。
什么是Skill Registry
Skill Registry是一个集中式的Skills管理平台:
- 发现:搜索、浏览、筛选Skills
- 版本:语义化版本、回滚、灰度发布
- 依赖:自动解析Skill之间的依赖关系
- 权限:公开/私有Skill,访问控制
- 统计:使用量、成功率、评分
Registry架构
import { SkillRegistry } from 'openclaw/registry';
const registry = new SkillRegistry({
name: "miaoquai-skills",
// === 存储 ===
storage: {
type: "git", // 或 "npm", "local"
repository: "https://github.com/miaoquai/skills",
branch: "main"
},
// === 发现 ===
discovery: {
indexUpdateInterval: "1h",
cacheEnabled: true,
cacheTTL: "24h",
// 分类结构
categories: [
"web-fetch",
"content-gen",
"seo",
"monitoring",
"integration"
]
},
// === 版本管理 ===
versioning: {
scheme: "semver", // 语义化版本
// 版本策略
policies: {
major: "破坏性变更",
minor: "新功能",
patch: "bug修复"
},
// 兼容性检查
compatibility: {
checkOnInstall: true,
autoUpgrade: false, // 不自动升级major版本
notifyOnUpdate: true
}
},
// === 权限 ===
permissions: {
publicSkills: ["*"], // 所有Skill公开
privateSkills: ["internal-*"], // 内部Skill私有
accessControl: {
read: "public",
write: "owner",
publish: "verified_publisher"
}
}
});
Skill发布流程
// 发布一个Skill到Registry
const publishFlow = async (skillPath: string) => {
// 1. 验证Skill结构
await registry.validate(skillPath);
// 检查:SKILL.md存在、schema定义正确、示例有效
// 2. 解析版本
const currentVersion = await registry.getVersion(skillPath);
const newVersion = await registry.computeNewVersion(skillPath, {
breakingChanges: false, // 是否有破坏性变更
newFeatures: true, // 是否有新功能
bugFixes: false // 是否有bug修复
});
// 结果:1.2.0 → 1.3.0(新功能)
// 3. 依赖解析
const dependencies = await registry.resolveDependencies(skillPath);
// 检查所有依赖是否在Registry中存在
// 4. 安全检查
await registry.securityScan(skillPath);
// 检查:是否有恶意代码、敏感信息泄露
// 5. 发布
await registry.publish({
name: skillPath.name,
version: newVersion,
path: skillPath,
author: "miaoquai",
changelog: "添加了批量处理功能"
});
console.log(`✅ Skill ${skillPath.name}@${newVersion} 已发布`);
};
Skill安装与使用
// 从Registry安装Skill
const installSkill = async () => {
// 搜索Skill
const results = await registry.search({
query: "web fetch",
category: "web-fetch",
sortBy: "downloads"
});
console.log(results);
// [
// { name: "coze-web-fetch", version: "2.1.0", downloads: 1523 },
// { name: "camofox-scraper", version: "1.4.2", downloads: 892 }
// ]
// 安装Skill
await registry.install("coze-web-fetch@2.1.0", {
target: "/skills/",
autoResolveDependencies: true
});
// 安装的Skill会自动解析并安装依赖
// 在Agent中使用
const agent = new Agent({
skills: [
"coze-web-fetch" // 自动从Registry加载
]
});
// 查看已安装的Skills
const installed = await registry.listInstalled();
console.log(installed);
// [
// { name: "coze-web-fetch", version: "2.1.0", installedAt: "..." }
// ]
};
版本管理详解
// 版本操作
const versionManagement = {
// 查看所有版本
listVersions: async (skillName: string) => {
const versions = await registry.versions(skillName);
return versions;
// ["1.0.0", "1.1.0", "1.2.0", "2.0.0"]
},
// 安装特定版本
installVersion: async (skillName: string, version: string) => {
await registry.install(`${skillName}@${version}`);
},
// 回滚到上一个版本
rollback: async (skillName: string) => {
const current = await registry.getCurrentVersion(skillName);
const previous = await registry.getPreviousVersion(skillName);
await registry.install(`${skillName}@${previous}`);
console.log(`回滚 ${skillName}: ${current} → ${previous}`);
},
// 灰度发布(新版本只对部分Agent生效)
canaryRelease: async (skillName: string, newVersion: string) => {
await registry.setRollout(skillName, {
version: newVersion,
percentage: 10, // 先10%的Agent用新版本
duration: "24h", // 24小时后如果没问题再扩大
autoPromote: true // 自动逐步扩大比例
});
},
// 检查更新
checkUpdates: async () => {
const updates = await registry.checkUpdates();
return updates;
// [
// { skill: "coze-web-fetch", current: "2.0.0", latest: "2.1.0", type: "minor" }
// ]
}
};
依赖管理
// 依赖解析
const dependencyManagement = {
// Skill依赖声明(在SKILL.md中)
skillDeps: `
# Dependencies
- openclaw-web-fetch >= 1.0.0
- openclaw-cache >= 2.0.0
- openclaw-logger >= 1.0.0
`,
// 解析依赖树
resolveTree: async (skillName: string) => {
const tree = await registry.resolveDependencyTree(skillName);
// 依赖树示例
console.log(tree);
// {
// skill: "my-content-gen",
// dependencies: {
// "web-fetch": { version: "2.1.0", dependencies: {} },
// "cache": { version: "2.0.0", dependencies: {
// "storage": { version: "1.0.0", dependencies: {} }
// }}
// }
// }
return tree;
},
// 冲突检测
detectConflicts: async () => {
const conflicts = await registry.detectDependencyConflicts();
// 冲突示例
if (conflicts.length > 0) {
console.log("发现依赖冲突:");
conflicts.forEach(c => {
console.log(`${c.skillA} 需要 ${c.dep}@${c.versionA}`);
console.log(`${c.skillB} 需要 ${c.dep}@${c.versionB}`);
console.log("建议解决方案:" + c.resolution);
});
}
}
};
统计与监控
// Skill使用统计
const stats = {
// 获取Skill统计
getStats: async (skillName: string) => {
const stat = await registry.stats(skillName);
return {
downloads: 1523,
activeUsers: 89,
successRate: 0.97,
avgLatency: "2.3s",
lastUsed: "2026-05-09T22:00:00Z"
};
},
// 获取评分
getRating: async (skillName: string) => {
const rating = await registry.rating(skillName);
return {
average: 4.5,
total: 23,
distribution: {
"5星": 15,
"4星": 5,
"3星": 2,
"2星": 1,
"1星": 0
}
};
},
// 获取热门Skills
getTrending: async () => {
const trending = await registry.trending({
period: "7d",
limit: 10
});
return trending;
// [
// { name: "coze-web-fetch", growth: "+32%" },
// { name: "camofox-scraper", growth: "+18%" }
// ]
}
};
最佳实践
- 语义化版本:major/minor/patch严格遵循
- 写好SKILL.md:清晰的文档、示例、依赖声明
- 测试覆盖:发布前确保测试通过
- 灰度发布:重大更新先小范围验证
- 监控反馈:关注成功率和用户评分
常见问题
Q: Skill Registry和npm有什么区别?
npm管理Node.js包,Skill Registry管理Agent能力包。Skill有特定的SKILL.md格式、OpenClaw专用schema、Agent运行时适配。
Q: 如何创建私有Registry?
使用Git仓库或本地目录作为存储,配置permissions限制访问。私有Skill名称建议以"internal-"开头便于区分。
相关资源
构建你的Agent能力库
好的Skills值得复用。OpenClaw Skill Registry让你的Agent能力像npm包一样可发现、可安装、可更新。写一次Skill,让所有Agent受益。
查看Registry模板