@xihe-lab/tapd-mcp-server 1.3.0 → 1.4.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/README.md +88 -26
- package/dist/integration-test.d.ts +10 -0
- package/dist/integration-test.d.ts.map +1 -0
- package/dist/integration-test.js +117 -0
- package/dist/integration-test.js.map +1 -0
- package/dist/tapd-client.d.ts +32 -1
- package/dist/tapd-client.d.ts.map +1 -1
- package/dist/tapd-client.js +96 -19
- package/dist/tapd-client.js.map +1 -1
- package/dist/tools/attachment.d.ts.map +1 -1
- package/dist/tools/attachment.js +35 -10
- package/dist/tools/attachment.js.map +1 -1
- package/dist/tools/board.d.ts +3 -0
- package/dist/tools/board.d.ts.map +1 -0
- package/dist/tools/board.js +98 -0
- package/dist/tools/board.js.map +1 -0
- package/dist/tools/bug.d.ts.map +1 -1
- package/dist/tools/bug.js +382 -7
- package/dist/tools/bug.js.map +1 -1
- package/dist/tools/changes.d.ts.map +1 -1
- package/dist/tools/changes.js +25 -34
- package/dist/tools/changes.js.map +1 -1
- package/dist/tools/comment.d.ts.map +1 -1
- package/dist/tools/comment.js +53 -3
- package/dist/tools/comment.js.map +1 -1
- package/dist/tools/custom-fields.d.ts.map +1 -1
- package/dist/tools/custom-fields.js +43 -36
- package/dist/tools/custom-fields.js.map +1 -1
- package/dist/tools/image.d.ts +3 -0
- package/dist/tools/image.d.ts.map +1 -0
- package/dist/tools/image.js +23 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/iteration.d.ts.map +1 -1
- package/dist/tools/iteration.js +95 -6
- package/dist/tools/iteration.js.map +1 -1
- package/dist/tools/mini-comment.d.ts.map +1 -1
- package/dist/tools/mini-comment.js +18 -5
- package/dist/tools/mini-comment.js.map +1 -1
- package/dist/tools/mini-item.d.ts.map +1 -1
- package/dist/tools/mini-item.js +36 -11
- package/dist/tools/mini-item.js.map +1 -1
- package/dist/tools/mini-workspace.d.ts.map +1 -1
- package/dist/tools/mini-workspace.js +13 -4
- package/dist/tools/mini-workspace.js.map +1 -1
- package/dist/tools/program.d.ts +3 -0
- package/dist/tools/program.d.ts.map +1 -0
- package/dist/tools/program.js +27 -0
- package/dist/tools/program.js.map +1 -0
- package/dist/tools/relations.d.ts.map +1 -1
- package/dist/tools/relations.js +25 -30
- package/dist/tools/relations.js.map +1 -1
- package/dist/tools/release.d.ts.map +1 -1
- package/dist/tools/release.js +228 -2
- package/dist/tools/release.js.map +1 -1
- package/dist/tools/report.d.ts +3 -0
- package/dist/tools/report.d.ts.map +1 -0
- package/dist/tools/report.js +38 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/settings.d.ts.map +1 -1
- package/dist/tools/settings.js +379 -31
- package/dist/tools/settings.js.map +1 -1
- package/dist/tools/source.d.ts +3 -0
- package/dist/tools/source.d.ts.map +1 -0
- package/dist/tools/source.js +69 -0
- package/dist/tools/source.js.map +1 -0
- package/dist/tools/story.d.ts.map +1 -1
- package/dist/tools/story.js +650 -160
- package/dist/tools/story.js.map +1 -1
- package/dist/tools/task.d.ts.map +1 -1
- package/dist/tools/task.js +104 -11
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/test.d.ts.map +1 -1
- package/dist/tools/test.js +505 -75
- package/dist/tools/test.js.map +1 -1
- package/dist/tools/timesheet.d.ts.map +1 -1
- package/dist/tools/timesheet.js +72 -11
- package/dist/tools/timesheet.js.map +1 -1
- package/dist/tools/user.d.ts.map +1 -1
- package/dist/tools/user.js +36 -4
- package/dist/tools/user.js.map +1 -1
- package/dist/tools/utility.d.ts +3 -0
- package/dist/tools/utility.d.ts.map +1 -0
- package/dist/tools/utility.js +132 -0
- package/dist/tools/utility.js.map +1 -0
- package/dist/tools/wiki.d.ts.map +1 -1
- package/dist/tools/wiki.js +75 -20
- package/dist/tools/wiki.js.map +1 -1
- package/dist/tools/workflow.d.ts.map +1 -1
- package/dist/tools/workflow.js +78 -6
- package/dist/tools/workflow.js.map +1 -1
- package/dist/tools/workspace.d.ts.map +1 -1
- package/dist/tools/workspace.js +93 -4
- package/dist/tools/workspace.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -33,14 +33,16 @@ TAPD 是腾讯敏捷研发管理平台,覆盖需求、计划、研发、测试
|
|
|
33
33
|
|
|
34
34
|
#### 方式一:一键安装命令
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
注意替换以下参数(必填项标记为 **必填**,其余可选)。`-s user` 为用户级配置(所有项目生效),改为 `-s project` 则仅当前项目生效:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
39
|
claude mcp add -s user tapd \
|
|
40
|
-
--env TAPD_ACCESS_TOKEN=your_access_token \
|
|
41
|
-
--env TAPD_DEFAULT_WORKSPACE_ID=your_workspace_id \
|
|
42
|
-
--env TAPD_NICK_NAME=your_nick_name \
|
|
43
|
-
--
|
|
40
|
+
--env TAPD_ACCESS_TOKEN=your_access_token \ # 必填:个人访问令牌
|
|
41
|
+
--env TAPD_DEFAULT_WORKSPACE_ID=your_workspace_id \ # 必填:默认项目 ID
|
|
42
|
+
--env TAPD_NICK_NAME=your_nick_name \ # 推荐:用户昵称,用于 owner/creator 默认值
|
|
43
|
+
--env TAPD_DEFAULT_TASK_WORKITEM_TYPE_ID=your_task_type_id \ # 可选:默认 TASK 类型 ID,可通过 tapd_get_workitem_types 查询
|
|
44
|
+
--env TAPD_DEFAULT_STORY_WORKITEM_TYPE_ID=your_story_type_id \ # 可选:默认 STORY 类型 ID
|
|
45
|
+
-- npx -y "@xihe-lab/tapd-mcp-server@latest"
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
若忘记替换凭证,重新安装前需先卸载旧的配置:
|
|
@@ -59,14 +61,16 @@ claude mcp remove tapd
|
|
|
59
61
|
"mcpServers": {
|
|
60
62
|
"tapd": {
|
|
61
63
|
"command": "npx",
|
|
62
|
-
"args": ["-y", "@xihe-lab/tapd-mcp-server"],
|
|
64
|
+
"args": ["-y", "@xihe-lab/tapd-mcp-server@latest"],
|
|
63
65
|
"env": {
|
|
64
66
|
"TAPD_ACCESS_TOKEN": "",
|
|
65
67
|
"TAPD_API_USER": "",
|
|
66
68
|
"TAPD_API_PASSWORD": "",
|
|
67
69
|
"TAPD_API_BASE_URL": "https://api.tapd.cn",
|
|
68
70
|
"TAPD_DEFAULT_WORKSPACE_ID": "",
|
|
69
|
-
"TAPD_NICK_NAME": ""
|
|
71
|
+
"TAPD_NICK_NAME": "",
|
|
72
|
+
"TAPD_DEFAULT_STORY_WORKITEM_TYPE_ID": "",
|
|
73
|
+
"TAPD_DEFAULT_TASK_WORKITEM_TYPE_ID": ""
|
|
70
74
|
}
|
|
71
75
|
}
|
|
72
76
|
}
|
|
@@ -101,28 +105,43 @@ claude mcp remove tapd
|
|
|
101
105
|
| `TAPD_API_BASE_URL` | 否 | API 基础地址,默认 `https://api.tapd.cn` |
|
|
102
106
|
| `TAPD_DEFAULT_WORKSPACE_ID` | 否 | 默认项目 ID,省去每次传 workspace_id |
|
|
103
107
|
| `TAPD_NICK_NAME` | 否 | 用户昵称,作为 owner/creator 等参数的默认值 |
|
|
108
|
+
| `TAPD_DEFAULT_STORY_WORKITEM_TYPE_ID` | 否 | 默认 STORY 工作项类型 ID |
|
|
109
|
+
| `TAPD_DEFAULT_TASK_WORKITEM_TYPE_ID` | 否 | 默认 TASK 工作项类型 ID |
|
|
104
110
|
|
|
105
111
|
注意:`TAPD_API_USER`/`TAPD_API_PASSWORD`(API 账号密码)与 `TAPD_ACCESS_TOKEN`(个人访问令牌)为两种调用方式,选一种即可。
|
|
106
112
|
|
|
107
113
|
## 支持的能力
|
|
108
114
|
|
|
109
|
-
| 模块 |
|
|
110
|
-
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
| 缺陷 |
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
|
|
|
119
|
-
|
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
125
|
-
|
|
115
|
+
| 模块 | 工具数 | 可用操作 |
|
|
116
|
+
|------|--------|----------|
|
|
117
|
+
| 需求 | 28 | 查询/创建/更新/复制/批量更新需求;需求分类管理;工作项类型转换;字段信息查询;模板管理;关联缺陷/测试用例;时间关系管理 |
|
|
118
|
+
| 测试 | 28 | 测试用例 CRUD;测试用例分类;测试计划 CRUD;测试执行与结果;用例与计划关联管理 |
|
|
119
|
+
| 缺陷 | 20 | 查询/创建/更新/复制/批量更新缺陷;缺陷关联管理;字段信息查询;模板管理;变更历史 |
|
|
120
|
+
| 项目配置 | 21 | 模块/版本/特性/基线 CRUD;自定义字段配置;项目配置开关 |
|
|
121
|
+
| Wiki | 11 | 查询/创建/更新 Wiki 页面;附件/DrawIO/权限/关注者/标签管理 |
|
|
122
|
+
| 发布 | 11 | 发布计划 CRUD;发布评审创建与管理;评审依据管理;模板查询 |
|
|
123
|
+
| 项目 | 9 | 项目信息查询;成员列表;子项目;文档;日历;自定义字段;第三方项目关联 |
|
|
124
|
+
| 任务 | 7 | 查询/创建/更新/批量更新任务;任务变更历史 |
|
|
125
|
+
| 迭代 | 7 | 查询/创建/更新迭代;迭代变更历史;锁定/解锁 |
|
|
126
|
+
| 工作流 | 7 | 工作流定义查询;状态映射;节点信息;转换规则;首末步骤查询 |
|
|
127
|
+
| 自定义字段 | 7 | 需求/缺陷/任务/测试用例/迭代自定义字段配置查询;字段信息查询 |
|
|
128
|
+
| 轻量级项目 | 6 | 轻量级工作项查询/创建/更新;分类管理;变更历史 |
|
|
129
|
+
| 附件 | 5 | 附件查询/下载;轻量级项目附件管理 |
|
|
130
|
+
| 工时 | 5 | 工时记录查询/创建/更新/删除;工时统计 |
|
|
131
|
+
| 评论 | 4 | 评论查询/创建/更新;评论数量统计 |
|
|
132
|
+
| 用户 | 4 | 个人设置查询;角色列表;第三方用户映射;当前用户信息 |
|
|
133
|
+
| 变更历史 | 4 | 需求/任务变更历史查询;变更数量统计 |
|
|
134
|
+
| 看板 | 4 | 看板工作项创建/查询/更新;看板列查询 |
|
|
135
|
+
| 关联关系 | 4 | 需求关联查询/添加/删除;关联缺陷查询 |
|
|
136
|
+
| 工具类 | 4 | 短ID转长ID;批量获取需求/缺陷/任务详情 |
|
|
137
|
+
| 代码 | 3 | 代码提交记录添加/查询;提交对象详情 |
|
|
138
|
+
| 轻量级项目空间 | 3 | 项目信息查询;成员列表;用户项目列表 |
|
|
139
|
+
| 轻量级评论 | 3 | 评论查询/创建;评论数量统计 |
|
|
140
|
+
| 报表 | 2 | 项目报表列表;状态流转时间统计 |
|
|
141
|
+
| 项目集 | 2 | 项目集关联项目;项目集绑定实体 |
|
|
142
|
+
| 图片 | 1 | 获取图片 URL |
|
|
143
|
+
|
|
144
|
+
共 **210 个工具**,覆盖 **26 个模块**。AI 助手会根据你的自然语言描述自动选择合适的工具。
|
|
126
145
|
|
|
127
146
|
## 常见问题
|
|
128
147
|
|
|
@@ -134,6 +153,14 @@ claude mcp remove tapd
|
|
|
134
153
|
|
|
135
154
|
在 TAPD 开放平台检查应用权限,确保已勾选所需 API 的访问权限。
|
|
136
155
|
|
|
156
|
+
### 创建任务时提示权限不足
|
|
157
|
+
|
|
158
|
+
如果 OAuth Token 没有 `tasks::create` 权限,可以通过 `tapd_create_story` 工具传入 TASK 类型的 `workitem_type_id` 来创建任务(仅需 `stories::create` 权限):
|
|
159
|
+
|
|
160
|
+
> 用 tapd_create_story 创建一个任务,workitem_type_id 设为 TASK 类型
|
|
161
|
+
|
|
162
|
+
可通过 `tapd_get_workitem_types` 查询项目中可用的 TASK 类型 ID。
|
|
163
|
+
|
|
137
164
|
### 支持 Basic Auth 吗
|
|
138
165
|
|
|
139
166
|
支持。设置 `TAPD_API_USER` 和 `TAPD_API_PASSWORD` 即可,与 Access Token 二选一。
|
|
@@ -152,7 +179,9 @@ claude mcp add -s user tapd \
|
|
|
152
179
|
--env TAPD_ACCESS_TOKEN=your_access_token \
|
|
153
180
|
--env TAPD_DEFAULT_WORKSPACE_ID=your_workspace_id \
|
|
154
181
|
--env TAPD_NICK_NAME=your_nick_name \
|
|
155
|
-
--
|
|
182
|
+
--env TAPD_DEFAULT_TASK_WORKITEM_TYPE_ID=your_task_type_id \
|
|
183
|
+
--env TAPD_DEFAULT_STORY_WORKITEM_TYPE_ID=your_story_type_id \
|
|
184
|
+
-- npx -y "@xihe-lab/tapd-mcp-server@latest"
|
|
156
185
|
```
|
|
157
186
|
|
|
158
187
|
### Claude Desktop / Cursor
|
|
@@ -171,10 +200,43 @@ claude mcp add -s user tapd \
|
|
|
171
200
|
}
|
|
172
201
|
```
|
|
173
202
|
|
|
174
|
-
###
|
|
203
|
+
### npm 全局安装方式
|
|
204
|
+
|
|
205
|
+
如果通过 npm 全局安装使用:
|
|
175
206
|
|
|
176
207
|
```bash
|
|
208
|
+
# 查看当前安装版本
|
|
209
|
+
npm list -g @xihe-lab/tapd-mcp-server
|
|
210
|
+
|
|
211
|
+
# 更新到最新版本
|
|
212
|
+
npm update -g @xihe-lab/tapd-mcp-server
|
|
213
|
+
|
|
214
|
+
# 或指定版本安装
|
|
215
|
+
npm install -g @xihe-lab/tapd-mcp-server@1.5.0
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
更新后需重启 MCP 客户端。
|
|
219
|
+
|
|
220
|
+
### npx 缓存清理
|
|
221
|
+
|
|
222
|
+
如果 npx 使用了旧版本缓存,可手动清理后重新运行:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# 清理 npx 缓存
|
|
226
|
+
npx clear-npx-cache
|
|
227
|
+
|
|
228
|
+
# 或手动删除缓存目录
|
|
229
|
+
rm -rf ~/.npm/_npx
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 查看版本信息
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# 查看最新发布版本
|
|
177
236
|
npm view @xihe-lab/tapd-mcp-server version
|
|
237
|
+
|
|
238
|
+
# 查看所有已发布版本
|
|
239
|
+
npm view @xihe-lab/tapd-mcp-server versions
|
|
178
240
|
```
|
|
179
241
|
|
|
180
242
|
### 查看更新日志
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-test.d.ts","sourceRoot":"","sources":["../src/integration-test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration Test Script for Tasks 210-213
|
|
3
|
+
*
|
|
4
|
+
* Tests:
|
|
5
|
+
* - Task 210: tapd_get_image_url
|
|
6
|
+
* - Task 212: tapd_get_current_user
|
|
7
|
+
* - Task 213: batch fetch functionality
|
|
8
|
+
*/
|
|
9
|
+
import { TapdClient } from './tapd-client.js';
|
|
10
|
+
async function runTests() {
|
|
11
|
+
console.log('Starting integration tests...\n');
|
|
12
|
+
const client = TapdClient.fromEnv();
|
|
13
|
+
const workspaceId = TapdClient.getDefaultWorkspaceId();
|
|
14
|
+
if (!workspaceId) {
|
|
15
|
+
console.error('ERROR: TAPD_DEFAULT_WORKSPACE_ID must be set');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const results = [];
|
|
19
|
+
// Test 212: tapd_get_current_user
|
|
20
|
+
console.log('Test 212: tapd_get_current_user');
|
|
21
|
+
try {
|
|
22
|
+
const user = await client.get('/users/info');
|
|
23
|
+
console.log(' Result:', JSON.stringify(user, null, 2).slice(0, 200));
|
|
24
|
+
results.push({ test: 'tapd_get_current_user', status: 'PASS' });
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
28
|
+
console.log(' Error:', msg);
|
|
29
|
+
results.push({ test: 'tapd_get_current_user', status: 'FAIL', error: msg });
|
|
30
|
+
}
|
|
31
|
+
// Test 210: tapd_get_image_url
|
|
32
|
+
console.log('\nTest 210: tapd_get_image_url');
|
|
33
|
+
try {
|
|
34
|
+
// Test with a sample image path
|
|
35
|
+
const testImagePath = '/tfl/captures/2025/04/test.png';
|
|
36
|
+
const imageUrl = await client.get('/files/get_image', {
|
|
37
|
+
workspace_id: workspaceId,
|
|
38
|
+
image_path: testImagePath,
|
|
39
|
+
});
|
|
40
|
+
console.log(' Result:', JSON.stringify(imageUrl, null, 2).slice(0, 200));
|
|
41
|
+
results.push({ test: 'tapd_get_image_url', status: 'PASS' });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
45
|
+
console.log(' Error:', msg);
|
|
46
|
+
// Expected to fail for non-existent image, but API should respond correctly
|
|
47
|
+
if (msg.includes('TAPD API error')) {
|
|
48
|
+
results.push({ test: 'tapd_get_image_url', status: 'PASS' }); // API responded correctly
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
results.push({ test: 'tapd_get_image_url', status: 'FAIL', error: msg });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Test 213: batch fetch stories
|
|
55
|
+
console.log('\nTest 213: tapd_batch_fetch_stories');
|
|
56
|
+
try {
|
|
57
|
+
// Test with a single known story ID
|
|
58
|
+
const testIds = ['1']; // Short ID test
|
|
59
|
+
const promises = testIds.map(id => client.get('/stories', {
|
|
60
|
+
workspace_id: workspaceId,
|
|
61
|
+
id: TapdClient.toLongId(id, workspaceId),
|
|
62
|
+
}));
|
|
63
|
+
const stories = await Promise.all(promises);
|
|
64
|
+
console.log(' Fetched stories count:', stories.length);
|
|
65
|
+
results.push({ test: 'tapd_batch_fetch_stories', status: 'PASS' });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
69
|
+
console.log(' Error:', msg);
|
|
70
|
+
results.push({ test: 'tapd_batch_fetch_stories', status: 'FAIL', error: msg });
|
|
71
|
+
}
|
|
72
|
+
// Test 213: batch fetch bugs
|
|
73
|
+
console.log('\nTest 213: tapd_batch_fetch_bugs');
|
|
74
|
+
try {
|
|
75
|
+
const testIds = ['1'];
|
|
76
|
+
const promises = testIds.map(id => client.get('/bugs', {
|
|
77
|
+
workspace_id: workspaceId,
|
|
78
|
+
id: TapdClient.toLongId(id, workspaceId),
|
|
79
|
+
}));
|
|
80
|
+
const bugs = await Promise.all(promises);
|
|
81
|
+
console.log(' Fetched bugs count:', bugs.length);
|
|
82
|
+
results.push({ test: 'tapd_batch_fetch_bugs', status: 'PASS' });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
86
|
+
console.log(' Error:', msg);
|
|
87
|
+
results.push({ test: 'tapd_batch_fetch_bugs', status: 'FAIL', error: msg });
|
|
88
|
+
}
|
|
89
|
+
// Test 213: batch fetch tasks
|
|
90
|
+
console.log('\nTest 213: tapd_batch_fetch_tasks');
|
|
91
|
+
try {
|
|
92
|
+
const testIds = ['1'];
|
|
93
|
+
const promises = testIds.map(id => client.get('/tasks', {
|
|
94
|
+
workspace_id: workspaceId,
|
|
95
|
+
id: TapdClient.toLongId(id, workspaceId),
|
|
96
|
+
}));
|
|
97
|
+
const tasks = await Promise.all(promises);
|
|
98
|
+
console.log(' Fetched tasks count:', tasks.length);
|
|
99
|
+
results.push({ test: 'tapd_batch_fetch_tasks', status: 'PASS' });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
103
|
+
console.log(' Error:', msg);
|
|
104
|
+
results.push({ test: 'tapd_batch_fetch_tasks', status: 'FAIL', error: msg });
|
|
105
|
+
}
|
|
106
|
+
// Summary
|
|
107
|
+
console.log('\n=== Test Summary ===');
|
|
108
|
+
const passed = results.filter(r => r.status === 'PASS').length;
|
|
109
|
+
const failed = results.filter(r => r.status === 'FAIL').length;
|
|
110
|
+
console.log(`Total: ${results.length}, PASS: ${passed}, FAIL: ${failed}`);
|
|
111
|
+
for (const r of results) {
|
|
112
|
+
console.log(` ${r.status}: ${r.test}${r.error ? ` - ${r.error.slice(0, 100)}` : ''}`);
|
|
113
|
+
}
|
|
114
|
+
process.exit(failed > 0 ? 1 : 0);
|
|
115
|
+
}
|
|
116
|
+
runTests();
|
|
117
|
+
//# sourceMappingURL=integration-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-test.js","sourceRoot":"","sources":["../src/integration-test.ts"],"names":[],"mappings":"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"}
|
package/dist/tapd-client.d.ts
CHANGED
|
@@ -32,8 +32,39 @@ export declare class TapdClient {
|
|
|
32
32
|
*/
|
|
33
33
|
static getNickName(): string | undefined;
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
35
|
+
* Get default workspace ID from environment variable TAPD_DEFAULT_WORKSPACE_ID
|
|
36
36
|
*/
|
|
37
|
+
static getDefaultWorkspaceId(): number | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Get default STORY workitem type ID from environment variable
|
|
40
|
+
*/
|
|
41
|
+
static getDefaultStoryWorkitemTypeId(): string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Get default TASK workitem type ID from environment variable
|
|
44
|
+
*/
|
|
45
|
+
static getDefaultTaskWorkitemTypeId(): string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Convert short ID to long ID
|
|
48
|
+
*
|
|
49
|
+
* Rules:
|
|
50
|
+
* - Pure numeric ID with ≤9 digits is treated as short ID
|
|
51
|
+
* - For cloud environment (is_cloud=true), prefix is '11'
|
|
52
|
+
* - Pad short ID to 9 digits and concatenate with workspace_id
|
|
53
|
+
* - Non-short IDs are returned unchanged
|
|
54
|
+
*
|
|
55
|
+
* @param id - Story/bug/task ID (short or long format)
|
|
56
|
+
* @param workspaceId - Workspace ID for constructing long ID
|
|
57
|
+
* @param isCloud - Whether it's cloud environment (default: true)
|
|
58
|
+
*/
|
|
59
|
+
static toLongId(id: string | number, workspaceId: string | number, isCloud?: boolean): string;
|
|
60
|
+
/**
|
|
61
|
+
* Make HTTP request to TAPD API with retry support
|
|
62
|
+
*
|
|
63
|
+
* Retry policy:
|
|
64
|
+
* - Retry on 429/500/502/503 status codes
|
|
65
|
+
* - Max 3 retries with exponential backoff (1s, 2s, 4s)
|
|
66
|
+
* - POST requests do NOT retry (avoid duplicate creation)
|
|
67
|
+
*/
|
|
37
68
|
request<T>(method: 'GET' | 'POST', path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T>;
|
|
38
69
|
/**
|
|
39
70
|
* GET request to TAPD API
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tapd-client.d.ts","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B,OAAO;IAcP;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAIzE;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAWxF;;;OAGG;IACH,MAAM,CAAC,OAAO,IAAI,UAAU;IAmB5B;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC;;OAEG;
|
|
1
|
+
{"version":3,"file":"tapd-client.d.ts","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B,OAAO;IAcP;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAIzE;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAWxF;;;OAGG;IACH,MAAM,CAAC,OAAO,IAAI,UAAU;IAmB5B;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAKlD;;OAEG;IACH,MAAM,CAAC,6BAA6B,IAAI,MAAM,GAAG,SAAS;IAI1D;;OAEG;IACH,MAAM,CAAC,4BAA4B,IAAI,MAAM,GAAG,SAAS;IAIzD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,MAAM;IAcnG;;;;;;;KAOC;IACK,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC7D,OAAO,CAAC,CAAC,CAAC;IAkFb;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1F;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGxG;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,MAAM,CAAC;CACd"}
|
package/dist/tapd-client.js
CHANGED
|
@@ -57,8 +57,56 @@ export class TapdClient {
|
|
|
57
57
|
return process.env.TAPD_NICK_NAME;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
*
|
|
60
|
+
* Get default workspace ID from environment variable TAPD_DEFAULT_WORKSPACE_ID
|
|
61
61
|
*/
|
|
62
|
+
static getDefaultWorkspaceId() {
|
|
63
|
+
const id = process.env.TAPD_DEFAULT_WORKSPACE_ID;
|
|
64
|
+
return id ? parseInt(id, 10) : undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get default STORY workitem type ID from environment variable
|
|
68
|
+
*/
|
|
69
|
+
static getDefaultStoryWorkitemTypeId() {
|
|
70
|
+
return process.env.TAPD_DEFAULT_STORY_WORKITEM_TYPE_ID;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get default TASK workitem type ID from environment variable
|
|
74
|
+
*/
|
|
75
|
+
static getDefaultTaskWorkitemTypeId() {
|
|
76
|
+
return process.env.TAPD_DEFAULT_TASK_WORKITEM_TYPE_ID;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Convert short ID to long ID
|
|
80
|
+
*
|
|
81
|
+
* Rules:
|
|
82
|
+
* - Pure numeric ID with ≤9 digits is treated as short ID
|
|
83
|
+
* - For cloud environment (is_cloud=true), prefix is '11'
|
|
84
|
+
* - Pad short ID to 9 digits and concatenate with workspace_id
|
|
85
|
+
* - Non-short IDs are returned unchanged
|
|
86
|
+
*
|
|
87
|
+
* @param id - Story/bug/task ID (short or long format)
|
|
88
|
+
* @param workspaceId - Workspace ID for constructing long ID
|
|
89
|
+
* @param isCloud - Whether it's cloud environment (default: true)
|
|
90
|
+
*/
|
|
91
|
+
static toLongId(id, workspaceId, isCloud = true) {
|
|
92
|
+
const idStr = String(id).trim();
|
|
93
|
+
const workspaceIdStr = String(workspaceId);
|
|
94
|
+
// Check if it's a pure numeric short ID (≤9 digits)
|
|
95
|
+
if (/^\d+$/.test(idStr) && idStr.length <= 9) {
|
|
96
|
+
const prefix = isCloud ? '11' : '10';
|
|
97
|
+
const paddedId = idStr.padStart(9, '0');
|
|
98
|
+
return `${prefix}${workspaceIdStr}${paddedId}`;
|
|
99
|
+
}
|
|
100
|
+
return idStr;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Make HTTP request to TAPD API with retry support
|
|
104
|
+
*
|
|
105
|
+
* Retry policy:
|
|
106
|
+
* - Retry on 429/500/502/503 status codes
|
|
107
|
+
* - Max 3 retries with exponential backoff (1s, 2s, 4s)
|
|
108
|
+
* - POST requests do NOT retry (avoid duplicate creation)
|
|
109
|
+
*/
|
|
62
110
|
async request(method, path, params) {
|
|
63
111
|
const url = new URL(path, this.baseUrl);
|
|
64
112
|
const headers = {
|
|
@@ -77,25 +125,54 @@ export class TapdClient {
|
|
|
77
125
|
.filter(([, value]) => value !== undefined)
|
|
78
126
|
.map(([key, value]) => [key, String(value).replace(/\\n/g, '\n')])).toString();
|
|
79
127
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
128
|
+
// Retry configuration
|
|
129
|
+
const maxRetries = 3;
|
|
130
|
+
const retryableStatusCodes = [429, 500, 502, 503];
|
|
131
|
+
const shouldRetry = method === 'GET'; // Only retry GET requests
|
|
132
|
+
let lastError;
|
|
133
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
134
|
+
try {
|
|
135
|
+
const response = await fetch(url.toString(), {
|
|
136
|
+
method,
|
|
137
|
+
headers,
|
|
138
|
+
body,
|
|
139
|
+
});
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
const errorText = await response.text();
|
|
142
|
+
const error = new Error(`TAPD API error: ${response.status} ${response.statusText} - ${errorText.slice(0, 200)}`);
|
|
143
|
+
// Check if we should retry
|
|
144
|
+
if (shouldRetry && retryableStatusCodes.includes(response.status) && attempt < maxRetries) {
|
|
145
|
+
lastError = error;
|
|
146
|
+
const delayMs = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
|
|
147
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
const contentType = response.headers.get('content-type');
|
|
153
|
+
if (!contentType?.includes('application/json')) {
|
|
154
|
+
const text = await response.text();
|
|
155
|
+
throw new Error(`TAPD API returned non-JSON response: ${text.slice(0, 100)}`);
|
|
156
|
+
}
|
|
157
|
+
const result = await response.json();
|
|
158
|
+
if (result.status !== 1) {
|
|
159
|
+
throw new Error(`TAPD API error: ${result.info ?? 'Unknown error'}`);
|
|
160
|
+
}
|
|
161
|
+
return result.data;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// For non-retryable errors or final attempt, throw immediately
|
|
165
|
+
if (!shouldRetry || attempt >= maxRetries) {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
// For network errors, retry
|
|
169
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
170
|
+
const delayMs = Math.pow(2, attempt) * 1000;
|
|
171
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
172
|
+
}
|
|
97
173
|
}
|
|
98
|
-
|
|
174
|
+
// All retries exhausted
|
|
175
|
+
throw lastError ?? new Error('Request failed after all retries');
|
|
99
176
|
}
|
|
100
177
|
/**
|
|
101
178
|
* GET request to TAPD API
|
package/dist/tapd-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,eAAe,EAAE,OAAO,EA+FpC,CAAC"}
|
package/dist/tools/attachment.js
CHANGED
|
@@ -1,45 +1,62 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { TapdClient } from '../tapd-client.js';
|
|
2
3
|
export const attachmentTools = [
|
|
3
4
|
// Standard TAPD API attachment tools
|
|
4
5
|
{
|
|
5
6
|
name: 'tapd_get_attachments',
|
|
6
7
|
description: 'Get attachment list from TAPD',
|
|
7
8
|
inputSchema: z.object({
|
|
8
|
-
workspace_id: z.number().describe('
|
|
9
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
9
10
|
id: z.string().optional().describe('Attachment ID, supports multiple IDs'),
|
|
10
11
|
entity_id: z.string().optional().describe('Related entity ID (story/task/bug/wiki ID)'),
|
|
11
12
|
entity_type: z.string().optional().describe('Entity type (story, task, bug, wiki)'),
|
|
13
|
+
filename: z.string().optional().describe('Filename'),
|
|
14
|
+
owner: z.string().optional().describe('Uploader'),
|
|
15
|
+
created: z.string().optional().describe('Creation time, supports time query'),
|
|
16
|
+
modified: z.string().optional().describe('Last modification time, supports time query'),
|
|
12
17
|
fields: z.string().optional().describe('Comma-separated list of fields to return'),
|
|
13
18
|
limit: z.number().optional().describe('Number of results to return, max 200'),
|
|
14
19
|
page: z.number().optional().describe('Page number, default 1'),
|
|
15
20
|
order: z.string().optional().describe('Sort order, e.g., "created desc"'),
|
|
16
21
|
}),
|
|
17
22
|
handler: async (client, params) => {
|
|
18
|
-
|
|
23
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
24
|
+
if (!workspaceId) {
|
|
25
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
26
|
+
}
|
|
27
|
+
return client.get('/attachments', { ...params, workspace_id: workspaceId });
|
|
19
28
|
},
|
|
20
29
|
},
|
|
21
30
|
{
|
|
22
31
|
name: 'tapd_get_attachment',
|
|
23
32
|
description: 'Get a single attachment from TAPD',
|
|
24
33
|
inputSchema: z.object({
|
|
25
|
-
workspace_id: z.number().describe('
|
|
34
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
26
35
|
id: z.string().describe('Attachment ID (required)'),
|
|
27
36
|
fields: z.string().optional().describe('Comma-separated list of fields to return'),
|
|
28
37
|
}),
|
|
29
38
|
handler: async (client, params) => {
|
|
30
|
-
|
|
39
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
40
|
+
if (!workspaceId) {
|
|
41
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
42
|
+
}
|
|
43
|
+
return client.get('/attachments/get_one', { ...params, workspace_id: workspaceId });
|
|
31
44
|
},
|
|
32
45
|
},
|
|
33
46
|
{
|
|
34
47
|
name: 'tapd_get_attachment_download_url',
|
|
35
48
|
description: 'Get download URL for a single attachment (valid for 300s)',
|
|
36
49
|
inputSchema: z.object({
|
|
37
|
-
workspace_id: z.number().describe('
|
|
50
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
38
51
|
id: z.string().describe('Attachment ID (required)'),
|
|
39
52
|
filename: z.string().optional().describe('Filename for download'),
|
|
40
53
|
}),
|
|
41
54
|
handler: async (client, params) => {
|
|
42
|
-
|
|
55
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
56
|
+
if (!workspaceId) {
|
|
57
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
58
|
+
}
|
|
59
|
+
return client.get('/attachments/documents_down', { ...params, workspace_id: workspaceId });
|
|
43
60
|
},
|
|
44
61
|
},
|
|
45
62
|
// Mini (轻协作) API attachment tools
|
|
@@ -47,7 +64,7 @@ export const attachmentTools = [
|
|
|
47
64
|
name: 'tapd_mini_get_attachments',
|
|
48
65
|
description: 'Get attachments from mini workspace',
|
|
49
66
|
inputSchema: z.object({
|
|
50
|
-
workspace_id: z.number().describe('
|
|
67
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
51
68
|
id: z.string().optional().describe('Attachment ID'),
|
|
52
69
|
entry_id: z.string().optional().describe('Item ID'),
|
|
53
70
|
filename: z.string().optional().describe('Filename'),
|
|
@@ -56,18 +73,26 @@ export const attachmentTools = [
|
|
|
56
73
|
page: z.number().optional().describe('Page number, default 1'),
|
|
57
74
|
}),
|
|
58
75
|
handler: async (client, params) => {
|
|
59
|
-
|
|
76
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
77
|
+
if (!workspaceId) {
|
|
78
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
79
|
+
}
|
|
80
|
+
return client.get('/attachments', { ...params, workspace_id: workspaceId });
|
|
60
81
|
},
|
|
61
82
|
},
|
|
62
83
|
{
|
|
63
84
|
name: 'tapd_mini_get_attachment_download_url',
|
|
64
85
|
description: 'Get download URL for a single mini workspace attachment (valid for 300s)',
|
|
65
86
|
inputSchema: z.object({
|
|
66
|
-
workspace_id: z.number().describe('
|
|
87
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
67
88
|
id: z.string().describe('Attachment ID (required)'),
|
|
68
89
|
}),
|
|
69
90
|
handler: async (client, params) => {
|
|
70
|
-
|
|
91
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
92
|
+
if (!workspaceId) {
|
|
93
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
94
|
+
}
|
|
95
|
+
return client.get('/attachments/down', { ...params, workspace_id: workspaceId });
|
|
71
96
|
},
|
|
72
97
|
},
|
|
73
98
|
];
|