@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.
Files changed (268) hide show
  1. package/.env.example +115 -0
  2. package/.env.stdio.local.example +13 -0
  3. package/README.md +222 -0
  4. package/dist/approve-write.d.ts +3 -0
  5. package/dist/approve-write.d.ts.map +1 -0
  6. package/dist/approve-write.js +81 -0
  7. package/dist/approve-write.js.map +1 -0
  8. package/dist/auth/cimd-client-resolver.d.ts +35 -0
  9. package/dist/auth/cimd-client-resolver.d.ts.map +1 -0
  10. package/dist/auth/cimd-client-resolver.js +293 -0
  11. package/dist/auth/cimd-client-resolver.js.map +1 -0
  12. package/dist/auth/memory-store.d.ts +15 -0
  13. package/dist/auth/memory-store.d.ts.map +1 -0
  14. package/dist/auth/memory-store.js +46 -0
  15. package/dist/auth/memory-store.js.map +1 -0
  16. package/dist/auth/pingcode-oauth-client.d.ts +23 -0
  17. package/dist/auth/pingcode-oauth-client.d.ts.map +1 -0
  18. package/dist/auth/pingcode-oauth-client.js +103 -0
  19. package/dist/auth/pingcode-oauth-client.js.map +1 -0
  20. package/dist/auth/pingcode-oauth-provider.d.ts +70 -0
  21. package/dist/auth/pingcode-oauth-provider.d.ts.map +1 -0
  22. package/dist/auth/pingcode-oauth-provider.js +414 -0
  23. package/dist/auth/pingcode-oauth-provider.js.map +1 -0
  24. package/dist/auth/redis-store.d.ts +16 -0
  25. package/dist/auth/redis-store.d.ts.map +1 -0
  26. package/dist/auth/redis-store.js +54 -0
  27. package/dist/auth/redis-store.js.map +1 -0
  28. package/dist/auth/runtime.d.ts +10 -0
  29. package/dist/auth/runtime.d.ts.map +1 -0
  30. package/dist/auth/runtime.js +57 -0
  31. package/dist/auth/runtime.js.map +1 -0
  32. package/dist/auth/store.d.ts +35 -0
  33. package/dist/auth/store.d.ts.map +1 -0
  34. package/dist/auth/store.js +55 -0
  35. package/dist/auth/store.js.map +1 -0
  36. package/dist/auth/token-cipher.d.ts +7 -0
  37. package/dist/auth/token-cipher.d.ts.map +1 -0
  38. package/dist/auth/token-cipher.js +36 -0
  39. package/dist/auth/token-cipher.js.map +1 -0
  40. package/dist/config.d.ts +54 -0
  41. package/dist/config.d.ts.map +1 -0
  42. package/dist/config.js +270 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/domain/content-hash.d.ts +5 -0
  45. package/dist/domain/content-hash.d.ts.map +1 -0
  46. package/dist/domain/content-hash.js +17 -0
  47. package/dist/domain/content-hash.js.map +1 -0
  48. package/dist/domain/requirement-context.d.ts +29 -0
  49. package/dist/domain/requirement-context.d.ts.map +1 -0
  50. package/dist/domain/requirement-context.js +2 -0
  51. package/dist/domain/requirement-context.js.map +1 -0
  52. package/dist/domain/test-case-context.d.ts +56 -0
  53. package/dist/domain/test-case-context.d.ts.map +1 -0
  54. package/dist/domain/test-case-context.js +2 -0
  55. package/dist/domain/test-case-context.js.map +1 -0
  56. package/dist/domain/work-item-context.d.ts +47 -0
  57. package/dist/domain/work-item-context.d.ts.map +1 -0
  58. package/dist/domain/work-item-context.js +2 -0
  59. package/dist/domain/work-item-context.js.map +1 -0
  60. package/dist/environment.d.ts +2 -0
  61. package/dist/environment.d.ts.map +1 -0
  62. package/dist/environment.js +21 -0
  63. package/dist/environment.js.map +1 -0
  64. package/dist/index.d.ts +3 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +52 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/inspect-wiki.d.ts +3 -0
  69. package/dist/inspect-wiki.d.ts.map +1 -0
  70. package/dist/inspect-wiki.js +49 -0
  71. package/dist/inspect-wiki.js.map +1 -0
  72. package/dist/logger.d.ts +9 -0
  73. package/dist/logger.d.ts.map +1 -0
  74. package/dist/logger.js +40 -0
  75. package/dist/logger.js.map +1 -0
  76. package/dist/mcp/create-server.d.ts +10 -0
  77. package/dist/mcp/create-server.d.ts.map +1 -0
  78. package/dist/mcp/create-server.js +40 -0
  79. package/dist/mcp/create-server.js.map +1 -0
  80. package/dist/mcp/pagination-guidance.d.ts +19 -0
  81. package/dist/mcp/pagination-guidance.d.ts.map +1 -0
  82. package/dist/mcp/pagination-guidance.js +36 -0
  83. package/dist/mcp/pagination-guidance.js.map +1 -0
  84. package/dist/mcp/reference-resolution.d.ts +19 -0
  85. package/dist/mcp/reference-resolution.d.ts.map +1 -0
  86. package/dist/mcp/reference-resolution.js +160 -0
  87. package/dist/mcp/reference-resolution.js.map +1 -0
  88. package/dist/mcp/tool-registry.d.ts +2 -0
  89. package/dist/mcp/tool-registry.d.ts.map +1 -0
  90. package/dist/mcp/tool-registry.js +55 -0
  91. package/dist/mcp/tool-registry.js.map +1 -0
  92. package/dist/mcp/tool-runtime.d.ts +22 -0
  93. package/dist/mcp/tool-runtime.d.ts.map +1 -0
  94. package/dist/mcp/tool-runtime.js +214 -0
  95. package/dist/mcp/tool-runtime.js.map +1 -0
  96. package/dist/mcp/tools/member-role.d.ts +8 -0
  97. package/dist/mcp/tools/member-role.d.ts.map +1 -0
  98. package/dist/mcp/tools/member-role.js +451 -0
  99. package/dist/mcp/tools/member-role.js.map +1 -0
  100. package/dist/mcp/tools/metadata.d.ts +5 -0
  101. package/dist/mcp/tools/metadata.d.ts.map +1 -0
  102. package/dist/mcp/tools/metadata.js +606 -0
  103. package/dist/mcp/tools/metadata.js.map +1 -0
  104. package/dist/mcp/tools/project-context.d.ts +4 -0
  105. package/dist/mcp/tools/project-context.d.ts.map +1 -0
  106. package/dist/mcp/tools/project-context.js +111 -0
  107. package/dist/mcp/tools/project-context.js.map +1 -0
  108. package/dist/mcp/tools/project.d.ts +7 -0
  109. package/dist/mcp/tools/project.d.ts.map +1 -0
  110. package/dist/mcp/tools/project.js +370 -0
  111. package/dist/mcp/tools/project.js.map +1 -0
  112. package/dist/mcp/tools/relation.d.ts +7 -0
  113. package/dist/mcp/tools/relation.d.ts.map +1 -0
  114. package/dist/mcp/tools/relation.js +592 -0
  115. package/dist/mcp/tools/relation.js.map +1 -0
  116. package/dist/mcp/tools/runtime-info.d.ts +4 -0
  117. package/dist/mcp/tools/runtime-info.d.ts.map +1 -0
  118. package/dist/mcp/tools/runtime-info.js +49 -0
  119. package/dist/mcp/tools/runtime-info.js.map +1 -0
  120. package/dist/mcp/tools/ship-suite.d.ts +7 -0
  121. package/dist/mcp/tools/ship-suite.d.ts.map +1 -0
  122. package/dist/mcp/tools/ship-suite.js +636 -0
  123. package/dist/mcp/tools/ship-suite.js.map +1 -0
  124. package/dist/mcp/tools/ship.d.ts +7 -0
  125. package/dist/mcp/tools/ship.d.ts.map +1 -0
  126. package/dist/mcp/tools/ship.js +617 -0
  127. package/dist/mcp/tools/ship.js.map +1 -0
  128. package/dist/mcp/tools/sync.d.ts +10 -0
  129. package/dist/mcp/tools/sync.d.ts.map +1 -0
  130. package/dist/mcp/tools/sync.js +1110 -0
  131. package/dist/mcp/tools/sync.js.map +1 -0
  132. package/dist/mcp/tools/task.d.ts +5 -0
  133. package/dist/mcp/tools/task.d.ts.map +1 -0
  134. package/dist/mcp/tools/task.js +236 -0
  135. package/dist/mcp/tools/task.js.map +1 -0
  136. package/dist/mcp/tools/test-case-bulk.d.ts +7 -0
  137. package/dist/mcp/tools/test-case-bulk.d.ts.map +1 -0
  138. package/dist/mcp/tools/test-case-bulk.js +297 -0
  139. package/dist/mcp/tools/test-case-bulk.js.map +1 -0
  140. package/dist/mcp/tools/test-case-delete.d.ts +7 -0
  141. package/dist/mcp/tools/test-case-delete.d.ts.map +1 -0
  142. package/dist/mcp/tools/test-case-delete.js +247 -0
  143. package/dist/mcp/tools/test-case-delete.js.map +1 -0
  144. package/dist/mcp/tools/test-case.d.ts +5 -0
  145. package/dist/mcp/tools/test-case.d.ts.map +1 -0
  146. package/dist/mcp/tools/test-case.js +155 -0
  147. package/dist/mcp/tools/test-case.js.map +1 -0
  148. package/dist/mcp/tools/test-library.d.ts +7 -0
  149. package/dist/mcp/tools/test-library.d.ts.map +1 -0
  150. package/dist/mcp/tools/test-library.js +302 -0
  151. package/dist/mcp/tools/test-library.js.map +1 -0
  152. package/dist/mcp/tools/wiki.d.ts +5 -0
  153. package/dist/mcp/tools/wiki.d.ts.map +1 -0
  154. package/dist/mcp/tools/wiki.js +266 -0
  155. package/dist/mcp/tools/wiki.js.map +1 -0
  156. package/dist/mcp/write-approval.d.ts +48 -0
  157. package/dist/mcp/write-approval.d.ts.map +1 -0
  158. package/dist/mcp/write-approval.js +321 -0
  159. package/dist/mcp/write-approval.js.map +1 -0
  160. package/dist/observability/metrics.d.ts +46 -0
  161. package/dist/observability/metrics.d.ts.map +1 -0
  162. package/dist/observability/metrics.js +79 -0
  163. package/dist/observability/metrics.js.map +1 -0
  164. package/dist/pingcode/access-token-provider.d.ts +5 -0
  165. package/dist/pingcode/access-token-provider.d.ts.map +1 -0
  166. package/dist/pingcode/access-token-provider.js +2 -0
  167. package/dist/pingcode/access-token-provider.js.map +1 -0
  168. package/dist/pingcode/client.d.ts +43 -0
  169. package/dist/pingcode/client.d.ts.map +1 -0
  170. package/dist/pingcode/client.js +300 -0
  171. package/dist/pingcode/client.js.map +1 -0
  172. package/dist/pingcode/errors.d.ts +20 -0
  173. package/dist/pingcode/errors.d.ts.map +1 -0
  174. package/dist/pingcode/errors.js +14 -0
  175. package/dist/pingcode/errors.js.map +1 -0
  176. package/dist/pingcode/schemas.d.ts +465 -0
  177. package/dist/pingcode/schemas.d.ts.map +1 -0
  178. package/dist/pingcode/schemas.js +450 -0
  179. package/dist/pingcode/schemas.js.map +1 -0
  180. package/dist/pingcode/token-provider.d.ts +20 -0
  181. package/dist/pingcode/token-provider.d.ts.map +1 -0
  182. package/dist/pingcode/token-provider.js +97 -0
  183. package/dist/pingcode/token-provider.js.map +1 -0
  184. package/dist/pingcode/write-response.d.ts +9 -0
  185. package/dist/pingcode/write-response.d.ts.map +1 -0
  186. package/dist/pingcode/write-response.js +39 -0
  187. package/dist/pingcode/write-response.js.map +1 -0
  188. package/dist/services.d.ts +22 -0
  189. package/dist/services.d.ts.map +1 -0
  190. package/dist/services.js +84 -0
  191. package/dist/services.js.map +1 -0
  192. package/dist/sources/metadata-source.d.ts +445 -0
  193. package/dist/sources/metadata-source.d.ts.map +1 -0
  194. package/dist/sources/metadata-source.js +167 -0
  195. package/dist/sources/metadata-source.js.map +1 -0
  196. package/dist/sources/project-context-source.d.ts +61 -0
  197. package/dist/sources/project-context-source.d.ts.map +1 -0
  198. package/dist/sources/project-context-source.js +224 -0
  199. package/dist/sources/project-context-source.js.map +1 -0
  200. package/dist/sources/relation-source.d.ts +83 -0
  201. package/dist/sources/relation-source.d.ts.map +1 -0
  202. package/dist/sources/relation-source.js +129 -0
  203. package/dist/sources/relation-source.js.map +1 -0
  204. package/dist/sources/requirement-source.d.ts +5 -0
  205. package/dist/sources/requirement-source.d.ts.map +1 -0
  206. package/dist/sources/requirement-source.js +2 -0
  207. package/dist/sources/requirement-source.js.map +1 -0
  208. package/dist/sources/ship-source.d.ts +67 -0
  209. package/dist/sources/ship-source.d.ts.map +1 -0
  210. package/dist/sources/ship-source.js +135 -0
  211. package/dist/sources/ship-source.js.map +1 -0
  212. package/dist/sources/test-case-source.d.ts +30 -0
  213. package/dist/sources/test-case-source.d.ts.map +1 -0
  214. package/dist/sources/test-case-source.js +206 -0
  215. package/dist/sources/test-case-source.js.map +1 -0
  216. package/dist/sources/wiki-source.d.ts +34 -0
  217. package/dist/sources/wiki-source.d.ts.map +1 -0
  218. package/dist/sources/wiki-source.js +136 -0
  219. package/dist/sources/wiki-source.js.map +1 -0
  220. package/dist/sources/work-item-source.d.ts +33 -0
  221. package/dist/sources/work-item-source.d.ts.map +1 -0
  222. package/dist/sources/work-item-source.js +159 -0
  223. package/dist/sources/work-item-source.js.map +1 -0
  224. package/dist/sources/write-source.d.ts +461 -0
  225. package/dist/sources/write-source.d.ts.map +1 -0
  226. package/dist/sources/write-source.js +174 -0
  227. package/dist/sources/write-source.js.map +1 -0
  228. package/dist/transports/bearer-auth.d.ts +20 -0
  229. package/dist/transports/bearer-auth.d.ts.map +1 -0
  230. package/dist/transports/bearer-auth.js +79 -0
  231. package/dist/transports/bearer-auth.js.map +1 -0
  232. package/dist/transports/http.d.ts +11 -0
  233. package/dist/transports/http.d.ts.map +1 -0
  234. package/dist/transports/http.js +203 -0
  235. package/dist/transports/http.js.map +1 -0
  236. package/dist/transports/metrics-auth.d.ts +3 -0
  237. package/dist/transports/metrics-auth.d.ts.map +1 -0
  238. package/dist/transports/metrics-auth.js +22 -0
  239. package/dist/transports/metrics-auth.js.map +1 -0
  240. package/dist/transports/stdio.d.ts +5 -0
  241. package/dist/transports/stdio.d.ts.map +1 -0
  242. package/dist/transports/stdio.js +11 -0
  243. package/dist/transports/stdio.js.map +1 -0
  244. package/dist/uat/run-label.d.ts +2 -0
  245. package/dist/uat/run-label.d.ts.map +1 -0
  246. package/dist/uat/run-label.js +12 -0
  247. package/dist/uat/run-label.js.map +1 -0
  248. package/dist/verify.d.ts +3 -0
  249. package/dist/verify.d.ts.map +1 -0
  250. package/dist/verify.js +59 -0
  251. package/dist/verify.js.map +1 -0
  252. package/dist/write/approval.d.ts +35 -0
  253. package/dist/write/approval.d.ts.map +1 -0
  254. package/dist/write/approval.js +66 -0
  255. package/dist/write/approval.js.map +1 -0
  256. package/dist/write/plan.d.ts +2 -0
  257. package/dist/write/plan.d.ts.map +1 -0
  258. package/dist/write/plan.js +17 -0
  259. package/dist/write/plan.js.map +1 -0
  260. package/dist/write/runtime.d.ts +90 -0
  261. package/dist/write/runtime.d.ts.map +1 -0
  262. package/dist/write/runtime.js +244 -0
  263. package/dist/write/runtime.js.map +1 -0
  264. package/dist/write/store.d.ts +101 -0
  265. package/dist/write/store.d.ts.map +1 -0
  266. package/dist/write/store.js +201 -0
  267. package/dist/write/store.js.map +1 -0
  268. package/package.json +58 -0
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Logger } from "../../logger.js";
3
+ export declare function registerProjectContextTools(server: McpServer, logger: Logger): void;
4
+ //# sourceMappingURL=project-context.d.ts.map
@@ -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"}