#!/bin/bash # registry.sh - Registry 管理工具 # 用法: # ./registry.sh list - 列出所有技能 # ./registry.sh get - 获取技能信息 # ./registry.sh add - 添加技能记录 # ./registry.sh remove - 移除技能记录 # ./registry.sh update - 更新字段 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 ${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 [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 ${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 ${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 [args]" echo "" echo "命令:" echo " list 列出所有技能" echo " get 获取技能信息" echo " add 添加技能记录" echo " remove 移除技能记录" echo " update 更新字段" ;; esac