@epoint-testtech/ep-stage-skill 0.0.3-alpha.1 → 0.0.4-alpha.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.
- package/SKILL.md +2 -2
- package/codex-skill/ep-stage/glue-create-project/SKILL.md +186 -0
- package/codex-skill/ep-stage/glue-generate-testcase/SKILL.md +199 -0
- package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-schema.md +112 -0
- package/codex-skill/ep-stage/glue-run-test/SKILL.md +249 -0
- package/codex-skill/ep-stage/glue-run-test/references/crud-pipeline.md +145 -0
- package/codex-skill/ep-stage/{glue-test → glue-run-test}/scripts/generate-crud-spec.mjs +3 -3
- package/codex-skill/ep-stage/recording-to-glue/SKILL.md +1 -0
- package/codex-skill/ep-stage/scripts/validate-skill.mjs +29 -7
- package/dist/src/cli/dev/extract-contract.d.ts +14 -0
- package/dist/src/cli/dev/extract-contract.d.ts.map +1 -0
- package/dist/src/cli/dev/extract-contract.js +114 -0
- package/dist/src/cli/generate-crud-contract.js +7 -77
- package/dist/src/cli/generate-playwright-tests.d.ts +0 -28
- package/dist/src/cli/generate-playwright-tests.d.ts.map +1 -1
- package/dist/src/cli/generate-playwright-tests.js +4 -81
- package/dist/src/cli/generate-testcase.d.ts +83 -0
- package/dist/src/cli/generate-testcase.d.ts.map +1 -0
- package/dist/src/cli/generate-testcase.js +197 -0
- package/dist/src/cli/index.d.ts +18 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +55 -0
- package/dist/src/cli/probe.d.ts +44 -0
- package/dist/src/cli/probe.d.ts.map +1 -0
- package/dist/src/cli/probe.js +221 -0
- package/dist/src/cli/run-gap-pipeline.js +4 -0
- package/dist/src/cli/run.d.ts +63 -0
- package/dist/src/cli/run.d.ts.map +1 -0
- package/dist/src/cli/run.js +116 -0
- package/dist/src/cli/spec.d.ts +45 -0
- package/dist/src/cli/spec.d.ts.map +1 -0
- package/dist/src/cli/spec.js +74 -0
- package/dist/src/context/stage-context.d.ts +72 -8
- package/dist/src/context/stage-context.d.ts.map +1 -1
- package/dist/src/context/stage-context.js +61 -15
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/testcase/testcase-generator.d.ts.map +1 -1
- package/dist/src/testcase/testcase-generator.js +4 -0
- package/dist/src/testcase/testcase-v2.d.ts +50 -0
- package/dist/src/testcase/testcase-v2.d.ts.map +1 -0
- package/dist/src/testcase/testcase-v2.js +1 -0
- package/dist/src/util/credentials.d.ts +12 -0
- package/dist/src/util/credentials.d.ts.map +1 -0
- package/dist/src/util/credentials.js +19 -0
- package/dist/src/util/i18n-testcase.d.ts +8 -0
- package/dist/src/util/i18n-testcase.d.ts.map +1 -0
- package/dist/src/util/i18n-testcase.js +55 -0
- package/dist/src/util/softlink.d.ts +33 -0
- package/dist/src/util/softlink.d.ts.map +1 -0
- package/dist/src/util/softlink.js +43 -0
- package/dist/src/validation/credentials.d.ts +19 -0
- package/dist/src/validation/credentials.d.ts.map +1 -0
- package/dist/src/validation/credentials.js +38 -0
- package/dist/src/validation/index.d.ts +5 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +3 -0
- package/dist/src/validation/projects-index.d.ts +13 -0
- package/dist/src/validation/projects-index.d.ts.map +1 -0
- package/dist/src/validation/projects-index.js +37 -0
- package/dist/src/validation/testcase.d.ts +13 -0
- package/dist/src/validation/testcase.d.ts.map +1 -0
- package/dist/src/validation/testcase.js +53 -0
- package/dist/test/cli/extract-contract.test.d.ts +2 -0
- package/dist/test/cli/extract-contract.test.d.ts.map +1 -0
- package/dist/test/cli/extract-contract.test.js +32 -0
- package/dist/test/cli/generate-testcase.test.d.ts +2 -0
- package/dist/test/cli/generate-testcase.test.d.ts.map +1 -0
- package/dist/test/cli/generate-testcase.test.js +130 -0
- package/dist/test/cli/index.test.d.ts +2 -0
- package/dist/test/cli/index.test.d.ts.map +1 -0
- package/dist/test/cli/index.test.js +93 -0
- package/dist/test/cli/run.test.d.ts +2 -0
- package/dist/test/cli/run.test.d.ts.map +1 -0
- package/dist/test/cli/run.test.js +149 -0
- package/dist/test/cli/spec.test.d.ts +2 -0
- package/dist/test/cli/spec.test.d.ts.map +1 -0
- package/dist/test/cli/spec.test.js +196 -0
- package/dist/test/stage-context.test.js +145 -13
- package/dist/test/util/credentials.test.d.ts +2 -0
- package/dist/test/util/credentials.test.d.ts.map +1 -0
- package/dist/test/util/credentials.test.js +64 -0
- package/dist/test/util/i18n-testcase.test.d.ts +2 -0
- package/dist/test/util/i18n-testcase.test.d.ts.map +1 -0
- package/dist/test/util/i18n-testcase.test.js +119 -0
- package/dist/test/util/softlink.test.d.ts +2 -0
- package/dist/test/util/softlink.test.d.ts.map +1 -0
- package/dist/test/util/softlink.test.js +82 -0
- package/dist/test/validation/credentials.test.d.ts +2 -0
- package/dist/test/validation/credentials.test.d.ts.map +1 -0
- package/dist/test/validation/credentials.test.js +72 -0
- package/dist/test/validation/projects-index.test.d.ts +2 -0
- package/dist/test/validation/projects-index.test.d.ts.map +1 -0
- package/dist/test/validation/projects-index.test.js +48 -0
- package/dist/test/validation/testcase.test.d.ts +2 -0
- package/dist/test/validation/testcase.test.d.ts.map +1 -0
- package/dist/test/validation/testcase.test.js +129 -0
- package/docs/README.md +6 -6
- package/docs/mvp-usage-guide.md +3 -3
- package/package.json +9 -4
- package/codex-skill/ep-stage/create-project/SKILL.md +0 -59
- package/codex-skill/ep-stage/glue-test/SKILL.md +0 -258
- package/codex-skill/ep-stage/glue-test/references/crud-pipeline.md +0 -139
- package/codex-skill/ep-stage/glue-testcase/SKILL.md +0 -31
- package/codex-skill/ep-stage/glue-testcase/references/testcase-schema.md +0 -67
- /package/codex-skill/ep-stage/{glue-testcase → glue-generate-testcase}/examples/observable-testcase.json +0 -0
- /package/codex-skill/ep-stage/{glue-test → glue-run-test}/references/gap-review-protocol.md +0 -0
- /package/codex-skill/ep-stage/{glue-test → glue-run-test}/references/harness-principles.md +0 -0
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: glue-test
|
|
3
|
-
description: 使用时机:当需要从上游需求文档、code_list.md、生成的 HTML 页面、Java Action 源码、ModuleHints 或 CrudFlowSlots 组装 ep-stage 项目的 Playwright CRUD 胶水测试(glue-code tests),或运行端到端 gap 推理工作流时使用。
|
|
4
|
-
compatibility: 需要 Codex workspace 环境,配备 pnpm、Node.js、packages/ep-stage-skill,以及由 stage-create 生成的 glue 模式 Playwright 项目。
|
|
5
|
-
metadata:
|
|
6
|
-
source-package: "@epoint/ep-stage-skill"
|
|
7
|
-
contract: "crud-business-module/v1"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# ep-stage: glue-test
|
|
11
|
-
|
|
12
|
-
ep-stage 项目中的胶水编码工作流使用本 skill。
|
|
13
|
-
|
|
14
|
-
## 概览(Overview)
|
|
15
|
-
|
|
16
|
-
本 skill 通过确定性提取器(deterministic extractors)、显式的 `ModuleHints` 策略文件、glue 模式 CRUD 骨架以及 gap runtime pipeline,将上游业务物料转换为可执行的 Playwright 胶水测试。
|
|
17
|
-
|
|
18
|
-
核心原则:Agent 负责组装并核实证据,不自行发明选择器(selector)、iframe 关键字、按钮文案、listbox 取值、数据唯一性规则或业务断言。
|
|
19
|
-
|
|
20
|
-
**默认入口**:当用户要求端到端验证、运行时 gap 推理,或"静态组装 + 动态推理 + 落袋合并"时,优先使用一键 pipeline `run:gap-pipeline`。仅当用户明确希望在不执行真实页面的情况下生成 contract/spec 时,才回退到旧的两步离线流程。
|
|
21
|
-
|
|
22
|
-
## 当前后端(Current Backend)
|
|
23
|
-
|
|
24
|
-
当前运行时后端是 `@epoint/ep-stage-skill` 中现有的 CRUD + Export + gap pipeline。
|
|
25
|
-
|
|
26
|
-
本期只承载 skill 入口与工作流描述,不改变 `crud-business-module/v1`,不引入 `skeleton-registry`。当前已支持**默认入口所需字段**的轻量交互补齐:当 `run:gap-pipeline` 在 `material-inventory` 或 `menu` gate 发现 `code_list.md` 缺少 `knowledgeRoot`、`menu`、HTML、Java Action、`ModuleHints` 等关键入口信息时,TTY 环境下会提示用户补齐,并优先写回**可写的** `code_list.md`。当前仓内的真实业务验收主线是 `zwplace`,其唯一上游扎口是 `knowledge-project/epoint-web-v9.5.2/_docs/code_list.md`;仓内 `packages/ep-stage-skill/examples/zwplace.observable.code_list.md` 只是该只读物料的可写镜像。骨架项目或脚手架里顺带出现的说明信息不应替代 `code_list.md` 成为本源。非 CRUD 工作流泛化、`skeleton-registry`、交互式 `review-gaps` CLI 属于第二期源码级改造范围。
|
|
27
|
-
|
|
28
|
-
若后续要验证“不同系统的普通 CRUD 泛化”,应由用户补充第二个真实业务样本的 `code_list.md`;不要在当前链路中用脚手架说明信息、运行产物或旁证文档反推出第二个模块充当本源。
|
|
29
|
-
|
|
30
|
-
**真实系统 E2E 运行约束:**
|
|
31
|
-
|
|
32
|
-
- 禁止用 `--headless true` 跑真实业务系统 E2E。
|
|
33
|
-
- 真实系统验证必须通过 `packages/ep-stage-skill/codex-skill/ep-stage` 这套 skill / `run:gap-pipeline` 入口,以 `--headless false` 运行。
|
|
34
|
-
- 运行过程中必须有人在场观察页面行为、弹窗、登录状态和业务副作用;无人工观察的无头回放不算当前阶段验收证据。
|
|
35
|
-
- `--headless true` 仅允许用于本地调试、结构验证或历史对比,不作为真实系统验收方式。
|
|
36
|
-
|
|
37
|
-
## 工作流(Workflow)
|
|
38
|
-
|
|
39
|
-
完整链路按步骤解耦如下:
|
|
40
|
-
|
|
41
|
-
```text
|
|
42
|
-
explore-materials
|
|
43
|
-
-> generate-contract
|
|
44
|
-
-> match-skeleton
|
|
45
|
-
-> review-gaps
|
|
46
|
-
-> generate-spec
|
|
47
|
-
-> infer-gaps
|
|
48
|
-
-> run-tests
|
|
49
|
-
-> generate-report
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
每个步骤既可端到端串联调用,也可单步独立调用(便于排查链路中某一步的问题、迭代局部产出、对中间产物有干预窗口)。
|
|
53
|
-
|
|
54
|
-
## 适用场景(Use This For)
|
|
55
|
-
|
|
56
|
-
- 从需求文档、`code_list.md`、生成的 HTML 和 Java Action 文件生成 `crud-business-module/v1` 契约。
|
|
57
|
-
- 生成调用 `LoginPage`、`MenuPage` 和 `CrudPage` 并使用 `CrudFlowSlots` 的 `.spec.ts` 文件。
|
|
58
|
-
- 运行一键胶水 E2E 验证:静态组装 -> 运行时 gap 解决 -> 追加 `Custom` 测试 -> 执行 Playwright -> 产出 glue-report。
|
|
59
|
-
- 当数据主键、搜索条件、listbox 取值、按钮别名、自动填充覆盖或删除策略属于策略决策时,更新 `ModuleHints`。
|
|
60
|
-
- 模拟胶水编码链路:上游物料 -> 契约 -> 动态槽位 -> CRUD 骨架 -> Playwright 脚本 -> 编译/运行时验证。
|
|
61
|
-
- 识别 CRUD + Export 骨架未覆盖的业务动作,并输出 `agentInferredWorkflows`。
|
|
62
|
-
- 使用 `ModuleHints.customWorkflows` 约束自定义工作流的业务意图和断言预期。
|
|
63
|
-
|
|
64
|
-
不要将本 skill 用于绕过骨架的自由式 Playwright 编写,或用于 `stage-core` 核心运行时改动。
|
|
65
|
-
|
|
66
|
-
## 必须遵循的工作流(Required Workflow)
|
|
67
|
-
|
|
68
|
-
### 优先路径:一键 gap pipeline
|
|
69
|
-
|
|
70
|
-
1. 定位当前仓库根目录,确认 `packages/ep-stage-skill/package.json` 存在。
|
|
71
|
-
2. 运行前检查上游物料:
|
|
72
|
-
- docs 目录,通常包含 `spec.yaml` 或模块文档
|
|
73
|
-
- `code_list.md`
|
|
74
|
-
- 生成的网页 HTML 目录
|
|
75
|
-
- Java Action 源码目录
|
|
76
|
-
- `ModuleHints` JSON
|
|
77
|
-
3. 运行 `run:gap-pipeline`。
|
|
78
|
-
4. 检查生成的摘要:
|
|
79
|
-
- `contractPath`
|
|
80
|
-
- `specPath`
|
|
81
|
-
- `runTimestamp`
|
|
82
|
-
- `stageGlueReportHtmlPath`
|
|
83
|
-
- `playwrightReportDirPath`
|
|
84
|
-
- `resolvedWorkflows` / `needsReviewWorkflows`
|
|
85
|
-
5. 若运行时 gap 解决失败,报告失败发生在:
|
|
86
|
-
- 上游提取
|
|
87
|
-
- 契约生成
|
|
88
|
-
- spec 生成
|
|
89
|
-
- 运行时解决
|
|
90
|
-
- Playwright 执行
|
|
91
|
-
|
|
92
|
-
### 回退路径:离线两步生成
|
|
93
|
-
|
|
94
|
-
1. 定位当前仓库根目录,确认 `packages/ep-stage-skill/package.json` 存在。
|
|
95
|
-
2. 生成前检查上游物料:
|
|
96
|
-
- docs 目录,通常包含 `spec.yaml` 或模块文档
|
|
97
|
-
- `code_list.md`
|
|
98
|
-
- 生成的网页 HTML 目录
|
|
99
|
-
- Java Action 源码目录
|
|
100
|
-
- `ModuleHints` JSON
|
|
101
|
-
3. 使用 `packages/ep-stage-skill` 生成契约。
|
|
102
|
-
4. 检查生成的契约:
|
|
103
|
-
- `contractVersion` 为 `crud-business-module/v1`
|
|
104
|
-
- `module.id` 和 `module.label` 与上游模块一致
|
|
105
|
-
- `searchConditions` 包含预期的 CRUD 搜索条件
|
|
106
|
-
- 在生成最终 spec 前 `unresolvedSlots` 为空
|
|
107
|
-
5. 将 Playwright spec 生成到 glue 模式项目中。
|
|
108
|
-
6. 验证生成的 spec 在消费方 glue 项目中能编译通过。
|
|
109
|
-
7. 仅当所需环境与业务系统可用时才运行 Playwright。
|
|
110
|
-
|
|
111
|
-
详细命令模式见 `references/crud-pipeline.md`。
|
|
112
|
-
|
|
113
|
-
## Gap 评审协议(Gap Review Protocol)
|
|
114
|
-
|
|
115
|
-
在运行时推理之前,尽可能向用户呈现 gap 清单:
|
|
116
|
-
|
|
117
|
-
- `planned` 状态的 gap 可以进入运行时推理。
|
|
118
|
-
- `candidate` 和 `unresolved` 状态的 gap 不得盲目追加到 spec。
|
|
119
|
-
- 若某个 gap 缺少业务意图或断言预期,应询问用户是补充 `ModuleHints.customWorkflows`、本轮跳过,还是留待后续处理。
|
|
120
|
-
|
|
121
|
-
详细的第一期行为契约见 `references/gap-review-protocol.md`。
|
|
122
|
-
|
|
123
|
-
## 治理规则(Harness Rules)
|
|
124
|
-
|
|
125
|
-
在保证可靠性的前提下,使用最轻量的治理方式:
|
|
126
|
-
|
|
127
|
-
| 治理关注点 | glue-test 规则 |
|
|
128
|
-
| --- | --- |
|
|
129
|
-
| 上下文交接(Context handoff) | 将契约 JSON 和生成的 spec 作为版本化产物保留。 |
|
|
130
|
-
| 渐进式披露(Progressive disclosure) | 先加载本文件;仅按需打开 references。 |
|
|
131
|
-
| 确定性(Determinism) | 优先使用提取器和 CLI 输出,而非 Agent 猜测。 |
|
|
132
|
-
| 策略隔离(Strategy isolation) | 将人工/测试人员的决策放入 `ModuleHints`,而非提取器代码。 |
|
|
133
|
-
| 评估(Evaluation) | 检查契约结构、编译输出,以及(可选)真实 Playwright 行为。 |
|
|
134
|
-
| 反过拟合(Anti-overfit) | 将 `zwplace` 视为示例 fixture,而非唯一支持的模块。 |
|
|
135
|
-
|
|
136
|
-
治理原则的完整说明见 `references/harness-principles.md`。
|
|
137
|
-
|
|
138
|
-
## 快速命令格式(Quick Command Shape)
|
|
139
|
-
|
|
140
|
-
### 优先:一键 gap pipeline
|
|
141
|
-
|
|
142
|
-
```bash
|
|
143
|
-
pnpm --filter @epoint/ep-stage-skill run:gap-pipeline -- \
|
|
144
|
-
--module-id <module-id> \
|
|
145
|
-
--docs <upstream-docs-dir> \
|
|
146
|
-
--code-list <upstream-code-list-md> \
|
|
147
|
-
--webapp <upstream-html-dir> \
|
|
148
|
-
--java-actions <upstream-java-action-dir> \
|
|
149
|
-
--hints <module-hints-json> \
|
|
150
|
-
--menu "<menu-path>" \
|
|
151
|
-
--project-dir <glue-project-dir> \
|
|
152
|
-
--headless false
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
当用户要求以下场景时使用:
|
|
156
|
-
|
|
157
|
-
- 真实端到端验证
|
|
158
|
-
- 运行时 gap 推理
|
|
159
|
-
- 真实页面补证据
|
|
160
|
-
- 自动把 `Custom` test 追加到现有 suite
|
|
161
|
-
|
|
162
|
-
### 回退:仅离线生成
|
|
163
|
-
|
|
164
|
-
```bash
|
|
165
|
-
pnpm --filter @epoint/ep-stage-skill generate:crud-contract -- \
|
|
166
|
-
--module-id <module-id> \
|
|
167
|
-
--docs <upstream-docs-dir> \
|
|
168
|
-
--code-list <upstream-code-list-md> \
|
|
169
|
-
--webapp <upstream-html-dir> \
|
|
170
|
-
--java-actions <upstream-java-action-dir> \
|
|
171
|
-
--hints <module-hints-json> \
|
|
172
|
-
--out output/<module-id>.crud.contract.json
|
|
173
|
-
|
|
174
|
-
pnpm --filter @epoint/ep-stage-skill generate:playwright-tests -- \
|
|
175
|
-
--contract output/<module-id>.crud.contract.json \
|
|
176
|
-
--out <glue-project>/src/tests/<name>.spec.ts \
|
|
177
|
-
--menu "<menu-path>"
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
通过 `pnpm --filter` 传路径时,上游文件和输出 spec 建议使用绝对路径。相对路径从 `packages/ep-stage-skill` 解析。
|
|
181
|
-
|
|
182
|
-
真实系统 E2E 请固定使用:
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
pnpm --filter @epoint/ep-stage-skill run:gap-pipeline -- \
|
|
186
|
-
--code-list <code_list.md> \
|
|
187
|
-
--project-dir <glue-project-dir> \
|
|
188
|
-
--scenario <confirmed-scenario> \
|
|
189
|
-
--headless false
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## 常见错误(Common Mistakes)
|
|
193
|
-
|
|
194
|
-
- 用户明确要 E2E 验证时,仍然只跑 `generate:crud-contract` + `generate:playwright-tests`,没有进入 `run:gap-pipeline`。
|
|
195
|
-
- 在 `unresolvedSlots` 非空时使用生成的 `.spec.ts`。
|
|
196
|
-
- 从截图猜测 listbox 取值,而不是将冒烟测试值放入 `ModuleHints.searchConditions`。
|
|
197
|
-
- 把 `dataKey` 和 `searchConditions` 当作互相竞争的独立策略。当前 glue CRUD 流程由 `searchConditions` 驱动。
|
|
198
|
-
- 在生成的 spec 中内联 `page.fill()` 或 `page.click()` 流程,而不是调用骨架。
|
|
199
|
-
- 当真实系统、登录环境或内网不可用时,仍假设业务 Playwright 运行失败是代码问题。
|
|
200
|
-
- 只凭按钮文本生成 Custom test。
|
|
201
|
-
- 把 `candidate` 或 `unresolved` 的 gap workflow 直接追加到 spec。
|
|
202
|
-
- 在 runtime gap resolve 阶段修改 `businessIntent` 或 `assertionExpectation`。
|
|
203
|
-
- 在 gap 代码中修改 `src/skeletons/*.ts`。
|
|
204
|
-
|
|
205
|
-
## 边界(Boundaries)
|
|
206
|
-
|
|
207
|
-
不要声称本期已实现非 CRUD 工作流的生成。若用户要求审批流、流程发起或表单提交等超出当前后端能力的工作流,应说明这些属于第二期源码级泛化范围。
|
|
208
|
-
|
|
209
|
-
处理运行时 gap 推理时,不要修改 `src/skeletons/*.ts`。
|
|
210
|
-
|
|
211
|
-
## 参考文档(References)
|
|
212
|
-
|
|
213
|
-
- `references/crud-pipeline.md`:通用 CRUD 组装 pipeline 与验证命令。
|
|
214
|
-
- `references/harness-principles.md`:本 skill 如何在不发生过拟合(不绑定单一模块或模型)的前提下应用 harness 工程。
|
|
215
|
-
- `references/gap-review-protocol.md`:`review-gaps` 步骤的第一期 Agent 行为协议。
|
|
216
|
-
- `scripts/generate-crud-spec.mjs --help`:两个包 CLI 的确定性封装。
|
|
217
|
-
|
|
218
|
-
## 可观测默认入口
|
|
219
|
-
|
|
220
|
-
默认只要求用户提供 `code_list.md`(`run:gap-pipeline -- --code-list <path>`)。`code_list.md` 是上游物料统一输入扎口:端到端链路需要的 `knowledgeRoot`、`menu` / `menuPath`、HTML、Java Action、spec、ModuleHints 等上游路径信息应优先写入该文件。当前 repo 的真实验收口径下,应优先把 `knowledge-project/epoint-web-v9.5.2/_docs/code_list.md` 视为真相源;若因主仓只读无法直接回写,再退到它的可写镜像 `packages/ep-stage-skill/examples/zwplace.observable.code_list.md`。若缺失入口字段:
|
|
221
|
-
|
|
222
|
-
- `material-inventory` gate 会在 TTY 环境下提示补齐 `knowledgeRoot` / `moduleId` / `webappDir` / `javaActionsDir` / `hintsPath` / `menu`。
|
|
223
|
-
- `menu` gate 会在 TTY 环境下再次提示确认菜单路径。
|
|
224
|
-
- 若目标 `code_list.md` 位于**主仓只读** `knowledge-project/...`,补齐结果只对本次运行生效,不会写回受保护物料;若目标是外置可写 `code_list.md`,则会按当前格式回写。
|
|
225
|
-
|
|
226
|
-
调试时可继续传 `--docs`、`--webapp`、`--java-actions`、`--hints`、`--project-dir`、`--menu` 做覆盖;覆盖参数只用于开发观测,不作为默认业务输入方式。场景推理后用 `--scenario <候选>` 人工确认继续。
|
|
227
|
-
|
|
228
|
-
若目标是**真实系统验收**,除场景确认外还必须满足:
|
|
229
|
-
|
|
230
|
-
- 以 `--headless false` 有头模式运行;
|
|
231
|
-
- 运行时有人观察页面实际行为;
|
|
232
|
-
- 将观察结论与 `.stage/trace/<run-id>/summary.md`、`playwright-execution.json`、`glue-report` 交叉核对后,才可作为验收证据。
|
|
233
|
-
|
|
234
|
-
当前一期对“普通 CRUD,不考虑嵌套 CRUD”的处理口径是:
|
|
235
|
-
|
|
236
|
-
- 若人工确认场景为 `crud.single-page`,`nestedCrudCandidates` 仍保留在 coverage / reasoning 证据中;
|
|
237
|
-
- 但它们不再阻断 testcase gate,不需要再额外 `--confirm-testcases` 才能继续普通 CRUD 主链路;
|
|
238
|
-
- 真正的业务失败应由后续 runtime / playwright / glue-report 给出结构化结论。
|
|
239
|
-
|
|
240
|
-
链路顺序(每阶段写 `.stage/trace/<run-id>/*.json` + `summary.md`):
|
|
241
|
-
|
|
242
|
-
```text
|
|
243
|
-
code_list.md
|
|
244
|
-
-> context-resolution
|
|
245
|
-
-> material-inventory (gate)
|
|
246
|
-
-> evidence-extraction
|
|
247
|
-
-> capability-candidates
|
|
248
|
-
-> scenario-inference (gate, --scenario 确认)
|
|
249
|
-
-> skeleton-capability-model
|
|
250
|
-
-> coverage-diff
|
|
251
|
-
-> glue-testcase (gate)
|
|
252
|
-
-> glue spec assembly (unresolvedSlots gate)
|
|
253
|
-
-> runtime gap inference
|
|
254
|
-
-> Playwright execution
|
|
255
|
-
-> glue-report
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
任一 gate `needs_review` 时停止(退出码 2),不继续后续阶段。用例中间产物由 `glue-testcase` skill 负责审阅。
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
# CRUD Pipeline 参考(CRUD Pipeline Reference)
|
|
2
|
-
|
|
3
|
-
## 输入参数(Inputs)
|
|
4
|
-
|
|
5
|
-
使用显式输入。当用户已经明确给出路径时,不要大范围搜索。
|
|
6
|
-
|
|
7
|
-
| 输入 | 用途 | 说明 |
|
|
8
|
-
| --- | --- | --- |
|
|
9
|
-
| `--module-id` | 契约标识 | 稳定的技术标识,例如 `zwplace`。 |
|
|
10
|
-
| `--docs` | 需求/规格目录 | 当存在 `spec.yaml` 时优先使用;当前 CLI 可回退到 `code_list.md` 的模块标签。 |
|
|
11
|
-
| `--code-list` | 模块清单 | 通常为 `<knowledge-project>/_docs/code_list.md`。 |
|
|
12
|
-
| `--webapp` | 生成的 HTML 页面 | 包含 list/add/edit/detail HTML 文件的目录。 |
|
|
13
|
-
| `--java-actions` | Java Action 源码 | 包含 `*Action.java` 文件的目录,用于后端消息/规则。 |
|
|
14
|
-
| `--hints` | 策略决策 | 数据主键、搜索条件、按钮别名、自动填充覆盖、删除策略、断言。 |
|
|
15
|
-
| `--out` | 契约 JSON | 除非用户另有指定,否则输出保持在 `packages/ep-stage-skill/output/` 下。 |
|
|
16
|
-
|
|
17
|
-
## ModuleHints 指引(ModuleHints Guidance)
|
|
18
|
-
|
|
19
|
-
`ModuleHints` 是"已提取事实"与"测试人员策略"之间的边界。
|
|
20
|
-
|
|
21
|
-
以下内容应放入 hints,而不是由 Agent 自行推断:
|
|
22
|
-
|
|
23
|
-
- `dataKey.selectedField` 和 `dataKey.generationStrategy`
|
|
24
|
-
- `searchConditions[]`,尤其是 listbox 的 `value`
|
|
25
|
-
- `buttonAliases`
|
|
26
|
-
- `autofill.overrideFields`
|
|
27
|
-
- `deletePolicy`
|
|
28
|
-
- 断言策略覆盖
|
|
29
|
-
|
|
30
|
-
对于多条件 CRUD 冒烟测试,推荐:
|
|
31
|
-
|
|
32
|
-
```json
|
|
33
|
-
{
|
|
34
|
-
"dataKey": {
|
|
35
|
-
"selectedField": "placename",
|
|
36
|
-
"generationStrategy": "timestamp_prefix"
|
|
37
|
-
},
|
|
38
|
-
"searchConditions": [
|
|
39
|
-
{
|
|
40
|
-
"field": "placename",
|
|
41
|
-
"component": "input",
|
|
42
|
-
"seedValue": "自动化测试名称",
|
|
43
|
-
"strategy": "timestamp_prefix",
|
|
44
|
-
"updatePrefix": "修改"
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"field": "placecategory",
|
|
48
|
-
"component": "listbox",
|
|
49
|
-
"value": "条线大厅",
|
|
50
|
-
"createSelections": [
|
|
51
|
-
{ "field": "placecategory", "value": "条线大厅" }
|
|
52
|
-
]
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
`searchConditions` 驱动生成的 `CrudFlowSlots`。`dataKey` 仍作为兼容性和策略锚点保留,但不应与独立的 `searchField` 概念重复。
|
|
59
|
-
|
|
60
|
-
## 生成契约(Generate Contract)
|
|
61
|
-
|
|
62
|
-
从仓库根目录执行:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
pnpm --filter @epoint/ep-stage-skill generate:crud-contract -- \
|
|
66
|
-
--module-id <module-id> \
|
|
67
|
-
--docs <absolute-upstream-docs-dir> \
|
|
68
|
-
--code-list <absolute-code-list-md> \
|
|
69
|
-
--webapp <absolute-webapp-html-dir> \
|
|
70
|
-
--java-actions <absolute-java-action-dir> \
|
|
71
|
-
--hints examples/<module>.module-hints.json \
|
|
72
|
-
--out output/<module>.crud.contract.json
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
由于 `pnpm --filter` 会在包目录内执行,上游路径通常应使用绝对路径。
|
|
76
|
-
|
|
77
|
-
## 检查契约闸门(Inspect Contract Gate)
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
node --input-type=module -e "
|
|
81
|
-
import fs from 'node:fs';
|
|
82
|
-
const c = JSON.parse(fs.readFileSync('packages/ep-stage-skill/output/<module>.crud.contract.json', 'utf8'));
|
|
83
|
-
console.log(JSON.stringify({
|
|
84
|
-
contractVersion: c.contractVersion,
|
|
85
|
-
module: c.module,
|
|
86
|
-
searchConditions: c.searchConditions?.map(({ field, label, component, value }) => ({ field, label, component, value })),
|
|
87
|
-
unresolvedSlots: c.unresolvedSlots?.map(({ slotId, reason }) => ({ slotId, reason }))
|
|
88
|
-
}, null, 2));
|
|
89
|
-
if (c.unresolvedSlots?.length) process.exit(2);
|
|
90
|
-
"
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
若退出码为 `2`,请更新 `ModuleHints` 并重新生成。不要从存在未解析槽位(unresolved slots)的契约生成最终 spec。
|
|
94
|
-
|
|
95
|
-
## 生成 Spec(Generate Spec)
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
pnpm --filter @epoint/ep-stage-skill generate:playwright-tests -- \
|
|
99
|
-
--contract output/<module>.crud.contract.json \
|
|
100
|
-
--out <absolute-glue-project>/src/tests/<name>.spec.ts \
|
|
101
|
-
--menu "<menu-path>"
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
生成的 spec 应当:
|
|
105
|
-
|
|
106
|
-
- 从 `../skeletons` 导入 `CrudPage`、`LoginPage`、`MenuPage` 以及 `type CrudFlowSlots`
|
|
107
|
-
- 定义 `const crudSlots: CrudFlowSlots`
|
|
108
|
-
- 调用 `await crudPage.runCrudFlow()`
|
|
109
|
-
- 避免内联 Playwright 操作流程
|
|
110
|
-
|
|
111
|
-
## 在消费方 glue 项目中验证(Verify In Consuming Glue Project)
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
cd <glue-project>
|
|
115
|
-
pnpm --ignore-workspace exec tsc --noEmit
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
运行时验证需要 `.env` 配置:
|
|
119
|
-
|
|
120
|
-
```text
|
|
121
|
-
LOGIN_SYSTEM_URL=...
|
|
122
|
-
LOGIN_USERNAME=...
|
|
123
|
-
LOGIN_PASSWORD=...
|
|
124
|
-
HEADLESS=false
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
仅当业务系统可达时才执行:
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
pnpm --ignore-workspace exec playwright test src/tests/<name>.spec.ts --project=chromium --headed --workers=1
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
若运行时失败,将失败原因归类为:
|
|
134
|
-
|
|
135
|
-
- 系统可达性或登录配置
|
|
136
|
-
- 上游物料不匹配
|
|
137
|
-
- `ModuleHints` 缺失或错误
|
|
138
|
-
- 骨架/组件行为
|
|
139
|
-
- 包生成器缺陷
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: glue-testcase
|
|
3
|
-
description: 使用时机:当需要基于 ep-stage 可观测 trace、场景推理结果和 coverage diff 先生成可人工审阅的胶水测试用例中间产物,再供 glue-test 组装 Playwright spec 时使用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# ep-stage: glue-testcase
|
|
7
|
-
|
|
8
|
-
本 skill 只负责测试用例中间产物(`glue-testcase.json` / `.md`),不直接生成或执行 Playwright spec。
|
|
9
|
-
|
|
10
|
-
## 工作流
|
|
11
|
-
|
|
12
|
-
```text
|
|
13
|
-
读取 .stage/trace
|
|
14
|
-
-> 检查 scenario-inference 是否已确认(--scenario)
|
|
15
|
-
-> 读取 coverage-diff
|
|
16
|
-
-> 生成 testcase JSON / Markdown(testcases/<module>.glue-testcase.*)
|
|
17
|
-
-> 展示推理摘要和未确认项
|
|
18
|
-
-> 人工确认后供 glue-test 消费
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## 关键约束
|
|
22
|
-
|
|
23
|
-
- 未确认的 `scenario-inference` 不得生成可执行 spec。
|
|
24
|
-
- `candidate` 和 `unresolved` 必须写入 testcase 的 `reviewStatus` 和 `unresolved`。
|
|
25
|
-
- 嵌套 CRUD 一期只能作为候选用例进入 testcase,不写入正式 CRUD 契约。
|
|
26
|
-
- 对话中展示的是可审阅推理摘要和证据链,不展示原始隐式思维链。
|
|
27
|
-
|
|
28
|
-
## 按需加载
|
|
29
|
-
|
|
30
|
-
- 用例 schema:`references/testcase-schema.md`
|
|
31
|
-
- 样例产物:`examples/observable-testcase.json`
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# glue-testcase schema
|
|
2
|
-
|
|
3
|
-
`glue-testcase` 的 JSON 顶层结构:
|
|
4
|
-
|
|
5
|
-
```json
|
|
6
|
-
{
|
|
7
|
-
"moduleId": "zwplace",
|
|
8
|
-
"moduleName": "场所窗口信息管理",
|
|
9
|
-
"cases": [
|
|
10
|
-
{
|
|
11
|
-
"caseId": "zwplace.create",
|
|
12
|
-
"title": "新增场所窗口信息管理",
|
|
13
|
-
"scenario": "crud.single-page",
|
|
14
|
-
"reviewStatus": "confirmed",
|
|
15
|
-
"evidence": ["skeleton=crud.skeleton-testcase/v1", "contract=crud-business-module/v1"],
|
|
16
|
-
"steps": ["进入菜单", "点击新增", "填写并保存测试数据"],
|
|
17
|
-
"assertions": ["新增后可查询到记录"],
|
|
18
|
-
"unresolved": []
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"caseId": "zwplace.read",
|
|
22
|
-
"title": "查询场所窗口信息管理",
|
|
23
|
-
"scenario": "crud.single-page",
|
|
24
|
-
"reviewStatus": "confirmed",
|
|
25
|
-
"evidence": ["skeleton=crud.skeleton-testcase/v1", "contract=crud-business-module/v1"],
|
|
26
|
-
"steps": ["进入菜单", "输入查询字段", "提交查询"],
|
|
27
|
-
"assertions": ["查询结果包含测试记录"],
|
|
28
|
-
"unresolved": []
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"caseId": "zwplace.update",
|
|
32
|
-
"title": "修改场所窗口信息管理",
|
|
33
|
-
"scenario": "crud.single-page",
|
|
34
|
-
"reviewStatus": "confirmed",
|
|
35
|
-
"evidence": ["skeleton=crud.skeleton-testcase/v1", "contract=crud-business-module/v1"],
|
|
36
|
-
"steps": ["定位测试记录", "点击修改", "保存更新值"],
|
|
37
|
-
"assertions": ["修改后可查询到更新记录"],
|
|
38
|
-
"unresolved": []
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"caseId": "zwplace.delete",
|
|
42
|
-
"title": "删除场所窗口信息管理",
|
|
43
|
-
"scenario": "crud.single-page",
|
|
44
|
-
"reviewStatus": "confirmed",
|
|
45
|
-
"evidence": ["skeleton=crud.skeleton-testcase/v1", "contract=crud-business-module/v1"],
|
|
46
|
-
"steps": ["定位测试记录", "点击删除", "确认删除策略"],
|
|
47
|
-
"assertions": ["删除结果符合契约断言策略"],
|
|
48
|
-
"unresolved": []
|
|
49
|
-
}
|
|
50
|
-
],
|
|
51
|
-
"reasoningSummary": {
|
|
52
|
-
"conclusion": "生成 4 条 CRUD 胶水测试用例。",
|
|
53
|
-
"evidenceChain": [],
|
|
54
|
-
"alternatives": ["crud.single-page"],
|
|
55
|
-
"confidence": "high",
|
|
56
|
-
"risks": [],
|
|
57
|
-
"needsHumanReview": false
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## 字段说明
|
|
63
|
-
|
|
64
|
-
- `reviewStatus`:`confirmed` / `needs_review` / `blocked`。`needs_review` 的用例不得进入 spec assembly。
|
|
65
|
-
- `caseId`:spec assembly 需要与生成脚本工作流粒度一致,CRUD 用例固定为 `<moduleId>.create`、`<moduleId>.read`、`<moduleId>.update`、`<moduleId>.delete`。
|
|
66
|
-
- `unresolved`:未确认项(如嵌套 CRUD 子表保存后断言)。必须落盘,不能只在对话解释。
|
|
67
|
-
- `reasoningSummary`:与 `.stage/trace/<run-id>/testcase-generation.json` 同构。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|