soloforge 1.1.71 → 1.1.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/core/types.d.ts +11 -0
  2. package/dist/core/types.d.ts.map +1 -1
  3. package/dist/domain/asset_registry/derived_types.d.ts +1 -1
  4. package/dist/domain/asset_registry/derived_types.d.ts.map +1 -1
  5. package/dist/gate/contracts/deviation_metrics.d.ts +42 -0
  6. package/dist/gate/contracts/deviation_metrics.d.ts.map +1 -0
  7. package/dist/gate/contracts/deviation_metrics.js +40 -0
  8. package/dist/gate/contracts/deviation_metrics.js.map +1 -0
  9. package/dist/gate/executors/executors_arch_conduction.d.ts +2 -0
  10. package/dist/gate/executors/executors_arch_conduction.d.ts.map +1 -0
  11. package/dist/gate/executors/executors_arch_conduction.js +58 -0
  12. package/dist/gate/executors/executors_arch_conduction.js.map +1 -0
  13. package/dist/gate/executors/executors_arch_coverage.d.ts +2 -0
  14. package/dist/gate/executors/executors_arch_coverage.d.ts.map +1 -0
  15. package/dist/gate/executors/executors_arch_coverage.js +66 -0
  16. package/dist/gate/executors/executors_arch_coverage.js.map +1 -0
  17. package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
  18. package/dist/gate/executors/executors_artifact.js +6 -0
  19. package/dist/gate/executors/executors_artifact.js.map +1 -1
  20. package/dist/gate/executors/executors_companion.d.ts +2 -0
  21. package/dist/gate/executors/executors_companion.d.ts.map +1 -0
  22. package/dist/gate/executors/executors_companion.js +74 -0
  23. package/dist/gate/executors/executors_companion.js.map +1 -0
  24. package/dist/gate/executors/executors_crud.d.ts +4 -0
  25. package/dist/gate/executors/executors_crud.d.ts.map +1 -0
  26. package/dist/gate/executors/executors_crud.js +130 -0
  27. package/dist/gate/executors/executors_crud.js.map +1 -0
  28. package/dist/gate/executors/executors_deviation_summary.d.ts +2 -0
  29. package/dist/gate/executors/executors_deviation_summary.d.ts.map +1 -0
  30. package/dist/gate/executors/executors_deviation_summary.js +56 -0
  31. package/dist/gate/executors/executors_deviation_summary.js.map +1 -0
  32. package/dist/gate/executors/executors_field_mapping.d.ts.map +1 -1
  33. package/dist/gate/executors/executors_field_mapping.js +3 -2
  34. package/dist/gate/executors/executors_field_mapping.js.map +1 -1
  35. package/dist/gate/executors/executors_openapi_conformance.d.ts +6 -0
  36. package/dist/gate/executors/executors_openapi_conformance.d.ts.map +1 -0
  37. package/dist/gate/executors/executors_openapi_conformance.js +119 -0
  38. package/dist/gate/executors/executors_openapi_conformance.js.map +1 -0
  39. package/dist/gate/executors/executors_proto_interaction.d.ts +2 -0
  40. package/dist/gate/executors/executors_proto_interaction.d.ts.map +1 -0
  41. package/dist/gate/executors/executors_proto_interaction.js +65 -0
  42. package/dist/gate/executors/executors_proto_interaction.js.map +1 -0
  43. package/dist/gate/executors/executors_required_artifact.d.ts +2 -0
  44. package/dist/gate/executors/executors_required_artifact.d.ts.map +1 -0
  45. package/dist/gate/executors/executors_required_artifact.js +49 -0
  46. package/dist/gate/executors/executors_required_artifact.js.map +1 -0
  47. package/dist/gate/executors/executors_schema_conformance.d.ts +4 -0
  48. package/dist/gate/executors/executors_schema_conformance.d.ts.map +1 -0
  49. package/dist/gate/executors/executors_schema_conformance.js +91 -0
  50. package/dist/gate/executors/executors_schema_conformance.js.map +1 -0
  51. package/dist/gate/executors/executors_section_integrity.d.ts +2 -0
  52. package/dist/gate/executors/executors_section_integrity.d.ts.map +1 -0
  53. package/dist/gate/executors/executors_section_integrity.js +95 -0
  54. package/dist/gate/executors/executors_section_integrity.js.map +1 -0
  55. package/dist/gate/executors/executors_slice_contract.d.ts +4 -0
  56. package/dist/gate/executors/executors_slice_contract.d.ts.map +1 -0
  57. package/dist/gate/executors/executors_slice_contract.js +62 -0
  58. package/dist/gate/executors/executors_slice_contract.js.map +1 -0
  59. package/dist/gate/executors/index.d.ts.map +1 -1
  60. package/dist/gate/executors/index.js +22 -0
  61. package/dist/gate/executors/index.js.map +1 -1
  62. package/dist/gate/gate_engine.d.ts +7 -0
  63. package/dist/gate/gate_engine.d.ts.map +1 -1
  64. package/dist/gate/gate_engine.js.map +1 -1
  65. package/dist/server/tools/sf_work.d.ts.map +1 -1
  66. package/dist/server/tools/sf_work.js +3 -0
  67. package/dist/server/tools/sf_work.js.map +1 -1
  68. package/package.json +1 -1
  69. package/templates/build/enforced.md +24 -0
  70. package/templates/design/enforced.md +49 -0
  71. package/templates/design//346/236/266/346/236/204/350/256/276/350/256/241/346/226/207/346/241/243.md +8 -0
  72. package/templates/shared/deterministic_executors.json +11 -0
  73. package/templates/verify/enforced.md +15 -0
  74. package/templates/verify//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245.md +1 -1
@@ -0,0 +1,130 @@
1
+ /**
2
+ * CRUD 完整性执行器 — openapi.yaml 资源型接口的操作完整性校验(确定性偏差:契约粒度)。
3
+ *
4
+ * 职责边界:
5
+ * - 负责:解析 openapi.yaml paths/methods,校验资源型接口(GET 列表 + POST 创建)有 PUT/PATCH(改)+ DELETE(删)
6
+ * - 不负责:字段/schema 完整性(FMAP/OPENAPI-LINT 管)、动作型接口(/login /calculate 不要求 CRUD)
7
+ *
8
+ * 被谁调用:gate_engine(crud_completeness executor)
9
+ * 调用谁:resolveCrossValidationArtifact(产物定位,复用 executors_trace)
10
+ *
11
+ * 数据流:evidence_required[0]=openapi.yaml → 解析 paths → 资源型 CRUD 完整性 → CheckResult(含 metric)
12
+ * 持久化:无
13
+ *
14
+ * 背景:堵 SmartCare「20 GET + 20 POST + 0 PUT/DELETE」——资源型接口只查+增、不能改删的偏差。
15
+ */
16
+ import { gateExecutors } from "../gate_executors.js";
17
+ import { existsSync, readFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ /** 解析 openapi.yaml paths 段 → Map<path, Set<method>>。
20
+ * 格式:`paths:` 下,` /path:`(2 空格)+ ` method:`(4 空格)。 */
21
+ function parseOpenapiPaths(content) {
22
+ const paths = new Map();
23
+ const lines = content.split("\n");
24
+ let curPath = null;
25
+ let inPaths = false;
26
+ for (const raw of lines) {
27
+ if (/^paths:\s*$/.test(raw)) {
28
+ inPaths = true;
29
+ curPath = null;
30
+ continue;
31
+ }
32
+ if (!inPaths)
33
+ continue;
34
+ const line = raw.replace(/\s+$/, "");
35
+ // 退出 paths 区:遇顶层键(无缩进,如 components:/servers:)
36
+ if (line.length > 0 && !line.startsWith(" ") && !line.startsWith("#")) {
37
+ if (/^(components|servers|security|tags|externalDocs|info|openapi):/.test(line)) {
38
+ inPaths = false;
39
+ continue;
40
+ }
41
+ }
42
+ // 路径行: /xxx:(2 空格缩进,以 / 开头)
43
+ const pathMatch = line.match(/^ (\/[^:]+):\s*$/);
44
+ if (pathMatch) {
45
+ curPath = pathMatch[1];
46
+ paths.set(curPath, new Set());
47
+ continue;
48
+ }
49
+ if (curPath === null)
50
+ continue;
51
+ // 方法行: get:/post:/put:/patch:/delete:(4 空格缩进)
52
+ const methodMatch = line.match(/^ (get|post|put|patch|delete):/);
53
+ if (methodMatch)
54
+ paths.get(curPath).add(methodMatch[1]);
55
+ }
56
+ return paths;
57
+ }
58
+ /** 校验资源型接口 CRUD 完整性。资源型 = 集合路径(无 {id})有 GET(列表)+ POST(创建)。
59
+ * 完整 = 该资源有 PUT/PATCH(改)+ DELETE(删)(在集合路径或 {id} 路径均可)。 */
60
+ function checkCrud(paths) {
61
+ const problems = [];
62
+ let resourceCount = 0;
63
+ let completeCount = 0;
64
+ for (const [col, methods] of paths) {
65
+ if (/\{[^}]+\}/.test(col))
66
+ continue; // 只看集合路径,{id} 路径单独查
67
+ if (!methods.has("get") || !methods.has("post"))
68
+ continue; // 动作型(无列表+创建)跳过
69
+ resourceCount++;
70
+ const idMethods = paths.get(col + "/{id}");
71
+ const hasPut = methods.has("put") || methods.has("patch") || !!idMethods?.has("put") || !!idMethods?.has("patch");
72
+ const hasDelete = methods.has("delete") || !!idMethods?.has("delete");
73
+ if (hasPut && hasDelete) {
74
+ completeCount++;
75
+ }
76
+ else {
77
+ const missing = [];
78
+ if (!hasPut)
79
+ missing.push("PUT/PATCH(改)");
80
+ if (!hasDelete)
81
+ missing.push("DELETE(删)");
82
+ problems.push(`${col}(GET列表+POST创建)缺 ${missing.join(" + ")}`);
83
+ }
84
+ }
85
+ return { resourceCount, completeCount, problems };
86
+ }
87
+ /** 注册 CRUD 完整性执行器。
88
+ * 配置:evidence_required[0]=openapi.yaml 相对项目根路径(默认 docs/api/openapi.yaml)。 */
89
+ export function registerCrudExecutor() {
90
+ gateExecutors.register("crud_completeness", async (check, ctx) => {
91
+ try {
92
+ const rel = check.evidence_required?.[0] ?? "docs/api/openapi.yaml";
93
+ const abs = join(ctx.projectRoot, rel);
94
+ if (!existsSync(abs)) {
95
+ // 无 API 产物(scope≠api)→ 跳过,不阻断
96
+ return {
97
+ check_id: check.id, executed_by: "code", passed: true, skipped: true,
98
+ evidence: `openapi.yaml 不存在(${rel}),无 API scope,跳过 CRUD 完整性校验`,
99
+ };
100
+ }
101
+ const content = readFileSync(abs, "utf-8");
102
+ const paths = parseOpenapiPaths(content);
103
+ const { resourceCount, completeCount, problems } = checkCrud(paths);
104
+ if (resourceCount === 0) {
105
+ return {
106
+ check_id: check.id, executed_by: "code", passed: true,
107
+ evidence: "无资源型接口(全动作型),跳过 CRUD 完整性",
108
+ metric: { passed: 0, total: 0, deviation_rate: 0 },
109
+ };
110
+ }
111
+ const deviationRate = (resourceCount - completeCount) / resourceCount;
112
+ const passed = problems.length === 0;
113
+ return {
114
+ check_id: check.id, executed_by: "code", passed,
115
+ metric: { passed: completeCount, total: resourceCount, deviation_rate: deviationRate },
116
+ evidence: passed
117
+ ? `CRUD 完整:${completeCount}/${resourceCount} 资源型接口均有 PUT/PATCH + DELETE`
118
+ : `CRUD 不完整:${completeCount}/${resourceCount} 资源型齐全;缺操作 ${problems.length} 项:${problems.slice(0, 5).join(";")}${problems.length > 5 ? " ..." : ""}`,
119
+ error: passed ? undefined : `资源型接口缺改/删操作(契约粒度偏差 ${(deviationRate * 100).toFixed(1)}%):${problems.slice(0, 3).join(";")}`,
120
+ };
121
+ }
122
+ catch (err) {
123
+ return {
124
+ check_id: check.id, executed_by: "code", passed: false,
125
+ error: `crud_completeness 执行异常(fail-closed):${err instanceof Error ? err.message : String(err)}`,
126
+ };
127
+ }
128
+ });
129
+ }
130
+ //# sourceMappingURL=executors_crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_crud.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_crud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerDeviationSummaryExecutor(): void;
2
+ //# sourceMappingURL=executors_deviation_summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_deviation_summary.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_deviation_summary.ts"],"names":[],"mappings":"AAaA,wBAAgB,gCAAgC,IAAI,IAAI,CA0CvD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 交付偏差汇总执行器 — 读 .soloforge/gates/ 各 gate 的 check_results,调 summarizeDeviation 汇总四维偏差率。
3
+ * 输出「交付偏差 = X%」,gate 阈值 ≤5%(从 rule 提取)。
4
+ *
5
+ * 被谁调用:gate_engine(deviation_summary executor,挂 verify-gate 汇总 design+build+verify)
6
+ * 数据流:.soloforge/gates/*.json 的 check_results[].metric → summarizeDeviation → 偏差率 → CheckResult
7
+ */
8
+ import { gateExecutors } from "../gate_executors.js";
9
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ import { summarizeDeviation } from "../contracts/deviation_metrics.js";
12
+ export function registerDeviationSummaryExecutor() {
13
+ gateExecutors.register("deviation_summary", async (check, ctx) => {
14
+ try {
15
+ const gatesDir = join(ctx.projectRoot, ".soloforge", "gates");
16
+ if (!existsSync(gatesDir)) {
17
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
18
+ evidence: "无 gate 记录(.soloforge/gates/),跳过偏差汇总",
19
+ metric: { passed: 0, total: 0, deviation_rate: 0 } };
20
+ }
21
+ const allResults = [];
22
+ for (const f of readdirSync(gatesDir)) {
23
+ if (!f.endsWith(".json"))
24
+ continue;
25
+ try {
26
+ const rec = JSON.parse(readFileSync(join(gatesDir, f), "utf-8"));
27
+ if (Array.isArray(rec.check_results))
28
+ allResults.push(...rec.check_results);
29
+ }
30
+ catch { /* skip corrupt */ }
31
+ }
32
+ if (allResults.length === 0) {
33
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
34
+ evidence: "gate 记录无 check_results,跳过", metric: { passed: 0, total: 0, deviation_rate: 0 } };
35
+ }
36
+ const summary = summarizeDeviation(allResults);
37
+ const thresholdMatch = check.rule?.match(/(\d+(?:\.\d+)?)\s*%/);
38
+ const threshold = thresholdMatch ? parseFloat(thresholdMatch[1]) / 100 : 0.05;
39
+ const pct = summary.total_deviation * 100;
40
+ const passed = summary.total_deviation <= threshold;
41
+ const dimStr = Object.entries(summary.dimensions)
42
+ .map(([k, v]) => `${k}=${(v.rate * 100).toFixed(0)}%`).join(",");
43
+ return {
44
+ check_id: check.id, executed_by: "code", passed,
45
+ metric: { passed: Math.round((1 - summary.total_deviation) * 100), total: 100, deviation_rate: summary.total_deviation },
46
+ evidence: `交付偏差 = ${pct.toFixed(1)}%(阈值 ${(threshold * 100).toFixed(1)}%);维度[${dimStr}];采样 ${summary.sampled_checks} check`,
47
+ error: passed ? undefined : `交付偏差 ${pct.toFixed(1)}% > 阈值 ${(threshold * 100).toFixed(1)}%(确定性偏差未清零;语义偏差另需 AI/人工/E2E)`,
48
+ };
49
+ }
50
+ catch (err) {
51
+ return { check_id: check.id, executed_by: "code", passed: false,
52
+ error: `deviation_summary 执行异常(fail-closed):${err instanceof Error ? err.message : String(err)}` };
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=executors_deviation_summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_deviation_summary.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_deviation_summary.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"executors_field_mapping.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_field_mapping.ts"],"names":[],"mappings":"AAiEA,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAuB9E;AAED;;;;mCAImC;AACnC,wBAAgB,4BAA4B,IAAI,IAAI,CAgGnD"}
1
+ {"version":3,"file":"executors_field_mapping.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_field_mapping.ts"],"names":[],"mappings":"AAiEA,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAwB9E;AAED;;;;mCAImC;AACnC,wBAAgB,4BAA4B,IAAI,IAAI,CAgGnD"}
@@ -69,8 +69,9 @@ export function parseSchemaSqlTables(content) {
69
69
  const fields = new Map();
70
70
  // CREATE TABLE `表` (字段 VARCHAR(128), ...) ENGINE=InnoDB... / COMMENT='表注释' / ; —— body 到“表的 ) 后跟表选项或 ;”
71
71
  // 用 )\s*(?:ENGINE|DEFAULT|CHARSET|COLLATE|COMMENT|;) 定位表的 ),避免字段 VARCHAR(128) 的 ) 让非贪婪 body 提前截断
72
- // COMMENT 锚点:MySQL 允许 ) COMMENT='表注释'(无 ENGINE,默认 InnoDB)——漏则该类 DDL 全 miss 致 schemaFields 空 → 全部表不存在误报
73
- const tableRe = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?[`"]?(\w+)[`"]?\s*\(([\s\S]*?)\)\s*(?:ENGINE|DEFAULT|CHARSET|COLLATE|COMMENT|;)/gi;
72
+ // COMMENT 锚点:MySQL 表级注释是 `COMMENT='表注释'`(有等号),字段级注释是 `COMMENT '字段注释'`(空格无等号)。
73
+ // 终止锚点须用 COMMENT\s*= 只匹配表级——否则字段 `VARCHAR(64) COMMENT '简称'`)COMMENT 误触发终止,body 提前截断致第5字段起全丢(waiver 81dd44a6 的真根因)。
74
+ const tableRe = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?[`"]?(\w+)[`"]?\s*\(([\s\S]*?)\)\s*(?:ENGINE|DEFAULT|CHARSET|COLLATE|COMMENT\s*=|;)/gi;
74
75
  let tm;
75
76
  while ((tm = tableRe.exec(content)) !== null) {
76
77
  const table = tm[1];
@@ -1 +1 @@
1
- {"version":3,"file":"executors_field_mapping.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_field_mapping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executors_field_mapping.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_field_mapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAEtE;iCACiC;AACjC,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,gCAAgC;IAChC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,qCAAqC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC3B,sCAAsC;QACtC,IAAI,KAAK,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAC1G,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,SAAS;QAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,uBAAuB;QAC1D,gDAAgD;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzE,yCAAyC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;iEACiE;AACjE,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,8BAA8B;IAC9B,MAAM,EAAE,GAAG,qCAAqC,CAAC;IACjD,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,wGAAwG;IACxG,iGAAiG;IACjG,8EAA8E;IAC9E,yHAAyH;IACzH,MAAM,OAAO,GAAG,iIAAiI,CAAC;IAClJ,IAAI,EAAE,CAAC;IACP,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,0DAA0D;YAC1D,IAAI,0DAA0D,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YACvF,sBAAsB;YACtB,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAI,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;mCAImC;AACnC,MAAM,UAAU,4BAA4B;IAC1C,aAAa,CAAC,QAAQ,CACpB,0BAA0B,EAC1B,KAAK,EAAE,KAAgB,EAAE,GAAsB,EAAwB,EAAE;QACxE,IAAI,CAAC;YACJ,eAAe;YACf,MAAM,OAAO,GAAG,8BAA8B,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,WAAW,EAAE,MAAM;oBACnB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,eAAe,KAAK,CAAC,iBAAiB,IAAI,OAAO,EAAE;iBAC3D,CAAC;YACJ,CAAC;YACD,0BAA0B;YAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACpD,mBAAmB;YACnB,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,WAAW,EAAE,MAAM;oBACnB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,yCAAyC;iBACjD,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,WAAW,EAAE,MAAM;oBACnB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,mBAAmB,SAAS,EAAE;iBACtC,CAAC;YACJ,CAAC;YACD,MAAM,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAE7E,yCAAyC;YACzC,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,WAAW,EAAE,MAAM;oBACnB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,iCAAiC;iBACzC,CAAC;YACJ,CAAC;YAED,sCAAsC;YACtC,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvC,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,oBAAoB,CAAC,CAAC;oBAC9C,SAAS;gBACX,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC9B,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,4CAA4C;YAC5C,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,+BAA+B,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,WAAW,EAAE,MAAM;oBACnB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,cAAc,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;iBAC/G,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,mBAAmB,QAAQ,CAAC,IAAI,YAAY,QAAQ,CAAC,IAAI,iBAAiB,YAAY,CAAC,IAAI,IAAI;aAC1G,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,yHAAyH;YACzH,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,8CAA8C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACxG,CAAC;QACH,CAAC;IACF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** 扫描代码路由 → Map<path, Set<method>>。支持 Java Spring(@XxxMapping) 与 Node(express/fastify router.method)。 */
2
+ export declare function extractCodeRoutes(projectRoot: string, codeGlob: string): Map<string, Set<string>>;
3
+ /** 解析 openapi.yaml paths → Set<"METHOD path">。 */
4
+ export declare function parseOpenapiOps(content: string): Set<string>;
5
+ export declare function registerOpenapiConformanceExecutor(): void;
6
+ //# sourceMappingURL=executors_openapi_conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_openapi_conformance.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_openapi_conformance.ts"],"names":[],"mappings":"AAcA,yGAAyG;AACzG,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAqBjG;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAe5D;AAED,wBAAgB,kCAAkC,IAAI,IAAI,CAwCzD"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * openapi conformance 执行器 — 代码实现的 API 路由 ↔ openapi.yaml operation 一致性。
3
+ * 确定性偏差:实现层(代码↔契约)。破 code-first 反向生成覆盖契约——代码必须正面实现 openapi 声明的每个 operation。
4
+ * 无代码(build 未实现)→ skip。
5
+ *
6
+ * 被谁调用:gate_engine(openapi_conformance executor)
7
+ * 数据流:evidence_required[0]=openapi.yaml;evidence_required[1]=backend 下 Java 代码 glob → 对比 → CheckResult
8
+ */
9
+ import { gateExecutors } from "../gate_executors.js";
10
+ import { readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { resolveArtifactsByGlob } from "../../shared/glob_path.js";
13
+ /** 扫描代码路由 → Map<path, Set<method>>。支持 Java Spring(@XxxMapping) 与 Node(express/fastify router.method)。 */
14
+ export function extractCodeRoutes(projectRoot, codeGlob) {
15
+ const routes = new Map();
16
+ for (const rel of resolveArtifactsByGlob(projectRoot, codeGlob)) {
17
+ let content = "";
18
+ try {
19
+ content = readFileSync(join(projectRoot, rel), "utf-8");
20
+ }
21
+ catch {
22
+ continue;
23
+ }
24
+ // Java: 类级 @RequestMapping("/api/v1") 作前缀,方法级 @GetMapping("/users") 组合 → /api/v1/users
25
+ // (不组合则只剩 /users,与 openapi 的 /api/v1/users 对不上 → 全 operation 误报缺失)
26
+ const clsMatch = content.match(/@RequestMapping\s*\(\s*(?:value\s*=\s*)?["']([^"']+)["']/);
27
+ const prefix = clsMatch ? clsMatch[1] : "";
28
+ for (const m of content.matchAll(/@(Get|Post|Put|Patch|Delete)Mapping\s*\(\s*(?:value\s*=\s*)?["']([^"']+)["']/g)) {
29
+ const path = prefix + m[2];
30
+ if (!routes.has(path))
31
+ routes.set(path, new Set());
32
+ routes.get(path).add(m[1].toLowerCase());
33
+ }
34
+ // Node: router.get("/x", ...) / app.post("/x", ...)
35
+ for (const m of content.matchAll(/\.(get|post|put|patch|delete)\s*\(\s*["']([^"']+)["']/g)) {
36
+ const path = m[2];
37
+ if (!routes.has(path))
38
+ routes.set(path, new Set());
39
+ routes.get(path).add(m[1]);
40
+ }
41
+ }
42
+ return routes;
43
+ }
44
+ /** 解析 openapi.yaml paths → Set<"METHOD path">。 */
45
+ export function parseOpenapiOps(content) {
46
+ const ops = new Set();
47
+ let curPath = null;
48
+ let inPaths = false;
49
+ for (const raw of content.split("\n")) {
50
+ if (/^paths:\s*$/.test(raw)) {
51
+ inPaths = true;
52
+ curPath = null;
53
+ continue;
54
+ }
55
+ if (!inPaths)
56
+ continue;
57
+ const line = raw.replace(/\s+$/, "");
58
+ if (line && !line.startsWith(" ") && !line.startsWith("#") && /^(components|servers|security|tags|externalDocs|info|openapi):/.test(line)) {
59
+ inPaths = false;
60
+ continue;
61
+ }
62
+ const pm = line.match(/^ (\/[^:]+):\s*$/);
63
+ if (pm) {
64
+ curPath = pm[1];
65
+ continue;
66
+ }
67
+ if (curPath === null)
68
+ continue;
69
+ const mm = line.match(/^ (get|post|put|patch|delete):/);
70
+ if (mm)
71
+ ops.add(`${mm[1].toUpperCase()} ${curPath}`);
72
+ }
73
+ return ops;
74
+ }
75
+ export function registerOpenapiConformanceExecutor() {
76
+ gateExecutors.register("openapi_conformance", async (check, ctx) => {
77
+ try {
78
+ const openapiRel = check.evidence_required?.[0] ?? "docs/api/openapi.yaml";
79
+ const codeGlob = check.evidence_required?.[1] ?? "backend/**/*.java";
80
+ const codeRoutes = extractCodeRoutes(ctx.projectRoot, codeGlob);
81
+ if (codeRoutes.size === 0) {
82
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
83
+ evidence: `无代码路由(${codeGlob} 未匹配,build 未实现),跳过 openapi conformance`,
84
+ metric: { passed: 0, total: 0, deviation_rate: 0 } };
85
+ }
86
+ let yamlContent = "";
87
+ try {
88
+ yamlContent = readFileSync(join(ctx.projectRoot, openapiRel), "utf-8");
89
+ }
90
+ catch {
91
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
92
+ evidence: `openapi.yaml 不存在(${openapiRel}),跳过`, metric: { passed: 0, total: 0, deviation_rate: 0 } };
93
+ }
94
+ const yamlOps = parseOpenapiOps(yamlContent);
95
+ // 代码路由展开为 METHOD path 集合(类级 @RequestMapping 前缀已含在 path)
96
+ const codeOps = new Set();
97
+ for (const [path, methods] of codeRoutes) {
98
+ for (const me of methods)
99
+ codeOps.add(`${me.toUpperCase()} ${path}`);
100
+ }
101
+ const missing = [...yamlOps].filter((op) => !codeOps.has(op));
102
+ const deviationRate = yamlOps.size === 0 ? 0 : missing.length / yamlOps.size;
103
+ const passed = missing.length === 0;
104
+ return {
105
+ check_id: check.id, executed_by: "code", passed,
106
+ metric: { passed: yamlOps.size - missing.length, total: yamlOps.size, deviation_rate: deviationRate },
107
+ evidence: passed
108
+ ? `openapi conformance:代码实现全部 ${yamlOps.size} 个 operation`
109
+ : `openapi 契约未实现:${yamlOps.size - missing.length}/${yamlOps.size} 有代码;缺 ${missing.slice(0, 5).join(", ")}`,
110
+ error: passed ? undefined : `代码未实现这些 openapi operation(实现偏差 ${(deviationRate * 100).toFixed(1)}%):${missing.slice(0, 3).join(", ")}`,
111
+ };
112
+ }
113
+ catch (err) {
114
+ return { check_id: check.id, executed_by: "code", passed: false,
115
+ error: `openapi_conformance 执行异常(fail-closed):${err instanceof Error ? err.message : String(err)}` };
116
+ }
117
+ });
118
+ }
119
+ //# sourceMappingURL=executors_openapi_conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_openapi_conformance.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_openapi_conformance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerProtoInteractionExecutor(): void;
2
+ //# sourceMappingURL=executors_proto_interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_proto_interaction.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_proto_interaction.ts"],"names":[],"mappings":"AAwBA,wBAAgB,gCAAgC,IAAI,IAAI,CA0CvD"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * 原型交互覆盖率执行器 — 原型交互需求密度 vs API operation 供给的粗略比例信号(heuristic)。
3
+ *
4
+ * 确定性边界:原型无结构化交互声明(按钮/操作是自由文本),本 check 只给"交互密度 vs API 数"的
5
+ * 粗略比例信号,severity=warning(留痕不阻断)——比例失调(交互需求远多于 API 供给)提示可能漏接口。
6
+ * 精确的原型交互→API 映射需原型声明交互(未来增强),当前从交互关键词反推。
7
+ *
8
+ * 被谁调用:gate_engine(proto_interaction_coverage executor)
9
+ * 数据流:evidence_required=[原型 glob, openapi.yaml] → 交互关键词计数 vs operation 数 → CheckResult(warning + metric)
10
+ */
11
+ import { gateExecutors } from "../gate_executors.js";
12
+ import { existsSync, readFileSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ import { resolveArtifactsByGlob } from "../../shared/glob_path.js";
15
+ /** 原型交互关键词(自由文本反推交互需求)。 */
16
+ const INTERACTION_RE = /(?:按钮|编辑|新增|删除|修改|更新|导出|查询|搜索|提交|确认|审批|上传|下载|选择|切换|勾选|点击|登录|登出|支付|结算)/g;
17
+ /** 统计 openapi.yaml operation 数。 */
18
+ function countOpenapiOps(content) {
19
+ return (content.match(/^ (get|post|put|patch|delete):/gm) ?? []).length;
20
+ }
21
+ export function registerProtoInteractionExecutor() {
22
+ gateExecutors.register("proto_interaction_coverage", async (check, ctx) => {
23
+ try {
24
+ const protoGlob = check.evidence_required?.[0] ?? "docs/analyze/*/pages/*-原型说明.md";
25
+ const openapiRel = check.evidence_required?.[1] ?? "docs/api/openapi.yaml";
26
+ const protoFiles = resolveArtifactsByGlob(ctx.projectRoot, protoGlob);
27
+ if (protoFiles.length === 0) {
28
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
29
+ evidence: `无原型(${protoGlob},scope≠frontend),跳过`, metric: { passed: 0, total: 0, deviation_rate: 0 } };
30
+ }
31
+ let interactionCount = 0;
32
+ for (const rel of protoFiles) {
33
+ try {
34
+ interactionCount += (readFileSync(join(ctx.projectRoot, rel), "utf-8").match(INTERACTION_RE) ?? []).length;
35
+ }
36
+ catch { /* skip */ }
37
+ }
38
+ const yamlAbs = join(ctx.projectRoot, openapiRel);
39
+ if (!existsSync(yamlAbs)) {
40
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
41
+ evidence: "无 openapi.yaml,跳过", metric: { passed: 0, total: 0, deviation_rate: 0 } };
42
+ }
43
+ const opCount = countOpenapiOps(readFileSync(yamlAbs, "utf-8"));
44
+ if (interactionCount === 0) {
45
+ return { check_id: check.id, executed_by: "code", passed: true,
46
+ evidence: "原型无交互关键词,跳过", metric: { passed: 0, total: 0, deviation_rate: 0 } };
47
+ }
48
+ // 粗略比例:API operation / 交互需求。比例 < 0.3 视为交互需求远多于 API 供给(可能漏接口)。
49
+ const ratio = opCount / interactionCount;
50
+ const deviationRate = Math.max(0, 1 - ratio / 0.5); // 以 1:2(每2交互1API)为合理基线
51
+ const passed = ratio >= 0.3;
52
+ return {
53
+ check_id: check.id, executed_by: "code", passed,
54
+ metric: { passed: opCount, total: interactionCount, deviation_rate: Math.min(1, deviationRate) },
55
+ evidence: `原型交互关键词 ${interactionCount} vs openapi operation ${opCount}(比例 ${(ratio * 100).toFixed(0)}%)${passed ? ",比例合理" : ",交互需求远多于 API 供给,疑似漏接口"}`,
56
+ error: passed ? undefined : `原型交互密度 vs API 比例失调(${(ratio * 100).toFixed(0)}%,heuristic 信号,warning)`,
57
+ };
58
+ }
59
+ catch (err) {
60
+ return { check_id: check.id, executed_by: "code", passed: false,
61
+ error: `proto_interaction_coverage 执行异常(fail-closed):${err instanceof Error ? err.message : String(err)}` };
62
+ }
63
+ });
64
+ }
65
+ //# sourceMappingURL=executors_proto_interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_proto_interaction.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_proto_interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerRequiredArtifactExecutor(): void;
2
+ //# sourceMappingURL=executors_required_artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_required_artifact.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_required_artifact.ts"],"names":[],"mappings":"AAcA,wBAAgB,gCAAgC,IAAI,IAAI,CAoCvD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 必产物存在性执行器 — 校验 evidence_required 列出的产物文件都存在(通用)。
3
+ *
4
+ * 用途:ADR-EXISTS(架构决策记录须存在)等"产物文件存在性"硬校验。
5
+ * 区别 file_evidence:file_evidence 校验运行时证据目录(截图/json),本 executor 校验源产物文件。
6
+ *
7
+ * 被谁调用:gate_engine(required_artifact_check executor)
8
+ * 数据流:evidence_required=[产物路径...] → existsSync 逐个 → CheckResult(含 metric)
9
+ */
10
+ import { gateExecutors } from "../gate_executors.js";
11
+ import { existsSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ export function registerRequiredArtifactExecutor() {
14
+ gateExecutors.register("required_artifact_check", async (check, ctx) => {
15
+ try {
16
+ const reqs = check.evidence_required ?? [];
17
+ if (reqs.length === 0) {
18
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
19
+ evidence: "无 evidence_required,跳过", metric: { passed: 0, total: 0, deviation_rate: 0 } };
20
+ }
21
+ // 多文件时,第一个为前提产物(如架构文档);前提未产出 → 阶段未到,skip(不 fail,防 verify requirement_analysis 时误拦)
22
+ let targets = reqs;
23
+ if (reqs.length > 1) {
24
+ if (!existsSync(join(ctx.projectRoot, reqs[0]))) {
25
+ return { check_id: check.id, executed_by: "code", passed: true, skipped: true,
26
+ evidence: `前提产物 ${reqs[0]} 未产出(阶段未到),跳过`, metric: { passed: 0, total: 0, deviation_rate: 0 } };
27
+ }
28
+ targets = reqs.slice(1);
29
+ }
30
+ const missing = [];
31
+ for (const rel of targets) {
32
+ if (!existsSync(join(ctx.projectRoot, rel)))
33
+ missing.push(rel);
34
+ }
35
+ const passed = missing.length === 0;
36
+ return {
37
+ check_id: check.id, executed_by: "code", passed,
38
+ metric: { passed: targets.length - missing.length, total: targets.length, deviation_rate: missing.length / targets.length },
39
+ evidence: passed ? `必产物全部存在:${targets.length}/${targets.length}` : `必产物缺失:${missing.join(", ")}`,
40
+ error: passed ? undefined : `必产物文件不存在:${missing.join(", ")}`,
41
+ };
42
+ }
43
+ catch (err) {
44
+ return { check_id: check.id, executed_by: "code", passed: false,
45
+ error: `required_artifact_check 执行异常(fail-closed):${err instanceof Error ? err.message : String(err)}` };
46
+ }
47
+ });
48
+ }
49
+ //# sourceMappingURL=executors_required_artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_required_artifact.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_required_artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,gCAAgC;IAC9C,aAAa,CAAC,QAAQ,CACpB,yBAAyB,EACzB,KAAK,EAAE,KAAgB,EAAE,GAAsB,EAAwB,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;oBAC3E,QAAQ,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7F,CAAC;YACD,mFAAmF;YACnF,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,EAAE,CAAC;oBACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;wBAC3E,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnG,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YACpC,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;gBAC/C,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE;gBAC3H,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAChG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC7D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;gBAC7D,KAAK,EAAE,6CAA6C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7G,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** 解析 SQL 的 CREATE TABLE → Map<表, Set<字段>>。复用 FMAP 修复后的 COMMENT= 锚点。 */
2
+ export declare function parseTables(content: string): Map<string, Set<string>>;
3
+ export declare function registerSchemaConformanceExecutor(): void;
4
+ //# sourceMappingURL=executors_schema_conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executors_schema_conformance.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_schema_conformance.ts"],"names":[],"mappings":"AAcA,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAerE;AAED,wBAAgB,iCAAiC,IAAI,IAAI,CA6CxD"}