- 重命名 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>
205 lines
5.5 KiB
Bash
Executable File
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
|