@zentao-hub/mcp 0.3.0
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/.env.example +13 -0
- package/LICENSE +21 -0
- package/README.md +231 -0
- package/README.zh-CN.md +225 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/bugs.d.ts +2 -0
- package/dist/tools/bugs.js +387 -0
- package/dist/tools/bugs.js.map +1 -0
- package/dist/tools/builds.d.ts +2 -0
- package/dist/tools/builds.js +54 -0
- package/dist/tools/builds.js.map +1 -0
- package/dist/tools/cases.d.ts +2 -0
- package/dist/tools/cases.js +121 -0
- package/dist/tools/cases.js.map +1 -0
- package/dist/tools/docs.d.ts +2 -0
- package/dist/tools/docs.js +75 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/efforts.d.ts +2 -0
- package/dist/tools/efforts.js +65 -0
- package/dist/tools/efforts.js.map +1 -0
- package/dist/tools/executions.d.ts +2 -0
- package/dist/tools/executions.js +118 -0
- package/dist/tools/executions.js.map +1 -0
- package/dist/tools/helpers.d.ts +36 -0
- package/dist/tools/helpers.js +255 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/issues.d.ts +2 -0
- package/dist/tools/issues.js +89 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/products.d.ts +2 -0
- package/dist/tools/products.js +110 -0
- package/dist/tools/products.js.map +1 -0
- package/dist/tools/programs.d.ts +2 -0
- package/dist/tools/programs.js +46 -0
- package/dist/tools/programs.js.map +1 -0
- package/dist/tools/projects.d.ts +2 -0
- package/dist/tools/projects.js +80 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/releases.d.ts +2 -0
- package/dist/tools/releases.js +46 -0
- package/dist/tools/releases.js.map +1 -0
- package/dist/tools/repos.d.ts +2 -0
- package/dist/tools/repos.js +42 -0
- package/dist/tools/repos.js.map +1 -0
- package/dist/tools/request.d.ts +2 -0
- package/dist/tools/request.js +41 -0
- package/dist/tools/request.js.map +1 -0
- package/dist/tools/risks.d.ts +2 -0
- package/dist/tools/risks.js +69 -0
- package/dist/tools/risks.js.map +1 -0
- package/dist/tools/stories.d.ts +2 -0
- package/dist/tools/stories.js +153 -0
- package/dist/tools/stories.js.map +1 -0
- package/dist/tools/tasks.d.ts +2 -0
- package/dist/tools/tasks.js +205 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/testreports.d.ts +2 -0
- package/dist/tools/testreports.js +47 -0
- package/dist/tools/testreports.js.map +1 -0
- package/dist/tools/todos.d.ts +2 -0
- package/dist/tools/todos.js +70 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/users.d.ts +2 -0
- package/dist/tools/users.js +59 -0
- package/dist/tools/users.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ZentaoApiError } from "@zentao-hub/sdk";
|
|
3
|
+
import { BUG_SUMMARY_KEYS, defineTool, extractList, extractTotal, normalizeFileList, paginationShape, pickDefined, sanitizeFilename, summarize, } from "./helpers.js";
|
|
4
|
+
const RESOLUTIONS = [
|
|
5
|
+
"bydesign",
|
|
6
|
+
"duplicate",
|
|
7
|
+
"external",
|
|
8
|
+
"fixed",
|
|
9
|
+
"notrepro",
|
|
10
|
+
"postponed",
|
|
11
|
+
"willnotfix",
|
|
12
|
+
];
|
|
13
|
+
const BUG_TYPES = [
|
|
14
|
+
"codeerror",
|
|
15
|
+
"interface",
|
|
16
|
+
"config",
|
|
17
|
+
"install",
|
|
18
|
+
"security",
|
|
19
|
+
"performance",
|
|
20
|
+
"standard",
|
|
21
|
+
"automation",
|
|
22
|
+
"designdefect",
|
|
23
|
+
"others",
|
|
24
|
+
];
|
|
25
|
+
export function buildBugTools(ctx) {
|
|
26
|
+
const { client } = ctx;
|
|
27
|
+
return {
|
|
28
|
+
list_my_bugs: defineTool({
|
|
29
|
+
description: "List bugs assigned to the authenticated user within ONE product. ZenTao's v1 query-string filters (status, assignedTo) are unreliable — they're silently ignored on some 20.x builds — so this tool pulls pages of all bugs in the product and filters in-server by assignedTo.account == <current user> and (optionally) status. Cost: scans up to maxScan bugs per call. Pair with list_products to iterate across products.",
|
|
30
|
+
schema: z.object({
|
|
31
|
+
productId: z
|
|
32
|
+
.number()
|
|
33
|
+
.int()
|
|
34
|
+
.positive()
|
|
35
|
+
.describe("ZenTao product ID to scope to. Required — ZenTao v1 has no cross-product bug list. Call list_products first if you don't know the ID."),
|
|
36
|
+
status: z
|
|
37
|
+
.enum(["active", "resolved", "closed", "all"])
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("Default 'active'."),
|
|
40
|
+
limit: z.number().int().min(1).max(200).optional().describe("Max matched bugs to return, default 20."),
|
|
41
|
+
maxScan: z
|
|
42
|
+
.number()
|
|
43
|
+
.int()
|
|
44
|
+
.min(50)
|
|
45
|
+
.max(10000)
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("Hard cap on bugs scanned in the product. Default 1000."),
|
|
48
|
+
}),
|
|
49
|
+
handler: async (args) => {
|
|
50
|
+
const account = await client.getAccount();
|
|
51
|
+
const statusArg = args.status ?? "active";
|
|
52
|
+
const wantStatus = statusArg === "all" ? undefined : statusArg;
|
|
53
|
+
const limit = args.limit ?? 20;
|
|
54
|
+
const maxScan = args.maxScan ?? 1000;
|
|
55
|
+
const pageSize = 200;
|
|
56
|
+
const matched = [];
|
|
57
|
+
let scanned = 0;
|
|
58
|
+
let totalInProduct = 0;
|
|
59
|
+
for (let page = 1; scanned < maxScan; page++) {
|
|
60
|
+
const payload = await client.bugs.listByProduct(args.productId, {
|
|
61
|
+
limit: pageSize,
|
|
62
|
+
page,
|
|
63
|
+
});
|
|
64
|
+
const batch = extractList(payload).map((b) => b);
|
|
65
|
+
totalInProduct = extractTotal(payload) ?? totalInProduct;
|
|
66
|
+
if (batch.length === 0)
|
|
67
|
+
break;
|
|
68
|
+
scanned += batch.length;
|
|
69
|
+
for (const b of batch) {
|
|
70
|
+
const at = b.assignedTo;
|
|
71
|
+
const atAccount = typeof at === "string" ? at : at && typeof at === "object" ? at.account : undefined;
|
|
72
|
+
if (atAccount !== account)
|
|
73
|
+
continue;
|
|
74
|
+
if (wantStatus && b.status !== wantStatus)
|
|
75
|
+
continue;
|
|
76
|
+
matched.push(summarize(b, BUG_SUMMARY_KEYS));
|
|
77
|
+
if (matched.length >= limit)
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (matched.length >= limit)
|
|
81
|
+
break;
|
|
82
|
+
if (batch.length < pageSize)
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
total: matched.length,
|
|
87
|
+
bugs: matched,
|
|
88
|
+
scanned,
|
|
89
|
+
totalInProduct,
|
|
90
|
+
account,
|
|
91
|
+
truncated: scanned >= maxScan && matched.length < limit,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
}),
|
|
95
|
+
list_product_bugs: defineTool({
|
|
96
|
+
description: "List bugs in a product, with optional status / assignee filters. Use when you need broader visibility than your own queue.",
|
|
97
|
+
schema: z.object({
|
|
98
|
+
productId: z.number().int().positive(),
|
|
99
|
+
status: z.enum(["active", "resolved", "closed", "all"]).optional(),
|
|
100
|
+
assignedTo: z
|
|
101
|
+
.string()
|
|
102
|
+
.optional()
|
|
103
|
+
.describe("Filter by assignee account name (server-side support varies)."),
|
|
104
|
+
...paginationShape,
|
|
105
|
+
}),
|
|
106
|
+
handler: async (args) => {
|
|
107
|
+
const payload = await client.bugs.listByProduct(args.productId, {
|
|
108
|
+
status: args.status,
|
|
109
|
+
assignedTo: args.assignedTo,
|
|
110
|
+
limit: args.limit ?? 20,
|
|
111
|
+
page: args.page,
|
|
112
|
+
});
|
|
113
|
+
const bugs = extractList(payload).map((b) => summarize(b, BUG_SUMMARY_KEYS));
|
|
114
|
+
return { total: extractTotal(payload) ?? bugs.length, bugs };
|
|
115
|
+
},
|
|
116
|
+
}),
|
|
117
|
+
list_execution_bugs: defineTool({
|
|
118
|
+
description: "List bugs scoped to one execution (sprint).",
|
|
119
|
+
schema: z.object({
|
|
120
|
+
executionId: z.number().int().positive(),
|
|
121
|
+
...paginationShape,
|
|
122
|
+
}),
|
|
123
|
+
handler: async (args) => {
|
|
124
|
+
const payload = await client.bugs.listByExecution(args.executionId, {
|
|
125
|
+
limit: args.limit ?? 20,
|
|
126
|
+
page: args.page,
|
|
127
|
+
});
|
|
128
|
+
const bugs = extractList(payload).map((b) => summarize(b, BUG_SUMMARY_KEYS));
|
|
129
|
+
return { total: extractTotal(payload) ?? bugs.length, bugs };
|
|
130
|
+
},
|
|
131
|
+
}),
|
|
132
|
+
get_bug: defineTool({
|
|
133
|
+
description: "Fetch full details for a single bug, including reproduction steps. Returns the raw ZenTao bug object.",
|
|
134
|
+
schema: z.object({ bugId: z.number().int().positive() }),
|
|
135
|
+
handler: async (args) => client.bugs.get(args.bugId),
|
|
136
|
+
}),
|
|
137
|
+
create_bug: defineTool({
|
|
138
|
+
description: "Create a new bug. Required: productId, title. Most other fields are optional and follow ZenTao defaults. Returns the created bug object.",
|
|
139
|
+
schema: z.object({
|
|
140
|
+
productId: z.number().int().positive(),
|
|
141
|
+
title: z.string().min(1),
|
|
142
|
+
branch: z.number().int().optional(),
|
|
143
|
+
module: z.number().int().optional(),
|
|
144
|
+
execution: z.number().int().optional().describe("Execution (sprint) ID."),
|
|
145
|
+
project: z.number().int().optional(),
|
|
146
|
+
plan: z.number().int().optional(),
|
|
147
|
+
story: z.number().int().optional(),
|
|
148
|
+
task: z.number().int().optional(),
|
|
149
|
+
openedBuild: z.string().optional().describe("Build where reproduced. Default 'trunk'."),
|
|
150
|
+
assignedTo: z.string().optional().describe("Assignee account name."),
|
|
151
|
+
type: z.enum(BUG_TYPES).optional(),
|
|
152
|
+
os: z.string().optional(),
|
|
153
|
+
browser: z.string().optional(),
|
|
154
|
+
severity: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
155
|
+
pri: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
156
|
+
steps: z.string().optional().describe("Reproduction steps (HTML allowed)."),
|
|
157
|
+
keywords: z.string().optional(),
|
|
158
|
+
deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
159
|
+
}),
|
|
160
|
+
handler: async (args) => {
|
|
161
|
+
const { productId, ...rest } = args;
|
|
162
|
+
return client.bugs.create(productId, pickDefined(rest));
|
|
163
|
+
},
|
|
164
|
+
}),
|
|
165
|
+
update_bug: defineTool({
|
|
166
|
+
description: "Update fields on an existing bug. Pass only the fields you want to change. Use resolve_bug / confirm_bug / activate_bug / assign_bug for state transitions — they call the dedicated action endpoints.",
|
|
167
|
+
schema: z.object({
|
|
168
|
+
bugId: z.number().int().positive(),
|
|
169
|
+
title: z.string().optional(),
|
|
170
|
+
severity: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
171
|
+
pri: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
172
|
+
type: z.enum(BUG_TYPES).optional(),
|
|
173
|
+
steps: z.string().optional(),
|
|
174
|
+
keywords: z.string().optional(),
|
|
175
|
+
os: z.string().optional(),
|
|
176
|
+
browser: z.string().optional(),
|
|
177
|
+
module: z.number().int().optional(),
|
|
178
|
+
execution: z.number().int().optional(),
|
|
179
|
+
deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
180
|
+
}),
|
|
181
|
+
handler: async (args) => {
|
|
182
|
+
const { bugId, ...rest } = args;
|
|
183
|
+
return client.bugs.update(bugId, pickDefined(rest));
|
|
184
|
+
},
|
|
185
|
+
}),
|
|
186
|
+
resolve_bug: defineTool({
|
|
187
|
+
description: "Mark a bug as resolved with a resolution code (fixed / duplicate / postponed / etc). Adds an optional comment and the build it was fixed in. Resolve = dev says it's done; close = reporter confirmed in build — use close_bug after verification.",
|
|
188
|
+
schema: z.object({
|
|
189
|
+
bugId: z.number().int().positive(),
|
|
190
|
+
resolution: z.enum(RESOLUTIONS),
|
|
191
|
+
comment: z.string().optional(),
|
|
192
|
+
resolvedBuild: z.string().optional().describe("Build identifier ('trunk' or build id)."),
|
|
193
|
+
resolvedDate: z.string().regex(/^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}:\d{2})?$/).optional(),
|
|
194
|
+
assignedTo: z.string().optional(),
|
|
195
|
+
duplicateBug: z.number().int().positive().optional().describe("Required when resolution='duplicate'."),
|
|
196
|
+
}),
|
|
197
|
+
handler: async (args) => {
|
|
198
|
+
if (args.resolution === "duplicate" && !args.duplicateBug) {
|
|
199
|
+
throw new Error("resolution='duplicate' requires duplicateBug to be set");
|
|
200
|
+
}
|
|
201
|
+
const { bugId, ...rest } = args;
|
|
202
|
+
return client.bugs.resolve(bugId, pickDefined(rest));
|
|
203
|
+
},
|
|
204
|
+
}),
|
|
205
|
+
close_bug: defineTool({
|
|
206
|
+
description: "Close a bug (only call after the reporter verified the fix in the resolvedBuild). Closed bugs drop out of active queues entirely. Use activate_bug to re-open if verification fails later.",
|
|
207
|
+
schema: z.object({
|
|
208
|
+
bugId: z.number().int().positive(),
|
|
209
|
+
comment: z.string().optional(),
|
|
210
|
+
}),
|
|
211
|
+
handler: async (args) => client.bugs.close(args.bugId, pickDefined({ comment: args.comment })),
|
|
212
|
+
}),
|
|
213
|
+
confirm_bug: defineTool({
|
|
214
|
+
description: "Confirm a newly-opened bug (moves bug.confirmed = 1). Optional comment.",
|
|
215
|
+
schema: z.object({
|
|
216
|
+
bugId: z.number().int().positive(),
|
|
217
|
+
comment: z.string().optional(),
|
|
218
|
+
}),
|
|
219
|
+
handler: async (args) => client.bugs.confirm(args.bugId, pickDefined({ comment: args.comment })),
|
|
220
|
+
}),
|
|
221
|
+
activate_bug: defineTool({
|
|
222
|
+
description: "Re-activate a resolved or closed bug. Use when verification fails. Resets resolution / resolvedBy / resolvedDate.",
|
|
223
|
+
schema: z.object({
|
|
224
|
+
bugId: z.number().int().positive(),
|
|
225
|
+
assignedTo: z.string().optional(),
|
|
226
|
+
comment: z.string().optional(),
|
|
227
|
+
}),
|
|
228
|
+
handler: async (args) => client.bugs.activate(args.bugId, pickDefined({ assignedTo: args.assignedTo, comment: args.comment })),
|
|
229
|
+
}),
|
|
230
|
+
assign_bug: defineTool({
|
|
231
|
+
description: "Reassign a bug to another account.",
|
|
232
|
+
schema: z.object({
|
|
233
|
+
bugId: z.number().int().positive(),
|
|
234
|
+
assignedTo: z.string().min(1),
|
|
235
|
+
comment: z.string().optional(),
|
|
236
|
+
}),
|
|
237
|
+
handler: async (args) => client.bugs.assignTo(args.bugId, pickDefined({ assignedTo: args.assignedTo, comment: args.comment })),
|
|
238
|
+
}),
|
|
239
|
+
delete_bug: defineTool({
|
|
240
|
+
description: "Hard-delete a bug. Irreversible. ZenTao requires admin permission.",
|
|
241
|
+
schema: z.object({ bugId: z.number().int().positive() }),
|
|
242
|
+
handler: async (args) => client.bugs.delete(args.bugId),
|
|
243
|
+
}),
|
|
244
|
+
add_bug_comment: defineTool({
|
|
245
|
+
description: "Append a comment to a bug.",
|
|
246
|
+
schema: z.object({
|
|
247
|
+
bugId: z.number().int().positive(),
|
|
248
|
+
comment: z.string().min(1),
|
|
249
|
+
}),
|
|
250
|
+
handler: async (args) => client.bugs.addComment(args.bugId, args.comment),
|
|
251
|
+
}),
|
|
252
|
+
get_bug_history: defineTool({
|
|
253
|
+
description: "Fetch the action / comment history of a bug. Tries /bugs/{id}/actions first, falls back to /bugs/{id}/history, then to whatever actions/history field is embedded in /bugs/{id}.",
|
|
254
|
+
schema: z.object({ bugId: z.number().int().positive() }),
|
|
255
|
+
handler: async (args) => {
|
|
256
|
+
const tryFetch = async (fn, source) => {
|
|
257
|
+
try {
|
|
258
|
+
const data = await fn();
|
|
259
|
+
return { source, data };
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
if (err instanceof ZentaoApiError && (err.status === 404 || err.status === 400)) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
const actions = await tryFetch(() => client.bugs.getActions(args.bugId), "actions");
|
|
269
|
+
if (actions)
|
|
270
|
+
return actions;
|
|
271
|
+
const history = await tryFetch(() => client.bugs.getHistory(args.bugId), "history");
|
|
272
|
+
if (history)
|
|
273
|
+
return history;
|
|
274
|
+
const bug = await client.bugs.get(args.bugId);
|
|
275
|
+
for (const k of ["actions", "history", "comments"]) {
|
|
276
|
+
if (k in bug)
|
|
277
|
+
return { source: `embedded:${k}`, data: bug[k] };
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
source: "none",
|
|
281
|
+
data: [],
|
|
282
|
+
note: "No /actions or /history endpoint and no embedded history field found on this ZenTao build.",
|
|
283
|
+
};
|
|
284
|
+
},
|
|
285
|
+
}),
|
|
286
|
+
download_bug_attachments: defineTool({
|
|
287
|
+
description: "Download a bug's attachments to a local directory: file uploads from bug.files plus, by default, any inline <img> referenced inside the bug's reproduction steps. Files land directly in destDir; inline images go under destDir/inline/. Returns per-file metadata (size, localPath, sourceUrl) plus an errors array — single-file failures don't abort the whole batch.",
|
|
288
|
+
schema: z.object({
|
|
289
|
+
bugId: z.number().int().positive(),
|
|
290
|
+
destDir: z
|
|
291
|
+
.string()
|
|
292
|
+
.min(1)
|
|
293
|
+
.describe("Absolute local directory. Will be created. Inline images go under destDir/inline/."),
|
|
294
|
+
includeInline: z.boolean().optional().describe("Default true."),
|
|
295
|
+
}),
|
|
296
|
+
handler: async (args) => {
|
|
297
|
+
const path = await import("node:path");
|
|
298
|
+
const fs = await import("node:fs/promises");
|
|
299
|
+
if (!path.isAbsolute(args.destDir)) {
|
|
300
|
+
throw new Error(`destDir must be an absolute path (got ${JSON.stringify(args.destDir)}). The MCP server's cwd is unpredictable, so relative paths are unsafe.`);
|
|
301
|
+
}
|
|
302
|
+
await fs.mkdir(args.destDir, { recursive: true });
|
|
303
|
+
const bug = await client.bugs.get(args.bugId);
|
|
304
|
+
const fileList = normalizeFileList(bug.files);
|
|
305
|
+
const attachments = [];
|
|
306
|
+
const inline = [];
|
|
307
|
+
const errors = [];
|
|
308
|
+
for (const f of fileList) {
|
|
309
|
+
const id = (f.id ?? f.fileID);
|
|
310
|
+
const title = String(f.title ?? f.name ?? `file-${id ?? "unknown"}`);
|
|
311
|
+
const ext = String(f.extension ?? "").replace(/^\.+/, "");
|
|
312
|
+
if (id === undefined) {
|
|
313
|
+
errors.push({
|
|
314
|
+
kind: "attachment",
|
|
315
|
+
sourceUrl: null,
|
|
316
|
+
error: `bug.files entry has no id; got keys ${Object.keys(f).join(",")}`,
|
|
317
|
+
});
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
const filename = sanitizeFilename(`${id}-${title}${ext ? `.${ext}` : ""}`);
|
|
321
|
+
const local = path.join(args.destDir, filename);
|
|
322
|
+
const remoteUrl = `/file-read-${id}-${encodeURIComponent(title)}${ext ? `.${ext}` : ""}`;
|
|
323
|
+
try {
|
|
324
|
+
const r = await client.downloadToFile(remoteUrl, local);
|
|
325
|
+
attachments.push({
|
|
326
|
+
kind: "attachment",
|
|
327
|
+
id,
|
|
328
|
+
filename,
|
|
329
|
+
size: r.size,
|
|
330
|
+
localPath: local,
|
|
331
|
+
sourceUrl: r.url,
|
|
332
|
+
contentType: r.contentType,
|
|
333
|
+
originalTitle: title,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
errors.push({ kind: "attachment", id, sourceUrl: remoteUrl, error: err.message });
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (args.includeInline !== false) {
|
|
341
|
+
const stepsHtml = typeof bug.steps === "string" ? bug.steps : "";
|
|
342
|
+
const re = /<img\b[^>]*\bsrc\s*=\s*["']([^"']+)["']/gi;
|
|
343
|
+
const seen = new Set();
|
|
344
|
+
let counter = 0;
|
|
345
|
+
let m;
|
|
346
|
+
while ((m = re.exec(stepsHtml))) {
|
|
347
|
+
const src = m[1];
|
|
348
|
+
if (src.startsWith("data:") || seen.has(src))
|
|
349
|
+
continue;
|
|
350
|
+
seen.add(src);
|
|
351
|
+
counter++;
|
|
352
|
+
const basename = src.split(/[?#]/)[0].split("/").filter(Boolean).pop() || `inline-${counter}`;
|
|
353
|
+
const filename = sanitizeFilename(`inline-${counter}-${basename}`);
|
|
354
|
+
const local = path.join(args.destDir, "inline", filename);
|
|
355
|
+
try {
|
|
356
|
+
const r = await client.downloadToFile(src, local);
|
|
357
|
+
inline.push({
|
|
358
|
+
kind: "inline",
|
|
359
|
+
filename,
|
|
360
|
+
size: r.size,
|
|
361
|
+
localPath: local,
|
|
362
|
+
sourceUrl: r.url,
|
|
363
|
+
contentType: r.contentType,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
errors.push({ kind: "inline", sourceUrl: src, error: err.message });
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
bugId: args.bugId,
|
|
373
|
+
destDir: args.destDir,
|
|
374
|
+
attachments,
|
|
375
|
+
inline,
|
|
376
|
+
errors,
|
|
377
|
+
counts: {
|
|
378
|
+
attachments: attachments.length,
|
|
379
|
+
inline: inline.length,
|
|
380
|
+
errors: errors.length,
|
|
381
|
+
},
|
|
382
|
+
};
|
|
383
|
+
},
|
|
384
|
+
}),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=bugs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bugs.js","sourceRoot":"","sources":["../../src/tools/bugs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { BUILD_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
|
|
3
|
+
export function buildBuildTools(ctx) {
|
|
4
|
+
const { client } = ctx;
|
|
5
|
+
return {
|
|
6
|
+
list_product_builds: defineTool({
|
|
7
|
+
description: "List builds of a product. Use to populate resolvedBuild when resolving bugs.",
|
|
8
|
+
schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
|
|
9
|
+
handler: async (args) => {
|
|
10
|
+
const payload = await client.builds.listByProduct(args.productId, {
|
|
11
|
+
limit: args.limit ?? 20,
|
|
12
|
+
page: args.page,
|
|
13
|
+
});
|
|
14
|
+
const builds = extractList(payload).map((b) => summarize(b, BUILD_SUMMARY_KEYS));
|
|
15
|
+
return { total: extractTotal(payload) ?? builds.length, builds };
|
|
16
|
+
},
|
|
17
|
+
}),
|
|
18
|
+
list_execution_builds: defineTool({
|
|
19
|
+
description: "List builds produced by an execution.",
|
|
20
|
+
schema: z.object({ executionId: z.number().int().positive(), ...paginationShape }),
|
|
21
|
+
handler: async (args) => client.builds.listByExecution(args.executionId, {
|
|
22
|
+
limit: args.limit ?? 20,
|
|
23
|
+
page: args.page,
|
|
24
|
+
}),
|
|
25
|
+
}),
|
|
26
|
+
get_build: defineTool({
|
|
27
|
+
description: "Fetch a build's details.",
|
|
28
|
+
schema: z.object({ buildId: z.number().int().positive() }),
|
|
29
|
+
handler: async (args) => client.builds.get(args.buildId),
|
|
30
|
+
}),
|
|
31
|
+
create_build: defineTool({
|
|
32
|
+
description: "Create a build entry under an execution.",
|
|
33
|
+
schema: z.object({
|
|
34
|
+
executionId: z.number().int().positive(),
|
|
35
|
+
name: z.string().min(1).describe("Build name, e.g. v1.2.0-rc1."),
|
|
36
|
+
product: z.number().int().positive(),
|
|
37
|
+
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
38
|
+
scmPath: z.string().optional(),
|
|
39
|
+
filePath: z.string().optional(),
|
|
40
|
+
desc: z.string().optional(),
|
|
41
|
+
}),
|
|
42
|
+
handler: async (args) => {
|
|
43
|
+
const { executionId, ...rest } = args;
|
|
44
|
+
return client.builds.create(executionId, pickDefined(rest));
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
47
|
+
delete_build: defineTool({
|
|
48
|
+
description: "Delete a build. Irreversible.",
|
|
49
|
+
schema: z.object({ buildId: z.number().int().positive() }),
|
|
50
|
+
handler: async (args) => client.builds.delete(args.buildId),
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=builds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/tools/builds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CASE_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
|
|
3
|
+
const CASE_TYPES = ["feature", "performance", "config", "install", "security", "interface", "unit", "other"];
|
|
4
|
+
const CASE_RESULTS = ["pass", "fail", "blocked", "n/a"];
|
|
5
|
+
const CASE_STAGES = ["unittest", "feature", "integration", "system", "smoke", "bvt"];
|
|
6
|
+
export function buildCaseTools(ctx) {
|
|
7
|
+
const { client } = ctx;
|
|
8
|
+
return {
|
|
9
|
+
list_product_cases: defineTool({
|
|
10
|
+
description: "List test cases for a product.",
|
|
11
|
+
schema: z.object({
|
|
12
|
+
productId: z.number().int().positive(),
|
|
13
|
+
...paginationShape,
|
|
14
|
+
}),
|
|
15
|
+
handler: async (args) => {
|
|
16
|
+
const payload = await client.cases.listByProduct(args.productId, {
|
|
17
|
+
limit: args.limit ?? 20,
|
|
18
|
+
page: args.page,
|
|
19
|
+
});
|
|
20
|
+
const cases = extractList(payload).map((c) => summarize(c, CASE_SUMMARY_KEYS));
|
|
21
|
+
return { total: extractTotal(payload) ?? cases.length, cases };
|
|
22
|
+
},
|
|
23
|
+
}),
|
|
24
|
+
get_case: defineTool({
|
|
25
|
+
description: "Fetch a test case with its steps.",
|
|
26
|
+
schema: z.object({ caseId: z.number().int().positive() }),
|
|
27
|
+
handler: async (args) => client.cases.get(args.caseId),
|
|
28
|
+
}),
|
|
29
|
+
create_case: defineTool({
|
|
30
|
+
description: "Create a test case in a product. `steps` is an array of {desc, expect}; ZenTao splits it into the case's steps table.",
|
|
31
|
+
schema: z.object({
|
|
32
|
+
productId: z.number().int().positive(),
|
|
33
|
+
title: z.string().min(1),
|
|
34
|
+
module: z.number().int().optional(),
|
|
35
|
+
story: z.number().int().optional(),
|
|
36
|
+
type: z.enum(CASE_TYPES).optional(),
|
|
37
|
+
stage: z.array(z.enum(CASE_STAGES)).optional(),
|
|
38
|
+
pri: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
39
|
+
precondition: z.string().optional(),
|
|
40
|
+
steps: z
|
|
41
|
+
.array(z.object({
|
|
42
|
+
desc: z.string().describe("Step description."),
|
|
43
|
+
expect: z.string().optional().describe("Expected result."),
|
|
44
|
+
}))
|
|
45
|
+
.optional(),
|
|
46
|
+
keywords: z.string().optional(),
|
|
47
|
+
}),
|
|
48
|
+
handler: async (args) => {
|
|
49
|
+
const { productId, ...rest } = args;
|
|
50
|
+
return client.cases.create(productId, pickDefined(rest));
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
update_case: defineTool({
|
|
54
|
+
description: "Update a test case's fields.",
|
|
55
|
+
schema: z.object({
|
|
56
|
+
caseId: z.number().int().positive(),
|
|
57
|
+
title: z.string().optional(),
|
|
58
|
+
pri: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
59
|
+
type: z.enum(CASE_TYPES).optional(),
|
|
60
|
+
stage: z.array(z.enum(CASE_STAGES)).optional(),
|
|
61
|
+
precondition: z.string().optional(),
|
|
62
|
+
steps: z
|
|
63
|
+
.array(z.object({ desc: z.string(), expect: z.string().optional() }))
|
|
64
|
+
.optional(),
|
|
65
|
+
}),
|
|
66
|
+
handler: async (args) => {
|
|
67
|
+
const { caseId, ...rest } = args;
|
|
68
|
+
return client.cases.update(caseId, pickDefined(rest));
|
|
69
|
+
},
|
|
70
|
+
}),
|
|
71
|
+
delete_case: defineTool({
|
|
72
|
+
description: "Delete a test case. Irreversible.",
|
|
73
|
+
schema: z.object({ caseId: z.number().int().positive() }),
|
|
74
|
+
handler: async (args) => client.cases.delete(args.caseId),
|
|
75
|
+
}),
|
|
76
|
+
create_case_result: defineTool({
|
|
77
|
+
description: "Record a test run result for a case. Used when executing test cases outside a formal test task.",
|
|
78
|
+
schema: z.object({
|
|
79
|
+
caseId: z.number().int().positive(),
|
|
80
|
+
result: z.enum(CASE_RESULTS),
|
|
81
|
+
comment: z.string().optional(),
|
|
82
|
+
stepResults: z
|
|
83
|
+
.array(z.object({
|
|
84
|
+
stepId: z.number().int().nonnegative(),
|
|
85
|
+
result: z.enum(CASE_RESULTS),
|
|
86
|
+
real: z.string().optional().describe("Actual result observed."),
|
|
87
|
+
}))
|
|
88
|
+
.optional(),
|
|
89
|
+
}),
|
|
90
|
+
handler: async (args) => {
|
|
91
|
+
const { caseId, ...rest } = args;
|
|
92
|
+
return client.cases.createResult(caseId, pickDefined(rest));
|
|
93
|
+
},
|
|
94
|
+
}),
|
|
95
|
+
list_case_results: defineTool({
|
|
96
|
+
description: "List historical results of a test case.",
|
|
97
|
+
schema: z.object({ caseId: z.number().int().positive(), ...paginationShape }),
|
|
98
|
+
handler: async (args) => client.cases.listResults(args.caseId, {
|
|
99
|
+
limit: args.limit ?? 20,
|
|
100
|
+
page: args.page,
|
|
101
|
+
}),
|
|
102
|
+
}),
|
|
103
|
+
list_product_testsuites: defineTool({
|
|
104
|
+
description: "List test suites of a product.",
|
|
105
|
+
schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
|
|
106
|
+
handler: async (args) => client.products.listTestSuites(args.productId, {
|
|
107
|
+
limit: args.limit ?? 20,
|
|
108
|
+
page: args.page,
|
|
109
|
+
}),
|
|
110
|
+
}),
|
|
111
|
+
list_product_testtasks: defineTool({
|
|
112
|
+
description: "List test tasks (test rounds) of a product.",
|
|
113
|
+
schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
|
|
114
|
+
handler: async (args) => client.products.listTestTasks(args.productId, {
|
|
115
|
+
limit: args.limit ?? 20,
|
|
116
|
+
page: args.page,
|
|
117
|
+
}),
|
|
118
|
+
}),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=cases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cases.js","sourceRoot":"","sources":["../../src/tools/cases.ts"],"names":[],"mappings":"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"}
|