@cloudglab/zentao-cli 0.1.3

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 (187) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/MCP_ZENTAO_REBUILD_PLAN.md +505 -0
  3. package/README.md +319 -0
  4. package/dist/api/bug.d.ts +32 -0
  5. package/dist/api/bug.js +85 -0
  6. package/dist/api/bug.js.map +1 -0
  7. package/dist/api/build.d.ts +31 -0
  8. package/dist/api/build.js +21 -0
  9. package/dist/api/build.js.map +1 -0
  10. package/dist/api/comment.d.ts +20 -0
  11. package/dist/api/comment.js +47 -0
  12. package/dist/api/comment.js.map +1 -0
  13. package/dist/api/development-context.d.ts +14 -0
  14. package/dist/api/development-context.js +35 -0
  15. package/dist/api/development-context.js.map +1 -0
  16. package/dist/api/execution.d.ts +46 -0
  17. package/dist/api/execution.js +47 -0
  18. package/dist/api/execution.js.map +1 -0
  19. package/dist/api/index.d.ts +43 -0
  20. package/dist/api/index.js +46 -0
  21. package/dist/api/index.js.map +1 -0
  22. package/dist/api/plan.d.ts +18 -0
  23. package/dist/api/plan.js +33 -0
  24. package/dist/api/plan.js.map +1 -0
  25. package/dist/api/product.d.ts +7 -0
  26. package/dist/api/product.js +14 -0
  27. package/dist/api/product.js.map +1 -0
  28. package/dist/api/program.d.ts +7 -0
  29. package/dist/api/program.js +14 -0
  30. package/dist/api/program.js.map +1 -0
  31. package/dist/api/project.d.ts +8 -0
  32. package/dist/api/project.js +15 -0
  33. package/dist/api/project.js.map +1 -0
  34. package/dist/api/relation.d.ts +17 -0
  35. package/dist/api/relation.js +66 -0
  36. package/dist/api/relation.js.map +1 -0
  37. package/dist/api/release.d.ts +6 -0
  38. package/dist/api/release.js +11 -0
  39. package/dist/api/release.js.map +1 -0
  40. package/dist/api/search.d.ts +17 -0
  41. package/dist/api/search.js +168 -0
  42. package/dist/api/search.js.map +1 -0
  43. package/dist/api/statistics.d.ts +13 -0
  44. package/dist/api/statistics.js +67 -0
  45. package/dist/api/statistics.js.map +1 -0
  46. package/dist/api/story.d.ts +14 -0
  47. package/dist/api/story.js +23 -0
  48. package/dist/api/story.js.map +1 -0
  49. package/dist/api/task.d.ts +17 -0
  50. package/dist/api/task.js +37 -0
  51. package/dist/api/task.js.map +1 -0
  52. package/dist/api/testcase.d.ts +51 -0
  53. package/dist/api/testcase.js +31 -0
  54. package/dist/api/testcase.js.map +1 -0
  55. package/dist/api/testtask.d.ts +41 -0
  56. package/dist/api/testtask.js +34 -0
  57. package/dist/api/testtask.js.map +1 -0
  58. package/dist/api/user.d.ts +6 -0
  59. package/dist/api/user.js +9 -0
  60. package/dist/api/user.js.map +1 -0
  61. package/dist/bin/zentao-dev.d.ts +2 -0
  62. package/dist/bin/zentao-dev.js +8 -0
  63. package/dist/bin/zentao-dev.js.map +1 -0
  64. package/dist/bin/zentao-pm.d.ts +2 -0
  65. package/dist/bin/zentao-pm.js +8 -0
  66. package/dist/bin/zentao-pm.js.map +1 -0
  67. package/dist/bin/zentao-qa.d.ts +2 -0
  68. package/dist/bin/zentao-qa.js +8 -0
  69. package/dist/bin/zentao-qa.js.map +1 -0
  70. package/dist/bin/zentao.d.ts +2 -0
  71. package/dist/bin/zentao.js +8 -0
  72. package/dist/bin/zentao.js.map +1 -0
  73. package/dist/cli.d.ts +1 -0
  74. package/dist/cli.js +74 -0
  75. package/dist/cli.js.map +1 -0
  76. package/dist/core/api-provider.d.ts +3 -0
  77. package/dist/core/api-provider.js +17 -0
  78. package/dist/core/api-provider.js.map +1 -0
  79. package/dist/core/auth.d.ts +13 -0
  80. package/dist/core/auth.js +90 -0
  81. package/dist/core/auth.js.map +1 -0
  82. package/dist/core/cli-registry.d.ts +18 -0
  83. package/dist/core/cli-registry.js +128 -0
  84. package/dist/core/cli-registry.js.map +1 -0
  85. package/dist/core/config.d.ts +7 -0
  86. package/dist/core/config.js +58 -0
  87. package/dist/core/config.js.map +1 -0
  88. package/dist/core/http.d.ts +12 -0
  89. package/dist/core/http.js +50 -0
  90. package/dist/core/http.js.map +1 -0
  91. package/dist/core/list-result.d.ts +14 -0
  92. package/dist/core/list-result.js +59 -0
  93. package/dist/core/list-result.js.map +1 -0
  94. package/dist/core/pagination.d.ts +9 -0
  95. package/dist/core/pagination.js +12 -0
  96. package/dist/core/pagination.js.map +1 -0
  97. package/dist/core/roles.d.ts +4 -0
  98. package/dist/core/roles.js +13 -0
  99. package/dist/core/roles.js.map +1 -0
  100. package/dist/core/tool-registry.d.ts +3 -0
  101. package/dist/core/tool-registry.js +77 -0
  102. package/dist/core/tool-registry.js.map +1 -0
  103. package/dist/core/write-guard.d.ts +25 -0
  104. package/dist/core/write-guard.js +53 -0
  105. package/dist/core/write-guard.js.map +1 -0
  106. package/dist/index.d.ts +3 -0
  107. package/dist/index.js +3 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/tools/bug.d.ts +2 -0
  110. package/dist/tools/bug.js +41 -0
  111. package/dist/tools/bug.js.map +1 -0
  112. package/dist/tools/build.d.ts +2 -0
  113. package/dist/tools/build.js +8 -0
  114. package/dist/tools/build.js.map +1 -0
  115. package/dist/tools/comment.d.ts +2 -0
  116. package/dist/tools/comment.js +23 -0
  117. package/dist/tools/comment.js.map +1 -0
  118. package/dist/tools/context.d.ts +2 -0
  119. package/dist/tools/context.js +11 -0
  120. package/dist/tools/context.js.map +1 -0
  121. package/dist/tools/execution.d.ts +2 -0
  122. package/dist/tools/execution.js +21 -0
  123. package/dist/tools/execution.js.map +1 -0
  124. package/dist/tools/init.d.ts +2 -0
  125. package/dist/tools/init.js +28 -0
  126. package/dist/tools/init.js.map +1 -0
  127. package/dist/tools/phase3a.d.ts +4 -0
  128. package/dist/tools/phase3a.js +123 -0
  129. package/dist/tools/phase3a.js.map +1 -0
  130. package/dist/tools/phase3b.d.ts +5 -0
  131. package/dist/tools/phase3b.js +161 -0
  132. package/dist/tools/phase3b.js.map +1 -0
  133. package/dist/tools/plan.d.ts +2 -0
  134. package/dist/tools/plan.js +14 -0
  135. package/dist/tools/plan.js.map +1 -0
  136. package/dist/tools/product.d.ts +2 -0
  137. package/dist/tools/product.js +10 -0
  138. package/dist/tools/product.js.map +1 -0
  139. package/dist/tools/profile.d.ts +2 -0
  140. package/dist/tools/profile.js +6 -0
  141. package/dist/tools/profile.js.map +1 -0
  142. package/dist/tools/program.d.ts +2 -0
  143. package/dist/tools/program.js +8 -0
  144. package/dist/tools/program.js.map +1 -0
  145. package/dist/tools/project.d.ts +2 -0
  146. package/dist/tools/project.js +13 -0
  147. package/dist/tools/project.js.map +1 -0
  148. package/dist/tools/relation.d.ts +2 -0
  149. package/dist/tools/relation.js +13 -0
  150. package/dist/tools/relation.js.map +1 -0
  151. package/dist/tools/release.d.ts +2 -0
  152. package/dist/tools/release.js +7 -0
  153. package/dist/tools/release.js.map +1 -0
  154. package/dist/tools/search.d.ts +2 -0
  155. package/dist/tools/search.js +18 -0
  156. package/dist/tools/search.js.map +1 -0
  157. package/dist/tools/shared.d.ts +2 -0
  158. package/dist/tools/shared.js +11 -0
  159. package/dist/tools/shared.js.map +1 -0
  160. package/dist/tools/statistics.d.ts +2 -0
  161. package/dist/tools/statistics.js +10 -0
  162. package/dist/tools/statistics.js.map +1 -0
  163. package/dist/tools/story.d.ts +2 -0
  164. package/dist/tools/story.js +14 -0
  165. package/dist/tools/story.js.map +1 -0
  166. package/dist/tools/task.d.ts +2 -0
  167. package/dist/tools/task.js +48 -0
  168. package/dist/tools/task.js.map +1 -0
  169. package/dist/tools/testcase.d.ts +2 -0
  170. package/dist/tools/testcase.js +16 -0
  171. package/dist/tools/testcase.js.map +1 -0
  172. package/dist/tools/testtask.d.ts +2 -0
  173. package/dist/tools/testtask.js +14 -0
  174. package/dist/tools/testtask.js.map +1 -0
  175. package/dist/types/common.d.ts +15 -0
  176. package/dist/types/common.js +2 -0
  177. package/dist/types/common.js.map +1 -0
  178. package/dist/types/zentao.d.ts +42 -0
  179. package/dist/types/zentao.js +2 -0
  180. package/dist/types/zentao.js.map +1 -0
  181. package/dist/utils/json.d.ts +2 -0
  182. package/dist/utils/json.js +27 -0
  183. package/dist/utils/json.js.map +1 -0
  184. package/dist/version.d.ts +1 -0
  185. package/dist/version.js +2 -0
  186. package/dist/version.js.map +1 -0
  187. package/package.json +48 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,50 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## 0.1.3 - 2026-06-05
6
+
7
+ ### Fixed
8
+
9
+ - 修复构建前未清理 `dist` 导致 npm 包可能混入旧 MCP 产物的问题;构建现会先清空 `dist` 再重新编译。
10
+
11
+ ## 0.1.2 - 2026-06-05
12
+
13
+ ### Changed
14
+
15
+ - 为 npm trusted publishing 补齐 `package.json.repository.url`,明确绑定到 `https://github.com/cloudglab/zentao-cli.git`。
16
+ - 版本提升到 `0.1.2`,用于重新触发自动发布链路。
17
+
18
+ ## 0.1.1 - 2026-06-05
19
+
20
+ ### Changed
21
+
22
+ - 发布工作流切换为 npm trusted publishing,去掉 `NPM_TOKEN` 发布依赖。
23
+ - GitHub Actions 发布环境升级为 Node.js 24,以满足 npm OIDC trusted publishing 运行要求。
24
+
25
+ ## 0.1.0 - 2026-06-05
26
+
27
+ ### Added
28
+
29
+ - 新增更稳的认证错误分类:区分账号密码错误、接口不存在、服务端异常、网络错误、响应异常。
30
+ - 新增 `ZENTAO_API_BASE_URL` 配置,支持非标准禅道 API 部署路径。
31
+ - 新增 `initZentao --save` 显式落盘控制,默认仅校验当前会话配置。
32
+ - 新增线上 Bug 查询强制判断与固定口径文档:`市场和售后问题跟踪` + 模块匹配。
33
+ - 新增 `getMyBugs` / `getMyBugStatistics` 默认跨产品查询能力,`productId` 改为可选收窄条件。
34
+ - 新增 GitHub Actions 发布链路:push `v*` tag 后自动校验、构建、发布 npm、创建 GitHub Release。
35
+ - 新增纯 CLI 运行层:`zentao help`、`zentao list`、`zentao --version`。
36
+
37
+ ### Changed
38
+
39
+ - 包名统一为 `@cloudglab/zentao-cli`,本地命令统一为 `zentao`。
40
+ - skill 安装方式统一为 `npx skills add @cloudglab/zentao-cli -g`。
41
+ - 运行架构从 MCP server 切换为本地 CLI 命令执行链路。
42
+ - 发布产物运行时目标下调为 `Node.js >= 16`。
43
+ - TypeScript 构建目标下调为 `ES2020`,并移除运行时 `@modelcontextprotocol/sdk` 依赖。
44
+ - README、skill、reference 文档整体同步到“本地 `zentao` + skill 调用”口径。
45
+
46
+ ### Fixed
47
+
48
+ - 修复 token 获取失败时对所有错误都盲目回退 MD5 的问题,仅在明确鉴权失败时回退。
49
+ - 修复固定 API 路径导致部分实例无法登录的问题。
50
+ - 修复默认将敏感配置落盘的问题,改为显式保存才写入本地。
@@ -0,0 +1,505 @@
1
+ # mcp-zentao 重建计划
2
+
3
+ ## 目标
4
+
5
+ 在 `/Users/lixiaoming/Desktop/doing/zentao-cli` 中重建一个新的禅道 MCP 项目。
6
+
7
+ 目标不是 1:1 反编译原作者源码,而是基于现有可运行产物和已验证行为,写一个结构清晰、可维护、适配当前禅道 18.5 的 TypeScript 项目。
8
+
9
+ ## 当前依据
10
+
11
+ 参考来源:
12
+
13
+ - 全局包:`@zzp123/mcp-zentao@1.18.15`
14
+ - 路径:`~/.nvm/versions/node/v20.19.2/lib/node_modules/@zzp123/mcp-zentao`
15
+ - 主要参考:`dist/api/zentaoApi.js`、`dist/index.js`、`dist/index-dev.js`、`README.md`
16
+ - 本地 Legacy 项目:`/Users/lixiaoming/Desktop/open/mcp-zentao-11-3`
17
+ - 主要参考:导出、批量处理、AI 摘要、图片下载等能力
18
+ - 当前环境验证结果:
19
+ - 禅道版本:`18.5`
20
+ - 地址根域名:`https://zentao.cloudglab.cn`
21
+ - 实际 API 路径:`/zentao/api.php/v1`
22
+ - `zentao-cli` 依赖 v2,不适配当前环境
23
+ - `@zzp123/mcp-zentao` 补丁后可用
24
+
25
+ ## 已验证的关键行为
26
+
27
+ ### 认证
28
+
29
+ 当前禅道 `18.5` 的 token 接口:
30
+
31
+ ```txt
32
+ POST /zentao/api.php/v1/tokens
33
+ ```
34
+
35
+ 要求:
36
+
37
+ - 密码优先使用明文
38
+ - 部分环境可能需要 MD5,因此保留 MD5 回退
39
+
40
+ 认证逻辑:
41
+
42
+ 1. 先用明文密码请求 token
43
+ 2. 明文失败后再用 MD5 密码请求 token
44
+ 3. 成功后请求头携带:`Token: <token>`
45
+
46
+ ### 脏 JSON 响应清洗
47
+
48
+ 当前服务端会在 JSON 前输出 PHP warning,例如:
49
+
50
+ ```html
51
+ <br />
52
+ <b>Deprecated</b>: ...
53
+ {"token":"..."}
54
+ ```
55
+
56
+ 因此 HTTP 层必须实现:
57
+
58
+ 1. 如果响应已经是 object,直接返回
59
+ 2. 如果响应是 string,查找第一个 `{` 或 `[`
60
+ 3. 截取 JSON 部分后再 `JSON.parse`
61
+
62
+ ### 已验证 API
63
+
64
+ 这些接口已经在当前环境验证可用:
65
+
66
+ ```txt
67
+ GET /tasks
68
+ GET /bugs/:id
69
+ GET /stories/:id
70
+ GET /executions/:id
71
+ GET /executions/:id/bugs
72
+ ```
73
+
74
+ 其中:
75
+
76
+ - `getMyTasks()` 成功
77
+ - `getBugDetail(84362)` 成功
78
+ - `getStoryDetail(9680)` 成功
79
+ - `getExecutionDetail(2140)` 成功
80
+ - `request('GET', '/executions/2140/bugs')` 成功
81
+
82
+ ## 技术栈
83
+
84
+ 建议:
85
+
86
+ - TypeScript
87
+ - Node.js >= 20
88
+ - `@modelcontextprotocol/sdk`
89
+ - `zod`
90
+ - `axios` 或 `ofetch`
91
+ - `tsx` 用于本地开发
92
+ - `tsc` 用于类型检查和构建
93
+ - `oxlint` 用于 lint
94
+ - `oxfmt` 可用于格式化,先试点
95
+
96
+ 不建议一开始使用 OXC 作为主构建系统。当前项目更适合:
97
+
98
+ ```txt
99
+ TypeScript + tsc + oxlint + oxfmt
100
+ ```
101
+
102
+ ## 推荐目录结构
103
+
104
+ ```txt
105
+ src/
106
+ bin/
107
+ zentao.ts
108
+ zentao-dev.ts
109
+ zentao-pm.ts
110
+ zentao-qa.ts
111
+
112
+ core/
113
+ auth.ts
114
+ config.ts
115
+ errors.ts
116
+ http.ts
117
+ roles.ts
118
+ tool-registry.ts
119
+ transport.ts
120
+
121
+ api/
122
+ bug.ts
123
+ build.ts
124
+ comment.ts
125
+ execution.ts
126
+ feedback.ts
127
+ file.ts
128
+ product.ts
129
+ project.ts
130
+ story.ts
131
+ task.ts
132
+ testcase.ts
133
+ ticket.ts
134
+ user.ts
135
+
136
+ tools/
137
+ bug.ts
138
+ comment.ts
139
+ execution.ts
140
+ init.ts
141
+ product.ts
142
+ story.ts
143
+ task.ts
144
+ shared.ts
145
+
146
+ schemas/
147
+ bug.ts
148
+ execution.ts
149
+ story.ts
150
+ task.ts
151
+
152
+ types/
153
+ common.ts
154
+ zentao.ts
155
+
156
+ utils/
157
+ date.ts
158
+ html.ts
159
+ json.ts
160
+ markdown.ts
161
+ ```
162
+
163
+ ## 核心模块设计
164
+
165
+ ### `core/http.ts`
166
+
167
+ 职责:
168
+
169
+ - 创建 HTTP client
170
+ - 统一拼接 API base URL
171
+ - 注入 `Token` header
172
+ - 清洗 PHP warning 脏响应
173
+ - 统一错误格式
174
+
175
+ 必须内置:
176
+
177
+ ```ts
178
+ sanitizeJsonLikeResponse(data)
179
+ ```
180
+
181
+ ### `core/auth.ts`
182
+
183
+ 职责:
184
+
185
+ - 获取 token
186
+ - 明文优先
187
+ - MD5 回退
188
+ - 缓存 token
189
+ - 后续可扩展 401 自动重登
190
+
191
+ ### `core/config.ts`
192
+
193
+ 职责:
194
+
195
+ - 读取环境变量
196
+ - 读取本地配置
197
+ - 保存配置
198
+
199
+ 建议支持:
200
+
201
+ ```txt
202
+ ZENTAO_URL
203
+ ZENTAO_USERNAME
204
+ ZENTAO_PASSWORD
205
+ ZENTAO_API_VERSION
206
+ ```
207
+
208
+ 本地配置路径建议:
209
+
210
+ ```txt
211
+ ~/.zentao/config.json
212
+ ```
213
+
214
+ ### `core/transport.ts`
215
+
216
+ 职责:
217
+
218
+ - 启动 stdio MCP server
219
+ - 后续支持 HTTP transport
220
+
221
+ ### `core/tool-registry.ts`
222
+
223
+ 职责:
224
+
225
+ - 统一注册所有工具
226
+ - 根据角色过滤工具
227
+
228
+ 不要复制四份入口文件。
229
+
230
+ 推荐方式:
231
+
232
+ ```ts
233
+ registerTools(server, { role: 'dev' })
234
+ ```
235
+
236
+ ## 角色设计
237
+
238
+ ### full
239
+
240
+ 完整能力,适合维护和排查。
241
+
242
+ ### dev
243
+
244
+ 开发常用:
245
+
246
+ - task 查询、更新、完成
247
+ - bug 查询、解决、评论
248
+ - story 查询
249
+ - execution 查询
250
+ - build 查询
251
+
252
+ ### qa
253
+
254
+ 测试常用:
255
+
256
+ - bug 查询、创建、解决
257
+ - testcase 查询
258
+ - testtask 查询
259
+ - story 查询
260
+
261
+ ### pm
262
+
263
+ 产品常用:
264
+
265
+ - product
266
+ - story
267
+ - requirement
268
+ - plan
269
+ - feedback
270
+ - project
271
+
272
+ ## 分阶段计划
273
+
274
+ ### 阶段 0:项目初始化
275
+
276
+ 产出:
277
+
278
+ - `package.json`
279
+ - `tsconfig.json`
280
+ - `oxlint` 配置
281
+ - `src/` 基础目录
282
+ - `README.md`
283
+ - 基础 bin 入口
284
+
285
+ 验收:
286
+
287
+ ```bash
288
+ pnpm install
289
+ pnpm typecheck
290
+ pnpm lint
291
+ ```
292
+
293
+ ### 阶段 1:MVP 内核
294
+
295
+ 实现:
296
+
297
+ - `core/config.ts`
298
+ - `core/http.ts`
299
+ - `core/auth.ts`
300
+ - `core/transport.ts`
301
+ - `core/tool-registry.ts`
302
+ - `tools/init.ts`
303
+
304
+ 验收:
305
+
306
+ - 能启动 MCP server
307
+ - 能读取配置
308
+ - 能拿到 token
309
+ - 能清洗 PHP warning
310
+
311
+ ### 阶段 2:开发最小闭环
312
+
313
+ 实现 API:
314
+
315
+ - `api/task.ts`
316
+ - `api/bug.ts`
317
+ - `api/story.ts`
318
+ - `api/execution.ts`
319
+
320
+ 实现工具:
321
+
322
+ - `getMyTasks`
323
+ - `getTaskDetail`
324
+ - `getBugDetail`
325
+ - `getStoryDetail`
326
+ - `getExecutionDetail`
327
+ - `getExecutionBugs`
328
+
329
+ 验收:
330
+
331
+ - `getBugDetail(84362)` 成功
332
+ - `getExecutionBugs(2140)` 成功
333
+ - `getStoryDetail(9680)` 成功
334
+
335
+ ### 阶段 3:开发常用写操作
336
+
337
+ 实现:
338
+
339
+ - `updateTask`
340
+ - `finishTask`
341
+ - `resolveBug`
342
+ - `addComment`
343
+
344
+ 注意:
345
+
346
+ - 写操作必须由调用方确认后再执行
347
+ - 先做只读验证,再做写操作
348
+
349
+ ### 阶段 4:完整模块迁移
350
+
351
+ 按优先级迁移:
352
+
353
+ 1. task
354
+ 2. bug
355
+ 3. story
356
+ 4. execution
357
+ 5. product
358
+ 6. project
359
+ 7. build
360
+ 8. testcase
361
+ 9. file
362
+ 10. comment
363
+ 11. feedback
364
+ 12. ticket
365
+ 13. user
366
+
367
+ ### 阶段 5:吸收 Legacy 项目增强能力
368
+
369
+ 从 `/Users/lixiaoming/Desktop/open/mcp-zentao-11-3` 借鉴:
370
+
371
+ - `batchUpdateTasks`
372
+ - `batchResolveBugs`
373
+ - `getStoryRelatedBugs`
374
+ - `getBugRelatedStory`
375
+ - `exportStory`
376
+ - `exportBug`
377
+ - `exportItems`
378
+ - Markdown 格式化
379
+ - 图片下载
380
+ - story/bug/task 分析摘要
381
+ - 下一步建议
382
+
383
+ ### 阶段 6:角色入口和发布准备
384
+
385
+ 实现 bin:
386
+
387
+ - `zentao`
388
+ - `zentao-dev`
389
+ - `zentao-qa`
390
+ - `zentao-pm`
391
+
392
+ 验收:
393
+
394
+ - 每个 bin 可启动
395
+ - 工具数量符合角色配置
396
+ - 文档和实际工具一致
397
+
398
+ ## API 优先级清单
399
+
400
+ ### P0
401
+
402
+ 必须先实现:
403
+
404
+ - token 登录
405
+ - request
406
+ - response sanitize
407
+ - getMyTasks
408
+ - getBugDetail
409
+ - getStoryDetail
410
+ - getExecutionBugs
411
+ - getExecutionDetail
412
+
413
+ ### P1
414
+
415
+ 开发日常需要:
416
+
417
+ - updateTask
418
+ - finishTask
419
+ - resolveBug
420
+ - addComment
421
+ - getProductBugs
422
+ - getProductStories
423
+
424
+ ### P2
425
+
426
+ 完整能力:
427
+
428
+ - createTask
429
+ - createBug
430
+ - createStory
431
+ - product/project/execution CRUD
432
+ - testcase
433
+ - build
434
+ - file upload/download
435
+
436
+ ### P3
437
+
438
+ 增强体验:
439
+
440
+ - Markdown 导出
441
+ - 图片下载
442
+ - 批量处理
443
+ - AI 摘要
444
+ - 智能建议
445
+
446
+ ## 与现有包的差异目标
447
+
448
+ 新项目不要重复旧包的问题:
449
+
450
+ - 不要一个 1400 行 `ZentaoAPI` 大文件
451
+ - 不要四份入口复制大量代码
452
+ - 不要 README 工具数和真实工具数不一致
453
+ - 不要把补丁脚本作为长期方案
454
+ - 不要默认强制 MD5 密码
455
+ - 不要忽略 PHP warning 脏响应
456
+
457
+ 新项目需要内置:
458
+
459
+ - 明文密码优先
460
+ - MD5 回退
461
+ - PHP warning 清洗
462
+ - execution bug list 正式方法
463
+ - 可扩展的角色工具过滤
464
+ - 后续可加 401 自动重登
465
+
466
+ ## 验收基准
467
+
468
+ 最小验收:
469
+
470
+ ```txt
471
+ getToken 成功
472
+ getMyTasks 成功
473
+ getBugDetail(84362) 成功
474
+ getExecutionBugs(2140) 成功
475
+ getStoryDetail(9680) 成功
476
+ ```
477
+
478
+ 完整验收:
479
+
480
+ ```txt
481
+ dev 角色可完成日常开发相关任务
482
+ full 角色覆盖当前 @zzp123/mcp-zentao 的主要能力
483
+ 导出能力覆盖 mcp-zentao-11-3 的 Markdown + 图片下载场景
484
+ ```
485
+
486
+ ## 后续第一步
487
+
488
+ 建议下一步直接初始化项目:
489
+
490
+ ```bash
491
+ pnpm init
492
+ pnpm add @modelcontextprotocol/sdk zod axios
493
+ pnpm add -D typescript tsx oxlint
494
+ ```
495
+
496
+ 然后优先实现:
497
+
498
+ ```txt
499
+ src/core/http.ts
500
+ src/core/auth.ts
501
+ src/api/bug.ts
502
+ src/api/execution.ts
503
+ src/tools/bug.ts
504
+ src/tools/execution.ts
505
+ ```