From d738a4acfe1a37acbea752e46c0385c06b5f9145 Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Thu, 15 Oct 2026 19:29:08 -0700 Subject: [PATCH] =?UTF-8?q?feat(skill):=20zentao-bug=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20resolve=20=E5=91=BD=E4=BB=A4=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=9C=A8=E7=A6=85=E9=81=93=E8=A7=A3=E5=86=B3=20Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - resolve :等同网页「解决」表单,默认解决方案 fixed、解决版本 trunk(主干), 支持 --dry-run 预览;只处理激活状态,提交后回读校验 - 接口提交不会自动补默认值:解决日期与指派给先从解决表单 HTML 读取默认值 (服务器北京时间 / 创建人)再原样提交,避免用本机时区时间 - SKILL.md 补写回说明,并注明 login 需在独立终端执行(! 前缀无 TTY) Co-Authored-By: Claude Opus 5.5 --- .claude/skills/zentao-bug/SKILL.md | 20 ++++++- .claude/skills/zentao-bug/zentao.py | 89 +++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/.claude/skills/zentao-bug/SKILL.md b/.claude/skills/zentao-bug/SKILL.md index 5abba50..db0e74d 100644 --- a/.claude/skills/zentao-bug/SKILL.md +++ b/.claude/skills/zentao-bug/SKILL.md @@ -30,6 +30,7 @@ python3 $Z view 632 # Bug 详情(Markdown) python3 .claude/skills/zentao-bug/zentao.py login --account <账号> ``` +必须在**独立的终端窗口**里执行——Claude Code 的 `! <命令>` 没有 TTY,密码提示会直接 EOFError。 密码交互输入、不回显;默认存入 macOS 钥匙串,此后会话过期会自动重新登录(`--no-keychain` 则不保存)。 **不要向用户索要密码,也不要替用户在命令行里带密码登录。** @@ -46,12 +47,25 @@ python3 .claude/skills/zentao-bug/zentao.py login --account <账号> ## 写回禅道 -暂未实现(写操作会改动线上 Bug 状态,需用户确认后再加)。修复完成后由用户在禅道手动"解决", -可附上提交号与改动摘要供用户粘贴。 +```bash +python3 $Z resolve 621 622 --comment 已解决 --dry-run # 先预览 +python3 $Z resolve 621 622 --comment 已解决 # 提交 +``` + +等同网页「解决」表单,默认:解决方案 `fixed`(已解决)、解决版本 `trunk`(主干);**解决日期与指派给取网页表单渲染出的默认值** +(服务器当前时间 / 创建人,可用 `--date` / `--assign-to` 覆盖),其余字段不动;备注默认留空,团队习惯只写「已解决」,不写业务细节。 +只处理激活状态的单子,提交后回读校验状态。 + +- **写操作会改动线上状态,只在用户明确要求时执行**;只解决确实修好、且没有待确认疑问的单子。 + 无缺陷 / 需后端修复 / 有疑问的保持激活,并向用户列出原因(无缺陷应选「设计如此」等其他方案,不要标「已解决」) +- 接口提交**不会**自动补表单默认值,所以先 GET 解决表单 HTML 读出 `resolvedDate` 与 `assignedTo` 的选中项再原样提交; + 解决日期不能用本机时间:本机可能在美西时区,禅道服务器是北京时间(#621 曾因此写成本机时间) ## 实现说明 - 认证:`POST /api.php/v1/tokens` 换 Token;数据走页面 JSON 模式(`.html` → `.json`),Cookie `zentaosid=`。 -- 接口:`/my-work-bug--0-id_desc-0--.json`、`/bug-view-.json`、`/file-read-.`。 +- 接口:`/my-work-bug--0-id_desc-0--.json`、`/bug-view-.json`、`/file-read-.`; + 解决:GET `/bug-resolve-.json` 取版本/用户选项,POST `/bug-resolve-.html?onlybody=yes` 表单 + (resolution/resolvedBuild/resolvedDate/assignedTo/status=resolved/comment)。 - REST v1 的 `/products//bugs` 只返回激活中的 Bug,不能替代"我的 Bug"页面。 - 凭据:Token 在 `~/.config/zentao-lite/config.json`(0600),密码只在钥匙串(服务名 `zentao-lite`)。`logout` 一并清除。 diff --git a/.claude/skills/zentao-bug/zentao.py b/.claude/skills/zentao-bug/zentao.py index 37a622a..e94dfd0 100644 --- a/.claude/skills/zentao-bug/zentao.py +++ b/.claude/skills/zentao-bug/zentao.py @@ -173,6 +173,27 @@ class Client: self._relogin() raise AuthError("无法获取数据") + def post_form(self, path, fields): + """提交页面表单(与网页点击「保存」相同);返回响应 HTML(禅道用