@epoint-testtech/ep-stage-skill 0.0.3-alpha.1
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 +27 -0
- package/codex-skill/ep-stage/create-project/SKILL.md +59 -0
- package/codex-skill/ep-stage/glue-test/SKILL.md +258 -0
- package/codex-skill/ep-stage/glue-test/references/crud-pipeline.md +139 -0
- package/codex-skill/ep-stage/glue-test/references/gap-review-protocol.md +43 -0
- package/codex-skill/ep-stage/glue-test/references/harness-principles.md +46 -0
- package/codex-skill/ep-stage/glue-test/scripts/generate-crud-spec.mjs +149 -0
- package/codex-skill/ep-stage/glue-testcase/SKILL.md +31 -0
- package/codex-skill/ep-stage/glue-testcase/examples/observable-testcase.json +40 -0
- package/codex-skill/ep-stage/glue-testcase/references/testcase-schema.md +67 -0
- package/codex-skill/ep-stage/recording-to-glue/SKILL.md +27 -0
- package/codex-skill/ep-stage/scripts/validate-skill.mjs +73 -0
- package/dist/src/capability/coverage-diff.d.ts +34 -0
- package/dist/src/capability/coverage-diff.d.ts.map +1 -0
- package/dist/src/capability/coverage-diff.js +91 -0
- package/dist/src/capability/page-structure.d.ts +31 -0
- package/dist/src/capability/page-structure.d.ts.map +1 -0
- package/dist/src/capability/page-structure.js +50 -0
- package/dist/src/capability/scenario-inference.d.ts +36 -0
- package/dist/src/capability/scenario-inference.d.ts.map +1 -0
- package/dist/src/capability/scenario-inference.js +114 -0
- package/dist/src/cli/generate-crud-contract.d.ts +2 -0
- package/dist/src/cli/generate-crud-contract.d.ts.map +1 -0
- package/dist/src/cli/generate-crud-contract.js +77 -0
- package/dist/src/cli/generate-playwright-tests.d.ts +30 -0
- package/dist/src/cli/generate-playwright-tests.d.ts.map +1 -0
- package/dist/src/cli/generate-playwright-tests.js +81 -0
- package/dist/src/cli/run-gap-pipeline.d.ts +256 -0
- package/dist/src/cli/run-gap-pipeline.d.ts.map +1 -0
- package/dist/src/cli/run-gap-pipeline.js +1468 -0
- package/dist/src/context/stage-context.d.ts +63 -0
- package/dist/src/context/stage-context.d.ts.map +1 -0
- package/dist/src/context/stage-context.js +297 -0
- package/dist/src/contracts/crud-business-module.d.ts +645 -0
- package/dist/src/contracts/crud-business-module.d.ts.map +1 -0
- package/dist/src/contracts/crud-business-module.js +1 -0
- package/dist/src/contracts/gap-inference.d.ts +213 -0
- package/dist/src/contracts/gap-inference.d.ts.map +1 -0
- package/dist/src/contracts/gap-inference.js +11 -0
- package/dist/src/contracts/observable-chain.d.ts +250 -0
- package/dist/src/contracts/observable-chain.d.ts.map +1 -0
- package/dist/src/contracts/observable-chain.js +1 -0
- package/dist/src/extractors/code-list.d.ts +40 -0
- package/dist/src/extractors/code-list.d.ts.map +1 -0
- package/dist/src/extractors/code-list.js +225 -0
- package/dist/src/extractors/html-page.d.ts +67 -0
- package/dist/src/extractors/html-page.d.ts.map +1 -0
- package/dist/src/extractors/html-page.js +195 -0
- package/dist/src/extractors/java-action.d.ts +8 -0
- package/dist/src/extractors/java-action.d.ts.map +1 -0
- package/dist/src/extractors/java-action.js +53 -0
- package/dist/src/extractors/spec-yaml.d.ts +28 -0
- package/dist/src/extractors/spec-yaml.d.ts.map +1 -0
- package/dist/src/extractors/spec-yaml.js +29 -0
- package/dist/src/gap-planner/action-candidates.d.ts +9 -0
- package/dist/src/gap-planner/action-candidates.d.ts.map +1 -0
- package/dist/src/gap-planner/action-candidates.js +66 -0
- package/dist/src/gap-planner/list-gap-workflows.d.ts +17 -0
- package/dist/src/gap-planner/list-gap-workflows.d.ts.map +1 -0
- package/dist/src/gap-planner/list-gap-workflows.js +47 -0
- package/dist/src/gap-planner/plan-agent-workflows.d.ts +26 -0
- package/dist/src/gap-planner/plan-agent-workflows.d.ts.map +1 -0
- package/dist/src/gap-planner/plan-agent-workflows.js +116 -0
- package/dist/src/gap-planner/skeleton-coverage.d.ts +9 -0
- package/dist/src/gap-planner/skeleton-coverage.d.ts.map +1 -0
- package/dist/src/gap-planner/skeleton-coverage.js +41 -0
- package/dist/src/gap-planner/stable-id.d.ts +16 -0
- package/dist/src/gap-planner/stable-id.d.ts.map +1 -0
- package/dist/src/gap-planner/stable-id.js +19 -0
- package/dist/src/generalization/generalization-eval.d.ts +71 -0
- package/dist/src/generalization/generalization-eval.d.ts.map +1 -0
- package/dist/src/generalization/generalization-eval.js +53 -0
- package/dist/src/generators/agent-inferred-workflow-script.d.ts +22 -0
- package/dist/src/generators/agent-inferred-workflow-script.d.ts.map +1 -0
- package/dist/src/generators/agent-inferred-workflow-script.js +230 -0
- package/dist/src/generators/stage-skeleton-script.d.ts +107 -0
- package/dist/src/generators/stage-skeleton-script.d.ts.map +1 -0
- package/dist/src/generators/stage-skeleton-script.js +607 -0
- package/dist/src/index.d.ts +52 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +26 -0
- package/dist/src/material/material-inventory.d.ts +92 -0
- package/dist/src/material/material-inventory.d.ts.map +1 -0
- package/dist/src/material/material-inventory.js +191 -0
- package/dist/src/normalizers/crud-contract.d.ts +107 -0
- package/dist/src/normalizers/crud-contract.d.ts.map +1 -0
- package/dist/src/normalizers/crud-contract.js +1068 -0
- package/dist/src/testcase/testcase-generator.d.ts +43 -0
- package/dist/src/testcase/testcase-generator.d.ts.map +1 -0
- package/dist/src/testcase/testcase-generator.js +152 -0
- package/dist/src/testcase/testcase-skeleton.d.ts +91 -0
- package/dist/src/testcase/testcase-skeleton.d.ts.map +1 -0
- package/dist/src/testcase/testcase-skeleton.js +121 -0
- package/dist/src/testcase/testcase-spec-assembly.d.ts +11 -0
- package/dist/src/testcase/testcase-spec-assembly.d.ts.map +1 -0
- package/dist/src/testcase/testcase-spec-assembly.js +24 -0
- package/dist/src/trace/review-summary.d.ts +17 -0
- package/dist/src/trace/review-summary.d.ts.map +1 -0
- package/dist/src/trace/review-summary.js +34 -0
- package/dist/src/trace/trace-writer.d.ts +17 -0
- package/dist/src/trace/trace-writer.d.ts.map +1 -0
- package/dist/src/trace/trace-writer.js +81 -0
- package/dist/test/crud-contract.test.d.ts +2 -0
- package/dist/test/crud-contract.test.d.ts.map +1 -0
- package/dist/test/crud-contract.test.js +819 -0
- package/dist/test/gap-inference.test.d.ts +2 -0
- package/dist/test/gap-inference.test.d.ts.map +1 -0
- package/dist/test/gap-inference.test.js +597 -0
- package/dist/test/generalization.test.d.ts +2 -0
- package/dist/test/generalization.test.d.ts.map +1 -0
- package/dist/test/generalization.test.js +73 -0
- package/dist/test/material-inventory.test.d.ts +2 -0
- package/dist/test/material-inventory.test.d.ts.map +1 -0
- package/dist/test/material-inventory.test.js +141 -0
- package/dist/test/observable-chain.test.d.ts +2 -0
- package/dist/test/observable-chain.test.d.ts.map +1 -0
- package/dist/test/observable-chain.test.js +123 -0
- package/dist/test/observable-pipeline.test.d.ts +2 -0
- package/dist/test/observable-pipeline.test.d.ts.map +1 -0
- package/dist/test/observable-pipeline.test.js +461 -0
- package/dist/test/page-structure.test.d.ts +2 -0
- package/dist/test/page-structure.test.d.ts.map +1 -0
- package/dist/test/page-structure.test.js +45 -0
- package/dist/test/scenario-inference.test.d.ts +2 -0
- package/dist/test/scenario-inference.test.d.ts.map +1 -0
- package/dist/test/scenario-inference.test.js +73 -0
- package/dist/test/stage-context.test.d.ts +2 -0
- package/dist/test/stage-context.test.d.ts.map +1 -0
- package/dist/test/stage-context.test.js +263 -0
- package/dist/test/testcase-generator.test.d.ts +2 -0
- package/dist/test/testcase-generator.test.d.ts.map +1 -0
- package/dist/test/testcase-generator.test.js +276 -0
- package/dist/test/testcase-skeleton.test.d.ts +2 -0
- package/dist/test/testcase-skeleton.test.d.ts.map +1 -0
- package/dist/test/testcase-skeleton.test.js +185 -0
- package/dist/test/testcase-spec-assembly.test.d.ts +2 -0
- package/dist/test/testcase-spec-assembly.test.d.ts.map +1 -0
- package/dist/test/testcase-spec-assembly.test.js +105 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +7 -0
- package/docs/README.md +134 -0
- package/docs/mvp-usage-guide.md +298 -0
- package/examples/schemeresource-observable-docs/schemeresource.context.md +20 -0
- package/examples/schemeresource.module-hints.json +38 -0
- package/examples/schemeresource.observable.code_list.md +37 -0
- package/examples/zwplace-observable-docs/zwplace.context.md +16 -0
- package/examples/zwplace-placecategory-validation.json +29 -0
- package/examples/zwplace.module-hints.json +69 -0
- package/examples/zwplace.observable.code_list.md +37 -0
- package/package.json +38 -0
package/SKILL.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ep-stage-skill-package
|
|
3
|
+
description: 使用时机:当需要维护 @epoint/ep-stage-skill 包源码、CLI 提取器、CRUD 契约生成器,或面向 Codex 的 ep-stage skill 资产时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# @epoint/ep-stage-skill 包
|
|
7
|
+
|
|
8
|
+
本包负责面向 Codex 的 `ep-stage` skill 背后的确定性工具链:
|
|
9
|
+
|
|
10
|
+
- 将上游 CRUD 物料提取为 `crud-business-module/v1`
|
|
11
|
+
- 在 `ModuleHints` 中隔离测试人员策略
|
|
12
|
+
- 使用 `CrudFlowSlots` 将契约渲染为 glue 模式的 Playwright spec
|
|
13
|
+
|
|
14
|
+
Codex skill 范围位于:
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
packages/ep-stage-skill/codex-skill/ep-stage/
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
为便于 Agent 发现,本仓库通过双目录暴露 skill(Claude Code 扫描 `.claude/skills/`,Codex 扫描 `.agents/skills/`),二者均以 symlink 指向包源码:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
.claude/skills/<skill> -> packages/ep-stage-skill/codex-skill/ep-stage/<skill>
|
|
24
|
+
.agents/skills/<skill> -> packages/ep-stage-skill/codex-skill/ep-stage/<skill>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
对于面向用户的行为,编辑 `codex-skill/ep-stage/*/SKILL.md`。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-project
|
|
3
|
+
description: 使用时机:当用户需要通过现有 stage-create CLI 创建 ep-stage Playwright 项目(尤其是 default 或 glue 模式项目)时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ep-stage: create-project
|
|
7
|
+
|
|
8
|
+
当用户需要创建 ep-stage 项目,或要求生成 glue 模式(glue-mode)Playwright 脚手架时,使用本 skill。
|
|
9
|
+
|
|
10
|
+
## 行为契约(Behavior Contract)
|
|
11
|
+
|
|
12
|
+
本 skill 引导 Agent 调用现有 `@epoint/stage-create` CLI,不重新实现脚手架逻辑。
|
|
13
|
+
|
|
14
|
+
当前命令示例:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
stage-create my-glue-project --mode glue
|
|
18
|
+
stage-create my-default-project --mode default
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 必填输入
|
|
22
|
+
|
|
23
|
+
- 项目名称(project name):必填,缺失时必须向用户询问。
|
|
24
|
+
- 模式(mode):`glue` 或 `default`,缺失时必须向用户询问。
|
|
25
|
+
|
|
26
|
+
不要自行猜测项目名称。不要发明名为 `ep-stage: create-project` 的命令——那是 skill 名称,不是 shell 命令。
|
|
27
|
+
|
|
28
|
+
## 模式选择指引
|
|
29
|
+
|
|
30
|
+
- 当项目需要包含胶水骨架(glue skeletons)、页面组件(page components)、报告辅助(report helpers)以及物料驱动的测试生成时,使用 `glue` 模式。
|
|
31
|
+
- 当项目只需要标准 Playwright 基线时,使用 `default` 模式。
|
|
32
|
+
|
|
33
|
+
## 验证
|
|
34
|
+
|
|
35
|
+
创建项目后,验证输出目录存在且包含:
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
package.json
|
|
39
|
+
playwright.config.ts
|
|
40
|
+
tsconfig.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
对于 `glue` 模式,还需验证:
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
src/skeletons/
|
|
47
|
+
src/web/component/
|
|
48
|
+
src/report/
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## glue 项目上下文
|
|
52
|
+
|
|
53
|
+
创建 glue 项目后必须生成(由 stage-create CLI 交互写入):
|
|
54
|
+
|
|
55
|
+
- `<project>/stage-context.md`
|
|
56
|
+
- `<project>/.env`
|
|
57
|
+
- `~/.ep-stage/projects.index.json5`
|
|
58
|
+
|
|
59
|
+
这些文件供后续 `glue-testcase` 和 `glue-test` 内置读取,不依赖用户项目存在 `AGENTS.md`。
|
|
@@ -0,0 +1,258 @@
|
|
|
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 负责审阅。
|
|
@@ -0,0 +1,139 @@
|
|
|
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
|
+
- 包生成器缺陷
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Gap 评审协议(Gap Review Protocol)
|
|
2
|
+
|
|
3
|
+
本参考定义了 `review-gaps` 在第一阶段的 Agent 行为。
|
|
4
|
+
|
|
5
|
+
`review-gaps` 在本期不是一个新的 CLI,而是介于"骨架覆盖"与"运行时推理"之间的一层用户确认窗口。
|
|
6
|
+
|
|
7
|
+
## 输入(Inputs)
|
|
8
|
+
|
|
9
|
+
- 由 `generate:crud-contract` 生成的契约 JSON。
|
|
10
|
+
- 契约中的 `agentInferredWorkflows`。
|
|
11
|
+
- 当存在时,`ModuleHints.customWorkflows`。
|
|
12
|
+
- 当 `run:gap-pipeline` 已经生成过时,运行时 pipeline 的摘要。
|
|
13
|
+
|
|
14
|
+
## 状态处理(Status Handling)
|
|
15
|
+
|
|
16
|
+
| 状态 | 行为 |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| `planned` | 可进入运行时推理。运行前展示其意图、断言和证据。 |
|
|
19
|
+
| `candidate` | 不得追加到 spec。询问是否在 `ModuleHints.customWorkflows` 中补充意图和断言。 |
|
|
20
|
+
| `unresolved` | 不得追加到 spec。报告缺失的证据及所需的提供方。 |
|
|
21
|
+
| `resolved` | 可作为运行时已支持的证据进行报告。 |
|
|
22
|
+
| `needs_review` | 保留供人工评审,并报告确切原因。 |
|
|
23
|
+
|
|
24
|
+
## 面向用户的摘要格式(User-Facing Summary Shape)
|
|
25
|
+
|
|
26
|
+
在响应中使用如下格式:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
Gap: 同步窗口管理系统
|
|
30
|
+
status: planned
|
|
31
|
+
workflowId: zwplace.custom_da3d238e
|
|
32
|
+
evidence: HTML button, Java Action method, ModuleHints.customWorkflows
|
|
33
|
+
businessIntent: 同步窗口管理系统数据
|
|
34
|
+
assertionExpectation: 同步完成
|
|
35
|
+
recommendedAction: infer | supplement-hints | skip
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 约束(Constraints)
|
|
39
|
+
|
|
40
|
+
- 不得虚构业务意图。
|
|
41
|
+
- 不得虚构断言文案。
|
|
42
|
+
- 在没有用户提供的 hints 之前,不得将 `candidate` 提升为 `planned`。
|
|
43
|
+
- 不得通过修改骨架来让一个 gap 通过。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Stage Glue 的治理原则(Harness Principles)
|
|
2
|
+
|
|
3
|
+
本 skill 将治理工程(harness-engineering)应用为一条小巧、显式的流水线,而非一个庞大且无所不包的提示词。
|
|
4
|
+
|
|
5
|
+
## 设计承诺(Design Commitments)
|
|
6
|
+
|
|
7
|
+
1. **仓库即记录系统(Repository as record system)**
|
|
8
|
+
- 契约、hints、生成的 spec 以及验证命令都是本地文件。
|
|
9
|
+
- 不要仅依赖截图或对话记忆作为唯一事实来源。
|
|
10
|
+
|
|
11
|
+
2. **渐进式披露(Progressive disclosure)**
|
|
12
|
+
- `SKILL.md` 承载路由和护栏。
|
|
13
|
+
- `references/crud-pipeline.md` 承载命令和闸门。
|
|
14
|
+
- 仅当确定性命令执行有用时才加载脚本。
|
|
15
|
+
|
|
16
|
+
3. **规划器/生成器/评估器分离(Planner/generator/evaluator separation)**
|
|
17
|
+
- 规划器(Planner):识别上游物料和缺失的策略槽位。
|
|
18
|
+
- 生成器(Generator):运行提取器和骨架渲染器。
|
|
19
|
+
- 评估器(Evaluator):检查 `unresolvedSlots`,汇总输出,并可选地运行 Playwright。
|
|
20
|
+
|
|
21
|
+
4. **最小可行治理(Minimum viable harness)**
|
|
22
|
+
- 日常工作中直接使用包 CLI。
|
|
23
|
+
- 仅当重复处理路径或未解析槽位闸门容易出错时,才使用 `scripts/generate-crud-spec.mjs`。
|
|
24
|
+
- 除非模块或验证目标过大、单次确定性执行无法覆盖,否则不要引入多 Agent 循环。
|
|
25
|
+
|
|
26
|
+
5. **反过拟合(Anti-overfitting)**
|
|
27
|
+
- `zwplace` 是回归 fixture 和示例。
|
|
28
|
+
- 可复用的抽象是:上游物料 -> `crud-business-module/v1` -> `CrudFlowSlots` -> glue 骨架。
|
|
29
|
+
- 模块特有的取值应放入 hints 和生成产物中,而不是 skill 指令里。
|
|
30
|
+
|
|
31
|
+
## 质量闸门(Quality Gates)
|
|
32
|
+
|
|
33
|
+
| 闸门 | 证据 |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Skill 可发现性 | `name` 与目录名一致,且 `description` 以 `Use when` 开头。 |
|
|
36
|
+
| 契约健康度 | `contractVersion`、模块标识、`searchConditions`,且 `unresolvedSlots` 为空。 |
|
|
37
|
+
| 骨架兼容性 | 生成的 spec 导入骨架类型,并能在 glue 项目中编译通过。 |
|
|
38
|
+
| 运行时冒烟 | Playwright 测试在可达的业务系统上通过。 |
|
|
39
|
+
| 交接清晰度 | 最终响应列出已生成文件、已执行命令以及未解决的风险。 |
|
|
40
|
+
|
|
41
|
+
## 失败处理(Failure Handling)
|
|
42
|
+
|
|
43
|
+
- 若上游路径错误,先停下来修正路径,再编辑 hints。
|
|
44
|
+
- 若 `unresolvedSlots` 非空,应更新 hints,而不是削弱生成器检查。
|
|
45
|
+
- 若 listbox 取值不唯一,在 hints 中选择一个合法的冒烟测试取值;完整数据覆盖不在 CRUD 冒烟范围之内。
|
|
46
|
+
- 若 Playwright 无法连通系统,应将环境/网络状态与生成正确性分开报告。
|