@cloudglab/zentao-cli 0.1.4 → 0.1.6
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 +38 -0
- package/README.md +139 -257
- package/dist/api/execution.d.ts +33 -0
- package/dist/api/execution.js +363 -0
- package/dist/api/execution.js.map +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/statistics.d.ts +38 -1
- package/dist/api/statistics.js +307 -1
- package/dist/api/statistics.js.map +1 -1
- package/dist/api/task.js +24 -5
- package/dist/api/task.js.map +1 -1
- package/dist/cli.js +21 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/http.d.ts +1 -0
- package/dist/core/http.js +26 -0
- package/dist/core/http.js.map +1 -1
- package/dist/core/roles.js +1 -1
- package/dist/core/roles.js.map +1 -1
- package/dist/install.d.ts +2 -0
- package/dist/install.js +206 -0
- package/dist/install.js.map +1 -0
- package/dist/tools/execution.js +8 -0
- package/dist/tools/execution.js.map +1 -1
- package/dist/tools/statistics.js +8 -0
- package/dist/tools/statistics.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +10 -3
- package/skills/zentao-cli/SKILL.md +185 -0
- package/skills/zentao-cli/reference/bug.md +93 -0
- package/skills/zentao-cli/reference/build.md +21 -0
- package/skills/zentao-cli/reference/cli.md +25 -0
- package/skills/zentao-cli/reference/execution.md +38 -0
- package/skills/zentao-cli/reference/install.md +90 -0
- package/skills/zentao-cli/reference/overview.md +24 -0
- package/skills/zentao-cli/reference/plan.md +20 -0
- package/skills/zentao-cli/reference/product.md +14 -0
- package/skills/zentao-cli/reference/project.md +14 -0
- package/skills/zentao-cli/reference/statistics.md +30 -0
- package/skills/zentao-cli/reference/story.md +22 -0
- package/skills/zentao-cli/reference/task.md +21 -0
- package/skills/zentao-cli/reference/testcase.md +20 -0
- package/skills/zentao-cli/reference/testtask.md +20 -0
package/dist/install.js
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import readline from 'node:readline';
|
|
6
|
+
import { ZentaoApi } from './api/index.js';
|
|
7
|
+
import { loadConfig, maskConfig, normalizeConfig, saveConfig } from './core/config.js';
|
|
8
|
+
const PACKAGE_NAME = '@cloudglab/zentao-cli';
|
|
9
|
+
const GIT_SKILL_SOURCE = 'cloudglab/zentao-cli';
|
|
10
|
+
export async function runInstallCommand(args = []) {
|
|
11
|
+
await installPackageAndSkill('安装', parseInstallOptions(args));
|
|
12
|
+
await ensureValidZentaoConfig();
|
|
13
|
+
process.stdout.write('安装完成,禅道配置校验通过。\n');
|
|
14
|
+
}
|
|
15
|
+
export async function runUpdateCommand(args = []) {
|
|
16
|
+
await installPackageAndSkill('更新', parseInstallOptions(args));
|
|
17
|
+
await ensureValidZentaoConfig();
|
|
18
|
+
process.stdout.write('更新完成,禅道配置校验通过。\n');
|
|
19
|
+
}
|
|
20
|
+
function parseInstallOptions(args) {
|
|
21
|
+
let skillSource = 'git';
|
|
22
|
+
let skillLocalPath;
|
|
23
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
24
|
+
const arg = args[index];
|
|
25
|
+
if (arg === '--skill-source') {
|
|
26
|
+
const value = args[index + 1];
|
|
27
|
+
if (value !== 'git' && value !== 'npm') {
|
|
28
|
+
throw new Error('--skill-source 只支持 git 或 npm');
|
|
29
|
+
}
|
|
30
|
+
skillSource = value;
|
|
31
|
+
index += 1;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (arg === '--skill-local-path') {
|
|
35
|
+
const value = args[index + 1];
|
|
36
|
+
if (!value) {
|
|
37
|
+
throw new Error('--skill-local-path 需要传入本地目录路径');
|
|
38
|
+
}
|
|
39
|
+
skillLocalPath = value;
|
|
40
|
+
index += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`未知安装参数: ${arg}`);
|
|
44
|
+
}
|
|
45
|
+
return { skillSource, skillLocalPath };
|
|
46
|
+
}
|
|
47
|
+
async function installPackageAndSkill(action, options) {
|
|
48
|
+
await runStep(`${action} zentao CLI`, 'npm', ['install', '-g', `${PACKAGE_NAME}@latest`]);
|
|
49
|
+
await installSkill(action, options);
|
|
50
|
+
}
|
|
51
|
+
async function installSkill(action, options) {
|
|
52
|
+
if (options.skillLocalPath) {
|
|
53
|
+
await runStep(`${action} zentao skill`, 'npx', ['-y', 'skills', 'add', '-g', path.resolve(options.skillLocalPath)]);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (options.skillSource === 'git') {
|
|
57
|
+
await runStep(`${action} zentao skill`, 'npx', ['-y', 'skills', 'add', '-g', GIT_SKILL_SOURCE]);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await installSkillFromNpmPackage(action);
|
|
61
|
+
}
|
|
62
|
+
async function installSkillFromNpmPackage(action) {
|
|
63
|
+
const tempDir = await mkdtemp(path.join(os.tmpdir(), 'zentao-cli-skill-'));
|
|
64
|
+
try {
|
|
65
|
+
const stdout = await runCommandOutput('npm', ['pack', `${PACKAGE_NAME}@latest`, '--pack-destination', tempDir, '--silent']);
|
|
66
|
+
const tarballName = stdout.trim().split('\n').filter(Boolean).at(-1);
|
|
67
|
+
if (!tarballName) {
|
|
68
|
+
throw new Error('npm pack 没有返回包文件名');
|
|
69
|
+
}
|
|
70
|
+
const tarballPath = path.join(tempDir, tarballName);
|
|
71
|
+
await runStep('解压 zentao npm 包', 'tar', ['-xzf', tarballPath, '-C', tempDir]);
|
|
72
|
+
await runStep(`${action} zentao skill`, 'npx', ['-y', 'skills', 'add', '-g', path.join(tempDir, 'package')]);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function runStep(title, command, args) {
|
|
79
|
+
process.stdout.write(`\n${title}...\n`);
|
|
80
|
+
await runCommand(command, args);
|
|
81
|
+
}
|
|
82
|
+
function runCommand(command, args) {
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const child = spawn(command, args, { stdio: 'inherit', shell: process.platform === 'win32' });
|
|
85
|
+
child.on('error', reject);
|
|
86
|
+
child.on('close', (code) => {
|
|
87
|
+
if (code === 0) {
|
|
88
|
+
resolve();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
reject(new Error(`${command} ${args.join(' ')} 执行失败,退出码 ${String(code)}`));
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function runCommandOutput(command, args) {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
const child = spawn(command, args, { shell: process.platform === 'win32' });
|
|
98
|
+
let stdout = '';
|
|
99
|
+
let stderr = '';
|
|
100
|
+
child.stdout?.on('data', (chunk) => {
|
|
101
|
+
stdout += chunk.toString('utf8');
|
|
102
|
+
});
|
|
103
|
+
child.stderr?.on('data', (chunk) => {
|
|
104
|
+
stderr += chunk.toString('utf8');
|
|
105
|
+
});
|
|
106
|
+
child.on('error', reject);
|
|
107
|
+
child.on('close', (code) => {
|
|
108
|
+
if (code === 0) {
|
|
109
|
+
resolve(stdout);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
reject(new Error(`${command} ${args.join(' ')} 执行失败,退出码 ${String(code)}${stderr ? `:${stderr.trim()}` : ''}`));
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async function ensureValidZentaoConfig() {
|
|
117
|
+
const existing = tryLoadConfig();
|
|
118
|
+
if (existing && await validateConfig(existing)) {
|
|
119
|
+
process.stdout.write(`\n检测到已有禅道配置,校验通过:${JSON.stringify(maskConfig(existing))}\n`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (existing) {
|
|
123
|
+
process.stdout.write('\n检测到已有禅道配置,但登录校验失败,请重新输入。\n');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
process.stdout.write('\n未检测到可用禅道配置,请输入配置。\n');
|
|
127
|
+
}
|
|
128
|
+
const config = await promptForConfig(existing ?? undefined);
|
|
129
|
+
await validateConfigOrThrow(config);
|
|
130
|
+
saveConfig(config);
|
|
131
|
+
process.stdout.write(`已保存禅道配置:${JSON.stringify(maskConfig(config))}\n`);
|
|
132
|
+
if (hasZentaoEnvConfig()) {
|
|
133
|
+
process.stdout.write('提示:当前 shell 存在 ZENTAO_* 环境变量,后续命令会优先使用环境变量;如果仍登录失败,请同步更新或清除这些环境变量。\n');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function tryLoadConfig() {
|
|
137
|
+
try {
|
|
138
|
+
return loadConfig();
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function hasZentaoEnvConfig() {
|
|
145
|
+
return Boolean(process.env.ZENTAO_URL || process.env.ZENTAO_USERNAME || process.env.ZENTAO_ACCOUNT || process.env.ZENTAO_PASSWORD || process.env.ZENTAO_API_BASE_URL);
|
|
146
|
+
}
|
|
147
|
+
async function validateConfig(config) {
|
|
148
|
+
try {
|
|
149
|
+
await validateConfigOrThrow(config);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function validateConfigOrThrow(config) {
|
|
157
|
+
const api = new ZentaoApi(config);
|
|
158
|
+
await api.getToken();
|
|
159
|
+
}
|
|
160
|
+
async function promptForConfig(defaults) {
|
|
161
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
162
|
+
throw new Error('当前不是交互式终端,无法输入配置。请先设置 ZENTAO_URL、ZENTAO_USERNAME、ZENTAO_PASSWORD 后重试。');
|
|
163
|
+
}
|
|
164
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
165
|
+
try {
|
|
166
|
+
const url = await ask(rl, '禅道地址', defaults?.url);
|
|
167
|
+
const username = await ask(rl, '禅道用户名', defaults?.username);
|
|
168
|
+
const password = await askPassword(rl, defaults?.password ? '禅道密码(直接回车保留原密码)' : '禅道密码');
|
|
169
|
+
const apiVersion = await ask(rl, 'API 版本', defaults?.apiVersion ?? 'v1');
|
|
170
|
+
const apiBaseUrl = await ask(rl, 'API 基础地址(可选,直接回车跳过)', defaults?.apiBaseUrl ?? '');
|
|
171
|
+
return normalizeConfig({
|
|
172
|
+
url,
|
|
173
|
+
username,
|
|
174
|
+
password: password || defaults?.password,
|
|
175
|
+
apiVersion,
|
|
176
|
+
apiBaseUrl: apiBaseUrl || undefined,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
rl.close();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function ask(rl, label, defaultValue = '') {
|
|
184
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : '';
|
|
185
|
+
return new Promise((resolve) => {
|
|
186
|
+
rl.question(`${label}${suffix}: `, (answer) => resolve(answer.trim() || defaultValue));
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function askPassword(rl, label) {
|
|
190
|
+
const mutableRl = rl;
|
|
191
|
+
return new Promise((resolve) => {
|
|
192
|
+
mutableRl.stdoutMuted = true;
|
|
193
|
+
mutableRl.question(`${label}: `, (answer) => {
|
|
194
|
+
mutableRl.stdoutMuted = false;
|
|
195
|
+
process.stdout.write('\n');
|
|
196
|
+
resolve(answer.trim());
|
|
197
|
+
});
|
|
198
|
+
if (!mutableRl._writeToOutput)
|
|
199
|
+
return;
|
|
200
|
+
const originalWrite = mutableRl._writeToOutput.bind(rl);
|
|
201
|
+
mutableRl._writeToOutput = (value) => {
|
|
202
|
+
originalWrite(mutableRl.stdoutMuted ? '*' : value);
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGvF,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAShD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiB,EAAE;IACzD,MAAM,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,uBAAuB,EAAE,CAAC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAiB,EAAE;IACxD,MAAM,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,uBAAuB,EAAE,CAAC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAc;IACzC,IAAI,WAAW,GAAgB,KAAK,CAAC;IACrC,IAAI,cAAkC,CAAC;IAEvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;YACpB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,oBAAoB,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,cAAc,GAAG,KAAK,CAAC;YACvB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,MAAmB,EAAE,OAAuB;IAChF,MAAM,OAAO,CAAC,GAAG,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,YAAY,SAAS,CAAC,CAAC,CAAC;IAC1F,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAmB,EAAE,OAAuB;IACtE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,GAAG,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACpH,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAClC,MAAM,OAAO,CAAC,GAAG,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAChG,OAAO;IACT,CAAC;IAED,MAAM,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAmB;IAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,YAAY,SAAS,EAAE,oBAAoB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5H,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,OAAO,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,CAAC,GAAG,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/G,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,OAAe,EAAE,IAAc;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAAc;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;QAE9F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,IAAc;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;QAC5E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,uBAAuB;IACpC,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,QAAQ,IAAI,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;IAC5D,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACxK,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAoB;IAChD,IAAI,CAAC;QACH,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAoB;IACvD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAuB;IACpD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxF,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,qBAAqB,EAAE,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAEpF,OAAO,eAAe,CAAC;YACrB,GAAG;YACH,QAAQ;YACR,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ;YACxC,UAAU;YACV,UAAU,EAAE,UAAU,IAAI,SAAS;SACpC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,EAAsB,EAAE,KAAa,EAAE,YAAY,GAAG,EAAE;IACnE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,EAAsB,EAAE,KAAa;IACxD,MAAM,SAAS,GAAG,EAA8F,CAAC;IACjH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;QAC7B,SAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,SAAS,CAAC,WAAW,GAAG,KAAK,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,cAAc;YAAE,OAAO;QACtC,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,SAAS,CAAC,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE;YAC3C,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools/execution.js
CHANGED
|
@@ -5,6 +5,9 @@ export function registerExecutionTools(server) {
|
|
|
5
5
|
server.tool('getExecutionDetail', {
|
|
6
6
|
executionId: z.number().int().positive(),
|
|
7
7
|
}, async ({ executionId }) => jsonResult(await getApi().execution.getExecutionDetail(executionId)));
|
|
8
|
+
server.tool('getExecutionDynamic', {
|
|
9
|
+
executionId: z.number().int().positive(),
|
|
10
|
+
}, async ({ executionId }) => jsonResult(await getApi().execution.getExecutionDynamic(executionId)));
|
|
8
11
|
server.tool('getProjectExecutions', {
|
|
9
12
|
projectId: z.number().int().positive(),
|
|
10
13
|
}, async ({ projectId }) => jsonResult(await getApi().execution.getProjectExecutions(projectId)));
|
|
@@ -17,5 +20,10 @@ export function registerExecutionTools(server) {
|
|
|
17
20
|
limit: z.number().int().positive().max(100).optional(),
|
|
18
21
|
status: z.string().optional().describe('可选,按禅道接口支持的状态过滤'),
|
|
19
22
|
}, async ({ executionId, page, limit, status }) => jsonResult(await getApi().execution.getExecutionBugs(executionId, { page, limit, status })));
|
|
23
|
+
server.tool('getExecutionDailyBugStats', {
|
|
24
|
+
executionId: z.number().int().positive(),
|
|
25
|
+
iterationName: z.string().optional().describe('输出报告里的迭代名称,例如 1.2.3迭代。'),
|
|
26
|
+
date: z.string().optional().describe('统计日期,默认今天。支持 today/今天/yesterday/昨天/YYYY-MM-DD。'),
|
|
27
|
+
}, async ({ executionId, iterationName, date }) => jsonResult(await getApi().execution.getExecutionDailyBugStats(executionId, { iterationName, date })));
|
|
20
28
|
}
|
|
21
29
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/tools/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAChG,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACvC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAC9F,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAChG,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KAC1D,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAC5I,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/tools/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/statistics.js
CHANGED
|
@@ -6,5 +6,13 @@ export function registerStatisticsTools(server) {
|
|
|
6
6
|
server.tool('getMyBugStatistics', {
|
|
7
7
|
productId: z.number().int().positive().optional().describe('可选。禅道产品 ID。不传时统计跨所有产品指派给我的 Bug;传入时收窄到指定产品。'),
|
|
8
8
|
}, async ({ productId }) => jsonResult(await getApi().statistics.getMyBugStatistics(productId)));
|
|
9
|
+
server.tool('getMyWeeklyActivity', {
|
|
10
|
+
account: z.string().min(1).describe('禅道账号,例如 lixm1。'),
|
|
11
|
+
week: z.enum(['last', 'this']).optional().default('last').describe('统计哪一周:last=上周,this=本周。'),
|
|
12
|
+
dateRange: z.string().optional().describe('自然语言日期范围,例如:上周、本周、今天、昨天、最近3天、3天前、2026-05-28、2026-05-25到2026-05-29。传入后优先于 week。'),
|
|
13
|
+
startDate: z.string().optional().describe('开始日期,例如 2026-05-25。和 endDate 搭配时优先于 week。'),
|
|
14
|
+
endDate: z.string().optional().describe('结束日期,例如 2026-05-29。和 startDate 搭配时优先于 week。'),
|
|
15
|
+
days: z.number().int().positive().optional().describe('最近 N 天,例如 3 表示最近3天。优先于 week,低于 startDate/endDate。'),
|
|
16
|
+
}, async ({ account, week, dateRange, startDate, endDate, days }) => jsonResult(await getApi().statistics.getMyWeeklyActivity({ account, week, dateRange, startDate, endDate, days })));
|
|
9
17
|
}
|
|
10
18
|
//# sourceMappingURL=statistics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../src/tools/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,MAAmB;IACzD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IAEhH,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACzG,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAC7F,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../src/tools/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,MAAmB;IACzD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IAEhH,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACzG,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAC7F,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACrD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC5F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gFAAgF,CAAC;QAC3H,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACtF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACtF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC3G,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACpL,CAAC;AACJ,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.6";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const CLI_VERSION = '0.1.
|
|
1
|
+
export const CLI_VERSION = '0.1.6';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudglab/zentao-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "ZenTao CLI rebuilt for ZenTao 18.5 REST v1 API",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
20
|
"dist",
|
|
21
|
+
"skills",
|
|
21
22
|
"README.md",
|
|
22
23
|
"CHANGELOG.md",
|
|
23
24
|
"MCP_ZENTAO_REBUILD_PLAN.md"
|
|
@@ -26,7 +27,10 @@
|
|
|
26
27
|
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
27
28
|
"dev": "tsx src/bin/zentao.ts",
|
|
28
29
|
"lint": "oxlint src",
|
|
29
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
30
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
31
|
+
"test": "vitest run --passWithNoTests",
|
|
32
|
+
"check": "pnpm lint && pnpm typecheck && pnpm test && pnpm build",
|
|
33
|
+
"prepare": "lefthook install"
|
|
30
34
|
},
|
|
31
35
|
"dependencies": {
|
|
32
36
|
"axios": "^1.13.2",
|
|
@@ -34,9 +38,12 @@
|
|
|
34
38
|
},
|
|
35
39
|
"devDependencies": {
|
|
36
40
|
"@types/node": "^20.19.25",
|
|
41
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
42
|
+
"lefthook": "^2.1.9",
|
|
37
43
|
"oxlint": "^1.31.0",
|
|
38
44
|
"tsx": "^4.20.6",
|
|
39
|
-
"typescript": "^5.9.3"
|
|
45
|
+
"typescript": "^5.9.3",
|
|
46
|
+
"vitest": "^4.1.8"
|
|
40
47
|
},
|
|
41
48
|
"engines": {
|
|
42
49
|
"node": ">=16.0.0"
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zentao-cli
|
|
3
|
+
description: 禅道 CLI 技能包
|
|
4
|
+
triggers:
|
|
5
|
+
- zentao
|
|
6
|
+
- 禅道
|
|
7
|
+
- bug
|
|
8
|
+
- task
|
|
9
|
+
- testcase
|
|
10
|
+
- testtask
|
|
11
|
+
argument-hint: "[command]"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# @cloudglab/zentao-cli
|
|
15
|
+
|
|
16
|
+
## 概览
|
|
17
|
+
|
|
18
|
+
把禅道能力暴露给命令行 / 智能体使用,默认带写保护。
|
|
19
|
+
|
|
20
|
+
建议把它当成一个“命令行技能包”:先安装,再按 `reference/` 文档执行。
|
|
21
|
+
|
|
22
|
+
## 入口优先级
|
|
23
|
+
|
|
24
|
+
1. 本机已安装 `zentao`:直接执行
|
|
25
|
+
2. 未安装时:先 `npm i -g @cloudglab/zentao-cli@latest`
|
|
26
|
+
3. 如果当前环境不方便安装,再临时用 `npx -y @cloudglab/zentao-cli@latest`
|
|
27
|
+
4. 需要固定版本:全局安装后再运行
|
|
28
|
+
5. 默认只 preview;写操作必须显式确认
|
|
29
|
+
|
|
30
|
+
## Bug 查询强制判断
|
|
31
|
+
|
|
32
|
+
在调用任何 Bug 查询工具或产品查询工具前,先判断用户问的是:
|
|
33
|
+
|
|
34
|
+
1. 普通禅道产品 Bug
|
|
35
|
+
2. 真实业务产品的线上 Bug / 生产问题 / 客户反馈问题
|
|
36
|
+
|
|
37
|
+
如果用户表达了以下任一意图,必须走“线上 Bug 查询口径”:
|
|
38
|
+
|
|
39
|
+
- `<产品名> 最近一周有哪些线上 bug`
|
|
40
|
+
- `<产品名> 有哪些线上问题`
|
|
41
|
+
- `<产品名> 生产环境问题`
|
|
42
|
+
- `<产品名> 客户反馈问题`
|
|
43
|
+
- `<产品名> 售后反馈 Bug`
|
|
44
|
+
- `<产品名> 线上报错`
|
|
45
|
+
|
|
46
|
+
这类场景里,用户说的 `<产品名>` 是真实业务产品 / 模块名,不是禅道产品名。
|
|
47
|
+
|
|
48
|
+
禁止:
|
|
49
|
+
|
|
50
|
+
- 直接用这个 `<产品名>` 去匹配禅道产品
|
|
51
|
+
- 先解释“找到了 `<产品名>` 对应的禅道产品”
|
|
52
|
+
|
|
53
|
+
只有当用户明确说“查某个禅道产品下的 Bug”,或上下文明显不是线上 / 生产 / 客户反馈问题时,才按普通产品 Bug 查询。
|
|
54
|
+
|
|
55
|
+
### 线上 Bug 固定查询口径
|
|
56
|
+
|
|
57
|
+
公司线上 Bug 统一挂在禅道产品 **`市场和售后问题跟踪`** 下,再通过 Bug 模块区分真实业务产品。
|
|
58
|
+
|
|
59
|
+
固定流程:
|
|
60
|
+
|
|
61
|
+
1. 先 `getProducts`
|
|
62
|
+
2. 找到名称为 `市场和售后问题跟踪` 的产品
|
|
63
|
+
3. 用该产品 ID 调 `getProductBugs`
|
|
64
|
+
4. 必要时继续分页
|
|
65
|
+
5. 用 `module` / `moduleName` / `modulePath` / `path`,以及标题、关键词等字段匹配真实业务产品
|
|
66
|
+
|
|
67
|
+
输出必须说明:
|
|
68
|
+
|
|
69
|
+
- 查询的是固定禅道产品:`市场和售后问题跟踪`
|
|
70
|
+
- 真实业务产品是通过模块匹配出来的
|
|
71
|
+
- 匹配到的模块名 / 模块路径
|
|
72
|
+
- 查询页数和候选 Bug 数
|
|
73
|
+
- 未关闭线上 Bug、近期已解决线上 Bug、无法确认归属的疑似 Bug
|
|
74
|
+
|
|
75
|
+
## 安装 / 更新
|
|
76
|
+
|
|
77
|
+
一键安装 CLI + skill,并校验禅道配置:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npx -y @cloudglab/zentao-cli@latest install
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
不能访问远程 `.git` 仓库但可以访问 npm 时:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npx -y @cloudglab/zentao-cli@latest install --skill-source npm
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
已经提前下载并解压 npm 静态包时:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
zentao install --skill-local-path ./package
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
更新 CLI + skill:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
zentao update
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm i -g @cloudglab/zentao-cli@latest
|
|
103
|
+
zentao --version
|
|
104
|
+
npx -y @cloudglab/zentao-cli@latest --help
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
安装 skill:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npx -y skills add -g cloudglab/zentao-cli
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
只能访问 npm 时:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npm pack @cloudglab/zentao-cli@latest
|
|
117
|
+
tar -xzf cloudglab-zentao-cli-*.tgz
|
|
118
|
+
npx -y skills add -g ./package
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
检查是否已安装:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
command -v zentao
|
|
125
|
+
zentao --version
|
|
126
|
+
zentao version
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 启动方式
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
zentao help
|
|
133
|
+
zentao list
|
|
134
|
+
zentao version
|
|
135
|
+
zentao --role qa getMyBugs --limit 50
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
或直接:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npx -y @cloudglab/zentao-cli@latest
|
|
142
|
+
npx -y @cloudglab/zentao-cli@latest --role qa
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 文档入口
|
|
146
|
+
|
|
147
|
+
- `reference/overview.md`
|
|
148
|
+
- `reference/install.md`
|
|
149
|
+
- `reference/cli.md`
|
|
150
|
+
- `reference/task.md`
|
|
151
|
+
- `reference/bug.md`
|
|
152
|
+
- `reference/story.md`
|
|
153
|
+
- `reference/execution.md`
|
|
154
|
+
- `reference/build.md`
|
|
155
|
+
- `reference/testcase.md`
|
|
156
|
+
- `reference/testtask.md`
|
|
157
|
+
- `reference/plan.md`
|
|
158
|
+
- `reference/product.md`
|
|
159
|
+
- `reference/project.md`
|
|
160
|
+
- `reference/statistics.md`
|
|
161
|
+
|
|
162
|
+
## 典型能力
|
|
163
|
+
|
|
164
|
+
- 查任务、Bug、需求、项目、执行、构建
|
|
165
|
+
- 创建 / 更新任务、构建、测试用例、测试单
|
|
166
|
+
- 从 Bug 派生任务
|
|
167
|
+
- 生成统计和开发上下文
|
|
168
|
+
|
|
169
|
+
## 写保护
|
|
170
|
+
|
|
171
|
+
默认不写入线上。
|
|
172
|
+
真实写操作需要同时满足:
|
|
173
|
+
|
|
174
|
+
- `ZENTAO_ENABLE_WRITE=true`
|
|
175
|
+
- `confirm=true`
|
|
176
|
+
|
|
177
|
+
## 运行时要求
|
|
178
|
+
|
|
179
|
+
- 发布产物:`Node.js >= 16`
|
|
180
|
+
- 开发 / 构建环境可以高于 16
|
|
181
|
+
|
|
182
|
+
## 适用场景
|
|
183
|
+
|
|
184
|
+
- 命令行手工操作禅道
|
|
185
|
+
- 智能体自动化调用
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Bug
|
|
2
|
+
|
|
3
|
+
## 强制判断
|
|
4
|
+
|
|
5
|
+
在调用任何 Bug 查询工具或产品查询工具前,先判断用户问的是普通禅道产品 Bug,还是线上 Bug。
|
|
6
|
+
|
|
7
|
+
如果用户表达了以下任一意图,就必须走“线上 Bug 查询口径”:
|
|
8
|
+
|
|
9
|
+
- `<产品名> 最近一周有哪些线上 bug`
|
|
10
|
+
- `<产品名> 有哪些线上问题`
|
|
11
|
+
- `<产品名> 生产环境问题`
|
|
12
|
+
- `<产品名> 客户反馈问题`
|
|
13
|
+
- `<产品名> 售后反馈 Bug`
|
|
14
|
+
- `<产品名> 线上报错`
|
|
15
|
+
|
|
16
|
+
线上 Bug 场景中,用户说的 `<产品名>` 是真实业务产品 / 模块名,不是禅道产品名。禁止直接用这个 `<产品名>` 去匹配禅道产品,也不要先解释“找到了 `<产品名>` 对应的禅道产品”。
|
|
17
|
+
|
|
18
|
+
只有当用户明确说“查某个禅道产品下的 Bug”或上下文不是线上 / 生产 / 客户反馈问题时,才按普通产品 Bug 查询。
|
|
19
|
+
|
|
20
|
+
## 线上 Bug 查询口径
|
|
21
|
+
|
|
22
|
+
公司线上 Bug 不按真实业务产品分别挂在各自产品下管理。所有产品的线上 Bug 统一放在禅道产品 **`市场和售后问题跟踪`** 下,再通过 Bug 的模块区分真实业务产品。
|
|
23
|
+
|
|
24
|
+
正确流程:
|
|
25
|
+
|
|
26
|
+
1. 调用 `getProducts`,找到名称为 **`市场和售后问题跟踪`** 的产品,确认它的 `productId`
|
|
27
|
+
2. 调用 `getProductBugs` 查询这个固定产品下的 Bug:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
zentao getProductBugs --productId <市场和售后问题跟踪产品ID> --status all --limit 100 --order id_desc
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
3. 如果结果不足,继续分页:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
zentao getProductBugs --productId <市场和售后问题跟踪产品ID> --status all --page 2 --limit 100 --order id_desc
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
4. 在返回结果中,用用户提到的真实产品名匹配 Bug 的模块字段,例如 `module`、`moduleName`、`modulePath`、`path`,以及标题、关键词等补充字段。
|
|
40
|
+
5. 如果用户没有指定状态,默认同时看未关闭和近期已解决的 Bug;输出时优先展示未关闭 / 激活 / 待处理问题。
|
|
41
|
+
6. 如果用户问“最近”,优先用 `openedDate`、`editedDate`、`assignedDate`、`resolvedDate`、`closedDate` 等时间字段判断;缺少时间字段时,说明只能按 `id_desc` 近似代表最近。
|
|
42
|
+
|
|
43
|
+
输出必须说明:
|
|
44
|
+
|
|
45
|
+
- 查询的是固定禅道产品:`市场和售后问题跟踪`
|
|
46
|
+
- 真实业务产品是通过模块匹配出来的
|
|
47
|
+
- 匹配到的模块名 / 模块路径
|
|
48
|
+
- 查询页数和候选 Bug 数
|
|
49
|
+
- 未关闭线上 Bug、近期已解决线上 Bug、无法确认是否属于该产品的疑似 Bug
|
|
50
|
+
|
|
51
|
+
如果没有结果,不要直接说“产品没有 Bug”。应说明“在 `市场和售后问题跟踪` 产品下,未通过模块匹配到该真实业务产品的线上 Bug”,并建议扩大模块关键词或确认模块命名。
|
|
52
|
+
|
|
53
|
+
## 查询
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
zentao getBugDetail --bugId <id>
|
|
57
|
+
zentao getMyBugs
|
|
58
|
+
zentao getMyBugs --productId <productId>
|
|
59
|
+
zentao getProductBugs --productId <productId>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 写入
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
zentao resolveBug --bugId <id> --resolution fixed --confirm true
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 场景
|
|
69
|
+
|
|
70
|
+
- 看我的 Bug
|
|
71
|
+
- 解决 Bug
|
|
72
|
+
- 查看产品 Bug 列表
|
|
73
|
+
- 查看某个真实业务产品的线上 Bug
|
|
74
|
+
|
|
75
|
+
说明:
|
|
76
|
+
|
|
77
|
+
- `getMyBugs` 不传 `productId` 时,默认查跨所有产品“指派给我的 Bug”
|
|
78
|
+
- 传 `productId` 时,只查指定产品内我的 Bug
|
|
79
|
+
|
|
80
|
+
## 线上 Bug 固定场景
|
|
81
|
+
|
|
82
|
+
- `<产品名> 最近一周有哪些线上 bug`
|
|
83
|
+
- `<产品名> 有哪些线上问题`
|
|
84
|
+
- `<产品名> 生产环境问题`
|
|
85
|
+
- `<产品名> 客户反馈问题`
|
|
86
|
+
- `<产品名> 售后反馈 Bug`
|
|
87
|
+
- `<产品名> 线上报错`
|
|
88
|
+
|
|
89
|
+
## 普通产品 Bug 场景
|
|
90
|
+
|
|
91
|
+
- 查某个禅道产品下的 Bug
|
|
92
|
+
- 查看禅道产品 `<产品名>` 的 Bug
|
|
93
|
+
- 看产品ID `<id>` 下的 Bug
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Build
|
|
2
|
+
|
|
3
|
+
## 查询
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
zentao getProjectBuilds --projectId <projectId>
|
|
7
|
+
zentao getBuildDetail --buildId <id>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## 写入
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
zentao createBuild --project <projectId> --execution <executionId> --product <productId> --name <name> --builder <user> --confirm true
|
|
14
|
+
zentao updateBuild --buildId <id> --confirm true
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 场景
|
|
18
|
+
|
|
19
|
+
- 创建版本
|
|
20
|
+
- 更新版本信息
|
|
21
|
+
- 查看项目版本列表
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# CLI 参考
|
|
2
|
+
|
|
3
|
+
## 启动
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
zentao help
|
|
7
|
+
zentao list
|
|
8
|
+
zentao --role qa getMyBugs --limit 50
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 常见参数
|
|
12
|
+
|
|
13
|
+
- `--role full|dev|pm|qa`
|
|
14
|
+
- `--version`
|
|
15
|
+
|
|
16
|
+
## 常见形式
|
|
17
|
+
|
|
18
|
+
- `zentao <command> --key value`
|
|
19
|
+
- `zentao --role qa <command> --key value`
|
|
20
|
+
|
|
21
|
+
## 场景
|
|
22
|
+
|
|
23
|
+
- 手工查数据
|
|
24
|
+
- 排查问题
|
|
25
|
+
- 批量执行脚本
|