@epoint-testtech/ep-stage-skill 0.0.3-alpha.2 → 0.0.4-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 +2 -2
- package/codex-skill/ep-stage/.omc/state/sessions/d636ad35-5fc9-4d5e-85b0-2bcad7d86ee5/pre-tool-advisory-throttle.json +10 -0
- package/codex-skill/ep-stage/glue-create-project/SKILL.md +206 -0
- package/codex-skill/ep-stage/glue-generate-testcase/SKILL.md +274 -0
- package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-schema.md +112 -0
- package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-tpl.md +72 -0
- package/codex-skill/ep-stage/glue-run-test/SKILL.md +289 -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 +84 -0
- package/dist/src/cli/generate-testcase.d.ts.map +1 -0
- package/dist/src/cli/generate-testcase.js +300 -0
- package/dist/src/cli/index.d.ts +26 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +75 -0
- package/dist/src/cli/probe.d.ts +46 -0
- package/dist/src/cli/probe.d.ts.map +1 -0
- package/dist/src/cli/probe.js +447 -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 +48 -0
- package/dist/src/cli/spec.d.ts.map +1 -0
- package/dist/src/cli/spec.js +102 -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/contracts/inference-trace.d.ts +223 -0
- package/dist/src/contracts/inference-trace.d.ts.map +1 -0
- package/dist/src/contracts/inference-trace.js +12 -0
- package/dist/src/extractors/code-list.d.ts +3 -3
- package/dist/src/extractors/code-list.d.ts.map +1 -1
- package/dist/src/extractors/code-list.js +46 -11
- package/dist/src/generators/stage-skeleton-script.d.ts.map +1 -1
- package/dist/src/generators/stage-skeleton-script.js +9 -0
- package/dist/src/index.d.ts +7 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/inference/module-hints-inference.d.ts +30 -0
- package/dist/src/inference/module-hints-inference.d.ts.map +1 -0
- package/dist/src/inference/module-hints-inference.js +363 -0
- package/dist/src/inference/source-analysis.d.ts +26 -0
- package/dist/src/inference/source-analysis.d.ts.map +1 -0
- package/dist/src/inference/source-analysis.js +258 -0
- 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 +6 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +4 -0
- package/dist/src/validation/inference-trace.d.ts +13 -0
- package/dist/src/validation/inference-trace.d.ts.map +1 -0
- package/dist/src/validation/inference-trace.js +31 -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-inference.test.d.ts +2 -0
- package/dist/test/cli/generate-testcase-inference.test.d.ts.map +1 -0
- package/dist/test/cli/generate-testcase-inference.test.js +63 -0
- package/dist/test/cli/generate-testcase-paths.test.d.ts +2 -0
- package/dist/test/cli/generate-testcase-paths.test.d.ts.map +1 -0
- package/dist/test/cli/generate-testcase-paths.test.js +165 -0
- package/dist/test/cli/generate-testcase-requirements.test.d.ts +2 -0
- package/dist/test/cli/generate-testcase-requirements.test.d.ts.map +1 -0
- package/dist/test/cli/generate-testcase-requirements.test.js +229 -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 +113 -0
- package/dist/test/cli/probe.test.d.ts +2 -0
- package/dist/test/cli/probe.test.d.ts.map +1 -0
- package/dist/test/cli/probe.test.js +31 -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-boundary.test.d.ts +2 -0
- package/dist/test/cli/spec-boundary.test.d.ts.map +1 -0
- package/dist/test/cli/spec-boundary.test.js +198 -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/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/crud-contract.test.js +12 -32
- package/dist/test/inference/module-hints-inference.test.d.ts +2 -0
- package/dist/test/inference/module-hints-inference.test.d.ts.map +1 -0
- package/dist/test/inference/module-hints-inference.test.js +25 -0
- package/dist/test/inference/source-analysis.test.d.ts +2 -0
- package/dist/test/inference/source-analysis.test.d.ts.map +1 -0
- package/dist/test/inference/source-analysis.test.js +23 -0
- package/dist/test/material-inventory.test.js +13 -0
- package/dist/test/observable-pipeline.test.js +12 -3
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../src/cli/spec.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAmCF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CActD;AAeD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAmBlD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import JSON5 from 'json5';
|
|
4
|
+
import { generateStageSkeletonCrudSpec } from '../generators/stage-skeleton-script.js';
|
|
5
|
+
import { validateTestcase } from '../validation/testcase.js';
|
|
6
|
+
const SKELETON_MARKER_LINE = '// === 胶水模式生成(基于 contract + coveredActions)===';
|
|
7
|
+
/**
|
|
8
|
+
* spec 组装前的 testcase 就绪门禁(REQ-INFER-007)。
|
|
9
|
+
*
|
|
10
|
+
* 独立于 validateTestcase(纯 schema 校验,被 spec 和 run 共享),这里只判定
|
|
11
|
+
* "testcase 是否已通过人工审阅、可进入 spec 组装阶段"的 readiness 策略,
|
|
12
|
+
* 仅在 runSpec 内调用,不影响 run 子命令。
|
|
13
|
+
*
|
|
14
|
+
* 阻断条件:
|
|
15
|
+
* - 任一 cases[].reviewStatus !== 'confirmed'(needs_review / blocked 均阻断);
|
|
16
|
+
* - 任一 uncoveredCandidates[].status ∈ {'candidate','unresolved'}。
|
|
17
|
+
*
|
|
18
|
+
* @param testcase - 已通过 validateTestcase 的 TestcaseV2。
|
|
19
|
+
* @throws 存在未确认用例或未处理未覆盖项时抛中文错误。
|
|
20
|
+
*/
|
|
21
|
+
function assertTestcaseReadyForSpec(testcase) {
|
|
22
|
+
const unconfirmed = testcase.cases.find((c) => c.reviewStatus !== 'confirmed');
|
|
23
|
+
if (unconfirmed) {
|
|
24
|
+
throw new Error(`testcase.json5 存在未确认用例(needs_review/blocked),请逐条审阅置为 confirmed 后再生成 spec(caseId=${unconfirmed.caseId},reviewStatus=${unconfirmed.reviewStatus})`);
|
|
25
|
+
}
|
|
26
|
+
const unresolvedCandidate = testcase.uncoveredCandidates.find((item) => item.status === 'candidate' || item.status === 'unresolved');
|
|
27
|
+
if (unresolvedCandidate) {
|
|
28
|
+
throw new Error(`testcase.json5 存在 candidate/unresolved 未覆盖项,请处理后再生成 spec(actionId=${unresolvedCandidate.actionId},status=${unresolvedCandidate.status})`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 解析 spec 子命令参数。
|
|
33
|
+
*
|
|
34
|
+
* @param argv - 已剥离子命令名的命令行参数。
|
|
35
|
+
* @returns SpecArgs。
|
|
36
|
+
* @throws 缺少必填参数或参数对非法时抛错。
|
|
37
|
+
*/
|
|
38
|
+
export function parseSpecArgs(argv) {
|
|
39
|
+
const result = {};
|
|
40
|
+
const normalizedArgv = argv.filter((arg) => arg !== '--');
|
|
41
|
+
for (let index = 0; index < normalizedArgv.length; index += 2) {
|
|
42
|
+
const key = normalizedArgv[index];
|
|
43
|
+
const value = normalizedArgv[index + 1];
|
|
44
|
+
if (!key?.startsWith('--') || !value) {
|
|
45
|
+
throw new Error(`无效参数对: ${key ?? '<empty>'}`);
|
|
46
|
+
}
|
|
47
|
+
result[key.slice(2)] = value;
|
|
48
|
+
}
|
|
49
|
+
if (!result.testcase)
|
|
50
|
+
throw new Error('缺少 --testcase');
|
|
51
|
+
if (!result.out)
|
|
52
|
+
throw new Error('缺少 --out');
|
|
53
|
+
return { testcase: result.testcase, out: result.out };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 定位 testcase 旁挂的 contract.json:
|
|
57
|
+
* <tests-dir>/.ep-stage/contract.json(由 testcase 子命令的 probe 内部写入,
|
|
58
|
+
* 当前 Sub-step 4 未保存该文件;本函数兜底返回 null,调用方需先用 dev/extract-contract 显式生成)。
|
|
59
|
+
*
|
|
60
|
+
* @param testcasePath - testcase.json5 绝对路径。
|
|
61
|
+
* @returns contract.json 绝对路径或 null。
|
|
62
|
+
*/
|
|
63
|
+
function locateContract(testcasePath) {
|
|
64
|
+
const candidate = path.join(path.dirname(testcasePath), '.ep-stage', 'contract.json');
|
|
65
|
+
return existsSync(candidate) ? candidate : null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* spec 子命令主体(REQ-SPEC-01):只生成 v1 初始版 .spec.ts,不启动浏览器。
|
|
69
|
+
*
|
|
70
|
+
* v1 = 仅 coveredActions 胶水部分(顶部注释 `// === 胶水模式生成 ===`);
|
|
71
|
+
* run 子命令后续在底部追加 AI 推理段产 v2。
|
|
72
|
+
*
|
|
73
|
+
* 实现:
|
|
74
|
+
* 1. 校验 testcase.json5 通过 validateTestcase(v2 schema);
|
|
75
|
+
* 2. 门禁检查:用例必须全部 confirmed、未覆盖项不得为 candidate/unresolved(REQ-INFER-007);
|
|
76
|
+
* 3. 加载 contract.json(位于 <tests-dir>/.ep-stage/contract.json;不存在时报错引导用户先跑 testcase 子命令);
|
|
77
|
+
* 4. 调 generateStageSkeletonCrudSpec 生成基线骨架脚本;
|
|
78
|
+
* 5. 头部插入 SKELETON_MARKER_LINE 标记,写盘。
|
|
79
|
+
*
|
|
80
|
+
* 消费边界(REQ-INFER-008):只读 testcase.json5 + contract.json,不读 inference-trace.json。
|
|
81
|
+
*
|
|
82
|
+
* @param args - 解析后的参数。
|
|
83
|
+
* @returns SpecResult(含 version='v1' 显式标识阶段)。
|
|
84
|
+
*/
|
|
85
|
+
export function runSpec(args) {
|
|
86
|
+
const testcaseRaw = JSON5.parse(readFileSync(args.testcase, 'utf8'));
|
|
87
|
+
const testcase = validateTestcase(testcaseRaw);
|
|
88
|
+
assertTestcaseReadyForSpec(testcase);
|
|
89
|
+
const contractPath = locateContract(args.testcase);
|
|
90
|
+
if (!contractPath) {
|
|
91
|
+
throw new Error(`未找到 ${path.dirname(args.testcase)}/.ep-stage/contract.json。请先运行 \`ep-stage-skill testcase --code-list <p> --tests-dir <p>\` 生成 contract.json。`);
|
|
92
|
+
}
|
|
93
|
+
const contract = JSON.parse(readFileSync(contractPath, 'utf8'));
|
|
94
|
+
const script = generateStageSkeletonCrudSpec({
|
|
95
|
+
contract,
|
|
96
|
+
menuNavigation: testcase.menuPath,
|
|
97
|
+
});
|
|
98
|
+
const body = `${SKELETON_MARKER_LINE}\n${script}`;
|
|
99
|
+
mkdirSync(path.dirname(args.out), { recursive: true });
|
|
100
|
+
writeFileSync(args.out, body, 'utf8');
|
|
101
|
+
return { specPath: args.out, version: 'v1' };
|
|
102
|
+
}
|
|
@@ -10,19 +10,58 @@ export type StageContext = {
|
|
|
10
10
|
codeListPaths: string[];
|
|
11
11
|
stageContextPath?: string;
|
|
12
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* projects.index.json5 顶层 systems[] 条目(REQ-DATA-01 修订 / spec §4.1)。
|
|
15
|
+
*
|
|
16
|
+
* 系统级凭据缓存按 (url, role) 维度组织,跨多个 project 共用。
|
|
17
|
+
* knownRoles 与 credentialsCache 必填,可为空数组 / 空对象(spec 要求字段存在)。
|
|
18
|
+
*/
|
|
19
|
+
export type SystemEntry = {
|
|
20
|
+
url: string;
|
|
21
|
+
knownRoles: string[];
|
|
22
|
+
credentialsCache: Record<string, {
|
|
23
|
+
username: string;
|
|
24
|
+
password: string;
|
|
25
|
+
lastUsed: string;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* projects.index.json5 中 projects[].requirements[] 条目(REQ-DATA-01 修订 / spec §4.1)。
|
|
30
|
+
*/
|
|
31
|
+
export type RequirementEntry = {
|
|
32
|
+
name: string;
|
|
33
|
+
requirementDir: string;
|
|
34
|
+
testsDir: string;
|
|
35
|
+
lastRunAt?: string;
|
|
36
|
+
lastRunStatus?: 'passed' | 'failed' | 'partial' | 'never';
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* projects.index.json5 中 projects[] 条目(REQ-DATA-01 修订 / spec §4.1)。
|
|
40
|
+
*
|
|
41
|
+
* stageCreateVersion 承接砍掉的 stage-context.md 元信息;requirements[] 承载需求级状态。
|
|
42
|
+
* 旧字段 envPath/knowledgeRoot/codeListPaths/stageContextPath 已被 schema 拒绝,类型层不再声明。
|
|
43
|
+
* 兼容性:旧数据若残留这些字段,由 normalizeProjectIndexEntry 内的 graceful-read 路径解析,
|
|
44
|
+
* 不污染类型契约。
|
|
45
|
+
*/
|
|
13
46
|
export type ProjectIndexEntry = {
|
|
14
47
|
projectName: string;
|
|
15
48
|
projectDir: string;
|
|
16
49
|
mode: StageContextMode;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
stageContextPath?: string;
|
|
50
|
+
createdAt?: string;
|
|
51
|
+
stageCreateVersion: string;
|
|
52
|
+
requirements: RequirementEntry[];
|
|
21
53
|
};
|
|
22
|
-
|
|
23
|
-
|
|
54
|
+
/**
|
|
55
|
+
* projects.index.json5 顶层结构(REQ-DATA-01 修订 / spec §4.1)。
|
|
56
|
+
*
|
|
57
|
+
* 顶层 systems[] 承接多项目共享的系统级凭据缓存。
|
|
58
|
+
*/
|
|
59
|
+
export type ProjectsIndex = {
|
|
24
60
|
projects: ProjectIndexEntry[];
|
|
61
|
+
systems: SystemEntry[];
|
|
25
62
|
};
|
|
63
|
+
/** @deprecated 旧名,使用 ProjectsIndex;保留仅为外部 import 兼容。 */
|
|
64
|
+
export type ProjectIndex = ProjectsIndex;
|
|
26
65
|
export type ResolveStageContextInput = {
|
|
27
66
|
stageContextPath?: string;
|
|
28
67
|
projectDir?: string;
|
|
@@ -34,27 +73,52 @@ export type ResolveStageContextResult = {
|
|
|
34
73
|
context: StageContext;
|
|
35
74
|
trace: ObservableStagePayload;
|
|
36
75
|
};
|
|
76
|
+
export type LookupProjectByRequirementInput = {
|
|
77
|
+
requirementPath: string;
|
|
78
|
+
homeDir?: string;
|
|
79
|
+
};
|
|
37
80
|
/**
|
|
38
81
|
* 读取项目级 stage-context.md,并将相对路径归一到项目目录。
|
|
39
82
|
*
|
|
83
|
+
* @deprecated stage-context.md 已砍(REQ-ENV-01 修订);新链路应从 projects.index.json5 反查
|
|
84
|
+
* ({@link lookupProjectByRequirement})。本函数保留仅为零回归兼容,
|
|
85
|
+
* 不要在新代码里调用。
|
|
40
86
|
* @param stageContextPath - stage-context.md 文件路径。
|
|
41
87
|
* @returns 归一化后的项目上下文。
|
|
42
88
|
* @throws 当 frontmatter 缺少必要字段或格式不合法时抛出错误。
|
|
43
89
|
*/
|
|
44
90
|
export declare function readStageContext(stageContextPath: string): StageContext;
|
|
45
91
|
/**
|
|
46
|
-
* 写入用户级 ep-stage
|
|
92
|
+
* 写入用户级 ep-stage 项目索引(REQ-DATA-01 修订 / spec §4.1)。
|
|
47
93
|
*
|
|
48
|
-
*
|
|
94
|
+
* 新 schema:顶层 `{ projects: [...], systems: [...] }`,无 `version` 字段;
|
|
95
|
+
* projects[] 条目不再写入 envPath/knowledgeRoot/codeListPaths/stageContextPath 等 legacy 字段。
|
|
96
|
+
*
|
|
97
|
+
* @param input - HOME 目录、项目列表,以及可选的 systems[](不传按空数组写入)。
|
|
49
98
|
* @returns 写入后的索引文件路径。
|
|
50
99
|
*/
|
|
51
100
|
export declare function writeProjectIndex(input: {
|
|
52
101
|
homeDir?: string;
|
|
53
102
|
projects: ProjectIndexEntry[];
|
|
103
|
+
systems?: SystemEntry[];
|
|
54
104
|
}): string;
|
|
105
|
+
/**
|
|
106
|
+
* 从 `~/.ep-stage/projects.index.json5` 反查匹配的 ProjectIndexEntry(REQ-DATA-01 修订 / spec §5.2 §5.3)。
|
|
107
|
+
*
|
|
108
|
+
* 匹配优先级:①精确 requirementDir / testsDir 命中;②精确 projectDir 命中。
|
|
109
|
+
* 用于 glue-generate-testcase / glue-run-test skill 的「反查项目脚手架」步骤——
|
|
110
|
+
* 给定一个需求目录或项目目录,回到对应的 ProjectIndexEntry(不再依赖砍掉的 stage-context.md)。
|
|
111
|
+
*
|
|
112
|
+
* @param input - 需求路径或项目目录 + 可选 homeDir。
|
|
113
|
+
* @returns 匹配的 ProjectIndexEntry,未匹配返回 null。
|
|
114
|
+
*/
|
|
115
|
+
export declare function lookupProjectByRequirement(input: LookupProjectByRequirementInput): ProjectIndexEntry | null;
|
|
55
116
|
/**
|
|
56
117
|
* 按固定优先级解析 ep-stage 项目上下文,并返回可审阅 trace。
|
|
57
118
|
*
|
|
119
|
+
* @deprecated 旧链路依赖 stage-context.md 与 codeListPaths 匹配,stage-context.md 已砍
|
|
120
|
+
* (REQ-ENV-01 修订)。保留实现仅为零回归兼容;新代码请使用
|
|
121
|
+
* {@link lookupProjectByRequirement}。
|
|
58
122
|
* @param input - 显式路径、当前目录、code_list 路径和可选 HOME。
|
|
59
123
|
* @returns 解析出的项目上下文与 context-resolution trace。
|
|
60
124
|
* @throws 当无法定位任何上下文来源时抛出错误。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-context.d.ts","sourceRoot":"","sources":["../../../src/context/stage-context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"stage-context.d.ts","sourceRoot":"","sources":["../../../src/context/stage-context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5F,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CAC3D,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC,MAAM,MAAM,wBAAwB,GAAG;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,sBAAsB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAuBF;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,CAqBvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB,GAAG,MAAM,CAST;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,iBAAiB,GAAG,IAAI,CAmB1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,CA8D9F"}
|
|
@@ -6,6 +6,9 @@ import YAML from 'yaml';
|
|
|
6
6
|
/**
|
|
7
7
|
* 读取项目级 stage-context.md,并将相对路径归一到项目目录。
|
|
8
8
|
*
|
|
9
|
+
* @deprecated stage-context.md 已砍(REQ-ENV-01 修订);新链路应从 projects.index.json5 反查
|
|
10
|
+
* ({@link lookupProjectByRequirement})。本函数保留仅为零回归兼容,
|
|
11
|
+
* 不要在新代码里调用。
|
|
9
12
|
* @param stageContextPath - stage-context.md 文件路径。
|
|
10
13
|
* @returns 归一化后的项目上下文。
|
|
11
14
|
* @throws 当 frontmatter 缺少必要字段或格式不合法时抛出错误。
|
|
@@ -31,20 +34,55 @@ export function readStageContext(stageContextPath) {
|
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
|
-
* 写入用户级 ep-stage
|
|
37
|
+
* 写入用户级 ep-stage 项目索引(REQ-DATA-01 修订 / spec §4.1)。
|
|
35
38
|
*
|
|
36
|
-
*
|
|
39
|
+
* 新 schema:顶层 `{ projects: [...], systems: [...] }`,无 `version` 字段;
|
|
40
|
+
* projects[] 条目不再写入 envPath/knowledgeRoot/codeListPaths/stageContextPath 等 legacy 字段。
|
|
41
|
+
*
|
|
42
|
+
* @param input - HOME 目录、项目列表,以及可选的 systems[](不传按空数组写入)。
|
|
37
43
|
* @returns 写入后的索引文件路径。
|
|
38
44
|
*/
|
|
39
45
|
export function writeProjectIndex(input) {
|
|
40
46
|
const indexPath = getProjectIndexPath(input.homeDir);
|
|
41
47
|
mkdirSync(path.dirname(indexPath), { recursive: true });
|
|
42
|
-
writeFileSync(indexPath, `${JSON5.stringify({
|
|
48
|
+
writeFileSync(indexPath, `${JSON5.stringify({ projects: input.projects, systems: input.systems ?? [] }, null, 2)}\n`, 'utf8');
|
|
43
49
|
return indexPath;
|
|
44
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* 从 `~/.ep-stage/projects.index.json5` 反查匹配的 ProjectIndexEntry(REQ-DATA-01 修订 / spec §5.2 §5.3)。
|
|
53
|
+
*
|
|
54
|
+
* 匹配优先级:①精确 requirementDir / testsDir 命中;②精确 projectDir 命中。
|
|
55
|
+
* 用于 glue-generate-testcase / glue-run-test skill 的「反查项目脚手架」步骤——
|
|
56
|
+
* 给定一个需求目录或项目目录,回到对应的 ProjectIndexEntry(不再依赖砍掉的 stage-context.md)。
|
|
57
|
+
*
|
|
58
|
+
* @param input - 需求路径或项目目录 + 可选 homeDir。
|
|
59
|
+
* @returns 匹配的 ProjectIndexEntry,未匹配返回 null。
|
|
60
|
+
*/
|
|
61
|
+
export function lookupProjectByRequirement(input) {
|
|
62
|
+
const indexPath = getProjectIndexPath(input.homeDir);
|
|
63
|
+
if (!existsSync(indexPath))
|
|
64
|
+
return null;
|
|
65
|
+
const parsed = JSON5.parse(readFileSync(indexPath, 'utf8'));
|
|
66
|
+
const target = path.resolve(input.requirementPath);
|
|
67
|
+
for (const project of parsed.projects ?? []) {
|
|
68
|
+
for (const requirement of project.requirements ?? []) {
|
|
69
|
+
if (path.resolve(requirement.requirementDir) === target ||
|
|
70
|
+
path.resolve(requirement.testsDir) === target) {
|
|
71
|
+
return project;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (path.resolve(project.projectDir) === target) {
|
|
75
|
+
return project;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
45
80
|
/**
|
|
46
81
|
* 按固定优先级解析 ep-stage 项目上下文,并返回可审阅 trace。
|
|
47
82
|
*
|
|
83
|
+
* @deprecated 旧链路依赖 stage-context.md 与 codeListPaths 匹配,stage-context.md 已砍
|
|
84
|
+
* (REQ-ENV-01 修订)。保留实现仅为零回归兼容;新代码请使用
|
|
85
|
+
* {@link lookupProjectByRequirement}。
|
|
48
86
|
* @param input - 显式路径、当前目录、code_list 路径和可选 HOME。
|
|
49
87
|
* @returns 解析出的项目上下文与 context-resolution trace。
|
|
50
88
|
* @throws 当无法定位任何上下文来源时抛出错误。
|
|
@@ -75,8 +113,8 @@ export function resolveStageContext(input) {
|
|
|
75
113
|
};
|
|
76
114
|
}
|
|
77
115
|
const indexPath = getProjectIndexPath(input.homeDir);
|
|
78
|
-
const
|
|
79
|
-
const matched =
|
|
116
|
+
const indexEntries = readProjectIndexRaw(indexPath);
|
|
117
|
+
const matched = indexEntries.find((entry) => matchesProjectIndexEntry(entry, {
|
|
80
118
|
projectDir: input.projectDir,
|
|
81
119
|
cwd: input.cwd,
|
|
82
120
|
codeListPath: input.codeListPath,
|
|
@@ -95,8 +133,9 @@ export function resolveStageContext(input) {
|
|
|
95
133
|
}
|
|
96
134
|
throw new Error(`stage context not found from ${startDir} or ${indexPath}`);
|
|
97
135
|
}
|
|
98
|
-
const
|
|
99
|
-
|
|
136
|
+
const matchedLegacy = matched;
|
|
137
|
+
const context = matchedLegacy.stageContextPath
|
|
138
|
+
? readStageContext(resolvePath(path.resolve(matched.projectDir), matchedLegacy.stageContextPath))
|
|
100
139
|
: normalizeProjectIndexEntry(matched);
|
|
101
140
|
return {
|
|
102
141
|
context,
|
|
@@ -140,22 +179,29 @@ function parseStageContextFrontmatter(markdown) {
|
|
|
140
179
|
return YAML.parse(match[1] ?? '');
|
|
141
180
|
}
|
|
142
181
|
/**
|
|
143
|
-
* 读取用户级 JSON5
|
|
182
|
+
* 读取用户级 JSON5 项目索引的原始 projects[](含可能残留的 legacy 字段)。
|
|
183
|
+
*
|
|
184
|
+
* 新代码请使用 {@link lookupProjectByRequirement},本函数仅服务于
|
|
185
|
+
* {@link resolveStageContext} 的零回归兼容。
|
|
144
186
|
*
|
|
145
187
|
* @param indexPath - 索引文件路径。
|
|
146
|
-
* @returns
|
|
188
|
+
* @returns 原始 projects[] 数组,缺失返回空数组。
|
|
147
189
|
*/
|
|
148
|
-
function
|
|
190
|
+
function readProjectIndexRaw(indexPath) {
|
|
149
191
|
if (!existsSync(indexPath)) {
|
|
150
|
-
return
|
|
192
|
+
return [];
|
|
151
193
|
}
|
|
152
194
|
const parsed = JSON5.parse(readFileSync(indexPath, 'utf8'));
|
|
153
|
-
return
|
|
195
|
+
return (parsed.projects ?? []);
|
|
154
196
|
}
|
|
155
197
|
/**
|
|
156
|
-
* 将用户索引条目归一为 StageContext
|
|
198
|
+
* 将用户索引条目归一为 StageContext(含旧 legacy 字段 graceful read)。
|
|
199
|
+
*
|
|
200
|
+
* 新数据条目(spec §4.1)无 envPath/knowledgeRoot/codeListPaths 字段,此函数会回填默认值
|
|
201
|
+
* (envPath='.env',knowledgeRoot=undefined,codeListPaths=[])。
|
|
202
|
+
* 旧数据条目仍可携带这些字段,按原逻辑归一相对路径。
|
|
157
203
|
*
|
|
158
|
-
* @param entry -
|
|
204
|
+
* @param entry - 用户索引中的项目条目(可能携带 legacy 字段)。
|
|
159
205
|
* @returns 归一化后的项目上下文。
|
|
160
206
|
*/
|
|
161
207
|
function normalizeProjectIndexEntry(entry) {
|
|
@@ -175,7 +221,7 @@ function normalizeProjectIndexEntry(entry) {
|
|
|
175
221
|
/**
|
|
176
222
|
* 判断用户索引条目是否匹配当前 projectDir、cwd 或 code_list 路径。
|
|
177
223
|
*
|
|
178
|
-
* @param entry -
|
|
224
|
+
* @param entry - 用户索引中的项目条目(可能携带 legacy codeListPaths)。
|
|
179
225
|
* @param input - 当前解析输入。
|
|
180
226
|
* @returns 是否匹配该条目。
|
|
181
227
|
*/
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inference-trace.json 的类型定义(Plan Task 2)。
|
|
3
|
+
*
|
|
4
|
+
* 本文件只定义 `InferenceTraceV1` 的顶层章节类型:
|
|
5
|
+
* - {@link MaterialInventoryTrace}:物料清单(Task 3 负责组装,本任务只定义类型)。
|
|
6
|
+
* - {@link SourceAnalysis}:源分析快照,由 {@link buildSourceAnalysis} 产出。
|
|
7
|
+
* - {@link ModuleHintsInference}:动态槽位推理过程,由 {@link inferModuleHintsFromMaterials} 产出。
|
|
8
|
+
* - {@link InferenceTraceV1}:以上章节 + coverageDiff + reasoningSummary 的总账。
|
|
9
|
+
*
|
|
10
|
+
* 设计原则(spec §8):顶层章节稳定,内部证据数组与 reason 允许扩展。
|
|
11
|
+
*/
|
|
12
|
+
import type { DeleteExpectedOutcome } from './crud-business-module.js';
|
|
13
|
+
/**
|
|
14
|
+
* 单个物料的解析状态。
|
|
15
|
+
*
|
|
16
|
+
* @property status - resolved 表示物料存在且可读;missing 表示未找到。
|
|
17
|
+
* @property value - 物料值(路径或解析结果);status 为 missing 时省略。
|
|
18
|
+
* @property reason - status 为 missing 时的缺失原因。
|
|
19
|
+
* @property evidence - 可选的来源证据(如"HTML 目录名")。
|
|
20
|
+
*/
|
|
21
|
+
export type MaterialSlotStatus = {
|
|
22
|
+
status: 'resolved' | 'missing';
|
|
23
|
+
value?: string;
|
|
24
|
+
reason?: string;
|
|
25
|
+
evidence?: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* 物料清单章节(spec §7 materialInventory)。
|
|
29
|
+
*
|
|
30
|
+
* Task 3 在 probe.ts 中组装,本任务只定义类型。
|
|
31
|
+
*/
|
|
32
|
+
export type MaterialInventoryTrace = {
|
|
33
|
+
knowledgeRoot: string;
|
|
34
|
+
moduleId: MaterialSlotStatus;
|
|
35
|
+
menu: MaterialSlotStatus;
|
|
36
|
+
htmlFiles: MaterialSlotStatus[];
|
|
37
|
+
javaActionFiles: MaterialSlotStatus[];
|
|
38
|
+
docsFiles: MaterialSlotStatus[];
|
|
39
|
+
missing: string[];
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* 源分析模式。
|
|
43
|
+
*
|
|
44
|
+
* - `extracted`:存在 spec.yaml,契约从规格抽取。
|
|
45
|
+
* - `inferred`:无 spec.yaml,契约靠推理。
|
|
46
|
+
* - `mixed`:部分从规格抽取、部分靠推理。
|
|
47
|
+
* - `prd+html+java`:基于 PRD markdown + HTML 页面 + Java Action 推理(014 场景)。
|
|
48
|
+
*/
|
|
49
|
+
export type SourceAnalysisMode = 'extracted' | 'inferred' | 'mixed' | 'prd+html+java';
|
|
50
|
+
/**
|
|
51
|
+
* 源分析中登记的一个证据来源。
|
|
52
|
+
*
|
|
53
|
+
* @property kind - 来源类别(prd_markdown / spec_yaml / html / java_action 等)。
|
|
54
|
+
* @property path - 来源文件绝对路径。
|
|
55
|
+
* @property provides - 该来源为推理提供的能力(如 searchFields、backendMethods)。
|
|
56
|
+
*/
|
|
57
|
+
export type SourceAnalysisEntry = {
|
|
58
|
+
kind: string;
|
|
59
|
+
path: string;
|
|
60
|
+
provides: string[];
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* UI 侧信号(来自 HTML 页面抽取)。
|
|
64
|
+
*
|
|
65
|
+
* @property pageId - 所属页面标识。
|
|
66
|
+
* @property kind - 信号类别(field / button / gridColumn / dialog / structureSignal)。
|
|
67
|
+
* @property label - 可读标签。
|
|
68
|
+
* @property value - 信号值(字段名 / 按钮文字 / 列 field 等)。
|
|
69
|
+
*/
|
|
70
|
+
export type UiSignal = {
|
|
71
|
+
pageId: string;
|
|
72
|
+
kind: 'field' | 'button' | 'gridColumn' | 'dialog' | 'structureSignal';
|
|
73
|
+
label: string;
|
|
74
|
+
value?: string;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 后端侧信号(来自 Java Action 抽取)。
|
|
78
|
+
*
|
|
79
|
+
* @property controllerName - 所属 Controller 名称。
|
|
80
|
+
* @property kind - 信号类别(method / callbackMessage)。
|
|
81
|
+
* @property value - 信号值(方法名 / 消息文本)。
|
|
82
|
+
*/
|
|
83
|
+
export type BackendSignal = {
|
|
84
|
+
controllerName: string;
|
|
85
|
+
kind: 'method' | 'callbackMessage';
|
|
86
|
+
value: string;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* 源分析章节(spec §7 sourceAnalysis)。
|
|
90
|
+
*
|
|
91
|
+
* @property mode - 源分析模式。
|
|
92
|
+
* @property confidence - 推理置信度。
|
|
93
|
+
* @property sources - 登记的证据来源列表。
|
|
94
|
+
* @property fields - 跨页面汇总的字段名候选。
|
|
95
|
+
* @property businessRules - 从 PRD/Java 中提取的业务规则线索。
|
|
96
|
+
* @property uiSignals - UI 侧信号汇总。
|
|
97
|
+
* @property backendSignals - 后端侧信号汇总。
|
|
98
|
+
* @property unresolved - 未解析的来源或缺口说明。
|
|
99
|
+
*/
|
|
100
|
+
export type SourceAnalysis = {
|
|
101
|
+
mode: SourceAnalysisMode;
|
|
102
|
+
confidence: 'low' | 'medium' | 'high';
|
|
103
|
+
sources: SourceAnalysisEntry[];
|
|
104
|
+
fields: string[];
|
|
105
|
+
businessRules: string[];
|
|
106
|
+
uiSignals: UiSignal[];
|
|
107
|
+
backendSignals: BackendSignal[];
|
|
108
|
+
unresolved: string[];
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* dataKey 推理过程记录。
|
|
112
|
+
*
|
|
113
|
+
* @property selectedField - 最终选定的主键字段。
|
|
114
|
+
* @property reason - 选择理由。
|
|
115
|
+
* @property evidence - 支撑证据(出现该字段的位置)。
|
|
116
|
+
*/
|
|
117
|
+
export type DataKeyInference = {
|
|
118
|
+
selectedField?: string;
|
|
119
|
+
reason?: string;
|
|
120
|
+
evidence: string[];
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* 搜索条件推理过程记录。
|
|
124
|
+
*
|
|
125
|
+
* @property field - 搜索条件字段名。
|
|
126
|
+
* @property component - 控件类型(input / listbox)。
|
|
127
|
+
* @property resolved - 是否已解析到可用值/策略。
|
|
128
|
+
* @property reason - 未解析时的原因。
|
|
129
|
+
*/
|
|
130
|
+
export type SearchConditionInference = {
|
|
131
|
+
field: string;
|
|
132
|
+
component?: 'input' | 'listbox';
|
|
133
|
+
resolved: boolean;
|
|
134
|
+
reason?: string;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* 删除策略推理过程记录。
|
|
138
|
+
*
|
|
139
|
+
* @property value - 推理出的删除策略。
|
|
140
|
+
* @property reason - 选择理由。
|
|
141
|
+
* @property evidence - 支撑证据(Java messages)。
|
|
142
|
+
*/
|
|
143
|
+
export type DeletePolicyInference = {
|
|
144
|
+
value?: DeleteExpectedOutcome;
|
|
145
|
+
reason?: string;
|
|
146
|
+
evidence: string[];
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* 自定义工作流推理过程记录。
|
|
150
|
+
*
|
|
151
|
+
* @property label - 工作流标签(工具栏按钮文字)。
|
|
152
|
+
* @property actionAlias - 关联的动作别名。
|
|
153
|
+
* @property expectedIntent - 预期业务意图。
|
|
154
|
+
* @property expectedAssertion - 预期断言(有 Java callback 时填)。
|
|
155
|
+
* @property resolved - 是否已解析到可用断言。
|
|
156
|
+
* @property reason - 未解析时的原因。
|
|
157
|
+
* @property evidence - 支撑证据。
|
|
158
|
+
*/
|
|
159
|
+
export type CustomWorkflowInference = {
|
|
160
|
+
label: string;
|
|
161
|
+
actionAlias?: string[];
|
|
162
|
+
expectedIntent?: string;
|
|
163
|
+
expectedAssertion?: string;
|
|
164
|
+
resolved: boolean;
|
|
165
|
+
reason?: string;
|
|
166
|
+
evidence: string[];
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* 动态槽位推理章节(spec §7 moduleHintsInference)。
|
|
170
|
+
*
|
|
171
|
+
* @property mode - inferred 表示纯推理;merged 表示与显式 hints 合并。
|
|
172
|
+
* @property confidence - 推理置信度。
|
|
173
|
+
* @property dataKey - dataKey 推理过程。
|
|
174
|
+
* @property searchConditions - 搜索条件推理过程。
|
|
175
|
+
* @property buttonAliases - 按钮别名归类。
|
|
176
|
+
* @property deletePolicy - 删除策略推理过程。
|
|
177
|
+
* @property assertionPolicy - 断言策略推理过程。
|
|
178
|
+
* @property customWorkflows - 自定义工作流推理过程。
|
|
179
|
+
* @property unresolved - 未解析槽位列表。
|
|
180
|
+
*/
|
|
181
|
+
export type ModuleHintsInference = {
|
|
182
|
+
mode: 'inferred' | 'merged' | 'explicit_override';
|
|
183
|
+
confidence: 'low' | 'medium' | 'high';
|
|
184
|
+
dataKey: DataKeyInference;
|
|
185
|
+
searchConditions: SearchConditionInference[];
|
|
186
|
+
buttonAliases: Record<string, string[]>;
|
|
187
|
+
deletePolicy: DeletePolicyInference;
|
|
188
|
+
assertionPolicy: Record<string, string>;
|
|
189
|
+
customWorkflows: CustomWorkflowInference[];
|
|
190
|
+
unresolved: string[];
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* inference-trace.json 总账类型(schemaVersion: inference-trace/v1)。
|
|
194
|
+
*
|
|
195
|
+
* @property schemaVersion - 固定为 'inference-trace/v1'。
|
|
196
|
+
* @property codeListPath - code_list.md 绝对路径。
|
|
197
|
+
* @property generatedAt - 生成时间(ISO 8601)。
|
|
198
|
+
* @property materialInventory - 物料清单章节。
|
|
199
|
+
* @property sourceAnalysis - 源分析章节。
|
|
200
|
+
* @property moduleHintsInference - 动态槽位推理章节。
|
|
201
|
+
* @property coverageDiff - 覆盖差异章节(Task 3 后续 reconcile,本任务用内联形状)。
|
|
202
|
+
* @property reasoningSummary - 推理摘要章节。
|
|
203
|
+
*/
|
|
204
|
+
export type InferenceTraceV1 = {
|
|
205
|
+
schemaVersion: 'inference-trace/v1';
|
|
206
|
+
codeListPath: string;
|
|
207
|
+
generatedAt: string;
|
|
208
|
+
materialInventory: MaterialInventoryTrace;
|
|
209
|
+
sourceAnalysis: SourceAnalysis;
|
|
210
|
+
moduleHintsInference: ModuleHintsInference;
|
|
211
|
+
coverageDiff: {
|
|
212
|
+
coveredActions: unknown[];
|
|
213
|
+
uncoveredCandidates: unknown[];
|
|
214
|
+
needsReview: string[];
|
|
215
|
+
};
|
|
216
|
+
reasoningSummary: {
|
|
217
|
+
conclusion: string;
|
|
218
|
+
confidence: 'low' | 'medium' | 'high';
|
|
219
|
+
risks: string[];
|
|
220
|
+
needsHumanReview: boolean;
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
//# sourceMappingURL=inference-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference-trace.d.ts","sourceRoot":"","sources":["../../../src/contracts/inference-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inference-trace.json 的类型定义(Plan Task 2)。
|
|
3
|
+
*
|
|
4
|
+
* 本文件只定义 `InferenceTraceV1` 的顶层章节类型:
|
|
5
|
+
* - {@link MaterialInventoryTrace}:物料清单(Task 3 负责组装,本任务只定义类型)。
|
|
6
|
+
* - {@link SourceAnalysis}:源分析快照,由 {@link buildSourceAnalysis} 产出。
|
|
7
|
+
* - {@link ModuleHintsInference}:动态槽位推理过程,由 {@link inferModuleHintsFromMaterials} 产出。
|
|
8
|
+
* - {@link InferenceTraceV1}:以上章节 + coverageDiff + reasoningSummary 的总账。
|
|
9
|
+
*
|
|
10
|
+
* 设计原则(spec §8):顶层章节稳定,内部证据数组与 reason 允许扩展。
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* 从 `code_list.md` 钻探出的单条上游物料引用。
|
|
3
3
|
*
|
|
4
4
|
* @property kind - 物料类别(html / java_action / spec / module_hints / other)。
|
|
5
|
-
* @property rawPath - markdown
|
|
6
|
-
* @property path -
|
|
5
|
+
* @property rawPath - markdown 中以反引号包裹的原始路径。
|
|
6
|
+
* @property path - 解析后的绝对路径(优先相对 knowledgeRoot,兼容回落到 code_list 所在目录)。
|
|
7
7
|
* @property exists - 解析后的路径是否真实存在,供下游 material-inventory gate 判定。
|
|
8
8
|
*/
|
|
9
9
|
export type ExtractedMaterialRef = {
|
|
@@ -15,7 +15,7 @@ export type ExtractedMaterialRef = {
|
|
|
15
15
|
export type ExtractedCodeListSummary = {
|
|
16
16
|
path: string;
|
|
17
17
|
knowledgeRoot?: string;
|
|
18
|
-
knowledgeRootSource: 'input' | 'code_list' | '
|
|
18
|
+
knowledgeRootSource: 'input' | 'code_list' | 'none';
|
|
19
19
|
menu?: string;
|
|
20
20
|
moduleLabel: string;
|
|
21
21
|
pages: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-list.d.ts","sourceRoot":"","sources":["../../../src/extractors/code-list.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAC;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,GAAG,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"code-list.d.ts","sourceRoot":"","sources":["../../../src/extractors/code-list.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAC;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAyPF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,6BAAkC,GAC1C,wBAAwB,CAuC1B"}
|