@xurenxiang1219/pingcode-mcp 0.3.1
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 +115 -0
- package/.env.stdio.local.example +13 -0
- package/README.md +222 -0
- package/dist/approve-write.d.ts +3 -0
- package/dist/approve-write.d.ts.map +1 -0
- package/dist/approve-write.js +81 -0
- package/dist/approve-write.js.map +1 -0
- package/dist/auth/cimd-client-resolver.d.ts +35 -0
- package/dist/auth/cimd-client-resolver.d.ts.map +1 -0
- package/dist/auth/cimd-client-resolver.js +293 -0
- package/dist/auth/cimd-client-resolver.js.map +1 -0
- package/dist/auth/memory-store.d.ts +15 -0
- package/dist/auth/memory-store.d.ts.map +1 -0
- package/dist/auth/memory-store.js +46 -0
- package/dist/auth/memory-store.js.map +1 -0
- package/dist/auth/pingcode-oauth-client.d.ts +23 -0
- package/dist/auth/pingcode-oauth-client.d.ts.map +1 -0
- package/dist/auth/pingcode-oauth-client.js +103 -0
- package/dist/auth/pingcode-oauth-client.js.map +1 -0
- package/dist/auth/pingcode-oauth-provider.d.ts +70 -0
- package/dist/auth/pingcode-oauth-provider.d.ts.map +1 -0
- package/dist/auth/pingcode-oauth-provider.js +414 -0
- package/dist/auth/pingcode-oauth-provider.js.map +1 -0
- package/dist/auth/redis-store.d.ts +16 -0
- package/dist/auth/redis-store.d.ts.map +1 -0
- package/dist/auth/redis-store.js +54 -0
- package/dist/auth/redis-store.js.map +1 -0
- package/dist/auth/runtime.d.ts +10 -0
- package/dist/auth/runtime.d.ts.map +1 -0
- package/dist/auth/runtime.js +57 -0
- package/dist/auth/runtime.js.map +1 -0
- package/dist/auth/store.d.ts +35 -0
- package/dist/auth/store.d.ts.map +1 -0
- package/dist/auth/store.js +55 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/auth/token-cipher.d.ts +7 -0
- package/dist/auth/token-cipher.d.ts.map +1 -0
- package/dist/auth/token-cipher.js +36 -0
- package/dist/auth/token-cipher.js.map +1 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +270 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/content-hash.d.ts +5 -0
- package/dist/domain/content-hash.d.ts.map +1 -0
- package/dist/domain/content-hash.js +17 -0
- package/dist/domain/content-hash.js.map +1 -0
- package/dist/domain/requirement-context.d.ts +29 -0
- package/dist/domain/requirement-context.d.ts.map +1 -0
- package/dist/domain/requirement-context.js +2 -0
- package/dist/domain/requirement-context.js.map +1 -0
- package/dist/domain/test-case-context.d.ts +56 -0
- package/dist/domain/test-case-context.d.ts.map +1 -0
- package/dist/domain/test-case-context.js +2 -0
- package/dist/domain/test-case-context.js.map +1 -0
- package/dist/domain/work-item-context.d.ts +47 -0
- package/dist/domain/work-item-context.d.ts.map +1 -0
- package/dist/domain/work-item-context.js +2 -0
- package/dist/domain/work-item-context.js.map +1 -0
- package/dist/environment.d.ts +2 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +21 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect-wiki.d.ts +3 -0
- package/dist/inspect-wiki.d.ts.map +1 -0
- package/dist/inspect-wiki.js +49 -0
- package/dist/inspect-wiki.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/create-server.d.ts +10 -0
- package/dist/mcp/create-server.d.ts.map +1 -0
- package/dist/mcp/create-server.js +40 -0
- package/dist/mcp/create-server.js.map +1 -0
- package/dist/mcp/pagination-guidance.d.ts +19 -0
- package/dist/mcp/pagination-guidance.d.ts.map +1 -0
- package/dist/mcp/pagination-guidance.js +36 -0
- package/dist/mcp/pagination-guidance.js.map +1 -0
- package/dist/mcp/reference-resolution.d.ts +19 -0
- package/dist/mcp/reference-resolution.d.ts.map +1 -0
- package/dist/mcp/reference-resolution.js +160 -0
- package/dist/mcp/reference-resolution.js.map +1 -0
- package/dist/mcp/tool-registry.d.ts +2 -0
- package/dist/mcp/tool-registry.d.ts.map +1 -0
- package/dist/mcp/tool-registry.js +55 -0
- package/dist/mcp/tool-registry.js.map +1 -0
- package/dist/mcp/tool-runtime.d.ts +22 -0
- package/dist/mcp/tool-runtime.d.ts.map +1 -0
- package/dist/mcp/tool-runtime.js +214 -0
- package/dist/mcp/tool-runtime.js.map +1 -0
- package/dist/mcp/tools/member-role.d.ts +8 -0
- package/dist/mcp/tools/member-role.d.ts.map +1 -0
- package/dist/mcp/tools/member-role.js +451 -0
- package/dist/mcp/tools/member-role.js.map +1 -0
- package/dist/mcp/tools/metadata.d.ts +5 -0
- package/dist/mcp/tools/metadata.d.ts.map +1 -0
- package/dist/mcp/tools/metadata.js +606 -0
- package/dist/mcp/tools/metadata.js.map +1 -0
- package/dist/mcp/tools/project-context.d.ts +4 -0
- package/dist/mcp/tools/project-context.d.ts.map +1 -0
- package/dist/mcp/tools/project-context.js +111 -0
- package/dist/mcp/tools/project-context.js.map +1 -0
- package/dist/mcp/tools/project.d.ts +7 -0
- package/dist/mcp/tools/project.d.ts.map +1 -0
- package/dist/mcp/tools/project.js +370 -0
- package/dist/mcp/tools/project.js.map +1 -0
- package/dist/mcp/tools/relation.d.ts +7 -0
- package/dist/mcp/tools/relation.d.ts.map +1 -0
- package/dist/mcp/tools/relation.js +592 -0
- package/dist/mcp/tools/relation.js.map +1 -0
- package/dist/mcp/tools/runtime-info.d.ts +4 -0
- package/dist/mcp/tools/runtime-info.d.ts.map +1 -0
- package/dist/mcp/tools/runtime-info.js +49 -0
- package/dist/mcp/tools/runtime-info.js.map +1 -0
- package/dist/mcp/tools/ship-suite.d.ts +7 -0
- package/dist/mcp/tools/ship-suite.d.ts.map +1 -0
- package/dist/mcp/tools/ship-suite.js +636 -0
- package/dist/mcp/tools/ship-suite.js.map +1 -0
- package/dist/mcp/tools/ship.d.ts +7 -0
- package/dist/mcp/tools/ship.d.ts.map +1 -0
- package/dist/mcp/tools/ship.js +617 -0
- package/dist/mcp/tools/ship.js.map +1 -0
- package/dist/mcp/tools/sync.d.ts +10 -0
- package/dist/mcp/tools/sync.d.ts.map +1 -0
- package/dist/mcp/tools/sync.js +1110 -0
- package/dist/mcp/tools/sync.js.map +1 -0
- package/dist/mcp/tools/task.d.ts +5 -0
- package/dist/mcp/tools/task.d.ts.map +1 -0
- package/dist/mcp/tools/task.js +236 -0
- package/dist/mcp/tools/task.js.map +1 -0
- package/dist/mcp/tools/test-case-bulk.d.ts +7 -0
- package/dist/mcp/tools/test-case-bulk.d.ts.map +1 -0
- package/dist/mcp/tools/test-case-bulk.js +297 -0
- package/dist/mcp/tools/test-case-bulk.js.map +1 -0
- package/dist/mcp/tools/test-case-delete.d.ts +7 -0
- package/dist/mcp/tools/test-case-delete.d.ts.map +1 -0
- package/dist/mcp/tools/test-case-delete.js +247 -0
- package/dist/mcp/tools/test-case-delete.js.map +1 -0
- package/dist/mcp/tools/test-case.d.ts +5 -0
- package/dist/mcp/tools/test-case.d.ts.map +1 -0
- package/dist/mcp/tools/test-case.js +155 -0
- package/dist/mcp/tools/test-case.js.map +1 -0
- package/dist/mcp/tools/test-library.d.ts +7 -0
- package/dist/mcp/tools/test-library.d.ts.map +1 -0
- package/dist/mcp/tools/test-library.js +302 -0
- package/dist/mcp/tools/test-library.js.map +1 -0
- package/dist/mcp/tools/wiki.d.ts +5 -0
- package/dist/mcp/tools/wiki.d.ts.map +1 -0
- package/dist/mcp/tools/wiki.js +266 -0
- package/dist/mcp/tools/wiki.js.map +1 -0
- package/dist/mcp/write-approval.d.ts +48 -0
- package/dist/mcp/write-approval.d.ts.map +1 -0
- package/dist/mcp/write-approval.js +321 -0
- package/dist/mcp/write-approval.js.map +1 -0
- package/dist/observability/metrics.d.ts +46 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +79 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/pingcode/access-token-provider.d.ts +5 -0
- package/dist/pingcode/access-token-provider.d.ts.map +1 -0
- package/dist/pingcode/access-token-provider.js +2 -0
- package/dist/pingcode/access-token-provider.js.map +1 -0
- package/dist/pingcode/client.d.ts +43 -0
- package/dist/pingcode/client.d.ts.map +1 -0
- package/dist/pingcode/client.js +300 -0
- package/dist/pingcode/client.js.map +1 -0
- package/dist/pingcode/errors.d.ts +20 -0
- package/dist/pingcode/errors.d.ts.map +1 -0
- package/dist/pingcode/errors.js +14 -0
- package/dist/pingcode/errors.js.map +1 -0
- package/dist/pingcode/schemas.d.ts +465 -0
- package/dist/pingcode/schemas.d.ts.map +1 -0
- package/dist/pingcode/schemas.js +450 -0
- package/dist/pingcode/schemas.js.map +1 -0
- package/dist/pingcode/token-provider.d.ts +20 -0
- package/dist/pingcode/token-provider.d.ts.map +1 -0
- package/dist/pingcode/token-provider.js +97 -0
- package/dist/pingcode/token-provider.js.map +1 -0
- package/dist/pingcode/write-response.d.ts +9 -0
- package/dist/pingcode/write-response.d.ts.map +1 -0
- package/dist/pingcode/write-response.js +39 -0
- package/dist/pingcode/write-response.js.map +1 -0
- package/dist/services.d.ts +22 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +84 -0
- package/dist/services.js.map +1 -0
- package/dist/sources/metadata-source.d.ts +445 -0
- package/dist/sources/metadata-source.d.ts.map +1 -0
- package/dist/sources/metadata-source.js +167 -0
- package/dist/sources/metadata-source.js.map +1 -0
- package/dist/sources/project-context-source.d.ts +61 -0
- package/dist/sources/project-context-source.d.ts.map +1 -0
- package/dist/sources/project-context-source.js +224 -0
- package/dist/sources/project-context-source.js.map +1 -0
- package/dist/sources/relation-source.d.ts +83 -0
- package/dist/sources/relation-source.d.ts.map +1 -0
- package/dist/sources/relation-source.js +129 -0
- package/dist/sources/relation-source.js.map +1 -0
- package/dist/sources/requirement-source.d.ts +5 -0
- package/dist/sources/requirement-source.d.ts.map +1 -0
- package/dist/sources/requirement-source.js +2 -0
- package/dist/sources/requirement-source.js.map +1 -0
- package/dist/sources/ship-source.d.ts +67 -0
- package/dist/sources/ship-source.d.ts.map +1 -0
- package/dist/sources/ship-source.js +135 -0
- package/dist/sources/ship-source.js.map +1 -0
- package/dist/sources/test-case-source.d.ts +30 -0
- package/dist/sources/test-case-source.d.ts.map +1 -0
- package/dist/sources/test-case-source.js +206 -0
- package/dist/sources/test-case-source.js.map +1 -0
- package/dist/sources/wiki-source.d.ts +34 -0
- package/dist/sources/wiki-source.d.ts.map +1 -0
- package/dist/sources/wiki-source.js +136 -0
- package/dist/sources/wiki-source.js.map +1 -0
- package/dist/sources/work-item-source.d.ts +33 -0
- package/dist/sources/work-item-source.d.ts.map +1 -0
- package/dist/sources/work-item-source.js +159 -0
- package/dist/sources/work-item-source.js.map +1 -0
- package/dist/sources/write-source.d.ts +461 -0
- package/dist/sources/write-source.d.ts.map +1 -0
- package/dist/sources/write-source.js +174 -0
- package/dist/sources/write-source.js.map +1 -0
- package/dist/transports/bearer-auth.d.ts +20 -0
- package/dist/transports/bearer-auth.d.ts.map +1 -0
- package/dist/transports/bearer-auth.js +79 -0
- package/dist/transports/bearer-auth.js.map +1 -0
- package/dist/transports/http.d.ts +11 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +203 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/metrics-auth.d.ts +3 -0
- package/dist/transports/metrics-auth.d.ts.map +1 -0
- package/dist/transports/metrics-auth.js +22 -0
- package/dist/transports/metrics-auth.js.map +1 -0
- package/dist/transports/stdio.d.ts +5 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +11 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/uat/run-label.d.ts +2 -0
- package/dist/uat/run-label.d.ts.map +1 -0
- package/dist/uat/run-label.js +12 -0
- package/dist/uat/run-label.js.map +1 -0
- package/dist/verify.d.ts +3 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +59 -0
- package/dist/verify.js.map +1 -0
- package/dist/write/approval.d.ts +35 -0
- package/dist/write/approval.d.ts.map +1 -0
- package/dist/write/approval.js +66 -0
- package/dist/write/approval.js.map +1 -0
- package/dist/write/plan.d.ts +2 -0
- package/dist/write/plan.d.ts.map +1 -0
- package/dist/write/plan.js +17 -0
- package/dist/write/plan.js.map +1 -0
- package/dist/write/runtime.d.ts +90 -0
- package/dist/write/runtime.d.ts.map +1 -0
- package/dist/write/runtime.js +244 -0
- package/dist/write/runtime.js.map +1 -0
- package/dist/write/store.d.ts +101 -0
- package/dist/write/store.d.ts.map +1 -0
- package/dist/write/store.js +201 -0
- package/dist/write/store.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/project-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAwB9C,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8FnF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { PingCodeError } from "../../pingcode/errors.js";
|
|
2
|
+
import { executeTool, requestIdForLog } from "../tool-runtime.js";
|
|
3
|
+
import * as z from "zod/v4";
|
|
4
|
+
import { ProjectContextSource, } from "../../sources/project-context-source.js";
|
|
5
|
+
const readOnlyAnnotations = {
|
|
6
|
+
readOnlyHint: true,
|
|
7
|
+
destructiveHint: false,
|
|
8
|
+
idempotentHint: true,
|
|
9
|
+
openWorldHint: false,
|
|
10
|
+
};
|
|
11
|
+
const contextResource = z.enum(["project", "shipProduct", "testLibrary"]);
|
|
12
|
+
const contextSelection = z.object({
|
|
13
|
+
id: z.string().trim().min(1).max(200).describe("已确认资源 ID;来自对应列表、详情或创建结果"),
|
|
14
|
+
identifier: z.string().trim().min(1).max(200),
|
|
15
|
+
name: z.string().trim().min(1).max(500),
|
|
16
|
+
}).strict();
|
|
17
|
+
export function registerProjectContextTools(server, logger) {
|
|
18
|
+
server.registerTool("pingcode_project_context_get", {
|
|
19
|
+
title: "读取当前项目的 PingCode 上下文",
|
|
20
|
+
description: "最多调用一次。读取当前工作区固定路径 .pingcode-mcp/context.json 中已确认的 PingCode 项目、Ship 产品或 Test Library。此文件是可选项;configured=false 时不要重试此 Tool,应改用 pingcode_project_list/pingcode_ship_product_list/pingcode_test_library_list。上下文只是候选建议:用户本次未主动指定资源时,Agent 必须展示名称、identifier 和资源类型并询问是否使用,不得静默套用。此操作只读,不读取 Secret。",
|
|
21
|
+
inputSchema: {},
|
|
22
|
+
annotations: readOnlyAnnotations,
|
|
23
|
+
}, async (_input, extra) => executeTool(logger, "pingcode_project_context_get", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), {}, async () => {
|
|
24
|
+
try {
|
|
25
|
+
const loaded = await new ProjectContextSource({
|
|
26
|
+
listRoots: () => server.server.listRoots(),
|
|
27
|
+
}).get();
|
|
28
|
+
return {
|
|
29
|
+
configured: true,
|
|
30
|
+
...loaded.context,
|
|
31
|
+
source: loaded.source,
|
|
32
|
+
message: null,
|
|
33
|
+
requiresUserConfirmation: true,
|
|
34
|
+
nextTool: "ask_user",
|
|
35
|
+
nextTools: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (!(error instanceof PingCodeError) || error.code !== "PROJECT_CONTEXT_INVALID") {
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
configured: false,
|
|
44
|
+
version: null,
|
|
45
|
+
pingcode: null,
|
|
46
|
+
source: null,
|
|
47
|
+
message: `${error.message}。这是可选配置,不要重试本 Tool。`,
|
|
48
|
+
requiresUserConfirmation: false,
|
|
49
|
+
nextTool: null,
|
|
50
|
+
nextTools: ["pingcode_project_list", "pingcode_ship_product_list", "pingcode_test_library_list"],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}, { formatResult: formatProjectContextResult }));
|
|
54
|
+
server.registerTool("pingcode_project_context_save", {
|
|
55
|
+
title: "保存当前工作区的 PingCode 上下文",
|
|
56
|
+
description: "仅在用户明确同意保存当前选中的 PingCode 项目、Ship 产品或 Test Library 后调用。只允许写入当前 workspace root 下固定的 .pingcode-mcp/context.json;会保留其他已保存资源并原子更新文件,不保存 Secret、Token 或 Approval 字段。resource 的 id、identifier、name 必须来自用户刚确认的列表/详情/创建结果;confirm 必须为 true,Agent 不得自行视为用户同意。后续使用时必须先读取并向用户确认该上下文,用户本次主动指定的资源优先。",
|
|
57
|
+
inputSchema: {
|
|
58
|
+
resource_type: contextResource.describe("要保存的资源类型;project、shipProduct 或 testLibrary"),
|
|
59
|
+
resource: contextSelection.describe("用户刚确认的资源身份,字段必须来自权威列表、详情或创建结果"),
|
|
60
|
+
confirm: z.literal(true).describe("仅在用户明确同意保存到当前工作区后传 true"),
|
|
61
|
+
},
|
|
62
|
+
annotations: {
|
|
63
|
+
readOnlyHint: false,
|
|
64
|
+
destructiveHint: false,
|
|
65
|
+
idempotentHint: true,
|
|
66
|
+
openWorldHint: false,
|
|
67
|
+
},
|
|
68
|
+
}, async (input, extra) => executeTool(logger, "pingcode_project_context_save", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { resourceType: input.resource_type, resourceId: input.resource.id }, async () => {
|
|
69
|
+
const loaded = await new ProjectContextSource({
|
|
70
|
+
listRoots: () => server.server.listRoots(),
|
|
71
|
+
}).save(input.resource_type, input.resource);
|
|
72
|
+
return {
|
|
73
|
+
configured: true,
|
|
74
|
+
...loaded.context,
|
|
75
|
+
source: loaded.source,
|
|
76
|
+
saved: input.resource_type,
|
|
77
|
+
message: "已按用户确认保存当前工作区上下文;下次使用前仍需向用户确认是否复用。",
|
|
78
|
+
requiresUserConfirmation: true,
|
|
79
|
+
nextTool: "ask_user",
|
|
80
|
+
};
|
|
81
|
+
}, { formatResult: formatSavedProjectContextResult }));
|
|
82
|
+
}
|
|
83
|
+
function formatProjectContextResult(result) {
|
|
84
|
+
if (!result.configured) {
|
|
85
|
+
return [
|
|
86
|
+
"当前工作区还没有已保存的 PingCode 上下文。",
|
|
87
|
+
"下一步:请先选择要使用的资源:",
|
|
88
|
+
"- 项目:调用 pingcode_project_list",
|
|
89
|
+
"- Ship 产品:调用 pingcode_ship_product_list",
|
|
90
|
+
"- 测试库:调用 pingcode_test_library_list",
|
|
91
|
+
"选定后,如需下次继续使用,Agent 会先询问你是否保存为当前工作区的候选资源。",
|
|
92
|
+
].join("\n");
|
|
93
|
+
}
|
|
94
|
+
const labels = [];
|
|
95
|
+
if (result.pingcode?.project) {
|
|
96
|
+
labels.push(`项目:${result.pingcode.project.name ?? "未命名"}${result.pingcode.project.identifier ? ` (${result.pingcode.project.identifier})` : ""} [${result.pingcode.project.id}]`);
|
|
97
|
+
}
|
|
98
|
+
if (result.pingcode?.testLibrary) {
|
|
99
|
+
labels.push(`测试库:${result.pingcode.testLibrary.name ?? "未命名"}${result.pingcode.testLibrary.identifier ? ` (${result.pingcode.testLibrary.identifier})` : ""} [${result.pingcode.testLibrary.id}]`);
|
|
100
|
+
}
|
|
101
|
+
if (result.pingcode?.shipProduct) {
|
|
102
|
+
labels.push(`Ship 产品:${result.pingcode.shipProduct.name ?? "未命名"}${result.pingcode.shipProduct.identifier ? ` (${result.pingcode.shipProduct.identifier})` : ""} [${result.pingcode.shipProduct.id}]`);
|
|
103
|
+
}
|
|
104
|
+
return labels.length > 0
|
|
105
|
+
? `当前工作区 PingCode 上下文已配置\n${labels.map((label) => `- ${label}`).join("\n")}\n请先向用户确认是否复用其中的资源;用户本次主动指定的资源优先。`
|
|
106
|
+
: "当前工作区已配置 PingCode 上下文,但没有可显示的资源。";
|
|
107
|
+
}
|
|
108
|
+
function formatSavedProjectContextResult(result) {
|
|
109
|
+
return `已保存 PingCode 上下文:${result.saved}\n文件:${result.source.path}\n${result.message}`;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=project-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../../src/mcp/tools/project-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Logger } from "../../logger.js";
|
|
3
|
+
import type { Services } from "../../services.js";
|
|
4
|
+
import type { WriteRuntime } from "../../write/runtime.js";
|
|
5
|
+
import { type WriteApprovalMode } from "../write-approval.js";
|
|
6
|
+
export declare function registerProjectWriteTools(server: McpServer, services: Services, logger: Logger, runtime: WriteRuntime, writeApprovalMode: WriteApprovalMode): void;
|
|
7
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAI9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAQL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAiG9B,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EACrB,iBAAiB,EAAE,iBAAiB,GACnC,IAAI,CA0EN"}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
import { PingCodeError } from "../../pingcode/errors.js";
|
|
3
|
+
import { contentHashSchema } from "../../domain/content-hash.js";
|
|
4
|
+
import { requestHash } from "../../write/plan.js";
|
|
5
|
+
import { executeTool, requestIdForLog } from "../tool-runtime.js";
|
|
6
|
+
import { resolveTeamReference, resolveUserReference } from "../reference-resolution.js";
|
|
7
|
+
import { approvalTokenSchema, commitWithApproval, formatPreviewToolResult, formatWriteConfirmationMessage, formatWriteToolResult, requestClientWriteConfirmation, resolveCommitVerification, } from "../write-approval.js";
|
|
8
|
+
const identifier = z.string().trim().min(1).max(200);
|
|
9
|
+
const contentHash = contentHashSchema;
|
|
10
|
+
const approvalContextId = z.string().uuid();
|
|
11
|
+
const agentSessionId = z.string().trim().min(8).max(200).optional();
|
|
12
|
+
const sourceReferenceSchema = z.object({
|
|
13
|
+
type: z.enum(["wiki", "task", "test_case", "spec", "plan", "code", "project"]),
|
|
14
|
+
id: identifier,
|
|
15
|
+
url: z.url().optional(),
|
|
16
|
+
content_hash: contentHash.optional(),
|
|
17
|
+
});
|
|
18
|
+
const memberSchema = z.object({
|
|
19
|
+
id: identifier.optional().describe("成员用户/团队 ID;来自 pingcode_user_list/search 或团队目录;名称入口使用 name"),
|
|
20
|
+
name: identifier.optional().describe("成员名称;Tool 会按 type 从用户或团队目录解析"),
|
|
21
|
+
type: z.enum(["user", "user_group"]),
|
|
22
|
+
}).strict().refine((value) => value.id !== undefined || value.name !== undefined, "成员必须提供 id 或 name").refine((value) => value.id === undefined || value.name === undefined, "成员 id 与 name 不得同时提供");
|
|
23
|
+
const projectFieldsSchema = z.object({
|
|
24
|
+
name: z.string().trim().min(1).max(200).describe("项目名称"),
|
|
25
|
+
identifier: z
|
|
26
|
+
.string()
|
|
27
|
+
.trim()
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(15)
|
|
30
|
+
.regex(/^[A-Za-z][A-Za-z0-9_-]*$/, "identifier 必须以字母开头,只能包含字母、数字、下划线或连字符")
|
|
31
|
+
.describe("项目标识;必须在当前企业内唯一"),
|
|
32
|
+
type: z.enum(["scrum", "kanban", "waterfall", "hybrid"]).describe("项目模型类型"),
|
|
33
|
+
visibility: z.enum(["public", "private"]).optional().describe("项目可见性"),
|
|
34
|
+
description: z.string().max(50_000).optional().describe("项目描述"),
|
|
35
|
+
assignee_id: identifier.optional().describe("兼容字段;由 Tool 通过用户目录验证"),
|
|
36
|
+
assignee_name: identifier.optional().describe("项目负责人姓名;Tool 会通过用户目录解析 assignee_id"),
|
|
37
|
+
scope_type: z.enum(["organization", "user_group"]).optional().describe("项目归属范围类型"),
|
|
38
|
+
scope_id: identifier.optional().describe("兼容字段;scope_type=user_group 时由团队目录验证"),
|
|
39
|
+
scope_name: identifier.optional().describe("归属团队名称;Tool 会从团队目录解析 scope_id"),
|
|
40
|
+
members: z
|
|
41
|
+
.array(memberSchema)
|
|
42
|
+
.max(200)
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("可选的普通项目成员或团队;为空时不添加普通成员。需要添加时先用 pingcode_user_list 或 pingcode_user_search 让用户确认"),
|
|
45
|
+
}).strict().refine((value) => value.scope_type !== "user_group" || value.scope_id !== undefined || value.scope_name !== undefined, "scope_type=user_group 时必须提供 scope_id 或 scope_name").refine((value) => value.assignee_id !== undefined || value.assignee_name !== undefined, "assignee_id 或 assignee_name 至少提供一个").refine((value) => value.scope_id === undefined || value.scope_type !== undefined, "提供 scope_id 时必须同时提供 scope_type").refine((value) => value.assignee_name === undefined || value.assignee_id === undefined, "assignee_id 与 assignee_name 不得同时提供").refine((value) => value.scope_name === undefined || value.scope_id === undefined, "scope_id 与 scope_name 不得同时提供").refine((value) => value.scope_name === undefined || value.scope_type === "user_group", "scope_name 只有 scope_type=user_group 时有效");
|
|
46
|
+
const projectPlanSchema = z.object({
|
|
47
|
+
plan_id: identifier.describe("创建计划稳定 ID;Preview 与 Commit 必须完全相同"),
|
|
48
|
+
operations: z.array(z.object({
|
|
49
|
+
operation_id: identifier.describe("项目创建计划内唯一操作 ID"),
|
|
50
|
+
action: z.literal("create").describe("只能是项目 create;不能传 task、story 或 test_case"),
|
|
51
|
+
fields: projectFieldsSchema.describe("PingCode 项目创建字段,不是 Task 或 Test Case 字段"),
|
|
52
|
+
source_references: z
|
|
53
|
+
.array(sourceReferenceSchema)
|
|
54
|
+
.min(1)
|
|
55
|
+
.max(20)
|
|
56
|
+
.describe("项目创建依据数组;至少一个,不能传字符串"),
|
|
57
|
+
}).strict()).length(1),
|
|
58
|
+
}).strict().describe("只允许一个 PingCode 项目 create operation;Task/Test Case 必须使用各自的 sync Tool");
|
|
59
|
+
const previewAnnotations = {
|
|
60
|
+
readOnlyHint: true,
|
|
61
|
+
destructiveHint: false,
|
|
62
|
+
idempotentHint: false,
|
|
63
|
+
openWorldHint: true,
|
|
64
|
+
};
|
|
65
|
+
const commitAnnotations = {
|
|
66
|
+
readOnlyHint: false,
|
|
67
|
+
destructiveHint: true,
|
|
68
|
+
idempotentHint: true,
|
|
69
|
+
openWorldHint: true,
|
|
70
|
+
};
|
|
71
|
+
export function registerProjectWriteTools(server, services, logger, runtime, writeApprovalMode) {
|
|
72
|
+
server.registerTool("pingcode_project_create_preview", {
|
|
73
|
+
title: "预览创建 PingCode 项目",
|
|
74
|
+
description: "仅用于预览创建一个 PingCode 项目。创建的最小字段是 name、identifier、type 和经用户确认的负责人 assignee_id/assignee_name;assignee_id 与 assignee_name 二选一,负责人候选应来自 pingcode_user_search。正常用户回复只展示项目名称、identifier、可见性、负责人、普通成员和字段差异;Commit 是否显示 MCP Client 确认由 PINGCODE_WRITE_CONFIRMATION 决定。requestHash、approvalContextId、sessionBinding、evidenceHash、agent_session_id 和 idempotency_key 仅供 Agent 内部传递,不得在正常用户回复中展示或要求用户复制。members 可省略,表示不额外加入普通成员。members 不表示管理员角色,本 Tool 不接受 role_id。禁止把 Task、Story、子 Task 或 Test Case 同步计划传给此 Tool;那些操作必须分别使用 pingcode_task_sync_preview 或 pingcode_test_case_sync_preview。输入必须是一个 operations 数组,且恰好包含一个 action=create 的项目操作,每个操作必须包含 fields 对象和 source_references 数组。最小结构示例:operations=[{operation_id:'project-create', action:'create', fields:{name:'项目名称', identifier:'PROJECT', type:'scrum', assignee_name:'负责人'}, source_references:[{type:'plan', id:'plan-1'}]}]。会检查项目名称和 identifier 冲突并返回差异;不会写入 PingCode,也不支持更新、删除或任意 REST 请求。",
|
|
75
|
+
inputSchema: {
|
|
76
|
+
...projectPlanSchema.shape,
|
|
77
|
+
plan_id: projectPlanSchema.shape.plan_id.optional().describe("业务上必填;省略仅用于返回缺参引导"),
|
|
78
|
+
operations: projectPlanSchema.shape.operations.optional().describe("业务上必填且恰好一个项目操作;省略仅用于返回缺参引导"),
|
|
79
|
+
agent_session_id: agentSessionId,
|
|
80
|
+
},
|
|
81
|
+
annotations: previewAnnotations,
|
|
82
|
+
}, async (input, extra) => executeTool(logger, "pingcode_project_create_preview", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { planId: input.plan_id ?? "" }, () => {
|
|
83
|
+
if (input.plan_id === undefined || input.operations === undefined) {
|
|
84
|
+
throw new PingCodeError("缺少 plan_id 或 operations;请补充项目创建计划后重试 Preview", "BAD_REQUEST");
|
|
85
|
+
}
|
|
86
|
+
return previewProjectPlan({ plan_id: input.plan_id, operations: input.operations }, services, runtime, input.agent_session_id, extra.authInfo);
|
|
87
|
+
}, { formatResult: formatPreviewToolResult }));
|
|
88
|
+
server.registerTool("pingcode_project_create_commit", {
|
|
89
|
+
title: "提交创建 PingCode 项目",
|
|
90
|
+
description: "依已核准的 Preview 创建一个 PingCode 项目。Commit 必须原样复用 Preview 请求中的 plan_id 和 operations;不要复制 Preview 响应里的 camelCase operations 展示对象。创建成功并回读确认后,Agent 应询问用户是否将项目的 id、identifier、name 保存到当前工作区;只有用户明确同意才调用 pingcode_project_context_save。是否要求当前 MCP Client 确认由 PINGCODE_WRITE_CONFIRMATION 决定,并原样使用验证信息和唯一幂等键。",
|
|
91
|
+
inputSchema: {
|
|
92
|
+
...projectPlanSchema.shape,
|
|
93
|
+
agent_session_id: agentSessionId,
|
|
94
|
+
preview_id: approvalContextId.optional().describe("可选。省略时 Server 依相同 plan_id 与 operations 自动匹配刚才的 Preview,并据此恢复 request hash、evidence hash、session binding 和幂等边界;仅当客户端确实读到 Preview 的 approvalContextId 时才需要传入"),
|
|
95
|
+
approval_context_id: approvalContextId.optional().describe("已弃用,等同 preview_id;新调用只传 preview_id"),
|
|
96
|
+
approval_token: approvalTokenSchema(writeApprovalMode),
|
|
97
|
+
idempotency_key: identifier.min(16).max(200).optional(),
|
|
98
|
+
},
|
|
99
|
+
annotations: commitAnnotations,
|
|
100
|
+
}, async (input, extra) => executeTool(logger, "pingcode_project_create_commit", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { planId: input.plan_id }, async () => {
|
|
101
|
+
runtime.assertMcpWriteScope(extra.authInfo?.scopes);
|
|
102
|
+
const verification = await resolveCommitVerification(runtime, {
|
|
103
|
+
previewId: input.preview_id,
|
|
104
|
+
approvalContextId: input.approval_context_id,
|
|
105
|
+
idempotencyKey: input.idempotency_key,
|
|
106
|
+
requestHash: requestHash({ plan_id: input.plan_id, operations: input.operations }),
|
|
107
|
+
agentSessionId: input.agent_session_id,
|
|
108
|
+
authInfo: extra.authInfo,
|
|
109
|
+
}, "project");
|
|
110
|
+
const resolvedInput = {
|
|
111
|
+
...input,
|
|
112
|
+
request_hash: verification.requestHash,
|
|
113
|
+
approval_context_id: verification.approvalContextId,
|
|
114
|
+
session_binding: verification.sessionBinding,
|
|
115
|
+
evidence_hash: verification.evidenceHash,
|
|
116
|
+
idempotency_key: verification.idempotencyKey,
|
|
117
|
+
};
|
|
118
|
+
await requestClientWriteConfirmation(server, logger, writeApprovalMode, input.approval_token, projectCommitConfirmationMessage(input.operations[0]?.fields), runtime.requiresConfirmation(["create"]));
|
|
119
|
+
return commitProjectPlan(resolvedInput, services, runtime, writeApprovalMode, extra.authInfo);
|
|
120
|
+
}, { formatResult: formatWriteToolResult }));
|
|
121
|
+
}
|
|
122
|
+
async function previewProjectPlan(input, services, runtime, agentSessionIdValue, authInfo) {
|
|
123
|
+
const resolvedInput = await resolveProjectPlanReferences(input, services);
|
|
124
|
+
const operation = resolvedInput.operations[0];
|
|
125
|
+
if (!operation) {
|
|
126
|
+
throw new PingCodeError("项目创建计划不能为空", "BAD_REQUEST");
|
|
127
|
+
}
|
|
128
|
+
await assertNoProjectConflict(operation.fields, services);
|
|
129
|
+
const operations = [{
|
|
130
|
+
operationId: operation.operation_id,
|
|
131
|
+
action: "create",
|
|
132
|
+
targetId: null,
|
|
133
|
+
changes: changesFromCreate(operation.fields),
|
|
134
|
+
sourceReferences: operation.source_references,
|
|
135
|
+
}];
|
|
136
|
+
const plan = { plan_id: input.plan_id, operations: input.operations };
|
|
137
|
+
const requestHashValue = requestHash(plan);
|
|
138
|
+
const evidenceHash = requestHash({ planId: input.plan_id, requestHash: requestHashValue, operations });
|
|
139
|
+
const context = await runtime.createApprovalContext({
|
|
140
|
+
resourceType: "project",
|
|
141
|
+
requestHash: requestHashValue,
|
|
142
|
+
evidenceHash,
|
|
143
|
+
...(agentSessionIdValue === undefined ? {} : { agentSessionId: agentSessionIdValue }),
|
|
144
|
+
...(authInfo === undefined ? {} : { authInfo }),
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
planId: input.plan_id,
|
|
148
|
+
requestHash: requestHashValue,
|
|
149
|
+
approvalContextId: context.approvalContextId,
|
|
150
|
+
sessionBinding: context.sessionBinding,
|
|
151
|
+
evidenceHash,
|
|
152
|
+
approvalExpiresAt: context.expiresAt,
|
|
153
|
+
counts: { creates: 1, updates: 0, relations: 0 },
|
|
154
|
+
warnings: projectWarnings(operation.fields),
|
|
155
|
+
operations,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async function resolveProjectPlanReferences(input, services) {
|
|
159
|
+
const operations = await Promise.all(input.operations.map(async (operation) => {
|
|
160
|
+
const fields = { ...operation.fields };
|
|
161
|
+
if (fields.assignee_id !== undefined || fields.assignee_name !== undefined) {
|
|
162
|
+
fields.assignee_id = await resolveUserReference("项目负责人", fields.assignee_id, fields.assignee_name, services);
|
|
163
|
+
}
|
|
164
|
+
delete fields.assignee_name;
|
|
165
|
+
if (fields.scope_type === "user_group" && (fields.scope_id !== undefined || fields.scope_name !== undefined)) {
|
|
166
|
+
fields.scope_id = await resolveTeamReference("项目归属团队", fields.scope_id, fields.scope_name, services);
|
|
167
|
+
delete fields.scope_name;
|
|
168
|
+
}
|
|
169
|
+
if (fields.members !== undefined) {
|
|
170
|
+
fields.members = await Promise.all(fields.members.map(async (member) => {
|
|
171
|
+
const id = member.type === "user_group"
|
|
172
|
+
? await resolveTeamReference("项目团队成员", member.id, member.name, services)
|
|
173
|
+
: await resolveUserReference("项目成员", member.id, member.name, services);
|
|
174
|
+
if (id === undefined)
|
|
175
|
+
throw new PingCodeError("项目成员尚未解析为有效目录资源", "BAD_REQUEST");
|
|
176
|
+
return { type: member.type, id };
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
return { ...operation, fields };
|
|
180
|
+
}));
|
|
181
|
+
return { ...input, operations };
|
|
182
|
+
}
|
|
183
|
+
async function commitProjectPlan(input, services, runtime, writeApprovalMode, authInfo) {
|
|
184
|
+
const rawPlan = { plan_id: input.plan_id, operations: input.operations };
|
|
185
|
+
const resolvedPlan = await resolveProjectPlanReferences(rawPlan, services);
|
|
186
|
+
if (requestHash(rawPlan) !== input.request_hash) {
|
|
187
|
+
throw new PingCodeError("Commit 内容与项目创建 Preview request hash 不一致", "CONFLICT");
|
|
188
|
+
}
|
|
189
|
+
const operation = resolvedPlan.operations[0];
|
|
190
|
+
if (!operation) {
|
|
191
|
+
throw new PingCodeError("项目创建计划不能为空", "BAD_REQUEST");
|
|
192
|
+
}
|
|
193
|
+
const evidenceHash = requestHash({
|
|
194
|
+
planId: input.plan_id,
|
|
195
|
+
requestHash: input.request_hash,
|
|
196
|
+
operations: [{
|
|
197
|
+
operationId: operation.operation_id,
|
|
198
|
+
action: "create",
|
|
199
|
+
targetId: null,
|
|
200
|
+
changes: changesFromCreate(operation.fields),
|
|
201
|
+
sourceReferences: operation.source_references,
|
|
202
|
+
}],
|
|
203
|
+
});
|
|
204
|
+
if (evidenceHash !== input.evidence_hash) {
|
|
205
|
+
throw new PingCodeError("Commit 内容与项目创建 Preview evidence hash 不一致", "CONFLICT");
|
|
206
|
+
}
|
|
207
|
+
const committed = await commitWithApproval(runtime, writeApprovalMode, {
|
|
208
|
+
resourceType: "project",
|
|
209
|
+
requestHash: input.request_hash,
|
|
210
|
+
evidenceHash: input.evidence_hash,
|
|
211
|
+
approvalContextId: input.approval_context_id,
|
|
212
|
+
sessionBinding: input.session_binding,
|
|
213
|
+
...(input.agent_session_id === undefined ? {} : { agentSessionId: input.agent_session_id }),
|
|
214
|
+
approvalToken: input.approval_token,
|
|
215
|
+
idempotencyKey: input.idempotency_key,
|
|
216
|
+
...(authInfo === undefined ? {} : { authInfo }),
|
|
217
|
+
actions: ["create"],
|
|
218
|
+
action: async () => {
|
|
219
|
+
await assertNoProjectConflict(operation.fields, services);
|
|
220
|
+
const project = await services.getWriteSource().createProject(toProjectFields(operation.fields));
|
|
221
|
+
const verifiedMembers = await ensureProjectCreated(project, resolvedProjectMembers(operation.fields.members ?? []), services);
|
|
222
|
+
return {
|
|
223
|
+
planId: input.plan_id,
|
|
224
|
+
resources: [{
|
|
225
|
+
operationId: operation.operation_id,
|
|
226
|
+
action: "create",
|
|
227
|
+
id: project.id,
|
|
228
|
+
identifier: project.identifier,
|
|
229
|
+
name: project.name,
|
|
230
|
+
verified: true,
|
|
231
|
+
verifiedMembers,
|
|
232
|
+
}],
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
planId: committed.result.planId,
|
|
238
|
+
resources: committed.result.resources,
|
|
239
|
+
replayed: committed.replayed,
|
|
240
|
+
approvedBy: committed.approval.approvedBy,
|
|
241
|
+
auditId: committed.auditId,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
async function ensureProjectCreated(createdProject, expectedMembers, services) {
|
|
245
|
+
let project = await readCreatedProject(createdProject.id, createdProject.identifier, services);
|
|
246
|
+
const confirmedMemberKeys = projectMemberKeys(project.members ?? []);
|
|
247
|
+
const unconfirmedMembers = expectedMembers.filter((member) => !confirmedMemberKeys.has(projectMemberKey(member)));
|
|
248
|
+
const memberWriteErrors = [];
|
|
249
|
+
for (const member of unconfirmedMembers) {
|
|
250
|
+
try {
|
|
251
|
+
await services.getWriteSource().addProjectMember(createdProject.id, member);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
// POST 響應失敗時成員仍可能已加入,最後以一次只讀回查確認實際狀態。
|
|
255
|
+
memberWriteErrors.push(error);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (unconfirmedMembers.length > 0) {
|
|
259
|
+
try {
|
|
260
|
+
project = await readCreatedProject(createdProject.id, createdProject.identifier, services);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
const firstMemberError = memberWriteErrors[0];
|
|
264
|
+
throw new PingCodeError(`项目 ${createdProject.identifier} (${createdProject.id}) 已创建,但初始成员写入后的详情回读未能确认;请通过 MCP 只读 Tool 回读项目和成员,回读成功前禁止更换幂等键重试`, "WRITE_OUTCOME_UNKNOWN", {
|
|
265
|
+
cause: firstMemberError ?? error,
|
|
266
|
+
...(firstMemberError instanceof PingCodeError && firstMemberError.options.requestId
|
|
267
|
+
? { requestId: firstMemberError.options.requestId }
|
|
268
|
+
: {}),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const verifiedMemberKeys = projectMemberKeys(project.members ?? []);
|
|
273
|
+
const unverifiedMembers = expectedMembers.filter((member) => !verifiedMemberKeys.has(projectMemberKey(member)));
|
|
274
|
+
if (unverifiedMembers.length > 0) {
|
|
275
|
+
throw new PingCodeError(`项目 ${createdProject.identifier} (${createdProject.id}) 已创建,但 ${unverifiedMembers.length} 个已批准成员未能通过 MCP 回读验证;请通过 MCP 只读 Tool 重新回读,禁止更换幂等键重试`, "WRITE_OUTCOME_UNKNOWN", memberWriteErrors.length > 0 ? { cause: memberWriteErrors[0] } : {});
|
|
276
|
+
}
|
|
277
|
+
return verifiedMemberKeys.size;
|
|
278
|
+
}
|
|
279
|
+
async function readCreatedProject(projectId, projectIdentifier, services) {
|
|
280
|
+
let project;
|
|
281
|
+
try {
|
|
282
|
+
project = await services.getMetadataSource().getProject(projectId);
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
throw new PingCodeError(`项目 ${projectIdentifier} (${projectId}) 已创建,但 MCP 尚未能通过项目详情接口完成回读验证;请通过 MCP 只读 Tool 重新回读,禁止更换幂等键重试`, "WRITE_OUTCOME_UNKNOWN", { cause: error });
|
|
286
|
+
}
|
|
287
|
+
if (project.id !== projectId || project.identifier !== projectIdentifier) {
|
|
288
|
+
throw new PingCodeError(`项目 ${projectIdentifier} (${projectId}) 已创建,但详情回读的项目身份不一致;请通过 MCP 只读 Tool 回读项目列表和详情,禁止更换幂等键重试`, "WRITE_OUTCOME_UNKNOWN");
|
|
289
|
+
}
|
|
290
|
+
return project;
|
|
291
|
+
}
|
|
292
|
+
function projectWarnings(fields) {
|
|
293
|
+
return [];
|
|
294
|
+
}
|
|
295
|
+
function projectMemberKey(member) {
|
|
296
|
+
return `${member.type}:${member.id}`;
|
|
297
|
+
}
|
|
298
|
+
function projectMemberKeys(members) {
|
|
299
|
+
return new Set(members.map((member) => {
|
|
300
|
+
if ("type" in member) {
|
|
301
|
+
return projectMemberKey(member);
|
|
302
|
+
}
|
|
303
|
+
if ("user" in member) {
|
|
304
|
+
return `user:${member.user.id}`;
|
|
305
|
+
}
|
|
306
|
+
return `user_group:${member.user_group.id}`;
|
|
307
|
+
}));
|
|
308
|
+
}
|
|
309
|
+
function projectCommitConfirmationMessage(fields) {
|
|
310
|
+
if (!fields) {
|
|
311
|
+
return "即将在 PingCode 项目目录中创建项目。确认后将立即写入,请先核对 Preview 差异。";
|
|
312
|
+
}
|
|
313
|
+
return formatWriteConfirmationMessage("即将在 PingCode 项目目录中创建项目", [
|
|
314
|
+
`项目:${fields.name} (${fields.identifier})`,
|
|
315
|
+
`模型:${fields.type}`,
|
|
316
|
+
`可见性:${fields.visibility ?? "由 PingCode 默认值决定"}`,
|
|
317
|
+
`项目负责人:${fields.assignee_name ?? "已确认负责人"}`,
|
|
318
|
+
`普通成员:${fields.members?.length ?? 0} 个${fields.members?.length ? "(已确认)" : "(不添加)"}`,
|
|
319
|
+
fields.scope_type === "user_group"
|
|
320
|
+
? `归属团队:${fields.scope_name ?? "已确认团队"}`
|
|
321
|
+
: "归属范围:组织",
|
|
322
|
+
]);
|
|
323
|
+
}
|
|
324
|
+
async function assertNoProjectConflict(fields, services) {
|
|
325
|
+
const source = services.getMetadataSource();
|
|
326
|
+
const firstPage = await source.listProjects({ pageIndex: 0, pageSize: 100 });
|
|
327
|
+
const pages = [firstPage];
|
|
328
|
+
const actualPageSize = Math.max(firstPage.page_size, 1);
|
|
329
|
+
const totalPages = Math.min(Math.ceil(firstPage.total / actualPageSize), 1000);
|
|
330
|
+
for (let pageIndex = 1; pageIndex < totalPages; pageIndex += 1) {
|
|
331
|
+
pages.push(await source.listProjects({ pageIndex, pageSize: actualPageSize }));
|
|
332
|
+
}
|
|
333
|
+
const matchingProject = pages
|
|
334
|
+
.flatMap((page) => page.values)
|
|
335
|
+
.find((project) => project.identifier.toLowerCase() === fields.identifier.toLowerCase() ||
|
|
336
|
+
project.name === fields.name);
|
|
337
|
+
if (matchingProject?.is_deleted === true || matchingProject?.is_deleted === 1) {
|
|
338
|
+
throw new PingCodeError(`项目 ${matchingProject.name} (${matchingProject.identifier}) 已删除,不能复用;请改用新的项目名称和 identifier`, "CONFLICT");
|
|
339
|
+
}
|
|
340
|
+
if (matchingProject) {
|
|
341
|
+
throw new PingCodeError(`项目名称或 identifier 已存在:${matchingProject.name} (${matchingProject.identifier})`, "CONFLICT");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
function toProjectFields(fields) {
|
|
345
|
+
if (fields.assignee_id === undefined) {
|
|
346
|
+
throw new PingCodeError("项目负责人尚未解析为有效用户", "BAD_REQUEST");
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
name: fields.name,
|
|
350
|
+
identifier: fields.identifier,
|
|
351
|
+
type: fields.type,
|
|
352
|
+
visibility: fields.visibility,
|
|
353
|
+
description: fields.description,
|
|
354
|
+
assigneeId: fields.assignee_id,
|
|
355
|
+
scopeType: fields.scope_type,
|
|
356
|
+
scopeId: fields.scope_id,
|
|
357
|
+
members: resolvedProjectMembers(fields.members ?? []),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
function resolvedProjectMembers(members) {
|
|
361
|
+
return members.map((member) => {
|
|
362
|
+
if (member.id === undefined)
|
|
363
|
+
throw new PingCodeError("项目成员尚未解析为有效目录资源", "BAD_REQUEST");
|
|
364
|
+
return { id: member.id, type: member.type };
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
function changesFromCreate(fields) {
|
|
368
|
+
return Object.fromEntries(Object.entries(fields).map(([field, after]) => [field, { before: null, after }]));
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/mcp/tools/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Logger } from "../../logger.js";
|
|
3
|
+
import type { Services } from "../../services.js";
|
|
4
|
+
import type { WriteRuntime } from "../../write/runtime.js";
|
|
5
|
+
import { type WriteApprovalMode } from "../write-approval.js";
|
|
6
|
+
export declare function registerRelationTools(server: McpServer, services: Services, logger: Logger, runtime: WriteRuntime, writeApprovalMode: WriteApprovalMode): void;
|
|
7
|
+
//# sourceMappingURL=relation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/relation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAI9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAUlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAQL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAsH9B,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EACrB,iBAAiB,EAAE,iBAAiB,GACnC,IAAI,CA6IN"}
|