@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,153 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { STORY_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
|
|
3
|
+
const STORY_SOURCES = ["customer", "user", "po", "market", "research", "competitor", "company", "other"];
|
|
4
|
+
const STORY_CLOSE_REASONS = [
|
|
5
|
+
"done",
|
|
6
|
+
"subdivided",
|
|
7
|
+
"duplicate",
|
|
8
|
+
"postponed",
|
|
9
|
+
"willnotdo",
|
|
10
|
+
"cancel",
|
|
11
|
+
"bydesign",
|
|
12
|
+
];
|
|
13
|
+
export function buildStoryTools(ctx) {
|
|
14
|
+
const { client } = ctx;
|
|
15
|
+
return {
|
|
16
|
+
list_product_stories: defineTool({
|
|
17
|
+
description: "List stories in a product. Filter by status or assignee. Stories drive feature scope in ZenTao.",
|
|
18
|
+
schema: z.object({
|
|
19
|
+
productId: z.number().int().positive(),
|
|
20
|
+
status: z.enum(["active", "changed", "draft", "closed", "all"]).optional(),
|
|
21
|
+
assignedTo: z.string().optional(),
|
|
22
|
+
...paginationShape,
|
|
23
|
+
}),
|
|
24
|
+
handler: async (args) => {
|
|
25
|
+
const payload = await client.stories.listByProduct(args.productId, {
|
|
26
|
+
status: args.status,
|
|
27
|
+
assignedTo: args.assignedTo,
|
|
28
|
+
limit: args.limit ?? 20,
|
|
29
|
+
page: args.page,
|
|
30
|
+
});
|
|
31
|
+
const stories = extractList(payload).map((s) => summarize(s, STORY_SUMMARY_KEYS));
|
|
32
|
+
return { total: extractTotal(payload) ?? stories.length, stories };
|
|
33
|
+
},
|
|
34
|
+
}),
|
|
35
|
+
get_story: defineTool({
|
|
36
|
+
description: "Fetch full details of a story (spec, verification criteria, linked cases, …).",
|
|
37
|
+
schema: z.object({ storyId: z.number().int().positive() }),
|
|
38
|
+
handler: async (args) => client.stories.get(args.storyId),
|
|
39
|
+
}),
|
|
40
|
+
create_story: defineTool({
|
|
41
|
+
description: "Create a new story in a product. Required: productId, title. spec / verify are HTML.",
|
|
42
|
+
schema: z.object({
|
|
43
|
+
productId: z.number().int().positive(),
|
|
44
|
+
title: z.string().min(1),
|
|
45
|
+
branch: z.number().int().optional(),
|
|
46
|
+
module: z.number().int().optional(),
|
|
47
|
+
plan: z.number().int().optional(),
|
|
48
|
+
source: z.enum(STORY_SOURCES).optional(),
|
|
49
|
+
pri: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
50
|
+
estimate: z.number().nonnegative().optional().describe("Estimated hours."),
|
|
51
|
+
spec: z.string().optional().describe("Specification (HTML allowed)."),
|
|
52
|
+
verify: z.string().optional().describe("Verification criteria (HTML allowed)."),
|
|
53
|
+
keywords: z.string().optional(),
|
|
54
|
+
assignedTo: z.string().optional(),
|
|
55
|
+
}),
|
|
56
|
+
handler: async (args) => {
|
|
57
|
+
const { productId, ...rest } = args;
|
|
58
|
+
return client.stories.create(productId, pickDefined(rest));
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
update_story: defineTool({
|
|
62
|
+
description: "Update a story's editable fields. Use change_story for spec/verify revisions that need a change record.",
|
|
63
|
+
schema: z.object({
|
|
64
|
+
storyId: z.number().int().positive(),
|
|
65
|
+
title: z.string().optional(),
|
|
66
|
+
pri: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
67
|
+
estimate: z.number().nonnegative().optional(),
|
|
68
|
+
module: z.number().int().optional(),
|
|
69
|
+
plan: z.number().int().optional(),
|
|
70
|
+
keywords: z.string().optional(),
|
|
71
|
+
}),
|
|
72
|
+
handler: async (args) => {
|
|
73
|
+
const { storyId, ...rest } = args;
|
|
74
|
+
return client.stories.update(storyId, pickDefined(rest));
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
change_story: defineTool({
|
|
78
|
+
description: "Submit a change to spec / verify. Creates a story-change record and bumps the story version.",
|
|
79
|
+
schema: z.object({
|
|
80
|
+
storyId: z.number().int().positive(),
|
|
81
|
+
spec: z.string().optional(),
|
|
82
|
+
verify: z.string().optional(),
|
|
83
|
+
comment: z.string().optional(),
|
|
84
|
+
}),
|
|
85
|
+
handler: async (args) => {
|
|
86
|
+
const { storyId, ...rest } = args;
|
|
87
|
+
return client.stories.change(storyId, pickDefined(rest));
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
review_story: defineTool({
|
|
91
|
+
description: "Review a draft / changed story (pass / revert / clarify / reject).",
|
|
92
|
+
schema: z.object({
|
|
93
|
+
storyId: z.number().int().positive(),
|
|
94
|
+
result: z.enum(["pass", "revert", "clarify", "reject"]),
|
|
95
|
+
preVersion: z.number().int().optional().describe("Story version being reviewed; defaults to current."),
|
|
96
|
+
comment: z.string().optional(),
|
|
97
|
+
closedReason: z.enum(STORY_CLOSE_REASONS).optional().describe("Required when result='reject'."),
|
|
98
|
+
}),
|
|
99
|
+
handler: async (args) => {
|
|
100
|
+
const { storyId, ...rest } = args;
|
|
101
|
+
return client.stories.review(storyId, pickDefined(rest));
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
close_story: defineTool({
|
|
105
|
+
description: "Close a story with a reason.",
|
|
106
|
+
schema: z.object({
|
|
107
|
+
storyId: z.number().int().positive(),
|
|
108
|
+
closedReason: z.enum(STORY_CLOSE_REASONS),
|
|
109
|
+
duplicateStory: z.number().int().positive().optional().describe("Required when closedReason='duplicate'."),
|
|
110
|
+
comment: z.string().optional(),
|
|
111
|
+
}),
|
|
112
|
+
handler: async (args) => {
|
|
113
|
+
if (args.closedReason === "duplicate" && !args.duplicateStory) {
|
|
114
|
+
throw new Error("closedReason='duplicate' requires duplicateStory to be set");
|
|
115
|
+
}
|
|
116
|
+
const { storyId, ...rest } = args;
|
|
117
|
+
return client.stories.close(storyId, pickDefined(rest));
|
|
118
|
+
},
|
|
119
|
+
}),
|
|
120
|
+
activate_story: defineTool({
|
|
121
|
+
description: "Re-activate a closed story.",
|
|
122
|
+
schema: z.object({
|
|
123
|
+
storyId: z.number().int().positive(),
|
|
124
|
+
assignedTo: z.string().optional(),
|
|
125
|
+
comment: z.string().optional(),
|
|
126
|
+
}),
|
|
127
|
+
handler: async (args) => client.stories.activate(args.storyId, pickDefined({ assignedTo: args.assignedTo, comment: args.comment })),
|
|
128
|
+
}),
|
|
129
|
+
assign_story: defineTool({
|
|
130
|
+
description: "Reassign a story to another account.",
|
|
131
|
+
schema: z.object({
|
|
132
|
+
storyId: z.number().int().positive(),
|
|
133
|
+
assignedTo: z.string().min(1),
|
|
134
|
+
comment: z.string().optional(),
|
|
135
|
+
}),
|
|
136
|
+
handler: async (args) => client.stories.assignTo(args.storyId, pickDefined({ assignedTo: args.assignedTo, comment: args.comment })),
|
|
137
|
+
}),
|
|
138
|
+
delete_story: defineTool({
|
|
139
|
+
description: "Delete a story. Irreversible.",
|
|
140
|
+
schema: z.object({ storyId: z.number().int().positive() }),
|
|
141
|
+
handler: async (args) => client.stories.delete(args.storyId),
|
|
142
|
+
}),
|
|
143
|
+
add_story_comment: defineTool({
|
|
144
|
+
description: "Append a comment to a story.",
|
|
145
|
+
schema: z.object({
|
|
146
|
+
storyId: z.number().int().positive(),
|
|
147
|
+
comment: z.string().min(1),
|
|
148
|
+
}),
|
|
149
|
+
handler: async (args) => client.stories.addComment(args.storyId, args.comment),
|
|
150
|
+
}),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stories.js","sourceRoot":"","sources":["../../src/tools/stories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { TASK_SUMMARY_KEYS, defineTool, extractList, extractTotal, pickDefined, summarize, } from "./helpers.js";
|
|
3
|
+
const TASK_TYPES = [
|
|
4
|
+
"design",
|
|
5
|
+
"devel",
|
|
6
|
+
"test",
|
|
7
|
+
"study",
|
|
8
|
+
"discuss",
|
|
9
|
+
"ui",
|
|
10
|
+
"affair",
|
|
11
|
+
"misc",
|
|
12
|
+
"review",
|
|
13
|
+
];
|
|
14
|
+
const TASK_CLOSE_REASONS = ["done", "cancel", "bydesign", "duplicate", "postponed", "willnotdo"];
|
|
15
|
+
export function buildTaskTools(ctx) {
|
|
16
|
+
const { client } = ctx;
|
|
17
|
+
return {
|
|
18
|
+
get_task: defineTool({
|
|
19
|
+
description: "Fetch full details for a task (subtasks, estimate / consumed / left, effort logs).",
|
|
20
|
+
schema: z.object({ taskId: z.number().int().positive() }),
|
|
21
|
+
handler: async (args) => client.tasks.get(args.taskId),
|
|
22
|
+
}),
|
|
23
|
+
list_my_tasks: defineTool({
|
|
24
|
+
description: "List tasks assigned to the authenticated user within ONE execution. Mirrors list_my_bugs.",
|
|
25
|
+
schema: z.object({
|
|
26
|
+
executionId: z.number().int().positive(),
|
|
27
|
+
status: z.enum(["wait", "doing", "done", "pause", "cancel", "closed", "all"]).optional(),
|
|
28
|
+
limit: z.number().int().min(1).max(200).optional(),
|
|
29
|
+
maxScan: z.number().int().min(50).max(10000).optional(),
|
|
30
|
+
}),
|
|
31
|
+
handler: async (args) => {
|
|
32
|
+
const account = await client.getAccount();
|
|
33
|
+
const statusArg = args.status ?? "doing";
|
|
34
|
+
const wantStatus = statusArg === "all" ? undefined : statusArg;
|
|
35
|
+
const limit = args.limit ?? 20;
|
|
36
|
+
const maxScan = args.maxScan ?? 1000;
|
|
37
|
+
const pageSize = 200;
|
|
38
|
+
const matched = [];
|
|
39
|
+
let scanned = 0;
|
|
40
|
+
let totalInExec = 0;
|
|
41
|
+
for (let page = 1; scanned < maxScan; page++) {
|
|
42
|
+
const payload = await client.tasks.listByExecution(args.executionId, {
|
|
43
|
+
limit: pageSize,
|
|
44
|
+
page,
|
|
45
|
+
});
|
|
46
|
+
const batch = extractList(payload).map((t) => t);
|
|
47
|
+
totalInExec = extractTotal(payload) ?? totalInExec;
|
|
48
|
+
if (batch.length === 0)
|
|
49
|
+
break;
|
|
50
|
+
scanned += batch.length;
|
|
51
|
+
for (const t of batch) {
|
|
52
|
+
const at = t.assignedTo;
|
|
53
|
+
const atAccount = typeof at === "string" ? at : at && typeof at === "object" ? at.account : undefined;
|
|
54
|
+
if (atAccount !== account)
|
|
55
|
+
continue;
|
|
56
|
+
if (wantStatus && t.status !== wantStatus)
|
|
57
|
+
continue;
|
|
58
|
+
matched.push(summarize(t, TASK_SUMMARY_KEYS));
|
|
59
|
+
if (matched.length >= limit)
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
if (matched.length >= limit)
|
|
63
|
+
break;
|
|
64
|
+
if (batch.length < pageSize)
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
total: matched.length,
|
|
69
|
+
tasks: matched,
|
|
70
|
+
scanned,
|
|
71
|
+
totalInExec,
|
|
72
|
+
account,
|
|
73
|
+
truncated: scanned >= maxScan && matched.length < limit,
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
create_task: defineTool({
|
|
78
|
+
description: "Create a task in an execution.",
|
|
79
|
+
schema: z.object({
|
|
80
|
+
executionId: z.number().int().positive(),
|
|
81
|
+
name: z.string().min(1),
|
|
82
|
+
type: z.enum(TASK_TYPES).optional(),
|
|
83
|
+
story: z.number().int().optional().describe("Linked story ID."),
|
|
84
|
+
module: z.number().int().optional(),
|
|
85
|
+
assignedTo: z.union([z.string(), z.array(z.string())]).optional().describe("Single account or multiple for team task."),
|
|
86
|
+
pri: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
87
|
+
estimate: z.number().nonnegative().optional(),
|
|
88
|
+
desc: z.string().optional(),
|
|
89
|
+
deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
90
|
+
}),
|
|
91
|
+
handler: async (args) => {
|
|
92
|
+
const { executionId, ...rest } = args;
|
|
93
|
+
return client.tasks.create(executionId, pickDefined(rest));
|
|
94
|
+
},
|
|
95
|
+
}),
|
|
96
|
+
update_task: defineTool({
|
|
97
|
+
description: "Update task fields. Use start_task / finish_task / close_task / pause_task / activate_task for state transitions.",
|
|
98
|
+
schema: z.object({
|
|
99
|
+
taskId: z.number().int().positive(),
|
|
100
|
+
name: z.string().optional(),
|
|
101
|
+
type: z.enum(TASK_TYPES).optional(),
|
|
102
|
+
pri: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
103
|
+
estimate: z.number().nonnegative().optional(),
|
|
104
|
+
left: z.number().nonnegative().optional(),
|
|
105
|
+
consumed: z.number().nonnegative().optional(),
|
|
106
|
+
desc: z.string().optional(),
|
|
107
|
+
deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
108
|
+
}),
|
|
109
|
+
handler: async (args) => {
|
|
110
|
+
const { taskId, ...rest } = args;
|
|
111
|
+
return client.tasks.update(taskId, pickDefined(rest));
|
|
112
|
+
},
|
|
113
|
+
}),
|
|
114
|
+
start_task: defineTool({
|
|
115
|
+
description: "Start a task (wait → doing).",
|
|
116
|
+
schema: z.object({
|
|
117
|
+
taskId: z.number().int().positive(),
|
|
118
|
+
consumed: z.number().nonnegative().optional(),
|
|
119
|
+
left: z.number().nonnegative().optional(),
|
|
120
|
+
comment: z.string().optional(),
|
|
121
|
+
}),
|
|
122
|
+
handler: async (args) => {
|
|
123
|
+
const { taskId, ...rest } = args;
|
|
124
|
+
return client.tasks.start(taskId, pickDefined(rest));
|
|
125
|
+
},
|
|
126
|
+
}),
|
|
127
|
+
finish_task: defineTool({
|
|
128
|
+
description: "Mark a task finished (doing → done).",
|
|
129
|
+
schema: z.object({
|
|
130
|
+
taskId: z.number().int().positive(),
|
|
131
|
+
consumed: z.number().nonnegative().optional(),
|
|
132
|
+
currentConsumed: z.number().nonnegative().optional().describe("Hours logged for this finish action."),
|
|
133
|
+
assignedTo: z.string().optional(),
|
|
134
|
+
comment: z.string().optional(),
|
|
135
|
+
finishedDate: z.string().regex(/^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}:\d{2})?$/).optional(),
|
|
136
|
+
}),
|
|
137
|
+
handler: async (args) => {
|
|
138
|
+
const { taskId, ...rest } = args;
|
|
139
|
+
return client.tasks.finish(taskId, pickDefined(rest));
|
|
140
|
+
},
|
|
141
|
+
}),
|
|
142
|
+
pause_task: defineTool({
|
|
143
|
+
description: "Pause an in-flight task.",
|
|
144
|
+
schema: z.object({ taskId: z.number().int().positive(), comment: z.string().optional() }),
|
|
145
|
+
handler: async (args) => client.tasks.pause(args.taskId, pickDefined({ comment: args.comment })),
|
|
146
|
+
}),
|
|
147
|
+
activate_task: defineTool({
|
|
148
|
+
description: "Re-activate a paused / closed / cancelled task.",
|
|
149
|
+
schema: z.object({
|
|
150
|
+
taskId: z.number().int().positive(),
|
|
151
|
+
left: z.number().nonnegative().optional(),
|
|
152
|
+
assignedTo: z.string().optional(),
|
|
153
|
+
comment: z.string().optional(),
|
|
154
|
+
}),
|
|
155
|
+
handler: async (args) => {
|
|
156
|
+
const { taskId, ...rest } = args;
|
|
157
|
+
return client.tasks.activate(taskId, pickDefined(rest));
|
|
158
|
+
},
|
|
159
|
+
}),
|
|
160
|
+
close_task: defineTool({
|
|
161
|
+
description: "Close a task with a reason.",
|
|
162
|
+
schema: z.object({
|
|
163
|
+
taskId: z.number().int().positive(),
|
|
164
|
+
closedReason: z.enum(TASK_CLOSE_REASONS).optional(),
|
|
165
|
+
comment: z.string().optional(),
|
|
166
|
+
}),
|
|
167
|
+
handler: async (args) => {
|
|
168
|
+
const { taskId, ...rest } = args;
|
|
169
|
+
return client.tasks.close(taskId, pickDefined(rest));
|
|
170
|
+
},
|
|
171
|
+
}),
|
|
172
|
+
cancel_task: defineTool({
|
|
173
|
+
description: "Cancel a task.",
|
|
174
|
+
schema: z.object({ taskId: z.number().int().positive(), comment: z.string().optional() }),
|
|
175
|
+
handler: async (args) => client.tasks.cancel(args.taskId, pickDefined({ comment: args.comment })),
|
|
176
|
+
}),
|
|
177
|
+
assign_task: defineTool({
|
|
178
|
+
description: "Reassign a task.",
|
|
179
|
+
schema: z.object({
|
|
180
|
+
taskId: z.number().int().positive(),
|
|
181
|
+
assignedTo: z.string().min(1),
|
|
182
|
+
left: z.number().nonnegative().optional(),
|
|
183
|
+
comment: z.string().optional(),
|
|
184
|
+
}),
|
|
185
|
+
handler: async (args) => {
|
|
186
|
+
const { taskId, ...rest } = args;
|
|
187
|
+
return client.tasks.assignTo(taskId, pickDefined(rest));
|
|
188
|
+
},
|
|
189
|
+
}),
|
|
190
|
+
delete_task: defineTool({
|
|
191
|
+
description: "Delete a task. Irreversible.",
|
|
192
|
+
schema: z.object({ taskId: z.number().int().positive() }),
|
|
193
|
+
handler: async (args) => client.tasks.delete(args.taskId),
|
|
194
|
+
}),
|
|
195
|
+
add_task_comment: defineTool({
|
|
196
|
+
description: "Append a comment to a task.",
|
|
197
|
+
schema: z.object({
|
|
198
|
+
taskId: z.number().int().positive(),
|
|
199
|
+
comment: z.string().min(1),
|
|
200
|
+
}),
|
|
201
|
+
handler: async (args) => client.tasks.addComment(args.taskId, args.comment),
|
|
202
|
+
}),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EAIjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,GAAG;IACjB,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,QAAQ;CACA,CAAC;AAEX,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAU,CAAC;AAE1G,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC;YACnB,WAAW,EAAE,oFAAoF;YACjG,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,aAAa,EAAE,UAAU,CAAC;YACxB,WAAW,EAAE,2FAA2F;YACxG,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACxC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;gBAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;aACxD,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;gBACzC,MAAM,UAAU,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;gBACrC,MAAM,QAAQ,GAAG,GAAG,CAAC;gBAErB,MAAM,OAAO,GAAW,EAAE,CAAC;gBAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;gBAChB,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;oBAC7C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE;wBACnE,KAAK,EAAE,QAAQ;wBACf,IAAI;qBACL,CAAC,CAAC;oBACH,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAS,CAAC,CAAC;oBACzD,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC;oBACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;wBAAE,MAAM;oBAC9B,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;oBACxB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;wBACtB,MAAM,EAAE,GAAG,CAAC,CAAC,UAA8C,CAAC;wBAC5D,MAAM,SAAS,GACb,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,OAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;wBAClG,IAAI,SAAS,KAAK,OAAO;4BAAE,SAAS;wBACpC,IAAI,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;4BAAE,SAAS;wBACpD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;wBAC9C,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;4BAAE,MAAM;oBACrC,CAAC;oBACD,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBACnC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;wBAAE,MAAM;gBACrC,CAAC;gBAED,OAAO;oBACL,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,KAAK,EAAE,OAAO;oBACd,OAAO;oBACP,WAAW;oBACX,OAAO;oBACP,SAAS,EAAE,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK;iBACxD,CAAC;YACJ,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,gCAAgC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBAC/D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;gBACvH,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,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;aAC7D,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;gBACtC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,mHAAmH;YAChI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;gBACnC,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,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;aAC7D,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,UAAU,EAAE,UAAU,CAAC;YACrB,WAAW,EAAE,8BAA8B;YAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,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,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,sCAAsC;YACnD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBAC7C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;gBACrG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,QAAQ,EAAE;aACtF,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,UAAU,EAAE,UAAU,CAAC;YACrB,WAAW,EAAE,0BAA0B;YACvC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACzF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SAC1E,CAAC;QAEF,aAAa,EAAE,UAAU,CAAC;YACxB,WAAW,EAAE,iDAAiD;YAC9D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,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,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,CAAC;SACF,CAAC;QAEF,UAAU,EAAE,UAAU,CAAC;YACrB,WAAW,EAAE,6BAA6B;YAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE;gBACnD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,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,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACzF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SAC3E,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,kBAAkB;YAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;gBACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,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,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,CAAC;SACF,CAAC;QAEF,WAAW,EAAE,UAAU,CAAC;YACtB,WAAW,EAAE,8BAA8B;YAC3C,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,gBAAgB,EAAE,UAAU,CAAC;YAC3B,WAAW,EAAE,6BAA6B;YAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;aAC3B,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;SAC5E,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
|
|
3
|
+
export function buildTestReportTools(ctx) {
|
|
4
|
+
const { client } = ctx;
|
|
5
|
+
return {
|
|
6
|
+
list_product_testreports: defineTool({
|
|
7
|
+
description: "List test reports of a product.",
|
|
8
|
+
schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
|
|
9
|
+
handler: async (args) => {
|
|
10
|
+
const payload = await client.testreports.listByProduct(args.productId, {
|
|
11
|
+
limit: args.limit ?? 20,
|
|
12
|
+
page: args.page,
|
|
13
|
+
});
|
|
14
|
+
return { total: extractTotal(payload) ?? extractList(payload).length, testreports: extractList(payload) };
|
|
15
|
+
},
|
|
16
|
+
}),
|
|
17
|
+
get_testreport: defineTool({
|
|
18
|
+
description: "Fetch a test report's full details.",
|
|
19
|
+
schema: z.object({ testreportId: z.number().int().positive() }),
|
|
20
|
+
handler: async (args) => client.testreports.get(args.testreportId),
|
|
21
|
+
}),
|
|
22
|
+
create_testreport: defineTool({
|
|
23
|
+
description: "Create a test report under a product.",
|
|
24
|
+
schema: z.object({
|
|
25
|
+
productId: z.number().int().positive(),
|
|
26
|
+
title: z.string().min(1),
|
|
27
|
+
begin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
28
|
+
end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
29
|
+
owner: z.string().optional(),
|
|
30
|
+
report: z.string().optional().describe("Report body (HTML allowed)."),
|
|
31
|
+
execution: z.number().int().optional(),
|
|
32
|
+
builds: z.array(z.number().int().positive()).optional(),
|
|
33
|
+
stories: z.array(z.number().int().positive()).optional(),
|
|
34
|
+
}),
|
|
35
|
+
handler: async (args) => {
|
|
36
|
+
const { productId, ...rest } = args;
|
|
37
|
+
return client.testreports.create(productId, pickDefined(rest));
|
|
38
|
+
},
|
|
39
|
+
}),
|
|
40
|
+
delete_testreport: defineTool({
|
|
41
|
+
description: "Delete a test report. Irreversible.",
|
|
42
|
+
schema: z.object({ testreportId: z.number().int().positive() }),
|
|
43
|
+
handler: async (args) => client.testreports.delete(args.testreportId),
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=testreports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testreports.js","sourceRoot":"","sources":["../../src/tools/testreports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
|
|
3
|
+
const TODO_TYPES = ["custom", "bug", "task", "story", "feedback", "review"];
|
|
4
|
+
export function buildTodoTools(ctx) {
|
|
5
|
+
const { client } = ctx;
|
|
6
|
+
return {
|
|
7
|
+
list_todos: defineTool({
|
|
8
|
+
description: "List the authenticated user's personal todos.",
|
|
9
|
+
schema: z.object({
|
|
10
|
+
status: z.enum(["wait", "doing", "done", "closed", "all"]).optional(),
|
|
11
|
+
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
12
|
+
...paginationShape,
|
|
13
|
+
}),
|
|
14
|
+
handler: async (args) => {
|
|
15
|
+
const payload = await client.todos.list({
|
|
16
|
+
status: args.status,
|
|
17
|
+
date: args.date,
|
|
18
|
+
limit: args.limit ?? 20,
|
|
19
|
+
page: args.page,
|
|
20
|
+
});
|
|
21
|
+
return { total: extractTotal(payload) ?? extractList(payload).length, todos: extractList(payload) };
|
|
22
|
+
},
|
|
23
|
+
}),
|
|
24
|
+
get_todo: defineTool({
|
|
25
|
+
description: "Fetch a single todo.",
|
|
26
|
+
schema: z.object({ todoId: z.number().int().positive() }),
|
|
27
|
+
handler: async (args) => client.todos.get(args.todoId),
|
|
28
|
+
}),
|
|
29
|
+
create_todo: defineTool({
|
|
30
|
+
description: "Create a personal todo.",
|
|
31
|
+
schema: z.object({
|
|
32
|
+
name: z.string().min(1),
|
|
33
|
+
type: z.enum(TODO_TYPES).optional().describe("Defaults to 'custom'."),
|
|
34
|
+
pri: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
35
|
+
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
36
|
+
begin: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).optional(),
|
|
37
|
+
end: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).optional(),
|
|
38
|
+
desc: z.string().optional(),
|
|
39
|
+
objectID: z.number().int().positive().optional().describe("Linked object ID when type is bug/task/story."),
|
|
40
|
+
}),
|
|
41
|
+
handler: async (args) => client.todos.create(pickDefined(args)),
|
|
42
|
+
}),
|
|
43
|
+
update_todo: defineTool({
|
|
44
|
+
description: "Update a todo.",
|
|
45
|
+
schema: z.object({
|
|
46
|
+
todoId: z.number().int().positive(),
|
|
47
|
+
name: z.string().optional(),
|
|
48
|
+
pri: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
|
|
49
|
+
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
50
|
+
desc: z.string().optional(),
|
|
51
|
+
status: z.enum(["wait", "doing", "done", "closed"]).optional(),
|
|
52
|
+
}),
|
|
53
|
+
handler: async (args) => {
|
|
54
|
+
const { todoId, ...rest } = args;
|
|
55
|
+
return client.todos.update(todoId, pickDefined(rest));
|
|
56
|
+
},
|
|
57
|
+
}),
|
|
58
|
+
finish_todo: defineTool({
|
|
59
|
+
description: "Mark a todo as done.",
|
|
60
|
+
schema: z.object({ todoId: z.number().int().positive() }),
|
|
61
|
+
handler: async (args) => client.todos.finish(args.todoId),
|
|
62
|
+
}),
|
|
63
|
+
delete_todo: defineTool({
|
|
64
|
+
description: "Delete a todo. Irreversible.",
|
|
65
|
+
schema: z.object({ todoId: z.number().int().positive() }),
|
|
66
|
+
handler: async (args) => client.todos.delete(args.todoId),
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=todos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../../src/tools/todos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { USER_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, summarize, } from "./helpers.js";
|
|
3
|
+
export function buildUserTools(ctx) {
|
|
4
|
+
const { client } = ctx;
|
|
5
|
+
return {
|
|
6
|
+
whoami: defineTool({
|
|
7
|
+
description: "Return the account name the server is acting as (from ZENTAO_USERNAME, or auto-detected via /user when only ZENTAO_TOKEN is set). Useful for debugging assignment filters.",
|
|
8
|
+
schema: z.object({}),
|
|
9
|
+
handler: async () => {
|
|
10
|
+
const account = await client.getAccount();
|
|
11
|
+
return { account };
|
|
12
|
+
},
|
|
13
|
+
}),
|
|
14
|
+
list_users: defineTool({
|
|
15
|
+
description: "List all users in the ZenTao instance.",
|
|
16
|
+
schema: z.object({
|
|
17
|
+
dept: z.number().int().optional().describe("Filter by department ID."),
|
|
18
|
+
...paginationShape,
|
|
19
|
+
}),
|
|
20
|
+
handler: async (args) => {
|
|
21
|
+
const payload = await client.users.list({
|
|
22
|
+
dept: args.dept,
|
|
23
|
+
limit: args.limit ?? 50,
|
|
24
|
+
page: args.page,
|
|
25
|
+
});
|
|
26
|
+
const users = extractList(payload).map((u) => summarize(u, USER_SUMMARY_KEYS));
|
|
27
|
+
return { total: extractTotal(payload) ?? users.length, users };
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
get_user: defineTool({
|
|
31
|
+
description: "Fetch one user's profile by account name.",
|
|
32
|
+
schema: z.object({ account: z.string().min(1).describe("ZenTao account name (not numeric ID).") }),
|
|
33
|
+
handler: async (args) => client.users.get(args.account),
|
|
34
|
+
}),
|
|
35
|
+
list_departments: defineTool({
|
|
36
|
+
description: "List organizational departments.",
|
|
37
|
+
schema: z.object({ ...paginationShape }),
|
|
38
|
+
handler: async (args) => {
|
|
39
|
+
const payload = await client.users.listDepartments({
|
|
40
|
+
limit: args.limit ?? 50,
|
|
41
|
+
page: args.page,
|
|
42
|
+
});
|
|
43
|
+
return { total: extractTotal(payload) ?? extractList(payload).length, departments: extractList(payload) };
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
list_department_users: defineTool({
|
|
47
|
+
description: "List users in one department.",
|
|
48
|
+
schema: z.object({ departmentId: z.number().int().positive(), ...paginationShape }),
|
|
49
|
+
handler: async (args) => {
|
|
50
|
+
const payload = await client.users.listByDepartment(args.departmentId, {
|
|
51
|
+
limit: args.limit ?? 50,
|
|
52
|
+
page: args.page,
|
|
53
|
+
});
|
|
54
|
+
return { total: extractTotal(payload) ?? extractList(payload).length, users: extractList(payload) };
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"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"}
|