chore(marketplace): add publish-plugin, rewrite init.sh, cleanup obsolete plugins

- Add publish-plugin: marketplace publish + Feishu bot notification
- Rewrite init.sh: SSE-first, fixed prod API, remove env selection
- Update CLAUDE.md, README.md, claude-config.yaml
- Update skills: req-plugin, req-prd-plugin, pull-request-plugin
- Delete sync-skills.sh (obsolete)
- Delete deprecated plugins: skills-ops/*, skills-projects/*, old skills-dev/req duplicates
- Regenerate marketplace.json (27 plugins)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-14 15:09:07 +10:30
parent 5878c1f852
commit dcdae8c636
79 changed files with 610 additions and 13407 deletions

121
init.sh
View File

@@ -1,32 +1,31 @@
#!/bin/bash
# ai-proj-helper 初始化脚本
# 配置 MCP 服务器 + 生成 marketplace.json
# ai-proj-helper MCP 初始化脚本
# 为用户配置 ai-proj MCP 连接
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"
MCP_BRIDGE_DIR="$SCRIPT_DIR/mcp-task-bridge"
CONFIG_FILE="$SCRIPT_DIR/claude-config.yaml"
API_BASE="https://ai.pipexerp.com/api/v1"
SSE_URL="${API_BASE}/mcp/sse"
# 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 "Usage: ./init.sh [--mode sse|stdio] [--token MCP_API_KEY]"
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 " --mode MCP connection mode: sse (remote, recommended) or stdio (local)"
echo " --token MCP API Key (aiproj_pk_xxx)"
echo ""
echo "Without arguments, runs in interactive mode."
exit 0
@@ -50,75 +49,71 @@ read_config_value() {
echo "$default"
}
CONFIG_MODE=$(read_config_value "mode" "stdio")
CONFIG_ENV=$(read_config_value "env" "prod")
CONFIG_MODE=$(read_config_value "mode" "sse")
# ── Interactive mode selection ────────────────────────────────────────
if [ -z "$MODE" ]; then
echo "┌─────────────────────────────────────┐"
echo "│ ai-proj-helper 初始化 │"
echo "│ ai-proj MCP 初始化 │"
echo "└─────────────────────────────────────┘"
echo ""
echo "MCP 连接模式:"
echo " 1) stdio - 本地进程 (需要 mcp-task-bridge)"
echo " 2) sse - 远程 SSE 连接"
echo " 1) sse - 远程 SSE 连接 (推荐,零依赖)"
echo " 2) stdio - 本地进程 (需要 Node.js + mcp-task-bridge)"
echo ""
read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "sse" ] && echo "2" || echo "1")): " mode_choice
read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "stdio" ] && echo "2" || echo "1")): " mode_choice
case "$mode_choice" in
2|sse) MODE="sse" ;;
*) MODE="stdio" ;;
2|stdio) MODE="stdio" ;;
*) MODE="sse" ;;
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 "请输入 MCP API Key:"
echo " 格式: aiproj_pk_xxxxxxxx"
echo " 获取: 登录 AI-Proj → 设置 → MCP API Keys → 创建"
echo ""
read -sp "Token: " TOKEN
read -sp "API Key: " TOKEN
echo ""
fi
if [ -z "$TOKEN" ]; then
echo "❌ Token 不能为空"
echo "❌ API Key 不能为空"
exit 1
fi
echo ""
echo "配置信息:"
echo " 模式: $MODE"
echo " 环境: $ENV ($API_BASE)"
if [ "$MODE" = "sse" ]; then
echo " SSE: $SSE_URL"
else
echo " API: $API_BASE"
fi
echo ""
# ── SSE mode ─────────────────────────────────────────────────────────
if [ "$MODE" = "sse" ]; then
mkdir -p "$(dirname "$MCP_CONFIG")"
cat > "$MCP_CONFIG" << EOF
{
"mcpServers": {
"ai-proj": {
"type": "sse",
"url": "$SSE_URL",
"headers": {
"X-API-Key": "$TOKEN"
}
}
}
}
EOF
echo "✅ 已生成 $MCP_CONFIG (SSE 模式)"
# ── stdio mode: ensure mcp-task-bridge ────────────────────────────────
if [ "$MODE" = "stdio" ]; then
elif [ "$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"
@@ -134,7 +129,6 @@ if [ "$MODE" = "stdio" ]; then
BRIDGE_ENTRY="$MCP_BRIDGE_DIR/dist/index.js"
# Generate .mcp.json for stdio mode
mkdir -p "$(dirname "$MCP_CONFIG")"
cat > "$MCP_CONFIG" << EOF
{
@@ -153,37 +147,12 @@ if [ "$MODE" = "stdio" ]; then
}
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"
echo "如需更改模式,编辑 claude-config.yaml 后重新运行 ./init.sh"