@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,75 @@
1
+ import { z } from "zod";
2
+ import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
3
+ export function buildDocTools(ctx) {
4
+ const { client } = ctx;
5
+ return {
6
+ list_doclibs: defineTool({
7
+ description: "List document libraries (top-level grouping for ZenTao docs).",
8
+ schema: z.object({
9
+ type: z.enum(["product", "project", "execution", "custom", "all"]).optional(),
10
+ ...paginationShape,
11
+ }),
12
+ handler: async (args) => {
13
+ const payload = await client.docs.listLibs({
14
+ type: args.type,
15
+ limit: args.limit ?? 20,
16
+ page: args.page,
17
+ });
18
+ return { total: extractTotal(payload) ?? extractList(payload).length, doclibs: extractList(payload) };
19
+ },
20
+ }),
21
+ list_doclib_docs: defineTool({
22
+ description: "List docs in one library.",
23
+ schema: z.object({
24
+ doclibId: z.number().int().positive(),
25
+ ...paginationShape,
26
+ }),
27
+ handler: async (args) => {
28
+ const payload = await client.docs.listByLib(args.doclibId, {
29
+ limit: args.limit ?? 20,
30
+ page: args.page,
31
+ });
32
+ return { total: extractTotal(payload) ?? extractList(payload).length, docs: extractList(payload) };
33
+ },
34
+ }),
35
+ get_doc: defineTool({
36
+ description: "Fetch a doc's full content.",
37
+ schema: z.object({ docId: z.number().int().positive() }),
38
+ handler: async (args) => client.docs.get(args.docId),
39
+ }),
40
+ create_doc: defineTool({
41
+ description: "Create a new doc inside a library.",
42
+ schema: z.object({
43
+ doclibId: z.number().int().positive(),
44
+ title: z.string().min(1),
45
+ type: z.enum(["html", "markdown", "text", "url"]).optional(),
46
+ content: z.string().optional(),
47
+ keywords: z.string().optional(),
48
+ module: z.number().int().optional(),
49
+ }),
50
+ handler: async (args) => {
51
+ const { doclibId, ...rest } = args;
52
+ return client.docs.create(doclibId, pickDefined(rest));
53
+ },
54
+ }),
55
+ update_doc: defineTool({
56
+ description: "Update an existing doc.",
57
+ schema: z.object({
58
+ docId: z.number().int().positive(),
59
+ title: z.string().optional(),
60
+ content: z.string().optional(),
61
+ keywords: z.string().optional(),
62
+ }),
63
+ handler: async (args) => {
64
+ const { docId, ...rest } = args;
65
+ return client.docs.update(docId, pickDefined(rest));
66
+ },
67
+ }),
68
+ delete_doc: defineTool({
69
+ description: "Delete a doc. Irreversible.",
70
+ schema: z.object({ docId: z.number().int().positive() }),
71
+ handler: async (args) => client.docs.delete(args.docId),
72
+ }),
73
+ };
74
+ }
75
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildEffortTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
3
+ const EFFORT_OBJECT_TYPES = ["task", "bug", "story", "case", "todo"];
4
+ export function buildEffortTools(ctx) {
5
+ const { client } = ctx;
6
+ return {
7
+ log_effort: defineTool({
8
+ description: "Log effort (work hours) against a task / bug / story / case / todo. Records who worked, how long, and what was done. ZenTao rolls these up into the entity's consumed time.",
9
+ schema: z.object({
10
+ objectType: z.enum(EFFORT_OBJECT_TYPES),
11
+ objectId: z.number().int().positive().describe("ID of the task / bug / story / case / todo being worked on."),
12
+ date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Work date YYYY-MM-DD."),
13
+ consumed: z.number().positive().describe("Hours spent."),
14
+ left: z.number().nonnegative().optional().describe("Remaining hours estimate (relevant for tasks)."),
15
+ work: z.string().min(1).describe("Description of what was done."),
16
+ begin: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).optional().describe("Start time HH:MM[:SS]."),
17
+ end: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).optional().describe("End time HH:MM[:SS]."),
18
+ }),
19
+ handler: async (args) => client.efforts.create(pickDefined(args)),
20
+ }),
21
+ list_efforts: defineTool({
22
+ description: "List effort entries (work logs) visible to the authenticated user.",
23
+ schema: z.object({
24
+ account: z.string().optional().describe("Filter by user account."),
25
+ date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional().describe("Specific date."),
26
+ objectType: z.enum(EFFORT_OBJECT_TYPES).optional(),
27
+ objectId: z.number().int().positive().optional(),
28
+ ...paginationShape,
29
+ }),
30
+ handler: async (args) => {
31
+ const payload = await client.efforts.list({
32
+ account: args.account,
33
+ date: args.date,
34
+ objectType: args.objectType,
35
+ objectId: args.objectId,
36
+ limit: args.limit ?? 50,
37
+ page: args.page,
38
+ });
39
+ return { total: extractTotal(payload) ?? extractList(payload).length, efforts: extractList(payload) };
40
+ },
41
+ }),
42
+ update_effort: defineTool({
43
+ description: "Edit a previously-logged effort entry.",
44
+ schema: z.object({
45
+ effortId: z.number().int().positive(),
46
+ date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
47
+ consumed: z.number().positive().optional(),
48
+ left: z.number().nonnegative().optional(),
49
+ work: z.string().optional(),
50
+ begin: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).optional(),
51
+ end: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).optional(),
52
+ }),
53
+ handler: async (args) => {
54
+ const { effortId, ...rest } = args;
55
+ return client.efforts.update(effortId, pickDefined(rest));
56
+ },
57
+ }),
58
+ delete_effort: defineTool({
59
+ description: "Delete an effort entry. Irreversible.",
60
+ schema: z.object({ effortId: z.number().int().positive() }),
61
+ handler: async (args) => client.efforts.delete(args.effortId),
62
+ }),
63
+ };
64
+ }
65
+ //# sourceMappingURL=efforts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efforts.js","sourceRoot":"","sources":["../../src/tools/efforts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildExecutionTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,118 @@
1
+ import { z } from "zod";
2
+ import { EXECUTION_SUMMARY_KEYS, STORY_SUMMARY_KEYS, TASK_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
3
+ const EXECUTION_TYPES = ["sprint", "stage", "kanban"];
4
+ export function buildExecutionTools(ctx) {
5
+ const { client } = ctx;
6
+ return {
7
+ list_executions: defineTool({
8
+ description: "List executions visible to the user (across projects). For project-scoped view use list_project_executions.",
9
+ schema: z.object({
10
+ status: z.enum(["wait", "doing", "suspended", "closed", "all"]).optional(),
11
+ ...paginationShape,
12
+ }),
13
+ handler: async (args) => {
14
+ const payload = await client.executions.list({
15
+ status: args.status,
16
+ limit: args.limit ?? 20,
17
+ page: args.page,
18
+ });
19
+ const executions = extractList(payload).map((e) => summarize(e, EXECUTION_SUMMARY_KEYS));
20
+ return { total: extractTotal(payload) ?? executions.length, executions };
21
+ },
22
+ }),
23
+ get_execution: defineTool({
24
+ description: "Fetch full details of an execution (sprint / iteration / kanban).",
25
+ schema: z.object({ executionId: z.number().int().positive() }),
26
+ handler: async (args) => client.executions.get(args.executionId),
27
+ }),
28
+ create_execution: defineTool({
29
+ description: "Create a new execution inside a project.",
30
+ schema: z.object({
31
+ project: z.number().int().positive().describe("Parent project ID."),
32
+ name: z.string().min(1),
33
+ code: z.string().optional(),
34
+ type: z.enum(EXECUTION_TYPES).optional(),
35
+ begin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
36
+ end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
37
+ PM: z.string().optional(),
38
+ desc: z.string().optional(),
39
+ products: z.array(z.number().int().positive()).optional(),
40
+ }),
41
+ handler: async (args) => client.executions.create(pickDefined(args)),
42
+ }),
43
+ update_execution: defineTool({
44
+ description: "Update an execution's fields.",
45
+ schema: z.object({
46
+ executionId: z.number().int().positive(),
47
+ name: z.string().optional(),
48
+ begin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
49
+ end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
50
+ PM: z.string().optional(),
51
+ desc: z.string().optional(),
52
+ status: z.enum(["wait", "doing", "suspended", "closed"]).optional(),
53
+ }),
54
+ handler: async (args) => {
55
+ const { executionId, ...rest } = args;
56
+ return client.executions.update(executionId, pickDefined(rest));
57
+ },
58
+ }),
59
+ start_execution: defineTool({
60
+ description: "Start an execution (status wait → doing).",
61
+ schema: z.object({
62
+ executionId: z.number().int().positive(),
63
+ comment: z.string().optional(),
64
+ }),
65
+ handler: async (args) => client.executions.start(args.executionId, pickDefined({ comment: args.comment })),
66
+ }),
67
+ close_execution: defineTool({
68
+ description: "Close an execution.",
69
+ schema: z.object({
70
+ executionId: z.number().int().positive(),
71
+ comment: z.string().optional(),
72
+ }),
73
+ handler: async (args) => client.executions.close(args.executionId, pickDefined({ comment: args.comment })),
74
+ }),
75
+ delete_execution: defineTool({
76
+ description: "Delete an execution. Irreversible.",
77
+ schema: z.object({ executionId: z.number().int().positive() }),
78
+ handler: async (args) => client.executions.delete(args.executionId),
79
+ }),
80
+ list_execution_tasks: defineTool({
81
+ description: "List tasks inside an execution.",
82
+ schema: z.object({
83
+ executionId: z.number().int().positive(),
84
+ status: z.enum(["wait", "doing", "done", "pause", "cancel", "closed", "all"]).optional(),
85
+ assignedTo: z.string().optional(),
86
+ ...paginationShape,
87
+ }),
88
+ handler: async (args) => {
89
+ const payload = await client.executions.listTasks(args.executionId, {
90
+ status: args.status,
91
+ assignedTo: args.assignedTo,
92
+ limit: args.limit ?? 20,
93
+ page: args.page,
94
+ });
95
+ const tasks = extractList(payload).map((t) => summarize(t, TASK_SUMMARY_KEYS));
96
+ return { total: extractTotal(payload) ?? tasks.length, tasks };
97
+ },
98
+ }),
99
+ list_execution_stories: defineTool({
100
+ description: "List stories planned into an execution.",
101
+ schema: z.object({ executionId: z.number().int().positive(), ...paginationShape }),
102
+ handler: async (args) => {
103
+ const payload = await client.executions.listStories(args.executionId, {
104
+ limit: args.limit ?? 20,
105
+ page: args.page,
106
+ });
107
+ const stories = extractList(payload).map((s) => summarize(s, STORY_SUMMARY_KEYS));
108
+ return { total: extractTotal(payload) ?? stories.length, stories };
109
+ },
110
+ }),
111
+ list_execution_team: defineTool({
112
+ description: "List the team members assigned to an execution.",
113
+ schema: z.object({ executionId: z.number().int().positive() }),
114
+ handler: async (args) => client.executions.listTeam(args.executionId),
115
+ }),
116
+ };
117
+ }
118
+ //# sourceMappingURL=executions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executions.js","sourceRoot":"","sources":["../../src/tools/executions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import type { ZentaoClient } from "@zentao-hub/sdk";
3
+ export type Json = Record<string, unknown>;
4
+ export interface ToolDef {
5
+ description: string;
6
+ schema: z.ZodObject<z.ZodRawShape>;
7
+ handler: (args: Record<string, unknown>) => Promise<unknown>;
8
+ }
9
+ export interface ToolFactoryCtx {
10
+ client: ZentaoClient;
11
+ }
12
+ export declare function defineTool<S extends z.ZodObject<z.ZodRawShape>>(def: {
13
+ description: string;
14
+ schema: S;
15
+ handler: (args: z.infer<S>) => Promise<unknown>;
16
+ }): ToolDef;
17
+ export declare function sanitizeFilename(s: string): string;
18
+ export declare function normalizeFileList(field: unknown): Json[];
19
+ export declare function extractList(payload: unknown): unknown[];
20
+ export declare function extractTotal(payload: unknown): number | undefined;
21
+ export declare function summarize(obj: Json, keys: readonly string[]): Json;
22
+ export declare const BUG_SUMMARY_KEYS: readonly ["id", "title", "product", "project", "execution", "status", "severity", "pri", "type", "openedBy", "openedDate", "assignedTo", "assignedDate", "resolvedBy", "resolvedDate", "resolution", "resolvedBuild", "closedBy", "closedDate"];
23
+ export declare const PRODUCT_SUMMARY_KEYS: readonly ["id", "name", "code", "status", "line", "type", "parent", "program", "PO", "QD", "RD"];
24
+ export declare const PROJECT_SUMMARY_KEYS: readonly ["id", "name", "code", "type", "status", "model", "begin", "end", "PM", "openedBy", "openedDate", "parent", "vision"];
25
+ export declare const EXECUTION_SUMMARY_KEYS: readonly ["id", "name", "code", "type", "status", "project", "begin", "end", "PM", "openedBy", "openedDate", "parent", "progress"];
26
+ export declare const STORY_SUMMARY_KEYS: readonly ["id", "title", "product", "branch", "module", "plan", "source", "status", "stage", "pri", "estimate", "openedBy", "openedDate", "assignedTo", "assignedDate", "reviewedBy", "closedBy", "closedDate", "closedReason"];
27
+ export declare const TASK_SUMMARY_KEYS: readonly ["id", "name", "execution", "project", "module", "type", "status", "pri", "estimate", "consumed", "left", "deadline", "openedBy", "openedDate", "assignedTo", "assignedDate", "finishedBy", "finishedDate", "closedBy", "closedDate"];
28
+ export declare const CASE_SUMMARY_KEYS: readonly ["id", "title", "product", "branch", "module", "type", "stage", "status", "pri", "story", "openedBy", "openedDate", "lastRunner", "lastRunDate", "lastRunResult"];
29
+ export declare const BUILD_SUMMARY_KEYS: readonly ["id", "name", "product", "branch", "project", "execution", "date", "scmPath", "filePath", "builder"];
30
+ export declare const RELEASE_SUMMARY_KEYS: readonly ["id", "name", "product", "branch", "build", "marker", "date", "status"];
31
+ export declare const USER_SUMMARY_KEYS: readonly ["id", "account", "realname", "role", "dept", "email", "phone", "status"];
32
+ export declare function pickDefined<T extends Json>(obj: T): Partial<T>;
33
+ export declare const paginationShape: {
34
+ readonly limit: z.ZodOptional<z.ZodNumber>;
35
+ readonly page: z.ZodOptional<z.ZodNumber>;
36
+ };
@@ -0,0 +1,255 @@
1
+ import { z } from "zod";
2
+ export function defineTool(def) {
3
+ return def;
4
+ }
5
+ export function sanitizeFilename(s) {
6
+ return (s
7
+ .replace(/[\\\/?%*:|"<>]/g, "_")
8
+ .replace(/[\x00-\x1f]+/g, "_")
9
+ .replace(/\s+/g, "_")
10
+ .replace(/^\.+/, "_")
11
+ .slice(0, 200) || "_");
12
+ }
13
+ export function normalizeFileList(field) {
14
+ if (Array.isArray(field))
15
+ return field;
16
+ if (field && typeof field === "object") {
17
+ return Object.values(field);
18
+ }
19
+ return [];
20
+ }
21
+ export function extractList(payload) {
22
+ if (Array.isArray(payload))
23
+ return payload;
24
+ if (payload && typeof payload === "object") {
25
+ const obj = payload;
26
+ for (const key of [
27
+ "bugs",
28
+ "products",
29
+ "projects",
30
+ "programs",
31
+ "executions",
32
+ "stories",
33
+ "tasks",
34
+ "cases",
35
+ "results",
36
+ "builds",
37
+ "releases",
38
+ "repos",
39
+ "branches",
40
+ "users",
41
+ "departments",
42
+ "docs",
43
+ "doclibs",
44
+ "modules",
45
+ "plans",
46
+ "team",
47
+ "actions",
48
+ "history",
49
+ "comments",
50
+ "issues",
51
+ "risks",
52
+ "todos",
53
+ "effort",
54
+ "data",
55
+ "list",
56
+ ]) {
57
+ const v = obj[key];
58
+ if (Array.isArray(v))
59
+ return v;
60
+ }
61
+ }
62
+ return [];
63
+ }
64
+ export function extractTotal(payload) {
65
+ if (payload && typeof payload === "object") {
66
+ const t = payload.total;
67
+ if (typeof t === "number")
68
+ return t;
69
+ if (typeof t === "string" && /^\d+$/.test(t))
70
+ return Number(t);
71
+ }
72
+ return undefined;
73
+ }
74
+ export function summarize(obj, keys) {
75
+ const out = {};
76
+ for (const k of keys)
77
+ if (k in obj)
78
+ out[k] = obj[k];
79
+ return out;
80
+ }
81
+ export const BUG_SUMMARY_KEYS = [
82
+ "id",
83
+ "title",
84
+ "product",
85
+ "project",
86
+ "execution",
87
+ "status",
88
+ "severity",
89
+ "pri",
90
+ "type",
91
+ "openedBy",
92
+ "openedDate",
93
+ "assignedTo",
94
+ "assignedDate",
95
+ "resolvedBy",
96
+ "resolvedDate",
97
+ "resolution",
98
+ "resolvedBuild",
99
+ "closedBy",
100
+ "closedDate",
101
+ ];
102
+ export const PRODUCT_SUMMARY_KEYS = [
103
+ "id",
104
+ "name",
105
+ "code",
106
+ "status",
107
+ "line",
108
+ "type",
109
+ "parent",
110
+ "program",
111
+ "PO",
112
+ "QD",
113
+ "RD",
114
+ ];
115
+ export const PROJECT_SUMMARY_KEYS = [
116
+ "id",
117
+ "name",
118
+ "code",
119
+ "type",
120
+ "status",
121
+ "model",
122
+ "begin",
123
+ "end",
124
+ "PM",
125
+ "openedBy",
126
+ "openedDate",
127
+ "parent",
128
+ "vision",
129
+ ];
130
+ export const EXECUTION_SUMMARY_KEYS = [
131
+ "id",
132
+ "name",
133
+ "code",
134
+ "type",
135
+ "status",
136
+ "project",
137
+ "begin",
138
+ "end",
139
+ "PM",
140
+ "openedBy",
141
+ "openedDate",
142
+ "parent",
143
+ "progress",
144
+ ];
145
+ export const STORY_SUMMARY_KEYS = [
146
+ "id",
147
+ "title",
148
+ "product",
149
+ "branch",
150
+ "module",
151
+ "plan",
152
+ "source",
153
+ "status",
154
+ "stage",
155
+ "pri",
156
+ "estimate",
157
+ "openedBy",
158
+ "openedDate",
159
+ "assignedTo",
160
+ "assignedDate",
161
+ "reviewedBy",
162
+ "closedBy",
163
+ "closedDate",
164
+ "closedReason",
165
+ ];
166
+ export const TASK_SUMMARY_KEYS = [
167
+ "id",
168
+ "name",
169
+ "execution",
170
+ "project",
171
+ "module",
172
+ "type",
173
+ "status",
174
+ "pri",
175
+ "estimate",
176
+ "consumed",
177
+ "left",
178
+ "deadline",
179
+ "openedBy",
180
+ "openedDate",
181
+ "assignedTo",
182
+ "assignedDate",
183
+ "finishedBy",
184
+ "finishedDate",
185
+ "closedBy",
186
+ "closedDate",
187
+ ];
188
+ export const CASE_SUMMARY_KEYS = [
189
+ "id",
190
+ "title",
191
+ "product",
192
+ "branch",
193
+ "module",
194
+ "type",
195
+ "stage",
196
+ "status",
197
+ "pri",
198
+ "story",
199
+ "openedBy",
200
+ "openedDate",
201
+ "lastRunner",
202
+ "lastRunDate",
203
+ "lastRunResult",
204
+ ];
205
+ export const BUILD_SUMMARY_KEYS = [
206
+ "id",
207
+ "name",
208
+ "product",
209
+ "branch",
210
+ "project",
211
+ "execution",
212
+ "date",
213
+ "scmPath",
214
+ "filePath",
215
+ "builder",
216
+ ];
217
+ export const RELEASE_SUMMARY_KEYS = [
218
+ "id",
219
+ "name",
220
+ "product",
221
+ "branch",
222
+ "build",
223
+ "marker",
224
+ "date",
225
+ "status",
226
+ ];
227
+ export const USER_SUMMARY_KEYS = [
228
+ "id",
229
+ "account",
230
+ "realname",
231
+ "role",
232
+ "dept",
233
+ "email",
234
+ "phone",
235
+ "status",
236
+ ];
237
+ export function pickDefined(obj) {
238
+ const out = {};
239
+ for (const [k, v] of Object.entries(obj)) {
240
+ if (v !== undefined)
241
+ out[k] = v;
242
+ }
243
+ return out;
244
+ }
245
+ export const paginationShape = {
246
+ limit: z
247
+ .number()
248
+ .int()
249
+ .min(1)
250
+ .max(200)
251
+ .optional()
252
+ .describe("Page size, default 20."),
253
+ page: z.number().int().min(1).optional().describe("1-based page number."),
254
+ };
255
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,MAAM,UAAU,UAAU,CAAuC,GAIhE;IACC,OAAO,GAAyB,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,CACL,CAAC;SACE,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAe,CAAC;IACjD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,MAAM,CAAC,KAA6B,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAe,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI;YAChB,MAAM;YACN,UAAU;YACV,UAAU;YACV,UAAU;YACV,YAAY;YACZ,SAAS;YACT,OAAO;YACP,OAAO;YACP,SAAS;YACT,QAAQ;YACR,UAAU;YACV,OAAO;YACP,UAAU;YACV,OAAO;YACP,aAAa;YACb,MAAM;YACN,SAAS;YACT,SAAS;YACT,OAAO;YACP,MAAM;YACN,SAAS;YACT,SAAS;YACT,UAAU;YACV,QAAQ;YACR,OAAO;YACP,OAAO;YACP,QAAQ;YACR,MAAM;YACN,MAAM;SACP,EAAE,CAAC;YACF,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAI,OAAgB,CAAC,KAAK,CAAC;QAClC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAS,EAAE,IAAuB;IAC1D,MAAM,GAAG,GAAS,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI;IACJ,OAAO;IACP,SAAS;IACT,SAAS;IACT,WAAW;IACX,QAAQ;IACR,UAAU;IACV,KAAK;IACL,MAAM;IACN,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,eAAe;IACf,UAAU;IACV,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI;IACJ,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;CACI,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,KAAK;IACL,IAAI;IACJ,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,KAAK;IACL,IAAI;IACJ,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;IACV,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,cAAc;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI;IACJ,MAAM;IACN,WAAW;IACX,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,KAAK;IACL,UAAU;IACV,UAAU;IACV,MAAM;IACN,UAAU;IACV,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,cAAc;IACd,UAAU;IACV,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,eAAe;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI;IACJ,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,WAAW;IACX,MAAM;IACN,SAAS;IACT,UAAU;IACV,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI;IACJ,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI;IACJ,SAAS;IACT,UAAU;IACV,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;CACA,CAAC;AAEX,MAAM,UAAU,WAAW,CAAiB,GAAM;IAChD,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS;YAAG,GAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wBAAwB,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CACjE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ZentaoClient } from "@zentao-hub/sdk";
2
+ import type { ToolDef } from "./helpers.js";
3
+ export type { ToolDef } from "./helpers.js";
4
+ export declare function buildTools(client: ZentaoClient): Record<string, ToolDef>;
@@ -0,0 +1,44 @@
1
+ import { buildBugTools } from "./bugs.js";
2
+ import { buildBuildTools } from "./builds.js";
3
+ import { buildCaseTools } from "./cases.js";
4
+ import { buildDocTools } from "./docs.js";
5
+ import { buildEffortTools } from "./efforts.js";
6
+ import { buildExecutionTools } from "./executions.js";
7
+ import { buildIssueTools } from "./issues.js";
8
+ import { buildProductTools } from "./products.js";
9
+ import { buildProgramTools } from "./programs.js";
10
+ import { buildProjectTools } from "./projects.js";
11
+ import { buildReleaseTools } from "./releases.js";
12
+ import { buildRepoTools } from "./repos.js";
13
+ import { buildRequestTools } from "./request.js";
14
+ import { buildRiskTools } from "./risks.js";
15
+ import { buildStoryTools } from "./stories.js";
16
+ import { buildTaskTools } from "./tasks.js";
17
+ import { buildTestReportTools } from "./testreports.js";
18
+ import { buildTodoTools } from "./todos.js";
19
+ import { buildUserTools } from "./users.js";
20
+ export function buildTools(client) {
21
+ const ctx = { client };
22
+ return {
23
+ ...buildUserTools(ctx),
24
+ ...buildProductTools(ctx),
25
+ ...buildProjectTools(ctx),
26
+ ...buildProgramTools(ctx),
27
+ ...buildExecutionTools(ctx),
28
+ ...buildStoryTools(ctx),
29
+ ...buildTaskTools(ctx),
30
+ ...buildBugTools(ctx),
31
+ ...buildCaseTools(ctx),
32
+ ...buildTestReportTools(ctx),
33
+ ...buildBuildTools(ctx),
34
+ ...buildReleaseTools(ctx),
35
+ ...buildRepoTools(ctx),
36
+ ...buildDocTools(ctx),
37
+ ...buildEffortTools(ctx),
38
+ ...buildTodoTools(ctx),
39
+ ...buildIssueTools(ctx),
40
+ ...buildRiskTools(ctx),
41
+ ...buildRequestTools(ctx),
42
+ };
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,MAAM,GAAG,GAAmB,EAAE,MAAM,EAAE,CAAC;IACvC,OAAO;QACL,GAAG,cAAc,CAAC,GAAG,CAAC;QACtB,GAAG,iBAAiB,CAAC,GAAG,CAAC;QACzB,GAAG,iBAAiB,CAAC,GAAG,CAAC;QACzB,GAAG,iBAAiB,CAAC,GAAG,CAAC;QACzB,GAAG,mBAAmB,CAAC,GAAG,CAAC;QAC3B,GAAG,eAAe,CAAC,GAAG,CAAC;QACvB,GAAG,cAAc,CAAC,GAAG,CAAC;QACtB,GAAG,aAAa,CAAC,GAAG,CAAC;QACrB,GAAG,cAAc,CAAC,GAAG,CAAC;QACtB,GAAG,oBAAoB,CAAC,GAAG,CAAC;QAC5B,GAAG,eAAe,CAAC,GAAG,CAAC;QACvB,GAAG,iBAAiB,CAAC,GAAG,CAAC;QACzB,GAAG,cAAc,CAAC,GAAG,CAAC;QACtB,GAAG,aAAa,CAAC,GAAG,CAAC;QACrB,GAAG,gBAAgB,CAAC,GAAG,CAAC;QACxB,GAAG,cAAc,CAAC,GAAG,CAAC;QACtB,GAAG,eAAe,CAAC,GAAG,CAAC;QACvB,GAAG,cAAc,CAAC,GAAG,CAAC;QACtB,GAAG,iBAAiB,CAAC,GAAG,CAAC;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildIssueTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;