@zhouhao4221/devflow-skills 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -235
- package/install.js +406 -116
- package/package.json +2 -1
- package/plugins/api/skills/api/SKILL.md +102 -0
- package/plugins/api/skills/api-field-mapper/SKILL.md +95 -0
- package/plugins/api/skills/config/SKILL.md +140 -0
- package/plugins/api/skills/gen/SKILL.md +345 -0
- package/plugins/api/skills/help/SKILL.md +121 -0
- package/plugins/api/skills/import/SKILL.md +95 -0
- package/plugins/api/skills/map/SKILL.md +152 -0
- package/plugins/api/skills/search/SKILL.md +95 -0
- package/plugins/diag/skills/audit/SKILL.md +103 -0
- package/plugins/diag/skills/diag/SKILL.md +41 -0
- package/plugins/diag/skills/diagnose/SKILL.md +167 -0
- package/plugins/diag/skills/init/SKILL.md +142 -0
- package/plugins/diag/skills/stack-analyzer/SKILL.md +150 -0
- package/plugins/pm/skills/ask/SKILL.md +89 -0
- package/plugins/pm/skills/brief/SKILL.md +95 -0
- package/plugins/pm/skills/export/SKILL.md +93 -0
- package/plugins/pm/skills/help/SKILL.md +257 -0
- package/plugins/pm/skills/milestone/SKILL.md +102 -0
- package/plugins/pm/skills/monthly/SKILL.md +111 -0
- package/plugins/pm/skills/plan/SKILL.md +96 -0
- package/plugins/pm/skills/pm/SKILL.md +174 -0
- package/plugins/pm/skills/progress/SKILL.md +113 -0
- package/plugins/pm/skills/report-generator/SKILL.md +104 -0
- package/plugins/pm/skills/risk/SKILL.md +223 -0
- package/plugins/pm/skills/standup/SKILL.md +96 -0
- package/plugins/pm/skills/stats/SKILL.md +158 -0
- package/plugins/pm/skills/weekly/SKILL.md +157 -0
- package/plugins/req/skills/branch/SKILL.md +447 -0
- package/plugins/req/skills/cache/SKILL.md +232 -0
- package/plugins/req/skills/changelog/SKILL.md +187 -0
- package/plugins/req/skills/changelog-generator/SKILL.md +106 -0
- package/plugins/req/skills/code-impact-analyzer/SKILL.md +48 -0
- package/plugins/req/skills/commit/SKILL.md +308 -0
- package/plugins/req/skills/dev/SKILL.md +229 -0
- package/plugins/req/skills/dev-guide/SKILL.md +530 -0
- package/plugins/req/skills/do/SKILL.md +191 -0
- package/plugins/req/skills/done/SKILL.md +95 -0
- package/plugins/req/skills/edit/SKILL.md +187 -0
- package/plugins/req/skills/fix/SKILL.md +300 -0
- package/plugins/req/skills/help/SKILL.md +136 -0
- package/plugins/req/skills/init/SKILL.md +505 -0
- package/plugins/req/skills/issue/SKILL.md +237 -0
- package/plugins/req/skills/issue-guide/SKILL.md +125 -0
- package/plugins/req/skills/migrate/SKILL.md +128 -0
- package/plugins/req/skills/modules/SKILL.md +195 -0
- package/plugins/req/skills/natural-language-dispatcher/SKILL.md +545 -0
- package/plugins/req/skills/new/SKILL.md +172 -0
- package/plugins/req/skills/new-quick/SKILL.md +246 -0
- package/plugins/req/skills/pr/SKILL.md +157 -0
- package/plugins/req/skills/prd/SKILL.md +187 -0
- package/plugins/req/skills/prd-analyzer/SKILL.md +131 -0
- package/plugins/req/skills/prd-edit/SKILL.md +201 -0
- package/plugins/req/skills/projects/SKILL.md +115 -0
- package/plugins/req/skills/quick-fix-guide/SKILL.md +51 -0
- package/plugins/req/skills/release/SKILL.md +300 -0
- package/plugins/req/skills/release-rationale/SKILL.md +213 -0
- package/plugins/req/skills/req/SKILL.md +173 -0
- package/plugins/req/skills/requirement-analyzer/SKILL.md +274 -0
- package/plugins/req/skills/review/SKILL.md +201 -0
- package/plugins/req/skills/review-pr/SKILL.md +699 -0
- package/plugins/req/skills/show/SKILL.md +302 -0
- package/plugins/req/skills/specs/SKILL.md +99 -0
- package/plugins/req/skills/split/SKILL.md +164 -0
- package/plugins/req/skills/status/SKILL.md +184 -0
- package/plugins/req/skills/test/SKILL.md +431 -0
- package/plugins/req/skills/test-guide/SKILL.md +304 -0
- package/plugins/req/skills/test_new/SKILL.md +417 -0
- package/plugins/req/skills/test_regression/SKILL.md +298 -0
- package/plugins/req/skills/update/SKILL.md +131 -0
- package/plugins/req/skills/update-template/SKILL.md +203 -0
- package/plugins/req/skills/upgrade/SKILL.md +178 -0
- package/plugins/req/skills/use/SKILL.md +158 -0
- package/plugins/req/skills/version-bumper/SKILL.md +113 -0
- package/plugins/uat/skills/bug/SKILL.md +153 -0
- package/plugins/uat/skills/init/SKILL.md +88 -0
- package/plugins/uat/skills/new/SKILL.md +131 -0
- package/plugins/uat/skills/report/SKILL.md +48 -0
- package/plugins/uat/skills/run/SKILL.md +78 -0
- package/plugins/uat/skills/uat/SKILL.md +64 -0
- package/plugins/uat/skills/uat-executor/SKILL.md +299 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-field-mapper
|
|
3
|
+
description: API 字段映射助手。编辑前端 TypeScript/Vue 文件时自动关联 Swagger 接口定义,提示字段映射关系。
|
|
4
|
+
metadata:
|
|
5
|
+
filePattern:
|
|
6
|
+
- "src/**/*.ts"
|
|
7
|
+
- "src/**/*.tsx"
|
|
8
|
+
- "src/**/*.vue"
|
|
9
|
+
bashPattern: []
|
|
10
|
+
priority: 30
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# API 字段映射助手
|
|
14
|
+
|
|
15
|
+
当编辑前端文件时,自动检测是否涉及 API 调用,并关联 Swagger 接口定义提供字段映射辅助。
|
|
16
|
+
|
|
17
|
+
## 触发条件
|
|
18
|
+
|
|
19
|
+
编辑以下类型文件时触发:
|
|
20
|
+
- `src/**/*.ts` — TypeScript 文件
|
|
21
|
+
- `src/**/*.tsx` — React 组件
|
|
22
|
+
- `src/**/*.vue` — Vue 组件
|
|
23
|
+
|
|
24
|
+
## 工作流程
|
|
25
|
+
|
|
26
|
+
### 1. 检测 API 调用
|
|
27
|
+
|
|
28
|
+
读取当前编辑的文件,检测是否包含 API 调用特征:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
检测模式:
|
|
32
|
+
- import ... from '@/api/...'
|
|
33
|
+
- import ... from '@/services/...'
|
|
34
|
+
- request.get/post/put/delete(...)
|
|
35
|
+
- axios.get/post/put/delete(...)
|
|
36
|
+
- fetch('/api/...')
|
|
37
|
+
- useSWR('/api/...')
|
|
38
|
+
- useQuery(...'/api/...')
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 2. 提取接口路径
|
|
42
|
+
|
|
43
|
+
从检测到的 API 调用中提取路径:
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// 能识别的模式
|
|
47
|
+
request.get<UserDetail>('/api/v1/users/' + id) → GET /api/v1/users/{id}
|
|
48
|
+
request.post('/api/v1/users', data) → POST /api/v1/users
|
|
49
|
+
fetch(`/api/v1/orders/${orderId}`) → GET /api/v1/orders/{id}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. 关联 Swagger 定义
|
|
53
|
+
|
|
54
|
+
如果项目配置了 `.api-config.json`:
|
|
55
|
+
|
|
56
|
+
1. 调用 Python 脚本查询匹配的接口定义
|
|
57
|
+
2. 对比代码中使用的字段名与 Swagger 定义
|
|
58
|
+
3. 提示可能的问题
|
|
59
|
+
|
|
60
|
+
### 4. 辅助提示
|
|
61
|
+
|
|
62
|
+
当检测到以下情况时主动提示:
|
|
63
|
+
|
|
64
|
+
**字段名不匹配:**
|
|
65
|
+
```
|
|
66
|
+
💡 API 字段映射提示
|
|
67
|
+
|
|
68
|
+
文件中使用了 `username`,但接口 GET /api/v1/users/{id} 返回的是 `user_name`
|
|
69
|
+
建议使用映射后的字段名 `userName`(camelCase)
|
|
70
|
+
|
|
71
|
+
使用 /api:map GET /api/v1/users/{id} 查看完整映射
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**缺少类型定义:**
|
|
75
|
+
```
|
|
76
|
+
💡 检测到 API 调用但未找到类型定义
|
|
77
|
+
|
|
78
|
+
接口:POST /api/v1/users
|
|
79
|
+
建议:/api:gen POST /api/v1/users 生成类型和请求函数
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**字段过期(Swagger 中已删除):**
|
|
83
|
+
```
|
|
84
|
+
⚠️ 字段可能已过期
|
|
85
|
+
|
|
86
|
+
代码中使用了 `user.nickName`,但当前 Swagger 定义中未找到该字段
|
|
87
|
+
请确认接口是否已更新:/api:map GET /api/v1/users/{id}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 非侵入原则
|
|
91
|
+
|
|
92
|
+
- 仅在检测到明确的 API 调用时触发
|
|
93
|
+
- 不自动修改代码,只提供建议
|
|
94
|
+
- `.api-config.json` 不存在时静默跳过
|
|
95
|
+
- 不阻塞正常编辑操作
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: config
|
|
3
|
+
description: |
|
|
4
|
+
API 配置管理 - 初始化和管理 Swagger 数据源配置
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# API 配置管理
|
|
8
|
+
|
|
9
|
+
管理 `.api-config.json` 配置文件,包括初始化、添加/删除数据源、查看配置。
|
|
10
|
+
|
|
11
|
+
## 命令格式
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/api:config [子命令] [参数]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 子命令
|
|
18
|
+
|
|
19
|
+
| 子命令 | 说明 | 示例 |
|
|
20
|
+
|-------|------|------|
|
|
21
|
+
| `init` | 初始化配置文件 | `/api:config init` |
|
|
22
|
+
| (空) | 查看当前配置 | `/api:config` |
|
|
23
|
+
| `add` | 添加 Swagger 数据源 | `/api:config add` |
|
|
24
|
+
| `remove` | 删除数据源 | `/api:config remove 主服务` |
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
### /api:config init
|
|
29
|
+
|
|
30
|
+
1. 检查项目根目录是否已存在 `.api-config.json`
|
|
31
|
+
- **已存在** → 显示当前配置,询问是否重新初始化
|
|
32
|
+
- **不存在** → 继续初始化
|
|
33
|
+
|
|
34
|
+
2. 交互式引导收集信息:
|
|
35
|
+
- **Swagger 地址**:询问用户后端 Swagger 文档的 URL 或本地文件路径
|
|
36
|
+
- **服务名称**:给数据源命名(如「主服务」「支付服务」)
|
|
37
|
+
- **API 前缀**:可选,如 `/api/v1`
|
|
38
|
+
|
|
39
|
+
3. 自动检测项目结构确定 codegen 配置:
|
|
40
|
+
- 检查 `src/api/` 或 `src/services/` 是否存在 → 设为 `outputDir`
|
|
41
|
+
- 检查 `src/types/` 是否存在 → 设为 `typeDir`
|
|
42
|
+
- 都不存在 → 使用默认值
|
|
43
|
+
|
|
44
|
+
4. 生成 `.api-config.json` 写入项目根目录
|
|
45
|
+
|
|
46
|
+
5. 创建 `docs/api/` 文档骨架,仅当文件不存在时创建:
|
|
47
|
+
|
|
48
|
+
| 文件 | 用途 |
|
|
49
|
+
|------|------|
|
|
50
|
+
| `field-conventions.md` | 字段命名约定(驼峰/蛇形、分页格式等) |
|
|
51
|
+
| `error-codes.md` | 业务错误码清单 |
|
|
52
|
+
| `auth-pattern.md` | 鉴权方式说明 |
|
|
53
|
+
|
|
54
|
+
每个文件使用统一的 5 节骨架,节内容留空,在对接接口时与 AI 协作填写。`/api:gen` 生成代码时会自动读取这些文件保持一致性:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
# <文档标题>
|
|
58
|
+
|
|
59
|
+
> <一行用途说明>
|
|
60
|
+
|
|
61
|
+
## 什么时候用
|
|
62
|
+
|
|
63
|
+
<!-- 适用场景 + 不适合的情况 -->
|
|
64
|
+
|
|
65
|
+
## 必备输入
|
|
66
|
+
|
|
67
|
+
<!-- 生成/校验前需要确认的前置信息 -->
|
|
68
|
+
|
|
69
|
+
## 触发方式
|
|
70
|
+
|
|
71
|
+
<!-- 如何在 prompt 中引用本文档,或写入 CLAUDE.md 的推荐做法 -->
|
|
72
|
+
|
|
73
|
+
## 优质输出标准
|
|
74
|
+
|
|
75
|
+
<!-- 符合约定的输出长什么样 -->
|
|
76
|
+
|
|
77
|
+
## 常见失败模式
|
|
78
|
+
|
|
79
|
+
| 问题 | 原因 | 解决方案 |
|
|
80
|
+
|------|------|----------|
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
6. 提示用户将 `.api-config.json` 加入版本控制
|
|
84
|
+
|
|
85
|
+
### /api:config(查看配置)
|
|
86
|
+
|
|
87
|
+
读取并展示 `.api-config.json` 内容:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
API 配置
|
|
91
|
+
|
|
92
|
+
数据源:
|
|
93
|
+
1. 主服务 — http://localhost:8080/swagger/doc.json [/api/v1]
|
|
94
|
+
2. 支付服务 — ./docs/payment-swagger.json [/pay/v1]
|
|
95
|
+
|
|
96
|
+
代码生成:
|
|
97
|
+
请求函数目录:src/api
|
|
98
|
+
类型定义目录:src/types/api
|
|
99
|
+
字段命名风格:camelCase
|
|
100
|
+
|
|
101
|
+
请求库检测:axios (来自 package.json)
|
|
102
|
+
封装文件:src/utils/request.ts
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### /api:config add
|
|
106
|
+
|
|
107
|
+
交互式添加新的 Swagger 数据源:
|
|
108
|
+
|
|
109
|
+
1. 询问数据源类型(URL / 本地文件)
|
|
110
|
+
2. 收集地址/路径和服务名称
|
|
111
|
+
3. 可选:API 前缀
|
|
112
|
+
4. 验证连通性(URL 类型尝试请求,文件类型检查是否存在)
|
|
113
|
+
5. 追加到 `.api-config.json` 的 `swagger.sources` 数组
|
|
114
|
+
|
|
115
|
+
### /api:config remove <服务名>
|
|
116
|
+
|
|
117
|
+
1. 在 `swagger.sources` 中查找匹配的 `name`
|
|
118
|
+
2. 找到 → 展示即将删除的数据源信息,确认后删除
|
|
119
|
+
3. 未找到 → 列出所有可用数据源名称
|
|
120
|
+
|
|
121
|
+
## 配置文件模板
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"swagger": {
|
|
126
|
+
"sources": [
|
|
127
|
+
{
|
|
128
|
+
"name": "主服务",
|
|
129
|
+
"url": "http://localhost:8080/swagger/doc.json",
|
|
130
|
+
"prefix": "/api/v1"
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"codegen": {
|
|
135
|
+
"outputDir": "src/api",
|
|
136
|
+
"typeDir": "src/types/api",
|
|
137
|
+
"fieldCase": "camelCase"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gen
|
|
3
|
+
description: |
|
|
4
|
+
代码生成 - 根据接口定义生成 TypeScript 类型和请求函数
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 代码生成
|
|
8
|
+
|
|
9
|
+
根据 Swagger 接口定义,自动生成 TypeScript 类型定义和请求函数代码。
|
|
10
|
+
|
|
11
|
+
## 命令格式
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/api:gen <METHOD> <path> [--name=服务名] [--type-only] [--request-only] [--tag=分组名]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 参数说明
|
|
18
|
+
|
|
19
|
+
| 参数 | 必填 | 说明 |
|
|
20
|
+
|------|------|------|
|
|
21
|
+
| `METHOD` | 是 | HTTP 方法,或 `*` 表示该路径所有方法 |
|
|
22
|
+
| `path` | 是 | API 路径 |
|
|
23
|
+
| `--name` | 否 | 指定数据源 |
|
|
24
|
+
| `--type-only` | 否 | 仅生成类型定义 |
|
|
25
|
+
| `--request-only` | 否 | 仅生成请求函数 |
|
|
26
|
+
| `--tag` | 否 | 按 Tag 批量生成该分组下所有接口 |
|
|
27
|
+
|
|
28
|
+
## 执行流程
|
|
29
|
+
|
|
30
|
+
### 前置检查
|
|
31
|
+
|
|
32
|
+
1. 参考 `_common.md` 的「命令执行前置检查」
|
|
33
|
+
2. 执行请求库自动检测(参考 `_common.md`「请求库自动检测」)
|
|
34
|
+
3. 读取 `codegen.outputDir` 和 `codegen.typeDir`
|
|
35
|
+
|
|
36
|
+
### 生成流程
|
|
37
|
+
|
|
38
|
+
1. **解析接口定义**
|
|
39
|
+
|
|
40
|
+
调用 `swagger-parser.py`(`mode=detail`,传入接口路径),获取接口完整 schema。
|
|
41
|
+
|
|
42
|
+
2. **检测请求库**
|
|
43
|
+
|
|
44
|
+
按 `_common.md`「请求库自动检测」规则检测,确定代码风格。
|
|
45
|
+
|
|
46
|
+
3. **生成类型定义文件**
|
|
47
|
+
|
|
48
|
+
目标路径:`{typeDir}/{模块名}.ts`
|
|
49
|
+
|
|
50
|
+
模块名从 API 路径推断:
|
|
51
|
+
- `/api/v1/users/{id}` → `user.ts`
|
|
52
|
+
- `/api/v1/orders/{id}/items` → `order.ts`
|
|
53
|
+
- 同一资源的接口类型合并到同一文件
|
|
54
|
+
|
|
55
|
+
**文件已存在时**:
|
|
56
|
+
- 读取现有文件,检查是否已有同名 interface
|
|
57
|
+
- 未有 → 追加到文件末尾
|
|
58
|
+
- 已有 → 进入**字段变更分析**(见步骤 3.1)
|
|
59
|
+
|
|
60
|
+
#### 3.1 字段变更分析(已有同名 interface 时)
|
|
61
|
+
|
|
62
|
+
将 Swagger 最新 schema 与项目中已有的 interface 逐字段比对:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
检测到已有类型:UserDetailResponse
|
|
66
|
+
|
|
67
|
+
字段变更:
|
|
68
|
+
|
|
69
|
+
| 字段 | 变化 | 旧定义 | 新定义 |
|
|
70
|
+
|------|------|--------|--------|
|
|
71
|
+
| nickName | 新增 | — | string |
|
|
72
|
+
| avatarUrl | 类型变更 | string | string \| null |
|
|
73
|
+
| roleList[].permissions | 新增 | — | string[] |
|
|
74
|
+
| phone | 删除 | string | — |
|
|
75
|
+
|
|
76
|
+
无变化字段:id, userName, email, createdAt, isActive(省略)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**无字段变化时**:提示"类型定义无变化,跳过更新",继续步骤 4。
|
|
80
|
+
|
|
81
|
+
**有字段变化时**:更新类型定义,并进入步骤 3.2 扫描关联页面。
|
|
82
|
+
|
|
83
|
+
#### 3.2 关联页面影响分析
|
|
84
|
+
|
|
85
|
+
AI 在项目中搜索引用了该类型或该请求函数的文件,识别受影响的页面组件:
|
|
86
|
+
|
|
87
|
+
在项目中搜索引用了该类型和请求函数的文件(`.ts`、`.tsx`、`.vue`)。对每个引用文件,AI 读取代码判断其用途:
|
|
88
|
+
|
|
89
|
+
| 用途 | 判断依据 | 影响 |
|
|
90
|
+
|------|---------|------|
|
|
91
|
+
| 表单页 | 包含 `<Form>`、`<Input>`、`onSubmit`、`formData` 等 | 新增字段需要加表单项,删除字段需要移除 |
|
|
92
|
+
| 列表/表格页 | 包含 `<Table>`、`columns`、`<List>` 等 | 新增字段可能需要加列,删除字段需要移除列 |
|
|
93
|
+
| 详情页 | 包含只读展示(`<Descriptions>`、`detail.xxx`) | 新增字段可能需要展示,删除字段需要移除 |
|
|
94
|
+
| 其他 | 仅 import 类型用于逻辑处理 | 需检查是否访问了已删除字段 |
|
|
95
|
+
|
|
96
|
+
输出影响分析报告:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
关联页面影响分析:
|
|
100
|
+
|
|
101
|
+
变更字段:+2 新增, 1 类型变更, 1 删除
|
|
102
|
+
|
|
103
|
+
受影响文件(4个):
|
|
104
|
+
|
|
105
|
+
src/pages/user/UserForm.tsx(表单)
|
|
106
|
+
- nickName(新增)→ 建议添加表单项
|
|
107
|
+
- phone(删除)→ 需移除表单项和校验规则
|
|
108
|
+
|
|
109
|
+
src/pages/user/UserList.tsx(列表)
|
|
110
|
+
- nickName(新增)→ 可选:添加表格列
|
|
111
|
+
- phone(删除)→ 需移除表格列定义
|
|
112
|
+
|
|
113
|
+
src/pages/user/UserDetail.tsx(详情)
|
|
114
|
+
- nickName(新增)→ 建议添加展示项
|
|
115
|
+
- avatarUrl(类型变更)→ 需处理 null 值
|
|
116
|
+
- phone(删除)→ 需移除展示项
|
|
117
|
+
|
|
118
|
+
src/hooks/useUserPermission.ts(逻辑)
|
|
119
|
+
- roleList[].permissions(新增)→ 无需改动(新字段)
|
|
120
|
+
|
|
121
|
+
是否自动生成调整方案?
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### 3.3 生成调整方案(用户确认后)
|
|
125
|
+
|
|
126
|
+
用户确认后,AI 对每个受影响文件给出具体的修改方案:
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
调整方案:
|
|
130
|
+
|
|
131
|
+
1/3 src/pages/user/UserForm.tsx
|
|
132
|
+
|
|
133
|
+
+ 添加 nickName 表单项(在 email 字段后):
|
|
134
|
+
<Form.Item label="昵称" name="nickName">
|
|
135
|
+
<Input placeholder="请输入昵称" />
|
|
136
|
+
</Form.Item>
|
|
137
|
+
|
|
138
|
+
- 移除 phone 表单项和校验规则
|
|
139
|
+
|
|
140
|
+
2/3 src/pages/user/UserList.tsx
|
|
141
|
+
|
|
142
|
+
- 移除 phone 列定义
|
|
143
|
+
(nickName 为列表非关键字段,建议暂不添加)
|
|
144
|
+
|
|
145
|
+
3/3 src/pages/user/UserDetail.tsx
|
|
146
|
+
|
|
147
|
+
+ 添加 nickName 展示项
|
|
148
|
+
~ avatarUrl 添加空值处理:{detail.avatarUrl ?? '—'}
|
|
149
|
+
- 移除 phone 展示项
|
|
150
|
+
|
|
151
|
+
是否执行调整?(可选择部分文件执行)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
用户可以:
|
|
155
|
+
- 全部执行 → AI 依次修改所有文件
|
|
156
|
+
- 选择部分执行 → 指定文件编号
|
|
157
|
+
- 仅更新类型 → 跳过页面调整,只更新 interface
|
|
158
|
+
|
|
159
|
+
4. **生成请求函数文件**
|
|
160
|
+
|
|
161
|
+
目标路径:`{outputDir}/{模块名}.ts`
|
|
162
|
+
|
|
163
|
+
同样合并同一资源到同一文件。
|
|
164
|
+
**请求函数已存在时**:检查参数和返回类型是否变更,有变更则更新。
|
|
165
|
+
|
|
166
|
+
5. **展示生成结果**
|
|
167
|
+
|
|
168
|
+
### 输出格式
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
代码生成:GET /api/v1/users/{id}
|
|
172
|
+
|
|
173
|
+
检测请求库:axios(封装文件:src/utils/request.ts)
|
|
174
|
+
|
|
175
|
+
生成文件
|
|
176
|
+
|
|
177
|
+
1. src/types/api/user.ts(类型定义)
|
|
178
|
+
2. src/api/user.ts(请求函数)
|
|
179
|
+
|
|
180
|
+
预览
|
|
181
|
+
|
|
182
|
+
// src/types/api/user.ts
|
|
183
|
+
|
|
184
|
+
/** 用户详情 - 响应类型 */
|
|
185
|
+
export interface UserDetailResponse {
|
|
186
|
+
id: number;
|
|
187
|
+
userName: string;
|
|
188
|
+
avatarUrl?: string;
|
|
189
|
+
email: string;
|
|
190
|
+
createdAt: string;
|
|
191
|
+
isActive?: boolean;
|
|
192
|
+
roleList?: {
|
|
193
|
+
roleId: number;
|
|
194
|
+
roleName: string;
|
|
195
|
+
}[];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// src/api/user.ts
|
|
199
|
+
|
|
200
|
+
import request from '@/utils/request';
|
|
201
|
+
import type { UserDetailResponse } from '@/types/api/user';
|
|
202
|
+
|
|
203
|
+
/** 获取用户详情 */
|
|
204
|
+
export function getUserDetail(id: number) {
|
|
205
|
+
return request.get<UserDetailResponse>(`/api/v1/users/${id}`);
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
确认后写入文件。
|
|
210
|
+
|
|
211
|
+
### 不同请求库的生成风格
|
|
212
|
+
|
|
213
|
+
#### 自定义封装(检测到 src/utils/request.ts 等)
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
import request from '@/utils/request';
|
|
217
|
+
|
|
218
|
+
/** 获取用户列表 */
|
|
219
|
+
export function getUserList(params?: UserListParams) {
|
|
220
|
+
return request.get<UserListResponse>('/api/v1/users', { params });
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** 创建用户 */
|
|
224
|
+
export function createUser(data: CreateUserParams) {
|
|
225
|
+
return request.post<CreateUserResponse>('/api/v1/users', data);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### axios(package.json 中有 axios)
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
import axios from 'axios';
|
|
233
|
+
|
|
234
|
+
/** 获取用户列表 */
|
|
235
|
+
export function getUserList(params?: UserListParams) {
|
|
236
|
+
return axios.get<UserListResponse>('/api/v1/users', { params });
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
#### umi-request
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
import { request } from 'umi';
|
|
244
|
+
|
|
245
|
+
/** 获取用户列表 */
|
|
246
|
+
export function getUserList(params?: UserListParams) {
|
|
247
|
+
return request<UserListResponse>('/api/v1/users', { method: 'GET', params });
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
#### 原生 fetch
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
/** 获取用户列表 */
|
|
255
|
+
export async function getUserList(params?: UserListParams): Promise<UserListResponse> {
|
|
256
|
+
const query = params ? '?' + new URLSearchParams(params as any).toString() : '';
|
|
257
|
+
const res = await fetch(`/api/v1/users${query}`);
|
|
258
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
259
|
+
return res.json();
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
#### @tanstack/react-query
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import { useQuery, useMutation } from '@tanstack/react-query';
|
|
267
|
+
|
|
268
|
+
/** 获取用户详情 */
|
|
269
|
+
export function useUserDetail(id: number) {
|
|
270
|
+
return useQuery({
|
|
271
|
+
queryKey: ['user', id],
|
|
272
|
+
queryFn: async () => {
|
|
273
|
+
const res = await fetch(`/api/v1/users/${id}`);
|
|
274
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
275
|
+
return res.json() as Promise<UserDetailResponse>;
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** 创建用户 */
|
|
281
|
+
export function useCreateUser() {
|
|
282
|
+
return useMutation({
|
|
283
|
+
mutationFn: async (data: CreateUserParams) => {
|
|
284
|
+
const res = await fetch('/api/v1/users', {
|
|
285
|
+
method: 'POST',
|
|
286
|
+
headers: { 'Content-Type': 'application/json' },
|
|
287
|
+
body: JSON.stringify(data),
|
|
288
|
+
});
|
|
289
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
290
|
+
return res.json() as Promise<CreateUserResponse>;
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
#### swr
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
import useSWR from 'swr';
|
|
300
|
+
|
|
301
|
+
const fetcher = (url: string) => fetch(url).then(res => res.json());
|
|
302
|
+
|
|
303
|
+
/** 获取用户详情 */
|
|
304
|
+
export function useUserDetail(id: number) {
|
|
305
|
+
return useSWR<UserDetailResponse>(`/api/v1/users/${id}`, fetcher);
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### 批量生成
|
|
310
|
+
|
|
311
|
+
#### 按 Tag 批量生成
|
|
312
|
+
|
|
313
|
+
```
|
|
314
|
+
/api:gen --tag=用户管理
|
|
315
|
+
|
|
316
|
+
→ 生成该 Tag 下所有接口的类型和请求函数
|
|
317
|
+
→ 合并到同一个模块文件
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### 按路径通配
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
/api:gen * /api/v1/users
|
|
324
|
+
/api:gen * /api/v1/users/{id}
|
|
325
|
+
|
|
326
|
+
→ 生成该路径下所有 HTTP 方法的代码
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### 文件合并策略
|
|
330
|
+
|
|
331
|
+
同一模块(如 user)的多个接口生成到同一文件:
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
/api:gen * /api/v1/users
|
|
335
|
+
/api:gen * /api/v1/users/{id}
|
|
336
|
+
|
|
337
|
+
→ src/types/api/user.ts 包含 UserListResponse, UserDetailResponse, CreateUserParams 等
|
|
338
|
+
→ src/api/user.ts 包含 getUserList, getUserDetail, createUser 等
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**合并规则:**
|
|
342
|
+
- 同名 interface 已存在 → 覆盖(确认后)
|
|
343
|
+
- 同名函数已存在 → 覆盖(确认后)
|
|
344
|
+
- 新增的 → 追加到文件末尾
|
|
345
|
+
- import 语句自动去重
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: help
|
|
3
|
+
description: |
|
|
4
|
+
使用教程 - 查看 API 对接插件完整使用指南
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# API 对接插件 - 使用教程
|
|
8
|
+
|
|
9
|
+
展示 API 对接插件的使用指南,支持中文 / 英文 / 韩文三语。
|
|
10
|
+
|
|
11
|
+
## 执行流程
|
|
12
|
+
|
|
13
|
+
### 1. 决定语言
|
|
14
|
+
|
|
15
|
+
按以下优先级:
|
|
16
|
+
|
|
17
|
+
1. 命令参数 `--lang=zh|en|ko`(显式覆盖)
|
|
18
|
+
2. `.claude/settings.local.json` 的 `language` 字段
|
|
19
|
+
3. 默认 `zh`
|
|
20
|
+
|
|
21
|
+
### 2. 读取教程文件
|
|
22
|
+
|
|
23
|
+
按语言选择教程文件(相对于插件目录):
|
|
24
|
+
|
|
25
|
+
| lang | 文件路径 |
|
|
26
|
+
|------|---------|
|
|
27
|
+
| `zh`(默认) | `<plugin-path>/docs/tutorial.zh.md` |
|
|
28
|
+
| `en` | `<plugin-path>/docs/tutorial.en.md` |
|
|
29
|
+
| `ko` | `<plugin-path>/docs/tutorial.ko.md` |
|
|
30
|
+
|
|
31
|
+
### 3. 决定输出范围
|
|
32
|
+
|
|
33
|
+
- 无章节参数 → 输出章节索引
|
|
34
|
+
- 有章节参数 → 按章节名或编号模糊匹配,仅输出对应章节
|
|
35
|
+
|
|
36
|
+
## 章节索引
|
|
37
|
+
|
|
38
|
+
无参数时展示对应语言的章节索引。
|
|
39
|
+
|
|
40
|
+
### 中文(zh)
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
API 对接插件 - 使用教程
|
|
44
|
+
|
|
45
|
+
章节:
|
|
46
|
+
1. 快速开始
|
|
47
|
+
2. 配置管理
|
|
48
|
+
3. 导入 Swagger
|
|
49
|
+
4. 搜索接口
|
|
50
|
+
5. 字段映射
|
|
51
|
+
6. 代码生成
|
|
52
|
+
7. 自动检测
|
|
53
|
+
8. 常见问题
|
|
54
|
+
|
|
55
|
+
输入章节编号查看详情。
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### English (en)
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
API Plugin — Tutorial
|
|
62
|
+
|
|
63
|
+
Sections:
|
|
64
|
+
1. Quick start
|
|
65
|
+
2. Configuration
|
|
66
|
+
3. Import Swagger
|
|
67
|
+
4. Search endpoints
|
|
68
|
+
5. Field mapping
|
|
69
|
+
6. Code generation
|
|
70
|
+
7. Auto-detection
|
|
71
|
+
8. FAQ
|
|
72
|
+
|
|
73
|
+
Enter a section number to view details.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 한국어 (ko)
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
API 플러그인 - 튜토리얼
|
|
80
|
+
|
|
81
|
+
섹션:
|
|
82
|
+
1. 빠른 시작
|
|
83
|
+
2. 설정 관리
|
|
84
|
+
3. Swagger 임포트
|
|
85
|
+
4. 엔드포인트 검색
|
|
86
|
+
5. 필드 매핑
|
|
87
|
+
6. 코드 생성
|
|
88
|
+
7. 자동 감지
|
|
89
|
+
8. FAQ
|
|
90
|
+
|
|
91
|
+
섹션 번호를 입력하여 상세 조회.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 命令格式
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
/api:help [章节名或编号] [--lang=zh|en|ko]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
示例:
|
|
101
|
+
- `/api:help` → 中文章节索引(或 settings.local.json 中设定的语言)
|
|
102
|
+
- `/api:help --lang=en` → English section index
|
|
103
|
+
- `/api:help 5` → 第 5 章「字段映射」
|
|
104
|
+
- `/api:help 5 --lang=ko` → 섹션 5 "필드 매핑"
|
|
105
|
+
- `/api:help search --lang=en` → English match on "Search endpoints"
|
|
106
|
+
|
|
107
|
+
## 持久化语言偏好
|
|
108
|
+
|
|
109
|
+
在 `.claude/settings.local.json` 中设置:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"language": "en"
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
后续 `/req:help`、`/api:help`、`/pm:help` 都会默认用该语言。
|
|
118
|
+
|
|
119
|
+
## 用户输入
|
|
120
|
+
|
|
121
|
+
$ARGUMENTS
|