技能提交
根据用户指令,检测环境、递增版本号并发布技能更新到 SkillHub(skillhub.cn),不可用时回退到 ClawHub。
快速导航
| 用户意图 | 执行流程 |
|---|---|
| 更新单个技能 | → 1. 环境检测 → 2. 登录检查 → 3. 版本递增 → 4. 发布 |
| 批量更新多个技能 | → 1. 环境检测 → 2. 登录检查 → 3. 扫描技能目录 → 4. 逐个递增并发布 |
| 仅查看当前版本 | → 1. 读取 _meta.json 或 SKILL.md → 2. 输出版本信息 |
AI 使用指南
场景判断
- 用户说「更新技能」「发布新版本」→ 执行单个技能更新流程
- 用户说「批量更新」「更新所有技能」→ 执行批量更新流程
- 用户说「查看版本」「当前版本」→ 仅读取并输出版本信息
核心原则
- 优先使用 skillhub:所有操作优先使用
skillhub,不可用时回退到clawhub - 路径自动修正:skillhub 可能安装在
/root/.local/bin/skillhub,需先检测并修正 PATH 环境变量 - 非交互模式:批量操作使用
--no-input或--yes参数,避免卡住 - 发布后验证:每次发布后检查返回结果,确认是否成功
操作流程
1. 环境检测
# 检测并修正 skillhub 路径
export PATH="$HOME/.local/bin:$PATH"
(command -v skillhub >/dev/null 2>&1 && skillhub --version) 2>/dev/null || \
(command -v clawhub >/dev/null 2>&1 && clawhub --cli-version) 2>/dev/null || \
echo "错误:未找到 skillhub 或 clawhub,请先安装"
2. 登录检查
export PATH="$HOME/.local/bin:$PATH"
(command -v skillhub >/dev/null 2>&1 && skillhub auth whoami) 2>/dev/null || \
clawhub whoami 2>/dev/null || \
echo "未登录"
- 未登录时引导用户执行
skillhub login或clawhub login - 登录成功后继续后续步骤
3. 读取当前版本号
从技能目录的 _meta.json 或 SKILL.md 前言(frontmatter)中读取当前版本:
# 优先从 _meta.json 读取
cat <技能目录>/_meta.json 2>/dev/null | grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+'
# 回退:从 SKILL.md frontmatter 读取
sed -n '/^---$/,/^---$/p' <技能目录>/SKILL.md | grep -o 'version:[[:space:]]*[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+'
4. 版本号递增
根据用户指定或默认策略递增版本号:
patch(默认):1.0.0→1.0.1(问题修复、文档优化)minor:1.0.0→1.1.0(新增功能,向后兼容)major:1.0.0→2.0.0(不兼容的重大变更)
# 版本递增函数
bump_version() {
local version="$1"
local bump_type="${2:-patch}"
local major minor patch
IFS='.' read -r major minor patch <<< "$version"
case "$bump_type" in
major) echo "$((major+1)).0.0" ;;
minor) echo "${major}.$((minor+1)).0" ;;
patch) echo "${major}.${minor}.$((patch+1))" ;;
esac
}
5. 生成变更日志
生成变更日志(changelog),优先使用用户提供的描述,否则使用默认格式:
# 如果用户未提供 changelog,自动生成
generate_changelog() {
local bump_type="${1:-patch}"
local timestamp=$(date '+%Y-%m-%d %H:%M')
echo "[$bump_type] 更新 - $timestamp"
}
6. 执行发布
export PATH="$HOME/.local/bin:$PATH"
技能目录="<技能目录>"
新版本号="<新版本号>"
变更说明="<变更说明>"
(command -v skillhub >/dev/null 2>&1 && skillhub publish "$技能目录" \
--version "$新版本号" \
--changelog "$变更说明") 2>/dev/null || \
clawhub publish "$技能目录" \
--slug "<技能标识>" \
--name "<技能名称>" \
--version "$新版本号" \
--tags latest \
--changelog "$变更说明"
7. 验证发布结果
# 检查发布是否成功(通过搜索技能确认新版本)
export PATH="$HOME/.local/bin:$PATH"
(command -v skillhub >/dev/null 2>&1 && skillhub search "$技能标识" --json 2>/dev/null | grep -o "\"version\":\"$新版本号\"") 2>/dev/null || \
echo "请手动验证:https://skillhub.tencent.com"
批量更新流程
当用户需要批量更新多个技能时:
export PATH="$HOME/.local/bin:$PATH"
# 1. 扫描技能目录
技能根目录="${1:-/root/skills}"
for 技能目录 in "$技能根目录"/*/; do
if [ -f "${技能目录}SKILL.md" ]; then
echo "发现技能:$技能目录"
# 2. 读取标识和当前版本
# 3. 递增版本号
# 4. 执行发布
fi
done
或使用 skillhub sync 命令:
export PATH="$HOME/.local/bin:$PATH"
(command -v skillhub >/dev/null 2>&1 && skillhub sync --all --bump patch --changelog "批量更新" --tags latest) 2>/dev/null || \
clawhub sync --all --bump patch --changelog "批量更新" --tags latest
完整更新脚本
将以下脚本保存并执行,实现单个技能的更新:
#!/bin/bash
set -e
export PATH="$HOME/.local/bin:$PATH"
# === 配置 ===
技能目录="${1:-.}" # 技能目录,默认当前目录
递增类型="${2:-patch}" # 版本递增类型:patch/minor/major
变更说明="${3:-}" # 变更说明(可选)
# === 检测命令行工具 ===
if command -v skillhub >/dev/null 2>&1; then
命令行工具="skillhub"
工具版本=$($命令行工具 --version 2>/dev/null || $命令行工具 -v 2>/dev/null)
elif command -v clawhub >/dev/null 2>&1; then
命令行工具="clawhub"
工具版本=$($命令行工具 --cli-version 2>/dev/null)
else
echo "错误:未找到 skillhub 或 clawhub"
exit 1
fi
echo "使用工具:$命令行工具 ($工具版本)"
# === 检查登录 ===
if ! $命令行工具 auth whoami >/dev/null 2>&1 && ! $命令行工具 whoami >/dev/null 2>&1; then
echo "错误:未登录,请先执行 $命令行工具 login"
exit 1
fi
echo "已登录"
# === 读取技能信息 ===
技能文件="$技能目录/SKILL.md"
if [ ! -f "$技能文件" ]; then
echo "错误:未找到 $技能文件"
exit 1
fi
# 从 SKILL.md 前言提取名称
技能名称=$(sed -n '/^---$/,/^---$/p' "$技能文件" | grep '^name:' | sed 's/^name:[[:space:]]*//')
技能标识="$技能名称"
# 读取当前版本
当前版本=$(sed -n '/^---$/,/^---$/p' "$技能文件" | grep '^version:' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || echo "")
if [ -z "$当前版本" ] && [ -f "$技能目录/_meta.json" ]; then
当前版本=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$技能目录/_meta.json" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || echo "")
fi
if [ -z "$当前版本" ]; then
echo "错误:无法读取当前版本号"
exit 1
fi
echo "当前版本:$当前版本"
# === 递增版本号 ===
IFS='.' read -r 主版本 次版本 修订版本 <<< "$当前版本"
case "$递增类型" in
major) 新版本="$((主版本+1)).0.0" ;;
minor) 新版本="${主版本}.$((次版本+1)).0" ;;
patch) 新版本="${主版本}.${次版本}.$((修订版本+1))" ;;
*) echo "错误:无效的递增类型 $递增类型"; exit 1 ;;
esac
echo "新版本:$新版本"
# === 生成变更日志 ===
if [ -z "$变更说明" ]; then
变更说明="[$递增类型] 更新 - $(date '+%Y-%m-%d %H:%M')"
fi
echo "变更日志:$变更说明"
# === 执行发布 ===
echo "正在发布..."
if [ "$命令行工具" = "skillhub" ]; then
$命令行工具 publish "$技能目录" \
--version "$新版本" \
--changelog "$变更说明"
else
$命令行工具 publish "$技能目录" \
--slug "$技能标识" \
--name "$技能名称" \
--version "$新版本" \
--tags latest \
--changelog "$变更说明"
fi
echo "发布完成:$技能名称 v$新版本"
交互示例
示例 1:更新单个技能
用户:「更新 my-skill 技能,修复了一个问题」
执行流程:
1. 检测 skillhub 是否可用
2. 检查登录状态
3. 读取 /root/skills/my-skill/SKILL.md 获取当前版本
4. 递增 patch 版本号
5. 使用变更说明「修复了一个问题」执行发布
6. 验证发布结果
示例 2:批量更新所有技能
用户:「批量更新所有技能到新版本」
执行流程:
1. 检测 skillhub 是否可用
2. 检查登录状态
3. 扫描 /root/skills/ 下所有包含 SKILL.md 的目录
4. 逐个递增 patch 版本并发布
5. 汇总发布结果
示例 3:指定版本递增类型
用户:「发布 my-skill 的 minor 版本更新,新增了搜索功能」
执行流程:
1. 检测环境、检查登录
2. 读取当前版本(如 1.2.3)
3. 递增 minor → 1.3.0
4. 使用变更说明「新增了搜索功能」发布
故障排查
| 问题 | 解决方案 |
|---|---|
| skillhub 命令未找到 | export PATH="$HOME/.local/bin:$PATH" |
| 未登录 | 执行 skillhub login 或 clawhub login |
| 版本号读取失败 | 检查 SKILL.md 前言是否包含 version: 字段 |
| 发布失败 | 检查标识是否已被占用、网络是否正常、账号是否满足发布条件 |
| 请求频率限制 | 等待 1 分钟后重试 |