@xurenxiang1219/pingcode-mcp 0.3.1 → 0.4.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/CHANGELOG.md +25 -0
- package/README.md +10 -2
- package/dist/auth/cimd-client-resolver.js +1 -1
- package/dist/domain/requirement-context.d.ts +1 -1
- package/dist/domain/requirement-context.d.ts.map +1 -1
- package/dist/mcp/create-server.d.ts.map +1 -1
- package/dist/mcp/create-server.js +5 -1
- package/dist/mcp/create-server.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts +1 -1
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +7 -0
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools/wiki-space-members.d.ts +7 -0
- package/dist/mcp/tools/wiki-space-members.d.ts.map +1 -0
- package/dist/mcp/tools/wiki-space-members.js +303 -0
- package/dist/mcp/tools/wiki-space-members.js.map +1 -0
- package/dist/mcp/tools/wiki-write.d.ts +8 -0
- package/dist/mcp/tools/wiki-write.d.ts.map +1 -0
- package/dist/mcp/tools/wiki-write.js +535 -0
- package/dist/mcp/tools/wiki-write.js.map +1 -0
- package/dist/mcp/tools/wiki.d.ts.map +1 -1
- package/dist/mcp/tools/wiki.js +12 -1
- package/dist/mcp/tools/wiki.js.map +1 -1
- package/dist/pingcode/client.d.ts +2 -0
- package/dist/pingcode/client.d.ts.map +1 -1
- package/dist/pingcode/client.js +12 -2
- package/dist/pingcode/client.js.map +1 -1
- package/dist/pingcode/schemas.d.ts +32 -0
- package/dist/pingcode/schemas.d.ts.map +1 -1
- package/dist/pingcode/schemas.js +30 -0
- package/dist/pingcode/schemas.js.map +1 -1
- package/dist/services.d.ts +3 -0
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +8 -0
- package/dist/services.js.map +1 -1
- package/dist/sources/metadata-source.js +1 -1
- package/dist/sources/wiki-source.js +1 -1
- package/dist/sources/wiki-source.js.map +1 -1
- package/dist/sources/wiki-write-source.d.ts +243 -0
- package/dist/sources/wiki-write-source.d.ts.map +1 -0
- package/dist/sources/wiki-write-source.js +96 -0
- package/dist/sources/wiki-write-source.js.map +1 -0
- package/dist/write/approval.d.ts +3 -1
- package/dist/write/approval.d.ts.map +1 -1
- package/dist/write/approval.js +2 -0
- package/dist/write/approval.js.map +1 -1
- package/package.json +19 -18
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### 新增
|
|
6
|
+
|
|
7
|
+
- 新增 Wiki 空间创建与更新的 `Preview -> Approval -> Commit` 流程。
|
|
8
|
+
- 新增 Wiki 页面创建与更新的 `Preview -> Approval -> Commit` 流程。
|
|
9
|
+
- 新增 Wiki 空间成员列表查询。
|
|
10
|
+
- 新增 Wiki 空间成员新增流程,支持 user、user_group 和角色名称解析。
|
|
11
|
+
- Wiki 空间、页面、父页面和成员引用支持使用已确认的名称、identifier 或候选 ID。
|
|
12
|
+
|
|
13
|
+
### 修复
|
|
14
|
+
|
|
15
|
+
- Wiki 页面列表和上下文区分 API 未返回父页面与明确的根页面。
|
|
16
|
+
- 角色目录改用 `/v2/directory/roles`,支持 Wiki 成员角色名称解析。
|
|
17
|
+
- 写入请求成功但响应无法解析时,标记为结果不确定并引导通过唯读 Tool 回读,避免重复写入。
|
|
18
|
+
|
|
19
|
+
### 安全与限制
|
|
20
|
+
|
|
21
|
+
- 更新 MCP TypeScript SDK 至 `1.32.2`、Zod 至 `4.6.7`,并刷新 lockfile 修复已知依赖安全公告。
|
|
22
|
+
- Wiki 写入继续要求独立权限、Preview、Approval、request hash、幂等键和 Audit Log。
|
|
23
|
+
- Wiki 写入不支持空间或页面删除、移除成员、既有成员角色更新和版本恢复。
|
|
24
|
+
- Wiki 角色名称解析需要 `pcp:read:global:team`;Wiki 写入需要独立的
|
|
25
|
+
`pcp:write:wiki:space` 和 `pcp:write:wiki:page` 权限。
|
package/README.md
CHANGED
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
讓 VS Code、Cursor、Qoder、ZCode 等 Coding Agent 安全連接 PingCode:讀取 Wiki、工作項目、Test Case 與測試庫上下文,並以 Preview → Approval → Commit 流程控管寫入與同步。適合 UAT 規劃、需求追蹤和測試資料維護,不提供任意 REST API 代理。
|
|
4
4
|
|
|
5
|
+
版本更新記錄見 [CHANGELOG.md](CHANGELOG.md)。
|
|
6
|
+
|
|
5
7
|
## 支援範圍
|
|
6
8
|
|
|
7
|
-
支援 Wiki、Task/工作項目、Test Case、測試庫、Project、Ship、Relation、使用者與成員角色的讀取,以及受控的 Task/Test Case、Project、Test Library、Ship、Relation、成員角色與需求模組寫入流程。寫入固定要求獨立權限、Preview、有效 Approval、幂等與稽核。
|
|
9
|
+
支援 Wiki、Task/工作項目、Test Case、測試庫、Project、Ship、Relation、使用者與成員角色的讀取,以及受控的 Wiki 空間/頁面、Task/Test Case、Project、Test Library、Ship、Relation、成員角色與需求模組寫入流程。寫入固定要求獨立權限、Preview、有效 Approval、幂等與稽核。
|
|
10
|
+
|
|
11
|
+
不支援 Wiki 刪除、移除 Wiki 空間成員、既有 Wiki 成員角色更新、版本恢復、Task/Project/Test Library/Idea 刪除或任意 PingCode REST API 代理;也不會主動刪除關係另一端資源。
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
Wiki 讀取需要 `pcp:read:wiki:space`、`pcp:read:wiki:page`。Wiki 空間/頁面寫入還需以獨立 PingCode 應用授予 `pcp:write:wiki:space`、`pcp:write:wiki:page`,並只可透過 Preview/Commit 工具執行;不要擴大唯讀 Production 憑據。建立 Wiki 空間時若省略 `members`,Preview 會列出使用者與用戶組候選,供使用者選擇要加入的成員;也可明確傳 `members: []` 選擇不加入。private 空間不加成員時會提示其他使用者可能無法訪問。新增成員時可用 `role_name`(例如「管理员」)解析角色,角色名稱解析需要 `pcp:read:global:team`;未指定角色時使用 PingCode 預設角色。
|
|
10
14
|
|
|
11
15
|
## 快速安裝(推薦)
|
|
12
16
|
|
|
@@ -164,6 +168,7 @@ npx -y @xurenxiang1219/pingcode-mcp --stdio --env-file /absolute/private/path/pi
|
|
|
164
168
|
- `pingcode_wiki_list_spaces`
|
|
165
169
|
- `pingcode_wiki_list_pages`
|
|
166
170
|
- `pingcode_wiki_get_requirement_context`
|
|
171
|
+
- `pingcode_wiki_space_members_list`
|
|
167
172
|
- `pingcode_task_list`
|
|
168
173
|
- `pingcode_task_get`
|
|
169
174
|
- `pingcode_test_case_list`
|
|
@@ -191,6 +196,9 @@ npx -y @xurenxiang1219/pingcode-mcp --stdio --env-file /absolute/private/path/pi
|
|
|
191
196
|
|
|
192
197
|
### Preview、Commit 與受控寫入
|
|
193
198
|
|
|
199
|
+
- `pingcode_wiki_space_sync_preview` / `pingcode_wiki_space_sync_commit`
|
|
200
|
+
- `pingcode_wiki_page_sync_preview` / `pingcode_wiki_page_sync_commit`
|
|
201
|
+
- `pingcode_wiki_space_member_add_preview` / `pingcode_wiki_space_member_add_commit`
|
|
194
202
|
- `pingcode_test_case_delete_preview` / `pingcode_test_case_delete_commit`
|
|
195
203
|
- `pingcode_test_case_bulk_create_preview` / `pingcode_test_case_bulk_create_commit`
|
|
196
204
|
- `pingcode_ship_product_sync_preview` / `pingcode_ship_product_sync_commit`
|
|
@@ -158,7 +158,7 @@ function requestCimdDocument(url, addresses, timeoutMs, maxResponseBytes) {
|
|
|
158
158
|
method: "GET",
|
|
159
159
|
headers: {
|
|
160
160
|
Accept: "application/json, application/*+json",
|
|
161
|
-
"User-Agent": "pingcode-mcp/0.
|
|
161
|
+
"User-Agent": "pingcode-mcp/0.4.0",
|
|
162
162
|
},
|
|
163
163
|
family: selected.family,
|
|
164
164
|
lookup: (_hostname, _options, callback) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-context.d.ts","sourceRoot":"","sources":["../../src/domain/requirement-context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,UAAU,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"requirement-context.d.ts","sourceRoot":"","sources":["../../src/domain/requirement-context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,UAAU,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,WAAW,EAAE,EAAE,CAAC;IAChB,YAAY,EAAE,EAAE,CAAC;CAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAK7D,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,gBAAqB,GAC7B,SAAS,CAyBX"}
|
|
@@ -14,14 +14,18 @@ import { registerMemberRoleTools } from "./tools/member-role.js";
|
|
|
14
14
|
import { registerRelationTools } from "./tools/relation.js";
|
|
15
15
|
import { registerShipSuiteTools } from "./tools/ship-suite.js";
|
|
16
16
|
import { registerRuntimeInfoTools } from "./tools/runtime-info.js";
|
|
17
|
+
import { registerWikiWriteTools } from "./tools/wiki-write.js";
|
|
18
|
+
import { registerWikiSpaceMemberTools } from "./tools/wiki-space-members.js";
|
|
17
19
|
export function createMcpServer(services, logger, writeRuntime, options = {}) {
|
|
18
20
|
const server = new McpServer({
|
|
19
21
|
name: "pingcode-mcp",
|
|
20
|
-
version: "0.
|
|
22
|
+
version: "0.4.0",
|
|
21
23
|
});
|
|
22
24
|
const writeApprovalMode = options.writeApprovalMode ?? "approval_token";
|
|
23
25
|
registerRuntimeInfoTools(server, logger);
|
|
24
26
|
registerWikiTools(server, services, logger);
|
|
27
|
+
registerWikiWriteTools(server, services, logger, writeRuntime, writeApprovalMode);
|
|
28
|
+
registerWikiSpaceMemberTools(server, services, logger, writeRuntime, writeApprovalMode);
|
|
25
29
|
registerTaskTools(server, services, logger);
|
|
26
30
|
registerTestCaseTools(server, services, logger);
|
|
27
31
|
registerTestCaseDeleteTools(server, services, logger, writeRuntime, writeApprovalMode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/mcp/create-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const registeredPingCodeToolNames: readonly ["pingcode_uat_runtime_info", "pingcode_wiki_list_spaces", "pingcode_wiki_list_pages", "pingcode_wiki_get_requirement_context", "pingcode_task_list", "pingcode_task_get", "pingcode_test_case_list", "pingcode_test_case_get", "pingcode_test_case_delete_preview", "pingcode_test_case_delete_commit", "pingcode_test_case_bulk_create_preview", "pingcode_test_case_bulk_create_commit", "pingcode_project_list", "pingcode_work_item_metadata_get", "pingcode_test_library_list", "pingcode_test_library_get", "pingcode_test_case_metadata_get", "pingcode_user_list", "pingcode_role_list", "pingcode_user_search", "pingcode_project_context_get", "pingcode_project_context_save", "pingcode_ship_product_list", "pingcode_ship_product_get", "pingcode_ship_idea_list", "pingcode_ship_product_idea_list", "pingcode_ship_idea_get", "pingcode_ship_product_sync_preview", "pingcode_ship_product_sync_commit", "pingcode_ship_idea_sync_preview", "pingcode_ship_idea_sync_commit", "pingcode_ship_product_suite_list", "pingcode_ship_product_suite_get", "pingcode_ship_product_suite_create_preview", "pingcode_ship_product_suite_create_commit", "pingcode_ship_product_suite_remove_preview", "pingcode_ship_product_suite_remove_commit", "pingcode_relation_list", "pingcode_relation_get", "pingcode_relation_sync_preview", "pingcode_relation_sync_commit", "pingcode_task_sync_preview", "pingcode_task_sync_commit", "pingcode_test_case_sync_preview", "pingcode_test_case_sync_commit", "pingcode_project_create_preview", "pingcode_project_create_commit", "pingcode_test_library_create_preview", "pingcode_test_library_create_commit", "pingcode_member_role_get", "pingcode_member_role_update_preview", "pingcode_member_role_update_commit"];
|
|
1
|
+
export declare const registeredPingCodeToolNames: readonly ["pingcode_uat_runtime_info", "pingcode_wiki_list_spaces", "pingcode_wiki_list_pages", "pingcode_wiki_get_requirement_context", "pingcode_wiki_space_sync_preview", "pingcode_wiki_space_sync_commit", "pingcode_wiki_page_sync_preview", "pingcode_wiki_page_sync_commit", "pingcode_wiki_space_members_list", "pingcode_wiki_space_member_add_preview", "pingcode_wiki_space_member_add_commit", "pingcode_task_list", "pingcode_task_get", "pingcode_test_case_list", "pingcode_test_case_get", "pingcode_test_case_delete_preview", "pingcode_test_case_delete_commit", "pingcode_test_case_bulk_create_preview", "pingcode_test_case_bulk_create_commit", "pingcode_project_list", "pingcode_work_item_metadata_get", "pingcode_test_library_list", "pingcode_test_library_get", "pingcode_test_case_metadata_get", "pingcode_user_list", "pingcode_role_list", "pingcode_user_search", "pingcode_project_context_get", "pingcode_project_context_save", "pingcode_ship_product_list", "pingcode_ship_product_get", "pingcode_ship_idea_list", "pingcode_ship_product_idea_list", "pingcode_ship_idea_get", "pingcode_ship_product_sync_preview", "pingcode_ship_product_sync_commit", "pingcode_ship_idea_sync_preview", "pingcode_ship_idea_sync_commit", "pingcode_ship_product_suite_list", "pingcode_ship_product_suite_get", "pingcode_ship_product_suite_create_preview", "pingcode_ship_product_suite_create_commit", "pingcode_ship_product_suite_remove_preview", "pingcode_ship_product_suite_remove_commit", "pingcode_relation_list", "pingcode_relation_get", "pingcode_relation_sync_preview", "pingcode_relation_sync_commit", "pingcode_task_sync_preview", "pingcode_task_sync_commit", "pingcode_test_case_sync_preview", "pingcode_test_case_sync_commit", "pingcode_project_create_preview", "pingcode_project_create_commit", "pingcode_test_library_create_preview", "pingcode_test_library_create_commit", "pingcode_member_role_get", "pingcode_member_role_update_preview", "pingcode_member_role_update_commit"];
|
|
2
2
|
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,27DA4D9B,CAAC"}
|
|
@@ -3,6 +3,13 @@ export const registeredPingCodeToolNames = [
|
|
|
3
3
|
"pingcode_wiki_list_spaces",
|
|
4
4
|
"pingcode_wiki_list_pages",
|
|
5
5
|
"pingcode_wiki_get_requirement_context",
|
|
6
|
+
"pingcode_wiki_space_sync_preview",
|
|
7
|
+
"pingcode_wiki_space_sync_commit",
|
|
8
|
+
"pingcode_wiki_page_sync_preview",
|
|
9
|
+
"pingcode_wiki_page_sync_commit",
|
|
10
|
+
"pingcode_wiki_space_members_list",
|
|
11
|
+
"pingcode_wiki_space_member_add_preview",
|
|
12
|
+
"pingcode_wiki_space_member_add_commit",
|
|
6
13
|
"pingcode_task_list",
|
|
7
14
|
"pingcode_task_get",
|
|
8
15
|
"pingcode_test_case_list",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,2BAA2B;IAC3B,2BAA2B;IAC3B,0BAA0B;IAC1B,uCAAuC;IACvC,oBAAoB;IACpB,mBAAmB;IACnB,yBAAyB;IACzB,wBAAwB;IACxB,mCAAmC;IACnC,kCAAkC;IAClC,wCAAwC;IACxC,uCAAuC;IACvC,uBAAuB;IACvB,iCAAiC;IACjC,4BAA4B;IAC5B,2BAA2B;IAC3B,iCAAiC;IACjC,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,8BAA8B;IAC9B,+BAA+B;IAC/B,4BAA4B;IAC5B,2BAA2B;IAC3B,yBAAyB;IACzB,iCAAiC;IACjC,wBAAwB;IACxB,oCAAoC;IACpC,mCAAmC;IACnC,iCAAiC;IACjC,gCAAgC;IAChC,kCAAkC;IAClC,iCAAiC;IACjC,4CAA4C;IAC5C,2CAA2C;IAC3C,4CAA4C;IAC5C,2CAA2C;IAC3C,wBAAwB;IACxB,uBAAuB;IACvB,gCAAgC;IAChC,+BAA+B;IAC/B,4BAA4B;IAC5B,2BAA2B;IAC3B,iCAAiC;IACjC,gCAAgC;IAChC,iCAAiC;IACjC,gCAAgC;IAChC,sCAAsC;IACtC,qCAAqC;IACrC,0BAA0B;IAC1B,qCAAqC;IACrC,oCAAoC;CAC5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,2BAA2B;IAC3B,2BAA2B;IAC3B,0BAA0B;IAC1B,uCAAuC;IACvC,kCAAkC;IAClC,iCAAiC;IACjC,iCAAiC;IACjC,gCAAgC;IAChC,kCAAkC;IAClC,wCAAwC;IACxC,uCAAuC;IACvC,oBAAoB;IACpB,mBAAmB;IACnB,yBAAyB;IACzB,wBAAwB;IACxB,mCAAmC;IACnC,kCAAkC;IAClC,wCAAwC;IACxC,uCAAuC;IACvC,uBAAuB;IACvB,iCAAiC;IACjC,4BAA4B;IAC5B,2BAA2B;IAC3B,iCAAiC;IACjC,oBAAoB;IACpB,oBAAoB;IACpB,sBAAsB;IACtB,8BAA8B;IAC9B,+BAA+B;IAC/B,4BAA4B;IAC5B,2BAA2B;IAC3B,yBAAyB;IACzB,iCAAiC;IACjC,wBAAwB;IACxB,oCAAoC;IACpC,mCAAmC;IACnC,iCAAiC;IACjC,gCAAgC;IAChC,kCAAkC;IAClC,iCAAiC;IACjC,4CAA4C;IAC5C,2CAA2C;IAC3C,4CAA4C;IAC5C,2CAA2C;IAC3C,wBAAwB;IACxB,uBAAuB;IACvB,gCAAgC;IAChC,+BAA+B;IAC/B,4BAA4B;IAC5B,2BAA2B;IAC3B,iCAAiC;IACjC,gCAAgC;IAChC,iCAAiC;IACjC,gCAAgC;IAChC,sCAAsC;IACtC,qCAAqC;IACrC,0BAA0B;IAC1B,qCAAqC;IACrC,oCAAoC;CAC5B,CAAC"}
|
|
@@ -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 registerWikiSpaceMemberTools(server: McpServer, services: Services, logger: Logger, runtime: WriteRuntime, mode: WriteApprovalMode): void;
|
|
7
|
+
//# sourceMappingURL=wiki-space-members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-space-members.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/wiki-space-members.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAMlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAsD9B,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,iBAAiB,GACtB,IAAI,CAiKN"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
import { PingCodeError } from "../../pingcode/errors.js";
|
|
3
|
+
import { resolveCandidate, resolveTeamReference, resolveUserReference } from "../reference-resolution.js";
|
|
4
|
+
import { resolveSpaceReference } from "./wiki-write.js";
|
|
5
|
+
import { executeTool, requestIdForLog } from "../tool-runtime.js";
|
|
6
|
+
import { requestHash } from "../../write/plan.js";
|
|
7
|
+
import { approvalTokenSchema, commitWithApproval, formatWriteToolResult, requestClientWriteConfirmation, resolveCommitVerification, } from "../write-approval.js";
|
|
8
|
+
const ref = z.string().trim().min(1).max(200);
|
|
9
|
+
const spaceRef = z.object({
|
|
10
|
+
space_id: ref.optional().describe("Wiki 空間 ID;來自 pingcode_wiki_list_spaces 或已確認的空間資料"),
|
|
11
|
+
space_name: ref.optional().describe("Wiki 空間名稱或 identifier;MCP 會在空間目錄唯一解析"),
|
|
12
|
+
}).strict()
|
|
13
|
+
.refine((value) => (value.space_id === undefined) !== (value.space_name === undefined), "必須且只能提供 space_id 或 space_name");
|
|
14
|
+
const memberRef = z.object({
|
|
15
|
+
type: z.enum(["user", "user_group"]),
|
|
16
|
+
id: ref.optional().describe("成員使用者或用戶組 ID;來自對應目錄或已確認候選"),
|
|
17
|
+
name: ref.optional().describe("成員使用者或用戶組名稱;MCP 會依 type 從目錄唯一解析"),
|
|
18
|
+
}).strict().refine((value) => (value.id === undefined) !== (value.name === undefined), "成員必須且只能提供 id 或 name");
|
|
19
|
+
const sourceRefs = z.array(z.object({
|
|
20
|
+
type: z.enum(["wiki", "task", "test_case", "spec", "plan", "code"]),
|
|
21
|
+
id: ref,
|
|
22
|
+
url: z.url().optional(),
|
|
23
|
+
content_hash: z.string().optional(),
|
|
24
|
+
}).strict()).min(1).max(20);
|
|
25
|
+
const listInput = spaceRef.extend({
|
|
26
|
+
page_index: z.number().int().min(0).optional(),
|
|
27
|
+
page_size: z.number().int().min(1).max(100).optional(),
|
|
28
|
+
});
|
|
29
|
+
const memberPlan = z.object({
|
|
30
|
+
plan_id: ref,
|
|
31
|
+
operations: z.array(z.object({
|
|
32
|
+
operation_id: ref,
|
|
33
|
+
action: z.literal("add_member"),
|
|
34
|
+
target_id: ref.optional().describe("目標 Wiki 空間 ID;來自已確認的空間目錄"),
|
|
35
|
+
target_name: ref.optional().describe("目標 Wiki 空間名稱或 identifier;MCP 會唯一解析"),
|
|
36
|
+
fields: z.object({
|
|
37
|
+
member: memberRef,
|
|
38
|
+
role_id: ref.optional().describe("從 pingcode_role_list 或 Preview 候選取得的角色 ID;正常流程建議使用 role_name"),
|
|
39
|
+
role_name: ref.optional().describe("選填;從企業角色目錄解析。未提供時由 PingCode 套用預設角色。"),
|
|
40
|
+
}).strict().refine((fields) => !(fields.role_id !== undefined && fields.role_name !== undefined), "role_id 與 role_name 不得同時提供"),
|
|
41
|
+
source_references: sourceRefs,
|
|
42
|
+
}).strict().refine((operation) => (operation.target_id === undefined) !== (operation.target_name === undefined), "空間必須且只能提供 target_id 或 target_name")).length(1),
|
|
43
|
+
}).strict();
|
|
44
|
+
const approvalContextId = z.string().uuid();
|
|
45
|
+
const sessionSchema = z.string().trim().min(8).max(200).optional();
|
|
46
|
+
const readOnlyAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
|
|
47
|
+
const previewAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true };
|
|
48
|
+
const commitAnnotations = { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true };
|
|
49
|
+
export function registerWikiSpaceMemberTools(server, services, logger, runtime, mode) {
|
|
50
|
+
const getSource = () => {
|
|
51
|
+
if (!services.getWikiWriteSource)
|
|
52
|
+
throw new PingCodeError("Wiki 寫入 Adapter 未配置", "NOT_CONFIGURED");
|
|
53
|
+
return services.getWikiWriteSource();
|
|
54
|
+
};
|
|
55
|
+
server.registerTool("pingcode_wiki_space_members_list", {
|
|
56
|
+
title: "列出 Wiki 空間成員",
|
|
57
|
+
description: "分頁讀取指定 Wiki 空間的成員及目前角色。可用 space_id 或唯一 space_name;返回 page_index、page_size、total,尚有資料時需繼續分頁。唯讀,不會新增或調整成員。",
|
|
58
|
+
inputSchema: listInput.shape,
|
|
59
|
+
annotations: readOnlyAnnotations,
|
|
60
|
+
}, async ({ space_id, space_name, page_index, page_size }, extra) => executeTool(logger, "pingcode_wiki_space_members_list", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { hasSpaceId: space_id !== undefined, hasSpaceName: space_name !== undefined, pageIndex: page_index ?? 0 }, async () => {
|
|
61
|
+
const source = getSource();
|
|
62
|
+
const resolvedSpaceId = await resolveSpaceReference(source, space_id, space_name);
|
|
63
|
+
const space = await source.getSpace(resolvedSpaceId);
|
|
64
|
+
const result = await source.listSpaceMembers(space.id, page_index ?? 0, page_size ?? 100);
|
|
65
|
+
return {
|
|
66
|
+
space: { id: space.id, name: space.name, identifier: space.identifier },
|
|
67
|
+
pageIndex: result.page_index,
|
|
68
|
+
pageSize: result.page_size,
|
|
69
|
+
total: result.total,
|
|
70
|
+
members: result.values.map((item) => ({
|
|
71
|
+
id: memberEntityId(item),
|
|
72
|
+
type: item.type,
|
|
73
|
+
name: item.type === "user" ? item.user?.display_name ?? item.user?.name ?? null : item.user_group?.name ?? null,
|
|
74
|
+
roleId: item.role?.id ?? item.role_id ?? null,
|
|
75
|
+
roleName: item.role?.name ?? null,
|
|
76
|
+
})),
|
|
77
|
+
};
|
|
78
|
+
}, { formatResult: formatMemberList }));
|
|
79
|
+
server.registerTool("pingcode_wiki_space_member_add_preview", {
|
|
80
|
+
title: "預覽新增 Wiki 空間成員",
|
|
81
|
+
description: "只預覽新增一位 Wiki 空間成員,不會寫入。成員可用企業使用者或用戶組名稱,MCP 會唯一解析目錄 ID。可選 role_name(例如「管理员」)由企業角色目錄解析,並在新增時設定;也可使用已確認候選的 role_id;省略角色時使用 PingCode 預設角色。若成員已存在會拒絕,因官方文件沒有提供更新既有 Wiki 成員角色的 endpoint。每個 plan 僅一項操作;Commit 必須原樣重送相同 plan_id 和 operations。requestHash、approvalContextId、sessionBinding、evidenceHash、agent_session_id 和 idempotency_key 不得在正常用户回复中展示或要求手動輸入。",
|
|
82
|
+
inputSchema: { ...memberPlan.shape, plan_id: memberPlan.shape.plan_id.optional(), operations: memberPlan.shape.operations.optional(), agent_session_id: sessionSchema },
|
|
83
|
+
annotations: previewAnnotations,
|
|
84
|
+
}, async (input, extra) => executeTool(logger, "pingcode_wiki_space_member_add_preview", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { planId: input.plan_id ?? "" }, async () => {
|
|
85
|
+
if (input.plan_id === undefined || input.operations === undefined) {
|
|
86
|
+
throw new PingCodeError("缺少 plan_id 或 operations;請補充 Wiki 成員新增計畫後重試 Preview", "BAD_REQUEST");
|
|
87
|
+
}
|
|
88
|
+
const plan = memberPlan.parse({ plan_id: input.plan_id, operations: input.operations });
|
|
89
|
+
const rawRequestHash = requestHash(plan);
|
|
90
|
+
const state = await inspectMemberAdd(plan, getSource(), services);
|
|
91
|
+
const displayOperation = {
|
|
92
|
+
operationId: state.operation.operation_id,
|
|
93
|
+
action: state.operation.action,
|
|
94
|
+
targetId: state.space.id,
|
|
95
|
+
changes: {
|
|
96
|
+
space: { id: state.space.id, name: state.space.name, identifier: state.space.identifier },
|
|
97
|
+
member: { id: state.member.id, type: state.member.type, name: state.member.label },
|
|
98
|
+
role: state.role === null ? "PingCode 預設角色" : { id: state.role.id, name: state.role.name },
|
|
99
|
+
},
|
|
100
|
+
sourceReferences: state.operation.source_references,
|
|
101
|
+
};
|
|
102
|
+
const evidenceHash = requestHash({ planId: plan.plan_id, requestHash: rawRequestHash, evidence: state.evidence });
|
|
103
|
+
const context = await runtime.createApprovalContext({
|
|
104
|
+
resourceType: "wiki_space",
|
|
105
|
+
requestHash: rawRequestHash,
|
|
106
|
+
evidenceHash,
|
|
107
|
+
...(typeof input.agent_session_id === "string" ? { agentSessionId: input.agent_session_id } : {}),
|
|
108
|
+
...(extra.authInfo ? { authInfo: extra.authInfo } : {}),
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
planId: plan.plan_id,
|
|
112
|
+
requestHash: rawRequestHash,
|
|
113
|
+
approvalContextId: context.approvalContextId,
|
|
114
|
+
sessionBinding: context.sessionBinding,
|
|
115
|
+
evidenceHash,
|
|
116
|
+
approvalExpiresAt: context.expiresAt,
|
|
117
|
+
counts: { creates: 1, updates: 0, relations: 0 },
|
|
118
|
+
warnings: state.role === null ? ["未指定角色,新增時由 PingCode 套用預設角色;請確認是否符合預期。"] : [],
|
|
119
|
+
operations: [displayOperation],
|
|
120
|
+
};
|
|
121
|
+
}, { formatResult: formatMemberPreview }));
|
|
122
|
+
server.registerTool("pingcode_wiki_space_member_add_commit", {
|
|
123
|
+
title: "提交新增 Wiki 空間成員",
|
|
124
|
+
description: "依有效 Preview 新增 Wiki 空間成員;如 Preview 指定 role_name,會重新解析並以官方可選 role_id 寫入。Commit 必須原樣重送 plan_id 和 operations;同一成員已存在、角色解析改變或 Preview 證據改變時拒絕寫入。寫入後讀取成員目錄驗證,結果不確定時不得重送。",
|
|
125
|
+
inputSchema: { ...memberPlan.shape, agent_session_id: sessionSchema, preview_id: approvalContextId.optional(), approval_context_id: approvalContextId.optional(), approval_token: approvalTokenSchema(mode), idempotency_key: ref.min(16).max(200).optional() },
|
|
126
|
+
annotations: commitAnnotations,
|
|
127
|
+
}, async (input, extra) => executeTool(logger, "pingcode_wiki_space_member_add_commit", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { planId: input.plan_id }, async () => {
|
|
128
|
+
runtime.assertMcpWriteScope(extra.authInfo?.scopes);
|
|
129
|
+
const plan = memberPlan.parse({ plan_id: input.plan_id, operations: input.operations });
|
|
130
|
+
const rawRequestHash = requestHash(plan);
|
|
131
|
+
const verification = await resolveCommitVerification(runtime, {
|
|
132
|
+
...(typeof input.preview_id === "string" ? { previewId: input.preview_id } : {}),
|
|
133
|
+
...(typeof input.approval_context_id === "string" ? { approvalContextId: input.approval_context_id } : {}),
|
|
134
|
+
...(typeof input.idempotency_key === "string" ? { idempotencyKey: input.idempotency_key } : {}),
|
|
135
|
+
...(typeof input.agent_session_id === "string" ? { agentSessionId: input.agent_session_id } : {}),
|
|
136
|
+
requestHash: rawRequestHash,
|
|
137
|
+
...(extra.authInfo ? { authInfo: extra.authInfo } : {}),
|
|
138
|
+
}, "wiki_space");
|
|
139
|
+
if (verification.requestHash !== rawRequestHash)
|
|
140
|
+
throw new PingCodeError("Commit 計畫與 Wiki 成員 Preview request hash 不一致;請原樣重送 plan_id 和 operations", "CONFLICT");
|
|
141
|
+
const source = getSource();
|
|
142
|
+
const state = await inspectMemberAdd(plan, source, services);
|
|
143
|
+
const evidenceHash = requestHash({ planId: plan.plan_id, requestHash: rawRequestHash, evidence: state.evidence });
|
|
144
|
+
if (evidenceHash !== verification.evidenceHash)
|
|
145
|
+
throw new PingCodeError("Wiki 空間或成員在 Preview 後已變更,請重新 Preview", "CONFLICT");
|
|
146
|
+
const confirmation = [
|
|
147
|
+
`Wiki 空間:${state.space.name}(${state.space.identifier})`,
|
|
148
|
+
`新增成員:${state.member.label}(${state.member.type})`,
|
|
149
|
+
`角色:${state.role?.name ?? "PingCode 預設角色"}`,
|
|
150
|
+
"確認後將立即新增此成員;官方 API 未提供既有成員的角色更新 endpoint。",
|
|
151
|
+
].join("\n");
|
|
152
|
+
const approvalToken = typeof input.approval_token === "string" ? input.approval_token : undefined;
|
|
153
|
+
await requestClientWriteConfirmation(server, logger, mode, approvalToken, confirmation, runtime.requiresConfirmation(["create"]));
|
|
154
|
+
const committed = await commitWithApproval(runtime, mode, {
|
|
155
|
+
resourceType: "wiki_space",
|
|
156
|
+
requestHash: verification.requestHash,
|
|
157
|
+
evidenceHash: verification.evidenceHash,
|
|
158
|
+
approvalContextId: verification.approvalContextId,
|
|
159
|
+
sessionBinding: verification.sessionBinding,
|
|
160
|
+
...(typeof input.agent_session_id === "string" ? { agentSessionId: input.agent_session_id } : {}),
|
|
161
|
+
...(approvalToken ? { approvalToken } : {}),
|
|
162
|
+
idempotencyKey: verification.idempotencyKey,
|
|
163
|
+
...(extra.authInfo ? { authInfo: extra.authInfo } : {}),
|
|
164
|
+
actions: ["create"],
|
|
165
|
+
action: async () => {
|
|
166
|
+
await source.addSpaceMember(state.space.id, { id: state.member.id, type: state.member.type }, state.role?.id);
|
|
167
|
+
const member = await verifyAddedMember(source, state);
|
|
168
|
+
return {
|
|
169
|
+
planId: plan.plan_id,
|
|
170
|
+
resources: [{
|
|
171
|
+
operationId: state.operation.operation_id,
|
|
172
|
+
action: "create",
|
|
173
|
+
id: state.member.id,
|
|
174
|
+
name: state.member.label,
|
|
175
|
+
roleId: member.role?.id ?? member.role_id ?? null,
|
|
176
|
+
roleName: member.role?.name ?? null,
|
|
177
|
+
verified: true,
|
|
178
|
+
}],
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
...committed.result,
|
|
184
|
+
replayed: committed.replayed,
|
|
185
|
+
approvedBy: committed.approval.approvedBy,
|
|
186
|
+
auditId: committed.auditId,
|
|
187
|
+
};
|
|
188
|
+
}, { formatResult: formatMemberWrite }));
|
|
189
|
+
}
|
|
190
|
+
async function inspectMemberAdd(plan, source, services) {
|
|
191
|
+
const operation = plan.operations[0];
|
|
192
|
+
if (!operation)
|
|
193
|
+
throw new PingCodeError("Wiki 成員新增計畫不能為空", "BAD_REQUEST");
|
|
194
|
+
const spaceId = await resolveSpaceReference(source, operation.target_id, operation.target_name);
|
|
195
|
+
const space = await source.getSpace(spaceId);
|
|
196
|
+
const originalMember = operation.fields.member;
|
|
197
|
+
const memberId = originalMember.type === "user"
|
|
198
|
+
? await resolveUserReference("Wiki 空間成員", originalMember.id, originalMember.name, services)
|
|
199
|
+
: await resolveTeamReference("Wiki 空間用戶組成員", originalMember.id, originalMember.name, services);
|
|
200
|
+
if (!memberId)
|
|
201
|
+
throw new PingCodeError("無法解析 Wiki 空間成員", "BAD_REQUEST");
|
|
202
|
+
const role = operation.fields.role_id === undefined && operation.fields.role_name === undefined
|
|
203
|
+
? null
|
|
204
|
+
: await resolveWikiRole(operation.fields.role_id, operation.fields.role_name, services);
|
|
205
|
+
const members = await listAllSpaceMembers(source, space.id);
|
|
206
|
+
const exists = members.find((item) => item.type === originalMember.type && memberEntityId(item) === memberId);
|
|
207
|
+
if (exists) {
|
|
208
|
+
const currentRole = exists.role?.name ?? exists.role?.id ?? exists.role_id ?? "未知角色";
|
|
209
|
+
throw new PingCodeError(`Wiki 空間「${space.name}」已包含此成員,目前角色為 ${currentRole}。官方 Open API 沒有提供既有 Wiki 成員角色更新 endpoint,因此不會用重複新增或移除再重加來變更角色`, "CONFLICT");
|
|
210
|
+
}
|
|
211
|
+
const memberLabel = originalMember.name ?? `${memberId}(已由目錄確認)`;
|
|
212
|
+
return {
|
|
213
|
+
operation,
|
|
214
|
+
space: { id: space.id, name: space.name, identifier: space.identifier },
|
|
215
|
+
member: { id: memberId, type: originalMember.type, label: memberLabel },
|
|
216
|
+
role,
|
|
217
|
+
evidence: {
|
|
218
|
+
space: { id: space.id, name: space.name, identifier: space.identifier },
|
|
219
|
+
member: { id: memberId, type: originalMember.type, exists: false },
|
|
220
|
+
role: role === null ? null : { id: role.id, name: role.name },
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async function resolveWikiRole(roleId, roleName, services) {
|
|
225
|
+
const roles = [];
|
|
226
|
+
for (let pageIndex = 0; pageIndex < 100; pageIndex += 1) {
|
|
227
|
+
const result = await services.getMetadataSource().listRoles({ pageIndex, pageSize: 100 });
|
|
228
|
+
roles.push(...result.values.map(({ id, name }) => ({ id, name })));
|
|
229
|
+
if (roles.length >= result.total || result.values.length === 0) {
|
|
230
|
+
const resolvedId = resolveCandidate("Wiki 空間成員角色", roleId, roleName, roles);
|
|
231
|
+
const resolved = roles.find((item) => item.id === resolvedId);
|
|
232
|
+
if (!resolved)
|
|
233
|
+
throw new PingCodeError("無法從 PingCode 角色目錄解析 Wiki 空間角色", "NOT_FOUND");
|
|
234
|
+
return resolved;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
throw new PingCodeError("PingCode 角色目錄超過安全掃描上限,無法解析角色名稱", "RESPONSE_TOO_LARGE");
|
|
238
|
+
}
|
|
239
|
+
async function listAllSpaceMembers(source, spaceId) {
|
|
240
|
+
const members = [];
|
|
241
|
+
for (let pageIndex = 0; pageIndex < 100; pageIndex += 1) {
|
|
242
|
+
const result = await source.listSpaceMembers(spaceId, pageIndex, 100);
|
|
243
|
+
members.push(...result.values);
|
|
244
|
+
if (members.length >= result.total || result.values.length === 0)
|
|
245
|
+
return members;
|
|
246
|
+
}
|
|
247
|
+
throw new PingCodeError("Wiki 空間成員目錄超過 10000 項安全掃描上限,無法安全新增成員", "RESPONSE_TOO_LARGE");
|
|
248
|
+
}
|
|
249
|
+
async function verifyAddedMember(source, state) {
|
|
250
|
+
let lastError;
|
|
251
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
252
|
+
try {
|
|
253
|
+
const members = await listAllSpaceMembers(source, state.space.id);
|
|
254
|
+
const found = members.find((item) => item.type === state.member.type && memberEntityId(item) === state.member.id);
|
|
255
|
+
if (found && (state.role === null || (found.role?.id ?? found.role_id) === state.role.id))
|
|
256
|
+
return found;
|
|
257
|
+
lastError = new Error(found ? "回讀成員角色與 Preview 不同" : "回讀尚未包含新增成員");
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
lastError = error;
|
|
261
|
+
}
|
|
262
|
+
if (attempt < 2)
|
|
263
|
+
await new Promise((resolve) => setTimeout(resolve, 200 * (attempt + 1)));
|
|
264
|
+
}
|
|
265
|
+
throw new PingCodeError("Wiki 成員新增請求已送出,但成員或角色回讀未能確認;請先唯讀回讀,不要重送", "WRITE_OUTCOME_UNKNOWN", lastError === undefined ? {} : { cause: lastError });
|
|
266
|
+
}
|
|
267
|
+
function memberEntityId(member) {
|
|
268
|
+
return member.type === "user" ? member.user?.id ?? member.id : member.user_group?.id ?? member.id;
|
|
269
|
+
}
|
|
270
|
+
function formatMemberList(result) {
|
|
271
|
+
const lines = [`Wiki 空間成員:${result.space.name}(${result.space.identifier})`, `空間 ID:${result.space.id}`, `成員:${result.members.length}/${result.total}`];
|
|
272
|
+
for (const member of result.members)
|
|
273
|
+
lines.push(`- ${member.name ?? member.id} [${member.type}];角色:${member.roleName ?? member.roleId ?? "未返回"}`);
|
|
274
|
+
if (result.members.length === 0)
|
|
275
|
+
lines.push("此頁沒有成員;若總數大於 0,請調整 page_index 載入其他頁。");
|
|
276
|
+
const first = result.total === 0 ? 0 : result.pageIndex * result.pageSize + 1;
|
|
277
|
+
const last = Math.min(result.pageIndex * result.pageSize + result.members.length, result.total);
|
|
278
|
+
lines.push(`分頁:第 ${result.pageIndex + 1} 頁,顯示 ${first}-${last}/${result.total} 條${last < result.total ? `;尚有資料,請使用 page_index=${result.pageIndex + 1}` : ";已到最後一頁"}`);
|
|
279
|
+
return lines.join("\n");
|
|
280
|
+
}
|
|
281
|
+
function formatMemberPreview(result) {
|
|
282
|
+
const value = result;
|
|
283
|
+
const operation = value.operations[0];
|
|
284
|
+
const lines = ["Wiki 空間成員新增預覽", "目前尚未寫入 PingCode。", `摘要:新增 ${value.counts.creates} 位成員`];
|
|
285
|
+
if (operation) {
|
|
286
|
+
lines.push(`空間:${operation.changes.space.name}(${operation.changes.space.identifier})`);
|
|
287
|
+
lines.push(`新增成員:${operation.changes.member.name} [${operation.changes.member.type}]`);
|
|
288
|
+
lines.push(`角色:${typeof operation.changes.role === "string" ? operation.changes.role : operation.changes.role.name}`);
|
|
289
|
+
}
|
|
290
|
+
for (const warning of value.warnings)
|
|
291
|
+
lines.push(`注意:${warning}`);
|
|
292
|
+
lines.push("核對空間、成員和角色後,才可由 Agent 提交 Commit;內部 Approval 欄位不需手動輸入。");
|
|
293
|
+
return lines.join("\n");
|
|
294
|
+
}
|
|
295
|
+
function formatMemberWrite(result) {
|
|
296
|
+
const value = result;
|
|
297
|
+
const text = formatWriteToolResult(result);
|
|
298
|
+
const resource = value.resources?.[0];
|
|
299
|
+
if (!resource)
|
|
300
|
+
return text;
|
|
301
|
+
return `${text}\n- Wiki 空間成員:${resource.name ?? "已確認成員"}\n- 回讀角色:${resource.roleName ?? "PingCode 已接受(角色名稱未返回)"}`;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=wiki-space-members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-space-members.js","sourceRoot":"","sources":["../../../src/mcp/tools/wiki-space-members.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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 registerWikiWriteTools(server: McpServer, services: Services, logger: Logger, runtime: WriteRuntime, mode: WriteApprovalMode): void;
|
|
7
|
+
export declare function resolveSpaceReference(source: NonNullable<ReturnType<NonNullable<Services["getWikiWriteSource"]>>>, id?: string, name?: string): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=wiki-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-write.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/wiki-write.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAA6H,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAqCzL,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAGlJ;AA4UD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASrK"}
|