@epoint-testtech/ep-stage-skill 0.0.9 → 0.5.0-alpha.2

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 (158) hide show
  1. package/SKILL.md +27 -27
  2. package/codex-skill/ep-stage/glue-create-project/SKILL.md +223 -223
  3. package/codex-skill/ep-stage/glue-generate-testcase/SKILL.md +275 -275
  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 -95
  6. package/codex-skill/ep-stage/glue-run-test/SKILL.md +273 -296
  7. package/codex-skill/ep-stage/glue-run-test/references/ai-runtime-loop.md +30 -30
  8. package/codex-skill/ep-stage/glue-run-test/references/crud-pipeline.md +132 -132
  9. package/codex-skill/ep-stage/glue-run-test/references/gap-review-protocol.md +44 -44
  10. package/codex-skill/ep-stage/glue-run-test/references/harness-principles.md +46 -46
  11. package/codex-skill/ep-stage/glue-run-test/references/playwright-cli-odav.md +127 -166
  12. package/codex-skill/ep-stage/glue-run-test/scripts/generate-crud-spec.mjs +149 -149
  13. package/codex-skill/ep-stage/recording-to-glue/SKILL.md +28 -28
  14. package/codex-skill/ep-stage/scripts/validate-skill.mjs +95 -98
  15. package/dist/src/cli/generate-testcase.d.ts +0 -1
  16. package/dist/src/cli/generate-testcase.d.ts.map +1 -1
  17. package/dist/src/cli/generate-testcase.js +1 -6
  18. package/dist/src/cli/index.d.ts.map +1 -1
  19. package/dist/src/cli/index.js +14 -38
  20. package/dist/src/cli/run.d.ts +0 -2
  21. package/dist/src/cli/run.d.ts.map +1 -1
  22. package/dist/src/cli/run.js +21 -70
  23. package/dist/src/cli/spec.d.ts.map +1 -1
  24. package/dist/src/cli/spec.js +0 -9
  25. package/dist/src/contracts/glue-contract-v1.d.ts +0 -35
  26. package/dist/src/contracts/glue-contract-v1.d.ts.map +1 -1
  27. package/dist/src/extractors/code-list-json5.d.ts +1 -34
  28. package/dist/src/extractors/code-list-json5.d.ts.map +1 -1
  29. package/dist/src/extractors/code-list-json5.js +0 -1
  30. package/dist/src/extractors/html-page.d.ts +0 -9
  31. package/dist/src/extractors/html-page.d.ts.map +1 -1
  32. package/dist/src/extractors/html-page.js +2 -26
  33. package/dist/src/generators/agent-inferred-workflow-script.js +66 -66
  34. package/dist/src/generators/stage-skeleton-script.d.ts +0 -50
  35. package/dist/src/generators/stage-skeleton-script.d.ts.map +1 -1
  36. package/dist/src/generators/stage-skeleton-script.js +116 -449
  37. package/dist/src/runtime/ai-runtime-trace.d.ts.map +1 -1
  38. package/dist/src/runtime/ai-runtime-trace.js +0 -8
  39. package/dist/src/testcase/contract-testcase-assembler.d.ts +0 -28
  40. package/dist/src/testcase/contract-testcase-assembler.d.ts.map +1 -1
  41. package/dist/src/testcase/contract-testcase-assembler.js +75 -329
  42. package/dist/src/validation/contract.d.ts.map +1 -1
  43. package/dist/src/validation/contract.js +0 -29
  44. package/dist/test/cli/generate-testcase-json5.test.d.ts +2 -0
  45. package/dist/test/cli/generate-testcase-json5.test.d.ts.map +1 -0
  46. package/dist/test/cli/generate-testcase-json5.test.js +154 -0
  47. package/dist/test/cli/index.test.d.ts +2 -0
  48. package/dist/test/cli/index.test.d.ts.map +1 -0
  49. package/dist/test/cli/index.test.js +114 -0
  50. package/dist/test/cli/run.test.d.ts +2 -0
  51. package/dist/test/cli/run.test.d.ts.map +1 -0
  52. package/dist/test/cli/run.test.js +429 -0
  53. package/dist/test/cli/spec.test.d.ts +2 -0
  54. package/dist/test/cli/spec.test.d.ts.map +1 -0
  55. package/dist/test/cli/spec.test.js +112 -0
  56. package/dist/test/code-list-json5.test.d.ts +2 -0
  57. package/dist/test/code-list-json5.test.d.ts.map +1 -0
  58. package/dist/test/code-list-json5.test.js +84 -0
  59. package/dist/test/code-list.test.d.ts +2 -0
  60. package/dist/test/code-list.test.d.ts.map +1 -0
  61. package/dist/test/code-list.test.js +39 -0
  62. package/dist/test/gap-inference.test.d.ts +2 -0
  63. package/dist/test/gap-inference.test.d.ts.map +1 -0
  64. package/dist/test/gap-inference.test.js +597 -0
  65. package/dist/test/generalization.test.d.ts +2 -0
  66. package/dist/test/generalization.test.d.ts.map +1 -0
  67. package/dist/test/generalization.test.js +73 -0
  68. package/dist/test/material-inventory.test.d.ts +2 -0
  69. package/dist/test/material-inventory.test.d.ts.map +1 -0
  70. package/dist/test/material-inventory.test.js +155 -0
  71. package/dist/test/observable-chain.test.d.ts +2 -0
  72. package/dist/test/observable-chain.test.d.ts.map +1 -0
  73. package/dist/test/observable-chain.test.js +123 -0
  74. package/dist/test/page-structure.test.d.ts +2 -0
  75. package/dist/test/page-structure.test.d.ts.map +1 -0
  76. package/dist/test/page-structure.test.js +45 -0
  77. package/dist/test/runtime/ai-runtime-trace.test.d.ts +2 -0
  78. package/dist/test/runtime/ai-runtime-trace.test.d.ts.map +1 -0
  79. package/dist/test/runtime/ai-runtime-trace.test.js +78 -0
  80. package/dist/test/scenario-inference.test.d.ts +2 -0
  81. package/dist/test/scenario-inference.test.d.ts.map +1 -0
  82. package/dist/test/scenario-inference.test.js +73 -0
  83. package/dist/test/stage-context.test.d.ts +2 -0
  84. package/dist/test/stage-context.test.d.ts.map +1 -0
  85. package/dist/test/stage-context.test.js +395 -0
  86. package/dist/test/testcase/testcase-markdown.test.d.ts +2 -0
  87. package/dist/test/testcase/testcase-markdown.test.d.ts.map +1 -0
  88. package/dist/test/testcase/testcase-markdown.test.js +48 -0
  89. package/dist/test/testcase-generator.test.d.ts +2 -0
  90. package/dist/test/testcase-generator.test.d.ts.map +1 -0
  91. package/dist/test/testcase-generator.test.js +276 -0
  92. package/dist/test/testcase-skeleton.test.d.ts +2 -0
  93. package/dist/test/testcase-skeleton.test.d.ts.map +1 -0
  94. package/dist/test/testcase-skeleton.test.js +185 -0
  95. package/dist/test/testcase-spec-assembly.test.d.ts +2 -0
  96. package/dist/test/testcase-spec-assembly.test.d.ts.map +1 -0
  97. package/dist/test/testcase-spec-assembly.test.js +105 -0
  98. package/dist/test/util/credentials.test.d.ts +2 -0
  99. package/dist/test/util/credentials.test.d.ts.map +1 -0
  100. package/dist/test/util/credentials.test.js +64 -0
  101. package/dist/test/util/i18n-testcase.test.d.ts +2 -0
  102. package/dist/test/util/i18n-testcase.test.d.ts.map +1 -0
  103. package/dist/test/util/i18n-testcase.test.js +119 -0
  104. package/dist/test/util/softlink.test.d.ts +2 -0
  105. package/dist/test/util/softlink.test.d.ts.map +1 -0
  106. package/dist/test/util/softlink.test.js +82 -0
  107. package/dist/test/validation/contract.test.d.ts +2 -0
  108. package/dist/test/validation/contract.test.d.ts.map +1 -0
  109. package/dist/test/validation/contract.test.js +116 -0
  110. package/dist/test/validation/credentials.test.d.ts +2 -0
  111. package/dist/test/validation/credentials.test.d.ts.map +1 -0
  112. package/dist/test/validation/credentials.test.js +74 -0
  113. package/dist/test/validation/projects-index.test.d.ts +2 -0
  114. package/dist/test/validation/projects-index.test.d.ts.map +1 -0
  115. package/dist/test/validation/projects-index.test.js +48 -0
  116. package/dist/test/validation/testcase-v1-draft.test.d.ts +2 -0
  117. package/dist/test/validation/testcase-v1-draft.test.d.ts.map +1 -0
  118. package/dist/test/validation/testcase-v1-draft.test.js +173 -0
  119. package/dist/vitest.config.d.ts +3 -0
  120. package/dist/vitest.config.d.ts.map +1 -0
  121. package/dist/vitest.config.js +7 -0
  122. package/docs/README.md +124 -124
  123. package/examples/schemeresource-observable-docs/schemeresource.context.md +20 -20
  124. package/examples/schemeresource.module-hints.json +38 -38
  125. package/examples/schemeresource.observable.code_list.md +37 -37
  126. package/examples/zwplace-observable-docs/zwplace.context.md +16 -16
  127. package/examples/zwplace-placecategory-validation.json +29 -29
  128. package/examples/zwplace.module-hints.json +69 -69
  129. package/examples/zwplace.observable.code_list.md +37 -37
  130. package/package.json +19 -13
  131. package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-tpl.md +0 -72
  132. package/codex-skill/ep-stage/glue-run-test/scripts/extract-page-elements-eval.mjs +0 -233
  133. package/codex-skill/ep-stage/page-element-scan/SKILL.md +0 -91
  134. package/codex-skill/ep-stage/page-element-scan/evals/evals.json +0 -37
  135. package/codex-skill/ep-stage/page-element-scan/evals/fixtures/sample-list-page.html +0 -85
  136. package/codex-skill/ep-stage/page-element-scan/references/pagination-controls.md +0 -153
  137. package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements-eval.mjs +0 -233
  138. package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements.mjs +0 -298
  139. package/codex-skill/ep-stage/page-element-scan/scripts/scan-page.mjs +0 -749
  140. package/dist/src/cli/probe.d.ts +0 -46
  141. package/dist/src/cli/probe.d.ts.map +0 -1
  142. package/dist/src/cli/probe.js +0 -447
  143. package/dist/src/cli/run-report.d.ts +0 -46
  144. package/dist/src/cli/run-report.d.ts.map +0 -1
  145. package/dist/src/cli/run-report.js +0 -316
  146. package/dist/src/extractors/prd-extractor.d.ts +0 -70
  147. package/dist/src/extractors/prd-extractor.d.ts.map +0 -1
  148. package/dist/src/extractors/prd-extractor.js +0 -248
  149. package/dist/src/testcase/button-interaction-inference.d.ts +0 -37
  150. package/dist/src/testcase/button-interaction-inference.d.ts.map +0 -1
  151. package/dist/src/testcase/button-interaction-inference.js +0 -385
  152. package/dist/src/testcase/prd-button-mapper.d.ts +0 -72
  153. package/dist/src/testcase/prd-button-mapper.d.ts.map +0 -1
  154. package/dist/src/testcase/prd-button-mapper.js +0 -148
  155. package/dist/src/testcase/testcase-v2.d.ts +0 -50
  156. package/dist/src/testcase/testcase-v2.d.ts.map +0 -1
  157. package/dist/src/testcase/testcase-v2.js +0 -1
  158. package/docs/mvp-usage-guide.md +0 -298
@@ -1,298 +0,0 @@
1
- # glue-run-test CRUD 契约生成器 — MVP 使用手册
2
-
3
- ## 概述
4
-
5
- `glue-run-test` 是一个 TypeScript agent skill,用于从上游业务模块物料中提取结构化信息,归一化为 `crud-business-module/v1` 契约 JSON。该契约作为 AI Agent 生成 Playwright 测试脚本的地基,确保 Agent 不需要自己编造 selector、按钮文本或业务预期。
6
-
7
- 当前 MVP 只面向公司自研 `zwplace` CRUD 场景,负责:
8
-
9
- - 确定性提取:从 `spec.yaml`、HTML、`code_list.md`、Java Action 中抽取结构事实。
10
- - 策略补齐:通过 `ModuleHints` 显式补充 `dataKey`、数据生成策略、按钮别名、auto-fill 覆盖字段、删除策略和断言策略。
11
-
12
- 当前 MVP 已包含胶水模板骨架测试代码组装,但不负责直接替代骨架中的登录、菜单和 CRUD 模块实现。
13
-
14
- ## 数据流
15
-
16
- ```
17
- 上游物料 glue-run-test 输出
18
- ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
19
- │ HTML 页面 │──extractor──→ │ │ │ │
20
- │ spec.yaml │──extractor──→ │ normalizer │──CLI 输出──→ │ 契约 JSON │
21
- │ code_list.md │──extractor──→ │ │ │ │
22
- │ Java Action │──extractor──→ │ │ │ │
23
- └──────────────┘ └──────────────┘ └──────────────┘
24
- ```
25
-
26
- ## 前置条件
27
-
28
- - Node.js 18+(注意:Node v24 下 `--module` 与 Node 内置 flag 冲突,需用 `tsx` 直接调用)
29
- - pnpm 10+
30
-
31
- ## 安装
32
-
33
- ```bash
34
- cd src/test-glue
35
- pnpm install
36
- ```
37
-
38
- ## 快速开始
39
-
40
- ### 1. 运行 CLI 生成契约
41
-
42
- ```bash
43
- cd src/test-glue
44
-
45
- # 方式一:通过 pnpm script
46
- pnpm generate:crud-contract -- \
47
- --module-id zwplace \
48
- --docs ../../knowledge-project/epoint-web-v9.5.2/_docs/003-场所窗口信息管理-20260518 \
49
- --code-list ../../knowledge-project/epoint-web-v9.5.2/_bmad-output/code_list.md \
50
- --webapp ../../knowledge-project/epoint-web-v9.5.2/src/webapp/perpage/zwplace \
51
- --java-actions ../../knowledge-project/epoint-web-v9.5.2/src/main/java/com/epoint/zwplace/action \
52
- --hints examples/zwplace.module-hints.json \
53
- --out output/zwplace.crud.contract.json
54
-
55
- # 方式二:直接用 tsx
56
- npx tsx src/cli/generate-crud-contract.ts \
57
- --module-id zwplace \
58
- --docs ../../knowledge-project/epoint-web-v9.5.2/_docs/003-场所窗口信息管理-20260518 \
59
- --code-list ../../knowledge-project/epoint-web-v9.5.2/_bmad-output/code_list.md \
60
- --webapp ../../knowledge-project/epoint-web-v9.5.2/src/webapp/perpage/zwplace \
61
- --java-actions ../../knowledge-project/epoint-web-v9.5.2/src/main/java/com/epoint/zwplace/action \
62
- --hints examples/zwplace.module-hints.json \
63
- --out output/zwplace.crud.contract.json
64
- ```
65
-
66
- 输出:`Wrote output/zwplace.crud.contract.json`
67
-
68
- ### 1.1 `ModuleHints` 示例
69
-
70
- ```json
71
- {
72
- "dataKey": {
73
- "selectedField": "placename",
74
- "generationStrategy": "timestamp_prefix"
75
- },
76
- "autofill": {
77
- "overrideFields": [
78
- {
79
- "field": "placename",
80
- "strategy": "timestamp_prefix",
81
- "value": "自动化测试场所名称"
82
- }
83
- ]
84
- },
85
- "deletePolicy": "blocked_by_business_rule"
86
- }
87
- ```
88
-
89
- 建议直接从 [examples/zwplace.module-hints.json](/Users/taurus/0-ws/01-work-repo/test-tech/BG-ZW/stage-glue/src/test-glue/examples/zwplace.module-hints.json) 起步。
90
-
91
- ### 2. 生成胶水模板测试脚本
92
-
93
- 在契约生成后,直接生成调用骨架模块的 Playwright `.spec.ts`:
94
-
95
- ```bash
96
- pnpm generate:playwright-tests -- \
97
- --contract output/zwplace.crud.contract.json \
98
- --out ../stage-project/src/tests/generated-zwplace.skeleton.spec.ts \
99
- --menu "场所窗口信息管理>场所窗口信息列表"
100
- ```
101
-
102
- 参数说明:
103
-
104
- | 参数 | 必填 | 说明 |
105
- |------|------|------|
106
- | `--contract` | 是 | 契约 JSON 文件路径 |
107
- | `--out` | 是 | 输出 `.spec.ts` 文件路径 |
108
- | `--menu` | 是 | 菜单路径,传给 `MenuPage.navigateToMenu()` |
109
-
110
- 输出示例(片段):
111
-
112
- ```typescript
113
- import { test } from '@playwright/test';
114
- import { CrudPage, LoginPage, MenuPage } from '../skeletons';
115
-
116
- test('zwplace CRUD 胶水生成链路', async ({ page }) => {
117
- const loginPage = new LoginPage(page);
118
- const menuPage = new MenuPage(page);
119
- const crudPage = new CrudPage(page, crudSlots);
120
-
121
- await loginPage.login();
122
- await menuPage.navigateToMenu('场所窗口信息管理>场所窗口信息列表');
123
- await crudPage.runCrudFlow();
124
- });
125
- ```
126
-
127
- 先做编译验证:
128
-
129
- ```bash
130
- cd ../stage-project
131
- pnpm exec tsc --noEmit
132
- ```
133
-
134
- 再执行 Playwright:
135
-
136
- ```bash
137
- npx playwright test src/tests/generated-zwplace.skeleton.spec.ts
138
- ```
139
-
140
- ### 2. 检查契约内容
141
-
142
- ```bash
143
- cat output/zwplace.crud.contract.json | head -20
144
- ```
145
-
146
- ### 3. 检查 unresolvedSlots
147
-
148
- ```bash
149
- cat output/zwplace.crud.contract.json | python3 -c "
150
- import json,sys
151
- d=json.load(sys.stdin)
152
- for s in d['unresolvedSlots']:
153
- print(f\"[{s['slotId']}] {s['reason']}\")
154
- print(f\" 需要由: {s['expectedProvider']} 提供\")
155
- print(f\" 格式建议: {s['suggestedFormat']}\")
156
- "
157
- ```
158
-
159
- ## CLI 参数说明
160
-
161
- | 参数 | 必填 | 说明 |
162
- |------|------|------|
163
- | `--module-id` | 是 | 模块 ID(如 `zwplace`),作为契约中 `module.id` 的权威值 |
164
- | `--docs` | 是 | 需求文档目录路径,需包含 `spec.yaml` |
165
- | `--code-list` | 是 | `_bmad-output/code_list.md` 文件路径 |
166
- | `--webapp` | 是 | webapp 页面目录路径(含 `.html` 文件) |
167
- | `--java-actions` | 是 | Java Action 源码目录路径(含 `*Action.java` 文件) |
168
- | `--hints` | 否 | `ModuleHints` JSON 文件路径,用于补充测试策略槽位 |
169
- | `--out` | 是 | 输出 JSON 文件路径(父目录不存在会自动创建) |
170
-
171
- ## 契约结构
172
-
173
- 生成的 JSON 契约遵循 `crud-business-module/v1` 版本,顶层结构:
174
-
175
- ```json
176
- {
177
- "contractVersion": "crud-business-module/v1",
178
- "module": { "id": "zwplace", "label": "场所信息管理" },
179
- "pages": { "list": {...}, "add": {...}, "edit": {...}, "detail": {...} },
180
- "dataKey": { "field": "placename", "label": "场所名称", "availability": "derivable", ... },
181
- "flows": { "create": {...}, "search": {...}, "update": {...}, "delete": {...} },
182
- "assertions": [...],
183
- "businessRules": [...],
184
- "unresolvedSlots": [...]
185
- }
186
- ```
187
-
188
- ### 核心字段说明
189
-
190
- **pages** — 四个 CRUD 页面的结构化描述:
191
-
192
- | 字段 | 说明 |
193
- |------|------|
194
- | `fields` | 页面表单字段(含 locator、controlType、bind、required) |
195
- | `buttons` | 页面按钮(含 XPath locator) |
196
- | `grids` | 数据表格(含列定义) |
197
- | `dialogs` | 弹窗(含触发函数、标题、目标页) |
198
-
199
- **dataKey** — 测试数据的关键标识:
200
-
201
- | 字段 | 说明 |
202
- |------|------|
203
- | `field` | 唯一标识字段名(如 `placename`) |
204
- | `generationStrategy` | 数据生成策略(`timestamp_prefix` / `fixed_value` / `external_data_pool`) |
205
- | `availability` | 可获取性(`auto_extractable` / `derivable` / `human_required`) |
206
-
207
- **flows** — 四个 CRUD 操作流程:
208
-
209
- | 流程 | 关键内容 |
210
- |------|----------|
211
- | `create` | 入口按钮、目标页面、保存按钮、需要覆盖的字段 |
212
- | `search` | 搜索字段、提交控件、结果表格 |
213
- | `update` | 入口操作、目标页面、修改字段、保存按钮 |
214
- | `delete` | 入口按钮、预期结果(`blocked_by_business_rule` / `success_delete`) |
215
-
216
- **unresolvedSlots** — 需要人工补充的信息缺口:
217
-
218
- 每个 slot 包含 `slotId`(缺口标识)、`reason`(原因)、`expectedProvider`(应由谁补充:tester / developer / runtime_config)、`suggestedFormat`(建议格式)。
219
-
220
- 当前规则:
221
-
222
- - 如果 `searchable` 字段不止一个,且没有 `ModuleHints.dataKey.selectedField`,则 `dataKey.selectedField` 必须进入 `unresolvedSlots`。
223
- - 如果没有传入 `ModuleHints.dataKey.generationStrategy`、`ModuleHints.autofill.overrideFields`、`ModuleHints.deletePolicy`,对应策略槽位也必须进入 `unresolvedSlots`。
224
- - 已由 `ModuleHints` 明确确认的策略槽位,不应再出现在 `unresolvedSlots`。
225
-
226
- ### 来源溯源(sources)
227
-
228
- 契约中每个字段都带有 `sources` 数组,记录信息来源:
229
-
230
- ```json
231
- {
232
- "kind": "html",
233
- "path": "../../knowledge-project/.../gxhzwplacelist.html",
234
- "confidence": "high"
235
- }
236
- ```
237
-
238
- | kind | 说明 |
239
- |------|------|
240
- | `html` | 来自 HTML 页面 |
241
- | `spec` | 来自 spec.yaml |
242
- | `code_list` | 来自 code_list.md |
243
- | `java_action` | 来自 Java Action 源码 |
244
- | `human_required` | 找不到来源,需人工补充 |
245
-
246
- ## 编程接口
247
-
248
- 除了 CLI,也可以在 TypeScript 中直接调用:
249
-
250
- ```typescript
251
- import {
252
- extractHtmlPage,
253
- extractSpecYaml,
254
- extractCodeListSummary,
255
- extractJavaAction,
256
- buildCrudBusinessModuleContract
257
- } from './index.js';
258
-
259
- const spec = extractSpecYaml('path/to/spec.yaml');
260
- const codeList = extractCodeListSummary('path/to/code_list.md');
261
- const pages = ['list.html', 'add.html'].map(f => extractHtmlPage(f));
262
- const actions = ['ListAction.java'].map(f => extractJavaAction(f));
263
-
264
- const contract = buildCrudBusinessModuleContract({
265
- moduleId: 'zwplace',
266
- spec,
267
- codeList,
268
- pages,
269
- actions,
270
- hints: {
271
- dataKey: {
272
- selectedField: 'placename',
273
- generationStrategy: 'timestamp_prefix'
274
- }
275
- }
276
- });
277
- ```
278
-
279
- ## 运行测试
280
-
281
- ```bash
282
- cd src/test-glue
283
-
284
- # 运行全部测试
285
- pnpm test
286
-
287
- # 类型检查
288
- pnpm typecheck
289
- ```
290
-
291
- 测试使用本地 `knowledge-project/` 中的真实 zwplace 物料,覆盖 extractor、normalizer 和 CLI 三个层面。
292
-
293
- ## 已知限制
294
-
295
- 1. **只覆盖 zwplace 同栈 CRUD**:当前不考虑外部技术栈,但已接入登录、菜单和 CRUD 骨架模块编排。
296
- 2. **策略值仍需显式输入**:`dataKey`、auto-fill 覆盖策略、删除预期、断言策略不能只靠源码结构盲猜。
297
- 3. **断言策略已消费**:`ModuleHints.assertionPolicy` 现影响 `buildAssertions` 输出,`afterCreate`/`afterDelete` 策略已生效。
298
- 4. **组装链路已切到骨架模式**:`pnpm generate:playwright-tests` 现在只生成基于 skeleton 的 `.spec.ts`,旧的平铺 `page.fill()` / `page.click()` 生成器已移除。