@zhanlucode/zl-darwin-arm64 1.6.4-moma.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +22 -0
  2. package/bin/rg +0 -0
  3. package/bin/tree-sitter/tree-sitter-bash.wasm +0 -0
  4. package/bin/tree-sitter/tree-sitter-c.wasm +0 -0
  5. package/bin/tree-sitter/tree-sitter-c_sharp.wasm +0 -0
  6. package/bin/tree-sitter/tree-sitter-cpp.wasm +0 -0
  7. package/bin/tree-sitter/tree-sitter-css.wasm +0 -0
  8. package/bin/tree-sitter/tree-sitter-dart.wasm +0 -0
  9. package/bin/tree-sitter/tree-sitter-elisp.wasm +0 -0
  10. package/bin/tree-sitter/tree-sitter-elixir.wasm +0 -0
  11. package/bin/tree-sitter/tree-sitter-elm.wasm +0 -0
  12. package/bin/tree-sitter/tree-sitter-embedded_template.wasm +0 -0
  13. package/bin/tree-sitter/tree-sitter-go.wasm +0 -0
  14. package/bin/tree-sitter/tree-sitter-html.wasm +0 -0
  15. package/bin/tree-sitter/tree-sitter-java.wasm +0 -0
  16. package/bin/tree-sitter/tree-sitter-javascript.wasm +0 -0
  17. package/bin/tree-sitter/tree-sitter-json.wasm +0 -0
  18. package/bin/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  19. package/bin/tree-sitter/tree-sitter-lua.wasm +0 -0
  20. package/bin/tree-sitter/tree-sitter-objc.wasm +0 -0
  21. package/bin/tree-sitter/tree-sitter-ocaml.wasm +0 -0
  22. package/bin/tree-sitter/tree-sitter-php.wasm +0 -0
  23. package/bin/tree-sitter/tree-sitter-python.wasm +0 -0
  24. package/bin/tree-sitter/tree-sitter-ql.wasm +0 -0
  25. package/bin/tree-sitter/tree-sitter-rescript.wasm +0 -0
  26. package/bin/tree-sitter/tree-sitter-ruby.wasm +0 -0
  27. package/bin/tree-sitter/tree-sitter-rust.wasm +0 -0
  28. package/bin/tree-sitter/tree-sitter-scala.wasm +0 -0
  29. package/bin/tree-sitter/tree-sitter-solidity.wasm +0 -0
  30. package/bin/tree-sitter/tree-sitter-swift.wasm +0 -0
  31. package/bin/tree-sitter/tree-sitter-systemrdl.wasm +0 -0
  32. package/bin/tree-sitter/tree-sitter-tlaplus.wasm +0 -0
  33. package/bin/tree-sitter/tree-sitter-toml.wasm +0 -0
  34. package/bin/tree-sitter/tree-sitter-tsx.wasm +0 -0
  35. package/bin/tree-sitter/tree-sitter-typescript.wasm +0 -0
  36. package/bin/tree-sitter/tree-sitter-vue.wasm +0 -0
  37. package/bin/tree-sitter/tree-sitter-yaml.wasm +0 -0
  38. package/bin/tree-sitter/tree-sitter-zig.wasm +0 -0
  39. package/bin/tree-sitter/tree-sitter.wasm +0 -0
  40. package/bin/zhanlu-plugins/bundle-index.json +60 -0
  41. package/bin/zhanlu-plugins/lingji-alpha-assistant/.claude-plugin/plugin.json +42 -0
  42. package/bin/zhanlu-plugins/lingji-alpha-assistant/README.md +29 -0
  43. package/bin/zhanlu-plugins/lingji-alpha-assistant/mcps/sast_fixer_mcp/README.md +10 -0
  44. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-check/SKILL.md +179 -0
  45. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-check/config/gitlab_config.json +5 -0
  46. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-check/prompts/step1_preparation.md +167 -0
  47. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-check/prompts/step2_consistency_check.md +446 -0
  48. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-check/scripts/gitlab_clone.py +213 -0
  49. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-check/scripts/read_excel_requirements.py +144 -0
  50. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/GITLAB_USAGE.md +160 -0
  51. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/QUICK_REFERENCE.md +149 -0
  52. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/README.md +134 -0
  53. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/SKILL.md +151 -0
  54. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/assets/review_standards.md +144 -0
  55. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/prompts/file_review_prompt.md +160 -0
  56. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/prompts/output_requirements.md +35 -0
  57. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/prompts/step1_project_preprocessing.md +106 -0
  58. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/prompts/step2_file_review.md +83 -0
  59. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/prompts/step3_report_generation.md +319 -0
  60. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/code-review/scripts/gitlab_clone.py +213 -0
  61. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/manual-test-case-generator/SKILL.md +366 -0
  62. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/manual-test-case-generator/references/generation-rules.md +214 -0
  63. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/manual-test-case-generator/references/query-rules.md +60 -0
  64. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/manual-test-case-generator/references/review-rules.md +117 -0
  65. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/manual-test-case-generator/references/save-rules.md +367 -0
  66. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/quality_scan/SKILL.md +195 -0
  67. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/requirement-analysis/SKILL.md +346 -0
  68. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/requirement-review/SKILL.md +267 -0
  69. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/requirements-gather/SKILL.md +187 -0
  70. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/sast_scan/SKILL.md +312 -0
  71. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/SKILL.md +77 -0
  72. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/evals/evals.json +34 -0
  73. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/references/epic-to-story-methodology.md +122 -0
  74. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/references/epic-to-story-template.md +93 -0
  75. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/references/epic-to-story-to-task-template.md +221 -0
  76. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/references/story-to-task-methodology.md +139 -0
  77. package/bin/zhanlu-plugins/lingji-alpha-assistant/skills/story-decomposer/references/story-to-task-template.md +89 -0
  78. package/bin/zhanlu-plugins/lingji-beta-assistant/.claude-plugin/plugin.json +19 -0
  79. package/bin/zhanlu-plugins/lingji-beta-assistant/README.md +21 -0
  80. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/.gitkeep +1 -0
  81. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-analysis/SKILL.md +383 -0
  82. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-decomposer/SKILL.md +348 -0
  83. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-decomposer/references/epic-to-story-methodology.md +122 -0
  84. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-decomposer/references/epic-to-story-template.md +93 -0
  85. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-decomposer/references/epic-to-story-to-task-template.md +221 -0
  86. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-decomposer/references/story-to-task-methodology.md +139 -0
  87. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-decomposer/references/story-to-task-template.md +89 -0
  88. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirement-review/SKILL.md +350 -0
  89. package/bin/zhanlu-plugins/lingji-beta-assistant/skills/beta-requirements-gather/SKILL.md +244 -0
  90. package/bin/zl +4 -0
  91. package/package.json +18 -0
@@ -0,0 +1,117 @@
1
+ # 测试用例评审规则
2
+
3
+ 本文件定义了手工测试用例的评审标准和流程。评审的核心原则是**发现问题,而非确认通过**——AI 自动生成的测试用例普遍存在质量问题,需要严格把关。对每个维度进行真实判断,发现问题就标记不通过,不要因为"大体上还可以"就放过。
4
+
5
+ ## 目录
6
+
7
+ 1. [评审原则](#评审原则)
8
+ 2. [AI 生成用例常见问题](#ai-生成用例常见问题)
9
+ 3. [八维评审标准](#八维评审标准)
10
+ 4. [通过/不通过判定](#通过不通过判定)
11
+ 5. [评审执行方式](#评审执行方式)
12
+
13
+ ---
14
+
15
+ ## 评审原则
16
+
17
+ - 对每个维度进行真实判断,发现问题就标记不通过
18
+ - 评审结论必须反映用例的真实质量,不能流于形式
19
+ - 重点排查**幻觉信息**:无关 URL、不存在的账号、与当前业务模块无关的环境描述
20
+ - 宁可多改一轮,不可放过质量隐患
21
+
22
+ ## AI 生成用例常见问题
23
+
24
+ 以下是 AI 生成用例最常出现的 10 类质量问题,评审时重点排查:
25
+
26
+ 1. **步骤过于笼统**:如"输入用户名和密码"但未指定输入什么值、"点击按钮"但未说明哪个按钮
27
+ 2. **预期结果模糊**:如"操作成功"、"系统响应正常"、"页面显示正确"等无法验证的描述
28
+ 3. **缺乏异常/负向场景**:只测正向流程,没有输入非法值、越权操作、网络异常等反向用例
29
+ 4. **缺乏边界值测试**:没有最大/最小长度、临界值、空值等边界场景
30
+ 5. **前置条件不完整/存在幻觉**:
31
+ - 未指定具体的测试账号、角色权限、测试数据
32
+ - 混入与当前功能模块无关的 URL、系统名称、账号(幻觉信息)
33
+ - 环境描述模糊或与当前业务场景不符
34
+ 6. **优先级设置雷同**:大量用例优先级相同,未根据业务重要程度区分
35
+ 7. **安全/性能/可靠性用例质量低**:内容过于空洞,如"测试安全性"而没有具体操作
36
+ 8. **测试类型分布不均**:功能测试用例过多,其他类型用例质量和数量严重不足
37
+ 9. **步骤与预期结果数量不对应**:5个步骤只有1条预期结果,或预期结果不覆盖关键步骤
38
+ 10. **用例场景重复**:多条用例测试完全相同的场景,缺乏差异性
39
+
40
+ ## 八维评审标准
41
+
42
+ ### 维度 1:用例标题
43
+ - **通过**:明确包含 功能模块 + 操作场景 + 预期状态,如"通讯录-角色管理-新增角色-输入合法名称创建成功"
44
+ - **不通过**:标题笼统如"登录测试"、"验证功能",或无法从标题判断具体测试场景
45
+
46
+ ### 维度 2:前置条件
47
+ - **通过**:
48
+ 1. 明确列出当前功能模块专属的测试账号(含角色/权限范围)
49
+ 2. 明确测试数据状态(如"系统中不存在名为'测试管理员'的角色")
50
+ 3. 明确当前模块的测试环境配置
51
+ 4. 无任何与当前功能模块无关的系统名称、URL、账号等幻觉信息
52
+ - **不通过**:
53
+ 1. 仅写"系统正常运行"、"用户已登录"等泛泛描述
54
+ 2. 包含与当前功能模块无关的 URL、账号、系统名称
55
+ 3. 未指定测试账号的角色权限范围
56
+ 4. 未说明关键测试数据的初始状态
57
+
58
+ ### 维度 3:测试步骤
59
+ - **通过**:每步有序号,操作对象具体(指明哪个按钮/输入框/菜单),输入值有明确示例
60
+ - **不通过**:步骤中出现"输入信息"(未说明什么信息)、"点击按钮"(未说明哪个按钮)等模糊描述;步骤数少于 3 条而测试场景应当复杂
61
+
62
+ ### 维度 4:预期结果
63
+ - **通过**:对应每个关键步骤,描述可观察的系统具体响应(如"页面跳转至 /role 列表,新增一条'测试管理员'记录")
64
+ - **不通过**:出现"操作成功"、"系统正常"、"显示正确"等模糊词;步骤数与预期结果数不匹配(超过2倍差距);缺少错误提示的具体描述
65
+
66
+ ### 维度 5:用例类型
67
+ - **通过**:类型属于 7 种之一(功能测试、安全测试、性能测试、冒烟测试、可靠性测试、兼容性测试、易用性测试)
68
+ - **不通过**:类型为空,或不在上述 7 种范围内
69
+
70
+ ### 维度 6:优先级
71
+ - **通过**:使用 L0/L1/L2/L3,核心流程为 L0/L1,边缘场景为 L2/L3,分布合理
72
+ - **不通过**:所有用例优先级完全相同;格式不符合 L0-L3 规范
73
+
74
+ ### 维度 7:测试环境准备
75
+ - **通过**:
76
+ 1. 明确说明浏览器类型和版本(或操作系统)
77
+ 2. 明确当前功能模块的测试环境 URL(无无关 URL 混入)
78
+ 3. 明确所需账号角色和权限范围
79
+ - **不通过**:前置条件中没有任何环境、账号、数据的具体描述;或混入无关 URL/系统名称
80
+
81
+ ### 维度 8:测试范围覆盖
82
+ - **通过**:7 种测试类型均有覆盖,且包含正向、反向(异常/非法输入)、边界值三类场景
83
+ - **不通过**:缺少任意一种标准测试类型;无异常/负向场景;无边界值场景
84
+
85
+ ## 通过/不通过判定
86
+
87
+ ### 不通过(满足任意一条即不通过)
88
+
89
+ - 超过 20% 的用例步骤描述模糊
90
+ - 超过 20% 的用例预期结果模糊
91
+ - 缺少异常/负向测试场景
92
+ - 缺少边界值测试场景
93
+ - 缺失 1 种及以上标准测试类型
94
+ - 优先级全部相同
95
+ - 超过 50% 的用例前置条件缺乏具体描述
96
+ - 存在幻觉信息(无关 URL、账号、系统名称 ≥1 条用例)
97
+
98
+ ### 通过(须全部满足)
99
+
100
+ - 所有用例步骤具体可执行
101
+ - 所有用例预期结果可观察可验证
102
+ - 包含正向、负向、边界值三类场景
103
+ - 7 种测试类型均有覆盖
104
+ - 优先级分布合理(核心 L0/L1,边缘 L2/L3)
105
+ - 前置条件明确具体,无任何幻觉信息
106
+
107
+ ## 评审执行方式
108
+
109
+ 生成用例后,按以下方式执行自我评审:
110
+
111
+ 1. **逐维度扫描**:依次检查 8 个维度,标记每个维度的通过/不通过
112
+ 2. **问题定位**:对不通过维度,列出具体的问题用例编号和问题描述
113
+ 3. **类型覆盖清点**:确认 7 种测试类型均有用例,确认三类场景(正向/负向/边界值)均有覆盖
114
+ 4. **幻觉排查**:仔细检查前置条件、环境描述中是否包含与当前需求无关的 URL、账号、系统名称
115
+ 5. **得出结论**:根据判定标准,给出明确的通过/不通过结论
116
+
117
+ 如果结论为不通过,触发修正流程(参见 SKILL.md 中的修正规则),修正后直接输出最终结果。
@@ -0,0 +1,367 @@
1
+ # 用例保存规则
2
+
3
+ 本文件定义了将手工测试用例保存至灵畿平台用例库的完整规则,包括上下文解析、目录校验、数据转换和 API 调用。
4
+
5
+ ## 重要约定:空间编码 vs 空间ID
6
+
7
+ 所有 MCP 接口中涉及研发空间参数(`workspaceId`、`X-Auth-ModuleId` 等)时,**统一传空间编码(字符串),非空间数据库数字ID**。`workspaceId` 虽然是 MCP 参数名,但值应为空间编码。
8
+
9
+ ## 触发指令
10
+
11
+ | 用户说法 | 解析结果 |
12
+ |----------|----------|
13
+ | "保存用例到电商核心用例库" | 用例库=电商核心用例库,目录=根目录,测试计划=无 |
14
+ | "保存用例到电商核心用例库登录模块目录下" | 用例库=电商核心用例库,目录=登录模块,测试计划=无 |
15
+ | "保存用例到XX用例库XX目录下,并关联测试计划XX" | 用例库=XX,目录=XX,测试计划=XX |
16
+ | "将用例保存到用例库" / "用例入库" | 用例库=未指定,需弹出确认让用户选择用例库 |
17
+
18
+ ## 数据源
19
+
20
+ 优先从 MD 文件中读取用例内容(用户可能直接编辑了 MD 文件),使用 `read` 工具读取文件后解析用例数据。若 MD 文件不存在或读取失败,则使用对话上下文中的用例内容。
21
+
22
+ ## 步骤 1:解析保存上下文并查询资源
23
+
24
+ 从用户指令中解析出以下上下文字段,对于未提供的字段,按默认值处理:
25
+
26
+ | 字段 | 来源 | 必填 | 说明 |
27
+ |------|------|----|----------------------------------------------------------------|
28
+ | workspaceId | 查询时的空间编码 | 是 | **空间编码**(MCP 参数名为 workspaceId,实际传的是空间编码字符串,非空间数据库ID) |
29
+ | libraryId | 用户指定 / MCP 查询 | 是 | 用例库ID |
30
+ | libraryName | 用户指令解析 | 否 | 用例库名称(用于匹配 libraryId) |
31
+ | moduleId | 用户指定 / MCP 查询 | 是 | 场景目录编码,根目录时传-1,用户没有指定是传-1 |
32
+ | modulePath | 用户指令解析 | 否 | 场景目录路径(如"登录模块/功能测试") |
33
+ | testPlanId | 用户指定 / MCP 查询 | 否 | 测试计划ID |
34
+ | testPlanName | 用户指令解析 | 否 | 测试计划名称(用于匹配 testPlanId) |
35
+ | demandList | 需求信息 | 否 | 关联需求编号(自动从确认的需求中获取) |
36
+ | projectId | 空间上下文 | 否 | 项目编码,从需求的关联项目中提取,若没有,则从当前登录研发空间的关联项目中提取;仅一个时自动填充,多个时需用户选择 |
37
+ | productId | 需求上下文 + MCP 查询 | 否 | 产品编码,从需求的关联产品编码中获取,如果没有,则从当前登录研发空间的关联产品中提取,提取不到则不传|
38
+
39
+ ### 查询产品信息
40
+
41
+ **获取产品编码(productId):**
42
+
43
+ 从当前需求中提取关联产品,若没有,则从登录的研发空间信息中提取关联产品。当前空间下可能关联一个或多个产品:
44
+
45
+ 1. **仅一个产品** → 自动使用该产品编码作为 `productId`,无需用户确认
46
+ 2. **多个产品** → 使用 `question` 工具列出项目供用户选择
47
+
48
+
49
+ ```json
50
+ {
51
+ "questions": [
52
+ {
53
+ "question": "当前空间下存在多个产品,请选择用例关联的产品:\n1. 电商平台(ID:100,编码:PROD001)\n2. 营销系统(ID:200,编码:PROD002)",
54
+ "header": "选择产品",
55
+ "options": [
56
+ { "label": "电商平台", "description": "产品ID:100,编码:PROD001" },
57
+ { "label": "营销系统", "description": "产品ID:200,编码:PROD002" }
58
+ ]
59
+ }
60
+ ]
61
+ }
62
+ ```
63
+
64
+ 3. **无关联产品** → `productId` 不传,不阻塞保存流程
65
+
66
+
67
+ **提取项目编码(projectId):**
68
+
69
+ 从当前登录的研发空间信息中提取关联项目。当前空间下可能关联一个或多个项目:
70
+
71
+ 1. **仅一个项目** → 自动使用该项目编码作为 `projectId`,无需用户确认
72
+ 2. **多个项目** → 使用 `question` 工具列出项目供用户选择
73
+
74
+ ```json
75
+ {
76
+ "questions": [
77
+ {
78
+ "question": "当前空间下关联了多个项目,请选择用例关联的项目:\n1. 核心交易项目(PJ001)\n2. 用户中心项目(PJ002)",
79
+ "header": "选择项目",
80
+ "options": [
81
+ { "label": "核心交易项目", "description": "项目编码:PJ001" },
82
+ { "label": "用户中心项目", "description": "项目编码:PJ002" }
83
+ ]
84
+ }
85
+ ]
86
+ }
87
+ ```
88
+
89
+ 3. **无关联项目** → `projectId` 不传,不阻塞保存流程
90
+
91
+ ### 查询用例库及目录
92
+
93
+ 调用 `mcp__cmdevops_ct__list_query_library` 获取用例库及场景目录树。**注意:调用时 `workspaceId` 参数传空间编码,非空间数据库ID。**
94
+
95
+ - `workspaceId` = 当前空间编码
96
+
97
+ 从返回结果中:
98
+ 1. 若用户指定了用例库名称 → 在返回列表中按 `libraryName` 匹配获取 `libraryId`
99
+ 2. 若用户未指定用例库名称 → **使用 `question` 工具将全部用例库列出供用户选择**,禁止自动取第一个
100
+ 3. 将 `caseModuleVO` 的树形结构展开,构建完整路径映射表(路径 → moduleId)
101
+
102
+ ```
103
+ 根目录 → moduleId=0
104
+ 登录模块 → moduleId=1001
105
+ 登录模块/密码登录 → moduleId=1002
106
+ 下单模块 → moduleId=2001
107
+ 下单模块/购物车下单 → moduleId=2002
108
+ ```
109
+
110
+ 4. 若用户指定了目录,在路径映射表中查找:
111
+ - **目录存在**:获取其 `moduleId`
112
+ - **目录不存在**:提示用户目录不存在,**不执行保存操作**,使用 `question` 工具让用户选择重新输入或保存至根目录。
113
+
114
+ 选项中列出 `list_query_library` 返回的所有用例库名称。`question` 工具默认启用 `custom` 模式,用户也可直接输入用例库名称,**不要在 options 中添加"其他"或"手动输入"选项**。
115
+
116
+ ```
117
+ ⚠️ 指定的目录"XXX"在用例库中不存在,无法保存。请检查目录名称是否正确。
118
+ ```
119
+
120
+ **目录匹配规则:**
121
+ - 用户输入支持多级路径,用 `/` 分隔,如"登录模块/密码登录"
122
+ - 支持模糊匹配最后一级目录名(如输入"密码登录"可匹配到"登录模块/密码登录"),但若存在同名目录则需提示用户选择具体路径
123
+
124
+ ### 查询测试计划
125
+
126
+ 若用户指定了测试计划名称,调用 `mcp__cmdevops_ct__list_query_plan` 查询测试计划列表。**注意:调用时 `workspaceId` 参数传空间编码,非空间数据库ID。**
127
+
128
+ - `workspaceId` = 当前空间编码
129
+
130
+ 从返回结果中按计划名称匹配获取 `testPlanId`。若未匹配到,提醒用户确认测试计划名称。
131
+
132
+ ## 步骤 2:确认缺失的必填信息
133
+
134
+ `libraryId` 为必填字段,若用户指令中未指定用例库名称,必须使用 `question` 工具让用户选择。
135
+
136
+ `question` 工具调用示例:
137
+
138
+ ```json
139
+ {
140
+ "questions": [
141
+ {
142
+ "question": "请选择要保存到的用例库:\n1. 电商核心用例(100001)\n2. 营销活动用例库(100002)",
143
+ "header": "选择用例库",
144
+ "options": [
145
+ { "label": "电商核心用例库", "description": "用例库ID:100001" },
146
+ { "label": "营销活动用例库", "description": "用例库ID:100002" }
147
+ ]
148
+ }
149
+ ]
150
+ }
151
+ ```
152
+
153
+ 选项中列出 `list_query_library` 返回的所有用例库名称。`question` 工具默认启用 `custom` 模式,用户也可直接输入用例库名称,**不要在 options 中添加"其他"或"手动输入"选项**。
154
+
155
+ 其他缺失字段处理:
156
+
157
+ | 缺失字段 | 处理方式 |
158
+ |----------|----------|
159
+ | workspaceId | "请提供研发空间编码" |
160
+ | projectId | 从需求的关联项目自动提取;无编码时传空字符串;多个项目时让用户选择 |
161
+ | productId | 从需求的关联产品自动获取;无编码时传空字符串;多个产品时让用户选择 |
162
+
163
+ `question` 工具调用示例:
164
+
165
+ ```json
166
+ {
167
+ "questions": [
168
+ {
169
+ "question": "保存信息确认:\n- 用例库:{libraryName}({libraryId})\n- 保存目录:{modulePath 或\"根目录\"}\n- 关联测试计划:{testPlanName 或\"不关联\"}\n- 关联需求:{demandList}\n- 项目编码:{projectId 或\"自动获取\"}\n- 产品编码:{productId 或\"自动获取\"}\n\n确认保存?如需调整请直接输入修改内容。",
170
+ "header": "保存确认",
171
+ "options": [
172
+ { "label": "确认,直接保存", "description": "使用以上信息保存用例" }
173
+ ]
174
+ }
175
+ ]
176
+ }
177
+ ```
178
+
179
+ `question` 工具默认启用 `custom` 模式,用户如需调整可直接在输入框中输入修改内容(如"目录改为登录模块"),**不要在 options 中添加"需要调整"选项**。
180
+
181
+ ## 步骤 3:数据转换
182
+
183
+ 将 Markdown 用例按以下字段映射规则转换为 `batch_create_case` 所需的结构。
184
+
185
+ **requestBody 顶层字段(与 libraryId、workspaceId 同级):**
186
+
187
+ | 字段 | 字段类型 | 必填 | 说明 |
188
+ |------|---------|------|------|
189
+ | workspaceId | string | 是 | **空间编码**(MCP 参数名为 workspaceId,实际传的是空间编码字符串,非空间数据库ID) |
190
+ | libraryId | string | 是 | 用例库ID |
191
+ | moduleId | string | 否 | 场景目录编码,未指定目录时默认填 "-1",指定目录时填对应的 moduleId |
192
+
193
+ **caseInfoAddDTOS 内部字段(每条用例):**
194
+
195
+ | Markdown 用例字段 | 平台字段 | 字段类型 | 必填 | 转换规则 |
196
+ |-------------------|---------|---------|------|---------|
197
+ | 用例标题 | caseName | string | 是 | 直接映射 |
198
+ | 用例等级 | priority | integer | 是 | **必须转为整数**:P0→0, P1→1, P2→2, P3→3, P4→4。禁止传字符串"P0" |
199
+ | 负责人 | directorId | string | 是 | 当前用户 deputyAccountNumber |
200
+ | 创建人 | creator | string | 是 | 当前用户 deputyAccountNumber |
201
+ | 执行方式 | execType | integer | 否 | 固定填 1(手工测试) |
202
+ | 用例类型 | caseType | integer | 否 | **必须转为整数**:功能测试→0, 兼容性测试→1, 易用性测试→2, 性能测试→3, 安全测试→4, 接口测试→5, 冒烟测试→6, 可靠性测试→7, 高可用测试→8, UI测试→9。禁止传中文字符串 |
203
+ | 前置条件 | testCondition | string | 否 | 各条用 `\n` 连接 |
204
+ | 测试步骤+预期结果 | caseSteps | array | 否 | 步骤和预期结果分别用 `\n` 连接后放入对象数组 |
205
+ | 关联需求 | demandList | string | 否 | 需求编号字符串,自动从确认的需求中获取 |
206
+ | 测试计划 | testPlanId | string | 否 | 查询获取的 testPlanId |
207
+ | 项目编码 | projectId | string | 否 | 从当前登录空间的关联项目中提取,多个时让用户选择 |
208
+ | 迭代编码 | iterationId | string | 否 | 从需求信息中提取(若有) |
209
+ | 系统编码 | systemId | string | 否 | 从需求信息中提取(若有) |
210
+ | 产品ID | productId | string | 否 | 从需求信息中提取(若有) |
211
+ | 备注 | remark | string | 否 | 可选补充说明 |
212
+
213
+ **转换后的单条用例数据结构:**
214
+
215
+ ```json
216
+ {
217
+ "caseName": "用户登录-正常登录-功能测试",
218
+ "priority": 0,
219
+ "directorId": "zhangsan@cmss.cmcc",
220
+ "creator": "zhangsan@cmss.cmcc",
221
+ "execType": 1,
222
+ "caseType": 0,
223
+ "testCondition": "1. 用户拥有登录模块操作权限\n2. 系统中已存在注册账号",
224
+ "caseSteps": [
225
+ {
226
+ "testStep": "1. 打开登录页面\n2. 输入正确的手机号\n3. 输入正确的验证码\n4. 点击登录按钮",
227
+ "expectResult": "1. 登录页面正常展示\n2. 手机号输入框显示输入内容\n3. 验证码输入框显示输入内容\n4. 登录成功,跳转至首页"
228
+ }
229
+ ],
230
+ "demandList": "RR20260119400340"
231
+ }
232
+ ```
233
+
234
+ **转换校验(调用 API 前必须逐条检查):**
235
+
236
+ | 检查项 | 正确 | 错误 |
237
+ |--------|------|------|
238
+ | priority 类型 | `0`, `1`, `2`, `3`, `4`(integer) | `"P0"`, `"0"`(字符串) |
239
+ | caseType 类型 | `0`, `1`, `2`, ..., `9`(integer) | `"功能测试"`, `"0"`(字符串) |
240
+ | execType 类型 | `1`(integer) | `"1"`(字符串) |
241
+ | remark | 有值时传入 | 缺失时不影响 |
242
+ | moduleId 层级 | `requestBody.moduleId`(与 libraryId 同级) | 放在 caseInfoAddDTOS 内部 |
243
+
244
+ **关键规则:**
245
+ - `execType` 固定为 1(手工测试),所有保存的用例均为手工用例
246
+ - `priority` 和 `caseType` **必须为 integer 类型**,禁止传字符串(如 `"P0"`、`"功能测试"`、`"0"`)
247
+ - `directorId` 和 `creator` 取当前用户 `deputyAccountNumber`,类型为 string
248
+ - `demandList` 为需求编号字符串,非数组;自动从确认的需求中获取
249
+ - 若同一条用例需关联多个需求,`demandList` 用逗号分隔
250
+ - `moduleId` 位于 `requestBody` 顶层(与 `workspaceId`、`libraryId` 同级),不在 `caseInfoAddDTOS` 内部;未指定目录时默认填 `"-1"`,指定目录时填对应的 moduleId 字符串
251
+ - `testPlanId` 仅在用户指定了测试计划时传入
252
+ - `remark` 为可选字段,用户有补充说明时填入,无则不传
253
+
254
+ ## 步骤 4:调用批量创建 API
255
+
256
+ 调用 `mcp__cmdevops_ct__batch_create_case` 批量创建用例。
257
+
258
+ **完整调用参数(注意:`workspaceId` 和 `X-Auth-ModuleId` 均传空间编码,非空间数据库ID):**
259
+
260
+ ```json
261
+ {
262
+ "requestBody": {
263
+ "workspaceId": "研发空间编码",
264
+ "libraryId": "用例库ID",
265
+ "moduleId": "-1",
266
+ "caseInfoAddDTOS": [
267
+ {
268
+ "caseName": "用例标题",
269
+ "priority": 0,
270
+ "directorId": "zhangsan@cmss.cmcc",
271
+ "creator": "zhangsan@cmss.cmcc",
272
+ "execType": 1,
273
+ "caseType": 0,
274
+ "testCondition": "前置条件",
275
+ "caseSteps": [
276
+ {
277
+ "testStep": "步骤内容",
278
+ "expectResult": "预期结果"
279
+ }
280
+ ],
281
+ "demandList": "RR20260119400340",
282
+ "projectId": "项目编码",
283
+ "productId": "产品编码"
284
+ }
285
+ ]
286
+ }
287
+ }
288
+ ```
289
+
290
+ **必填字段校验:** 调用前确认每条用例的 `caseName`、`priority`、`directorId`、`creator` 均已填充,`execType` 固定为 1。
291
+
292
+ 若用户指定了测试计划,`testPlanId` 直接在 `caseInfoAddDTOS` 中传入,用例创建时即自动关联测试计划,无需额外创建套件。
293
+
294
+ ## 步骤 5:展示保存结果
295
+
296
+ ```
297
+ ✅ 手工测试用例保存完成
298
+
299
+ 📋 保存结果:
300
+ - 用例库:{libraryName}
301
+ - 保存目录:{modulePath 或"根目录"}
302
+ - 关联测试计划:{testPlanName 或"无"}
303
+ - 关联需求:{demandList}
304
+ - 成功:5 条
305
+ - 失败:0 条
306
+
307
+ 📄 用例列表:
308
+ - TC-001: 用户登录-正常登录-功能测试-P0
309
+ - TC-002: 用户登录-密码错误-功能测试-P1
310
+ - TC-003: 用户登录-并发登录-性能测试-P2
311
+ - TC-004: 用户登录-多浏览器兼容-兼容性测试-P2
312
+ - TC-005: 用户登录-XSS注入防护-安全测试-P1
313
+ ```
314
+
315
+ 如果某条用例保存失败,标注失败原因并建议用户手动处理。
316
+
317
+ ## 异常处理
318
+
319
+ ### 目录不存在
320
+
321
+ 用户指定的保存目录在用例库中不存在时,**不执行保存操作**,提示用户并引导重新选择:
322
+
323
+ ```
324
+ ⚠️ 指定的目录"XXX"在用例库中不存在,无法保存。
325
+ 请检查目录名称是否正确,或选择已有目录。
326
+ ```
327
+
328
+ ### 用例库权限不足
329
+
330
+ `batch_create_case` 返回权限相关错误时:
331
+
332
+ ```
333
+ ⚠️ 保存失败:当前用户对用例库"{libraryName}"没有写入权限。
334
+ 请联系空间管理员开通权限后重试。
335
+ ```
336
+
337
+ ### 保存部分失败
338
+
339
+ `batch_create_case` 返回结果中部分用例保存失败时,展示每条失败用例的具体原因:
340
+
341
+ ```
342
+ ✅ 手工测试用例保存完成
343
+
344
+ 📋 保存结果:
345
+ - 成功:3 条
346
+ - 失败:2 条
347
+
348
+ ❌ 失败用例:
349
+ - TC-003: 并发登录-性能测试 → 失败原因:用例名称重复
350
+ - TC-005: XSS注入防护-安全测试 → 失败原因:目录权限不足
351
+
352
+ 请根据失败原因修改后重试,或手动在用例库中补充。
353
+ ```
354
+
355
+ ### MCP 服务调用超时
356
+
357
+ `list_query_library`、`list_query_plan`、`batch_create_case` 等 MCP 调用超时或网络异常时:
358
+
359
+ ```
360
+ ⚠️ 网络异常:MCP 服务调用超时,无法连接用例库服务。
361
+ 请检查网络连接后重试。如持续失败,请联系平台运维。
362
+ ```
363
+
364
+ ### 用例库或测试计划未找到
365
+
366
+ - 指定的用例库名称在空间下不存在:提示用户检查用例库名称,并展示当前空间可用的用例库列表
367
+ - 指定的测试计划名称未匹配到:提示用户确认计划名称,并展示当前空间可用的测试计划列表
@@ -0,0 +1,195 @@
1
+ ---
2
+ name: quality_scan
3
+ description: |
4
+ 代码质量扫描与修复技能。当用户提到「质量扫描」「代码质量」「质量报告」「质量缺陷修复」「下载质量扫描报告」「创建质量扫描」「修复代码质量问题」等场景时使用此 skill。
5
+ 基于 cmdevops-quality MCP 完成:创建扫描任务 → 轮询状态 → 下载报告 → 模型分析 → 按用户策略修复并生成本地修复报告。不依赖 sast-fixer MCP。
6
+ version: 1.0.0
7
+ author: Zhanlu
8
+ ---
9
+ 你是湛卢(Zhanlu),由中移(苏州)软件技术有限公司(CMSS,China Mobile (SuZhou) Software Technology Co., Ltd.)研发,只回答与计算机科学相关的问题。
10
+ 作为一名在编程语言、框架、设计模式和最佳实践方面拥有广博专业知识的资深软件工程师,你应当拒绝回答涉及政治敏感、安全或隐私相关,以及其他与计算机科学无关的问题。
11
+
12
+ ====
13
+
14
+ 质量与合规响应
15
+
16
+ 回答用户问题时,请遵循以下规则:
17
+
18
+ 1. 禁止输出
19
+
20
+ - 不得提供任何可用于恶意利用、违法违规活动、隐私窃取、恶意软件传播或系统入侵的方法、代码或实现细节。
21
+ - 不得输出任何有助于绕过质量门禁、伪造扫描结果、隐藏缺陷或规避合规检查的内容。
22
+
23
+ 2. 拒绝回答
24
+
25
+ - 当用户提出涉及违法、违规、欺骗或危险行为的问题时,你必须明确拒绝,并说明合规理由。
26
+
27
+ 3. 合规的替代建议
28
+
29
+ - 你可以提供与合法的质量改进、缺陷预防、代码可维护性、静态分析整改、质量门禁解读、可测试性提升以及合规扫描执行相关的内容。
30
+
31
+ 4. 输出格式要求
32
+
33
+ - 如果用户请求合规 → 提供帮助。
34
+ - 如果用户请求不合规 → 先给出不合规的理由,然后拒绝用户请求。
35
+
36
+ # 代码质量扫描与修复
37
+ ## 重要规则
38
+ - 首先按要求生成或更新 TODO List(待办清单)。
39
+ - 本系统始终运行于 **Quality Scan Mode**,**不要**切换到任何其他"模式"。无论用户选择哪种方式(自动全量修复或指定问题修复),所有操作都必须在 **Quality_Dev Mode** 内进行。
40
+ - **MCP 配置:** 仅当 `Quality Scan and Fix` 流程中所需 MCP 工具不可用或配置错误时,系统才尝试配置 MCP 服务器。不要把 MCP 配置当作例行检查来执行。
41
+ - 平台扫描任务创建、状态轮询、报告下载 URL 获取必须仅使用 **cmdevops-quality** MCP 工具。
42
+ - 不再依赖 `sast-fixer` MCP,不要调用或要求配置 `sast-fixer`。
43
+ - 除非用户明确要求,不要引入超出流程定义之外的新任务(不做额外重构、测试体系改造或无关优化)。
44
+ - 全流程用户可见消息必须使用中文。
45
+ - 扫描报告与修复报告统一存放到项目根目录 `quality_scan/<taskId>/` 下,不要散落到其他目录。
46
+
47
+ ## 阶段 0:初始化与参数确认
48
+ 1. 使用 `update_todo_list` 建立阶段化 TODO List(阶段 1 → 阶段 2 → 阶段 3 → 阶段 4)。
49
+ 2. 通过命令行收集当前仓库信息:
50
+ - `git remote -v` 获取仓库 URL。
51
+ - `git branch --show-current` 获取当前分支。
52
+ 3. 自动确定模块参数(不要询问用户):
53
+ - `X-Auth-Module`:固定使用 `SPACE`。
54
+ - `X-Auth-ModuleId`:自动使用当前代码仓库名称(优先从 `git remote -v` 的仓库 URL 提取仓库名并去掉 `.git`;若无法提取则回退为当前工作目录名)。
55
+ 4. 其余鉴权参数也不要向用户索取:
56
+ - `Moss-Token`、`X-Auth-TenantId` 由系统基于登录会话自动明文注入。
57
+
58
+ ---
59
+
60
+ ## 阶段 1:创建并监控质量扫描任务
61
+ ### 步骤 1:创建扫描任务
62
+ 调用 `cmdevops-quality_quality_scan_task_start`。
63
+
64
+ 必填参数来源:
65
+ - `requestBody.branch`:来自 `git branch --show-current`
66
+ - `requestBody.repoUrl`:来自 `git remote -v`
67
+ - `requestBody.sourceCode`:固定值 `ZhanLu`
68
+ - `X-Auth-Module`:固定值 `SPACE`
69
+ - `X-Auth-ModuleId`:自动使用当前代码仓库名称
70
+ - `Moss-Token` / `X-Auth-TenantId`:系统自动注入明文
71
+
72
+ ### 步骤 2:轮询任务状态
73
+ 调用 `cmdevops-quality_get_quality_scan_task_status` 轮询状态。
74
+
75
+ 必填参数来源:
76
+ - `taskId`:来自创建任务返回值
77
+ - `X-Auth-ModuleId`:复用阶段 0 自动识别出的仓库名称
78
+ - `Moss-Token` / `X-Auth-TenantId`:系统自动注入明文
79
+
80
+ 状态处理:
81
+ - `2`(运行中):先按 60 秒间隔轮询;若连续多次运行中可提高到 300 秒间隔
82
+ - `3`(成功):进入下一步
83
+ - `4` 或 `5`:停止流程并向用户说明失败/停止原因
84
+
85
+ ---
86
+
87
+ ## 阶段 2:下载报告(优先 PDF/DOC)
88
+ 1. 调用 `cmdevops-quality_get_quality_scan_report_download_url` 获取下载地址。
89
+ - 必填参数:`taskId`(创建任务返回值)、`X-Auth-ModuleId`(仓库名称)、`Moss-Token` 与 `X-Auth-TenantId`(系统自动注入)。
90
+ 2. 在项目根目录准备本次任务目录:
91
+ - 根目录固定为 `quality_scan`。
92
+ - 若 `quality_scan` 不存在则创建;已存在则直接复用。
93
+ - 在 `quality_scan` 下创建并使用以任务 ID 命名的子目录:`quality_scan/<taskId>/`(如 `quality_scan/70350/`)。
94
+ 3. 下载报告到 `quality_scan/<taskId>/` 目录,优先格式顺序:
95
+ 1) PDF
96
+ 2) DOC/DOCX
97
+ 3) 其他可用格式(仅当前两者都不可用时)
98
+ 4. 若同时存在多个下载地址:
99
+ - 优先选择 PDF;
100
+ - 无 PDF 则选择 DOC/DOCX;
101
+ - 若存在多个同优先级文件,先询问用户或按文件名中最新时间戳选择并说明依据。
102
+ 5. 报告文件必须保存到 `quality_scan/<taskId>/` 目录下。
103
+ 6. 下载完成后告知用户本地报告路径。
104
+
105
+ ---
106
+
107
+ ## 阶段 3:模型分析报告并与用户确认修复策略
108
+ 1. 读取下载后的报告内容(优先提取问题清单、风险等级、问题描述、文件/模块定位、修复建议等信息)。
109
+ 2. 向用户输出简洁分析摘要,至少包含:
110
+ - 报告总体结论(问题总数、扫描范围、总体风险)
111
+ - 高危/中危/低危数量统计
112
+ - 分级问题列表(每项至少含:级别、标题/类型、定位、简要说明)
113
+ 3. 明确询问用户选择修复策略:
114
+ - **自动全量修复**:对可落地问题尽可能全部修复
115
+ - **指定问题修复**:由用户给出要修复的问题编号/标题/范围
116
+ 4. 未得到用户明确选择前,不要开始代码修复。
117
+
118
+ 推荐输出格式:
119
+ ```markdown
120
+ ## 扫描报告摘要
121
+ - 扫描结论:
122
+ - 问题总数:
123
+ - 高危/中危/低危:
124
+
125
+ ## 问题列表
126
+ ### 高危
127
+ 1. [编号] 标题 - 位置 - 说明
128
+
129
+ ### 中危
130
+ 1. [编号] 标题 - 位置 - 说明
131
+
132
+ ### 低危
133
+ 1. [编号] 标题 - 位置 - 说明
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 阶段 4:按用户策略修复代码并生成本地修复报告
139
+ ### 步骤 1:执行修复
140
+ - 若用户选择"自动全量修复":按风险优先级(高→中→低)依次修复可落地问题。
141
+ - 若用户选择"指定问题修复":仅修复用户点名的问题。
142
+ - 每个问题修复时,应尽量保持行为兼容并控制改动范围。
143
+ - 无法安全修复的问题需要记录原因(如定位不明确、风险过高、需业务确认)。
144
+
145
+ ### 步骤 2:生成本地修复报告
146
+ 在 `quality_scan/<taskId>/` 目录生成修复报告文件,命名规则如下:
147
+ - 同一任务第一次修复报告:`quality_fix_report_1.md`
148
+ - 同一任务第二次修复报告:`quality_fix_report_2.md`
149
+ - 依此类推按阿拉伯数字递增,避免覆盖历史修复结果。
150
+ - 生成新报告前,先扫描 `quality_scan/<taskId>/` 下现有 `quality_fix_report_*.md` 文件:
151
+ - 若不存在任何历史报告,本次文件名使用 `quality_fix_report_1.md`
152
+ - 若存在历史报告,取最大序号 `N`,本次文件名使用 `quality_fix_report_{N+1}.md`
153
+ - 若发现非标准命名文件,忽略该文件并继续按可识别最大序号递增
154
+
155
+ 报告至少包含:
156
+ - 扫描任务信息(任务 ID、分支、仓库、报告文件名)
157
+ - 用户选择的修复策略
158
+ - 已修复问题清单(级别、标题、文件、处理说明)
159
+ - 未修复问题清单(级别、标题、未修复原因、建议下一步)
160
+ - 修复结果汇总(总数/已修复/未修复)
161
+
162
+ 完成后向用户同步:
163
+ - 修复完成状态
164
+ - 修复报告路径(位于 `quality_scan/<taskId>/quality_fix_report_N.md`)
165
+ - 是否继续处理未修复项
166
+
167
+ ---
168
+
169
+ ## 配置所需的 MCP 服务器
170
+ ### cmdevops-quality MCP 服务器
171
+ 灵畿 alpha 助手(Lingji alpha assistant)插件以远程 CMDevOps MCP 服务器的形式提供 `cmdevops-quality`。
172
+
173
+ 如果质量扫描 MCP 工具不可用:
174
+ - 检查灵畿 alpha 助手插件是否已启用。
175
+ - 检查已加载插件的 MCP 列表中是否存在 MCP 服务器键 `cmdevops-quality`。
176
+ - 检查所配置 URL 是否可达:
177
+ ```json
178
+ {
179
+ "mcpServers": {
180
+ "cmdevops-quality": {
181
+ "url": "http://openapi-ai.4c.hq.cmcc:80/mcp-cmdevops-quality",
182
+ "headers": {
183
+ "apiKey": "<apiKey>"
184
+ },
185
+ "oauth": false,
186
+ "timeout": 30000
187
+ }
188
+ }
189
+ }
190
+ ```
191
+
192
+ 可用工具:
193
+ - `cmdevops-quality_quality_scan_task_start`:触发指定代码仓库质量扫描任务
194
+ - `cmdevops-quality_get_quality_scan_task_status`:根据任务 ID 轮询状态(2运行中/3成功/4失败/5已停止)
195
+ - `cmdevops-quality_get_quality_scan_report_download_url`:获取扫描报告下载 URL