install.sh 6.65 KB
#!/bin/bash

# API Generator Skill 安装脚本
# 用于将 API Generator 功能安装到当前项目

set -e

echo "🚀 API Generator Skill 安装程序"
echo "================================"
echo ""

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 检查是否在项目根目录
if [ ! -f "package.json" ]; then
    echo -e "${RED}❌ 错误: 请在项目根目录运行此脚本${NC}"
    exit 1
fi

# 检查 package.json 中是否已有 api:generate 命令
if grep -q '"api:generate"' package.json; then
    echo -e "${YELLOW}⚠️  检测到已存在 api:generate 命令${NC}"
    read -p "是否覆盖? (y/N) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "安装已取消"
        exit 0
    fi
fi

# 创建目录结构
echo -e "${GREEN}📁 创建目录结构...${NC}"
mkdir -p .claude/custom_skills/api-generator/{scripts,templates,setup}
mkdir -p docs/openAPI
mkdir -p .tmp

# 检查必要的文件
echo -e "${GREEN}📋 检查文件...${NC}"

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 检查脚本文件
if [ ! -f "$SCRIPT_DIR/../scripts/generateApiFromOpenAPI.js" ]; then
    echo -e "${RED}❌ 缺少 generateApiFromOpenAPI.js${NC}"
    exit 1
fi

if [ ! -f "$SCRIPT_DIR/../scripts/apiDiff.js" ]; then
    echo -e "${RED}❌ 缺少 apiDiff.js${NC}"
    exit 1
fi

# 检查模板文件
if [ ! -f "$SCRIPT_DIR/../templates/openAPI-template.md" ]; then
    echo -e "${RED}❌ 缺少 openAPI-template.md${NC}"
    exit 1
fi

# 安装依赖
echo -e "${GREEN}📦 检查依赖...${NC}"

if ! command -v pnpm &> /dev/null; then
    echo -e "${YELLOW}⚠️  pnpm 未安装,尝试使用 npm...${NC}"
    PKG_MANAGER="npm"
else
    PKG_MANAGER="pnpm"
fi

# 检查 js-yaml 是否已安装
if ! $PKG_MANAGER list js-yaml &> /dev/null; then
    echo -e "${GREEN}📦 安装 js-yaml...${NC}"
    $PKG_MANAGER add -D js-yaml
else
    echo -e "${GREEN}✅ js-yaml 已安装${NC}"
fi

# 添加 npm scripts
echo -e "${GREEN}🔧 配置 npm scripts...${NC}"

# 使用 jq 或临时文件添加 scripts
if command -v jq &> /dev/null; then
    jq '.scripts."api:generate" = "node .claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.js" |
        .scripts."api:diff" = "node .claude/custom_skills/api-generator/scripts/apiDiff.js"' package.json > package.json.tmp
    mv package.json.tmp package.json
else
    # 使用 sed 添加(更兼容)
    if ! grep -q '"api:generate"' package.json; then
        # 找到 "scripts" 行并在后面插入
        sed -i '' '/"scripts":/a\
\    "api:generate": "node .claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.js",\
\    "api:diff": "node .claude/custom_skills/api-generator/scripts/apiDiff.js",
' package.json 2>/dev/null || sed -i '/"scripts":/a\
\    "api:generate": "node .claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.js",\
\    "api:diff": "node .claude/custom_skills/api-generator/scripts/apiDiff.js",
' package.json
    fi
fi

# 创建示例文档
echo -e "${GREEN}📝 创建示例文档...${NC}"
mkdir -p docs/openAPI/example
cat > docs/openAPI/example/getExample.md << 'EOF'
# 获取示例数据

## OpenAPI Specification

```yaml
openapi: 3.0.1
info:
  title: ''
  version: 1.0.0
paths:
  /srv/:
    get:
      summary: 获取示例数据
      description: 这是一个示例接口,展示如何编写 OpenAPI 文档
      tags:
        - 示例模块
      parameters:
        - name: a
          in: query
          description: action 参数
          required: false
          example: example_data
          schema:
            type: string
        - name: id
          in: query
          description: 数据ID
          required: true
          example: 123
          schema:
            type: integer
      responses:
        '200':
          description: 成功返回
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    description: 0=失败,1=成功
                  msg:
                    type: string
                    description: 错误信息
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        description: 数据ID
                      name:
                        type: string
                        description: 名称
                      created_at:
                        type: string
                        description: 创建时间
```
EOF

# 创建 README
cat > docs/openAPI/README.md << 'EOF'
# OpenAPI 文档目录

本目录用于存放 OpenAPI 规范的接口文档,这些文档将自动转换为前端 API 调用代码。

## 目录结构

```
docs/openAPI/
├── example/              # 示例模块
│   └── getExample.md     # 示例接口
├── user/                 # 用户模块(你的模块)
├── course/               # 课程模块(你的模块)
└── order/                # 订单模块(你的模块)
```

## 如何添加新接口

1. **创建模块目录**(如果不存在)
   ```bash
   mkdir -p docs/openAPI/yourModule
   ```

2. **创建接口文档**
   ```bash
   # 使用模板创建
   cp .claude/custom_skills/api-generator/templates/openAPI-template.md \
      docs/openAPI/yourModule/yourApiName.md
   ```

3. **编辑文档**
   - 按照模板填写接口信息
   - 遵循 OpenAPI 3.0.1 规范
   - 添加详细的参数说明和返回值结构

4. **生成代码**
   ```bash
   pnpm api:generate
   ```

5. **使用生成的 API**
   ```javascript
   import { yourApiNameAPI } from '@/api/yourModule'
   ```

## 命令速查

```bash
# 生成 API 代码
pnpm api:generate

# 对比 API 变更
pnpm api:diff docs/openAPI/user/ docs/openAPI/user-new/

# 查看帮助
cat .claude/custom_skills/api-generator/skill.md
```

## 注意事项

- 第一级目录名 = 模块名(会生成 `模块名.js`)
- 第二级文件名 = 接口名(会生成 `接口名API` 函数)
- 所有 `.md` 文件必须包含 YAML 代码块
- 遵循 OpenAPI 3.0.1 规范编写 YAML

## 参考文档

详细使用说明请参考:[API Generator Skill 文档](../../.claude/custom_skills/api-generator/skill.md)
EOF

# 完成
echo ""
echo -e "${GREEN}✅ 安装完成!${NC}"
echo ""
echo "📚 下一步:"
echo "  1. 查看示例文档: cat docs/openAPI/example/getExample.md"
echo "  2. 创建你的第一个接口: cp docs/openAPI/example/getExample.md docs/openAPI/yourModule/yourApi.md"
echo "  3. 生成 API 代码: pnpm api:generate"
echo ""
echo "📖 完整文档: cat .claude/custom_skills/api-generator/skill.md"
echo ""