Files
aerologic-app/.claude/skills/zentao-bug/SKILL.md
YANG JIANKUAN 00f2dc98dd feat(skill): zentao-bug 新增 assign 命令,支持指派 Bug 并附备注
等同网页「指派」表单:--to 接受账号或姓名,状态保持激活,提交后回读校验指派人;
多行备注用 --comment-file,换行转 <br /> 以便网页分行显示。
SKILL.md 补充用法,约定转给后端时备注照搬《后端接口对接问题清单》对应行。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 11:44:31 +08:00

5.9 KiB
Raw Blame History

name, description
name description
zentao-bug 读取禅道(njlkairport.chandao.net,开源版 18.8)中的 Bug 单——我的 Bug 列表、单个 Bug 的标题/描述/截图/评论/修改历史/附件——并按 AirLogistics 项目规范定位代码完成修复,也可在禅道上解决、指派 Bug(如转给后端并附问题说明)。禅道 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 读取与修复

工具

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/,文中以绝对路径 ![图N](/Users/.../images/1154.jpeg) 引用。

截图是需求的主要载体(团队习惯把原型/标注贴在描述和评论里,几乎不用附件),必须逐张用 Read 查看,不能只看文字。

登录(只能由用户本人执行)

退出码 2 表示未登录或会话过期。禅道会话默认空闲 24 分钟失效。让用户在自己的终端执行:

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>。不确定截图意图时先问用户,禁止臆测。

写回禅道

python3 $Z resolve 621 622 --comment 已解决 --dry-run   # 先预览
python3 $Z resolve 621 622 --comment 已解决             # 提交

等同网页「解决」表单,默认:解决方案 fixed(已解决)、解决版本 trunk(主干);解决日期与指派给取网页表单渲染出的默认值 (服务器当前时间 / 创建人,可用 --date / --assign-to 覆盖),其余字段不动;备注默认留空,团队习惯只写「已解决」,不写业务细节。 只处理激活状态的单子,提交后回读校验状态。

  • 写操作会改动线上状态,只在用户明确要求时执行;只解决确实修好、且没有待确认疑问的单子。 无缺陷 / 需后端修复 / 有疑问的保持激活,并向用户列出原因(无缺陷应选「设计如此」等其他方案,不要标「已解决」)
  • 接口提交不会自动补表单默认值,所以先 GET 解决表单 HTML 读出 resolvedDate 与 assignedTo 的选中项再原样提交; 解决日期不能用本机时间:本机可能在美西时区,禅道服务器是北京时间(#621 曾因此写成本机时间)

指派(转给后端等)

python3 $Z assign 627 --to 陶雨佳 --comment-file /path/c627.txt --dry-run   # 先预览
python3 $Z assign 627 --to 陶雨佳 --comment-file /path/c627.txt             # 提交

等同网页「指派」表单:--to 接受账号(如 TYJ)或姓名,状态保持激活,提交后回读校验指派人。 需后端修复的单子转给后端时,备注照搬 documents/后端接口对接问题清单.xlsx 对应行 (接口地址 / 问题类型 / 问题描述 / 期望调整 / 前端现状),并注明清单序号;多行备注用 --comment-file,换行会转成 <br />。

实现说明

  • 认证: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); 指派:GET /bug-assignTo-<id>.json 取用户,POST /bug-assignTo-<id>.html?onlybody=yes 表单(assignedTo/status/mailto[]/comment)。
  • REST v1 的 /products/<id>/bugs 只返回激活中的 Bug,不能替代"我的 Bug"页面。
  • 凭据:Token 在 ~/.config/zentao-lite/config.json(0600),密码只在钥匙串(服务名 zentao-lite)。logout 一并清除。