From 355f692fddf71004980fc332a7b515cf0e06ed72 Mon Sep 17 00:00:00 2001 From: Baocang Nie <16043697+baocang@users.noreply.github.com> Date: Fri, 4 Sep 2026 18:48:07 +0800 Subject: [PATCH] * chore(deps): bump zentao-api to 0.6.6 --- CHANGES.md | 1 + bun.lock | 4 ++-- package.json | 2 +- skills/zentao-cli/SKILL.md | 4 ++-- skills/zentao-tour/roles/executive.md | 8 ++++---- src/modules/executor.ts | 17 ++++++++++------- tests/modules.test.ts | 2 +- tests/skill-contract.test.ts | 8 ++++---- 8 files changed, 25 insertions(+), 21 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 577ca24..ea95e0c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,7 @@ ### 🚀 优化与重构 (Refactor) +- **SDK 升级**: 升级 `zentao-api` 至 0.6.6,获得更多模块定义、multipart 附件上传、文档内容转换以及请求超时和中止处理修复。 - **统一数据处理语义**: 列表过滤与搜索统一为组内 AND、组间 OR;规范写法采用 `field=value` 与 `field:desc`,并兼容旧有冒号相等和下划线排序语法。 - **复用 SDK 处理链**: 模块执行器直接使用 `zentao-api request()` 的转换、过滤、搜索、排序、限制与摘取能力,移除 CLI 内重复的数据工具实现。 - **原始输出**: `--format=raw` 直接返回服务端响应原文,不再执行归一化或本地数据处理。 diff --git a/bun.lock b/bun.lock index 2f1b949..63c2f6b 100644 --- a/bun.lock +++ b/bun.lock @@ -9,7 +9,7 @@ "commander": "^13.0.0", "configstore": "^7.0.0", "turndown": "^7.2.0", - "zentao-api": "^0.5.4", + "zentao-api": "^0.6.6", "zod": "^4.3.6", }, "devDependencies": { @@ -234,7 +234,7 @@ "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="], - "zentao-api": ["zentao-api@0.5.4", "", {}, "sha512-k1z8x/BgVmBjN4K22GPahchhFNZGHkz4Xl3zrRNtgEPATMvs/izPso9zC8brqp/c0n+9wvf0SVR2jE3V4nze6Q=="], + "zentao-api": ["zentao-api@0.6.6", "", {}, "sha512-ifhFkS9s7hYNv+lDyZR7MrdS1xKOvxiqwf7n9fqi9pUSovJvGgsxpN1WdReOQ4y4vDHHyYuIFymdrwTnUb3GwA=="], "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], diff --git a/package.json b/package.json index 0a976f5..282a049 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "commander": "^13.0.0", "configstore": "^7.0.0", "turndown": "^7.2.0", - "zentao-api": "^0.5.4", + "zentao-api": "^0.6.6", "zod": "^4.3.6" }, "devDependencies": { diff --git a/skills/zentao-cli/SKILL.md b/skills/zentao-cli/SKILL.md index f2a82e2..7ccf85d 100644 --- a/skills/zentao-cli/SKILL.md +++ b/skills/zentao-cli/SKILL.md @@ -101,7 +101,7 @@ zentao login -s https://zentao.example.com -u admin -p 123456 zentao story --product=1 # 产品 #1 的需求 zentao bug --product=1 # 产品 #1 的 Bug zentao task --executionID=1 # 执行 #1 的任务 -zentao execution --status=all --filter='project=5' # 项目 #5 的执行(当前页客户端过滤) +zentao execution --browseType=all --filter='project=5' # 项目 #5 的执行(当前页客户端过滤) zentao build --project=5 # 项目 #5 的版本 zentao testtask --product=1 # 产品 #1 的测试单 zentao release --productID=1 # 产品 #1 的发布 @@ -199,7 +199,7 @@ CLI 不会自动翻页。仅当该列表操作的 `--help` 显示 `--page` / `-- ```bash zentao project --browseType=doing --pick=id,name,status -zentao execution --status=all --filter='project=5' --pick=id,name,status +zentao execution --browseType=all --filter='project=5' --pick=id,name,status ``` ### 创建需求并关联计划 diff --git a/skills/zentao-tour/roles/executive.md b/skills/zentao-tour/roles/executive.md index cdeb5cd..073046a 100644 --- a/skills/zentao-tour/roles/executive.md +++ b/skills/zentao-tour/roles/executive.md @@ -28,8 +28,8 @@ zentao project --browseType=doing --pick=id,name,begin,end,progress 让他扫一眼,问:"有没有哪条看着不对劲?进度慢的、日期要到的?"——挑出一个深入看: ```bash -zentao execution --status=all --filter='project=' --pick=id,name,status --page=<页码> --recPerPage=100 -zentao task --executionID=<执行ID> --status=all --pick=id,status --page=<页码> --recPerPage=100 --format=json +zentao execution --browseType=all --filter='project=' --pick=id,name,status --page=<页码> --recPerPage=100 +zentao task --executionID=<执行ID> --browseType=all --pick=id,status --page=<页码> --recPerPage=100 --format=json ``` 执行列表没有项目作用域,所以用 `--filter` 在当前页本地筛选;必须扫完全局执行列表的每一页,才能收集某项目的全部执行 ID。再对每个执行按任务 pager 逐页读取,本地聚合"wait/doing/done 各多少",用一句话汇报给用户。 @@ -85,8 +85,8 @@ zentao ticket --productID= --browseType=all --pick=id,title,status,pri | 关注点 | 命令 | |--------|------| | 进行中的项目 | `zentao project --browseType=doing --pick=id,name,progress,begin,end` | -| 项目下的执行 | `zentao execution --status=all --filter='project=' --pick=id,name,status --page=<页码> --recPerPage=100`| -| 任务状态聚合 | `zentao task --executionID= --status=all --pick=status --page=<页码> --recPerPage=100 --format=json` | +| 项目下的执行 | `zentao execution --browseType=all --filter='project=' --pick=id,name,status --page=<页码> --recPerPage=100`| +| 任务状态聚合 | `zentao task --executionID= --browseType=all --pick=status --page=<页码> --recPerPage=100 --format=json` | | 产品下需求概览 | `zentao story --product= --browseType=allstory --pick=id,pri,stage,plan --page=<页码> --recPerPage=100 --format=json` | | 产品下 Bug 概览 | `zentao bug --product= --browseType=all --pick=id,severity,pri,status --page=<页码> --recPerPage=100 --format=json` | | 即将 / 最近发布 | `zentao release --productID= --pick=id,name,date,status` | diff --git a/src/modules/executor.ts b/src/modules/executor.ts index be4f24d..e29a13f 100644 --- a/src/modules/executor.ts +++ b/src/modules/executor.ts @@ -1,4 +1,5 @@ import { request } from 'zentao-api'; +import type { ResponseData } from 'zentao-api'; import type { ZentaoClient } from '../api/index.js'; import { mapSdkError } from '../errors.js'; import type { @@ -105,23 +106,25 @@ export async function executeModuleCommand( }; } - const pager: ListPagerInfo | undefined = response.pager + const normalized = response as ResponseData; + + const pager: ListPagerInfo | undefined = normalized.pager ? { - pageID: response.pager.page, - recPerPage: response.pager.recPerPage, - recTotal: response.pager.total, + pageID: normalized.pager.page, + recPerPage: normalized.pager.recPerPage, + recTotal: normalized.pager.total, } : undefined; if (action.type === 'list') { - const data = (Array.isArray(response.data) ? response.data : []) as Record[]; + const data = (Array.isArray(normalized.data) ? normalized.data : []) as Record[]; return { action, data, rawResponse: response, pager, fields, isList: true }; } if (action.type === 'get') { - const data = (response.data ?? {}) as Record; + const data = (normalized.data ?? {}) as Record; return { action, data, rawResponse: response, fields, isList: false }; } - return { action, data: response.data, rawResponse: response, fields, isList: false }; + return { action, data: normalized.data, rawResponse: response, fields, isList: false }; } diff --git a/tests/modules.test.ts b/tests/modules.test.ts index 5d5262d..9f063db 100644 --- a/tests/modules.test.ts +++ b/tests/modules.test.ts @@ -11,7 +11,7 @@ describe('module registry (zentao-api)', () => { expect(names).toContain('task'); expect(names).toContain('story'); expect(names).toContain('user'); - expect(names.length).toBe(19); + expect(names.length).toBeGreaterThanOrEqual(19); }); test('getAllModules returns every registered module', () => { diff --git a/tests/skill-contract.test.ts b/tests/skill-contract.test.ts index f970bd3..dde620c 100644 --- a/tests/skill-contract.test.ts +++ b/tests/skill-contract.test.ts @@ -257,10 +257,10 @@ describe('bundled Skill command contracts', () => { expect(result.stdout).not.toContain('--all'); expect(result.stdout).toContain('zentao bug <操作> --help'); - const unpaged = await runCliWithoutAuth(['release', '--help']); - expect(unpaged.exitCode).toBe(0); - expect(unpaged.stdout).not.toContain('--page '); - expect(unpaged.stdout).not.toContain('--recPerPage '); + const release = await runCliWithoutAuth(['release', '--help']); + expect(release.exitCode).toBe(0); + expect(release.stdout).toContain('--page '); + expect(release.stdout).toContain('--recPerPage '); const fixedScope = await runCliWithoutAuth(['task', 'list', '--help']); expect(fixedScope.exitCode).toBe(0);