@epoint-testtech/ep-stage-skill 0.0.4-alpha.0 → 0.0.5

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 (206) hide show
  1. package/SKILL.md +27 -27
  2. package/codex-skill/ep-stage/glue-create-project/SKILL.md +223 -186
  3. package/codex-skill/ep-stage/glue-generate-testcase/SKILL.md +275 -199
  4. package/codex-skill/ep-stage/glue-generate-testcase/examples/observable-testcase.json +40 -40
  5. package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-schema.md +95 -112
  6. package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-tpl.md +72 -0
  7. package/codex-skill/ep-stage/glue-run-test/SKILL.md +292 -249
  8. package/codex-skill/ep-stage/glue-run-test/references/ai-runtime-loop.md +30 -0
  9. package/codex-skill/ep-stage/glue-run-test/references/crud-pipeline.md +132 -145
  10. package/codex-skill/ep-stage/glue-run-test/references/gap-review-protocol.md +44 -43
  11. package/codex-skill/ep-stage/glue-run-test/references/harness-principles.md +46 -46
  12. package/codex-skill/ep-stage/glue-run-test/references/playwright-cli-odav.md +166 -0
  13. package/codex-skill/ep-stage/glue-run-test/scripts/extract-page-elements-eval.mjs +233 -0
  14. package/codex-skill/ep-stage/glue-run-test/scripts/generate-crud-spec.mjs +149 -149
  15. package/codex-skill/ep-stage/page-element-scan/SKILL.md +91 -0
  16. package/codex-skill/ep-stage/page-element-scan/evals/evals.json +37 -0
  17. package/codex-skill/ep-stage/page-element-scan/evals/fixtures/sample-list-page.html +85 -0
  18. package/codex-skill/ep-stage/page-element-scan/references/pagination-controls.md +153 -0
  19. package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements-eval.mjs +233 -0
  20. package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements.mjs +298 -0
  21. package/codex-skill/ep-stage/page-element-scan/scripts/scan-page.mjs +749 -0
  22. package/codex-skill/ep-stage/recording-to-glue/SKILL.md +28 -28
  23. package/codex-skill/ep-stage/scripts/validate-skill.mjs +98 -95
  24. package/dist/src/cli/generate-testcase.d.ts +18 -51
  25. package/dist/src/cli/generate-testcase.d.ts.map +1 -1
  26. package/dist/src/cli/generate-testcase.js +127 -131
  27. package/dist/src/cli/index.d.ts +11 -2
  28. package/dist/src/cli/index.d.ts.map +1 -1
  29. package/dist/src/cli/index.js +49 -16
  30. package/dist/src/cli/probe.d.ts +2 -0
  31. package/dist/src/cli/probe.d.ts.map +1 -1
  32. package/dist/src/cli/probe.js +239 -13
  33. package/dist/src/cli/run.d.ts +136 -29
  34. package/dist/src/cli/run.d.ts.map +1 -1
  35. package/dist/src/cli/run.js +494 -65
  36. package/dist/src/cli/spec.d.ts +18 -11
  37. package/dist/src/cli/spec.d.ts.map +1 -1
  38. package/dist/src/cli/spec.js +74 -20
  39. package/dist/src/contracts/crud-business-module.d.ts +6 -0
  40. package/dist/src/contracts/crud-business-module.d.ts.map +1 -1
  41. package/dist/src/contracts/glue-contract-v1.d.ts +98 -0
  42. package/dist/src/contracts/glue-contract-v1.d.ts.map +1 -0
  43. package/dist/src/contracts/glue-contract-v1.js +9 -0
  44. package/dist/src/contracts/inference-trace.d.ts +223 -0
  45. package/dist/src/contracts/inference-trace.d.ts.map +1 -0
  46. package/dist/src/contracts/inference-trace.js +12 -0
  47. package/dist/src/contracts/observable-chain.d.ts +4 -0
  48. package/dist/src/contracts/observable-chain.d.ts.map +1 -1
  49. package/dist/src/extractors/code-list-json5.d.ts +192 -0
  50. package/dist/src/extractors/code-list-json5.d.ts.map +1 -0
  51. package/dist/src/extractors/code-list-json5.js +91 -0
  52. package/dist/src/extractors/code-list.d.ts +3 -3
  53. package/dist/src/extractors/code-list.d.ts.map +1 -1
  54. package/dist/src/extractors/code-list.js +46 -11
  55. package/dist/src/extractors/html-page.d.ts +9 -0
  56. package/dist/src/extractors/html-page.d.ts.map +1 -1
  57. package/dist/src/extractors/html-page.js +26 -2
  58. package/dist/src/extractors/prd-extractor.d.ts +70 -0
  59. package/dist/src/extractors/prd-extractor.d.ts.map +1 -0
  60. package/dist/src/extractors/prd-extractor.js +248 -0
  61. package/dist/src/generators/agent-inferred-workflow-script.js +66 -66
  62. package/dist/src/generators/stage-skeleton-script.d.ts +87 -20
  63. package/dist/src/generators/stage-skeleton-script.d.ts.map +1 -1
  64. package/dist/src/generators/stage-skeleton-script.js +656 -238
  65. package/dist/src/index.d.ts +7 -2
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +3 -1
  68. package/dist/src/inference/module-hints-inference.d.ts +30 -0
  69. package/dist/src/inference/module-hints-inference.d.ts.map +1 -0
  70. package/dist/src/inference/module-hints-inference.js +363 -0
  71. package/dist/src/inference/source-analysis.d.ts +26 -0
  72. package/dist/src/inference/source-analysis.d.ts.map +1 -0
  73. package/dist/src/inference/source-analysis.js +258 -0
  74. package/dist/src/normalizers/crud-contract.d.ts +3 -0
  75. package/dist/src/normalizers/crud-contract.d.ts.map +1 -1
  76. package/dist/src/normalizers/crud-contract.js +3 -0
  77. package/dist/src/runtime/ai-runtime-trace.d.ts +88 -0
  78. package/dist/src/runtime/ai-runtime-trace.d.ts.map +1 -0
  79. package/dist/src/runtime/ai-runtime-trace.js +119 -0
  80. package/dist/src/testcase/button-interaction-inference.d.ts +37 -0
  81. package/dist/src/testcase/button-interaction-inference.d.ts.map +1 -0
  82. package/dist/src/testcase/button-interaction-inference.js +385 -0
  83. package/dist/src/testcase/contract-testcase-assembler.d.ts +44 -0
  84. package/dist/src/testcase/contract-testcase-assembler.d.ts.map +1 -0
  85. package/dist/src/testcase/contract-testcase-assembler.js +806 -0
  86. package/dist/src/testcase/prd-button-mapper.d.ts +72 -0
  87. package/dist/src/testcase/prd-button-mapper.d.ts.map +1 -0
  88. package/dist/src/testcase/prd-button-mapper.js +148 -0
  89. package/dist/src/testcase/runtime-context.d.ts +9 -0
  90. package/dist/src/testcase/runtime-context.d.ts.map +1 -0
  91. package/dist/src/testcase/runtime-context.js +1 -0
  92. package/dist/src/testcase/test-access.d.ts +38 -0
  93. package/dist/src/testcase/test-access.d.ts.map +1 -0
  94. package/dist/src/testcase/test-access.js +106 -0
  95. package/dist/src/testcase/testcase-execution-fields.d.ts +10 -0
  96. package/dist/src/testcase/testcase-execution-fields.d.ts.map +1 -0
  97. package/dist/src/testcase/testcase-execution-fields.js +1 -0
  98. package/dist/src/testcase/testcase-generator.d.ts.map +1 -1
  99. package/dist/src/testcase/testcase-generator.js +6 -0
  100. package/dist/src/testcase/testcase-markdown.d.ts +11 -0
  101. package/dist/src/testcase/testcase-markdown.d.ts.map +1 -0
  102. package/dist/src/testcase/testcase-markdown.js +181 -0
  103. package/dist/src/testcase/testcase-skeleton.d.ts +4 -0
  104. package/dist/src/testcase/testcase-skeleton.d.ts.map +1 -1
  105. package/dist/src/testcase/testcase-spec-assembly.d.ts +4 -0
  106. package/dist/src/testcase/testcase-spec-assembly.d.ts.map +1 -1
  107. package/dist/src/testcase/testcase-v1-draft.d.ts +58 -0
  108. package/dist/src/testcase/testcase-v1-draft.d.ts.map +1 -0
  109. package/dist/src/testcase/testcase-v1-draft.js +13 -0
  110. package/dist/src/validation/contract.d.ts +14 -0
  111. package/dist/src/validation/contract.d.ts.map +1 -0
  112. package/dist/src/validation/contract.js +132 -0
  113. package/dist/src/validation/credentials.d.ts +7 -2
  114. package/dist/src/validation/credentials.d.ts.map +1 -1
  115. package/dist/src/validation/credentials.js +15 -4
  116. package/dist/src/validation/index.d.ts +2 -0
  117. package/dist/src/validation/index.d.ts.map +1 -1
  118. package/dist/src/validation/index.js +2 -0
  119. package/dist/src/validation/inference-trace.d.ts +13 -0
  120. package/dist/src/validation/inference-trace.d.ts.map +1 -0
  121. package/dist/src/validation/inference-trace.js +31 -0
  122. package/dist/src/validation/testcase.d.ts +9 -7
  123. package/dist/src/validation/testcase.d.ts.map +1 -1
  124. package/dist/src/validation/testcase.js +181 -34
  125. package/docs/README.md +124 -134
  126. package/docs/mvp-usage-guide.md +298 -298
  127. package/examples/schemeresource-observable-docs/schemeresource.context.md +20 -20
  128. package/examples/schemeresource.module-hints.json +38 -38
  129. package/examples/schemeresource.observable.code_list.md +37 -37
  130. package/examples/zwplace-observable-docs/zwplace.context.md +16 -16
  131. package/examples/zwplace-placecategory-validation.json +29 -29
  132. package/examples/zwplace.module-hints.json +69 -69
  133. package/examples/zwplace.observable.code_list.md +37 -37
  134. package/package.json +2 -2
  135. package/dist/test/cli/extract-contract.test.d.ts +0 -2
  136. package/dist/test/cli/extract-contract.test.d.ts.map +0 -1
  137. package/dist/test/cli/extract-contract.test.js +0 -32
  138. package/dist/test/cli/generate-testcase.test.d.ts +0 -2
  139. package/dist/test/cli/generate-testcase.test.d.ts.map +0 -1
  140. package/dist/test/cli/generate-testcase.test.js +0 -130
  141. package/dist/test/cli/index.test.d.ts +0 -2
  142. package/dist/test/cli/index.test.d.ts.map +0 -1
  143. package/dist/test/cli/index.test.js +0 -93
  144. package/dist/test/cli/run.test.d.ts +0 -2
  145. package/dist/test/cli/run.test.d.ts.map +0 -1
  146. package/dist/test/cli/run.test.js +0 -149
  147. package/dist/test/cli/spec.test.d.ts +0 -2
  148. package/dist/test/cli/spec.test.d.ts.map +0 -1
  149. package/dist/test/cli/spec.test.js +0 -196
  150. package/dist/test/crud-contract.test.d.ts +0 -2
  151. package/dist/test/crud-contract.test.d.ts.map +0 -1
  152. package/dist/test/crud-contract.test.js +0 -819
  153. package/dist/test/gap-inference.test.d.ts +0 -2
  154. package/dist/test/gap-inference.test.d.ts.map +0 -1
  155. package/dist/test/gap-inference.test.js +0 -597
  156. package/dist/test/generalization.test.d.ts +0 -2
  157. package/dist/test/generalization.test.d.ts.map +0 -1
  158. package/dist/test/generalization.test.js +0 -73
  159. package/dist/test/material-inventory.test.d.ts +0 -2
  160. package/dist/test/material-inventory.test.d.ts.map +0 -1
  161. package/dist/test/material-inventory.test.js +0 -141
  162. package/dist/test/observable-chain.test.d.ts +0 -2
  163. package/dist/test/observable-chain.test.d.ts.map +0 -1
  164. package/dist/test/observable-chain.test.js +0 -123
  165. package/dist/test/observable-pipeline.test.d.ts +0 -2
  166. package/dist/test/observable-pipeline.test.d.ts.map +0 -1
  167. package/dist/test/observable-pipeline.test.js +0 -461
  168. package/dist/test/page-structure.test.d.ts +0 -2
  169. package/dist/test/page-structure.test.d.ts.map +0 -1
  170. package/dist/test/page-structure.test.js +0 -45
  171. package/dist/test/scenario-inference.test.d.ts +0 -2
  172. package/dist/test/scenario-inference.test.d.ts.map +0 -1
  173. package/dist/test/scenario-inference.test.js +0 -73
  174. package/dist/test/stage-context.test.d.ts +0 -2
  175. package/dist/test/stage-context.test.d.ts.map +0 -1
  176. package/dist/test/stage-context.test.js +0 -395
  177. package/dist/test/testcase-generator.test.d.ts +0 -2
  178. package/dist/test/testcase-generator.test.d.ts.map +0 -1
  179. package/dist/test/testcase-generator.test.js +0 -276
  180. package/dist/test/testcase-skeleton.test.d.ts +0 -2
  181. package/dist/test/testcase-skeleton.test.d.ts.map +0 -1
  182. package/dist/test/testcase-skeleton.test.js +0 -185
  183. package/dist/test/testcase-spec-assembly.test.d.ts +0 -2
  184. package/dist/test/testcase-spec-assembly.test.d.ts.map +0 -1
  185. package/dist/test/testcase-spec-assembly.test.js +0 -105
  186. package/dist/test/util/credentials.test.d.ts +0 -2
  187. package/dist/test/util/credentials.test.d.ts.map +0 -1
  188. package/dist/test/util/credentials.test.js +0 -64
  189. package/dist/test/util/i18n-testcase.test.d.ts +0 -2
  190. package/dist/test/util/i18n-testcase.test.d.ts.map +0 -1
  191. package/dist/test/util/i18n-testcase.test.js +0 -119
  192. package/dist/test/util/softlink.test.d.ts +0 -2
  193. package/dist/test/util/softlink.test.d.ts.map +0 -1
  194. package/dist/test/util/softlink.test.js +0 -82
  195. package/dist/test/validation/credentials.test.d.ts +0 -2
  196. package/dist/test/validation/credentials.test.d.ts.map +0 -1
  197. package/dist/test/validation/credentials.test.js +0 -72
  198. package/dist/test/validation/projects-index.test.d.ts +0 -2
  199. package/dist/test/validation/projects-index.test.d.ts.map +0 -1
  200. package/dist/test/validation/projects-index.test.js +0 -48
  201. package/dist/test/validation/testcase.test.d.ts +0 -2
  202. package/dist/test/validation/testcase.test.d.ts.map +0 -1
  203. package/dist/test/validation/testcase.test.js +0 -129
  204. package/dist/vitest.config.d.ts +0 -3
  205. package/dist/vitest.config.d.ts.map +0 -1
  206. package/dist/vitest.config.js +0 -7
@@ -1,112 +1,95 @@
1
- # glue-testcase schema (v2)
2
-
3
- `testcase.json5` 顶层 schema:
4
-
5
- ```json5
6
- {
7
- schemaVersion: "v2",
8
- scenario: "crud", // ★ v2 新增(REQ-SCENE-01):场景类型。**由 testcase 子命令运行时决定后写入此字段**(产物,非输入)。决策优先级:①--scenario CLI 参数 ②ModuleHints 推断 ③默认 "crud"
9
- moduleId: "zwplace",
10
- moduleName: "场所窗口信息管理",
11
- menuPath: "场所窗口信息管理>场所窗口信息列表", // ★ v2 新增(REQ-MENU-01):从 code_list.md 搬到 testcase 扎口
12
-
13
- // ★ v2 新增:上游推断的需求系统/角色集
14
- requiredSystems: [
15
- { url: "http://192.168.x.x:8100/.../login", systemName: "主业务系统" }
16
- ],
17
- requiredRoles: [
18
- { role: "admin", hint: "默认操作员" }
19
- ],
20
-
21
- // ★ v2 新增:骨架命中清单(run 阶段直接组装)
22
- // evidence 格式约定:<kind>=<ref>,kind ∈ {html, java, spec, contract, skeleton, hint}
23
- coveredActions: [
24
- {
25
- actionId: "zwplace.create",
26
- kind: "create",
27
- evidence: [
28
- "html=src/main/webapp/.../gxhzwplaceadd.html",
29
- "java=src/main/java/.../ZwplaceAction.java"
30
- ]
31
- },
32
- { actionId: "zwplace.read", kind: "read", evidence: ["html=src/main/webapp/.../gxhzwplacelist.html", "java=..."] },
33
- { actionId: "zwplace.update", kind: "update", evidence: ["html=...", "java=..."] },
34
- { actionId: "zwplace.delete", kind: "delete", evidence: ["html=...", "java=..."] }
35
- ],
36
-
37
- // ★ v2 新增:骨架未命中候选(run 阶段 AI 推理)
38
- uncoveredCandidates: [
39
- {
40
- actionId: "zwplace.sync",
41
- label: "同步窗口管理系统",
42
- status: "planned", // planned | candidate | unresolved | resolved
43
- requiredRole: "admin", // ★ v2 新增:AI 推理时知道用哪个角色操作
44
- businessIntent: "同步窗口数据",
45
- assertionExpectation: "同步完成提示",
46
- evidence: ["html=...", "hint=ModuleHints.customWorkflows.zwplace.sync"]
47
- }
48
- ],
49
-
50
- // 既有 v1 字段(cases 内部行为不变)
51
- cases: [
52
- {
53
- caseId: "zwplace.create",
54
- title: "新增场所窗口信息管理",
55
- scenario: "crud.single-page",
56
- reviewStatus: "confirmed", // v1 字段保留:confirmed | needs_review | blocked
57
- requiredRole: "admin", // ★ v2 新增:该用例由哪个角色操作
58
- evidence: ["skeleton=crud.skeleton-testcase/v1", "contract=crud-business-module/v1"],
59
- steps: ["进入菜单", "点击新增", "填写并保存测试数据"],
60
- assertions: ["新增后可查询到记录"],
61
- unresolved: []
62
- }
63
- ],
64
-
65
- reasoningSummary: {
66
- conclusion: "生成 4 条 CRUD 胶水测试用例。",
67
- evidenceChain: [],
68
- alternatives: ["crud.single-page"],
69
- confidence: "high",
70
- risks: [],
71
- needsHumanReview: false
72
- }
73
- }
74
- ```
75
-
76
- ## v1 → v2 升级点
77
-
78
- - 顶层新增 `schemaVersion: "v2"`
79
- - 顶层新增 `scenario`(REQ-SCENE-01)
80
- - 顶层新增 `menuPath`(REQ-MENU-01 修订)
81
- - 顶层新增 `requiredSystems[]` / `requiredRoles[]`
82
- - 顶层新增 `coveredActions[]` / `uncoveredCandidates[]`(钻探产物前移)
83
- - `cases[]` 新增 `requiredRole`
84
- - `uncoveredCandidates[]` 新增 `requiredRole`
85
- - `evidence` 字段格式约定 `<kind>=<ref>`
86
- - **顶层不引入** `reviewStatus`(REQ-DATA-04);仅 `cases[].reviewStatus` 保留
87
-
88
- ## 字段说明(v2 新增字段)
89
-
90
- - `schemaVersion`:必为字符串 `"v2"`。Task 1.1 `validateTestcase` 强制校验;其他值或缺失会拒绝并提示重跑 `glue-generate-testcase`。
91
- - `scenario`:场景类型(**产物**,非输入)。由 testcase 子命令运行时按 3 档优先级决定:① CLI `--scenario` 显式参数 → ② 从 `ModuleHints` 推断 默认 `"crud"`。本轮仅支持 `"crud"`;未来 `"statistic"` / `"approval"` 等场景扩展时不增加新 CLI 命令,仅扩展 testcase 内部分发(REQ-SCENE-01)。
92
- - `menuPath`:菜单路径,从 `code_list.md` 搬到 testcase 扎口(REQ-MENU-01 修订)。glue-run-test spec 子命令从此读取,不再从 code_list 二次解析。
93
- - `requiredSystems[]`:上游钻探推断的需求涉及的系统集,每项 `{ url, systemName? }`。驱动 `credentials.template.json5` 生成 + 引导用户在 glue-generate-testcase 第 5 步交互确认(REQ-UX-02)。
94
- - `requiredRoles[]`:上游钻探推断的需求涉及的角色集,每项 `{ role, hint? }`。同上驱动 template + 确认。
95
- - `coveredActions[]`:骨架命中清单。run 阶段直接组装胶水部分 spec,按 `evidence` 引用源码与契约。
96
- - `uncoveredCandidates[]`:骨架未命中候选;`status` 取 `planned`(可进 AI 推理)/ `candidate`(不得进 spec,要求补 hints)/ `unresolved`(缺证据)/ `resolved`(已通过推理)。
97
- - `uncoveredCandidates[].requiredRole`:AI 推理时该动作由哪个角色操作(多角色场景必需)。
98
- - `cases[].requiredRole`:该用例由哪个角色操作。spec 子命令据此映射 credentials.json5 + cases 登录切换。
99
- - `evidence`:字符串数组,每项格式 `<kind>=<ref>`。`kind` ∈ `{html, java, spec, contract, skeleton, hint}`。
100
-
101
- ## 既有 v1 字段说明(保留语义)
102
-
103
- - `cases[].reviewStatus`:`confirmed` / `needs_review` / `blocked`。`needs_review` 的用例不得进入 spec assembly(run 阶段按 case 粒度阻断)。
104
- - `caseId`:spec assembly 需要与生成脚本工作流粒度一致。CRUD 用例固定为 `<moduleId>.create` / `.read` / `.update` / `.delete`。
105
- - `unresolved`:未确认项(如嵌套 CRUD 子表保存后断言)。必须落盘,不能只在对话解释。
106
- - `reasoningSummary`:与 `.stage/trace/<run-id>/testcase-generation.json` 同构。
107
-
108
- ## Schema 演化策略
109
-
110
- - 破坏性升级走 major 版本号(如 v2 → v3)
111
- - CLI 读取时校验 `schemaVersion`:不匹配抛结构化错误(含期望版本 + 修复建议「重跑 `glue-generate-testcase <需求路径>`」)
112
- - 顶层 `reviewStatus` 字段**永远不引入**(REQ-DATA-04);审阅意见请直接在 `testcase.json5` 加 JSON5 `// 注释`
1
+ # testcase.json5 schema v1-draft
2
+
3
+ `testcase.json5` 是测试意图账本,由 `/glue-generate-testcase` 基于 `code_list.json5` 和 `contract.json5` 生成,供 `/glue-run-test` 的 `spec` / `run` 消费。
4
+
5
+ ## 顶层结构
6
+
7
+ ```json5
8
+ {
9
+ schemaVersion: 'ep-stage-testcase/v1-draft',
10
+ testcaseId: 'zwplace-testcase',
11
+ contractRef: '.ep-stage/contract.json5',
12
+ scenario: 'crud_export',
13
+ moduleId: 'zwplace',
14
+ moduleName: '场所窗口信息管理',
15
+
16
+ // 可选历史展示字段;新链路不要求 menuPath,directUrl/route 由 contract + runtime 配置解决。
17
+ menuPath: undefined,
18
+ runtimeContext: {
19
+ testProjectDir: '/abs/path/to/glue-project',
20
+ caseDir: '/abs/path/to/glue-project/src/tests/014-测试需求10-20260622',
21
+ specPath: '/abs/path/to/glue-project/src/tests/014-测试需求10-20260622/crud.spec.ts',
22
+ },
23
+ testAccess: {
24
+ systems: [
25
+ {
26
+ systemName: '政务系统',
27
+ loginUrl: 'https://example.com/login',
28
+ roles: [
29
+ {
30
+ role: '业务管理员',
31
+ username: 'qa-admin',
32
+ password: 'plain-text-for-dev',
33
+ permissions: ['新增', '修改', '删除', '导出'],
34
+ },
35
+ ],
36
+ },
37
+ ],
38
+ },
39
+
40
+ cases: [
41
+ {
42
+ caseId: 'zwplace-placename-create',
43
+ title: '场所名称-新增',
44
+ generationStrategy: 'glue',
45
+ coverageStatus: 'covered',
46
+ reviewStatus: 'confirmed',
47
+ queryKey: '场所名称',
48
+ precondition: '使用具备权限的测试角色登录系统并进入目标列表页',
49
+ steps: '按查询主键完成新增、查询、编辑、删除或导出流程',
50
+ assertion: '按查询主键、列表结果或导出行为验证执行结果',
51
+ },
52
+ ],
53
+
54
+ uncoveredCandidates: [
55
+ {
56
+ caseId: 'businessState.transitions',
57
+ label: '状态流转',
58
+ generationStrategy: 'ai',
59
+ coverageStatus: 'gap',
60
+ requiredRole: '业务管理员',
61
+ businessIntent: '覆盖在用不可删除等业务规则边界',
62
+ assertionExpectation: '在用状态场所执行删除时应被业务规则阻断',
63
+ queryKey: '不适用',
64
+ precondition: '使用角色:业务管理员',
65
+ steps: '按 AI Runtime Task 观察页面并执行:覆盖在用不可删除等业务规则边界',
66
+ assertion: '在用状态场所执行删除时应被业务规则阻断',
67
+ },
68
+ {
69
+ caseId: 'statisticsDashboard',
70
+ label: '统计看板(无入口)',
71
+ generationStrategy: 'ai',
72
+ coverageStatus: 'blocked',
73
+ requiredRole: '业务管理员',
74
+ businessIntent: 'code_list.json5 标记 PRD 提到统计大屏,但本次出码未发现对应实现文件',
75
+ assertionExpectation: '运行态推理若仍无入口则记录 blocked,不生成胶水骨架步骤',
76
+ queryKey: '不适用',
77
+ precondition: '使用角色:业务管理员',
78
+ steps: '按 AI Runtime Task 观察页面并执行:code_list.json5 标记 PRD 提到统计大屏,但本次出码未发现对应实现文件',
79
+ assertion: '运行态推理若仍无入口则记录 blocked,不生成胶水骨架步骤',
80
+ },
81
+ ],
82
+ }
83
+ ```
84
+
85
+ ## 约束
86
+
87
+ - 顶层可选写入 `runtimeContext`,字段固定为 `testProjectDir / caseDir / specPath`,供 `glue-run-test` 直接定位工程与 spec。
88
+ - 顶层可选写入 `testAccess`,结构为 `systems[].{systemName, loginUrl?, roles[]}`;`roles[]` 字段固定为 `role / username? / password? / permissions[]`。
89
+ - 当前开发调试阶段允许把 `username / password` 明文写入 `testcase.json5.testAccess`,便于 generate → run 直接串联;`credentials.json5` 仅作为兼容兜底与人工补齐入口。
90
+ - `cases[]` 只承载 `generationStrategy: 'glue'`。
91
+ - `cases[]` 中正式执行字段为 `queryKey / precondition / steps / assertion`,缺任一字段都不应再视为最新结构。
92
+ - `uncoveredCandidates[]` 只承载 `generationStrategy: 'ai'`,同时也必须携带 `queryKey / precondition / steps / assertion` 执行字段。
93
+ - 缺入口、缺权限、缺运行态数据等阻断状态用 `coverageStatus: 'blocked'` 表达,不再引入 `manual` 生成策略。
94
+ - `menuPath` 不是必填字段;不要从 `code_list.json5` 或历史菜单字段反推为必需导航入口。
95
+ - `testcase.md` 只是人审视图,事实源仍是 `testcase.json5`。
@@ -0,0 +1,72 @@
1
+ <!--
2
+ testcase.md 渲染模板(AI 用)。
3
+
4
+ 用法(由 glue-generate-testcase SKILL Step 6 驱动):
5
+ - 数据源:`<需求名>/testcase.json5`(cases 结构 = 事实源) + `<需求名>/.ep-stage/contract.json`(业务槽位)+ `<需求名>/credentials.json5`(环境信息)
6
+ - AI 按本模板渲染 testcase.md,重跑覆盖
7
+ - 忠实性约束:cases 数量 / caseId / title / reviewStatus / requiredRole 必须**逐字**取自 testcase.json5;步骤/断言/前置条件中的具体槽位标签(菜单/列表页/按钮文字/查询字段)必须**逐字**取自 contract.json,AI 只组织自然语言句式,不得新增/捏造 contract 没有的槽位
8
+
9
+ 下面是格式骨架。`{{...}}` 是占位,AI 渲染时全部替换;不要把这段说明注释写进产出的 testcase.md。
10
+ -->
11
+
12
+ ---
13
+ schemaVersion: {{testcase.schemaVersion}} # 取自 testcase.json5 顶层
14
+ scenario: {{testcase.scenario}} # 取自 testcase.json5 顶层
15
+ moduleId: {{testcase.moduleId}} # 取自 testcase.json5 顶层
16
+ contractVersion: {{contract.contractVersion}} # 取自 contract.json
17
+ ---
18
+
19
+ # {{testcase.moduleName}}胶水测试用例
20
+
21
+ ## 环境信息
22
+
23
+ - 登录地址:{{credentials[0].url}}
24
+ - 登录账号:{{credentials[0].username}}
25
+ - 登录密码:(已配置在 credentials.json5,不在此展示)
26
+ - 菜单路由:{{testcase.menuPath || "(未填写,待 testcase.json5 审阅补齐)"}}
27
+ - 列表页:{{contract.pages.list.title}}
28
+ - 查询字段:{{contract.flows.search.searchField.label}}
29
+ - 操作角色:{{testcase.requiredRoles[0].role}}
30
+ - 未解析槽位:{{contract.unresolvedSlots.length > 0 ? contract.unresolvedSlots.map(s => s.slotId).join("、") : "无"}}
31
+
32
+ ## CRUD 冒烟用例
33
+
34
+ | 用例 ID | 标题 | 前置条件 | 步骤 | 断言 |
35
+ |---|---|---|---|---|
36
+ | {{case.caseId}} | {{case.title}} | {{case.preconditions}} | {{case.steps_joined}} | {{case.assertions_joined}} |
37
+
38
+ <!--
39
+ 说明(仅供 AI 渲染时参考,不写入产出 md):
40
+
41
+ 「步骤」「断言」「前置条件」列的填充规则——
42
+
43
+ cases[].steps / cases[].assertions 当前若为占位(如「执行 create 主流程(详见 .spec.ts)」、「验证 create 完成后业务断言」),
44
+ AI 应该**基于 contract.json 槽位组装具体的自然语言表述**:
45
+
46
+ - create 步骤(caseId 含 .create):`进入菜单 {testcase.menuPath || "<未填写菜单>"};确认列表页 {contract.pages.list.title};点击 {contract.flows.create.entryButton.label};填写 {contract.dataKey.label} 等字段;点击 {contract.flows.create.saveButton.label}`
47
+ - create 断言:`新增后可在 {contract.pages.list.title} 按 {contract.flows.search.searchField.label} 查询到记录`
48
+ - create 前置条件:`已登录并进入 {testcase.menuPath || "<未填写菜单>"}`
49
+
50
+ - read 步骤(caseId 含 .read):`进入菜单 {testcase.menuPath || "<未填写菜单>"};按查询字段:{contract.flows.search.searchField.label} 输入测试值;点击 {contract.flows.search.submitControl.label}`
51
+ - read 断言:`查询结果包含 {contract.flows.search.searchField.label} 对应的测试记录`
52
+ - read 前置条件:`已存在可查询测试数据`
53
+
54
+ - update 步骤(caseId 含 .update):`在 {contract.pages.list.title} 中定位测试记录;点击 {contract.flows.update.entryAction.label};修改 {contract.dataKey.label} 字段;点击 {contract.flows.update.saveButton.label}`
55
+ - update 断言:`修改后可按 {contract.flows.search.searchField.label} 查询到更新后的记录`
56
+ - update 前置条件:`已定位到待修改记录`
57
+
58
+ - delete 步骤(caseId 含 .delete):`在 {contract.pages.list.title} 中定位测试记录;点击 {contract.flows.delete.entryButton.label};按契约策略 {contract.flows.delete.expectedOutcome} 确认删除结果`
59
+ - delete 断言:`删除结果符合 contract.flows.delete.expectedOutcome={contract.flows.delete.expectedOutcome} 的预期`
60
+ - delete 前置条件:`已定位到待删除记录`
61
+
62
+ - 非 CRUD 用例(uncoveredCandidates 转入的 candidate / planned 用例):AI 按 testcase.json5 cases[].businessIntent + assertionExpectation 直译;缺时填「待人工补充」,不发挥
63
+
64
+ testcase.json5 的 cases[].evidence 不展示在 md 表格(人审不需要技术性溯源);
65
+ 若 testcase.json5 cases 数量为 0,testcase.md 表格只保留表头,下方追加一段说明「本需求未生成任何用例,请审阅 .ep-stage/inference-trace.json 排查」。
66
+ -->
67
+
68
+ ## 审阅引导
69
+
70
+ 1. 表格中**步骤、断言列若仍含占位**(如「执行 X 主流程」),表示 contract.json 对应槽位证据不足;请检查 `.ep-stage/inference-trace.json` 的 `moduleHintsInference.unresolved` 与 `contract.json.unresolvedSlots`,补齐后重跑。
71
+ 2. 如对推断步骤/断言不认可,**修改 `testcase.json5` 的 cases[] 字段**(非本 md 文件),重跑 `/glue-generate-testcase` 重新渲染本 md。
72
+ 3. 凭据信息在 `credentials.json5`;登录密码不显示在本审阅视图。