@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.
Files changed (71) hide show
  1. package/.env.example +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +231 -0
  4. package/README.zh-CN.md +225 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +61 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/tools/bugs.d.ts +2 -0
  9. package/dist/tools/bugs.js +387 -0
  10. package/dist/tools/bugs.js.map +1 -0
  11. package/dist/tools/builds.d.ts +2 -0
  12. package/dist/tools/builds.js +54 -0
  13. package/dist/tools/builds.js.map +1 -0
  14. package/dist/tools/cases.d.ts +2 -0
  15. package/dist/tools/cases.js +121 -0
  16. package/dist/tools/cases.js.map +1 -0
  17. package/dist/tools/docs.d.ts +2 -0
  18. package/dist/tools/docs.js +75 -0
  19. package/dist/tools/docs.js.map +1 -0
  20. package/dist/tools/efforts.d.ts +2 -0
  21. package/dist/tools/efforts.js +65 -0
  22. package/dist/tools/efforts.js.map +1 -0
  23. package/dist/tools/executions.d.ts +2 -0
  24. package/dist/tools/executions.js +118 -0
  25. package/dist/tools/executions.js.map +1 -0
  26. package/dist/tools/helpers.d.ts +36 -0
  27. package/dist/tools/helpers.js +255 -0
  28. package/dist/tools/helpers.js.map +1 -0
  29. package/dist/tools/index.d.ts +4 -0
  30. package/dist/tools/index.js +44 -0
  31. package/dist/tools/index.js.map +1 -0
  32. package/dist/tools/issues.d.ts +2 -0
  33. package/dist/tools/issues.js +89 -0
  34. package/dist/tools/issues.js.map +1 -0
  35. package/dist/tools/products.d.ts +2 -0
  36. package/dist/tools/products.js +110 -0
  37. package/dist/tools/products.js.map +1 -0
  38. package/dist/tools/programs.d.ts +2 -0
  39. package/dist/tools/programs.js +46 -0
  40. package/dist/tools/programs.js.map +1 -0
  41. package/dist/tools/projects.d.ts +2 -0
  42. package/dist/tools/projects.js +80 -0
  43. package/dist/tools/projects.js.map +1 -0
  44. package/dist/tools/releases.d.ts +2 -0
  45. package/dist/tools/releases.js +46 -0
  46. package/dist/tools/releases.js.map +1 -0
  47. package/dist/tools/repos.d.ts +2 -0
  48. package/dist/tools/repos.js +42 -0
  49. package/dist/tools/repos.js.map +1 -0
  50. package/dist/tools/request.d.ts +2 -0
  51. package/dist/tools/request.js +41 -0
  52. package/dist/tools/request.js.map +1 -0
  53. package/dist/tools/risks.d.ts +2 -0
  54. package/dist/tools/risks.js +69 -0
  55. package/dist/tools/risks.js.map +1 -0
  56. package/dist/tools/stories.d.ts +2 -0
  57. package/dist/tools/stories.js +153 -0
  58. package/dist/tools/stories.js.map +1 -0
  59. package/dist/tools/tasks.d.ts +2 -0
  60. package/dist/tools/tasks.js +205 -0
  61. package/dist/tools/tasks.js.map +1 -0
  62. package/dist/tools/testreports.d.ts +2 -0
  63. package/dist/tools/testreports.js +47 -0
  64. package/dist/tools/testreports.js.map +1 -0
  65. package/dist/tools/todos.d.ts +2 -0
  66. package/dist/tools/todos.js +70 -0
  67. package/dist/tools/todos.js.map +1 -0
  68. package/dist/tools/users.d.ts +2 -0
  69. package/dist/tools/users.js +59 -0
  70. package/dist/tools/users.js.map +1 -0
  71. 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,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildBuildTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -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,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildCaseTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EAIjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AACtH,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AACjE,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAE9F,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,OAAO;QACL,kBAAkB,EAAE,UAAU,CAAC;YAC7B,WAAW,EAAE,gCAAgC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACtC,GAAG,eAAe;aACnB,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE;oBAC/D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;gBACvF,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YACjE,CAAC;SACF,CAAC;QAEF,QAAQ,EAAE,UAAU,CAAC;YACnB,WAAW,EAAE,mCAAmC;YAChD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;SACvD,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EACT,uHAAuH;YACzH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBAClC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC9C,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACjF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC;qBACL,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;oBACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;oBAC9C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;iBAC3D,CAAC,CACH;qBACA,QAAQ,EAAE;gBACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAChC,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;gBACpC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,8BAA8B;YAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACjF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC;qBACL,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;qBACpE,QAAQ,EAAE;aACd,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;gBACjC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACxD,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,mCAAmC;YAChD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SAC1D,CAAC;QAEF,kBAAkB,EAAE,UAAU,CAAC;YAC7B,WAAW,EAAE,iGAAiG;YAC9G,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,WAAW,EAAE,CAAC;qBACX,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;oBACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;oBACtC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;oBAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;iBAChE,CAAC,CACH;qBACA,QAAQ,EAAE;aACd,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;gBACjC,OAAO,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;SACF,CAAC;QAEF,iBAAiB,EAAE,UAAU,CAAC;YAC5B,WAAW,EAAE,yCAAyC;YACtD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;YAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;SACL,CAAC;QAEF,uBAAuB,EAAE,UAAU,CAAC;YAClC,WAAW,EAAE,gCAAgC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;YAChF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;SACL,CAAC;QAEF,sBAAsB,EAAE,UAAU,CAAC;YACjC,WAAW,EAAE,6CAA6C;YAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;YAChF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC5C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;SACL,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildDocTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;