OpenClaw 技能发布与共享:从开发到社区贡献的完整指南

目录

    • 摘要
    • [1. 引言](#1. 引言)
    • [2. ClawHub 技能市场介绍](#2. ClawHub 技能市场介绍)
      • [2.1 什么是 ClawHub](#2.1 什么是 ClawHub)
      • [2.2 ClawHub 的核心价值](#2.2 ClawHub 的核心价值)
      • [2.3 技能市场架构](#2.3 技能市场架构)
      • [2.4 ClawHub CLI 工具](#2.4 ClawHub CLI 工具)
    • [3. 技能打包规范](#3. 技能打包规范)
      • [3.1 技能目录结构](#3.1 技能目录结构)
      • [3.2 SKILL.md 文件规范](#3.2 SKILL.md 文件规范)
      • [3.3 元数据字段详解](#3.3 元数据字段详解)
      • [3.4 技能包大小限制](#3.4 技能包大小限制)
    • [4. 版本管理策略](#4. 版本管理策略)
      • [4.1 语义化版本控制](#4.1 语义化版本控制)
      • [4.2 版本更新规则](#4.2 版本更新规则)
      • [4.3 变更日志规范](#4.3 变更日志规范)
      • [4.4 版本发布流程](#4.4 版本发布流程)
    • [5. 发布流程详解](#5. 发布流程详解)
      • [5.1 发布前准备](#5.1 发布前准备)
        • [5.1.1 注册 ClawHub 账号](#5.1.1 注册 ClawHub 账号)
        • [5.1.2 验证技能结构](#5.1.2 验证技能结构)
      • [5.2 发布命令详解](#5.2 发布命令详解)
      • [5.3 完整发布示例](#5.3 完整发布示例)
      • [5.4 发布后验证](#5.4 发布后验证)
      • [5.5 发布常见问题](#5.5 发布常见问题)
    • [6. 技能文档编写](#6. 技能文档编写)
      • [6.1 文档结构规范](#6.1 文档结构规范)
      • [6.2 README.md 编写指南](#6.2 README.md 编写指南)
      • [6.3 代码注释规范](#6.3 代码注释规范)
      • [6.4 示例代码编写](#6.4 示例代码编写)
    • [7. 社区贡献指南](#7. 社区贡献指南)
      • [7.1 贡献方式](#7.1 贡献方式)
      • [7.2 贡献流程](#7.2 贡献流程)
      • [7.3 Pull Request 规范](#7.3 Pull Request 规范)
      • [7.4 代码审查标准](#7.4 代码审查标准)
      • [7.5 社区行为准则](#7.5 社区行为准则)
    • [8. 最佳实践](#8. 最佳实践)
      • [8.1 技能设计原则](#8.1 技能设计原则)
      • [8.2 性能优化建议](#8.2 性能优化建议)
      • [8.3 安全性考虑](#8.3 安全性考虑)
      • [8.4 版本兼容性维护](#8.4 版本兼容性维护)
      • [8.5 持续集成建议](#8.5 持续集成建议)
      • [8.6 发布节奏建议](#8.6 发布节奏建议)
    • [9. 实战案例:发布一个完整技能](#9. 实战案例:发布一个完整技能)
      • [9.1 案例背景](#9.1 案例背景)
      • [9.2 技能结构](#9.2 技能结构)
      • [9.3 核心代码](#9.3 核心代码)
      • [9.4 发布过程](#9.4 发布过程)
      • [9.5 发布后维护](#9.5 发布后维护)
    • [10. 总结](#10. 总结)
    • 参考资料

摘要

本文深入探讨 OpenClaw 技能生态的核心组成部分------技能发布与共享机制。从 ClawHub 技能市场的架构设计出发,详细讲解技能打包规范、版本管理策略、发布流程以及技能文档编写的最佳实践。通过真实案例和代码示例,读者将掌握如何将自己开发的技能发布到社区,实现技能的共享与协作。无论你是初入 OpenClaw 生态的新手,还是希望为社区贡献力量的资深开发者,本文都将为你提供从技能开发到社区发布的完整路线图。

1. 引言

在 AI Agent 开发领域,技能(Skill)系统是区分框架能力的关键因素。OpenClaw 通过其独特的技能架构,让开发者能够像搭积木一样扩展 AI Agent 的能力边界。然而,技能的价值不仅在于开发,更在于共享------当一个技能被社区广泛使用和改进时,它才能发挥最大的价值。

ClawHub 作为 OpenClaw 官方的技能市场,为技能的发布、发现和共享提供了标准化的平台。本文将从实践角度出发,系统性地介绍技能发布的完整流程,帮助开发者将自己的创意转化为社区共享的资源。

2. ClawHub 技能市场介绍

2.1 什么是 ClawHub

ClawHub 是 OpenClaw 官方运营的技能市场平台,类似于 npm 之于 Node.js、PyPI 之于 Python。它为 OpenClaw 技能提供了一个中心化的分发渠道,让开发者可以轻松地发布、更新和分享自己开发的技能。

2.2 ClawHub 的核心价值

ClawHub 的设计理念围绕三个核心价值展开:

价值维度 具体体现 用户收益
发现性 搜索引擎、分类标签、热门推荐 快速找到所需技能
可靠性 版本管理、变更日志、作者认证 安心使用稳定版本
协作性 Fork、PR、社区讨论 参与技能改进

2.3 技能市场架构

ClawHub 采用现代化的微服务架构,确保高可用性和快速响应:
💾 存储层
⚙️ 服务层
👤 用户层
开发者
ClawHub CLI
使用者
Web界面
API Gateway
认证服务
技能索引
版本管理
技能元数据
技能包存储
用户数据

2.4 ClawHub CLI 工具

ClawHub 提供了功能完善的命令行工具,让开发者可以完全通过终端完成技能的搜索、安装和发布:

bash 复制代码
# 安装 ClawHub CLI
npm install -g clawhub

# 查看帮助信息
clawhub --help

# 查看当前登录状态
clawhub whoami

CLI 工具的核心命令包括:

命令 功能 使用场景
search 搜索技能 发现新技能
install 安装技能 获取技能到本地
update 更新技能 升级到新版本
list 列出已安装技能 管理本地技能
publish 发布技能 分享到社区
login 登录认证 发布前准备

3. 技能打包规范

3.1 技能目录结构

一个标准的 OpenClaw 技能应遵循以下目录结构:

复制代码
my-skill/
├── SKILL.md              # 技能主文件(必需)
├── README.md             # 技能说明文档
├── package.json          # 技能元数据(可选)
├── scripts/              # 可执行脚本
│   ├── helper.py
│   └── utils.sh
├── references/           # 参考文档
│   ├── api.md
│   └── examples.md
├── assets/               # 静态资源
│   ├── logo.png
│   └── templates/
└── tests/                # 测试用例
    └── test_cases.json

3.2 SKILL.md 文件规范

SKILL.md 是技能的核心文件,包含 YAML 前置元数据和 Markdown 格式的指令内容:

yaml 复制代码
---
name: weather-forecast
description: 获取天气信息和天气预报。当用户询问天气、温度、降雨等气象相关问题时使用此技能。
metadata:
  openclaw:
    requires:
      bins: ["curl"]
      env: ["WEATHER_API_KEY"]
    install:
      - id: python-requests
        kind: pip
        package: requests
        label: 安装 Python requests 库
---

# 天气预报技能

本技能为 OpenClaw 提供天气查询和预报功能。

## 功能特性

- 实时天气查询
- 多日天气预报
- 城市天气对比
- 天气预警提醒

## 使用方法

当用户询问天气时,按以下步骤操作:

1. 解析用户提供的城市名称
2. 调用天气 API 获取数据
3. 格式化返回结果

## API 配置

需要在环境变量中设置天气 API 密钥:

export WEATHER_API_KEY="your_api_key"

## 输出格式

天气信息以结构化格式返回:

{
  "city": "北京",
  "temperature": "25°C",
  "condition": "晴",
  "humidity": "45%",
  "forecast": [...]
}

上述 SKILL.md 文件展示了技能定义的标准格式。YAML 前置元数据中的 name 字段定义技能的唯一标识符,description 字段描述技能的用途和触发条件,这是 AI Agent 决定是否调用该技能的关键依据。metadata 部分声明了技能的依赖项,包括必需的二进制工具和环境变量,以及自动安装脚本。Markdown 正文部分则详细说明了技能的功能、使用方法和输出格式,为 AI Agent 提供执行指令。

3.3 元数据字段详解

字段 必需 说明 示例
name 技能唯一标识符 weather-forecast
description 技能描述和触发条件 获取天气信息...
metadata.openclaw.requires 运行时依赖 bins: ["curl"]
metadata.openclaw.install 自动安装配置 pip install requests
version 技能版本号 1.2.0
author 作者信息 墨离 <moli@openclaw.ai>

3.4 技能包大小限制

为确保传输效率和加载速度,技能包应遵循以下限制:

资源类型 建议上限 说明
SKILL.md 500 行 主文件保持精简
单个脚本 1000 行 复杂逻辑拆分到多个文件
总包大小 10 MB 不含大型模型文件
图片资源 500 KB/张 使用压缩格式

4. 版本管理策略

4.1 语义化版本控制

ClawHub 强制要求使用语义化版本(Semantic Versioning),版本号格式为 MAJOR.MINOR.PATCH
版本号 1.2.3
MAJOR 主版本
MINOR 次版本
PATCH 补丁版本
不兼容的 API 变更
向后兼容的功能新增
向后兼容的问题修复

4.2 版本更新规则

变更类型 版本变更 示例 说明
破坏性变更 MAJOR +1 1.0.0 → 2.0.0 API 不兼容更新
新增功能 MINOR +1 1.0.0 → 1.1.0 向后兼容的新特性
Bug 修复 PATCH +1 1.0.0 → 1.0.1 向后兼容的修复

4.3 变更日志规范

每个版本发布时应附带清晰的变更日志:

markdown 复制代码
## [1.2.0] - 2026-03-19

### Added
- 新增多城市天气对比功能
- 支持天气预警推送

### Changed
- 优化 API 调用性能,响应时间降低 30%
- 更新城市名称解析逻辑

### Fixed
- 修复时区转换错误问题
- 修复特殊字符编码问题

### Deprecated
- `getWeather()` 方法将在 2.0 版本移除
- 请使用 `fetchWeatherData()` 替代

4.4 版本发布流程

ClawHub Registry ClawHub CLI 本地环境 开发者 ClawHub Registry ClawHub CLI 本地环境 开发者 完成代码开发 更新版本号 编写变更日志 clawhub publish 验证技能包 上传技能包 版本号检查 安全扫描 发布成功 发布确认

5. 发布流程详解

5.1 发布前准备

在发布技能之前,需要完成以下准备工作:

5.1.1 注册 ClawHub 账号
bash 复制代码
# 方式一:交互式登录
clawhub login

# 方式二:使用 API Token
export CLAWHUB_TOKEN="your_api_token"

登录成功后,可以验证身份:

bash 复制代码
clawhub whoami
# 输出:Logged in as moli (moli@openclaw.ai)
5.1.2 验证技能结构

使用内置验证工具检查技能包是否符合规范:

bash 复制代码
# 验证技能目录
clawhub validate ./my-skill

# 输出示例
✅ SKILL.md 格式正确
✅ 元数据完整
✅ 依赖声明有效
⚠️  建议:添加 README.md 文件

5.2 发布命令详解

ClawHub CLI 的 publish 命令支持多种参数:

bash 复制代码
clawhub publish ./my-skill \
  --slug my-skill \
  --name "My Skill" \
  --version 1.2.0 \
  --changelog "新增天气对比功能"
参数 必需 说明
--slug 技能 URL 标识符
--name 技能显示名称
--version 版本号
--changelog 变更日志
--registry 自定义仓库地址
--dry-run 模拟发布(测试用)

5.3 完整发布示例

以下是一个完整的技能发布流程示例:

bash 复制代码
#!/bin/bash
# publish-skill.sh - 技能发布脚本

set -e

# 定义技能信息
SKILL_DIR="./weather-forecast"
SKILL_SLUG="weather-forecast"
SKILL_NAME="天气预报技能"
SKILL_VERSION="1.2.0"
CHANGELOG="新增多城市对比功能,优化API调用性能"

# 步骤1:验证登录状态
echo "🔐 检查登录状态..."
if ! clawhub whoami &> /dev/null; then
    echo "请先登录: clawhub login"
    exit 1
fi

# 步骤2:验证技能结构
echo "🔍 验证技能结构..."
clawhub validate "$SKILL_DIR"

# 步骤3:运行测试(如果有)
echo "🧪 运行测试..."
if [ -d "$SKILL_DIR/tests" ]; then
    cd "$SKILL_DIR" && npm test && cd ..
fi

# 步骤4:模拟发布
echo "📦 模拟发布..."
clawhub publish "$SKILL_DIR" \
    --slug "$SKILL_SLUG" \
    --name "$SKILL_NAME" \
    --version "$SKILL_VERSION" \
    --changelog "$CHANGELOG" \
    --dry-run

# 步骤5:确认发布
read -p "确认发布? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "🚀 正式发布..."
    clawhub publish "$SKILL_DIR" \
        --slug "$SKILL_SLUG" \
        --name "$SKILL_NAME" \
        --version "$SKILL_VERSION" \
        --changelog "$CHANGELOG"
    echo "✅ 发布成功!"
fi

上述脚本展示了技能发布的完整自动化流程。首先检查用户登录状态,确保有发布权限;然后验证技能目录结构是否符合规范;接着运行测试用例确保代码质量;使用 --dry-run 参数进行模拟发布,预览发布结果;最后在用户确认后执行正式发布。这种分步骤、可验证的发布流程可以有效避免发布错误,保证技能质量。

5.4 发布后验证

发布成功后,可以通过以下方式验证:

bash 复制代码
# 搜索刚发布的技能
clawhub search "weather-forecast"

# 查看技能详情
clawhub info weather-forecast

# 尝试安装
clawhub install weather-forecast --version 1.2.0

5.5 发布常见问题

问题 原因 解决方案
版本号已存在 重复发布相同版本 更新版本号后重试
认证失败 Token 过期或无效 重新执行 clawhub login
技能包过大 超过大小限制 压缩资源或移除不必要文件
元数据缺失 必填字段为空 补充 SKILL.md 元数据

6. 技能文档编写

6.1 文档结构规范

一份高质量的技能文档应包含以下部分:
技能文档
概述
功能简介
使用场景
快速开始
安装指南
环境要求
安装步骤
配置方法
使用说明
基本用法
参数说明
示例代码
进阶主题
自定义配置
最佳实践
性能优化
故障排除
常见问题
错误代码
获取帮助

6.2 README.md 编写指南

README.md 是技能的门面,应简洁明了地展示技能价值:

markdown 复制代码
# 天气预报技能 🌤️

[![版本](https://img.shields.io/npm/v/weather-forecast.svg)](https://clawhub.com/skill/weather-forecast)
[![下载量](https://img.shields.io/npm/dm/weather-forecast.svg)](https://clawhub.com/skill/weather-forecast)
[![许可证](https://img.shields.io/npm/l/weather-forecast.svg)](LICENSE)

一键获取全球城市天气信息,支持实时天气和多日预报。

## ✨ 特性

- 🌍 支持全球 200,000+ 城市
- ⚡ 毫秒级响应速度
- 📊 详细的气象数据
- 🔔 天气预警推送

## 📦 安装

clawhub install weather-forecast

## 🚀 快速开始

# 查询北京天气
"北京今天天气怎么样?"

# 获取三日预报
"未来三天上海的天气如何?"

## ⚙️ 配置

设置环境变量:

export WEATHER_API_KEY="your_api_key"

## 📖 文档

- [完整文档](./docs/README.md)
- [API 参考](./docs/api.md)
- [示例代码](./examples/)

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📄 许可证

MIT License

6.3 代码注释规范

技能中的脚本代码应包含清晰的注释:

python 复制代码
#!/usr/bin/env python3
"""
天气数据获取模块

本模块负责从天气 API 获取数据并进行解析处理。
支持实时天气查询和多日天气预报功能。

依赖:
    - requests: HTTP 请求库
    - python-dateutil: 日期处理库

作者: 墨离
版本: 1.2.0
"""

import os
import requests
from datetime import datetime
from typing import Dict, List, Optional

# API 配置常量
API_BASE_URL = "https://api.weatherapi.com/v1"
DEFAULT_TIMEOUT = 10  # 请求超时时间(秒)
MAX_RETRIES = 3       # 最大重试次数


class WeatherClient:
    """
    天气 API 客户端
    
    用于与天气 API 交互,获取天气数据。
    
    Attributes:
        api_key (str): API 密钥
        base_url (str): API 基础 URL
        timeout (int): 请求超时时间
    
    Example:
        >>> client = WeatherClient("your_api_key")
        >>> weather = client.get_current("Beijing")
        >>> print(weather["temp_c"])
        25
    """
    
    def __init__(self, api_key: str, base_url: str = API_BASE_URL):
        """
        初始化天气客户端
        
        Args:
            api_key: 天气 API 密钥
            base_url: API 基础 URL(可选)
        
        Raises:
            ValueError: 当 api_key 为空时抛出
        """
        if not api_key:
            raise ValueError("API 密钥不能为空")
        
        self.api_key = api_key
        self.base_url = base_url
        self.timeout = DEFAULT_TIMEOUT
    
    def get_current(self, city: str) -> Dict:
        """
        获取指定城市的实时天气
        
        Args:
            city: 城市名称,支持中文和英文
        
        Returns:
            包含天气信息的字典,结构如下:
            {
                "city": "北京",
                "temp_c": 25,
                "condition": "晴",
                "humidity": 45,
                "wind_kph": 12
            }
        
        Raises:
            requests.RequestException: 网络请求失败
            ValueError: 城市不存在
        """
        endpoint = f"{self.base_url}/current.json"
        params = {
            "key": self.api_key,
            "q": city,
            "lang": "zh"
        }
        
        response = requests.get(
            endpoint, 
            params=params, 
            timeout=self.timeout
        )
        response.raise_for_status()
        
        data = response.json()
        return self._parse_current_weather(data)
    
    def _parse_current_weather(self, data: Dict) -> Dict:
        """
        解析天气 API 返回的原始数据
        
        Args:
            data: API 返回的原始 JSON 数据
        
        Returns:
            标准化的天气数据字典
        """
        return {
            "city": data["location"]["name"],
            "temp_c": data["current"]["temp_c"],
            "condition": data["current"]["condition"]["text"],
            "humidity": data["current"]["humidity"],
            "wind_kph": data["current"]["wind_kph"],
            "last_updated": data["current"]["last_updated"]
        }

上述 Python 代码展示了天气数据获取模块的完整实现。代码遵循 Google 风格的文档字符串规范,每个类和方法都包含详细的说明,包括参数类型、返回值结构和可能抛出的异常。模块级别的文档字符串说明了模块的整体功能和依赖项。类型注解(Type Hints)的使用让代码更加清晰,也便于 IDE 进行类型检查。这种规范的代码注释方式不仅有助于其他开发者理解和使用代码,也便于 AI Agent 正确调用技能功能。

6.4 示例代码编写

提供丰富的示例代码可以大大降低使用门槛:

markdown 复制代码
## 使用示例

### 示例 1:查询实时天气

from weather_forecast import WeatherClient

# 初始化客户端
client = WeatherClient(api_key=os.environ["WEATHER_API_KEY"])

# 查询天气
weather = client.get_current("北京")
print(f"北京当前温度:{weather['temp_c']}°C")

### 示例 2:获取天气预报

# 获取三天预报
forecast = client.get_forecast("上海", days=3)

for day in forecast:
    print(f"{day['date']}: {day['condition']}, {day['temp_c']}°C")
### 示例 3:多城市对比

cities = ["北京", "上海", "广州"]
comparison = client.compare_cities(cities)

for city, weather in comparison.items():
    print(f"{city}: {weather['temp_c']}°C, {weather['condition']}")

7. 社区贡献指南

7.1 贡献方式

ClawHub 社区欢迎多种形式的贡献:

贡献类型 说明 如何开始
🐛 Bug 报告 发现并报告问题 提交 Issue
💡 功能建议 提出新功能想法 提交 Feature Request
📝 文档改进 完善文档内容 Fork → Edit → PR
🔧 代码贡献 修复 Bug 或添加功能 Fork → Branch → PR
🌍 翻译 多语言支持 加入翻译团队

7.2 贡献流程







发现技能问题/有改进想法
是否已有相关 Issue?
在现有 Issue 下评论
创建新 Issue
Fork 技能仓库
创建功能分支
编写代码/文档
运行测试
测试通过?
提交 Pull Request
代码审查
审查通过?
根据反馈修改
合并到主分支
发布新版本

7.3 Pull Request 规范

提交 PR 时应遵循以下规范:

markdown 复制代码
## PR 描述

### 变更类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 文档更新
- [ ] 性能优化
- [ ] 代码重构

### 关联 Issue
Fixes #123

### 变更说明
简要描述本次变更的内容和原因。

### 测试情况
- [ ] 已添加单元测试
- [ ] 已更新文档
- [ ] 本地测试通过

### 截图(如适用)
添加相关截图说明变更效果。

7.4 代码审查标准

ClawHub 社区对代码审查有以下标准:

审查维度 检查项 权重
功能正确性 代码是否实现预期功能 ⭐⭐⭐⭐⭐
代码质量 可读性、可维护性、代码风格 ⭐⭐⭐⭐
测试覆盖 单元测试、集成测试是否充分 ⭐⭐⭐⭐
文档完整 README、API 文档是否更新 ⭐⭐⭐
安全性 是否存在安全风险 ⭐⭐⭐⭐⭐

7.5 社区行为准则

为确保社区健康发展,所有贡献者应遵守以下准则:

✅ 应该做的:

  • 尊重不同观点和经验
  • 优雅地接受建设性批评
  • 关注对社区最有利的事情
  • 对其他社区成员表示同理心

❌ 不应该做的:

  • 使用性化的语言或图像
  • 发表侮辱性/贬损性评论
  • 进行人身攻击或政治攻击
  • 未经许可发布他人的私人信息

8. 最佳实践

8.1 技能设计原则

设计高质量技能应遵循以下原则:

原则 说明 实践方法
单一职责 每个技能专注一个领域 拆分复杂功能为多个技能
渐进增强 核心功能优先,扩展功能可选 使用可选配置项
防御性编程 预期错误并优雅处理 完善错误处理和日志
可测试性 代码易于测试 依赖注入、模块化设计

8.2 性能优化建议

性能优化
减少 API 调用
缓存策略
异步处理
资源压缩
批量请求
按需加载
内存缓存
持久化缓存
非阻塞操作
并发执行
图片压缩
代码压缩

8.3 安全性考虑

发布技能前,务必进行安全检查:

bash 复制代码
# 检查敏感信息泄露
grep -r "password\|secret\|token\|api_key" ./my-skill

# 检查依赖漏洞
npm audit
pip-audit

# 运行安全扫描
clawhub scan ./my-skill

安全检查清单:

  • 不硬编码敏感信息(API Key、密码等)
  • 使用环境变量存储敏感配置
  • 验证所有用户输入
  • 限制文件系统访问范围
  • 使用 HTTPS 进行网络请求
  • 不执行未经校验的代码

8.4 版本兼容性维护

维护技能的向后兼容性:

python 复制代码
# 推荐做法:保留旧接口,添加新接口

# 旧版本接口(标记为废弃)
def getWeather(city: str) -> dict:
    """
    获取天气信息(已废弃,请使用 get_current_weather)
    
    Deprecated: 将在 2.0 版本移除
    """
    import warnings
    warnings.warn(
        "getWeather 已废弃,请使用 get_current_weather",
        DeprecationWarning,
        stacklevel=2
    )
    return get_current_weather(city)

# 新版本接口
def get_current_weather(city: str, units: str = "metric") -> dict:
    """
    获取当前天气信息
    
    Args:
        city: 城市名称
        units: 单位制(metric/imperial)
    """
    # 新实现
    pass

8.5 持续集成建议

为技能项目配置 CI/CD 流程:

yaml 复制代码
# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Run linter
        run: npm run lint
      
      - name: Run tests
        run: npm test
      
      - name: Validate skill
        run: npx clawhub validate .
      
      - name: Security scan
        run: npm audit

8.6 发布节奏建议

发布类型 频率 说明
PATCH 版本 按需 Bug 修复,随时发布
MINOR 版本 2-4 周 新功能,充分测试后发布
MAJOR 版本 谨慎 破坏性变更,提前公告

9. 实战案例:发布一个完整技能

9.1 案例背景

假设我们要开发并发布一个「GitHub 仓库分析」技能,帮助用户快速了解 GitHub 仓库的基本信息。

9.2 技能结构

复制代码
github-analyzer/
├── SKILL.md
├── README.md
├── scripts/
│   └── analyzer.py
├── references/
│   └── api-reference.md
└── tests/
    └── test_analyzer.py

9.3 核心代码

python 复制代码
#!/usr/bin/env python3
"""
GitHub 仓库分析器

分析 GitHub 仓库的基本信息,包括星标数、贡献者、
最近活动等指标。

作者: 墨离
版本: 1.0.0
"""

import requests
from typing import Dict, List, Optional
from dataclasses import dataclass
from datetime import datetime, timedelta

@dataclass
class RepoStats:
    """仓库统计数据类"""
    name: str
    stars: int
    forks: int
    watchers: int
    open_issues: int
    language: str
    created_at: datetime
    updated_at: datetime
    contributors_count: int

class GitHubAnalyzer:
    """GitHub 仓库分析器"""
    
    API_BASE = "https://api.github.com"
    
    def __init__(self, token: Optional[str] = None):
        """
        初始化分析器
        
        Args:
            token: GitHub Personal Access Token(可选,提高速率限制)
        """
        self.session = requests.Session()
        if token:
            self.session.headers["Authorization"] = f"token {token}"
        self.session.headers["Accept"] = "application/vnd.github.v3+json"
    
    def analyze(self, owner: str, repo: str) -> RepoStats:
        """
        分析指定仓库
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
        
        Returns:
            RepoStats 对象包含仓库统计信息
        
        Raises:
            requests.HTTPError: API 请求失败
            ValueError: 仓库不存在
        """
        # 获取仓库基本信息
        repo_url = f"{self.API_BASE}/repos/{owner}/{repo}"
        response = self.session.get(repo_url, timeout=10)
        response.raise_for_status()
        repo_data = response.json()
        
        # 获取贡献者数量
        contributors_url = f"{repo_url}/contributors"
        contributors_response = self.session.get(
            contributors_url, 
            params={"per_page": 1},
            timeout=10
        )
        
        # 从 Link header 解析总数
        contributors_count = self._parse_total_count(
            contributors_response.headers.get("Link", "")
        )
        
        return RepoStats(
            name=repo_data["full_name"],
            stars=repo_data["stargazers_count"],
            forks=repo_data["forks_count"],
            watchers=repo_data["watchers_count"],
            open_issues=repo_data["open_issues_count"],
            language=repo_data["language"] or "Unknown",
            created_at=datetime.fromisoformat(
                repo_data["created_at"].replace("Z", "+00:00")
            ),
            updated_at=datetime.fromisoformat(
                repo_data["updated_at"].replace("Z", "+00:00")
            ),
            contributors_count=contributors_count
        )
    
    def _parse_total_count(self, link_header: str) -> int:
        """解析 Link header 获取总数"""
        if not link_header:
            return 0
        # 简化实现,实际应解析 Link header
        return 0
    
    def generate_report(self, stats: RepoStats) -> str:
        """
        生成分析报告
        
        Args:
            stats: 仓库统计数据
        
        Returns:
            Markdown 格式的报告字符串
        """
        days_since_update = (
            datetime.now(stats.updated_at.tzinfo) - stats.updated_at
        ).days
        
        report = f"""# GitHub 仓库分析报告

## 基本信息

| 指标 | 数值 |
|------|------|
| 仓库名称 | {stats.name} |
| 主要语言 | {stats.language} |
| ⭐ Stars | {stats.stars:,} |
| 🍴 Forks | {stats.forks:,} |
| 👀 Watchers | {stats.watchers:,} |
| 🐛 Open Issues | {stats.open_issues:,} |
| 👥 Contributors | {stats.contributors_count:,} |

## 活跃度分析

- 创建时间:{stats.created_at.strftime('%Y-%m-%d')}
- 最后更新:{stats.updated_at.strftime('%Y-%m-%d')}
- 距今天数:{days_since_update} 天

## 健康度评估

{self._assess_health(stats)}

---
*报告生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*
"""
        return report
    
    def _assess_health(self, stats: RepoStats) -> str:
        """评估仓库健康度"""
        days_since_update = (
            datetime.now(stats.updated_at.tzinfo) - stats.updated_at
        ).days
        
        if days_since_update < 30:
            health = "🟢 活跃"
        elif days_since_update < 180:
            health = "🟡 一般"
        else:
            health = "🔴 不活跃"
        
        return f"健康状态:{health}(基于最近更新时间判断)"

上述代码实现了一个完整的 GitHub 仓库分析器。代码采用面向对象设计,使用 dataclass 定义数据结构,使代码更加清晰。GitHubAnalyzer 类封装了与 GitHub API 的交互逻辑,包括仓库信息获取和贡献者统计。generate_report 方法生成 Markdown 格式的分析报告,便于在聊天应用中展示。错误处理方面,代码会在 API 请求失败时抛出异常,让调用方能够捕获和处理错误。

9.4 发布过程

bash 复制代码
# 1. 验证技能结构
clawhub validate ./github-analyzer

# 2. 运行测试
cd github-analyzer && python -m pytest tests/

# 3. 模拟发布
clawhub publish ./github-analyzer \
    --slug github-analyzer \
    --name "GitHub 仓库分析器" \
    --version 1.0.0 \
    --changelog "首次发布" \
    --dry-run

# 4. 正式发布
clawhub publish ./github-analyzer \
    --slug github-analyzer \
    --name "GitHub 仓库分析器" \
    --version 1.0.0 \
    --changelog "首次发布:支持仓库基本信息分析、活跃度评估、健康度报告生成"

9.5 发布后维护

bash 复制代码
# 查看下载统计
clawhub stats github-analyzer

# 查看用户反馈
clawhub issues github-analyzer

# 发布更新版本
clawhub publish ./github-analyzer \
    --slug github-analyzer \
    --name "GitHub 仓库分析器" \
    --version 1.1.0 \
    --changelog "新增:支持私有仓库分析(需配置 Token)"

10. 总结

本文系统性地介绍了 OpenClaw 技能发布与共享的完整流程,从 ClawHub 技能市场的架构设计,到技能打包规范、版本管理策略、发布流程详解,再到技能文档编写和社区贡献指南,为开发者提供了一份详尽的实践指南。

核心要点总结如下:

1. ClawHub 技能市场:作为 OpenClaw 官方的技能分发平台,ClawHub 提供了标准化的技能发现、安装和发布渠道,CLI 工具让整个流程可以在命令行中完成。

2. 技能打包规范:遵循标准的目录结构和 SKILL.md 格式,确保技能的可发现性和可维护性。元数据的准确填写是技能正确触发的关键。

3. 版本管理策略:采用语义化版本控制,通过变更日志记录每次更新的内容,让用户了解版本差异并做出升级决策。

4. 发布流程:从登录认证、技能验证、模拟发布到正式发布,分步骤的流程设计确保发布质量和可追溯性。

5. 文档编写:高质量的文档是技能成功的关键,README.md 应简洁展示技能价值,代码注释应清晰说明功能和用法。

6. 社区贡献:开放的贡献流程和明确的审查标准,让社区成员能够参与技能的改进和完善,形成良性循环。

7. 最佳实践:遵循单一职责原则、注重性能优化、确保安全性、维护版本兼容性,是开发高质量技能的关键。

通过本文的学习,读者应该能够独立完成一个技能的开发、打包、发布和维护全流程。更重要的是,理解了技能共享的价值------当一个技能被社区广泛使用和改进时,它才能发挥最大的价值。期待在 ClawHub 上看到更多优秀的技能贡献!

参考资料

相关推荐
GIS地信小匠3 小时前
(27)ArcGIS Pro 范围内汇总、汇总统计数据与交集制表:空间统计三工具全攻略
arcgis·空间分析·数据处理·国土空间规划·空间统计·gis教程·arcgls pro
AI精钢3 小时前
升级踩坑实录:OpenClaw 2026.4.9 后 GitHub Copilot 调用 Claude 全线 HTTP 400 的根因与修复
http·github·copilot·claude·github copilot·openclaw·ai 网关
TG_yunshuguoji4 小时前
腾讯云代理商:利用腾讯云智能体开发平台实现接入 OpenClaw
人工智能·云计算·腾讯云·智能体·openclaw
Slow菜鸟5 小时前
OpenClaw(八)| 完全卸载指南
openclaw
vivo互联网技术5 小时前
从 OpenClaw 看 Agent 架构设计
ai·agent·技术架构·openclaw·agent架构设计
城数派5 小时前
2014-2025年全国监测站点的逐月空气质量数据(15个指标\Excel\Shp格式)
arcgis·信息可视化·数据分析·excel
Swift社区5 小时前
OpenClaw安全:从暴露到加固的实战指南
安全·openclaw
LucaJu5 小时前
Hermes Agent爆火,聊聊与OpenClaw 到底区别在哪
agent·ai agent·智能体·openclaw·龙虾·hermes agent
本旺1 天前
【Openclaw 】完美解决 Codex 认证失败
ai·codex·openclaw·小龙虾·gpt5.4