- resolve <id...>:等同网页「解决」表单,默认解决方案 fixed、解决版本 trunk(主干), 支持 --dry-run 预览;只处理激活状态,提交后回读校验 - 接口提交不会自动补默认值:解决日期与指派给先从解决表单 HTML 读取默认值 (服务器北京时间 / 创建人)再原样提交,避免用本机时区时间 - SKILL.md 补写回说明,并注明 login 需在独立终端执行(! 前缀无 TTY) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
5.1 KiB
Markdown
72 lines
5.1 KiB
Markdown
---
|
||
name: zentao-bug
|
||
description: 读取禅道(njlkairport.chandao.net,开源版 18.8)中的 Bug 单——我的 Bug 列表、单个 Bug 的标题/描述/截图/评论/修改历史/附件——并按 AirLogistics 项目规范定位代码完成修复。禅道 18.8 没有 API 2.0,官方 zentao-cli / MCP 不可用,必须用本 skill 的 zentao.py。当用户提到"禅道"、"bug 单"、"我的 bug"、"修 bug"、"处理 bug"、给出 Bug 编号(如 "#632"、"bug 632")或禅道链接(bug-view-xxx.html / my-work-bug.html)时使用。
|
||
---
|
||
|
||
# 禅道 Bug 读取与修复
|
||
|
||
## 工具
|
||
|
||
```bash
|
||
Z=.claude/skills/zentao-bug/zentao.py
|
||
python3 $Z whoami # 当前账号 + 会话是否有效
|
||
python3 $Z list # 指派给我的 Bug(= 网页「地盘 → 我的Bug」)
|
||
python3 $Z list --status active # 只看激活的
|
||
python3 $Z list --type resolvedBy # 由我解决 / openedBy / closedBy
|
||
python3 $Z list --json # 结构化输出
|
||
python3 $Z view 632 # Bug 详情(Markdown)
|
||
```
|
||
|
||
`view` 输出并保存到 `~/.cache/zentao-lite/bugs/<id>/bug.md`:基本信息、重现步骤、附件、历史记录与评论(评论以 `>` 引用块呈现)。
|
||
描述和评论中的截图下载到 `images/`,文中以绝对路径 `` 引用。
|
||
|
||
**截图是需求的主要载体**(团队习惯把原型/标注贴在描述和评论里,几乎不用附件),**必须逐张用 Read 查看**,不能只看文字。
|
||
|
||
## 登录(只能由用户本人执行)
|
||
|
||
退出码 2 表示未登录或会话过期。禅道会话默认空闲 24 分钟失效。让用户在自己的终端执行:
|
||
|
||
```bash
|
||
python3 .claude/skills/zentao-bug/zentao.py login --account <账号>
|
||
```
|
||
|
||
必须在**独立的终端窗口**里执行——Claude Code 的 `! <命令>` 没有 TTY,密码提示会直接 EOFError。
|
||
密码交互输入、不回显;默认存入 macOS 钥匙串,此后会话过期会自动重新登录(`--no-keychain` 则不保存)。
|
||
**不要向用户索要密码,也不要替用户在命令行里带密码登录。**
|
||
|
||
## 修复流程
|
||
|
||
1. **读单**:`view <id>`,Read 全部截图;评论里常有后续补充或改口,以最新评论为准。
|
||
2. **定位页面**:Bug 标题/描述通常写的是菜单名(如"出港移库""进港仓库")。按 CLAUDE.md「页面定位规则」,
|
||
以首页菜单实际跳转的 Activity 为准(平板 `app/.../HomeFragment.kt`,手机 `module_p` 的 `GnViewModel`/`GjViewModel`)。
|
||
3. **判断端**:截图是手机竖屏(如 5.5 寸设计稿样式)还是平板横屏,决定改 `res/layout/` 还是 `res/layout-sw600dp/`;
|
||
业务逻辑改动两端都要检查(CLAUDE.md「业务以平板为准」)。截图提到"原型"时对照 `documents/5.5寸手持端设计文件/`。
|
||
4. **修改并验证**:遵守 CLAUDE.md 的 UI 规范;`./gradlew assembleDebug` 编译通过;能在模拟器验证的就验证并截图比对。
|
||
5. **汇报**:按 Bug 逐条说明改了什么、改在哪里、如何验证、有无未覆盖项。多个 Bug 时每个 Bug 单独提交,
|
||
提交信息带 `Bug #<id>`。不确定截图意图时先问用户,禁止臆测。
|
||
|
||
## 写回禅道
|
||
|
||
```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=<Token>`。
|
||
- 接口:`/my-work-bug-<type>-0-id_desc-0-<perPage>-<page>.json`、`/bug-view-<id>.json`、`/file-read-<fileID>.<ext>`;
|
||
解决:GET `/bug-resolve-<id>.json` 取版本/用户选项,POST `/bug-resolve-<id>.html?onlybody=yes` 表单
|
||
(resolution/resolvedBuild/resolvedDate/assignedTo/status=resolved/comment)。
|
||
- REST v1 的 `/products/<id>/bugs` 只返回激活中的 Bug,不能替代"我的 Bug"页面。
|
||
- 凭据:Token 在 `~/.config/zentao-lite/config.json`(0600),密码只在钥匙串(服务名 `zentao-lite`)。`logout` 一并清除。
|