180 lines
6.0 KiB
Bash
180 lines
6.0 KiB
Bash
#!/usr/bin/env bash
|
||
# =============================================================================
|
||
# Vibe Cursor Pro — 一键初始化脚本 (PHP Hyperf + Vue 3 双栈)
|
||
# =============================================================================
|
||
# 用法: bash scripts/setup.sh
|
||
# =============================================================================
|
||
|
||
set -euo pipefail
|
||
|
||
BLUE='\033[0;34m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
RED='\033[0;31m'
|
||
NC='\033[0m'
|
||
|
||
echo ""
|
||
echo -e "${BLUE}🚀 Vibe Cursor Pro — Setup (Dual Stack)${NC}"
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
|
||
# 1. 创建日志目录
|
||
echo -e "${BLUE}📁 Creating directories...${NC}"
|
||
mkdir -p .ai-logs/{decisions,costs,sessions,errors,guard}
|
||
echo " ✅ .ai-logs/"
|
||
|
||
# 2. 确保脚本可执行
|
||
chmod +x scripts/*.sh 2>/dev/null || true
|
||
|
||
# 3. 设置 Git Hooks
|
||
if [ -d ".git" ]; then
|
||
echo -e "${BLUE}🔗 Setting up Git hooks...${NC}"
|
||
|
||
mkdir -p .husky
|
||
git config core.hooksPath .husky
|
||
|
||
# Pre-commit hook
|
||
cat > .husky/pre-commit << 'EOF'
|
||
#!/usr/bin/env bash
|
||
bash scripts/ai-guard.sh --pre
|
||
EOF
|
||
chmod +x .husky/pre-commit
|
||
|
||
# Commit-msg hook (Conventional Commits)
|
||
cat > .husky/commit-msg << 'EOF'
|
||
#!/usr/bin/env bash
|
||
commit_regex='^(feat|fix|refactor|test|docs|chore|style|perf|ci|build|revert)(\(.+\))?: .{1,100}'
|
||
if ! grep -qE "$commit_regex" "$1"; then
|
||
echo "❌ Invalid commit message format!"
|
||
echo " Expected: type(scope): description"
|
||
echo " Example: feat(auth): add OAuth login"
|
||
exit 1
|
||
fi
|
||
EOF
|
||
chmod +x .husky/commit-msg
|
||
|
||
echo " ✅ Git hooks installed (.husky, core.hooksPath set)"
|
||
else
|
||
echo -e "${YELLOW}⚠️ Not a git repository, skipping hooks${NC}"
|
||
fi
|
||
|
||
# 4. 验证 Skills
|
||
echo -e "${BLUE}🧠 Validating Agent Skills...${NC}"
|
||
if [ -d ".cursor/skills" ]; then
|
||
SKILL_COUNT=0
|
||
for skill_dir in .cursor/skills/*/; do
|
||
[ -d "$skill_dir" ] && [ -f "$skill_dir/SKILL.md" ] && ((SKILL_COUNT++))
|
||
done
|
||
echo " ✅ $SKILL_COUNT skills found"
|
||
|
||
find .cursor/skills -name "*.sh" -exec chmod +x {} \; 2>/dev/null || true
|
||
else
|
||
echo -e "${YELLOW} ⚠️ No skills directory — creating .cursor/skills/${NC}"
|
||
mkdir -p .cursor/skills
|
||
fi
|
||
|
||
# 5. 检测前端环境
|
||
echo -e "${BLUE}🌐 Checking frontend environment...${NC}"
|
||
if command -v node &> /dev/null; then
|
||
NODE_VER=$(node --version)
|
||
echo -e "${GREEN} ✅ Node.js ${NODE_VER} detected${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ Node.js not found — frontend needs Node.js 20+${NC}"
|
||
fi
|
||
|
||
if command -v npm &> /dev/null; then
|
||
NPM_VER=$(npm --version)
|
||
echo -e "${GREEN} ✅ npm ${NPM_VER} detected${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ npm not found${NC}"
|
||
fi
|
||
|
||
# 6. 检测后端环境
|
||
echo -e "${BLUE}🐘 Checking backend environment...${NC}"
|
||
if command -v php &> /dev/null; then
|
||
PHP_VER=$(php -r 'echo PHP_VERSION;')
|
||
echo -e "${GREEN} ✅ PHP ${PHP_VER} detected${NC}"
|
||
|
||
# Check minimum version
|
||
PHP_MAJOR=$(echo "$PHP_VER" | cut -d. -f1)
|
||
PHP_MINOR=$(echo "$PHP_VER" | cut -d. -f2)
|
||
if [ "$PHP_MAJOR" -lt 8 ] || ([ "$PHP_MAJOR" -eq 8 ] && [ "$PHP_MINOR" -lt 1 ]); then
|
||
echo -e "${RED} ❌ PHP >= 8.1 required, found ${PHP_VER}${NC}"
|
||
fi
|
||
else
|
||
echo -e "${YELLOW} ⚠️ PHP not found — backend needs PHP >= 8.1${NC}"
|
||
fi
|
||
|
||
if command -v composer &> /dev/null; then
|
||
COMPOSER_VER=$(composer --version 2>/dev/null | head -1)
|
||
echo -e "${GREEN} ✅ ${COMPOSER_VER}${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ Composer not found — install from https://getcomposer.org${NC}"
|
||
fi
|
||
|
||
# Check Swoole extension
|
||
if php -m 2>/dev/null | grep -qi swoole; then
|
||
SWOOLE_VER=$(php -r 'echo swoole_version();' 2>/dev/null || echo 'unknown')
|
||
echo -e "${GREEN} ✅ Swoole ${SWOOLE_VER} detected${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ Swoole extension not found — install via: pecl install swoole${NC}"
|
||
fi
|
||
|
||
# 7. 检测 Docker 环境
|
||
echo -e "${BLUE}🐳 Checking Docker environment...${NC}"
|
||
if command -v docker &> /dev/null; then
|
||
DOCKER_VER=$(docker --version 2>/dev/null | head -1)
|
||
echo -e "${GREEN} ✅ ${DOCKER_VER}${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ Docker not found (optional for local dev)${NC}"
|
||
fi
|
||
|
||
if docker compose version &> /dev/null; then
|
||
COMPOSE_VER=$(docker compose version 2>/dev/null | head -1)
|
||
echo -e "${GREEN} ✅ ${COMPOSE_VER}${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ Docker Compose not found (optional)${NC}"
|
||
fi
|
||
|
||
# 8. 安装依赖(如果目录存在)
|
||
for dir in Case-Database-Frontend-user Case-Database-Frontend-admin; do
|
||
if [ -f "$dir/package.json" ]; then
|
||
echo -e "${BLUE}📦 Installing $dir dependencies...${NC}"
|
||
(cd "$dir" && npm install) && echo " ✅ $dir dependencies installed" || echo -e "${RED} ❌ $dir install failed${NC}"
|
||
fi
|
||
done
|
||
|
||
if [ -f "Case-Database-Backend/composer.json" ]; then
|
||
echo -e "${BLUE}📦 Installing backend dependencies...${NC}"
|
||
(cd Case-Database-Backend && composer install --no-interaction) && echo " ✅ Backend dependencies installed" || echo -e "${RED} ❌ Backend install failed${NC}"
|
||
fi
|
||
|
||
# 9. 添加到 .gitignore
|
||
if [ -f ".gitignore" ]; then
|
||
for pattern in ".ai-logs/" ".env*" "!.env.example"; do
|
||
if ! grep -qF "$pattern" .gitignore; then
|
||
echo "$pattern" >> .gitignore
|
||
fi
|
||
done
|
||
echo " ✅ .gitignore updated"
|
||
fi
|
||
|
||
echo ""
|
||
echo -e "${GREEN}🎉 Setup complete!${NC}"
|
||
echo ""
|
||
echo "Next steps:"
|
||
echo " 1. Edit .cursor/mcp.json — fill in your API tokens"
|
||
echo " 2. Edit docs/vision/PRD.md — describe your project"
|
||
echo " 3. Open the project in Cursor"
|
||
echo " 4. Tell Cursor: 读取 docs/vision/PRD.md,制定开发计划"
|
||
echo ""
|
||
echo "Development:"
|
||
echo " • Frontend: cd Case-Database-Frontend-user (or Case-Database-Frontend-admin) && npm run dev"
|
||
echo " • Backend: cd Case-Database-Backend && php bin/hyperf.php start"
|
||
echo " • Docker: docker compose up -d"
|
||
echo ""
|
||
echo "Skills system:"
|
||
echo " • Skills in .cursor/skills/"
|
||
echo " • Run 'bash scripts/skill-manager.sh validate' to validate skills"
|
||
echo " • Create new skills: ask Cursor \"创建新技能\""
|
||
echo ""
|