Files
ai-proj-helper/skills-workflow/skill-manager-plugin/scripts/registry.sh
John Qiu 712063071c refactor: 通用技能按类别拆分为独立目录
skills/ → skills-dev(9), skills-req(10), skills-ops(4),
skills-integration(8), skills-biz(4), skills-workflow(7)

generate-marketplace.py 改为自动扫描所有 skills-* 目录。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 11:31:58 +10:30

205 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
# registry.sh - Registry 管理工具
# 用法:
# ./registry.sh list - 列出所有技能
# ./registry.sh get <name> - 获取技能信息
# ./registry.sh add <name> <repo> - 添加技能记录
# ./registry.sh remove <name> - 移除技能记录
# ./registry.sh update <name> <field> <value> - 更新字段
set -e
SKILLS_DIR="$HOME/.claude/skills"
REGISTRY_FILE="$SKILLS_DIR/registry.yaml"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 检查 yq 是否安装
check_yq() {
if ! command -v yq &> /dev/null; then
echo -e "${RED}错误: 需要安装 yq${NC}"
echo "安装方法: brew install yq"
exit 1
fi
}
# 检查 registry 文件
check_registry() {
if [ ! -f "$REGISTRY_FILE" ]; then
echo -e "${YELLOW}Registry 不存在,正在初始化...${NC}"
"$SKILLS_DIR/skill-manager/scripts/init-registry.sh"
fi
}
# 列出所有技能
cmd_list() {
check_yq
check_registry
echo -e "${BLUE}已安装技能:${NC}"
echo "----------------------------------------"
SKILLS=$(yq e '.skills | keys | .[]' "$REGISTRY_FILE" 2>/dev/null || echo "")
if [ -z "$SKILLS" ]; then
echo "(无已安装技能)"
return
fi
printf "%-20s %-10s %-10s %s\n" "名称" "版本" "状态" "最后更新"
echo "----------------------------------------"
for skill in $SKILLS; do
VERSION=$(yq e ".skills.$skill.version // \"unknown\"" "$REGISTRY_FILE")
STATUS=$(yq e ".skills.$skill.status // \"unknown\"" "$REGISTRY_FILE")
UPDATED=$(yq e ".skills.$skill.last_updated // \"unknown\"" "$REGISTRY_FILE" | cut -d'T' -f1)
# 状态颜色
case $STATUS in
active) STATUS_COLOR="${GREEN}$STATUS${NC}" ;;
disabled) STATUS_COLOR="${YELLOW}$STATUS${NC}" ;;
error) STATUS_COLOR="${RED}$STATUS${NC}" ;;
*) STATUS_COLOR="$STATUS" ;;
esac
printf "%-20s %-10s " "$skill" "$VERSION"
echo -e "$STATUS_COLOR\t$UPDATED"
done
}
# 获取技能信息
cmd_get() {
check_yq
check_registry
local name="$1"
if [ -z "$name" ]; then
echo -e "${RED}用法: registry.sh get <name>${NC}"
exit 1
fi
local exists=$(yq e ".skills.$name // \"\"" "$REGISTRY_FILE")
if [ -z "$exists" ] || [ "$exists" == "null" ]; then
echo -e "${RED}技能不存在: $name${NC}"
exit 1
fi
echo -e "${BLUE}技能: $name${NC}"
echo "----------------------------------------"
yq e ".skills.$name" "$REGISTRY_FILE"
}
# 添加技能记录
cmd_add() {
check_yq
check_registry
local name="$1"
local repo="$2"
local version="${3:-1.0.0}"
if [ -z "$name" ] || [ -z "$repo" ]; then
echo -e "${RED}用法: registry.sh add <name> <repo> [version]${NC}"
exit 1
fi
local now=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
local local_path="$SKILLS_DIR/repos/$name"
# 添加技能记录
yq e -i ".skills.$name.repo = \"$repo\"" "$REGISTRY_FILE"
yq e -i ".skills.$name.local_path = \"$local_path\"" "$REGISTRY_FILE"
yq e -i ".skills.$name.version = \"$version\"" "$REGISTRY_FILE"
yq e -i ".skills.$name.installed_at = \"$now\"" "$REGISTRY_FILE"
yq e -i ".skills.$name.last_updated = \"$now\"" "$REGISTRY_FILE"
yq e -i ".skills.$name.status = \"active\"" "$REGISTRY_FILE"
# 更新 registry 时间
yq e -i ".updated_at = \"$now\"" "$REGISTRY_FILE"
echo -e "${GREEN}✓ 已添加技能: $name${NC}"
}
# 移除技能记录
cmd_remove() {
check_yq
check_registry
local name="$1"
if [ -z "$name" ]; then
echo -e "${RED}用法: registry.sh remove <name>${NC}"
exit 1
fi
local exists=$(yq e ".skills.$name // \"\"" "$REGISTRY_FILE")
if [ -z "$exists" ] || [ "$exists" == "null" ]; then
echo -e "${YELLOW}技能不存在: $name${NC}"
return
fi
yq e -i "del(.skills.$name)" "$REGISTRY_FILE"
yq e -i ".updated_at = \"$(date -u +"%Y-%m-%dT%H:%M:%SZ")\"" "$REGISTRY_FILE"
echo -e "${GREEN}✓ 已移除技能: $name${NC}"
}
# 更新技能字段
cmd_update() {
check_yq
check_registry
local name="$1"
local field="$2"
local value="$3"
if [ -z "$name" ] || [ -z "$field" ] || [ -z "$value" ]; then
echo -e "${RED}用法: registry.sh update <name> <field> <value>${NC}"
exit 1
fi
local exists=$(yq e ".skills.$name // \"\"" "$REGISTRY_FILE")
if [ -z "$exists" ] || [ "$exists" == "null" ]; then
echo -e "${RED}技能不存在: $name${NC}"
exit 1
fi
yq e -i ".skills.$name.$field = \"$value\"" "$REGISTRY_FILE"
yq e -i ".updated_at = \"$(date -u +"%Y-%m-%dT%H:%M:%SZ")\"" "$REGISTRY_FILE"
echo -e "${GREEN}✓ 已更新 $name.$field = $value${NC}"
}
# 主命令分发
case "${1:-list}" in
list)
cmd_list
;;
get)
cmd_get "$2"
;;
add)
cmd_add "$2" "$3" "$4"
;;
remove)
cmd_remove "$2"
;;
update)
cmd_update "$2" "$3" "$4"
;;
*)
echo "用法: registry.sh <command> [args]"
echo ""
echo "命令:"
echo " list 列出所有技能"
echo " get <name> 获取技能信息"
echo " add <name> <repo> 添加技能记录"
echo " remove <name> 移除技能记录"
echo " update <name> <f> <v> 更新字段"
;;
esac