@cloudglab/yapi-cli 0.0.5 → 0.0.8
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 +21 -0
- package/README.md +42 -2
- package/dist/cli.js +195 -23
- package/dist/cli.js.map +1 -1
- package/dist/core/cli-output.d.ts +1 -1
- package/dist/core/cli-output.js +114 -25
- package/dist/core/cli-output.js.map +1 -1
- package/dist/core/cli-registry.js +33 -2
- package/dist/core/cli-registry.js.map +1 -1
- package/dist/core/errors.js +36 -3
- package/dist/core/errors.js.map +1 -1
- package/dist/core/http-metrics.d.ts +31 -0
- package/dist/core/http-metrics.js +35 -0
- package/dist/core/http-metrics.js.map +1 -0
- package/dist/core/output.d.ts +18 -4
- package/dist/core/output.js +105 -22
- package/dist/core/output.js.map +1 -1
- package/dist/core/update-probe.d.ts +4 -1
- package/dist/core/update-probe.js +43 -2
- package/dist/core/update-probe.js.map +1 -1
- package/dist/core/url-parser.d.ts +20 -0
- package/dist/core/url-parser.js +237 -0
- package/dist/core/url-parser.js.map +1 -0
- package/dist/install.js +10 -1
- package/dist/install.js.map +1 -1
- package/dist/manifest.json +27 -2
- package/dist/services/yapi/api.d.ts +12 -1
- package/dist/services/yapi/api.js +96 -10
- package/dist/services/yapi/api.js.map +1 -1
- package/dist/tools/shared.d.ts +2 -2
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/yapi/register-auth.js +12 -12
- package/dist/tools/yapi/register-auth.js.map +1 -1
- package/dist/tools/yapi/register-group.js +16 -16
- package/dist/tools/yapi/register-group.js.map +1 -1
- package/dist/tools/yapi/register-interface.js +177 -55
- package/dist/tools/yapi/register-interface.js.map +1 -1
- package/dist/tools/yapi/register-project.js +92 -31
- package/dist/tools/yapi/register-project.js.map +1 -1
- package/dist/tools/yapi/register-test.js +11 -11
- package/dist/tools/yapi/register-test.js.map +1 -1
- package/dist/tools/yapi/register-util.js +124 -34
- package/dist/tools/yapi/register-util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/ai-cli-optimization-plan.md +412 -0
- package/package.json +1 -1
- package/skills/yapi-cli/SKILL.md +15 -0
- package/skills/yapi-cli/reference/cli.md +19 -3
- package/skills/yapi-cli/reference/commands.md +2 -1
- package/skills/yapi-cli/reference/interface.md +13 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.0.8 - 2026-06-23
|
|
4
|
+
|
|
5
|
+
- 新增 `interface-update` 部分更新命令,支持只更新接口标题、路径、方法、分类、状态、标签、描述、请求体与响应体,未传字段保持原值。
|
|
6
|
+
- 补齐 `interface-save` / `interface-update` 的 skill 文档与命令速查说明,并同步源目录与发布目录,避免文档命令与实际注册命令不一致。
|
|
7
|
+
- 修复业务写命令的通用 `--confirm true` 参数解析与写保护闸门;未确认时返回 preview,不再直接发起写请求。
|
|
8
|
+
- 修复 `optionalTrimmedText` 在帮助输出中被误标为必填的问题,`desc`、`reqBody`、`resBody` 等可选字段现在会正确显示为可选。
|
|
9
|
+
- 补充 stdout / stderr 分流说明,明确 `compact` / `normal` / `verbose` 已是合法 JSON,管道消费时不要使用 `2>&1` 污染 JSON 输出。
|
|
10
|
+
|
|
11
|
+
## 0.0.7 - 2026-06-23
|
|
12
|
+
|
|
13
|
+
- 新增 `--output compact|normal|verbose|pretty` 输出分级;`--json` 继续作为兼容别名,并修复了命令前后位置与 `pnpm dev -- ...` 场景下的全局参数解析。
|
|
14
|
+
- `help` / `list` 现在会展示命令分组、预估成本和推荐下一步,方便在终端与 AI 工作流里更快选择低成本命令。
|
|
15
|
+
- 新增 `project-snapshot`、`interface-snapshot`、`workspace-snapshot` 三个快照命令,一次聚合项目、接口和工作区上下文,减少多次查询。
|
|
16
|
+
- 新增 `url-parse`,并支持直接粘贴 YApi 页面 URL 自动解析或自动执行对应查询命令;当前已覆盖项目、接口、分类、集合、用例、分组、用户和关注页。
|
|
17
|
+
- API 请求新增短时 GET 缓存与 `requestCount` / `durationMs` / `cacheHit` 元信息;常见认证、网络、404、非 JSON 返回等错误提示也更具体。
|
|
18
|
+
|
|
19
|
+
## 0.0.6 - 2026-06-22
|
|
20
|
+
|
|
21
|
+
- `install` 与 `update` 完成后会输出 `yapi-cli` ASCII 标识,和后续的快速开始指引一起展示,便于首次安装后直接继续操作。
|
|
22
|
+
- README 同步补充安装成功后的终端效果说明,保持文档与命令行体验一致。
|
|
23
|
+
|
|
3
24
|
## 0.0.5 - 2026-06-22
|
|
4
25
|
|
|
5
26
|
- `install`、`update`、`uninstall` 的主链路改为对齐 `zentao-cli`:先处理全局 CLI,再通过 `skills add/remove` 安装或卸载 skill,不再把 skill 直接复制到 `~/.opencode/agent`。
|
package/README.md
CHANGED
|
@@ -8,22 +8,31 @@
|
|
|
8
8
|
|
|
9
9
|
## 这版补了什么
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- 新增 `compact / normal / verbose / pretty` 输出分级;`--json` 仍可用,且支持放在命令前后位置。
|
|
12
|
+
- 新增 `interface-update` 部分更新命令,可只改接口标题、路径、请求体或响应体;`interface-save` 继续用于完整 upsert。
|
|
13
|
+
- 写命令统一支持 `--confirm true`,未确认时返回 preview,不直接发起写请求。
|
|
14
|
+
- 新增 `project-snapshot`、`interface-snapshot`、`workspace-snapshot`,适合先拿上下文再细查。
|
|
15
|
+
- 新增 URL 解析能力:既可以显式执行 `yapi url-parse --url ...`,也可以直接把 YApi 页面 URL 贴给 CLI 自动解析并查询。
|
|
12
16
|
- 新增内置命令:`doctor`、`changelog`、`completion`,补齐安装 / 更新 / 卸载 / 版本查看链路。
|
|
13
17
|
- 配置文件按 `url/username/password/authMode` 收敛;`install` / `config-init` 现在统一走配置校验流程:交互终端会逐步提示填写,非交互环境会明确要求显式传参,token 只保存在认证缓存里。
|
|
14
18
|
- 普通账号 `native` 登录现在兼容两种后端形态:直接明文校验,以及先经 RSA 公钥加密再提交 `/api/user/login`。
|
|
15
19
|
- `install` / `update` / `uninstall` 的安装链路已对齐 `zentao-cli`:优先安装全局 CLI,再通过 `skills add/remove` 管理 skill,并在必要时自动清理旧的全局 bin 与 npm 残留。
|
|
20
|
+
- `install` / `update` 完成后会打印 ASCII 标识和快速开始提示,首次装好后能直接看到下一步命令。
|
|
16
21
|
- 命令层统一使用 `InMemoryCliRegistry + Zod schema + jsonResult`,便于 Agent 稳定调用。
|
|
17
22
|
- 共享了分页、项目 ID、可选文本、布尔值和导出格式等 Zod 片段,减少重复定义。
|
|
18
23
|
- API 客户端加入超时、重试和错误分层,遇到认证 / 网络 / 配置错误时可直接判断。
|
|
19
24
|
|
|
20
25
|
## 典型变化
|
|
21
26
|
|
|
22
|
-
- **输出模式**:`yapi <command> --json`
|
|
27
|
+
- **输出模式**:`yapi <command> --output compact|normal|verbose|pretty` 可切换结果粒度;`--json` 等价于结构化详细输出。
|
|
28
|
+
- **接口更新**:`interface-update` 走部分更新语义,适合只修改 `resBody` / `reqBody` 等单个字段;`interface-save` 适合保存完整接口定义。
|
|
29
|
+
- **写保护**:业务写命令需要显式追加 `--confirm true`,否则返回 preview 信息。
|
|
23
30
|
- **自检**:`yapi doctor --verbose` 可检查 Node 版本、配置、网络连通性和认证状态。
|
|
24
31
|
- **版本记录**:`yapi changelog --limit 5`、`--version`、`--since`、`--raw` 都可用。
|
|
25
32
|
- **补全**:`yapi completion bash|zsh|fish` 会生成对应 shell 的补全脚本。
|
|
26
33
|
- **更新探测**:`yapi update` 会先探测 npm 版本,再刷新 skill 文件。
|
|
34
|
+
- **快照查询**:可先用 `workspace-snapshot`、`project-snapshot`、`interface-snapshot` 拿聚合上下文,再决定是否细查。
|
|
35
|
+
- **URL 入口**:可直接粘贴 YApi 页面 URL,让 CLI 自动解析并执行对应查询命令。
|
|
27
36
|
|
|
28
37
|
## 版本要求
|
|
29
38
|
|
|
@@ -40,6 +49,8 @@ npx -y @cloudglab/yapi-cli@latest install
|
|
|
40
49
|
|
|
41
50
|
该命令会先安装全局 CLI,再通过 `skills add` 安装内置 Skill。首次安装时,会先检查本机是否已有可用配置;如果没有,会在交互终端里逐步提示你输入 YApi 地址、登录用户名、登录密码和认证方式。
|
|
42
51
|
|
|
52
|
+
安装或更新成功后,终端还会打印 ASCII 标识和一组快速开始命令,方便直接继续执行 `yapi help`、`yapi config-init`、`yapi whoami` 等操作。
|
|
53
|
+
|
|
43
54
|
如果需要重新安装 CLI 与 skill,可直接运行:
|
|
44
55
|
|
|
45
56
|
```bash
|
|
@@ -57,6 +68,9 @@ yapi update
|
|
|
57
68
|
```bash
|
|
58
69
|
yapi help
|
|
59
70
|
yapi list
|
|
71
|
+
yapi --json help
|
|
72
|
+
yapi interface-list --project-id 1 --limit 20 --json
|
|
73
|
+
yapi project-list --output compact
|
|
60
74
|
yapi install
|
|
61
75
|
yapi version --verbose
|
|
62
76
|
yapi doctor
|
|
@@ -78,6 +92,27 @@ yapi whoami
|
|
|
78
92
|
|
|
79
93
|
如果本机之前残留了旧版全局 `yapi` / `yapi-cli` 可执行文件,`install` 会先尝试自动清理,再继续安装。
|
|
80
94
|
|
|
95
|
+
## 输出与管道
|
|
96
|
+
|
|
97
|
+
CLI 的日志走 stderr、结果走 stdout,二者已分离:
|
|
98
|
+
|
|
99
|
+
- `--output compact|normal|verbose` 已是合法 JSON,**无需再用 python 重新解析**;直接用 `jq` 提取字段即可。
|
|
100
|
+
- 拼管道时**别加 `2>&1`**,否则 `[yapi] ...` 日志会混进 stdout 破坏 JSON;丢弃日志用 `2>/dev/null`。
|
|
101
|
+
- `resBody` / `resParams` 等 YApi 字段是字符串化 JSON,用 `jq '<path> | fromjson'` 二次展开。
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
yapi --output verbose interface-get --interface-id 186512 2>/dev/null | jq '.interface.resBody | fromjson'
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 接口编辑示例
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
yapi interface-update --interfaceId 186512 --resBodyType json --resBody '{"errno":0,"data":[]}' --confirm true
|
|
111
|
+
yapi interface-save --projectId 1688 --interfaceId 186512 --catId 28376 --title "获取个人产品列表" --path "/flow-master/account/ownerProductList" --method POST --resBodyType json --resBody '{"errno":0,"data":[]}' --confirm true
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 常用命令示例
|
|
115
|
+
|
|
81
116
|
```bash
|
|
82
117
|
yapi group-list
|
|
83
118
|
yapi project-list --project-id 1
|
|
@@ -88,6 +123,11 @@ yapi request --path /api/user/status
|
|
|
88
123
|
```bash
|
|
89
124
|
yapi user-list
|
|
90
125
|
yapi user-search --query alice
|
|
126
|
+
yapi workspace-snapshot
|
|
127
|
+
yapi project-snapshot --project-id 1
|
|
128
|
+
yapi interface-snapshot --interface-id 123
|
|
129
|
+
yapi url-parse --url "https://yapi.example.com/project/1/interface/api/123"
|
|
130
|
+
yapi "https://yapi.example.com/project/1/interface/api/123"
|
|
91
131
|
yapi col-list --project-id 1
|
|
92
132
|
yapi docs-sync --file docs/api.md --project-id 1 --cat-id 2
|
|
93
133
|
```
|
package/dist/cli.js
CHANGED
|
@@ -10,7 +10,107 @@ import { checkForUpdates, getUpdateSuggestion } from './core/update-probe.js';
|
|
|
10
10
|
import { handleCliError } from './core/errors.js';
|
|
11
11
|
import { setOutputFormat, getOutputFormatter } from './tools/shared.js';
|
|
12
12
|
import { getAvailableCommandNames, resolveCommandGroup } from './core/manifest.js';
|
|
13
|
+
import { resetRequestMetrics } from './core/http-metrics.js';
|
|
14
|
+
import { previewOrAssertWriteAllowed } from './core/write-guard.js';
|
|
15
|
+
import { loadConfig } from './services/yapi/index.js';
|
|
16
|
+
import { looksLikeHttpUrl, parseYApiPageUrl, resolveParsedYApiUrlCommand } from './core/url-parser.js';
|
|
13
17
|
const BUILTIN_COMMANDS = ['help', 'list', 'version', 'install', 'update', 'uninstall', 'remove', 'doctor', 'changelog', 'completion'];
|
|
18
|
+
const BUSINESS_WRITE_COMMANDS = new Set([
|
|
19
|
+
'case-add',
|
|
20
|
+
'case-add-list',
|
|
21
|
+
'case-delete',
|
|
22
|
+
'case-run',
|
|
23
|
+
'case-update',
|
|
24
|
+
'category-create',
|
|
25
|
+
'category-delete',
|
|
26
|
+
'category-update',
|
|
27
|
+
'col-case-clone',
|
|
28
|
+
'col-case-up-index',
|
|
29
|
+
'col-create',
|
|
30
|
+
'col-delete',
|
|
31
|
+
'col-up-index',
|
|
32
|
+
'col-update',
|
|
33
|
+
'docs-sync',
|
|
34
|
+
'follow',
|
|
35
|
+
'group-create',
|
|
36
|
+
'group-delete',
|
|
37
|
+
'group-member-add',
|
|
38
|
+
'group-member-remove',
|
|
39
|
+
'group-member-role',
|
|
40
|
+
'group-update',
|
|
41
|
+
'import',
|
|
42
|
+
'interface-create',
|
|
43
|
+
'interface-delete',
|
|
44
|
+
'interface-mock-script',
|
|
45
|
+
'interface-mock-toggle',
|
|
46
|
+
'interface-save',
|
|
47
|
+
'interface-up-cat-index',
|
|
48
|
+
'interface-up-index',
|
|
49
|
+
'interface-update',
|
|
50
|
+
'interface-upload',
|
|
51
|
+
'login',
|
|
52
|
+
'login-by-token',
|
|
53
|
+
'logout',
|
|
54
|
+
'project-copy',
|
|
55
|
+
'project-create',
|
|
56
|
+
'project-delete',
|
|
57
|
+
'project-env-update',
|
|
58
|
+
'project-follow',
|
|
59
|
+
'project-member-add',
|
|
60
|
+
'project-member-email-notice',
|
|
61
|
+
'project-member-remove',
|
|
62
|
+
'project-member-role',
|
|
63
|
+
'project-mock-script',
|
|
64
|
+
'project-mock-toggle',
|
|
65
|
+
'project-tag-update',
|
|
66
|
+
'project-token-update',
|
|
67
|
+
'project-unfollow',
|
|
68
|
+
'project-update',
|
|
69
|
+
'self-update',
|
|
70
|
+
'user-change-password',
|
|
71
|
+
'user-delete',
|
|
72
|
+
'user-register',
|
|
73
|
+
'user-update',
|
|
74
|
+
'user-upload-avatar',
|
|
75
|
+
]);
|
|
76
|
+
function stripGlobalOutputFlags(rawArgs) {
|
|
77
|
+
const args = [];
|
|
78
|
+
let outputFormat = 'pretty';
|
|
79
|
+
for (let index = 0; index < rawArgs.length; index += 1) {
|
|
80
|
+
const token = rawArgs[index];
|
|
81
|
+
if (token === '--') {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (token === '--json') {
|
|
85
|
+
outputFormat = 'verbose';
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (token === '--output') {
|
|
89
|
+
const next = rawArgs[index + 1];
|
|
90
|
+
if (!next || next.startsWith('-')) {
|
|
91
|
+
throw new Error('缺少 --output 的值');
|
|
92
|
+
}
|
|
93
|
+
outputFormat = parseOutputFormat(next);
|
|
94
|
+
index += 1;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (token.startsWith('--output=')) {
|
|
98
|
+
outputFormat = parseOutputFormat(token.slice('--output='.length));
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
args.push(token);
|
|
102
|
+
}
|
|
103
|
+
return { args, outputFormat };
|
|
104
|
+
}
|
|
105
|
+
function parseOutputFormat(value) {
|
|
106
|
+
if (value === 'json' || value === 'verbose') {
|
|
107
|
+
return 'verbose';
|
|
108
|
+
}
|
|
109
|
+
if (value === 'pretty' || value === 'compact' || value === 'normal') {
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`未知输出模式: ${value}`);
|
|
113
|
+
}
|
|
14
114
|
function parseTopLevelArgs(rawArgs) {
|
|
15
115
|
const args = [...rawArgs];
|
|
16
116
|
if (args.length === 0) {
|
|
@@ -30,23 +130,99 @@ function parseTopLevelArgs(rawArgs) {
|
|
|
30
130
|
function isHelpFlag(args) {
|
|
31
131
|
return args.includes('--help') || args.includes('-h');
|
|
32
132
|
}
|
|
33
|
-
function
|
|
34
|
-
|
|
133
|
+
function unwrapJsonContentResult(result) {
|
|
134
|
+
const text = result.content.map((item) => item.text).join('\n');
|
|
135
|
+
try {
|
|
136
|
+
return JSON.parse(text);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return text;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function executeBusinessCommand(commandName, commandArgs) {
|
|
143
|
+
const commandGroup = resolveCommandGroup(commandName);
|
|
144
|
+
if (!commandGroup) {
|
|
145
|
+
throw new Error(`URL 解析后映射到未知命令: ${commandName}`);
|
|
146
|
+
}
|
|
147
|
+
const registry = await buildRegistryForCommand({ commandName, commandGroup });
|
|
148
|
+
const command = registry.getCommand(commandName);
|
|
149
|
+
if (!command) {
|
|
150
|
+
throw new Error(`URL 解析后映射到未注册命令: ${commandName}`);
|
|
151
|
+
}
|
|
152
|
+
const input = parseCommandInput(command.schema, commandArgs);
|
|
153
|
+
const writePreview = previewBusinessWrite(commandName, input);
|
|
154
|
+
if (writePreview) {
|
|
155
|
+
return writePreview;
|
|
156
|
+
}
|
|
157
|
+
return await command.handler(input);
|
|
158
|
+
}
|
|
159
|
+
function previewBusinessWrite(commandName, input) {
|
|
160
|
+
if (!BUSINESS_WRITE_COMMANDS.has(commandName)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const preview = previewOrAssertWriteAllowed({
|
|
164
|
+
action: commandName,
|
|
165
|
+
confirm: input.confirm === true,
|
|
166
|
+
payload: input,
|
|
167
|
+
});
|
|
168
|
+
return preview ? getOutputFormatter().result(preview) : null;
|
|
35
169
|
}
|
|
36
170
|
export async function runCli(rawArgs, appName = 'yapi-cli') {
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
171
|
+
// 每次 CLI 执行开始时清零请求指标,避免上一次运行的累计值混入当前输出
|
|
172
|
+
resetRequestMetrics();
|
|
173
|
+
let args;
|
|
174
|
+
let outputFormat;
|
|
175
|
+
try {
|
|
176
|
+
({ args, outputFormat } = stripGlobalOutputFlags(rawArgs));
|
|
40
177
|
}
|
|
41
|
-
|
|
42
|
-
|
|
178
|
+
catch (error) {
|
|
179
|
+
const msg = handleCliError(error);
|
|
180
|
+
process.stderr.write(`${msg}\n`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
setOutputFormat(outputFormat);
|
|
184
|
+
const { commandName, commandArgs } = parseTopLevelArgs(args);
|
|
185
|
+
if (commandName && looksLikeHttpUrl(commandName)) {
|
|
186
|
+
const output = getOutputFormatter();
|
|
187
|
+
const config = loadConfig();
|
|
188
|
+
const parsed = parseYApiPageUrl(commandName, config?.url ?? null);
|
|
189
|
+
const resolvedCommand = resolveParsedYApiUrlCommand(parsed);
|
|
190
|
+
if (!resolvedCommand) {
|
|
191
|
+
output.printMessage(formatCommandResult(output.result(parsed)));
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const result = await executeBusinessCommand(resolvedCommand.commandName, resolvedCommand.commandArgs);
|
|
196
|
+
if (outputFormat === 'pretty') {
|
|
197
|
+
const lines = [`已从 URL 解析并执行: ${resolvedCommand.displayCommand}`];
|
|
198
|
+
if (parsed.note) {
|
|
199
|
+
lines.push(`说明: ${parsed.note}`);
|
|
200
|
+
}
|
|
201
|
+
lines.push('', formatCommandResult(result));
|
|
202
|
+
output.printMessage(lines.join('\n'));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
output.printMessage(formatCommandResult(output.result({
|
|
206
|
+
parsed,
|
|
207
|
+
executed: {
|
|
208
|
+
commandName: resolvedCommand.commandName,
|
|
209
|
+
commandArgs: resolvedCommand.commandArgs,
|
|
210
|
+
command: resolvedCommand.displayCommand,
|
|
211
|
+
},
|
|
212
|
+
result: unwrapJsonContentResult(result),
|
|
213
|
+
})));
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const msg = handleCliError(error);
|
|
217
|
+
process.stderr.write(`${msg}\n`);
|
|
218
|
+
}
|
|
219
|
+
return;
|
|
43
220
|
}
|
|
44
|
-
const { commandName, commandArgs } = parseTopLevelArgs(rawArgs);
|
|
45
|
-
const commandNames = getAvailableCommandNames();
|
|
46
221
|
// --- 无参 -> 总帮助 ---
|
|
47
222
|
if (!commandName || commandName === 'help') {
|
|
48
223
|
if (commandArgs.length === 0) {
|
|
49
|
-
|
|
224
|
+
const registry = await buildRegistryForCommand();
|
|
225
|
+
printHelp(appName, registry.listCommands());
|
|
50
226
|
return;
|
|
51
227
|
}
|
|
52
228
|
const targetName = commandArgs[0];
|
|
@@ -72,12 +248,13 @@ export async function runCli(rawArgs, appName = 'yapi-cli') {
|
|
|
72
248
|
}
|
|
73
249
|
// --- list ---
|
|
74
250
|
if (commandName === 'list') {
|
|
75
|
-
|
|
251
|
+
const registry = await buildRegistryForCommand();
|
|
252
|
+
printHelp(appName, registry.listCommands());
|
|
76
253
|
return;
|
|
77
254
|
}
|
|
78
255
|
// --- version ---
|
|
79
256
|
if (commandName === 'version') {
|
|
80
|
-
if (
|
|
257
|
+
if (outputFormat !== 'pretty') {
|
|
81
258
|
process.stdout.write(`${JSON.stringify({ version: CLI_VERSION, name: appName }, null, 2)}\n`);
|
|
82
259
|
}
|
|
83
260
|
else if (commandArgs.includes('--verbose')) {
|
|
@@ -111,7 +288,7 @@ export async function runCli(rawArgs, appName = 'yapi-cli') {
|
|
|
111
288
|
}
|
|
112
289
|
// --- update ---
|
|
113
290
|
if (commandName === 'update') {
|
|
114
|
-
const updateInfo = checkForUpdates();
|
|
291
|
+
const updateInfo = checkForUpdates({ force: true });
|
|
115
292
|
if (updateInfo.isUpdateAvailable) {
|
|
116
293
|
process.stdout.write(`${getUpdateSuggestion(updateInfo)}\n\n`);
|
|
117
294
|
}
|
|
@@ -131,7 +308,7 @@ export async function runCli(rawArgs, appName = 'yapi-cli') {
|
|
|
131
308
|
}
|
|
132
309
|
// --- doctor ---
|
|
133
310
|
if (commandName === 'doctor') {
|
|
134
|
-
await runDoctor(commandArgs);
|
|
311
|
+
await runDoctor(outputFormat === 'pretty' ? commandArgs : ['--json', ...commandArgs]);
|
|
135
312
|
return;
|
|
136
313
|
}
|
|
137
314
|
// --- changelog ---
|
|
@@ -141,32 +318,27 @@ export async function runCli(rawArgs, appName = 'yapi-cli') {
|
|
|
141
318
|
}
|
|
142
319
|
// --- completion ---
|
|
143
320
|
if (commandName === 'completion') {
|
|
321
|
+
const commandNames = getAvailableCommandNames();
|
|
144
322
|
const script = generateCompletionScript(commandNames, appName, commandArgs[0]);
|
|
145
323
|
process.stdout.write(script);
|
|
146
324
|
return;
|
|
147
325
|
}
|
|
148
326
|
// --- 业务命令 ---
|
|
149
|
-
|
|
150
|
-
if (!commandGroup) {
|
|
327
|
+
if (!resolveCommandGroup(commandName)) {
|
|
151
328
|
process.stderr.write(`未找到命令: ${commandName}\n运行 \`${appName} help\` 查看可用命令。\n`);
|
|
152
329
|
process.exitCode = 1;
|
|
153
330
|
return;
|
|
154
331
|
}
|
|
332
|
+
const commandGroup = resolveCommandGroup(commandName);
|
|
155
333
|
const registry = await buildRegistryForCommand({ commandName, commandGroup });
|
|
156
334
|
const command = registry.getCommand(commandName);
|
|
157
|
-
if (!command) {
|
|
158
|
-
process.stderr.write(`未找到命令: ${commandName}\n运行 \`${appName} help\` 查看可用命令。\n`);
|
|
159
|
-
process.exitCode = 1;
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
335
|
if (isHelpFlag(commandArgs)) {
|
|
163
336
|
printCommandHelp(appName, command);
|
|
164
337
|
return;
|
|
165
338
|
}
|
|
166
339
|
// 执行业务命令,统一错误处理
|
|
167
340
|
try {
|
|
168
|
-
const
|
|
169
|
-
const result = await command.handler(input);
|
|
341
|
+
const result = await executeBusinessCommand(commandName, commandArgs);
|
|
170
342
|
const output = getOutputFormatter();
|
|
171
343
|
output.printMessage(formatCommandResult(result));
|
|
172
344
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { CliCommandDefinition } from './cli-registry.js';
|
|
2
2
|
export declare function getBuiltinCommandNames(): string[];
|
|
3
3
|
/** 格式化 registry 注册命令的执行结果 */
|
|
4
4
|
export declare function formatCommandResult(result: {
|
package/dist/core/cli-output.js
CHANGED
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
import { describeSchema } from './cli-registry.js';
|
|
2
2
|
import { CLI_VERSION } from '../version.js';
|
|
3
|
+
import { resolveCommandGroup } from './manifest.js';
|
|
4
|
+
const GROUP_ORDER = ['auth', 'group', 'project', 'interface', 'util', 'test'];
|
|
5
|
+
const GROUP_LABELS = {
|
|
6
|
+
auth: '开始使用',
|
|
7
|
+
group: '分组管理',
|
|
8
|
+
project: '项目与环境',
|
|
9
|
+
interface: '接口查询与变更',
|
|
10
|
+
util: '工具与导出',
|
|
11
|
+
test: '测试与自动化',
|
|
12
|
+
};
|
|
3
13
|
export function getBuiltinCommandNames() {
|
|
4
14
|
return ['help', 'install', 'list', 'remove', 'uninstall', 'update', 'version', 'doctor', 'changelog', 'completion'];
|
|
5
15
|
}
|
|
6
16
|
/** 格式化 registry 注册命令的执行结果 */
|
|
7
17
|
export function formatCommandResult(result) {
|
|
8
|
-
const
|
|
9
|
-
return
|
|
18
|
+
const texts = result.content?.map((item) => item.text).filter(Boolean) ?? [];
|
|
19
|
+
return texts.join('\n');
|
|
10
20
|
}
|
|
11
21
|
/** 打印总帮助 */
|
|
12
22
|
export function printHelp(appName, commands) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return { name: command.name, description: command.description ?? '' };
|
|
18
|
-
});
|
|
19
|
-
const maxCommandWidth = Math.max(...commandList.map((command) => command.name.length), 0, 12) + 2;
|
|
23
|
+
const normalized = commands.map((command) => normalizeHelpCommand(command));
|
|
24
|
+
const maxCommandWidth = Math.max(...normalized.map((command) => command.name.length), 0, 12) + 2;
|
|
25
|
+
const grouped = groupCommands(normalized);
|
|
26
|
+
const recommended = pickRecommendedCommands(normalized);
|
|
20
27
|
const lines = [
|
|
21
28
|
`${appName} v${CLI_VERSION}`,
|
|
22
29
|
'',
|
|
@@ -26,17 +33,25 @@ export function printHelp(appName, commands) {
|
|
|
26
33
|
'用法:',
|
|
27
34
|
` ${appName} <command> [options]`,
|
|
28
35
|
` ${appName} help <command>`,
|
|
36
|
+
` ${appName} --output compact <command> [options]`,
|
|
29
37
|
` npx ${appName} <command> [options]`,
|
|
30
38
|
'',
|
|
31
39
|
'快速开始:',
|
|
32
|
-
` ${appName} list
|
|
33
|
-
` ${appName} help <command>
|
|
34
|
-
` ${appName} whoami
|
|
35
|
-
` ${appName} doctor
|
|
40
|
+
` ${appName} list 查看全部可用命令(推荐)`,
|
|
41
|
+
` ${appName} help <command> 查看命令参数`,
|
|
42
|
+
` ${appName} whoami 校验当前账号`,
|
|
43
|
+
` ${appName} doctor --verbose 自检配置与网络`,
|
|
44
|
+
` ${appName} --output compact search --q 关键词`,
|
|
45
|
+
'',
|
|
46
|
+
'输出模式:',
|
|
47
|
+
' pretty 人类友好表格(默认)',
|
|
48
|
+
' compact 精简 JSON,适合 AI 首轮探测',
|
|
49
|
+
' normal 保留主要字段的 JSON',
|
|
50
|
+
' verbose 完整 JSON(`--json` 等价)',
|
|
36
51
|
'',
|
|
37
52
|
'内置命令:',
|
|
38
53
|
' help 显示帮助信息',
|
|
39
|
-
' list
|
|
54
|
+
' list 按分组列出业务命令',
|
|
40
55
|
' version 显示版本号',
|
|
41
56
|
' install 安装 CLI(配置 + skill)',
|
|
42
57
|
' update 检查更新 + 刷新 skill',
|
|
@@ -48,20 +63,43 @@ export function printHelp(appName, commands) {
|
|
|
48
63
|
'',
|
|
49
64
|
'业务命令:',
|
|
50
65
|
];
|
|
51
|
-
if (
|
|
66
|
+
if (normalized.length === 0) {
|
|
52
67
|
lines.push(' (暂无)');
|
|
53
68
|
}
|
|
54
69
|
else {
|
|
55
|
-
for (const
|
|
56
|
-
|
|
70
|
+
for (const group of GROUP_ORDER) {
|
|
71
|
+
const commandsInGroup = grouped.get(group) ?? [];
|
|
72
|
+
if (commandsInGroup.length === 0) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
lines.push(` ${GROUP_LABELS[group]}`);
|
|
76
|
+
for (const command of commandsInGroup) {
|
|
77
|
+
lines.push(formatHelpCommandLine(command, maxCommandWidth));
|
|
78
|
+
}
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
const others = grouped.get('other') ?? [];
|
|
82
|
+
if (others.length > 0) {
|
|
83
|
+
lines.push(' 其他');
|
|
84
|
+
for (const command of others) {
|
|
85
|
+
lines.push(formatHelpCommandLine(command, maxCommandWidth));
|
|
86
|
+
}
|
|
87
|
+
lines.push('');
|
|
57
88
|
}
|
|
58
89
|
}
|
|
59
|
-
if (
|
|
60
|
-
lines.push(
|
|
61
|
-
|
|
90
|
+
if (normalized.length > 0) {
|
|
91
|
+
lines.push(`共 ${normalized.length} 个业务命令。使用 \`${appName} help <command>\` 查看参数详情。`);
|
|
92
|
+
if (recommended.length > 0) {
|
|
93
|
+
lines.push('');
|
|
94
|
+
lines.push('推荐起手:');
|
|
95
|
+
for (const command of recommended) {
|
|
96
|
+
lines.push(` - ${appName} ${command.name}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
62
99
|
lines.push('');
|
|
63
100
|
lines.push('下一步:');
|
|
64
101
|
lines.push(` - 查看参数:${appName} help <command>`);
|
|
102
|
+
lines.push(` - 精简 JSON:${appName} --output compact <command> ...`);
|
|
65
103
|
lines.push(` - 校验账号:${appName} whoami`);
|
|
66
104
|
lines.push(` - 初始化配置:${appName} config-init --url <url> --username <username> --password <password>`);
|
|
67
105
|
}
|
|
@@ -74,15 +112,66 @@ export function printCommandHelp(appName, command) {
|
|
|
74
112
|
const description = field.description ? `:${field.description}` : '';
|
|
75
113
|
return ` --${field.name} <${field.type}> (${requiredLabel})${description}`;
|
|
76
114
|
});
|
|
115
|
+
const group = resolveCommandGroup(command.name);
|
|
77
116
|
const lines = [
|
|
78
117
|
`${appName} ${command.name}`,
|
|
79
118
|
command.description ?? '',
|
|
80
|
-
'',
|
|
81
|
-
'参数:',
|
|
82
|
-
...(schemaRows.length > 0 ? schemaRows : [' (暂无参数)']),
|
|
83
|
-
'',
|
|
84
|
-
`提示:使用 \`${appName} --json ${command.name} ...\` 可输出 JSON 结果`,
|
|
85
119
|
];
|
|
120
|
+
if (group) {
|
|
121
|
+
lines.push(`分组:${GROUP_LABELS[group] ?? group}`);
|
|
122
|
+
}
|
|
123
|
+
if (command.metadata?.costHint) {
|
|
124
|
+
lines.push(`预估成本:${formatCostHint(command.metadata.costHint)}`);
|
|
125
|
+
}
|
|
126
|
+
if (command.metadata?.nextBestTools?.length) {
|
|
127
|
+
lines.push(`推荐下一步:${command.metadata.nextBestTools.join(' / ')}`);
|
|
128
|
+
}
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push('参数:');
|
|
131
|
+
lines.push(...(schemaRows.length > 0 ? schemaRows : [' (暂无参数)']));
|
|
132
|
+
lines.push('');
|
|
133
|
+
lines.push('输出建议:');
|
|
134
|
+
lines.push(` ${appName} --output compact ${command.name} ... # AI 首轮探测`);
|
|
135
|
+
lines.push(` ${appName} --output normal ${command.name} ... # 保留主要字段`);
|
|
136
|
+
lines.push(` ${appName} --output verbose ${command.name} ... # 完整 JSON`);
|
|
137
|
+
lines.push(` ${appName} ${command.name} ... # 人类友好输出`);
|
|
86
138
|
process.stdout.write(`${lines.join('\n')}\n`);
|
|
87
139
|
}
|
|
140
|
+
function normalizeHelpCommand(command) {
|
|
141
|
+
if (typeof command === 'string') {
|
|
142
|
+
return {
|
|
143
|
+
name: command,
|
|
144
|
+
description: '',
|
|
145
|
+
groupKey: resolveCommandGroup(command) ?? 'other',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
name: command.name,
|
|
150
|
+
description: command.description ?? '',
|
|
151
|
+
metadata: command.metadata,
|
|
152
|
+
groupKey: resolveCommandGroup(command.name) ?? 'other',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function groupCommands(commands) {
|
|
156
|
+
const grouped = new Map();
|
|
157
|
+
for (const command of commands) {
|
|
158
|
+
grouped.set(command.groupKey, [...(grouped.get(command.groupKey) ?? []), command]);
|
|
159
|
+
}
|
|
160
|
+
for (const [key, items] of grouped) {
|
|
161
|
+
grouped.set(key, [...items].sort((left, right) => left.name.localeCompare(right.name)));
|
|
162
|
+
}
|
|
163
|
+
return grouped;
|
|
164
|
+
}
|
|
165
|
+
function formatHelpCommandLine(command, width) {
|
|
166
|
+
const cost = command.metadata?.costHint ? `[${formatCostHint(command.metadata.costHint)}] ` : '';
|
|
167
|
+
return ` ${command.name.padEnd(width)}${cost}${command.description}`.trimEnd();
|
|
168
|
+
}
|
|
169
|
+
function formatCostHint(costHint) {
|
|
170
|
+
return costHint === 'low' ? '低' : costHint === 'medium' ? '中' : '高';
|
|
171
|
+
}
|
|
172
|
+
function pickRecommendedCommands(commands) {
|
|
173
|
+
const preferred = ['whoami', 'login', 'project-list', 'search', 'interface-list'];
|
|
174
|
+
const index = new Map(commands.map((command) => [command.name, command]));
|
|
175
|
+
return preferred.map((name) => index.get(name)).filter(Boolean);
|
|
176
|
+
}
|
|
88
177
|
//# sourceMappingURL=cli-output.js.map
|