Install
openclaw skills install @yeah526/zentao-bug-analyzer禅道缺陷自动分析:从飞书消息解析Bug链接,自动模块分类+分支定位+代码分析,Playwright评论+飞书通知双通道输出。
openclaw skills install @yeah526/zentao-bug-analyzer禅道实例:http://zentao.gxatek.com:20080/(企业版 12.1)
🔴 分析前必须先读完
SKILL.checklist.md的全部检查项,每条逐项完成。
git checkout <commit-id> 分析完后不做任何恢复操作。zentao-post-comment.js 将报告贴到禅道 Bug 评论,再发飞书摘要。跳过评论 = 分析未完成。飞书 Bot 收到包含禅道 Bug 链接的消息时自动触发。
正则模式:zentao\.gxatek\.com:20080/bug-view-(\d+)\.html
用户直接在飞书对话中:
批量分析:批量触发时,先通过 Playwright 会话查询 Bug 列表,每个 Bug 独立走完整流水线。不同 Bug 按第三章并发规则处理。
无有效链接时:飞书私聊回复「未识别到有效的禅道缺陷链接,请确认消息内容」。
依赖 {workspace}/bug-analyzer-config.json。
{
"zentao": {
"url": "http://zentao.gxatek.com:20080",
"account": "wyhe",
"password": "你的禅道登录密码"
},
"notify": {
"feishu_open_id": "飞书私聊通知目标用户 Open ID,步骤 3/4b 等所有飞书通知场景使用"
},
"modules": [
{
"name": "车机设置",
"aliases": ["桌面卡片", "设置", "systemui", "SystemUI"],
"code_dir": "D:/code/car-settings",
"commit_extract": "日志中以 'Build commit:' 开头的那一行,取后面的 8 位 hash",
"analyzer": "default",
"analyze_hint": "重点关注桌面卡片相关代码,常见问题是侧滑返回时的 Activity 生命周期处理"
},
{
"name": "蓝牙模块",
"aliases": ["蓝牙", "BT", "bluetooth", "bt-stack"],
"code_dir": "D:/code/bt-stack",
"commit_extract": "日志里搜索 'git_hash=',取等号后面的完整 hash",
"analyzer": "default",
"analyze_hint": "蓝牙相关缺陷通常与连接状态机有关,优先检查 BluetoothManager 的状态流转"
}
]
}
字段说明:
name:模块名称aliases:模块别名列表(字符串数组),用于精确匹配。匹配规则:将 Bug 的 title、module.name、product.name 与所有模块的 name + aliases 做子串匹配(忽略大小写),任一命中即判定为该模块。此规则为硬规则,优先于 AI 主观判断code_dir:模块本地代码仓库绝对路径commit_extract:自然语言,告诉 AI 如何从日志提取 commit idanalyzer:"default" | "skill:技能名"。default 走通用 AI 分析流程;skill:xxx 委派给对应 Skillanalyze_hint:模块专属分析提示词(可选),无论哪种分析器都会传给分析器配置文件不存在时启动对话式引导。流程:
zentao@syncore.space 时,自动将邮件转发/分享到本 Bot 的对话中。」从消息内容提取禅道 Bug 链接,正则:zentao\.gxatek\.com:20080/bug-view-(\d+)\.html
⚠️ 此步骤是强制检查点,无论通过哪种触发方式(邮件转发或自然语言)进入分析流水线,必须先走步骤 2。已评论过的 Bug 绝对不允许直接进入后续步骤。
scripts/zentao-get-bug.js 获取 Bug 详情(含历史评论,后续步骤复用)zentao.account 配置账号的评论已有我的评论:飞书私聊询问「该 Bug 你已评论过,是否需要重新分析?(回复"是"或"分析"继续,回复"否"或"取消"跳过)」
没有我的评论:直接继续步骤 3。
匹配规则(优先级从高到低):
aliases 数组,将每个别名与 Bug 的 title、module.name、product.name 做子串匹配(忽略大小写)。只要任一副本字段包含任一个别名(或 name 本身),即判定命中该模块。
modules 列表结果处理:
运行 scripts/zentao-download-files.js 下载 Bug 所有附件到 bugs/{bug_id}/。(script 自动处理大文件分块传输,支持 160MB+ 附件)
⚠️ 步骤 4a 完成后必须先执行 4b(确定 Bug 发生时间),再进入 4c。
⚠️ 硬约束:Bug 发生时间必须从可靠来源直接获取,禁止猜测或间接推断。
获取优先级:
禁止行为:
时间用于:
commit_extract 从日志提取 commit idcd {code_dir} → git branch --contains <commit-id> 确认 commit 在哪些分支上。结果写入分析报告的「分支信息」字段(格式:分支名 | commit-id)git worktree add .claude/worktrees/bug-{bug_id}/ <commit-id> 创建隔离工作区git checkout <commit-id>(进入 detached HEAD 是正常行为,分析完成后保持不动即可)+ git submodule update --init --recursivecommit id 提取失败:飞书私聊通知(附带日志片段),流程终止。
⚠️ 硬约束:只使用配置中 commit_extract 指定的提取规则,禁止 AI 自行更换搜索关键词(如换 TAG、换正则)。搜不到就是搜不到,不允许"近似匹配"或"换成类似的 TAG 试试"。 Self-Check:若在分析过程中进行了 commit_extract 规则以外的额外搜索,应立即停止、丢弃中间产物,回到步骤 4c 标准路径并报告提取失败。
commit id 不在任何分支:飞书私聊通知(附带 commit id),流程终止
⚠️ 硬约束:
git checkout <commit-id>后必须执行git submodule update --init --recursive,确保所有 submodule 都已 checkout 到对应版本。未 checkout submodule 可能导致分析时缺少依赖代码、漏掉跨仓库 API 不一致问题。
历史评论已在步骤 2 获取,此处直接使用。
根据 analyzer 字段:
"default":AI 综合 Bug 详情 + 附件/日志 + 历史评论 + 本地代码分析"skill:xxx":委派给指定 Skill,传入分析上下文无论哪种方式,analyze_hint 都作为上下文传入。
输出格式(Markdown,AI 直接产出此结构):
abc12345branch/namepath/to/file.ext:行号// 关键代码
bugs/{bug_id}/report.md(按步骤 4d 输出格式)
b. 运行 node scripts/zentao-build-comment.js bugs/{bug_id}/report.md --out bugs/{bug_id}/comment.html 生成 HTML
c. 运行 node scripts/zentao-post-comment.js --ws=<wsEndpoint> --bug-id=<id> --comment-file=bugs/{bug_id}/comment.html 发布(必须用 --comment-file,禁止用 --comment 传 HTML 内容)
d. ⚠️ 禁止手写临时 Playwright 脚本发布评论分析完成后必须清理残留进程,避免占用系统资源:
taskkill /PID <login-PID> /F /T,PID 来自 zentao-login.js 输出行 PID=<value>。/T 会连带终结 Chrome 子进程树git worktree list 检查是否有 .claude/worktrees/bug-{bug_id}/ 残留,有则 git worktree remove .claude/worktrees/bug-{bug_id}/Get-Process node 检查是否还有 zentao-*.js 相关进程,有则 taskkill /F /PID <pid> 清理zentao-*.js 残留⚠️ 注意:不要杀掉 OpenClaw 自身的 node 进程(gateway/worker),只清理
zentao-*.js和 Chrome headless 相关进程。
git worktree 为每个 Bug 创建隔离工作区,分析完成后 git worktree remove 清理⚠️ 企业版 12.1 不支持 Bearer Token 认证(
POST /api.php/v1/tokens不可用),所有读写操作统一走 Playwright。
一个 Bug 的分析全程只允许启动一次 Playwright 浏览器。登录后所有操作(读详情、下载附件、写评论)复用同一会话,禁止:
禅道交互只允许使用 scripts/ 目录下的 5 个固定脚本:
| 脚本 | 用途 | 关键参数 |
|---|---|---|
zentao-login.js | 登录 | --port(默认 9224) |
zentao-get-bug.js | 获取 Bug 详情 | --ws、--bug-id |
zentao-download-files.js | 下载附件 | --ws、--bug-id、--dir |
zentao-build-comment.js | Markdown → HTML 评论 | <report.md> [--out <output.html>] |
zentao-post-comment.js | 发布评论 | --ws、--bug-id、--comment-file=<path>(推荐)或 --comment(原始 HTML) |
禁止行为:
post_comment.js、check_bug.js、debug_login.js 等任何 Playwright 脚本bugs/{bug_id}/ 目录下创建任何 .js 文件page.evaluate、page.fill、page.click 等 Playwright API 绕过已有脚本遇到脚本报错时的正确处理方式:
scripts/ 目录下),让修复对所有后续分析生效| 场景 | 处理 |
|---|---|
| 不含禅道链接 | 「未识别到有效的禅道缺陷链接,请确认消息内容」 |
| 链接解析失败 | 「无法解析该链接,请确认是否正确转发」 |
| 禅道 API 请求失败(登录失效/会话过期) | 「无法访问禅道,请检查连接和登录状态」 |
| 模块分类置信度低 | 飞书通知:Bug 链接+关键信息,请手动确认 |
| 模块不在负责范围 | 飞书通知:Bug 归属 + 提醒手动流转 |
| commit id 提取失败 | 飞书通知:日志片段,请手动确认分支 |
| commit id 不在任何分支 | 飞书通知:commit id,请手动确认 |
| 附件/日志下载失败 | 降级:仅基于 Bug 描述+历史评论+代码分析,评论注明「未能获取附件」,飞书通知 |
| 本地代码目录不存在 | 降级:跳过代码分析,仅日志+附件+评论,飞书通知检查配置 |
| 分析过程中断或超时 | 飞书通知进度和失败原因,不留半截评论 |
| 用户 5 分钟内未回复重新分析确认 | 默认不重新分析,流程终止 |
| 分析过程中 git worktree 冲突 | 清理残留 worktree 后重试;仍失败则飞书通知 |