@epoint-testtech/ep-stage-skill 0.0.10 → 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.
- package/SKILL.md +27 -27
- package/codex-skill/ep-stage/glue-create-project/SKILL.md +223 -223
- package/codex-skill/ep-stage/glue-generate-testcase/SKILL.md +275 -275
- package/codex-skill/ep-stage/glue-generate-testcase/examples/observable-testcase.json +40 -40
- package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-schema.md +95 -95
- package/codex-skill/ep-stage/glue-run-test/SKILL.md +273 -296
- package/codex-skill/ep-stage/glue-run-test/references/ai-runtime-loop.md +30 -30
- package/codex-skill/ep-stage/glue-run-test/references/crud-pipeline.md +132 -132
- package/codex-skill/ep-stage/glue-run-test/references/gap-review-protocol.md +44 -44
- package/codex-skill/ep-stage/glue-run-test/references/harness-principles.md +46 -46
- package/codex-skill/ep-stage/glue-run-test/references/playwright-cli-odav.md +127 -166
- package/codex-skill/ep-stage/glue-run-test/scripts/generate-crud-spec.mjs +149 -149
- package/codex-skill/ep-stage/recording-to-glue/SKILL.md +28 -28
- package/codex-skill/ep-stage/scripts/validate-skill.mjs +95 -98
- package/dist/src/cli/generate-testcase.d.ts +0 -1
- package/dist/src/cli/generate-testcase.d.ts.map +1 -1
- package/dist/src/cli/generate-testcase.js +1 -6
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +14 -38
- package/dist/src/cli/run.d.ts +0 -2
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +21 -70
- package/dist/src/cli/spec.d.ts.map +1 -1
- package/dist/src/cli/spec.js +0 -9
- package/dist/src/contracts/glue-contract-v1.d.ts +0 -35
- package/dist/src/contracts/glue-contract-v1.d.ts.map +1 -1
- package/dist/src/extractors/code-list-json5.d.ts +1 -34
- package/dist/src/extractors/code-list-json5.d.ts.map +1 -1
- package/dist/src/extractors/code-list-json5.js +0 -1
- package/dist/src/extractors/html-page.d.ts +0 -9
- package/dist/src/extractors/html-page.d.ts.map +1 -1
- package/dist/src/extractors/html-page.js +2 -26
- package/dist/src/generators/agent-inferred-workflow-script.js +66 -66
- package/dist/src/generators/stage-skeleton-script.d.ts +0 -50
- package/dist/src/generators/stage-skeleton-script.d.ts.map +1 -1
- package/dist/src/generators/stage-skeleton-script.js +116 -449
- package/dist/src/runtime/ai-runtime-trace.d.ts.map +1 -1
- package/dist/src/runtime/ai-runtime-trace.js +0 -8
- package/dist/src/testcase/contract-testcase-assembler.d.ts +0 -28
- package/dist/src/testcase/contract-testcase-assembler.d.ts.map +1 -1
- package/dist/src/testcase/contract-testcase-assembler.js +75 -329
- package/dist/src/validation/contract.d.ts.map +1 -1
- package/dist/src/validation/contract.js +0 -29
- package/dist/test/cli/generate-testcase-json5.test.d.ts +2 -0
- package/dist/test/cli/generate-testcase-json5.test.d.ts.map +1 -0
- package/dist/test/cli/generate-testcase-json5.test.js +154 -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 +114 -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 +429 -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 +112 -0
- package/dist/test/code-list-json5.test.d.ts +2 -0
- package/dist/test/code-list-json5.test.d.ts.map +1 -0
- package/dist/test/code-list-json5.test.js +84 -0
- package/dist/test/code-list.test.d.ts +2 -0
- package/dist/test/code-list.test.d.ts.map +1 -0
- package/dist/test/code-list.test.js +39 -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 +155 -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/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/runtime/ai-runtime-trace.test.d.ts +2 -0
- package/dist/test/runtime/ai-runtime-trace.test.d.ts.map +1 -0
- package/dist/test/runtime/ai-runtime-trace.test.js +78 -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 +395 -0
- package/dist/test/testcase/testcase-markdown.test.d.ts +2 -0
- package/dist/test/testcase/testcase-markdown.test.d.ts.map +1 -0
- package/dist/test/testcase/testcase-markdown.test.js +48 -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/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/contract.test.d.ts +2 -0
- package/dist/test/validation/contract.test.d.ts.map +1 -0
- package/dist/test/validation/contract.test.js +116 -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 +74 -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-v1-draft.test.d.ts +2 -0
- package/dist/test/validation/testcase-v1-draft.test.d.ts.map +1 -0
- package/dist/test/validation/testcase-v1-draft.test.js +173 -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 +124 -124
- package/examples/schemeresource-observable-docs/schemeresource.context.md +20 -20
- package/examples/schemeresource.module-hints.json +38 -38
- package/examples/schemeresource.observable.code_list.md +37 -37
- package/examples/zwplace-observable-docs/zwplace.context.md +16 -16
- package/examples/zwplace-placecategory-validation.json +29 -29
- package/examples/zwplace.module-hints.json +69 -69
- package/examples/zwplace.observable.code_list.md +37 -37
- package/package.json +19 -13
- package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-tpl.md +0 -72
- package/codex-skill/ep-stage/glue-run-test/scripts/extract-page-elements-eval.mjs +0 -233
- package/codex-skill/ep-stage/page-element-scan/SKILL.md +0 -91
- package/codex-skill/ep-stage/page-element-scan/evals/evals.json +0 -37
- package/codex-skill/ep-stage/page-element-scan/evals/fixtures/sample-list-page.html +0 -85
- package/codex-skill/ep-stage/page-element-scan/references/pagination-controls.md +0 -153
- package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements-eval.mjs +0 -233
- package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements.mjs +0 -298
- package/codex-skill/ep-stage/page-element-scan/scripts/scan-page.mjs +0 -749
- package/dist/src/cli/probe.d.ts +0 -46
- package/dist/src/cli/probe.d.ts.map +0 -1
- package/dist/src/cli/probe.js +0 -447
- package/dist/src/cli/run-report.d.ts +0 -46
- package/dist/src/cli/run-report.d.ts.map +0 -1
- package/dist/src/cli/run-report.js +0 -331
- package/dist/src/extractors/prd-extractor.d.ts +0 -70
- package/dist/src/extractors/prd-extractor.d.ts.map +0 -1
- package/dist/src/extractors/prd-extractor.js +0 -248
- package/dist/src/testcase/button-interaction-inference.d.ts +0 -37
- package/dist/src/testcase/button-interaction-inference.d.ts.map +0 -1
- package/dist/src/testcase/button-interaction-inference.js +0 -385
- package/dist/src/testcase/prd-button-mapper.d.ts +0 -72
- package/dist/src/testcase/prd-button-mapper.d.ts.map +0 -1
- package/dist/src/testcase/prd-button-mapper.js +0 -148
- package/dist/src/testcase/testcase-v2.d.ts +0 -50
- package/dist/src/testcase/testcase-v2.d.ts.map +0 -1
- package/dist/src/testcase/testcase-v2.js +0 -1
- package/docs/mvp-usage-guide.md +0 -298
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# AI Runtime Loop
|
|
2
|
-
|
|
3
|
-
glue-run-test 对 `generationStrategy=ai` 的用例采用受控运行态推理。
|
|
4
|
-
|
|
5
|
-
状态机:
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
prepare_tasks_cli
|
|
9
|
-
-> agent_infer_ai_snippets
|
|
10
|
-
-> compose_full_spec_cli
|
|
11
|
-
-> run_full_spec
|
|
12
|
-
-> classify_result
|
|
13
|
-
-> passed: final_report
|
|
14
|
-
-> failed: write_repair_report
|
|
15
|
-
-> wait_human_direction
|
|
16
|
-
-> repair_spec
|
|
17
|
-
-> rerun
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Agent 可以读取 trace tasks,并使用 playwright-cli 观察页面、iframe、弹窗、提示和网络反馈;CLI 不做业务推理。Agent 不能新增测试范围、反刷 code_list.json5、静默改 testcase.json5 或绕开 docs/00-memory/dev-rules.md。
|
|
21
|
-
|
|
22
|
-
失败后第一版只落:
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
.ep-stage/ai-runtime-trace.json5
|
|
26
|
-
.ep-stage/ai-snippets.json5
|
|
27
|
-
.ep-stage/repair-runs/<round>/repair-report.md
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
修补 loop 不设固定轮数上限,每轮失败先落袋、人审纠偏,再修补重跑。退出条件:用户停止、同类失败无新证据、环境不可达、权限不足、数据不足、需要改变测试意图、真实业务不满足预期。
|
|
1
|
+
# AI Runtime Loop
|
|
2
|
+
|
|
3
|
+
glue-run-test 对 `generationStrategy=ai` 的用例采用受控运行态推理。
|
|
4
|
+
|
|
5
|
+
状态机:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
prepare_tasks_cli
|
|
9
|
+
-> agent_infer_ai_snippets
|
|
10
|
+
-> compose_full_spec_cli
|
|
11
|
+
-> run_full_spec
|
|
12
|
+
-> classify_result
|
|
13
|
+
-> passed: final_report
|
|
14
|
+
-> failed: write_repair_report
|
|
15
|
+
-> wait_human_direction
|
|
16
|
+
-> repair_spec
|
|
17
|
+
-> rerun
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Agent 可以读取 trace tasks,并使用 playwright-cli 观察页面、iframe、弹窗、提示和网络反馈;CLI 不做业务推理。Agent 不能新增测试范围、反刷 code_list.json5、静默改 testcase.json5 或绕开 docs/00-memory/dev-rules.md。
|
|
21
|
+
|
|
22
|
+
失败后第一版只落:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
.ep-stage/ai-runtime-trace.json5
|
|
26
|
+
.ep-stage/ai-snippets.json5
|
|
27
|
+
.ep-stage/repair-runs/<round>/repair-report.md
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
修补 loop 不设固定轮数上限,每轮失败先落袋、人审纠偏,再修补重跑。退出条件:用户停止、同类失败无新证据、环境不可达、权限不足、数据不足、需要改变测试意图、真实业务不满足预期。
|
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
# CRUD Pipeline 参考(CRUD Pipeline Reference)
|
|
2
|
-
|
|
3
|
-
> 本文为 `glue-run-test` skill 的参考文档。所有 CLI 调用统一使用 `npx -y @epoint-testtech/ep-stage-skill@latest <subcommand>` 形态(REQ-CLI-01 / REQ-CLI-02)。
|
|
4
|
-
|
|
5
|
-
## 子命令一览
|
|
6
|
-
|
|
7
|
-
| 子命令 | 入口 | 说明 |
|
|
8
|
-
| --- | --- | --- |
|
|
9
|
-
| `testcase` | `glue-generate-testcase` skill 包装 | 上游钻探 + contract 提取 + coverage 分析 + testcase v1-draft 生成 + credentials.template 生成 + code_list 软链 |
|
|
10
|
-
| `spec` | `glue-run-test` skill 包装(**只生成不执行**) | 读 testcase + contract → 组装胶水骨架 `crud.spec.ts`(仅覆盖 cases[] 胶水部分) |
|
|
11
|
-
| `prepare-tasks` | `glue-run-test` skill 包装 | 读 testcase(spec 缺失则自动组装)→ 为 ai 候选构建 runtime task → 写 ai-runtime-trace.json5 |
|
|
12
|
-
| `run` | `glue-run-test` skill 包装 | 读 Agent 产出的 ai-snippets.json5 → 合并 resolved snippet → 执行完整 spec → 失败归类写 repair report |
|
|
13
|
-
|
|
14
|
-
> **contract 提取已内嵌**到 `testcase` 子命令(REQ-CLI-02),不暴露为独立 CLI 命令。开发期可用 `pnpm generate:crud-contract`(路由到 `src/cli/dev/extract-contract.ts`),仅作调试入口,**不进 SKILL.md**。
|
|
15
|
-
|
|
16
|
-
## 产物边界(Artifact Boundaries)
|
|
17
|
-
|
|
18
|
-
当前正式链路不再使用 `ModuleHints` 作为输入源。测试策略和待确认信息应进入以下产物:
|
|
19
|
-
|
|
20
|
-
- `_docs/code_list.json5`:只记录上游需求、页面、按钮、字段、业务规则等出码事实。
|
|
21
|
-
- `.ep-stage/contract.json5`:记录下游可消费的当前结论和 `unresolvedSlots`。
|
|
22
|
-
- `testcase.json5`:记录 `cases[]` 与 `uncoveredCandidates[]`,用 `coverageStatus` / `reviewStatus` 表达阻断和待确认。
|
|
23
|
-
- `.ep-stage/ai-runtime-trace.json5`:记录 AI Runtime Task、结果和修补轮次。
|
|
24
|
-
- `.ep-stage/repair-runs/<round>/repair-report.md`:失败后的人工修补建议。
|
|
25
|
-
|
|
26
|
-
不得把运行态页面结果、最终 locator、账号密码或 AI 自由猜测反写入 `code_list.json5`。
|
|
27
|
-
|
|
28
|
-
## 检查 testcase 闸门(Inspect Testcase Gate)
|
|
29
|
-
|
|
30
|
-
testcase 子命令产出后,由 skill 校验 `testcase.json5` 顶层结构(schemaVersion=ep-stage-testcase/v1-draft + scenario + menuPath + cases + uncoveredCandidates + testAccess)。`cases[]`(`generationStrategy='glue'`)任一 `reviewStatus !== 'confirmed'` → 阻断 spec 组装;`uncoveredCandidates[]` 用 `generationStrategy`('ai')+ `coverageStatus`('blocked' 等)分桶,`coverageStatus='blocked'` 的候选不进入 run 的 runtime task。
|
|
31
|
-
|
|
32
|
-
详细 schema 见 [glue-generate-testcase/references/testcase-schema.md](../../glue-generate-testcase/references/testcase-schema.md)。
|
|
33
|
-
|
|
34
|
-
## 生成 Spec(Generate Spec)
|
|
35
|
-
|
|
36
|
-
任意 cwd 执行(**只生成不执行**,REQ-SPEC-01):
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npx -y @epoint-testtech/ep-stage-skill@latest spec \
|
|
40
|
-
--testcase <projectDir>/src/tests/<需求名>/testcase.json5 \
|
|
41
|
-
--out <projectDir>/src/tests/<需求名>/crud.spec.ts
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
生成的 spec(v1 初始版)应当:
|
|
45
|
-
|
|
46
|
-
- 从 `../../skeletons` 导入 `CrudPage`、`LoginPage`、`MenuPage` 以及 `type CrudFlowSlots`
|
|
47
|
-
- 定义 `const crudSlots: CrudFlowSlots`
|
|
48
|
-
- 调用 `await crudPage.runCrudFlow()`
|
|
49
|
-
- 仅覆盖 `cases[]` 胶水部分;`uncoveredCandidates` 留给 Agent Runtime 产出 snippets,再由 `run` 子命令追加
|
|
50
|
-
- 避免内联 Playwright 操作流程
|
|
51
|
-
|
|
52
|
-
## 准备 AI 任务(Prepare Tasks)
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
npx -y @epoint-testtech/ep-stage-skill@latest prepare-tasks \
|
|
56
|
-
--testcase <projectDir>/src/tests/<需求名>/testcase.json5
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
prepare-tasks 内部步骤:
|
|
60
|
-
|
|
61
|
-
1. 从 `runtimeContext` 或向上查找定位 projectDir/specPath;`crud.spec.ts` 缺失时先跑 `spec` 组装胶水骨架
|
|
62
|
-
2. 解析 testcase,为 `uncoveredCandidates[]` 中 `generationStrategy='ai'` 且 `coverageStatus !== 'blocked'` 的候选构建 AI Runtime Task
|
|
63
|
-
3. 写 `.ep-stage/ai-runtime-trace.json5`(tasks 就绪,results 为空)
|
|
64
|
-
|
|
65
|
-
## Agent 推理(Agent O-D-A-V)
|
|
66
|
-
|
|
67
|
-
Agent 读取 `.ep-stage/ai-runtime-trace.json5`,使用 playwright-cli 观察和操作真实页面,产出 `.ep-stage/ai-snippets.json5`。详见 [playwright-cli-odav.md](./playwright-cli-odav.md)。
|
|
68
|
-
|
|
69
|
-
## 执行 + AI snippet 合并(Run + AI Snippet Append)
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
npx -y @epoint-testtech/ep-stage-skill@latest run \
|
|
73
|
-
--testcase <projectDir>/src/tests/<需求名>/testcase.json5 \
|
|
74
|
-
--ai-snippets <projectDir>/src/tests/<需求名>/.ep-stage/ai-snippets.json5 \
|
|
75
|
-
--headless false
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
run 子命令接收 `--testcase`、`--ai-snippets` 与 `--headless`,不接收 `--spec`。内部步骤:
|
|
79
|
-
|
|
80
|
-
1. 读取 ai-snippets.json5,只接受当前 testcase 下 status=resolved 且 specSnippet 非空的结果
|
|
81
|
-
2. 若存在 AI Runtime Task 但缺少 resolved snippet,写 trace `needs_review` 后停止,不追加占位代码、不执行 Playwright
|
|
82
|
-
3. 幂等合并:以 `// === AI 钻探追加(基于 uncoveredCandidates[].generationStrategy=ai)===` 为标记截断旧追加段,重新追加本轮 snippet
|
|
83
|
-
4. 写 `.ep-stage/ai-runtime-trace.json5`(tasks + results)
|
|
84
|
-
5. 执行完整 spec(`npx playwright test <specPath>`,headless=false 时 `--headed`)
|
|
85
|
-
6. 失败时 `classifyRunFailure` 归类并写 `.ep-stage/repair-runs/<round>/repair-report.md`,同时回写 trace.repairRounds;成功时不写 repair report
|
|
86
|
-
7. 读 `<需求名>/credentials.json5`(数组形态多角色,REQ-ENV-02)作消费边界声明
|
|
87
|
-
|
|
88
|
-
**重跑 run**:检测到 spec 已含 AI 钻探追加标记时截断覆盖追加段,保证幂等。
|
|
89
|
-
|
|
90
|
-
## 凭据配置(Credentials Config)
|
|
91
|
-
|
|
92
|
-
凭据下沉到**需求级** `credentials.json5` 数组形态(REQ-ENV-02 / REQ-ENV-03),**不再用 `.env`**:
|
|
93
|
-
|
|
94
|
-
```json5
|
|
95
|
-
// <projectDir>/src/tests/<需求名>/credentials.json5(gitignore)
|
|
96
|
-
[
|
|
97
|
-
{
|
|
98
|
-
url: "http://192.168.x.x:8100/.../login",
|
|
99
|
-
username: "admin",
|
|
100
|
-
password: "***",
|
|
101
|
-
role: "admin", // 可选,多角色场景必填
|
|
102
|
-
systemName: "主业务系统" // 可选,便于审阅与报告
|
|
103
|
-
}
|
|
104
|
-
]
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
字段约束(Task 1.1 `validateCredentials` 强制):
|
|
108
|
-
|
|
109
|
-
- 必填:`url` / `username` / `password`
|
|
110
|
-
- 可选:`role`(用于 Playwright 多角色登录切换)/ `systemName`
|
|
111
|
-
- `(url, role)` 组合唯一
|
|
112
|
-
|
|
113
|
-
完整流程参考 [glue-generate-testcase SKILL.md](../../glue-generate-testcase/SKILL.md) 第 5 步「与用户交互确认推断结果」。
|
|
114
|
-
|
|
115
|
-
## 在消费方 glue 项目中本地编译验证(Optional Local Check)
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
cd <projectDir>
|
|
119
|
-
pnpm --ignore-workspace exec tsc --noEmit
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
仅校验 v1 spec 编译通过;不执行测试。Playwright 真实执行走 `run` 子命令。
|
|
123
|
-
|
|
124
|
-
## 失败归类(Failure Triage)
|
|
125
|
-
|
|
126
|
-
若运行时失败,将失败原因归类为:
|
|
127
|
-
|
|
128
|
-
- **系统可达性或登录配置** — credentials.json5 缺字段 / URL 不通 / 角色凭据错;引导场景 C
|
|
129
|
-
- **上游物料不匹配** — code_list.json5 缺字段;引导场景 D
|
|
130
|
-
- **AI 候选阻断或待审** — `coverageStatus: 'blocked'` / `reviewStatus: 'needs_review'` / `unresolvedSlots` 非空;补齐上游证据或人工确认后重跑
|
|
131
|
-
- **骨架/组件行为** — `CrudPage` / `LoginPage` 实现 bug;本地修复后回归
|
|
132
|
-
- **包生成器缺陷** — `spec` / `run` 子命令产物错误;走 ep-stage-skill 仓库 issue
|
|
1
|
+
# CRUD Pipeline 参考(CRUD Pipeline Reference)
|
|
2
|
+
|
|
3
|
+
> 本文为 `glue-run-test` skill 的参考文档。所有 CLI 调用统一使用 `npx -y @epoint-testtech/ep-stage-skill@latest <subcommand>` 形态(REQ-CLI-01 / REQ-CLI-02)。
|
|
4
|
+
|
|
5
|
+
## 子命令一览
|
|
6
|
+
|
|
7
|
+
| 子命令 | 入口 | 说明 |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `testcase` | `glue-generate-testcase` skill 包装 | 上游钻探 + contract 提取 + coverage 分析 + testcase v1-draft 生成 + credentials.template 生成 + code_list 软链 |
|
|
10
|
+
| `spec` | `glue-run-test` skill 包装(**只生成不执行**) | 读 testcase + contract → 组装胶水骨架 `crud.spec.ts`(仅覆盖 cases[] 胶水部分) |
|
|
11
|
+
| `prepare-tasks` | `glue-run-test` skill 包装 | 读 testcase(spec 缺失则自动组装)→ 为 ai 候选构建 runtime task → 写 ai-runtime-trace.json5 |
|
|
12
|
+
| `run` | `glue-run-test` skill 包装 | 读 Agent 产出的 ai-snippets.json5 → 合并 resolved snippet → 执行完整 spec → 失败归类写 repair report |
|
|
13
|
+
|
|
14
|
+
> **contract 提取已内嵌**到 `testcase` 子命令(REQ-CLI-02),不暴露为独立 CLI 命令。开发期可用 `pnpm generate:crud-contract`(路由到 `src/cli/dev/extract-contract.ts`),仅作调试入口,**不进 SKILL.md**。
|
|
15
|
+
|
|
16
|
+
## 产物边界(Artifact Boundaries)
|
|
17
|
+
|
|
18
|
+
当前正式链路不再使用 `ModuleHints` 作为输入源。测试策略和待确认信息应进入以下产物:
|
|
19
|
+
|
|
20
|
+
- `_docs/code_list.json5`:只记录上游需求、页面、按钮、字段、业务规则等出码事实。
|
|
21
|
+
- `.ep-stage/contract.json5`:记录下游可消费的当前结论和 `unresolvedSlots`。
|
|
22
|
+
- `testcase.json5`:记录 `cases[]` 与 `uncoveredCandidates[]`,用 `coverageStatus` / `reviewStatus` 表达阻断和待确认。
|
|
23
|
+
- `.ep-stage/ai-runtime-trace.json5`:记录 AI Runtime Task、结果和修补轮次。
|
|
24
|
+
- `.ep-stage/repair-runs/<round>/repair-report.md`:失败后的人工修补建议。
|
|
25
|
+
|
|
26
|
+
不得把运行态页面结果、最终 locator、账号密码或 AI 自由猜测反写入 `code_list.json5`。
|
|
27
|
+
|
|
28
|
+
## 检查 testcase 闸门(Inspect Testcase Gate)
|
|
29
|
+
|
|
30
|
+
testcase 子命令产出后,由 skill 校验 `testcase.json5` 顶层结构(schemaVersion=ep-stage-testcase/v1-draft + scenario + menuPath + cases + uncoveredCandidates + testAccess)。`cases[]`(`generationStrategy='glue'`)任一 `reviewStatus !== 'confirmed'` → 阻断 spec 组装;`uncoveredCandidates[]` 用 `generationStrategy`('ai')+ `coverageStatus`('blocked' 等)分桶,`coverageStatus='blocked'` 的候选不进入 run 的 runtime task。
|
|
31
|
+
|
|
32
|
+
详细 schema 见 [glue-generate-testcase/references/testcase-schema.md](../../glue-generate-testcase/references/testcase-schema.md)。
|
|
33
|
+
|
|
34
|
+
## 生成 Spec(Generate Spec)
|
|
35
|
+
|
|
36
|
+
任意 cwd 执行(**只生成不执行**,REQ-SPEC-01):
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx -y @epoint-testtech/ep-stage-skill@latest spec \
|
|
40
|
+
--testcase <projectDir>/src/tests/<需求名>/testcase.json5 \
|
|
41
|
+
--out <projectDir>/src/tests/<需求名>/crud.spec.ts
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
生成的 spec(v1 初始版)应当:
|
|
45
|
+
|
|
46
|
+
- 从 `../../skeletons` 导入 `CrudPage`、`LoginPage`、`MenuPage` 以及 `type CrudFlowSlots`
|
|
47
|
+
- 定义 `const crudSlots: CrudFlowSlots`
|
|
48
|
+
- 调用 `await crudPage.runCrudFlow()`
|
|
49
|
+
- 仅覆盖 `cases[]` 胶水部分;`uncoveredCandidates` 留给 Agent Runtime 产出 snippets,再由 `run` 子命令追加
|
|
50
|
+
- 避免内联 Playwright 操作流程
|
|
51
|
+
|
|
52
|
+
## 准备 AI 任务(Prepare Tasks)
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx -y @epoint-testtech/ep-stage-skill@latest prepare-tasks \
|
|
56
|
+
--testcase <projectDir>/src/tests/<需求名>/testcase.json5
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
prepare-tasks 内部步骤:
|
|
60
|
+
|
|
61
|
+
1. 从 `runtimeContext` 或向上查找定位 projectDir/specPath;`crud.spec.ts` 缺失时先跑 `spec` 组装胶水骨架
|
|
62
|
+
2. 解析 testcase,为 `uncoveredCandidates[]` 中 `generationStrategy='ai'` 且 `coverageStatus !== 'blocked'` 的候选构建 AI Runtime Task
|
|
63
|
+
3. 写 `.ep-stage/ai-runtime-trace.json5`(tasks 就绪,results 为空)
|
|
64
|
+
|
|
65
|
+
## Agent 推理(Agent O-D-A-V)
|
|
66
|
+
|
|
67
|
+
Agent 读取 `.ep-stage/ai-runtime-trace.json5`,使用 playwright-cli 观察和操作真实页面,产出 `.ep-stage/ai-snippets.json5`。详见 [playwright-cli-odav.md](./playwright-cli-odav.md)。
|
|
68
|
+
|
|
69
|
+
## 执行 + AI snippet 合并(Run + AI Snippet Append)
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx -y @epoint-testtech/ep-stage-skill@latest run \
|
|
73
|
+
--testcase <projectDir>/src/tests/<需求名>/testcase.json5 \
|
|
74
|
+
--ai-snippets <projectDir>/src/tests/<需求名>/.ep-stage/ai-snippets.json5 \
|
|
75
|
+
--headless false
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
run 子命令接收 `--testcase`、`--ai-snippets` 与 `--headless`,不接收 `--spec`。内部步骤:
|
|
79
|
+
|
|
80
|
+
1. 读取 ai-snippets.json5,只接受当前 testcase 下 status=resolved 且 specSnippet 非空的结果
|
|
81
|
+
2. 若存在 AI Runtime Task 但缺少 resolved snippet,写 trace `needs_review` 后停止,不追加占位代码、不执行 Playwright
|
|
82
|
+
3. 幂等合并:以 `// === AI 钻探追加(基于 uncoveredCandidates[].generationStrategy=ai)===` 为标记截断旧追加段,重新追加本轮 snippet
|
|
83
|
+
4. 写 `.ep-stage/ai-runtime-trace.json5`(tasks + results)
|
|
84
|
+
5. 执行完整 spec(`npx playwright test <specPath>`,headless=false 时 `--headed`)
|
|
85
|
+
6. 失败时 `classifyRunFailure` 归类并写 `.ep-stage/repair-runs/<round>/repair-report.md`,同时回写 trace.repairRounds;成功时不写 repair report
|
|
86
|
+
7. 读 `<需求名>/credentials.json5`(数组形态多角色,REQ-ENV-02)作消费边界声明
|
|
87
|
+
|
|
88
|
+
**重跑 run**:检测到 spec 已含 AI 钻探追加标记时截断覆盖追加段,保证幂等。
|
|
89
|
+
|
|
90
|
+
## 凭据配置(Credentials Config)
|
|
91
|
+
|
|
92
|
+
凭据下沉到**需求级** `credentials.json5` 数组形态(REQ-ENV-02 / REQ-ENV-03),**不再用 `.env`**:
|
|
93
|
+
|
|
94
|
+
```json5
|
|
95
|
+
// <projectDir>/src/tests/<需求名>/credentials.json5(gitignore)
|
|
96
|
+
[
|
|
97
|
+
{
|
|
98
|
+
url: "http://192.168.x.x:8100/.../login",
|
|
99
|
+
username: "admin",
|
|
100
|
+
password: "***",
|
|
101
|
+
role: "admin", // 可选,多角色场景必填
|
|
102
|
+
systemName: "主业务系统" // 可选,便于审阅与报告
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
字段约束(Task 1.1 `validateCredentials` 强制):
|
|
108
|
+
|
|
109
|
+
- 必填:`url` / `username` / `password`
|
|
110
|
+
- 可选:`role`(用于 Playwright 多角色登录切换)/ `systemName`
|
|
111
|
+
- `(url, role)` 组合唯一
|
|
112
|
+
|
|
113
|
+
完整流程参考 [glue-generate-testcase SKILL.md](../../glue-generate-testcase/SKILL.md) 第 5 步「与用户交互确认推断结果」。
|
|
114
|
+
|
|
115
|
+
## 在消费方 glue 项目中本地编译验证(Optional Local Check)
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
cd <projectDir>
|
|
119
|
+
pnpm --ignore-workspace exec tsc --noEmit
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
仅校验 v1 spec 编译通过;不执行测试。Playwright 真实执行走 `run` 子命令。
|
|
123
|
+
|
|
124
|
+
## 失败归类(Failure Triage)
|
|
125
|
+
|
|
126
|
+
若运行时失败,将失败原因归类为:
|
|
127
|
+
|
|
128
|
+
- **系统可达性或登录配置** — credentials.json5 缺字段 / URL 不通 / 角色凭据错;引导场景 C
|
|
129
|
+
- **上游物料不匹配** — code_list.json5 缺字段;引导场景 D
|
|
130
|
+
- **AI 候选阻断或待审** — `coverageStatus: 'blocked'` / `reviewStatus: 'needs_review'` / `unresolvedSlots` 非空;补齐上游证据或人工确认后重跑
|
|
131
|
+
- **骨架/组件行为** — `CrudPage` / `LoginPage` 实现 bug;本地修复后回归
|
|
132
|
+
- **包生成器缺陷** — `spec` / `run` 子命令产物错误;走 ep-stage-skill 仓库 issue
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
# Gap 评审协议(Gap Review Protocol)
|
|
2
|
-
|
|
3
|
-
本参考定义 `glue-run-test` 对 `testcase.json5.uncoveredCandidates[]` 的评审和运行边界。它不再依赖旧 `ModuleHints` 或 `run:gap-pipeline`,当前正式链路以 `glue-generate-testcase` 产出的 `testcase.json5` / `contract.json5` 为准。
|
|
4
|
-
|
|
5
|
-
## 输入
|
|
6
|
-
|
|
7
|
-
- `testcase.json5` 中的 `uncoveredCandidates[]`。
|
|
8
|
-
- `.ep-stage/contract.json5` 中的 `unresolvedSlots[]` 和 `scenario.skeletonSlots`。
|
|
9
|
-
- `.ep-stage/inference-trace.json` 中的推理来源。
|
|
10
|
-
- `.ep-stage/ai-runtime-trace.json5` 中的 AI Runtime Task 与结果。
|
|
11
|
-
- Agent Runtime 产出的 `.ep-stage/ai-snippets.json5`。
|
|
12
|
-
|
|
13
|
-
## 状态处理
|
|
14
|
-
|
|
15
|
-
| 状态 | 行为 |
|
|
16
|
-
|------|------|
|
|
17
|
-
| `generationStrategy: 'glue'` | 不属于 gap,由 `spec` 子命令组装胶水骨架。 |
|
|
18
|
-
| `generationStrategy: 'ai'` + `coverageStatus !== 'blocked'` | 可进入 `prepare-tasks`,由 Agent O-D-A-V 产出 snippet。 |
|
|
19
|
-
| `coverageStatus: 'blocked'` | 不进入 AI Runtime Task;保留在 testcase / trace / review 输出中等待人工补齐。 |
|
|
20
|
-
| `reviewStatus: 'needs_review'` | 不静默推进;提示人工审阅上下游证据和缺口原因。 |
|
|
21
|
-
| `unresolvedSlots` 非空 | `spec` / `run` 不二次猜测槽位;先要求补充来源或确认。 |
|
|
22
|
-
|
|
23
|
-
## 面向用户的摘要格式
|
|
24
|
-
|
|
25
|
-
```text
|
|
26
|
-
Gap: 同步窗口管理系统
|
|
27
|
-
caseId: zwplace.syncWindowSystem
|
|
28
|
-
coverageStatus: gap
|
|
29
|
-
reviewStatus: needs_review
|
|
30
|
-
generationStrategy: ai
|
|
31
|
-
evidence: code_list.json5 pages[].toolbarActions + Java Action method
|
|
32
|
-
businessIntent: 同步窗口管理系统数据
|
|
33
|
-
assertionExpectation: 出现同步结果提示
|
|
34
|
-
recommendedAction: run-ai-runtime | supplement-code-list | block
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## 约束
|
|
38
|
-
|
|
39
|
-
- 不得虚构业务意图。
|
|
40
|
-
- 不得虚构断言文案。
|
|
41
|
-
- 不得把 `coverageStatus: 'blocked'` 的候选追加进 spec。
|
|
42
|
-
- 不得在缺少 resolved `ai-snippets.json5` 时追加占位 snippet。
|
|
43
|
-
- 不得通过修改骨架来让一个 gap 假通过。
|
|
44
|
-
- 修补失败时先写 `repair-report.md` 等待人工确认,不静默削弱断言或改变 testcase 意图。
|
|
1
|
+
# Gap 评审协议(Gap Review Protocol)
|
|
2
|
+
|
|
3
|
+
本参考定义 `glue-run-test` 对 `testcase.json5.uncoveredCandidates[]` 的评审和运行边界。它不再依赖旧 `ModuleHints` 或 `run:gap-pipeline`,当前正式链路以 `glue-generate-testcase` 产出的 `testcase.json5` / `contract.json5` 为准。
|
|
4
|
+
|
|
5
|
+
## 输入
|
|
6
|
+
|
|
7
|
+
- `testcase.json5` 中的 `uncoveredCandidates[]`。
|
|
8
|
+
- `.ep-stage/contract.json5` 中的 `unresolvedSlots[]` 和 `scenario.skeletonSlots`。
|
|
9
|
+
- `.ep-stage/inference-trace.json` 中的推理来源。
|
|
10
|
+
- `.ep-stage/ai-runtime-trace.json5` 中的 AI Runtime Task 与结果。
|
|
11
|
+
- Agent Runtime 产出的 `.ep-stage/ai-snippets.json5`。
|
|
12
|
+
|
|
13
|
+
## 状态处理
|
|
14
|
+
|
|
15
|
+
| 状态 | 行为 |
|
|
16
|
+
|------|------|
|
|
17
|
+
| `generationStrategy: 'glue'` | 不属于 gap,由 `spec` 子命令组装胶水骨架。 |
|
|
18
|
+
| `generationStrategy: 'ai'` + `coverageStatus !== 'blocked'` | 可进入 `prepare-tasks`,由 Agent O-D-A-V 产出 snippet。 |
|
|
19
|
+
| `coverageStatus: 'blocked'` | 不进入 AI Runtime Task;保留在 testcase / trace / review 输出中等待人工补齐。 |
|
|
20
|
+
| `reviewStatus: 'needs_review'` | 不静默推进;提示人工审阅上下游证据和缺口原因。 |
|
|
21
|
+
| `unresolvedSlots` 非空 | `spec` / `run` 不二次猜测槽位;先要求补充来源或确认。 |
|
|
22
|
+
|
|
23
|
+
## 面向用户的摘要格式
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
Gap: 同步窗口管理系统
|
|
27
|
+
caseId: zwplace.syncWindowSystem
|
|
28
|
+
coverageStatus: gap
|
|
29
|
+
reviewStatus: needs_review
|
|
30
|
+
generationStrategy: ai
|
|
31
|
+
evidence: code_list.json5 pages[].toolbarActions + Java Action method
|
|
32
|
+
businessIntent: 同步窗口管理系统数据
|
|
33
|
+
assertionExpectation: 出现同步结果提示
|
|
34
|
+
recommendedAction: run-ai-runtime | supplement-code-list | block
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 约束
|
|
38
|
+
|
|
39
|
+
- 不得虚构业务意图。
|
|
40
|
+
- 不得虚构断言文案。
|
|
41
|
+
- 不得把 `coverageStatus: 'blocked'` 的候选追加进 spec。
|
|
42
|
+
- 不得在缺少 resolved `ai-snippets.json5` 时追加占位 snippet。
|
|
43
|
+
- 不得通过修改骨架来让一个 gap 假通过。
|
|
44
|
+
- 修补失败时先写 `repair-report.md` 等待人工确认,不静默削弱断言或改变 testcase 意图。
|
|
@@ -1,46 +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 无法连通系统,应将环境/网络状态与生成正确性分开报告。
|
|
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 无法连通系统,应将环境/网络状态与生成正确性分开报告。
|