Files
ai-proj-helper/skills/skill-manager-plugin/registry.sh
John Qiu 99881e268a refactor: 合并 claude-marketplace,重构目录结构为单一仓库
- 重命名 plugins/ → skills/,个人插件迁移到 skills-personal/(gitignore)
- 更新 generate-marketplace.py 支持 config 读取和 skills-personal 扫描
- 新增 claude-config.yaml(技能启用/禁用 + MCP 配置)
- 新增 init.sh(交互式 MCP 初始化,支持 stdio/SSE 模式)
- 新增 CLAUDE.md 项目说明
- 重写 README.md 反映新结构
- 删除过时脚本:PUSH.sh、generate-marketplace.sh、convert-skills.sh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 11:11:59 +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