@catchmexz/fedin-vibe-mcp-server 0.1.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/LICENSE +202 -0
- package/dist/common/errors.js +69 -0
- package/dist/common/modularTemplates.js +483 -0
- package/dist/common/pipelineTemplates.js +19 -0
- package/dist/common/types.js +42 -0
- package/dist/common/utils.js +347 -0
- package/dist/common/version.js +1 -0
- package/dist/index.js +217 -0
- package/dist/operations/appstack/appOrchestrations.js +235 -0
- package/dist/operations/appstack/appTags.js +147 -0
- package/dist/operations/appstack/appTemplates.js +67 -0
- package/dist/operations/appstack/applications.js +154 -0
- package/dist/operations/appstack/changeOrders.js +293 -0
- package/dist/operations/appstack/changeRequests.js +263 -0
- package/dist/operations/appstack/deploymentResources.js +265 -0
- package/dist/operations/appstack/globalVars.js +200 -0
- package/dist/operations/appstack/releaseWorkflows.js +178 -0
- package/dist/operations/appstack/variableGroups.js +216 -0
- package/dist/operations/codeup/branches.js +144 -0
- package/dist/operations/codeup/changeRequestComments.js +89 -0
- package/dist/operations/codeup/changeRequests.js +203 -0
- package/dist/operations/codeup/compare.js +26 -0
- package/dist/operations/codeup/files.js +483 -0
- package/dist/operations/codeup/repositories.js +83 -0
- package/dist/operations/codeup/types.js +372 -0
- package/dist/operations/flow/hostGroup.js +48 -0
- package/dist/operations/flow/pipeline.js +530 -0
- package/dist/operations/flow/pipelineJob.js +113 -0
- package/dist/operations/flow/serviceConnection.js +23 -0
- package/dist/operations/flow/types.js +377 -0
- package/dist/operations/git/git-repository.js +334 -0
- package/dist/operations/git/index.js +210 -0
- package/dist/operations/organization/members.js +94 -0
- package/dist/operations/organization/organization.js +73 -0
- package/dist/operations/organization/types.js +111 -0
- package/dist/operations/packages/artifacts.js +64 -0
- package/dist/operations/packages/repositories.js +35 -0
- package/dist/operations/packages/types.js +56 -0
- package/dist/operations/projex/project.js +206 -0
- package/dist/operations/projex/sprint.js +90 -0
- package/dist/operations/projex/types.js +390 -0
- package/dist/operations/projex/workitem.js +452 -0
- package/dist/tool-handlers/appstack-change-orders.js +55 -0
- package/dist/tool-handlers/appstack-change-requests.js +49 -0
- package/dist/tool-handlers/appstack-deployment-resources.js +43 -0
- package/dist/tool-handlers/appstack-global-vars.js +43 -0
- package/dist/tool-handlers/appstack-orchestrations.js +49 -0
- package/dist/tool-handlers/appstack-tags.js +43 -0
- package/dist/tool-handlers/appstack-templates.js +19 -0
- package/dist/tool-handlers/appstack-variable-groups.js +55 -0
- package/dist/tool-handlers/appstack.js +37 -0
- package/dist/tool-handlers/code-management.js +174 -0
- package/dist/tool-handlers/git/branch-operations.js +1 -0
- package/dist/tool-handlers/git/clone-repository.js +36 -0
- package/dist/tool-handlers/git/create-branch.js +26 -0
- package/dist/tool-handlers/git/get-repository-status.js +33 -0
- package/dist/tool-handlers/git/pull-repository.js +27 -0
- package/dist/tool-handlers/git/push-repository.js +37 -0
- package/dist/tool-handlers/git/switch-branch.js +25 -0
- package/dist/tool-handlers/index.js +43 -0
- package/dist/tool-handlers/organization.js +90 -0
- package/dist/tool-handlers/packages.js +32 -0
- package/dist/tool-handlers/pipeline.js +272 -0
- package/dist/tool-handlers/project-management.js +152 -0
- package/dist/tool-handlers/service-connections.js +16 -0
- package/dist/tool-registry/appstack-change-orders.js +40 -0
- package/dist/tool-registry/appstack-change-requests.js +35 -0
- package/dist/tool-registry/appstack-deployment-resources.js +30 -0
- package/dist/tool-registry/appstack-global-vars.js +30 -0
- package/dist/tool-registry/appstack-orchestrations.js +35 -0
- package/dist/tool-registry/appstack-tags.js +30 -0
- package/dist/tool-registry/appstack-templates.js +10 -0
- package/dist/tool-registry/appstack-variable-groups.js +40 -0
- package/dist/tool-registry/appstack.js +25 -0
- package/dist/tool-registry/code-management.js +89 -0
- package/dist/tool-registry/git-repository.js +41 -0
- package/dist/tool-registry/index.js +6 -0
- package/dist/tool-registry/organization.js +65 -0
- package/dist/tool-registry/packages.js +21 -0
- package/dist/tool-registry/pipeline.js +157 -0
- package/dist/tool-registry/project-management.js +108 -0
- package/dist/tool-registry/service-connections.js +10 -0
- package/package.json +39 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { buildUrl, yunxiaoRequest } from "../../common/utils.js";
|
|
2
|
+
import { WorkItemSchema } from "./types.js";
|
|
3
|
+
import { getCurrentUserFunc } from "../organization/organization.js";
|
|
4
|
+
export async function getWorkItemFunc(organizationId, workItemId) {
|
|
5
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}`;
|
|
6
|
+
const response = await yunxiaoRequest(url, {
|
|
7
|
+
method: "GET",
|
|
8
|
+
});
|
|
9
|
+
return WorkItemSchema.parse(response);
|
|
10
|
+
}
|
|
11
|
+
export async function searchWorkitemsFunc(organizationId, category, spaceId, subject, status, createdAfter, createdBefore, updatedAfter, updatedBefore, creator, assignedTo, advancedConditions, orderBy = "gmtCreate", includeDetails = false // 新增参数:是否自动补充缺失的description等详细信息
|
|
12
|
+
) {
|
|
13
|
+
// 处理assignedTo为"self"的情况,自动获取当前用户ID
|
|
14
|
+
let finalAssignedTo = assignedTo;
|
|
15
|
+
let finalCreator = creator;
|
|
16
|
+
if (assignedTo === "self" || creator === "self") {
|
|
17
|
+
try {
|
|
18
|
+
const currentUser = await getCurrentUserFunc();
|
|
19
|
+
if (currentUser.id) {
|
|
20
|
+
if (assignedTo === "self") {
|
|
21
|
+
finalAssignedTo = currentUser.id;
|
|
22
|
+
}
|
|
23
|
+
if (creator === "self") {
|
|
24
|
+
finalCreator = currentUser.id;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
finalAssignedTo = assignedTo;
|
|
29
|
+
finalCreator = creator;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
finalAssignedTo = assignedTo;
|
|
34
|
+
finalCreator = creator;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitems:search`;
|
|
38
|
+
const payload = {
|
|
39
|
+
category: category,
|
|
40
|
+
spaceId: spaceId,
|
|
41
|
+
};
|
|
42
|
+
const conditions = buildWorkitemConditions({
|
|
43
|
+
subject,
|
|
44
|
+
status,
|
|
45
|
+
createdAfter,
|
|
46
|
+
createdBefore,
|
|
47
|
+
updatedAfter,
|
|
48
|
+
updatedBefore,
|
|
49
|
+
creator: finalCreator,
|
|
50
|
+
assignedTo: finalAssignedTo,
|
|
51
|
+
advancedConditions
|
|
52
|
+
});
|
|
53
|
+
if (conditions) {
|
|
54
|
+
payload.conditions = conditions;
|
|
55
|
+
}
|
|
56
|
+
payload.orderBy = orderBy;
|
|
57
|
+
const response = await yunxiaoRequest(url, {
|
|
58
|
+
method: "POST",
|
|
59
|
+
body: payload,
|
|
60
|
+
});
|
|
61
|
+
if (!Array.isArray(response)) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
const workItems = response.map(workitem => WorkItemSchema.parse(workitem));
|
|
65
|
+
// 如果需要补充详细信息,使用分批并发方式获取
|
|
66
|
+
if (includeDetails) {
|
|
67
|
+
const itemsNeedingDetails = workItems.filter(item => item.id.length > 0 &&
|
|
68
|
+
(item.description === null || item.description === undefined || item.description === ""));
|
|
69
|
+
if (itemsNeedingDetails.length > 0) {
|
|
70
|
+
// 分批并发获取详情
|
|
71
|
+
const descriptionMap = await batchGetWorkItemDetails(organizationId, itemsNeedingDetails);
|
|
72
|
+
// 更新workItems中的description
|
|
73
|
+
return workItems.map(item => {
|
|
74
|
+
if (descriptionMap.has(item.id)) {
|
|
75
|
+
return {
|
|
76
|
+
...item,
|
|
77
|
+
description: descriptionMap.get(item.id) || item.description
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return item;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return workItems;
|
|
85
|
+
}
|
|
86
|
+
// 分批并发获取工作项详情
|
|
87
|
+
async function batchGetWorkItemDetails(organizationId, workItems, batchSize = 10, // 每批处理10个
|
|
88
|
+
maxItems = 100 // 最多处理100个
|
|
89
|
+
) {
|
|
90
|
+
const descriptionMap = new Map();
|
|
91
|
+
// 限制处理数量
|
|
92
|
+
const limitedItems = workItems.slice(0, maxItems);
|
|
93
|
+
// 分批处理
|
|
94
|
+
for (let i = 0; i < limitedItems.length; i += batchSize) {
|
|
95
|
+
const batch = limitedItems.slice(i, i + batchSize);
|
|
96
|
+
// 批次内并发执行
|
|
97
|
+
const batchResults = await Promise.allSettled(batch.map(async (item) => {
|
|
98
|
+
// 再次检查item.id是否为有效字符串
|
|
99
|
+
if (typeof item.id !== 'string' || item.id.length === 0) {
|
|
100
|
+
return {
|
|
101
|
+
id: item.id || 'unknown',
|
|
102
|
+
description: null,
|
|
103
|
+
success: false
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const itemId = item.id;
|
|
107
|
+
try {
|
|
108
|
+
const detailedItem = await getWorkItemFunc(organizationId, itemId);
|
|
109
|
+
return {
|
|
110
|
+
id: itemId,
|
|
111
|
+
description: detailedItem.description,
|
|
112
|
+
success: true
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return {
|
|
117
|
+
id: itemId,
|
|
118
|
+
description: null,
|
|
119
|
+
success: false
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}));
|
|
123
|
+
// 处理批次结果
|
|
124
|
+
batchResults.forEach((result) => {
|
|
125
|
+
if (result.status === 'fulfilled') {
|
|
126
|
+
// 确保description类型正确,将undefined转换为null
|
|
127
|
+
const description = result.value.description === undefined ? null : result.value.description;
|
|
128
|
+
descriptionMap.set(result.value.id, description);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return descriptionMap;
|
|
133
|
+
}
|
|
134
|
+
function buildWorkitemConditions(args) {
|
|
135
|
+
if (args.advancedConditions) {
|
|
136
|
+
return args.advancedConditions;
|
|
137
|
+
}
|
|
138
|
+
const filterConditions = [];
|
|
139
|
+
if (args.subject) {
|
|
140
|
+
filterConditions.push({
|
|
141
|
+
className: "string",
|
|
142
|
+
fieldIdentifier: "subject",
|
|
143
|
+
format: "input",
|
|
144
|
+
operator: "CONTAINS",
|
|
145
|
+
toValue: null,
|
|
146
|
+
value: [args.subject],
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (args.status) {
|
|
150
|
+
const statusValues = args.status.split(",");
|
|
151
|
+
const values = statusValues.map(v => v.trim());
|
|
152
|
+
filterConditions.push({
|
|
153
|
+
className: "status",
|
|
154
|
+
fieldIdentifier: "status",
|
|
155
|
+
format: "list",
|
|
156
|
+
operator: "CONTAINS",
|
|
157
|
+
toValue: null,
|
|
158
|
+
value: values,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (args.createdAfter) {
|
|
162
|
+
const createdBefore = args.createdBefore ? `${args.createdBefore} 23:59:59` : null;
|
|
163
|
+
filterConditions.push({
|
|
164
|
+
className: "dateTime",
|
|
165
|
+
fieldIdentifier: "gmtCreate",
|
|
166
|
+
format: "input",
|
|
167
|
+
operator: "BETWEEN",
|
|
168
|
+
toValue: createdBefore,
|
|
169
|
+
value: [`${args.createdAfter} 00:00:00`],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (args.updatedAfter) {
|
|
173
|
+
const updatedBefore = args.updatedBefore ? `${args.updatedBefore} 23:59:59` : null;
|
|
174
|
+
filterConditions.push({
|
|
175
|
+
className: "dateTime",
|
|
176
|
+
fieldIdentifier: "gmtModified",
|
|
177
|
+
format: "input",
|
|
178
|
+
operator: "BETWEEN",
|
|
179
|
+
toValue: updatedBefore,
|
|
180
|
+
value: [`${args.updatedAfter} 00:00:00`],
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
if (args.creator) {
|
|
184
|
+
const creatorValues = args.creator.split(",");
|
|
185
|
+
const values = creatorValues.map(v => v.trim());
|
|
186
|
+
filterConditions.push({
|
|
187
|
+
className: "user",
|
|
188
|
+
fieldIdentifier: "creator",
|
|
189
|
+
format: "list",
|
|
190
|
+
operator: "CONTAINS",
|
|
191
|
+
toValue: null,
|
|
192
|
+
value: values,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (args.assignedTo) {
|
|
196
|
+
const assignedToValues = args.assignedTo.split(",");
|
|
197
|
+
const values = assignedToValues.map(v => v.trim());
|
|
198
|
+
filterConditions.push({
|
|
199
|
+
className: "user",
|
|
200
|
+
fieldIdentifier: "assignedTo",
|
|
201
|
+
format: "list",
|
|
202
|
+
operator: "CONTAINS",
|
|
203
|
+
toValue: null,
|
|
204
|
+
value: values,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
if (filterConditions.length === 0) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
const conditions = {
|
|
211
|
+
conditionGroups: [filterConditions],
|
|
212
|
+
};
|
|
213
|
+
return JSON.stringify(conditions);
|
|
214
|
+
}
|
|
215
|
+
export async function createWorkItemFunc(organizationId, assignedTo, spaceId, subject, workitemTypeId, customFieldValues, description, labels, parentId, participants, sprint, trackers, verifier, versions) {
|
|
216
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitems`;
|
|
217
|
+
const payload = {
|
|
218
|
+
assignedTo,
|
|
219
|
+
spaceId,
|
|
220
|
+
subject,
|
|
221
|
+
workitemTypeId
|
|
222
|
+
};
|
|
223
|
+
if (customFieldValues) {
|
|
224
|
+
payload.customFieldValues = customFieldValues;
|
|
225
|
+
}
|
|
226
|
+
if (description !== undefined) {
|
|
227
|
+
payload.description = description;
|
|
228
|
+
}
|
|
229
|
+
if (labels && labels.length > 0) {
|
|
230
|
+
payload.labels = labels;
|
|
231
|
+
}
|
|
232
|
+
if (parentId !== undefined) {
|
|
233
|
+
payload.parentId = parentId;
|
|
234
|
+
}
|
|
235
|
+
if (participants && participants.length > 0) {
|
|
236
|
+
payload.participants = participants;
|
|
237
|
+
}
|
|
238
|
+
if (sprint !== undefined) {
|
|
239
|
+
payload.sprint = sprint;
|
|
240
|
+
}
|
|
241
|
+
if (trackers && trackers.length > 0) {
|
|
242
|
+
payload.trackers = trackers;
|
|
243
|
+
}
|
|
244
|
+
if (verifier !== undefined) {
|
|
245
|
+
payload.verifier = verifier;
|
|
246
|
+
}
|
|
247
|
+
if (versions && versions.length > 0) {
|
|
248
|
+
payload.versions = versions;
|
|
249
|
+
}
|
|
250
|
+
const response = await yunxiaoRequest(url, {
|
|
251
|
+
method: "POST",
|
|
252
|
+
body: payload,
|
|
253
|
+
});
|
|
254
|
+
return WorkItemSchema.parse(response);
|
|
255
|
+
}
|
|
256
|
+
export async function updateWorkItemFunc(organizationId, workItemId, updateWorkItemFields) {
|
|
257
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}`;
|
|
258
|
+
const response = await yunxiaoRequest(url, {
|
|
259
|
+
method: "PUT",
|
|
260
|
+
body: updateWorkItemFields,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
export async function getWorkItemTypesFunc(organizationId, id, // 项目唯一标识
|
|
264
|
+
category // 工作项类型,可选值为 Req,Bug,Task 等。
|
|
265
|
+
) {
|
|
266
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${id}/workitemTypes?category=${encodeURIComponent(category)}`;
|
|
267
|
+
const response = await yunxiaoRequest(url, {
|
|
268
|
+
method: "GET",
|
|
269
|
+
});
|
|
270
|
+
return response;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 列出所有工作项类型
|
|
274
|
+
* @param organizationId 企业ID
|
|
275
|
+
* @returns 工作项类型列表
|
|
276
|
+
*/
|
|
277
|
+
export async function listAllWorkItemTypesFunc(organizationId) {
|
|
278
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitemTypes`;
|
|
279
|
+
const response = await yunxiaoRequest(url, {
|
|
280
|
+
method: "GET",
|
|
281
|
+
});
|
|
282
|
+
// 确保返回的是数组格式
|
|
283
|
+
if (Array.isArray(response)) {
|
|
284
|
+
return response;
|
|
285
|
+
}
|
|
286
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
287
|
+
if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
|
|
288
|
+
return response.result;
|
|
289
|
+
}
|
|
290
|
+
// 其他情况返回空数组
|
|
291
|
+
return [];
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* 列出工作项类型
|
|
295
|
+
* @param organizationId 企业ID
|
|
296
|
+
* @param spaceIdentifier 项目唯一标识
|
|
297
|
+
* @param category 工作项类型分类(可选)
|
|
298
|
+
* @returns 工作项类型列表
|
|
299
|
+
*/
|
|
300
|
+
export async function listWorkItemTypesFunc(organizationId, spaceIdentifier, category) {
|
|
301
|
+
let url = `/oapi/v1/projex/organizations/${organizationId}/projects/${spaceIdentifier}/workitemTypes`;
|
|
302
|
+
// 如果提供了category参数,则添加到URL中
|
|
303
|
+
if (category) {
|
|
304
|
+
url += `?category=${encodeURIComponent(category)}`;
|
|
305
|
+
}
|
|
306
|
+
const response = await yunxiaoRequest(url, {
|
|
307
|
+
method: "GET",
|
|
308
|
+
});
|
|
309
|
+
// 确保返回的是数组格式
|
|
310
|
+
if (Array.isArray(response)) {
|
|
311
|
+
return response;
|
|
312
|
+
}
|
|
313
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
314
|
+
if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
|
|
315
|
+
return response.result;
|
|
316
|
+
}
|
|
317
|
+
// 其他情况返回空数组
|
|
318
|
+
return [];
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* 获取工作项类型详情
|
|
322
|
+
* @param organizationId 企业ID
|
|
323
|
+
* @param spaceIdentifier 项目唯一标识
|
|
324
|
+
* @param id 工作项类型ID
|
|
325
|
+
* @returns 工作项类型详情
|
|
326
|
+
*/
|
|
327
|
+
export async function getWorkItemTypeFunc(organizationId, id) {
|
|
328
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitemTypes/${id}`;
|
|
329
|
+
const response = await yunxiaoRequest(url, {
|
|
330
|
+
method: "GET",
|
|
331
|
+
});
|
|
332
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
333
|
+
if (response && typeof response === 'object' && 'result' in response) {
|
|
334
|
+
return response.result;
|
|
335
|
+
}
|
|
336
|
+
// 否则直接返回响应
|
|
337
|
+
return response;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* 列出工作项关联的工作项类型
|
|
341
|
+
* @param organizationId 企业ID
|
|
342
|
+
* @param spaceIdentifier 项目唯一标识
|
|
343
|
+
* @param workItemTypeId 工作项ID
|
|
344
|
+
* @param relationType 关联类型 (BLOCK, RELATE, DUPLICATE, CHILD)
|
|
345
|
+
* @returns 关联的工作项类型列表
|
|
346
|
+
*/
|
|
347
|
+
export async function listWorkItemRelationWorkItemTypesFunc(organizationId, workItemTypeId, relationType) {
|
|
348
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitemTypes/${workItemTypeId}/relationWorkitemTypes`;
|
|
349
|
+
const queryParams = {};
|
|
350
|
+
if (relationType != null) {
|
|
351
|
+
queryParams.relationType = relationType;
|
|
352
|
+
}
|
|
353
|
+
let finalUrl = buildUrl(url, queryParams);
|
|
354
|
+
const response = await yunxiaoRequest(finalUrl, {
|
|
355
|
+
method: "GET",
|
|
356
|
+
});
|
|
357
|
+
// 确保返回的是数组格式
|
|
358
|
+
if (Array.isArray(response)) {
|
|
359
|
+
return response;
|
|
360
|
+
}
|
|
361
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
362
|
+
if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
|
|
363
|
+
return response.result;
|
|
364
|
+
}
|
|
365
|
+
// 其他情况返回空数组
|
|
366
|
+
return [];
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* 获取工作项类型字段配置
|
|
370
|
+
* @param organizationId 企业ID
|
|
371
|
+
* @param projectId 项目唯一标识
|
|
372
|
+
* @param workItemTypeId 工作项类型ID
|
|
373
|
+
* @returns 工作项类型字段配置
|
|
374
|
+
*/
|
|
375
|
+
export async function getWorkItemTypeFieldConfigFunc(organizationId, projectId, workItemTypeId) {
|
|
376
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${projectId}/workitemTypes/${workItemTypeId}/fields`;
|
|
377
|
+
const response = await yunxiaoRequest(url, {
|
|
378
|
+
method: "GET",
|
|
379
|
+
});
|
|
380
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
381
|
+
if (response && typeof response === 'object' && 'result' in response) {
|
|
382
|
+
return response.result;
|
|
383
|
+
}
|
|
384
|
+
// 否则直接返回响应
|
|
385
|
+
return response;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* 获取工作项工作流
|
|
389
|
+
* @param organizationId 企业ID
|
|
390
|
+
* @param projectId 项目唯一标识
|
|
391
|
+
* @param workItemTypeId 工作项类型ID
|
|
392
|
+
* @returns 工作项工作流信息
|
|
393
|
+
*/
|
|
394
|
+
export async function getWorkItemWorkflowFunc(organizationId, projectId, workItemTypeId) {
|
|
395
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${projectId}/workitemTypes/${workItemTypeId}/workflows`;
|
|
396
|
+
const response = await yunxiaoRequest(url, {
|
|
397
|
+
method: "GET",
|
|
398
|
+
});
|
|
399
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
400
|
+
if (response && typeof response === 'object' && 'result' in response) {
|
|
401
|
+
return response.result;
|
|
402
|
+
}
|
|
403
|
+
// 否则直接返回响应
|
|
404
|
+
return response;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* 列出工作项评论
|
|
408
|
+
* @param organizationId 企业ID
|
|
409
|
+
* @param workItemId 工作项ID
|
|
410
|
+
* @param page 页码
|
|
411
|
+
* @param perPage 每页条数
|
|
412
|
+
* @returns 工作项评论列表
|
|
413
|
+
*/
|
|
414
|
+
export async function listWorkItemCommentsFunc(organizationId, workItemId, page = 1, perPage = 20) {
|
|
415
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}/comments?page=${page}&perPage=${perPage}`;
|
|
416
|
+
const response = await yunxiaoRequest(url, {
|
|
417
|
+
method: "GET",
|
|
418
|
+
});
|
|
419
|
+
// 确保返回的是数组格式
|
|
420
|
+
if (Array.isArray(response)) {
|
|
421
|
+
return response;
|
|
422
|
+
}
|
|
423
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
424
|
+
if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
|
|
425
|
+
return response.result;
|
|
426
|
+
}
|
|
427
|
+
// 其他情况返回空数组
|
|
428
|
+
return [];
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* 创建工作项评论
|
|
432
|
+
* @param organizationId 企业ID
|
|
433
|
+
* @param workItemId 工作项ID
|
|
434
|
+
* @param content 评论内容
|
|
435
|
+
* @returns 创建的评论信息
|
|
436
|
+
*/
|
|
437
|
+
export async function createWorkItemCommentFunc(organizationId, workItemId, content) {
|
|
438
|
+
const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}/comments`;
|
|
439
|
+
const payload = {
|
|
440
|
+
content: content
|
|
441
|
+
};
|
|
442
|
+
const response = await yunxiaoRequest(url, {
|
|
443
|
+
method: "POST",
|
|
444
|
+
body: payload,
|
|
445
|
+
});
|
|
446
|
+
// 如果响应中包含result字段,则返回result中的数据
|
|
447
|
+
if (response && typeof response === 'object' && 'result' in response) {
|
|
448
|
+
return response.result;
|
|
449
|
+
}
|
|
450
|
+
// 否则直接返回响应
|
|
451
|
+
return response;
|
|
452
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createChangeOrder, listChangeOrderVersions, getChangeOrder, listChangeOrderJobLogs, findTaskOperationLog, executeJobAction, listChangeOrdersByOrigin, CreateChangeOrderRequestSchema, ListChangeOrderVersionsRequestSchema, GetChangeOrderRequestSchema, ListChangeOrderJobLogsRequestSchema, FindTaskOperationLogRequestSchema, ExecuteJobActionRequestSchema, ListChangeOrdersByOriginRequestSchema } from '../operations/appstack/changeOrders.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the appstack change order tool requests
|
|
4
|
+
*
|
|
5
|
+
* @param request - The tool request
|
|
6
|
+
* @returns The tool response or null if not handled
|
|
7
|
+
*/
|
|
8
|
+
export async function handleAppStackChangeOrderTools(request) {
|
|
9
|
+
switch (request.params.name) {
|
|
10
|
+
case 'create_change_order':
|
|
11
|
+
const createParams = CreateChangeOrderRequestSchema.parse(request.params.arguments);
|
|
12
|
+
const createResult = await createChangeOrder(createParams);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(createResult, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
case 'list_change_order_versions':
|
|
17
|
+
const listVersionsParams = ListChangeOrderVersionsRequestSchema.parse(request.params.arguments);
|
|
18
|
+
const listVersionsResult = await listChangeOrderVersions(listVersionsParams);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(listVersionsResult, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
case 'get_change_order':
|
|
23
|
+
const getParams = GetChangeOrderRequestSchema.parse(request.params.arguments);
|
|
24
|
+
const getResult = await getChangeOrder(getParams);
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(getResult, null, 2) }],
|
|
27
|
+
};
|
|
28
|
+
case 'list_change_order_job_logs':
|
|
29
|
+
const listLogsParams = ListChangeOrderJobLogsRequestSchema.parse(request.params.arguments);
|
|
30
|
+
const listLogsResult = await listChangeOrderJobLogs(listLogsParams);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: JSON.stringify(listLogsResult, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
case 'find_task_operation_log':
|
|
35
|
+
const findLogParams = FindTaskOperationLogRequestSchema.parse(request.params.arguments);
|
|
36
|
+
const findLogResult = await findTaskOperationLog(findLogParams);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: JSON.stringify(findLogResult, null, 2) }],
|
|
39
|
+
};
|
|
40
|
+
case 'execute_job_action':
|
|
41
|
+
const executeParams = ExecuteJobActionRequestSchema.parse(request.params.arguments);
|
|
42
|
+
const executeResult = await executeJobAction(executeParams);
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: "text", text: JSON.stringify(executeResult, null, 2) }],
|
|
45
|
+
};
|
|
46
|
+
case 'list_change_orders_by_origin':
|
|
47
|
+
const listByOriginParams = ListChangeOrdersByOriginRequestSchema.parse(request.params.arguments);
|
|
48
|
+
const listByOriginResult = await listChangeOrdersByOrigin(listByOriginParams);
|
|
49
|
+
return {
|
|
50
|
+
content: [{ type: "text", text: JSON.stringify(listByOriginResult, null, 2) }],
|
|
51
|
+
};
|
|
52
|
+
default:
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createChangeRequest, getChangeRequestAuditItems, listChangeRequestExecutions, listChangeRequestWorkItems, cancelChangeRequest, closeChangeRequest, CreateChangeRequestRequestSchema, GetChangeRequestAuditItemsRequestSchema, ListChangeRequestExecutionsRequestSchema, ListChangeRequestWorkItemsRequestSchema, CancelChangeRequestRequestSchema, CloseChangeRequestRequestSchema } from '../operations/appstack/changeRequests.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the appstack change requests tool requests
|
|
4
|
+
*
|
|
5
|
+
* @param request - The tool request
|
|
6
|
+
* @returns The tool response or null if not handled
|
|
7
|
+
*/
|
|
8
|
+
export async function handleAppStackChangeRequestTools(request) {
|
|
9
|
+
switch (request.params.name) {
|
|
10
|
+
case 'create_change_request':
|
|
11
|
+
const createParams = CreateChangeRequestRequestSchema.parse(request.params.arguments);
|
|
12
|
+
const createResult = await createChangeRequest(createParams);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(createResult, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
case 'get_change_request_audit_items':
|
|
17
|
+
const getAuditParams = GetChangeRequestAuditItemsRequestSchema.parse(request.params.arguments);
|
|
18
|
+
const getAuditResult = await getChangeRequestAuditItems(getAuditParams);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(getAuditResult, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
case 'list_change_request_executions':
|
|
23
|
+
const listExecParams = ListChangeRequestExecutionsRequestSchema.parse(request.params.arguments);
|
|
24
|
+
const listExecResult = await listChangeRequestExecutions(listExecParams);
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(listExecResult, null, 2) }],
|
|
27
|
+
};
|
|
28
|
+
case 'list_change_request_work_items':
|
|
29
|
+
const listWorkParams = ListChangeRequestWorkItemsRequestSchema.parse(request.params.arguments);
|
|
30
|
+
const listWorkResult = await listChangeRequestWorkItems(listWorkParams);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: JSON.stringify(listWorkResult, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
case 'cancel_change_request':
|
|
35
|
+
const cancelParams = CancelChangeRequestRequestSchema.parse(request.params.arguments);
|
|
36
|
+
const cancelResult = await cancelChangeRequest(cancelParams);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: JSON.stringify(cancelResult, null, 2) }],
|
|
39
|
+
};
|
|
40
|
+
case 'close_change_request':
|
|
41
|
+
const closeParams = CloseChangeRequestRequestSchema.parse(request.params.arguments);
|
|
42
|
+
const closeResult = await closeChangeRequest(closeParams);
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: "text", text: JSON.stringify(closeResult, null, 2) }],
|
|
45
|
+
};
|
|
46
|
+
default:
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { getMachineDeployLog, addHostListToHostGroup, addHostListToDeployGroup, deleteHostListFromDeployGroup, deleteHostListFromHostGroup, GetMachineDeployLogRequestSchema, AddHostListToHostGroupRequestSchema, AddHostListToDeployGroupRequestSchema, DeleteHostListFromDeployGroupRequestSchema, DeleteHostListFromHostGroupRequestSchema } from '../operations/appstack/deploymentResources.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the appstack deployment resources tool requests
|
|
4
|
+
*
|
|
5
|
+
* @param request - The tool request
|
|
6
|
+
* @returns The tool response or null if not handled
|
|
7
|
+
*/
|
|
8
|
+
export async function handleAppStackDeploymentResourceTools(request) {
|
|
9
|
+
switch (request.params.name) {
|
|
10
|
+
case 'get_machine_deploy_log':
|
|
11
|
+
const getLogParams = GetMachineDeployLogRequestSchema.parse(request.params.arguments);
|
|
12
|
+
const getLogResult = await getMachineDeployLog(getLogParams);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(getLogResult, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
case 'add_host_list_to_host_group':
|
|
17
|
+
const addHostGroupParams = AddHostListToHostGroupRequestSchema.parse(request.params.arguments);
|
|
18
|
+
const addHostGroupResult = await addHostListToHostGroup(addHostGroupParams);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(addHostGroupResult, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
case 'add_host_list_to_deploy_group':
|
|
23
|
+
const addDeployGroupParams = AddHostListToDeployGroupRequestSchema.parse(request.params.arguments);
|
|
24
|
+
const addDeployGroupResult = await addHostListToDeployGroup(addDeployGroupParams);
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(addDeployGroupResult, null, 2) }],
|
|
27
|
+
};
|
|
28
|
+
case 'delete_host_list_from_deploy_group':
|
|
29
|
+
const deleteDeployGroupParams = DeleteHostListFromDeployGroupRequestSchema.parse(request.params.arguments);
|
|
30
|
+
const deleteDeployGroupResult = await deleteHostListFromDeployGroup(deleteDeployGroupParams);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: JSON.stringify(deleteDeployGroupResult, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
case 'delete_host_list_from_host_group':
|
|
35
|
+
const deleteHostGroupParams = DeleteHostListFromHostGroupRequestSchema.parse(request.params.arguments);
|
|
36
|
+
const deleteHostGroupResult = await deleteHostListFromHostGroup(deleteHostGroupParams);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: JSON.stringify(deleteHostGroupResult, null, 2) }],
|
|
39
|
+
};
|
|
40
|
+
default:
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createGlobalVar, deleteGlobalVar, getGlobalVar, updateGlobalVar, listGlobalVars, CreateGlobalVarRequestSchema, DeleteGlobalVarRequestSchema, GetGlobalVarRequestSchema, UpdateGlobalVarRequestSchema, ListGlobalVarsRequestSchema } from '../operations/appstack/globalVars.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the appstack global variables tool requests
|
|
4
|
+
*
|
|
5
|
+
* @param request - The tool request
|
|
6
|
+
* @returns The tool response or null if not handled
|
|
7
|
+
*/
|
|
8
|
+
export async function handleAppStackGlobalVarTools(request) {
|
|
9
|
+
switch (request.params.name) {
|
|
10
|
+
case 'create_global_var':
|
|
11
|
+
const createParams = CreateGlobalVarRequestSchema.parse(request.params.arguments);
|
|
12
|
+
const createResult = await createGlobalVar(createParams);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(createResult, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
case 'delete_global_var':
|
|
17
|
+
const deleteParams = DeleteGlobalVarRequestSchema.parse(request.params.arguments);
|
|
18
|
+
const deleteResult = await deleteGlobalVar(deleteParams);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(deleteResult, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
case 'get_global_var':
|
|
23
|
+
const getParams = GetGlobalVarRequestSchema.parse(request.params.arguments);
|
|
24
|
+
const getResult = await getGlobalVar(getParams);
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(getResult, null, 2) }],
|
|
27
|
+
};
|
|
28
|
+
case 'update_global_var':
|
|
29
|
+
const updateParams = UpdateGlobalVarRequestSchema.parse(request.params.arguments);
|
|
30
|
+
const updateResult = await updateGlobalVar(updateParams);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: JSON.stringify(updateResult, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
case 'list_global_vars':
|
|
35
|
+
const listParams = ListGlobalVarsRequestSchema.parse(request.params.arguments);
|
|
36
|
+
const listResult = await listGlobalVars(listParams);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: JSON.stringify(listResult, null, 2) }],
|
|
39
|
+
};
|
|
40
|
+
default:
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|