@cloudglab/yapi-cli 0.0.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/CHANGELOG.md +5 -0
- package/README.md +131 -0
- package/dist/bin/yapi.d.ts +2 -0
- package/dist/bin/yapi.js +8 -0
- package/dist/bin/yapi.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +203 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/changelog.d.ts +17 -0
- package/dist/core/changelog.js +117 -0
- package/dist/core/changelog.js.map +1 -0
- package/dist/core/cli-output.d.ts +13 -0
- package/dist/core/cli-output.js +65 -0
- package/dist/core/cli-output.js.map +1 -0
- package/dist/core/cli-registry.d.ts +38 -0
- package/dist/core/cli-registry.js +189 -0
- package/dist/core/cli-registry.js.map +1 -0
- package/dist/core/completion.d.ts +3 -0
- package/dist/core/completion.js +94 -0
- package/dist/core/completion.js.map +1 -0
- package/dist/core/doctor.d.ts +13 -0
- package/dist/core/doctor.js +124 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/errors.d.ts +38 -0
- package/dist/core/errors.js +74 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/output.d.ts +27 -0
- package/dist/core/output.js +208 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/update-probe.d.ts +14 -0
- package/dist/core/update-probe.js +67 -0
- package/dist/core/update-probe.js.map +1 -0
- package/dist/core/write-guard.d.ts +25 -0
- package/dist/core/write-guard.js +36 -0
- package/dist/core/write-guard.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +13 -0
- package/dist/install.js +201 -0
- package/dist/install.js.map +1 -0
- package/dist/services/yapi/api.d.ts +696 -0
- package/dist/services/yapi/api.js +700 -0
- package/dist/services/yapi/api.js.map +1 -0
- package/dist/services/yapi/auth.d.ts +37 -0
- package/dist/services/yapi/auth.js +143 -0
- package/dist/services/yapi/auth.js.map +1 -0
- package/dist/services/yapi/authCache.d.ts +25 -0
- package/dist/services/yapi/authCache.js +80 -0
- package/dist/services/yapi/authCache.js.map +1 -0
- package/dist/services/yapi/cache.d.ts +27 -0
- package/dist/services/yapi/cache.js +88 -0
- package/dist/services/yapi/cache.js.map +1 -0
- package/dist/services/yapi/config.d.ts +12 -0
- package/dist/services/yapi/config.js +66 -0
- package/dist/services/yapi/config.js.map +1 -0
- package/dist/services/yapi/index.d.ts +6 -0
- package/dist/services/yapi/index.js +6 -0
- package/dist/services/yapi/index.js.map +1 -0
- package/dist/services/yapi/logger.d.ts +6 -0
- package/dist/services/yapi/logger.js +36 -0
- package/dist/services/yapi/logger.js.map +1 -0
- package/dist/services/yapi/types.d.ts +176 -0
- package/dist/services/yapi/types.js +2 -0
- package/dist/services/yapi/types.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/shared.d.ts +33 -0
- package/dist/tools/shared.js +46 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/yapi/docs-sync.d.ts +29 -0
- package/dist/tools/yapi/docs-sync.js +243 -0
- package/dist/tools/yapi/docs-sync.js.map +1 -0
- package/dist/tools/yapi/index.d.ts +6 -0
- package/dist/tools/yapi/index.js +7 -0
- package/dist/tools/yapi/index.js.map +1 -0
- package/dist/tools/yapi/register-auth.d.ts +2 -0
- package/dist/tools/yapi/register-auth.js +182 -0
- package/dist/tools/yapi/register-auth.js.map +1 -0
- package/dist/tools/yapi/register-group.d.ts +2 -0
- package/dist/tools/yapi/register-group.js +178 -0
- package/dist/tools/yapi/register-group.js.map +1 -0
- package/dist/tools/yapi/register-interface.d.ts +2 -0
- package/dist/tools/yapi/register-interface.js +359 -0
- package/dist/tools/yapi/register-interface.js.map +1 -0
- package/dist/tools/yapi/register-project.d.ts +2 -0
- package/dist/tools/yapi/register-project.js +300 -0
- package/dist/tools/yapi/register-project.js.map +1 -0
- package/dist/tools/yapi/register-test.d.ts +2 -0
- package/dist/tools/yapi/register-test.js +267 -0
- package/dist/tools/yapi/register-test.js.map +1 -0
- package/dist/tools/yapi/register-util.d.ts +2 -0
- package/dist/tools/yapi/register-util.js +565 -0
- package/dist/tools/yapi/register-util.js.map +1 -0
- package/dist/tools/yapi/register.d.ts +6 -0
- package/dist/tools/yapi/register.js +19 -0
- package/dist/tools/yapi/register.js.map +1 -0
- package/dist/tools/yapi/utils.d.ts +11 -0
- package/dist/tools/yapi/utils.js +28 -0
- package/dist/tools/yapi/utils.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +38 -0
- package/skills/yapi-cli/SKILL.md +126 -0
- package/skills/yapi-cli/reference/auth.md +106 -0
- package/skills/yapi-cli/reference/cli.md +60 -0
- package/skills/yapi-cli/reference/commands.md +152 -0
- package/skills/yapi-cli/reference/group.md +77 -0
- package/skills/yapi-cli/reference/install.md +82 -0
- package/skills/yapi-cli/reference/interface.md +185 -0
- package/skills/yapi-cli/reference/overview.md +52 -0
- package/skills/yapi-cli/reference/project.md +115 -0
- package/skills/yapi-cli/reference/test.md +130 -0
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# yapi-cli
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
把 YApi 的查询、登录、同步、安装、更新、自检和补全能力接到命令行,方便在终端、脚本、CI 和 AI Skill 里直接调用。
|
|
6
|
+
|
|
7
|
+
除了标准 REST API,本工具还补充了部分扩展场景:会在必要时读取配置、做更新探测、生成补全脚本,或把常见查询封装成可调用命令,适合自动化和 Agent 工作流。
|
|
8
|
+
|
|
9
|
+
## 这版补了什么
|
|
10
|
+
|
|
11
|
+
- 默认 JSON 输出适合 AI / 脚本消费:统一走 `jsonResult`,并可切到 `pretty` 人类可读模式。
|
|
12
|
+
- 新增内置命令:`doctor`、`changelog`、`completion`,补齐安装 / 更新 / 卸载 / 版本查看链路。
|
|
13
|
+
- 登录同时支持 `--token` 和 `--email --password`,可覆盖 token 认证、普通账号和 LDAP 登录场景。
|
|
14
|
+
- 命令层统一使用 `InMemoryCliRegistry + Zod schema + jsonResult`,便于 Agent 稳定调用。
|
|
15
|
+
- 共享了分页、项目 ID、可选文本、布尔值和导出格式等 Zod 片段,减少重复定义。
|
|
16
|
+
- API 客户端加入超时、重试和错误分层,遇到认证 / 网络 / 配置错误时可直接判断。
|
|
17
|
+
|
|
18
|
+
## 典型变化
|
|
19
|
+
|
|
20
|
+
- **输出模式**:`yapi --json ...` 会返回 JSON 结果;默认模式在终端输出更适合人工阅读的文本。
|
|
21
|
+
- **自检**:`yapi doctor --verbose` 可检查 Node 版本、配置、网络连通性和认证状态。
|
|
22
|
+
- **版本记录**:`yapi changelog --limit 5`、`--version`、`--since`、`--raw` 都可用。
|
|
23
|
+
- **补全**:`yapi completion bash|zsh|fish` 会生成对应 shell 的补全脚本。
|
|
24
|
+
- **更新探测**:`yapi update` 会先探测 npm 版本,再刷新 skill 文件。
|
|
25
|
+
|
|
26
|
+
## 版本要求
|
|
27
|
+
|
|
28
|
+
- **Node.js 版本**:需要 **Node.js >= 18**。
|
|
29
|
+
- **YApi 版本**:支持 YApi 常见 REST API 和登录接口;登录方式同时兼容 token、普通账号和 LDAP 后端。
|
|
30
|
+
|
|
31
|
+
## 安装方式
|
|
32
|
+
|
|
33
|
+
### 推荐:一键安装 CLI + Skill
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx -y yapi-cli@latest install
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
该命令会安装全局 CLI 和内置 Skill,并在配置缺失或登录失败时给出引导。配置完成后即可直接使用查询命令。
|
|
40
|
+
|
|
41
|
+
如果需要重新安装 skill,可直接运行:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
yapi install
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
如果想先检查更新再决定是否升级:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
yapi update
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 常用命令示例
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
yapi help
|
|
57
|
+
yapi list
|
|
58
|
+
yapi version --verbose
|
|
59
|
+
yapi doctor
|
|
60
|
+
yapi changelog --limit 5
|
|
61
|
+
yapi completion bash
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
yapi config-init --server https://yapi.example.com
|
|
66
|
+
yapi login --token xxx
|
|
67
|
+
yapi login --email user@example.com --password secret
|
|
68
|
+
yapi whoami
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
yapi group-list
|
|
73
|
+
yapi project-list --project-id 1
|
|
74
|
+
yapi interface-list --project-id 1 --limit 20
|
|
75
|
+
yapi request --path /api/user/status
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
yapi user-list
|
|
80
|
+
yapi user-search --query alice
|
|
81
|
+
yapi col-list --project-id 1
|
|
82
|
+
yapi docs-sync --file docs/api.md --project-id 1 --cat-id 2
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 可以这样问
|
|
86
|
+
|
|
87
|
+
下面这些自然语言请求可以交给 AI Skill / Agent 转成对应的 yapi-cli 命令。
|
|
88
|
+
|
|
89
|
+
### 账号 / 登录
|
|
90
|
+
|
|
91
|
+
- 看我当前是否登录。
|
|
92
|
+
- 用 token 登录。
|
|
93
|
+
- 用邮箱和密码登录。
|
|
94
|
+
- 检查当前配置是否可用。
|
|
95
|
+
|
|
96
|
+
### 项目 / 分组 / 接口
|
|
97
|
+
|
|
98
|
+
- 列出项目下的接口。
|
|
99
|
+
- 看某个接口的详情。
|
|
100
|
+
- 搜索某个关键词相关的接口。
|
|
101
|
+
- 看某个项目的分类、成员和环境。
|
|
102
|
+
|
|
103
|
+
### 用户 / 集合 / 导出
|
|
104
|
+
|
|
105
|
+
- 列出用户。
|
|
106
|
+
- 搜索用户。
|
|
107
|
+
- 查看测试集合。
|
|
108
|
+
- 导出项目数据。
|
|
109
|
+
|
|
110
|
+
### 文档同步 / 维护
|
|
111
|
+
|
|
112
|
+
- 把 Markdown 文档同步到 YApi。
|
|
113
|
+
- 检查当前环境是否健康。
|
|
114
|
+
- 看版本变更记录。
|
|
115
|
+
- 生成 shell 补全脚本。
|
|
116
|
+
|
|
117
|
+
## 目录结构
|
|
118
|
+
|
|
119
|
+
- `src/core/`:命令注册、解析、输出、自检、更新、补全。
|
|
120
|
+
- `src/services/yapi/`:YApi 服务层、认证、缓存和配置。
|
|
121
|
+
- `src/tools/yapi/`:业务命令注册入口。
|
|
122
|
+
- `.agents/skills/yapi-cli/`:skill 源目录。
|
|
123
|
+
- `skills/yapi-cli/`:构建时复制后的发布目录。
|
|
124
|
+
|
|
125
|
+
## 验证
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
pnpm typecheck
|
|
129
|
+
pnpm build
|
|
130
|
+
pnpm test
|
|
131
|
+
```
|
package/dist/bin/yapi.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runCli } from '../cli.js';
|
|
3
|
+
await runCli(process.argv.slice(2)).catch((error) => {
|
|
4
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
5
|
+
process.stderr.write(`${message}\n`);
|
|
6
|
+
process.exit(1);
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=yapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yapi.js","sourceRoot":"","sources":["../../src/bin/yapi.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC3D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCli(rawArgs: string[], appName?: string): Promise<void>;
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { CLI_VERSION } from './version.js';
|
|
2
|
+
import { runInstallCommand, runUninstallCommand, runUpdateCommand } from './install.js';
|
|
3
|
+
import { formatCommandResult, printCommandHelp, printHelp } from './core/cli-output.js';
|
|
4
|
+
import { InMemoryCliRegistry, parseCommandInput } from './core/cli-registry.js';
|
|
5
|
+
import { registerTools } from './tools/index.js';
|
|
6
|
+
import { runDoctor } from './core/doctor.js';
|
|
7
|
+
import { runChangelog } from './core/changelog.js';
|
|
8
|
+
import { generateCompletionScript } from './core/completion.js';
|
|
9
|
+
import { checkForUpdates, getUpdateSuggestion } from './core/update-probe.js';
|
|
10
|
+
import { handleCliError } from './core/errors.js';
|
|
11
|
+
import { setOutputFormat, getOutputFormatter } from './tools/shared.js';
|
|
12
|
+
const BUILTIN_COMMANDS = ['help', 'list', 'version', 'install', 'update', 'uninstall', 'remove', 'doctor', 'changelog', 'completion'];
|
|
13
|
+
function parseTopLevelArgs(rawArgs) {
|
|
14
|
+
const args = [...rawArgs];
|
|
15
|
+
if (args.length === 0) {
|
|
16
|
+
return { commandArgs: [] };
|
|
17
|
+
}
|
|
18
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
19
|
+
return { commandName: 'help', commandArgs: args.slice(1) };
|
|
20
|
+
}
|
|
21
|
+
if (args[0] === '--version' || args[0] === '-v') {
|
|
22
|
+
return { commandName: 'version', commandArgs: args.slice(1) };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
commandName: args[0],
|
|
26
|
+
commandArgs: args.slice(1),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function isHelpFlag(args) {
|
|
30
|
+
return args.includes('--help') || args.includes('-h');
|
|
31
|
+
}
|
|
32
|
+
function isJsonFlag(args) {
|
|
33
|
+
return args.includes('--json');
|
|
34
|
+
}
|
|
35
|
+
export async function runCli(rawArgs, appName = 'yapi-cli') {
|
|
36
|
+
// 检查全局 --json 标志,设置输出格式
|
|
37
|
+
if (isJsonFlag(rawArgs)) {
|
|
38
|
+
setOutputFormat('json');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
setOutputFormat('pretty');
|
|
42
|
+
}
|
|
43
|
+
const registry = new InMemoryCliRegistry();
|
|
44
|
+
registerTools(registry);
|
|
45
|
+
const { commandName, commandArgs } = parseTopLevelArgs(rawArgs);
|
|
46
|
+
// --- 无参 -> 总帮助 ---
|
|
47
|
+
if (!commandName || commandName === 'help') {
|
|
48
|
+
printHelp(appName, registry.listCommands());
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// --- list ---
|
|
52
|
+
if (commandName === 'list') {
|
|
53
|
+
printHelp(appName, registry.listCommands());
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// --- version ---
|
|
57
|
+
if (commandName === 'version') {
|
|
58
|
+
if (commandArgs.includes('--json')) {
|
|
59
|
+
process.stdout.write(`${JSON.stringify({ version: CLI_VERSION, name: appName }, null, 2)}\n`);
|
|
60
|
+
}
|
|
61
|
+
else if (commandArgs.includes('--verbose')) {
|
|
62
|
+
const updateInfo = checkForUpdates();
|
|
63
|
+
const lines = [
|
|
64
|
+
`${appName} v${CLI_VERSION}`,
|
|
65
|
+
` 包名: ${updateInfo.packageName}`,
|
|
66
|
+
` Node: ${process.versions.node}`,
|
|
67
|
+
` 平台: ${process.platform}/${process.arch}`,
|
|
68
|
+
];
|
|
69
|
+
if (updateInfo.error) {
|
|
70
|
+
lines.push(` 更新: ${updateInfo.error}`);
|
|
71
|
+
}
|
|
72
|
+
else if (updateInfo.latestVersion) {
|
|
73
|
+
lines.push(` 最新: ${updateInfo.latestVersion}`);
|
|
74
|
+
if (updateInfo.isUpdateAvailable) {
|
|
75
|
+
lines.push(` 建议: ${getUpdateSuggestion(updateInfo)}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
process.stdout.write(`${CLI_VERSION}\n`);
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// --- install ---
|
|
86
|
+
if (commandName === 'install') {
|
|
87
|
+
await runInstallCommand(commandArgs, appName);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// --- update ---
|
|
91
|
+
if (commandName === 'update') {
|
|
92
|
+
const updateInfo = checkForUpdates();
|
|
93
|
+
if (updateInfo.isUpdateAvailable) {
|
|
94
|
+
process.stdout.write(`${getUpdateSuggestion(updateInfo)}\n\n`);
|
|
95
|
+
}
|
|
96
|
+
else if (!updateInfo.error) {
|
|
97
|
+
process.stdout.write(`当前版本 ${CLI_VERSION} 已是最新。\n\n`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
process.stdout.write(`${updateInfo.error}\n\n`);
|
|
101
|
+
}
|
|
102
|
+
await runUpdateCommand(commandArgs, appName);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// --- uninstall / remove ---
|
|
106
|
+
if (commandName === 'uninstall' || commandName === 'remove') {
|
|
107
|
+
await runUninstallCommand(commandArgs, appName);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// --- doctor ---
|
|
111
|
+
if (commandName === 'doctor') {
|
|
112
|
+
await runDoctor(commandArgs);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// --- changelog ---
|
|
116
|
+
if (commandName === 'changelog') {
|
|
117
|
+
runChangelog(commandArgs);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// --- completion ---
|
|
121
|
+
if (commandName === 'completion') {
|
|
122
|
+
const script = generateCompletionScript(registry.listCommands(), appName, commandArgs[0]);
|
|
123
|
+
process.stdout.write(script);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// --- 业务命令 ---
|
|
127
|
+
const command = registry.getCommand(commandName);
|
|
128
|
+
if (!command) {
|
|
129
|
+
process.stderr.write(`未找到命令: ${commandName}\n运行 \`${appName} help\` 查看可用命令。\n`);
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (isHelpFlag(commandArgs)) {
|
|
134
|
+
printCommandHelp(appName, command);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// 执行业务命令,统一错误处理
|
|
138
|
+
try {
|
|
139
|
+
const input = parseCommandInput(command.schema, commandArgs);
|
|
140
|
+
const result = await command.handler(input);
|
|
141
|
+
const output = getOutputFormatter();
|
|
142
|
+
output.printMessage(formatCommandResult(result));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
const msg = handleCliError(error);
|
|
146
|
+
process.stderr.write(`${msg}\n`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function isBuiltin(name) {
|
|
150
|
+
return BUILTIN_COMMANDS.includes(name);
|
|
151
|
+
}
|
|
152
|
+
function printBuiltinHelp(appName, name) {
|
|
153
|
+
if (name === 'doctor') {
|
|
154
|
+
process.stdout.write([
|
|
155
|
+
`${appName} doctor [options]`,
|
|
156
|
+
'系统自检 — 检查 Node 版本、配置、网络连通性、认证状态。',
|
|
157
|
+
'',
|
|
158
|
+
'选项:',
|
|
159
|
+
' --verbose 包含网络连通性检查(默认不检查)',
|
|
160
|
+
' --json 以 JSON 格式输出报告',
|
|
161
|
+
].join('\n') + '\n');
|
|
162
|
+
}
|
|
163
|
+
else if (name === 'changelog') {
|
|
164
|
+
process.stdout.write([
|
|
165
|
+
`${appName} changelog [options]`,
|
|
166
|
+
'查看版本变更历史。',
|
|
167
|
+
'',
|
|
168
|
+
'选项:',
|
|
169
|
+
' --limit=<N> 只显示最近 N 个版本',
|
|
170
|
+
' --version=<v> 显示指定版本',
|
|
171
|
+
' --since=<v> 显示从该版本以来的变更',
|
|
172
|
+
' --raw 输出原始 Markdown',
|
|
173
|
+
].join('\n') + '\n');
|
|
174
|
+
}
|
|
175
|
+
else if (name === 'completion') {
|
|
176
|
+
process.stdout.write([
|
|
177
|
+
`${appName} completion [shell]`,
|
|
178
|
+
'生成 shell 补全脚本。支持 bash / zsh / fish。',
|
|
179
|
+
'',
|
|
180
|
+
'用法:',
|
|
181
|
+
` source <(${appName} completion bash) # bash`,
|
|
182
|
+
` source <(${appName} completion zsh) # zsh`,
|
|
183
|
+
` ${appName} completion fish > ~/.config/fish/completions/${appName}.fish # fish`,
|
|
184
|
+
].join('\n') + '\n');
|
|
185
|
+
}
|
|
186
|
+
else if (name === 'update') {
|
|
187
|
+
process.stdout.write([
|
|
188
|
+
`${appName} update [options]`,
|
|
189
|
+
'检查 CLI 更新 + 刷新 skill 文件。',
|
|
190
|
+
'',
|
|
191
|
+
'选项:',
|
|
192
|
+
' --cli-only 只检查 CLI 更新,不刷新 skill',
|
|
193
|
+
' --skill-only 只刷新 skill,不检查 CLI 更新',
|
|
194
|
+
].join('\n') + '\n');
|
|
195
|
+
}
|
|
196
|
+
else if (name === 'doctor' || name === 'install' || name === 'uninstall' || name === 'version') {
|
|
197
|
+
printHelp(appName, []);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
printHelp(appName, []);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ChangelogEntry {
|
|
2
|
+
version: string;
|
|
3
|
+
date: string;
|
|
4
|
+
lines: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ChangelogOptions {
|
|
7
|
+
limit?: number;
|
|
8
|
+
version?: string;
|
|
9
|
+
since?: string;
|
|
10
|
+
raw: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** 解析 CHANGELOG.md 为结构化条目 */
|
|
13
|
+
export declare function parseChangelog(content: string): ChangelogEntry[];
|
|
14
|
+
/** 解析 changelog 命令行参数 */
|
|
15
|
+
export declare function parseChangelogOptions(args: string[]): ChangelogOptions;
|
|
16
|
+
/** 渲染 changelog 到 stdout */
|
|
17
|
+
export declare function runChangelog(args: string[]): void;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
/** 解析 CHANGELOG.md 为结构化条目 */
|
|
5
|
+
export function parseChangelog(content) {
|
|
6
|
+
const entries = [];
|
|
7
|
+
const lines = content.split('\n');
|
|
8
|
+
let current = null;
|
|
9
|
+
for (const line of lines) {
|
|
10
|
+
const headerMatch = line.match(/^##\s+(\S+)\s*-\s*(.+)/);
|
|
11
|
+
if (headerMatch) {
|
|
12
|
+
if (current)
|
|
13
|
+
entries.push(current);
|
|
14
|
+
current = {
|
|
15
|
+
version: headerMatch[1],
|
|
16
|
+
date: headerMatch[2].trim(),
|
|
17
|
+
lines: [],
|
|
18
|
+
};
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (current) {
|
|
22
|
+
current.lines.push(line);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (current)
|
|
26
|
+
entries.push(current);
|
|
27
|
+
return entries;
|
|
28
|
+
}
|
|
29
|
+
/** 解析 changelog 命令行参数 */
|
|
30
|
+
export function parseChangelogOptions(args) {
|
|
31
|
+
const options = { raw: false };
|
|
32
|
+
for (let i = 0; i < args.length; i++) {
|
|
33
|
+
const token = args[i];
|
|
34
|
+
if (token === '--raw') {
|
|
35
|
+
options.raw = true;
|
|
36
|
+
}
|
|
37
|
+
else if (token.startsWith('--limit=')) {
|
|
38
|
+
options.limit = Number(token.slice('--limit='.length));
|
|
39
|
+
}
|
|
40
|
+
else if (token === '--limit') {
|
|
41
|
+
options.limit = Number(args[++i]);
|
|
42
|
+
}
|
|
43
|
+
else if (token.startsWith('--version=')) {
|
|
44
|
+
options.version = token.slice('--version='.length);
|
|
45
|
+
}
|
|
46
|
+
else if (token === '--version') {
|
|
47
|
+
options.version = args[++i];
|
|
48
|
+
}
|
|
49
|
+
else if (token.startsWith('--since=')) {
|
|
50
|
+
options.since = token.slice('--since='.length);
|
|
51
|
+
}
|
|
52
|
+
else if (token === '--since') {
|
|
53
|
+
options.since = args[++i];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return options;
|
|
57
|
+
}
|
|
58
|
+
/** 查找 CHANGELOG.md 文件路径 */
|
|
59
|
+
function findChangelogPath() {
|
|
60
|
+
// 尝试多个位置:dist 附近、项目根目录
|
|
61
|
+
const candidates = [
|
|
62
|
+
join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'CHANGELOG.md'),
|
|
63
|
+
join(process.cwd(), 'CHANGELOG.md'),
|
|
64
|
+
];
|
|
65
|
+
for (const path of candidates) {
|
|
66
|
+
try {
|
|
67
|
+
readFileSync(path, 'utf-8');
|
|
68
|
+
return path;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw new Error('未找到 CHANGELOG.md');
|
|
75
|
+
}
|
|
76
|
+
/** 渲染 changelog 到 stdout */
|
|
77
|
+
export function runChangelog(args) {
|
|
78
|
+
const options = parseChangelogOptions(args);
|
|
79
|
+
const changelogPath = findChangelogPath();
|
|
80
|
+
const raw = readFileSync(changelogPath, 'utf-8');
|
|
81
|
+
if (options.raw) {
|
|
82
|
+
process.stdout.write(raw);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const entries = parseChangelog(raw);
|
|
86
|
+
// 过滤
|
|
87
|
+
let filtered = entries;
|
|
88
|
+
if (options.version) {
|
|
89
|
+
filtered = filtered.filter((e) => e.version === options.version);
|
|
90
|
+
if (filtered.length === 0) {
|
|
91
|
+
throw new Error(`未找到版本 ${options.version}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (options.since) {
|
|
95
|
+
const sinceIndex = filtered.findIndex((e) => e.version === options.since);
|
|
96
|
+
if (sinceIndex === -1) {
|
|
97
|
+
throw new Error(`未找到版本 ${options.since}`);
|
|
98
|
+
}
|
|
99
|
+
filtered = filtered.slice(0, sinceIndex + 1);
|
|
100
|
+
}
|
|
101
|
+
if (options.limit !== undefined) {
|
|
102
|
+
filtered = filtered.slice(0, options.limit);
|
|
103
|
+
}
|
|
104
|
+
// 渲染
|
|
105
|
+
const lines = [];
|
|
106
|
+
for (const entry of filtered) {
|
|
107
|
+
lines.push(`## ${entry.version} - ${entry.date}`);
|
|
108
|
+
for (const line of entry.lines) {
|
|
109
|
+
if (line.trim()) {
|
|
110
|
+
lines.push(line);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
lines.push('');
|
|
114
|
+
}
|
|
115
|
+
process.stdout.write(lines.join('\n'));
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=changelog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/core/changelog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CliCommandDefinition } from './cli-registry.js';
|
|
2
|
+
export declare function getBuiltinCommandNames(): string[];
|
|
3
|
+
/** 格式化 registry 注册命令的执行结果 */
|
|
4
|
+
export declare function formatCommandResult(result: {
|
|
5
|
+
content?: Array<{
|
|
6
|
+
type: 'text';
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}): string;
|
|
10
|
+
/** 打印总帮助 */
|
|
11
|
+
export declare function printHelp(appName: string, commands: CliCommandDefinition[]): void;
|
|
12
|
+
/** 打印单个命令帮助 */
|
|
13
|
+
export declare function printCommandHelp(appName: string, command: CliCommandDefinition): void;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describeSchema } from './cli-registry.js';
|
|
2
|
+
import { CLI_VERSION } from '../version.js';
|
|
3
|
+
export function getBuiltinCommandNames() {
|
|
4
|
+
return ['help', 'install', 'list', 'remove', 'uninstall', 'update', 'version', 'doctor', 'changelog', 'completion'];
|
|
5
|
+
}
|
|
6
|
+
/** 格式化 registry 注册命令的执行结果 */
|
|
7
|
+
export function formatCommandResult(result) {
|
|
8
|
+
const text = result.content?.[0]?.text;
|
|
9
|
+
return text ?? '';
|
|
10
|
+
}
|
|
11
|
+
/** 打印总帮助 */
|
|
12
|
+
export function printHelp(appName, commands) {
|
|
13
|
+
const lines = [
|
|
14
|
+
`${appName} v${CLI_VERSION}`,
|
|
15
|
+
'',
|
|
16
|
+
'用法:',
|
|
17
|
+
` ${appName} <command> [options]`,
|
|
18
|
+
` ${appName} help <command>`,
|
|
19
|
+
` npx ${appName} <command> [options]`,
|
|
20
|
+
'',
|
|
21
|
+
'内置命令:',
|
|
22
|
+
' help 显示帮助信息',
|
|
23
|
+
' list 列出所有命令',
|
|
24
|
+
' version 显示版本号',
|
|
25
|
+
' install 安装 CLI(配置 + skill)',
|
|
26
|
+
' update 检查更新 + 刷新 skill',
|
|
27
|
+
' remove 卸载 CLI(skill + 配置)',
|
|
28
|
+
' uninstall 卸载 CLI(skill + 配置)',
|
|
29
|
+
' doctor 系统自检',
|
|
30
|
+
' changelog 查看版本变更',
|
|
31
|
+
' completion 生成 shell 补全脚本',
|
|
32
|
+
'',
|
|
33
|
+
'业务命令:',
|
|
34
|
+
];
|
|
35
|
+
if (commands.length === 0) {
|
|
36
|
+
lines.push(' (暂无)');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const command of commands) {
|
|
40
|
+
lines.push(` ${command.name.padEnd(24)}${command.description ?? ''}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (commands.length > 0) {
|
|
44
|
+
lines.push('');
|
|
45
|
+
lines.push(`共 ${commands.length} 个业务命令。使用 \`${appName} help <command>\` 查看参数详情。`);
|
|
46
|
+
}
|
|
47
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
48
|
+
}
|
|
49
|
+
/** 打印单个命令帮助 */
|
|
50
|
+
export function printCommandHelp(appName, command) {
|
|
51
|
+
const schemaRows = describeSchema(command.schema).map((field) => {
|
|
52
|
+
const requiredLabel = field.required ? '必填' : '可选';
|
|
53
|
+
const description = field.description ? `:${field.description}` : '';
|
|
54
|
+
return ` --${field.name} <${field.type}> (${requiredLabel})${description}`;
|
|
55
|
+
});
|
|
56
|
+
const lines = [
|
|
57
|
+
`${appName} ${command.name}`,
|
|
58
|
+
command.description ?? '',
|
|
59
|
+
'',
|
|
60
|
+
'参数:',
|
|
61
|
+
...(schemaRows.length > 0 ? schemaRows : [' (暂无参数)']),
|
|
62
|
+
];
|
|
63
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=cli-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/core/cli-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z, type ZodRawShape } from 'zod';
|
|
2
|
+
export interface JsonContentResult {
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
content: Array<{
|
|
5
|
+
type: 'text';
|
|
6
|
+
text: string;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export type CliHandler<TInput extends Record<string, unknown> = Record<string, unknown>> = (input: TInput) => Promise<JsonContentResult> | JsonContentResult;
|
|
10
|
+
export interface CliCommandMetadata {
|
|
11
|
+
costHint?: 'low' | 'medium' | 'high';
|
|
12
|
+
nextBestTools?: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface CliCommandDefinition<TInput extends Record<string, unknown> = Record<string, unknown>> {
|
|
15
|
+
name: string;
|
|
16
|
+
schema: ZodRawShape;
|
|
17
|
+
handler: CliHandler<any>;
|
|
18
|
+
description?: string;
|
|
19
|
+
metadata?: CliCommandMetadata;
|
|
20
|
+
}
|
|
21
|
+
export interface CliRegistry {
|
|
22
|
+
tool<TShape extends ZodRawShape>(name: string, schema: TShape, handler: CliHandler<z.infer<z.ZodObject<TShape>>>, description?: string, metadata?: CliCommandMetadata): void;
|
|
23
|
+
getCommand(name: string): CliCommandDefinition | undefined;
|
|
24
|
+
listCommands(): CliCommandDefinition[];
|
|
25
|
+
}
|
|
26
|
+
export declare class InMemoryCliRegistry implements CliRegistry {
|
|
27
|
+
private readonly commands;
|
|
28
|
+
tool<TShape extends ZodRawShape>(name: string, schema: TShape, handler: CliHandler<z.infer<z.ZodObject<TShape>>>, description?: string, metadata?: CliCommandMetadata): void;
|
|
29
|
+
getCommand(name: string): CliCommandDefinition | undefined;
|
|
30
|
+
listCommands(): CliCommandDefinition[];
|
|
31
|
+
}
|
|
32
|
+
export declare function describeSchema(schema: ZodRawShape): Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
required: boolean;
|
|
35
|
+
type: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function parseCommandInput<TShape extends ZodRawShape>(schema: TShape, args: string[]): z.infer<z.ZodObject<TShape>>;
|