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>
This commit is contained in:
189
init.sh
Executable file
189
init.sh
Executable file
@@ -0,0 +1,189 @@
|
||||
#!/bin/bash
|
||||
# ai-proj-helper 初始化脚本
|
||||
# 配置 MCP 服务器 + 生成 marketplace.json
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
MCP_CONFIG="$HOME/.claude/.mcp.json"
|
||||
MCP_BRIDGE_DIR="$HOME/coding/qiudl/new-ai-proj/mcp-task-bridge"
|
||||
CONFIG_FILE="$SCRIPT_DIR/claude-config.yaml"
|
||||
|
||||
# Default values
|
||||
MODE=""
|
||||
ENV=""
|
||||
TOKEN=""
|
||||
|
||||
# ── Parse command line arguments ──────────────────────────────────────
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--mode) MODE="$2"; shift 2 ;;
|
||||
--env) ENV="$2"; shift 2 ;;
|
||||
--token) TOKEN="$2"; shift 2 ;;
|
||||
-h|--help)
|
||||
echo "Usage: ./init.sh [--mode stdio|sse] [--env dev|staging|prod] [--token PAT_TOKEN]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --mode MCP connection mode: stdio (local) or sse (remote)"
|
||||
echo " --env Environment: dev, staging, or prod"
|
||||
echo " --token Personal Access Token for ai-proj API"
|
||||
echo ""
|
||||
echo "Without arguments, runs in interactive mode."
|
||||
exit 0
|
||||
;;
|
||||
*) echo "Unknown option: $1"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ── Read config defaults ─────────────────────────────────────────────
|
||||
read_config_value() {
|
||||
local key="$1"
|
||||
local default="$2"
|
||||
if [ -f "$CONFIG_FILE" ]; then
|
||||
local val
|
||||
val=$(grep "^ ${key}:" "$CONFIG_FILE" 2>/dev/null | head -1 | sed 's/^[^:]*: *//' | sed 's/ *#.*//' | tr -d '"' | tr -d "'")
|
||||
if [ -n "$val" ]; then
|
||||
echo "$val"
|
||||
return
|
||||
fi
|
||||
fi
|
||||
echo "$default"
|
||||
}
|
||||
|
||||
CONFIG_MODE=$(read_config_value "mode" "stdio")
|
||||
CONFIG_ENV=$(read_config_value "env" "prod")
|
||||
|
||||
# ── Interactive mode selection ────────────────────────────────────────
|
||||
if [ -z "$MODE" ]; then
|
||||
echo "┌─────────────────────────────────────┐"
|
||||
echo "│ ai-proj-helper 初始化 │"
|
||||
echo "└─────────────────────────────────────┘"
|
||||
echo ""
|
||||
echo "MCP 连接模式:"
|
||||
echo " 1) stdio - 本地进程 (需要 mcp-task-bridge)"
|
||||
echo " 2) sse - 远程 SSE 连接"
|
||||
echo ""
|
||||
read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "sse" ] && echo "2" || echo "1")): " mode_choice
|
||||
case "$mode_choice" in
|
||||
2|sse) MODE="sse" ;;
|
||||
*) MODE="stdio" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# ── Interactive environment selection ─────────────────────────────────
|
||||
if [ -z "$ENV" ]; then
|
||||
echo ""
|
||||
echo "环境:"
|
||||
echo " 1) dev - http://localhost:8080"
|
||||
echo " 2) staging - https://ai-staging.pipexerp.com"
|
||||
echo " 3) prod - https://ai.pipexerp.com"
|
||||
echo ""
|
||||
default_num=3
|
||||
[ "$CONFIG_ENV" = "dev" ] && default_num=1
|
||||
[ "$CONFIG_ENV" = "staging" ] && default_num=2
|
||||
read -p "选择环境 [1/2/3] (default: $default_num): " env_choice
|
||||
case "$env_choice" in
|
||||
1|dev) ENV="dev" ;;
|
||||
2|staging) ENV="staging" ;;
|
||||
*) ENV="prod" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# ── Resolve API base URL ─────────────────────────────────────────────
|
||||
case "$ENV" in
|
||||
dev) API_BASE="http://localhost:8080/api/v1" ;;
|
||||
staging) API_BASE="https://ai-staging.pipexerp.com/api/v1" ;;
|
||||
prod) API_BASE="https://ai.pipexerp.com/api/v1" ;;
|
||||
esac
|
||||
|
||||
# ── Token input ───────────────────────────────────────────────────────
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo ""
|
||||
echo "请输入 AI-Proj Personal Access Token (PAT):"
|
||||
echo " 获取方式: 登录 AI-Proj → 设置 → API Tokens → 创建"
|
||||
echo ""
|
||||
read -sp "Token: " TOKEN
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo "❌ Token 不能为空"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "配置信息:"
|
||||
echo " 模式: $MODE"
|
||||
echo " 环境: $ENV ($API_BASE)"
|
||||
echo ""
|
||||
|
||||
# ── stdio mode: ensure mcp-task-bridge ────────────────────────────────
|
||||
if [ "$MODE" = "stdio" ]; then
|
||||
if [ ! -d "$MCP_BRIDGE_DIR" ]; then
|
||||
echo "📦 mcp-task-bridge 未找到,正在克隆..."
|
||||
git clone https://gitea.pipexerp.com/pipexerp/mcp-task-bridge.git "$MCP_BRIDGE_DIR"
|
||||
fi
|
||||
|
||||
if [ ! -f "$MCP_BRIDGE_DIR/dist/index.js" ]; then
|
||||
echo "🔨 构建 mcp-task-bridge..."
|
||||
cd "$MCP_BRIDGE_DIR"
|
||||
npm install
|
||||
npm run build
|
||||
cd "$SCRIPT_DIR"
|
||||
fi
|
||||
|
||||
BRIDGE_ENTRY="$MCP_BRIDGE_DIR/dist/index.js"
|
||||
|
||||
# Generate .mcp.json for stdio mode
|
||||
mkdir -p "$(dirname "$MCP_CONFIG")"
|
||||
cat > "$MCP_CONFIG" << EOF
|
||||
{
|
||||
"mcpServers": {
|
||||
"ai-proj": {
|
||||
"command": "node",
|
||||
"args": ["$BRIDGE_ENTRY"],
|
||||
"env": {
|
||||
"NODE_ENV": "production",
|
||||
"TASK_API_BASE": "$API_BASE",
|
||||
"TASK_API_TOKEN": "$TOKEN",
|
||||
"MCP_SERVER_NAME": "ai-proj"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
echo "✅ 已生成 $MCP_CONFIG (stdio 模式)"
|
||||
|
||||
elif [ "$MODE" = "sse" ]; then
|
||||
# Generate .mcp.json for SSE mode
|
||||
SSE_URL="${API_BASE%/api/v1}/mcp/sse"
|
||||
mkdir -p "$(dirname "$MCP_CONFIG")"
|
||||
cat > "$MCP_CONFIG" << EOF
|
||||
{
|
||||
"mcpServers": {
|
||||
"ai-proj": {
|
||||
"type": "sse",
|
||||
"url": "$SSE_URL",
|
||||
"headers": {
|
||||
"Authorization": "Bearer $TOKEN"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
echo "✅ 已生成 $MCP_CONFIG (SSE 模式)"
|
||||
fi
|
||||
|
||||
# ── Generate marketplace.json ─────────────────────────────────────────
|
||||
echo ""
|
||||
echo "🔄 生成 marketplace.json..."
|
||||
cd "$SCRIPT_DIR"
|
||||
python3 generate-marketplace.py
|
||||
|
||||
echo ""
|
||||
echo "┌─────────────────────────────────────┐"
|
||||
echo "│ ✅ 初始化完成! │"
|
||||
echo "└─────────────────────────────────────┘"
|
||||
echo ""
|
||||
echo "下次启动 Claude Code 即可使用 MCP 工具。"
|
||||
echo "如需更新技能配置,编辑 claude-config.yaml 后重新运行 ./init.sh"
|
||||
Reference in New Issue
Block a user