@cloudglab/yapi-cli 0.0.8 → 0.0.9
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/CHANGELOG.md +18 -1
- package/README.md +6 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +41 -77
- package/dist/cli.js.map +1 -1
- package/dist/core/changelog.js +7 -14
- package/dist/core/changelog.js.map +1 -1
- package/dist/core/cli-output.js +7 -6
- package/dist/core/cli-output.js.map +1 -1
- package/dist/core/cli-registry.js +28 -6
- package/dist/core/cli-registry.js.map +1 -1
- package/dist/core/manifest.js +14 -4
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/output.d.ts +2 -2
- package/dist/core/output.js +12 -45
- package/dist/core/output.js.map +1 -1
- package/dist/core/tool-registry.js +5 -0
- package/dist/core/tool-registry.js.map +1 -1
- package/dist/core/update-probe.d.ts +3 -1
- package/dist/core/update-probe.js +9 -4
- package/dist/core/update-probe.js.map +1 -1
- package/dist/core/url-parser.js +10 -0
- package/dist/core/url-parser.js.map +1 -1
- package/dist/install.d.ts +9 -1
- package/dist/install.js +74 -20
- package/dist/install.js.map +1 -1
- package/dist/manifest.json +37 -1
- package/dist/services/yapi/api.d.ts +255 -79
- package/dist/services/yapi/api.js +162 -58
- package/dist/services/yapi/api.js.map +1 -1
- package/dist/services/yapi/auth.d.ts +8 -3
- package/dist/services/yapi/auth.js +10 -6
- package/dist/services/yapi/auth.js.map +1 -1
- package/dist/services/yapi/authCache.js +9 -2
- package/dist/services/yapi/authCache.js.map +1 -1
- package/dist/services/yapi/config.d.ts +6 -0
- package/dist/services/yapi/config.js +85 -8
- package/dist/services/yapi/config.js.map +1 -1
- package/dist/services/yapi/index.d.ts +3 -3
- package/dist/services/yapi/index.js +2 -3
- package/dist/services/yapi/index.js.map +1 -1
- package/dist/services/yapi/types.d.ts +38 -0
- package/dist/tools/shared.d.ts +17 -1
- package/dist/tools/shared.js +25 -6
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/yapi/docs-sync.js +3 -0
- package/dist/tools/yapi/docs-sync.js.map +1 -1
- package/dist/tools/yapi/groups.d.ts +1 -1
- package/dist/tools/yapi/groups.js +1 -1
- package/dist/tools/yapi/groups.js.map +1 -1
- package/dist/tools/yapi/register-auth.js +116 -104
- package/dist/tools/yapi/register-auth.js.map +1 -1
- package/dist/tools/yapi/register-group.js +118 -93
- package/dist/tools/yapi/register-group.js.map +1 -1
- package/dist/tools/yapi/register-interface.js +418 -238
- package/dist/tools/yapi/register-interface.js.map +1 -1
- package/dist/tools/yapi/register-mock.d.ts +2 -0
- package/dist/tools/yapi/register-mock.js +240 -0
- package/dist/tools/yapi/register-mock.js.map +1 -0
- package/dist/tools/yapi/register-project.js +344 -223
- package/dist/tools/yapi/register-project.js.map +1 -1
- package/dist/tools/yapi/register-test.js +33 -25
- package/dist/tools/yapi/register-test.js.map +1 -1
- package/dist/tools/yapi/register-util.js +444 -350
- package/dist/tools/yapi/register-util.js.map +1 -1
- package/dist/tools/yapi/register.js +3 -0
- package/dist/tools/yapi/register.js.map +1 -1
- package/dist/tools/yapi/utils.d.ts +49 -0
- package/dist/tools/yapi/utils.js +124 -2
- package/dist/tools/yapi/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +18 -5
- package/skills/yapi-cli/SKILL.md +22 -12
- package/skills/yapi-cli/reference/auth.md +34 -45
- package/skills/yapi-cli/reference/cheatsheet.md +156 -0
- package/skills/yapi-cli/reference/cli.md +39 -51
- package/skills/yapi-cli/reference/commands.md +35 -125
- package/skills/yapi-cli/reference/group.md +46 -19
- package/skills/yapi-cli/reference/index.md +32 -0
- package/skills/yapi-cli/reference/install.md +30 -6
- package/skills/yapi-cli/reference/interface.md +71 -155
- package/skills/yapi-cli/reference/mock.md +93 -0
- package/skills/yapi-cli/reference/overview.md +7 -5
- package/skills/yapi-cli/reference/project.md +67 -87
- package/skills/yapi-cli/reference/scenarios.md +184 -0
- package/skills/yapi-cli/reference/test.md +20 -17
- package/skills/yapi-cli/reference/tooling.md +89 -0
- package/dist/services/yapi/cache.d.ts +0 -27
- package/dist/services/yapi/cache.js +0 -88
- package/dist/services/yapi/cache.js.map +0 -1
|
@@ -2,96 +2,74 @@
|
|
|
2
2
|
|
|
3
3
|
## 强制判断
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- **项目成员** → 需要 `projectId`
|
|
10
|
-
- **关注项目** → 查我关注的,不需要参数
|
|
11
|
-
- **Mock 配置** → 项目级 Mock 开关和脚本
|
|
5
|
+
- 项目 → 分类 → 接口的三层结构
|
|
6
|
+
- 先 `group-list` 找 `groupId`,再 `project-create` 建项目
|
|
7
|
+
- 建项目后自动生成 `local` 环境和 `公共分类` + `公共测试集`
|
|
8
|
+
- 项目级 Mock 开关会级联影响全部接口
|
|
12
9
|
|
|
13
10
|
## 查询
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
yapi project-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
yapi project-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
yapi
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
yapi
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
### 修改成员角色
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
yapi member-change-role --projectId <id> --memberUid <uid> --role <role> --confirm true
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
`--role` 支持:`owner`、`dev`、`guest`、`developer`、`viewer`
|
|
60
|
-
|
|
61
|
-
### 关注项目
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
yapi follow
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
列出当前用户关注的项目。
|
|
68
|
-
|
|
69
|
-
## 写入
|
|
70
|
-
|
|
71
|
-
### Mock 开关
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
yapi project-mock-toggle --projectId <id> [--open true] --confirm true
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Mock 脚本
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
yapi project-mock-script --projectId <id> --script <script> --confirm true
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
设置项目级全局 Mock 脚本。脚本在沙箱中执行,可操控 `mockJson`、`httpCode`、`resHeader`、`delay`。
|
|
12
|
+
| 场景 | 命令 | 用法 | 说明 |
|
|
13
|
+
| --- | --- | --- | --- |
|
|
14
|
+
| 项目列表 | `project-list` | `yapi project-list [--groupId <id>] [--page <n>] [--limit <n>]` | 所有项目 |
|
|
15
|
+
| 项目搜索 | `project-search` | `yapi project-search --query <q> [--groupId <id>]` | 按名称搜 |
|
|
16
|
+
| 项目详情 | `project-get` | `yapi project-get --projectId <id>` | 含 mock 字段 |
|
|
17
|
+
| 项目 Token | `project-token` | `yapi project-token --projectId <id>` | 查询 token |
|
|
18
|
+
| 项目快照 | `project-snapshot` | `yapi project-snapshot --projectId <id> [--interfaceLimit 10]` | 一次拿项目、分类、接口、环境 |
|
|
19
|
+
| 项目环境 | `env` | `yapi env --projectId <id>` | 环境列表 |
|
|
20
|
+
| 项目成员 | `member` | `yapi member --projectId <id>` | 成员列表 |
|
|
21
|
+
| 关注项目 | `follow` | `yapi follow` | 关注的列表 |
|
|
22
|
+
| Swagger URL | `project-swagger-url` | `yapi project-swagger-url --url <swagger-json-url>` | 服务端从该 URL 拉取 Swagger JSON 数据 |
|
|
23
|
+
|
|
24
|
+
## 高频写入
|
|
25
|
+
|
|
26
|
+
| 场景 | 命令 | 用法 | 说明 |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| 建项目前校名 | `project-check-name` | `yapi project-check-name --name <name> --groupId <id>` | 先查重名 |
|
|
29
|
+
| 创建项目 | `project-create` | `yapi project-create --name <name> --groupId <id> [--basepath /api] [--projectType private] [--desc <desc>] [--tags a,b] [--preScript <js>] [--afterScript <js>] [--env <json>] --confirm true` | 建项目 |
|
|
30
|
+
| 更新项目 | `project-update` | `yapi project-update --projectId <id> [--name <name>] [--basepath /api] [--desc <desc>] [--icon <icon>] [--color <color>] [--tags a,b] [--preScript <js>] [--afterScript <js>] [--projectMockScript <js>] --confirm true` | 改基础信息 |
|
|
31
|
+
| 更新项目标签 | `project-tag-update` | `yapi project-tag-update --projectId <id> --tags 订单,支付 --confirm true` | 逗号分隔名称或 JSON 对象数组,覆盖标签 |
|
|
32
|
+
| 重新生成 Token | `project-token-update` | `yapi project-token-update --projectId <id> --confirm true` | 旧 Token 失效 |
|
|
33
|
+
| 关注项目 | `project-follow` | `yapi project-follow --projectId <id> --confirm true` | 加入关注 |
|
|
34
|
+
| 取消关注 | `project-unfollow` | `yapi project-unfollow --projectId <id> --confirm true` | 取消关注 |
|
|
35
|
+
| 改项目 Mock 开关 | `project-mock-toggle` | `yapi project-mock-toggle --projectId <id> [--open true] --confirm true` | 项目级 Mock |
|
|
36
|
+
| 改项目 Mock 脚本 | `project-mock-script` | `yapi project-mock-script --projectId <id> --script <script> --confirm true` | 设置项目脚本 |
|
|
37
|
+
| 加项目成员 | `project-member-add` | `yapi project-member-add --projectId <id> --uid <uid> [--role developer] --confirm true` | 加成员 |
|
|
38
|
+
| 移除项目成员 | `project-member-remove` | `yapi project-member-remove --projectId <id> --uid <uid> --confirm true` | 移除成员 |
|
|
39
|
+
| 改成员角色 | `project-member-role` | `yapi project-member-role --projectId <id> --memberUid <uid> [--role developer] --confirm true` | 默认 `developer` |
|
|
40
|
+
| 改邮件通知 | `project-member-email-notice` | `yapi project-member-email-notice --projectId <id> --uid <uid> [--emailNotice true] --confirm true` | 控制邮件通知 |
|
|
41
|
+
|
|
42
|
+
## 低频治理 / 迁移
|
|
43
|
+
|
|
44
|
+
| 场景 | 命令 | 用法 | 说明 |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| 复制项目 | `project-copy` | `yapi project-copy --projectId <id> --groupId <gid> [--name <newName>] --confirm true` | 克隆项目到新分组 |
|
|
47
|
+
| 覆盖环境配置 | `project-env-update` | `yapi project-env-update --projectId <id> --envs <json> --confirm true` | 整体覆盖环境 |
|
|
48
|
+
| 删除项目 | `project-delete` | `yapi project-delete --projectId <id> --confirm true` | 不可恢复 |
|
|
84
49
|
|
|
85
50
|
## 参数对照
|
|
86
51
|
|
|
87
52
|
| 参数名 | 类型 | 必填 | 说明 |
|
|
88
53
|
|--------|------|------|------|
|
|
89
54
|
| `projectId` | number | 大多数操作 | 项目 ID |
|
|
90
|
-
| `groupId` | number | project-list 筛选 | 分组 ID |
|
|
55
|
+
| `groupId` | number | project-copy / project-list 筛选 | 分组 ID |
|
|
91
56
|
| `page` | number | 否 | 页码(默认 1) |
|
|
92
57
|
| `limit` | number | 否 | 每页数(默认 50) |
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
58
|
+
| `name` | string | project-check-name/create/update | 项目名 |
|
|
59
|
+
| `query` | string | project-search | 搜索关键词 |
|
|
60
|
+
| `basepath` | string | create/update | 项目前缀路径 |
|
|
61
|
+
| `projectType` | string | project-create | `private` / `public` |
|
|
62
|
+
| `tags` | string | create/update/tag-update | 逗号分隔标签;tag-update 也支持 `[{"name":"x","desc":"y"}]` 格式 |
|
|
63
|
+
| `preScript` | string | create/update | 项目级前置脚本 |
|
|
64
|
+
| `afterScript` | string | create/update | 项目级后置脚本 |
|
|
65
|
+
| `projectMockScript` | string | update | 项目级全局 Mock 脚本 |
|
|
66
|
+
| `env` | JSON 字符串 | create | 环境配置数组,如 `[{"name":"prod","domain":"https://api.example.com"}]` |
|
|
67
|
+
| `uid` | number | project-member-add/remove | 成员用户 ID |
|
|
68
|
+
| `memberUid` | number | project-member-role | 成员用户 ID |
|
|
69
|
+
| `role` | string | project-member-role | 角色枚举 |
|
|
70
|
+
| `emailNotice` | string | project-member-email-notice | 是否开启邮件通知 |
|
|
71
|
+
| `envs` | string | project-env-update | 环境数组 JSON |
|
|
72
|
+
| `interfaceLimit` | number | project-snapshot | 快照带出的接口数 |
|
|
95
73
|
| `open` | boolean | mock-toggle | 是否开启 |
|
|
96
74
|
| `script` | string | mock-script | Mock 脚本内容 |
|
|
97
75
|
| `confirm` | boolean | 写操作 | 确认执行 |
|
|
@@ -101,15 +79,17 @@ yapi project-mock-script --projectId <id> --script <script> --confirm true
|
|
|
101
79
|
```bash
|
|
102
80
|
# 查项目完整信息
|
|
103
81
|
yapi project-get --projectId <id>
|
|
104
|
-
yapi env --projectId <id>
|
|
105
|
-
yapi member --projectId <id>
|
|
106
|
-
yapi interface-list --projectId <id> --limit 50
|
|
107
82
|
|
|
108
|
-
#
|
|
109
|
-
yapi
|
|
110
|
-
yapi project-mock-script --projectId <id> --script 'mockJson={code:0}' --confirm true
|
|
83
|
+
# 查项目所在分组
|
|
84
|
+
yapi group-get --id <groupId>
|
|
111
85
|
|
|
112
|
-
#
|
|
86
|
+
# 查项目环境 + 成员
|
|
87
|
+
yapi env --projectId <id>
|
|
113
88
|
yapi member --projectId <id>
|
|
114
|
-
|
|
89
|
+
|
|
90
|
+
# 创建项目 → 更新标签 → 设 Mock 脚本 → 加成员
|
|
91
|
+
yapi project-create --name '我的项目' --groupId <gid> --basepath /api --tags 订单,支付 --confirm true
|
|
92
|
+
yapi project-tag-update --projectId <pid> --tags '订单,支付,用户' --confirm true
|
|
93
|
+
yapi project-mock-script --projectId <pid> --script 'mockJson = { errcode: 0, errmsg: "success" };' --confirm true
|
|
94
|
+
yapi project-member-add --projectId <pid> --uid 42 --role developer --confirm true
|
|
115
95
|
```
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Scenarios
|
|
2
|
+
|
|
3
|
+
典型链路示范。所有写命令示例都必须带 `--confirm true` 才能真实执行;省略时返回 preview。
|
|
4
|
+
|
|
5
|
+
## 1. 首次接入新 YApi 实例
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 1. 安装 CLI + skill
|
|
9
|
+
npx -y @cloudglab/yapi-cli@latest install
|
|
10
|
+
|
|
11
|
+
# 2. 一键安装后会自动调起 init 流程;非交互场景可直接传参
|
|
12
|
+
yapi config-init --url https://yapi.example.com --username dev@x --password *** --auth-mode native
|
|
13
|
+
|
|
14
|
+
# 3. 校验登录态
|
|
15
|
+
yapi whoami
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 2. 把浏览器 URL 转成 CLI 调用
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 把 https://yapi.example.com/project/123/interface/api-456 这种 URL 解析为结构化信息
|
|
22
|
+
yapi url-parse --url 'https://yapi.example.com/project/123/interface/api-456'
|
|
23
|
+
|
|
24
|
+
# 也可以直接把 URL 作为第一个参数;CLI 会自动 dispatch
|
|
25
|
+
yapi 'https://yapi.example.com/project/123/interface/api-456'
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 3. 工作区 / 项目 / 接口 上下文三连
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 一次拿到账号 + 分组 + 项目列表
|
|
32
|
+
yapi workspace-snapshot --project-limit 10
|
|
33
|
+
|
|
34
|
+
# 进入项目后拿分类、最近接口、环境
|
|
35
|
+
yapi project-snapshot --project-id 123 --interface-limit 10
|
|
36
|
+
|
|
37
|
+
# 看具体接口的请求 / 响应 + 最近 5 条变更
|
|
38
|
+
yapi interface-snapshot --interface-id 456 --log-limit 5
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 4. 批量调整 Mock 策略
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 打开项目级 Mock
|
|
45
|
+
yapi project-mock-toggle --project-id 123 --open true --confirm true
|
|
46
|
+
|
|
47
|
+
# 设置项目级 Mock 脚本
|
|
48
|
+
yapi project-mock-script --project-id 123 --script 'mockval = { code: 0, data: { ok: true } };' --confirm true
|
|
49
|
+
|
|
50
|
+
# 给单个接口加 Mock 脚本
|
|
51
|
+
yapi interface-mock-script --interface-id 456 --script 'mockval = { code: 0, data: { id: 1 } };' --confirm true
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 5. 创建接口时保持风格一致
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 1. 先看目标分类有哪些接口,了解已有风格
|
|
58
|
+
yapi category-get --catId <id>
|
|
59
|
+
|
|
60
|
+
# 2. 创建接口时指定目标分类,CLI 自动分析风格
|
|
61
|
+
yapi interface-create \
|
|
62
|
+
--project-id <pid> \
|
|
63
|
+
--cat-id <cid> \
|
|
64
|
+
--title '订单查询-分页' \
|
|
65
|
+
--path '/api/order/list' \
|
|
66
|
+
--desc '分页查询订单,保持与分类中其他接口一致的响应结构' \
|
|
67
|
+
--confirm true
|
|
68
|
+
# CLI 会返回该分类已有接口的风格分析:
|
|
69
|
+
# - 公共路径前缀:/api/order/
|
|
70
|
+
# - 常用方法:GET
|
|
71
|
+
# - 常用请求体字段:page, size, status
|
|
72
|
+
# - 常用响应体字段:code, data, message, total
|
|
73
|
+
|
|
74
|
+
# 3. 预填 reqBody/resBody 时参考风格分析的字段
|
|
75
|
+
yapi interface-create \
|
|
76
|
+
--project-id <pid> \
|
|
77
|
+
--cat-id <cid> \
|
|
78
|
+
--title '订单详情' \
|
|
79
|
+
--path '/api/order/detail' \
|
|
80
|
+
--method GET \
|
|
81
|
+
--reqBody '{"page":1,"size":20}' \
|
|
82
|
+
--resBody '{"code":0,"data":{"id":1,"status":"paid"},"message":"success"}' \
|
|
83
|
+
--confirm true
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 6. 高级 Mock 配置
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# 列出接口现有高级 Mock 期望
|
|
90
|
+
yapi mock-expect-list --interface-id <iid>
|
|
91
|
+
|
|
92
|
+
# 添加一个 Mock 期望:匹配参数 type=1,返回特定响应
|
|
93
|
+
yapi mock-expect-save \
|
|
94
|
+
--interface-id <iid> \
|
|
95
|
+
--project-id <pid> \
|
|
96
|
+
--name '参数匹配-类型1' \
|
|
97
|
+
--params '{"type":"1"}' \
|
|
98
|
+
--resBody '{"code":0,"data":{"type":1,"name":"mock数据"}}' \
|
|
99
|
+
--code 200 \
|
|
100
|
+
--confirm true
|
|
101
|
+
|
|
102
|
+
# 设置或更新高级 Mock 脚本(沙箱 JS)
|
|
103
|
+
yapi mock-script-save \
|
|
104
|
+
--interface-id <iid> \
|
|
105
|
+
--project-id <pid> \
|
|
106
|
+
--script 'if (params.type == 1) { mockJson.errcode = 400; }' \
|
|
107
|
+
--confirm true
|
|
108
|
+
|
|
109
|
+
# 快速开关期望(不删除)
|
|
110
|
+
yapi mock-expect-toggle --case-id <objectId> --enable false --confirm true
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 7. 导入 Swagger / OpenAPI
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# 把本地 swagger 文档直接导入(content 是 JSON 字符串)
|
|
117
|
+
yapi interface-upload --project-id 123 --type swagger --content "$(cat swagger.json)" --confirm true
|
|
118
|
+
|
|
119
|
+
# 也可以走 importData(同步合并策略)
|
|
120
|
+
yapi import --project-id 123 --type swagger --content "$(cat swagger.json)" --merge normal --confirm true
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 8. 测试集合与用例
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# 创建集合
|
|
127
|
+
yapi col-create --project-id 123 --name '回归冒烟-生产' --desc 'P0 用例' --confirm true
|
|
128
|
+
|
|
129
|
+
# 批量添加用例
|
|
130
|
+
yapi case-add-list \
|
|
131
|
+
--col-id 11 \
|
|
132
|
+
--project-id 123 \
|
|
133
|
+
--case-list '[{"req_method":"GET","req_url":"/api/health"}]' \
|
|
134
|
+
--confirm true
|
|
135
|
+
|
|
136
|
+
# 运行集合脚本
|
|
137
|
+
yapi case-run --col-id 11 --confirm true
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 9. 用户与权限管理(需要管理员)
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
yapi user-list --page 1 --limit 20
|
|
144
|
+
yapi user-search --query 'dev'
|
|
145
|
+
yapi project-member-add --project-id 123 --uid 42 --role developer --confirm true
|
|
146
|
+
yapi project-member-role --project-id 123 --member-uid 42 --role viewer --confirm true
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 10. Token 静默登录(CI / 脚本场景)
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# 方式 1:环境变量
|
|
153
|
+
export YAPI_URL=https://yapi.example.com
|
|
154
|
+
export YAPI_TOKEN=eyJhbGciOiJIUzI1...
|
|
155
|
+
|
|
156
|
+
# 方式 2:CLI 参数
|
|
157
|
+
yapi login-by-token --token eyJhbGciOiJIUzI1... --confirm true
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 11. 写操作保护与 preview
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# 不带 confirm 会返回 preview(不真正写入)
|
|
164
|
+
yapi interface-delete --interface-id 456
|
|
165
|
+
# → 返回 { ok: false, preview: true, reason: "写操作缺少确认", ... }
|
|
166
|
+
|
|
167
|
+
# 加 confirm 才会真正写入
|
|
168
|
+
yapi interface-delete --interface-id 456 --confirm true
|
|
169
|
+
|
|
170
|
+
# 整体禁用写操作
|
|
171
|
+
export YAPI_DISABLE_WRITE=true
|
|
172
|
+
yapi project-delete --project-id 123
|
|
173
|
+
# → 全部写命令即使加 --confirm 也会被拒
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## 12. URL 解析 + 命令 dispatch
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# 直接传 URL:CLI 会调用 url-parse 并尝试执行对应查询命令
|
|
180
|
+
yapi 'https://yapi.example.com/project/123/interface/api-456'
|
|
181
|
+
# 等价于:
|
|
182
|
+
# yapi url-parse --url '...'
|
|
183
|
+
# yapi interface-get --interface-id 456
|
|
184
|
+
```
|
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## 强制判断
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- **HTTP 方法测试** → `test-*`
|
|
6
|
+
- **上传** → `test-single-upload` / `test-files-upload`
|
|
7
|
+
- **响应分析** → `test-http-code` / `test-raw` / `test-response`
|
|
8
|
+
- **自动测试** → `open-run-auto-test` / `open-project-interface-data`
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
- **上传测试** → 单文件或多文件上传
|
|
9
|
-
- **响应分析** → 检查状态码、原始响应、响应结构
|
|
10
|
-
- **自动测试** → 运行项目预设的自动测试
|
|
11
|
-
|
|
12
|
-
所有测试命令都接受 `--url <url>` 参数(完整 URL,不是路径),不需要 YApi 认证。
|
|
10
|
+
除自动测试外,测试命令都用完整 `--url`,且不依赖 YApi 登录。
|
|
13
11
|
|
|
14
12
|
## HTTP 方法测试
|
|
15
13
|
|
|
@@ -19,7 +17,7 @@
|
|
|
19
17
|
yapi test-get --url https://api.example.com/endpoint [--params '{"key":"value"}']
|
|
20
18
|
```
|
|
21
19
|
|
|
22
|
-
`--params`
|
|
20
|
+
`--params` 是 JSON 字符串,会转成查询参数。
|
|
23
21
|
|
|
24
22
|
### POST
|
|
25
23
|
|
|
@@ -27,7 +25,7 @@ yapi test-get --url https://api.example.com/endpoint [--params '{"key":"value"}'
|
|
|
27
25
|
yapi test-post --url https://api.example.com/endpoint [--body '{"key":"value"}']
|
|
28
26
|
```
|
|
29
27
|
|
|
30
|
-
`--body`
|
|
28
|
+
`--body` 是 JSON 字符串。
|
|
31
29
|
|
|
32
30
|
### PUT / DELETE / PATCH
|
|
33
31
|
|
|
@@ -66,7 +64,7 @@ yapi test-files-upload --url https://api.example.com/upload --filePaths /path/a
|
|
|
66
64
|
yapi test-http-code --url https://api.example.com/endpoint
|
|
67
65
|
```
|
|
68
66
|
|
|
69
|
-
|
|
67
|
+
只返回状态码。
|
|
70
68
|
|
|
71
69
|
### 原始响应
|
|
72
70
|
|
|
@@ -74,7 +72,7 @@ yapi test-http-code --url https://api.example.com/endpoint
|
|
|
74
72
|
yapi test-raw --url https://api.example.com/endpoint
|
|
75
73
|
```
|
|
76
74
|
|
|
77
|
-
|
|
75
|
+
返回原始文本。
|
|
78
76
|
|
|
79
77
|
### 响应结构
|
|
80
78
|
|
|
@@ -82,22 +80,22 @@ yapi test-raw --url https://api.example.com/endpoint
|
|
|
82
80
|
yapi test-response --url https://api.example.com/endpoint
|
|
83
81
|
```
|
|
84
82
|
|
|
85
|
-
|
|
83
|
+
返回状态码、头、体。
|
|
86
84
|
|
|
87
85
|
## 自动测试
|
|
88
86
|
|
|
89
87
|
### 运行自动测试
|
|
90
88
|
|
|
91
89
|
```bash
|
|
92
|
-
yapi run-auto-test --
|
|
90
|
+
yapi open-run-auto-test --pid <id> --colId <id> [--envParamsId <id>]
|
|
93
91
|
```
|
|
94
92
|
|
|
95
|
-
调用 YApi
|
|
93
|
+
调用 YApi 自动测试。
|
|
96
94
|
|
|
97
95
|
### 项目接口数据
|
|
98
96
|
|
|
99
97
|
```bash
|
|
100
|
-
yapi project-interface-data --projectId <id>
|
|
98
|
+
yapi open-project-interface-data --projectId <id> [--page <n>] [--limit <n>] [--keyword <q>]
|
|
101
99
|
```
|
|
102
100
|
|
|
103
101
|
查询项目接口测试数据。
|
|
@@ -111,8 +109,13 @@ yapi project-interface-data --projectId <id>
|
|
|
111
109
|
| `params` | string | get/files-upload | JSON 查询参数 |
|
|
112
110
|
| `filePath` | string | single-upload | 上传文件路径 |
|
|
113
111
|
| `filePaths` | string[] | files-upload | 多文件上传路径 |
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
112
|
+
| `pid` | number | open-run-auto-test | 项目 ID |
|
|
113
|
+
| `colId` | number | open-run-auto-test | 测试集合 ID |
|
|
114
|
+
| `envParamsId` | number | 否 | 环境参数 ID |
|
|
115
|
+
| `projectId` | number | open-project-interface-data | 项目 ID |
|
|
116
|
+
| `page` | number | 否 | 页码 |
|
|
117
|
+
| `limit` | number | 否 | 每页数量 |
|
|
118
|
+
| `keyword` | string | 否 | 关键词筛选 |
|
|
116
119
|
|
|
117
120
|
## 常见链路
|
|
118
121
|
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# 集合 / 用例 / 导入导出 / 快照
|
|
2
|
+
|
|
3
|
+
## 强制判断
|
|
4
|
+
|
|
5
|
+
- **工作区 / 链接定位** → `workspace-snapshot` / `url-parse`
|
|
6
|
+
- **测试集合** → `col-*`
|
|
7
|
+
- **测试用例** → `case-*`
|
|
8
|
+
- **导入导出 / 文档同步** → `import` / `export` / `docs-sync`
|
|
9
|
+
- **动态日志** → `log-list-by-update`
|
|
10
|
+
|
|
11
|
+
## 高频查询
|
|
12
|
+
|
|
13
|
+
| 场景 | 命令 | 用法 | 说明 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| 工作区快照 | `workspace-snapshot` | `yapi workspace-snapshot [--projectLimit 10] [--groupLimit 10] [--followLimit 10]` | 一次取账号、分组、项目、关注 |
|
|
16
|
+
| 页面 URL 解析 | `url-parse` | `yapi url-parse --url <yapi-page-url>` | 从页面反推命令 |
|
|
17
|
+
| 集合列表 | `col-list` | `yapi col-list --projectId <id>` | 查项目下测试集合 |
|
|
18
|
+
| 集合用例 | `col-cases` | `yapi col-cases --projectId <id> --colId <id>` | 查某集合下用例 |
|
|
19
|
+
| 用例详情 | `case-get` | `yapi case-get --caseId <id>` | 查单个测试用例 |
|
|
20
|
+
| 用例环境 | `case-env-list` | `yapi case-env-list --caseId <id>` | 看用例环境变量 |
|
|
21
|
+
| 变量筛选用例 | `col-case-list-by-var-params` | `yapi col-case-list-by-var-params --projectId <id> --colId <id>` | 按变量筛用例 |
|
|
22
|
+
| 动态日志 | `log-list-by-update` | `yapi log-list-by-update --apid <id> [--type interface] [--limit 20]` | 查更新日志 |
|
|
23
|
+
|
|
24
|
+
## 高频写入
|
|
25
|
+
|
|
26
|
+
| 场景 | 命令 | 用法 | 说明 |
|
|
27
|
+
| --- | --- | --- | --- |
|
|
28
|
+
| 创建集合 | `col-create` | `yapi col-create --projectId <id> --name <name> [--desc <desc>] --confirm true` | 新建集合 |
|
|
29
|
+
| 更新集合 | `col-update` | `yapi col-update --colId <id> [--name <name>] [--desc <desc>] --confirm true` | 改集合信息 |
|
|
30
|
+
| 删除集合 | `col-delete` | `yapi col-delete --colId <id> --confirm true` | 删除集合 |
|
|
31
|
+
| 调整集合排序 | `col-up-index` | `yapi col-up-index --projectId <id> --ids 1,2,3 --confirm true` | 批量调顺序 |
|
|
32
|
+
| 克隆集合用例 | `col-case-clone` | `yapi col-case-clone --projectId <id> --colId <target> --srcColId <source> --confirm true` | 从另一集合复制 |
|
|
33
|
+
| 调整用例排序 | `col-case-up-index` | `yapi col-case-up-index --colId <id> --ids 1,2,3 --confirm true` | 调整用例顺序 |
|
|
34
|
+
| 添加用例 | `case-add` | `yapi case-add --projectId <id> --colId <id> --interfaceId <id> --name <name> [--env <name>] --confirm true` | 关联已有接口的单条用例 |
|
|
35
|
+
| 批量添加用例 | `case-add-list` | `yapi case-add-list --projectId <id> --colId <id> --caseList <json> --confirm true` | 批量导入 |
|
|
36
|
+
| 更新用例 | `case-update` | `yapi case-update --caseId <id> [--caseType col] [--method POST] [--url /api/demo] --confirm true` | 改用例字段 |
|
|
37
|
+
| 删除用例 | `case-delete` | `yapi case-delete --caseId <id> --confirm true` | 删除单个用例 |
|
|
38
|
+
| 运行集合 / 用例脚本 | `case-run` | `yapi case-run --colId <id> --confirm true` | 执行脚本 |
|
|
39
|
+
|
|
40
|
+
## 低频治理 / 迁移
|
|
41
|
+
|
|
42
|
+
| 场景 | 命令 | 用法 | 说明 |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| 导入项目数据 | `import` | `yapi import --projectId <id> --type swagger --content <json> [--merge normal] --confirm true` | 支持 swagger/json/har/postman |
|
|
45
|
+
| 导出项目数据 | `export` | `yapi export --projectId <id> [--format json]` | 导出 JSON / Swagger / OpenAPI3 / HTML / Markdown |
|
|
46
|
+
| 文档同步 | `docs-sync` | `yapi docs-sync --file <p> --projectId <id> --catId <id> [--merge create|update|skip] [--watch true] --confirm true` | 从 markdown 同步到 YApi |
|
|
47
|
+
|
|
48
|
+
## 参数对照
|
|
49
|
+
|
|
50
|
+
| 参数名 | 类型 | 归属命令 | 说明 |
|
|
51
|
+
| --- | --- | --- | --- |
|
|
52
|
+
| `projectId` | number | col/import/export | 项目 ID |
|
|
53
|
+
| `colId` | number | col/case | 集合 ID |
|
|
54
|
+
| `srcColId` | number | col-case-clone | 源集合 ID |
|
|
55
|
+
| `caseId` | number | case-get/update/delete/env-list | 用例 ID |
|
|
56
|
+
| `interfaceId` | number | case-add | 关联接口 ID |
|
|
57
|
+
| `name` | string | case-create/add | 用例名称 |
|
|
58
|
+
| `env` | string | case-add | 用例环境名 |
|
|
59
|
+
| `ids` | string | col-up-index / col-case-up-index | 逗号分隔 ID 列表 |
|
|
60
|
+
| `caseList` | string | case-add-list | 用例数组 JSON |
|
|
61
|
+
| `format` | string | export | 导出格式:json / swagger / openapi3 / html / markdown |
|
|
62
|
+
| `type` | string | import/log-list-by-update | 导入类型或日志类型 |
|
|
63
|
+
| `content` | string | import | 导入内容 |
|
|
64
|
+
| `merge` | string | import/docs-sync | 合并策略 |
|
|
65
|
+
| `apid` | number | log-list-by-update | 接口 ID |
|
|
66
|
+
| `url` | string | url-parse | YApi 页面 URL |
|
|
67
|
+
| `projectLimit` | number | workspace-snapshot | 项目快照上限 |
|
|
68
|
+
| `groupLimit` | number | workspace-snapshot | 分组快照上限 |
|
|
69
|
+
| `followLimit` | number | workspace-snapshot | 关注项目快照上限 |
|
|
70
|
+
| `confirm` | boolean | 写操作 | 确认执行 |
|
|
71
|
+
|
|
72
|
+
## 常见链路
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 从页面 URL 反推命令,再取工作区快照
|
|
76
|
+
yapi url-parse --url <yapi-page-url>
|
|
77
|
+
yapi workspace-snapshot --projectLimit 10
|
|
78
|
+
|
|
79
|
+
# 新建集合 -> 加用例 -> 运行
|
|
80
|
+
yapi col-create --projectId <id> --name <name> --confirm true
|
|
81
|
+
yapi case-add --projectId <pid> --colId <colId> --interfaceId <iid> --name '健康检查' --confirm true
|
|
82
|
+
yapi case-run --colId <colId> --confirm true
|
|
83
|
+
|
|
84
|
+
# 导入 / 导出 / 文档同步
|
|
85
|
+
yapi export --projectId <id> --format openapi3
|
|
86
|
+
yapi export --projectId <id> --format markdown
|
|
87
|
+
yapi import --projectId <id> --type swagger --content <json> --confirm true
|
|
88
|
+
yapi docs-sync --file ./docs/api.md --projectId <id> --catId <id> --merge update --confirm true
|
|
89
|
+
```
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 简单的 JSON 文件缓存。
|
|
3
|
-
* 缓存项目列表/接口列表等数据,减少 YApi API 请求。
|
|
4
|
-
*/
|
|
5
|
-
export declare class YApiCache {
|
|
6
|
-
private readonly cacheDir;
|
|
7
|
-
private readonly ttlMs;
|
|
8
|
-
private cache;
|
|
9
|
-
private dirty;
|
|
10
|
-
constructor(cacheDir: string, ttlMs?: number);
|
|
11
|
-
/** 获取缓存目录路径 */
|
|
12
|
-
static getCacheDir(homeDir: string): string;
|
|
13
|
-
/** 获取缓存文件路径 */
|
|
14
|
-
private get cacheFile();
|
|
15
|
-
/** 加载持久化缓存 */
|
|
16
|
-
load(): void;
|
|
17
|
-
/** 持久化缓存到磁盘 */
|
|
18
|
-
save(): void;
|
|
19
|
-
/** 获取缓存项 */
|
|
20
|
-
get<T>(key: string): T | undefined;
|
|
21
|
-
/** 设置缓存项 */
|
|
22
|
-
set(key: string, data: unknown): void;
|
|
23
|
-
/** 删除缓存项 */
|
|
24
|
-
delete(key: string): void;
|
|
25
|
-
/** 清空缓存 */
|
|
26
|
-
clear(): void;
|
|
27
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { join, dirname } from 'node:path';
|
|
3
|
-
/**
|
|
4
|
-
* 简单的 JSON 文件缓存。
|
|
5
|
-
* 缓存项目列表/接口列表等数据,减少 YApi API 请求。
|
|
6
|
-
*/
|
|
7
|
-
export class YApiCache {
|
|
8
|
-
constructor(cacheDir, ttlMs = 5 * 60 * 1000) {
|
|
9
|
-
this.cacheDir = cacheDir;
|
|
10
|
-
this.ttlMs = ttlMs;
|
|
11
|
-
this.cache = new Map();
|
|
12
|
-
this.dirty = false;
|
|
13
|
-
}
|
|
14
|
-
/** 获取缓存目录路径 */
|
|
15
|
-
static getCacheDir(homeDir) {
|
|
16
|
-
return join(homeDir, '.yapi-cache');
|
|
17
|
-
}
|
|
18
|
-
/** 获取缓存文件路径 */
|
|
19
|
-
get cacheFile() {
|
|
20
|
-
return join(this.cacheDir, 'cache.json');
|
|
21
|
-
}
|
|
22
|
-
/** 加载持久化缓存 */
|
|
23
|
-
load() {
|
|
24
|
-
try {
|
|
25
|
-
if (!existsSync(this.cacheFile))
|
|
26
|
-
return;
|
|
27
|
-
const raw = readFileSync(this.cacheFile, 'utf-8');
|
|
28
|
-
const data = JSON.parse(raw);
|
|
29
|
-
for (const [key, entry] of Object.entries(data)) {
|
|
30
|
-
this.cache.set(key, entry);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// 缓存文件损坏则忽略
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/** 持久化缓存到磁盘 */
|
|
38
|
-
save() {
|
|
39
|
-
if (!this.dirty)
|
|
40
|
-
return;
|
|
41
|
-
try {
|
|
42
|
-
const dir = dirname(this.cacheFile);
|
|
43
|
-
if (!existsSync(dir)) {
|
|
44
|
-
mkdirSync(dir, { recursive: true });
|
|
45
|
-
}
|
|
46
|
-
const data = {};
|
|
47
|
-
for (const [key, entry] of this.cache.entries()) {
|
|
48
|
-
data[key] = entry;
|
|
49
|
-
}
|
|
50
|
-
writeFileSync(this.cacheFile, JSON.stringify(data, null, 2), 'utf-8');
|
|
51
|
-
this.dirty = false;
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
// 忽略写入错误
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/** 获取缓存项 */
|
|
58
|
-
get(key) {
|
|
59
|
-
const entry = this.cache.get(key);
|
|
60
|
-
if (!entry)
|
|
61
|
-
return undefined;
|
|
62
|
-
if (Date.now() - entry.time > this.ttlMs) {
|
|
63
|
-
this.cache.delete(key);
|
|
64
|
-
this.dirty = true;
|
|
65
|
-
return undefined;
|
|
66
|
-
}
|
|
67
|
-
return entry.data;
|
|
68
|
-
}
|
|
69
|
-
/** 设置缓存项 */
|
|
70
|
-
set(key, data) {
|
|
71
|
-
this.cache.set(key, { data, time: Date.now() });
|
|
72
|
-
this.dirty = true;
|
|
73
|
-
}
|
|
74
|
-
/** 删除缓存项 */
|
|
75
|
-
delete(key) {
|
|
76
|
-
if (this.cache.delete(key)) {
|
|
77
|
-
this.dirty = true;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/** 清空缓存 */
|
|
81
|
-
clear() {
|
|
82
|
-
if (this.cache.size > 0) {
|
|
83
|
-
this.cache.clear();
|
|
84
|
-
this.dirty = true;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/services/yapi/cache.ts"],"names":[],"mappings":"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"}
|