soloforge 1.1.48 → 1.1.50
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/README.md +4 -4
- package/dist/cli/scope_check.d.ts.map +1 -1
- package/dist/cli/scope_check.js +10 -0
- package/dist/cli/scope_check.js.map +1 -1
- package/dist/context/adapters/shared/integration_guide.d.ts +3 -3
- package/dist/context/adapters/shared/integration_guide.js +4 -4
- package/dist/core/adversarial_review_store.d.ts +44 -44
- package/dist/core/adversarial_review_store.d.ts.map +1 -1
- package/dist/core/adversarial_review_store.js +43 -43
- package/dist/core/adversarial_review_store.js.map +1 -1
- package/dist/core/gate_record_store.d.ts.map +1 -1
- package/dist/core/gate_record_store.js +9 -4
- package/dist/core/gate_record_store.js.map +1 -1
- package/dist/core/git_utils.d.ts.map +1 -1
- package/dist/core/git_utils.js +7 -3
- package/dist/core/git_utils.js.map +1 -1
- package/dist/core/task_context/constants.d.ts.map +1 -1
- package/dist/core/task_context/constants.js +3 -1
- package/dist/core/task_context/constants.js.map +1 -1
- package/dist/core/task_context/manager.d.ts +0 -4
- package/dist/core/task_context/manager.d.ts.map +1 -1
- package/dist/core/task_context/manager.js +21 -32
- package/dist/core/task_context/manager.js.map +1 -1
- package/dist/core/task_context/stage_fact_ownership.js +1 -1
- package/dist/core/task_context/stage_fact_ownership.js.map +1 -1
- package/dist/core/task_context/status_transitions.js +5 -5
- package/dist/core/task_context/status_transitions.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/waiver_store.d.ts +100 -0
- package/dist/core/waiver_store.d.ts.map +1 -0
- package/dist/core/waiver_store.js +185 -0
- package/dist/core/waiver_store.js.map +1 -0
- package/dist/domain/asset_registry/derived_registry.d.ts +10 -0
- package/dist/domain/asset_registry/derived_registry.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_registry.js +10 -0
- package/dist/domain/asset_registry/derived_registry.js.map +1 -1
- package/dist/domain/asset_registry/derived_types.d.ts +10 -0
- package/dist/domain/asset_registry/derived_types.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_types.js +10 -0
- package/dist/domain/asset_registry/derived_types.js.map +1 -1
- package/dist/gate/certainty_gate.d.ts +10 -0
- package/dist/gate/certainty_gate.d.ts.map +1 -1
- package/dist/gate/certainty_gate.js.map +1 -1
- package/dist/gate/contracts/tool_actions.d.ts +10 -1
- package/dist/gate/contracts/tool_actions.d.ts.map +1 -1
- package/dist/gate/contracts/tool_actions.js +11 -1
- package/dist/gate/contracts/tool_actions.js.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js +11 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js.map +1 -1
- package/dist/gate/executors/executors_annotation.d.ts +33 -10
- package/dist/gate/executors/executors_annotation.d.ts.map +1 -1
- package/dist/gate/executors/executors_annotation.js +119 -64
- package/dist/gate/executors/executors_annotation.js.map +1 -1
- package/dist/gate/executors/executors_artifact.d.ts +1 -1
- package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
- package/dist/gate/executors/executors_artifact.js +1 -138
- package/dist/gate/executors/executors_artifact.js.map +1 -1
- package/dist/gate/executors/executors_build.d.ts +2 -2
- package/dist/gate/executors/executors_build.d.ts.map +1 -1
- package/dist/gate/executors/executors_build.js +11 -111
- package/dist/gate/executors/executors_build.js.map +1 -1
- package/dist/gate/executors/executors_deploy.d.ts.map +1 -1
- package/dist/gate/executors/executors_deploy.js +35 -7
- package/dist/gate/executors/executors_deploy.js.map +1 -1
- package/dist/gate/executors/executors_external_command.d.ts.map +1 -1
- package/dist/gate/executors/executors_external_command.js +25 -5
- package/dist/gate/executors/executors_external_command.js.map +1 -1
- package/dist/gate/executors/executors_field_mapping.d.ts.map +1 -1
- package/dist/gate/executors/executors_field_mapping.js +78 -66
- package/dist/gate/executors/executors_field_mapping.js.map +1 -1
- package/dist/gate/executors/executors_jacoco.d.ts +3 -0
- package/dist/gate/executors/executors_jacoco.d.ts.map +1 -0
- package/dist/gate/executors/executors_jacoco.js +70 -0
- package/dist/gate/executors/executors_jacoco.js.map +1 -0
- package/dist/gate/executors/executors_prerequisite.d.ts +1 -1
- package/dist/gate/executors/executors_prerequisite.d.ts.map +1 -1
- package/dist/gate/executors/executors_prerequisite.js +1 -61
- package/dist/gate/executors/executors_prerequisite.js.map +1 -1
- package/dist/gate/executors/executors_probe.d.ts +1 -0
- package/dist/gate/executors/executors_probe.d.ts.map +1 -1
- package/dist/gate/executors/executors_probe.js +1 -0
- package/dist/gate/executors/executors_probe.js.map +1 -1
- package/dist/gate/executors/executors_scope.d.ts +7 -3
- package/dist/gate/executors/executors_scope.d.ts.map +1 -1
- package/dist/gate/executors/executors_scope.js +18 -171
- package/dist/gate/executors/executors_scope.js.map +1 -1
- package/dist/gate/executors/executors_trace.d.ts.map +1 -1
- package/dist/gate/executors/executors_trace.js +111 -1
- package/dist/gate/executors/executors_trace.js.map +1 -1
- package/dist/gate/executors/index.js +2 -2
- package/dist/gate/executors/index.js.map +1 -1
- package/dist/gate/gate_engine.d.ts +11 -0
- package/dist/gate/gate_engine.d.ts.map +1 -1
- package/dist/gate/gate_engine.js +43 -6
- package/dist/gate/gate_engine.js.map +1 -1
- package/dist/gate/gate_registry_bridge.d.ts +10 -0
- package/dist/gate/gate_registry_bridge.d.ts.map +1 -1
- package/dist/gate/gate_registry_bridge.js +2 -3
- package/dist/gate/gate_registry_bridge.js.map +1 -1
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.d.ts.map +1 -1
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.js +3 -0
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.js.map +1 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/tools/index.js.map +1 -1
- package/dist/server/tools/middleware.d.ts.map +1 -1
- package/dist/server/tools/middleware.js +1 -0
- package/dist/server/tools/middleware.js.map +1 -1
- package/dist/server/tools/schemas.d.ts +10 -0
- package/dist/server/tools/schemas.d.ts.map +1 -1
- package/dist/server/tools/schemas.js +10 -0
- package/dist/server/tools/schemas.js.map +1 -1
- package/dist/server/tools/sf_doctor.d.ts +7 -0
- package/dist/server/tools/sf_doctor.d.ts.map +1 -1
- package/dist/server/tools/sf_doctor.js +38 -2
- package/dist/server/tools/sf_doctor.js.map +1 -1
- package/dist/server/tools/sf_waiver.d.ts +31 -0
- package/dist/server/tools/sf_waiver.d.ts.map +1 -0
- package/dist/server/tools/sf_waiver.js +139 -0
- package/dist/server/tools/sf_waiver.js.map +1 -0
- package/dist/server/tools/sf_work.d.ts +28 -37
- package/dist/server/tools/sf_work.d.ts.map +1 -1
- package/dist/server/tools/sf_work.js +155 -83
- package/dist/server/tools/sf_work.js.map +1 -1
- package/dist/shared/paths.d.ts +4 -0
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +6 -0
- package/dist/shared/paths.js.map +1 -1
- package/dist/types/pipeline_types.d.ts +4 -1
- package/dist/types/pipeline_types.d.ts.map +1 -1
- package/dist/verify/audit/probe_executor.d.ts +4 -1
- package/dist/verify/audit/probe_executor.d.ts.map +1 -1
- package/dist/verify/audit/probe_executor.js +4 -1
- package/dist/verify/audit/probe_executor.js.map +1 -1
- package/dist/verify/audit/probe_rule.d.ts +3 -0
- package/dist/verify/audit/probe_rule.d.ts.map +1 -1
- package/dist/verify/audit/probe_rule.js +3 -0
- package/dist/verify/audit/probe_rule.js.map +1 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.d.ts.map +1 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.js +0 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.js.map +1 -1
- package/dist/verify/oda/probes/index.d.ts.map +1 -1
- package/dist/verify/oda/probes/index.js +2 -0
- package/dist/verify/oda/probes/index.js.map +1 -1
- package/dist/verify/oda/probes/slice_progress_probe.d.ts +4 -0
- package/dist/verify/oda/probes/slice_progress_probe.d.ts.map +1 -0
- package/dist/verify/oda/probes/slice_progress_probe.js +144 -0
- package/dist/verify/oda/probes/slice_progress_probe.js.map +1 -0
- package/package.json +1 -1
- package/templates/build/enforced.md +30 -22
- package/templates/build//346/265/213/350/257/225/344/274/230/345/205/210/347/274/226/347/240/201.md +1 -0
- package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +2 -1
- package/templates/design//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +5 -5
- package/templates/design//345/210/207/347/211/207/350/247/204/345/210/222.md +3 -1
- package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md +2 -1
- package/templates/operate/UI/350/247/206/350/247/211/351/252/214/346/224/266/347/272/252/345/276/213.md +13 -2
- package/templates/operate/enforced.md +2 -2
- package/templates/shared/enforced.md +1 -1
- package/templates/shared//345/267/245/344/275/234/346/265/201/347/241/254/350/247/204/345/210/231/345/245/221/347/272/246.md +2 -2
- package/templates/verify/enforced.md +11 -2
- package/templates/verify//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +2 -2
- package/templates/verify//345/256/241/346/237/245/346/270/205/345/215/225.md +3 -1
- package/dist/gate/executors/executors_openapi_sync.d.ts +0 -23
- package/dist/gate/executors/executors_openapi_sync.d.ts.map +0 -1
- package/dist/gate/executors/executors_openapi_sync.js +0 -145
- package/dist/gate/executors/executors_openapi_sync.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executors_jacoco.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_jacoco.ts"],"names":[],"mappings":"AAiBA,+CAA+C;AAC/C,wBAAgB,sBAAsB,IAAI,IAAI,CAuD7C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jacoco_threshold 执行器 — Java/Maven 项目行覆盖率门禁(解析 JaCoCo XML 报告)。
|
|
3
|
+
*
|
|
4
|
+
* 对应 coverage_threshold(vitest-only)的 Java 缺口:用户痛的"Java 项目覆盖率 40%"无机制管。
|
|
5
|
+
* 读 target/site/jacoco/jacoco.xml 的 report 级 LINE counter,算覆盖率比对阈值,fail-closed。
|
|
6
|
+
*
|
|
7
|
+
* 职责边界:
|
|
8
|
+
* - 负责:Java/Maven 项目(有 pom.xml)的行覆盖率阈值校验
|
|
9
|
+
* - 不负责:非 Java 项目(跳过)、跑 mvn test(假设 jacoco.xml 已生成,或提示配置 jacoco-maven-plugin)
|
|
10
|
+
*
|
|
11
|
+
* Fail-closed:无 pom.xml 跳过;有 pom 但无 jacoco.xml → fail(须配 jacoco-maven-plugin);解析异常 → fail。
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { gateExecutors } from "../gate_executors.js";
|
|
16
|
+
/** 注册 jacoco 覆盖率阈值 executor(Java/Maven 项目)。 */
|
|
17
|
+
export function registerJacocoExecutor() {
|
|
18
|
+
gateExecutors.register("jacoco_threshold", async (check, ctx) => {
|
|
19
|
+
const projectRoot = ctx.projectRoot;
|
|
20
|
+
// 非 Maven 项目(无 pom.xml)→ 跳过(vitest 项目归 coverage_threshold,Jacoco 不适用)
|
|
21
|
+
if (!existsSync(join(projectRoot, "pom.xml"))) {
|
|
22
|
+
return { check_id: check.id, executed_by: "code", passed: true, evidence: "非 Maven 项目(无 pom.xml),jacoco_threshold 跳过" };
|
|
23
|
+
}
|
|
24
|
+
// 从 rule 提取阈值(格式同 coverage_threshold:行覆盖率≥70%),默认 70
|
|
25
|
+
const m = check.rule.match(/(?:覆盖率|coverage)\s*[≥>=]+\s*(\d+)\s*%/i);
|
|
26
|
+
const threshold = m ? parseInt(m[1], 10) : 70;
|
|
27
|
+
// JaCoCo XML 默认路径(mvn jacoco:report 生成 target/site/jacoco/jacoco.xml)
|
|
28
|
+
const jacocoXml = join(projectRoot, "target", "site", "jacoco", "jacoco.xml");
|
|
29
|
+
if (!existsSync(jacocoXml)) {
|
|
30
|
+
// fail-closed:Maven 项目但无 jacoco.xml = 未配 jacoco-maven-plugin 或 mvn test 未跑,不得放行
|
|
31
|
+
return {
|
|
32
|
+
check_id: check.id,
|
|
33
|
+
executed_by: "code",
|
|
34
|
+
passed: false,
|
|
35
|
+
error: "无 target/site/jacoco/jacoco.xml。Maven 项目须配 jacoco-maven-plugin(prepare-agent + report)并跑 mvn test 生成报告——fail-closed 不放行(治 Java 覆盖率无人管)",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const xml = readFileSync(jacocoXml, "utf-8");
|
|
40
|
+
// 解析 LINE counter:JaCoCo XML 的 report 级 counter 在所有 package 之后(全文最后一个 type="LINE")
|
|
41
|
+
const counterRe = /<counter\s+type="LINE"\s+missed="(\d+)"\s+covered="(\d+)"/g;
|
|
42
|
+
let lastMatch = null;
|
|
43
|
+
let mm;
|
|
44
|
+
while ((mm = counterRe.exec(xml)) !== null) {
|
|
45
|
+
lastMatch = [parseInt(mm[1], 10), parseInt(mm[2], 10)];
|
|
46
|
+
}
|
|
47
|
+
if (!lastMatch) {
|
|
48
|
+
return { check_id: check.id, executed_by: "code", passed: false, error: "jacoco.xml 无 LINE counter(报告格式异常)——fail-closed" };
|
|
49
|
+
}
|
|
50
|
+
const [missed, covered] = lastMatch;
|
|
51
|
+
const total = missed + covered;
|
|
52
|
+
if (total === 0) {
|
|
53
|
+
return { check_id: check.id, executed_by: "code", passed: false, error: "jacoco LINE counter total=0(无代码行?)——fail-closed" };
|
|
54
|
+
}
|
|
55
|
+
const pct = (covered / total) * 100;
|
|
56
|
+
const passed = pct >= threshold;
|
|
57
|
+
return {
|
|
58
|
+
check_id: check.id,
|
|
59
|
+
executed_by: "code",
|
|
60
|
+
passed,
|
|
61
|
+
evidence: `Java 行覆盖率: ${pct.toFixed(1)}%(阈值 ${threshold}%,jacoco ${covered}/${total} lines)`,
|
|
62
|
+
error: passed ? undefined : `Java 行覆盖率 ${pct.toFixed(1)}% 未达阈值 ${threshold}%`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return { check_id: check.id, executed_by: "code", passed: false, error: `jacoco_threshold 执行异常(fail-closed):${err instanceof Error ? err.message : String(err)}` };
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=executors_jacoco.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executors_jacoco.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_jacoco.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,+CAA+C;AAC/C,MAAM,UAAU,sBAAsB;IACpC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAgB,EAAE,GAAsB,EAAwB,EAAE;QAClH,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QAEpC,sEAAsE;QACtE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,2CAA2C,EAAE,CAAC;QAC1H,CAAC;QAED,qDAAqD;QACrD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9C,sEAAsE;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,gFAAgF;YAChF,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,wIAAwI;aAChJ,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7C,mFAAmF;YACnF,MAAM,SAAS,GAAG,4DAA4D,CAAC;YAC/E,IAAI,SAAS,GAA4B,IAAI,CAAC;YAC9C,IAAI,EAA0B,CAAC;YAC/B,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3C,SAAS,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;YAC7H,CAAC;YACD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC;YAC9H,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;YACpC,MAAM,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;YAChC,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM;gBACN,QAAQ,EAAE,cAAc,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,SAAS,YAAY,OAAO,IAAI,KAAK,SAAS;gBAC5F,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,SAAS,GAAG;aAC9E,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACrK,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_prerequisite.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_prerequisite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"executors_prerequisite.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_prerequisite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,iBAAiB;AACjB,wBAAgB,6BAA6B,IAAI,IAAI,CAgDpD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 前置条件类执行器 — 工具调用链验证、编码就绪检查、上游门禁通过检查。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* - 负责:
|
|
5
|
+
* - 负责:upstream_gate_check
|
|
6
6
|
* - 不负责:不涉及部署/产物/构建/追踪/范围类 executor
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:index.ts(registerAllExecutors)
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
* 数据流:GateCheck + EvaluationContext → 读取管线状态/taskContext → 前置条件判定 → CheckResult
|
|
12
12
|
* 持久化:无直接持久化(读取 EvaluationContext 中的管线状态)
|
|
13
13
|
*/
|
|
14
|
-
import { existsSync } from "node:fs";
|
|
15
14
|
import { join } from "node:path";
|
|
16
15
|
import { gateExecutors } from "../gate_executors.js";
|
|
17
16
|
import { GateRecordStore } from "../../core/gate_record_store.js";
|
|
@@ -22,65 +21,6 @@ export function registerPrerequisiteExecutors() {
|
|
|
22
21
|
// tool_trace_review 已移除:原为恒 passed 的空壳 executor,VRF-G02 已移至 guidance《架构语义红线》
|
|
23
22
|
// (人工签署判断无法代码确定性判定)。产物门禁闭环由 GateRecordStore 的 review→fix→re-review 自动追踪保障。
|
|
24
23
|
// ═══════════════════════════════════════════
|
|
25
|
-
// 10. 编码就绪检查 — 验证 CodingReadiness 报告存在且非 blocked
|
|
26
|
-
// ═══════════════════════════════════════════
|
|
27
|
-
gateExecutors.register("coding_readiness_check", async (check, ctx) => {
|
|
28
|
-
// 从 taskContext 获取编码就绪状态
|
|
29
|
-
if (!ctx.taskContext) {
|
|
30
|
-
return {
|
|
31
|
-
check_id: check.id,
|
|
32
|
-
executed_by: "code",
|
|
33
|
-
passed: false,
|
|
34
|
-
error: "无 taskContext,无法检查编码就绪状态",
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
// 尝试从 taskContext 读取编码就绪状态
|
|
38
|
-
const tcAny = ctx.taskContext;
|
|
39
|
-
const readiness = tcAny?.coding_readiness ?? tcAny?.codingReadiness;
|
|
40
|
-
if (readiness && typeof readiness === "object") {
|
|
41
|
-
const r = readiness;
|
|
42
|
-
if (r.status === "blocked") {
|
|
43
|
-
return {
|
|
44
|
-
check_id: check.id,
|
|
45
|
-
executed_by: "code",
|
|
46
|
-
passed: false,
|
|
47
|
-
error: `CodingReadiness 状态为 blocked,阻断原因: ${String(r.reason ?? r.missing ?? "未知")}`,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
check_id: check.id,
|
|
52
|
-
executed_by: "code",
|
|
53
|
-
passed: true,
|
|
54
|
-
evidence: `CodingReadiness 状态: ${String(r.status ?? "allowed")}`,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
// 无直接编码就绪字段时,检查是否缺少关键前置产物(DB + API 必需设计载体;详细设计为可选,不强制)
|
|
58
|
-
const missingArtifacts = [];
|
|
59
|
-
const designPaths = [
|
|
60
|
-
"docs/design/01-数据库设计文档.md",
|
|
61
|
-
"docs/design/02-API接口规格文档.md",
|
|
62
|
-
];
|
|
63
|
-
for (const p of designPaths) {
|
|
64
|
-
if (!existsSync(join(ctx.projectRoot, p))) {
|
|
65
|
-
missingArtifacts.push(p);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (missingArtifacts.length > 0) {
|
|
69
|
-
return {
|
|
70
|
-
check_id: check.id,
|
|
71
|
-
executed_by: "code",
|
|
72
|
-
passed: false,
|
|
73
|
-
error: `编码前置设计产物缺失: ${missingArtifacts.join("、")}。请先完成对应阶段产物后再开始编码。`,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
check_id: check.id,
|
|
78
|
-
executed_by: "code",
|
|
79
|
-
passed: true,
|
|
80
|
-
evidence: "编码前置设计产物全部存在",
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
// ═══════════════════════════════════════════
|
|
84
24
|
// 11. 上游门禁通过检查 — 验证指定上游阶段的门禁已通过
|
|
85
25
|
// 替代 tool_trace_review 在 CODE-P02 上的误用
|
|
86
26
|
// ═══════════════════════════════════════════
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_prerequisite.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_prerequisite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"executors_prerequisite.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_prerequisite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,iBAAiB;AACjB,MAAM,UAAU,6BAA6B;IAC3C,6EAA6E;IAC7E,2EAA2E;IAG3E,8CAA8C;IAC9C,gCAAgC;IAChC,uCAAuC;IACvC,8CAA8C;IAE9C,aAAa,CAAC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,EAAE,KAAgB,EAAE,GAAsB,EAAwB,EAAE;QACrH,0DAA0D;QAC1D,qEAAqE;QACrE,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;QACrG,CAAC;QACD,MAAM,uBAAuB,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClF,uDAAuD;QACvD,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,uBAAuB,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YACjG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;gBACpC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,uBAAuB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,6FAA6F;aAC/I,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,YAAY,uBAAuB,CAAC,MAAM,sBAAsB;SAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* - 加载错误(无 verification_layer 等)由 probe-load-error 恒 fail 暴露,不静默。
|
|
14
14
|
*
|
|
15
15
|
* 数据流:GateCheck(executor="probe", probe_rule=ProbeRule) → 跑探针 → CheckResult(executed_by="code")
|
|
16
|
+
* 持久化:无
|
|
16
17
|
*/
|
|
17
18
|
/** 注册探针相关 executor(probe + probe-load-error) */
|
|
18
19
|
export declare function registerProbeExecutor(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_probe.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_probe.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"executors_probe.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,gDAAgD;AAChD,wBAAgB,qBAAqB,IAAI,IAAI,CA4C5C"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* - 加载错误(无 verification_layer 等)由 probe-load-error 恒 fail 暴露,不静默。
|
|
14
14
|
*
|
|
15
15
|
* 数据流:GateCheck(executor="probe", probe_rule=ProbeRule) → 跑探针 → CheckResult(executed_by="code")
|
|
16
|
+
* 持久化:无
|
|
16
17
|
*/
|
|
17
18
|
import { gateExecutors } from "../gate_executors.js";
|
|
18
19
|
import { PROBE_EXECUTORS, getChangedFiles } from "../../verify/audit/probe_executor.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_probe.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_probe.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"executors_probe.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAExF,gDAAgD;AAChD,MAAM,UAAU,qBAAqB;IACnC,gDAAgD;IAChD,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,KAAgB,EAAE,GAAsB,EAAwB,EAAE;QACvG,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QACvG,CAAC;QACD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAClH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;YAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;gBAC/D,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,WAAW,EAAE,MAAM;oBACnB,MAAM,EAAE,IAAI;oBACZ,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK;iBACvE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,OAAO,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aAC1I,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6CAA6C;YAC7C,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAC1E,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAgB,EAAwB,EAAE,CAAC,CAAC;QAC5F,QAAQ,EAAE,KAAK,CAAC,EAAE;QAClB,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,cAAc,KAAK,CAAC,IAAI,EAAE;KAClC,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 范围类执行器 —
|
|
2
|
+
* 范围类执行器 — 偷懒模式检测。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* - 负责:
|
|
5
|
+
* - 负责:lazy_pattern_check
|
|
6
6
|
* - 不负责:不涉及部署/产物/构建/追踪/前置条件类 executor
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:index.ts(registerAllExecutors)
|
|
9
|
-
* 调用谁:shared.ts(
|
|
9
|
+
* 调用谁:shared.ts(gateExecutors 等)、verify/contracts/lazy_pattern_detector
|
|
10
10
|
*
|
|
11
11
|
* 数据流:GateCheck + EvaluationContext → git diff 文件列表 → 范围比对/偷懒扫描 → CheckResult
|
|
12
12
|
* 持久化:无直接持久化(通过 execa 调用 git,动态导入 lazy_pattern_detector)
|
|
13
13
|
*/
|
|
14
14
|
/** 注册范围类执行器 */
|
|
15
15
|
export declare function registerScopeExecutors(): void;
|
|
16
|
+
/**
|
|
17
|
+
* 从切片计划加载当前切片的涉及文件列表。
|
|
18
|
+
* 唯一数据源:docs/architecture/02-开发切片计划.md(.soloforge/output/*.yaml 为无生成器死链路,已清除)。
|
|
19
|
+
*/
|
|
16
20
|
//# sourceMappingURL=executors_scope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_scope.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,eAAe;AACf,wBAAgB,sBAAsB,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"executors_scope.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,eAAe;AACf,wBAAgB,sBAAsB,IAAI,IAAI,CAoG7C;AAID;;;GAGG"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 范围类执行器 —
|
|
2
|
+
* 范围类执行器 — 偷懒模式检测。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* - 负责:
|
|
5
|
+
* - 负责:lazy_pattern_check
|
|
6
6
|
* - 不负责:不涉及部署/产物/构建/追踪/前置条件类 executor
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:index.ts(registerAllExecutors)
|
|
9
|
-
* 调用谁:shared.ts(
|
|
9
|
+
* 调用谁:shared.ts(gateExecutors 等)、verify/contracts/lazy_pattern_detector
|
|
10
10
|
*
|
|
11
11
|
* 数据流:GateCheck + EvaluationContext → git diff 文件列表 → 范围比对/偷懒扫描 → CheckResult
|
|
12
12
|
* 持久化:无直接持久化(通过 execa 调用 git,动态导入 lazy_pattern_detector)
|
|
@@ -14,111 +14,10 @@
|
|
|
14
14
|
import { execa } from "execa";
|
|
15
15
|
import { existsSync, readFileSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
|
-
import {
|
|
17
|
+
import { debug } from "../../shared/logger.js";
|
|
18
18
|
import { gateExecutors } from "../gate_executors.js";
|
|
19
19
|
/** 注册范围类执行器 */
|
|
20
20
|
export function registerScopeExecutors() {
|
|
21
|
-
// ═══════════════════════════════════════════
|
|
22
|
-
// 14. 文件范围检查 — 比对 git diff 与切片计划文件列表
|
|
23
|
-
// 替代 git_diff 在 CODE-S02 / CODE-I01 / SLICE-E03 上的不足
|
|
24
|
-
// ═══════════════════════════════════════════
|
|
25
|
-
gateExecutors.register("file_scope_check", async (check, ctx) => {
|
|
26
|
-
const cwd = ctx.projectRoot;
|
|
27
|
-
// 确认是 git 仓库
|
|
28
|
-
try {
|
|
29
|
-
await execa("git", ["rev-parse", "--is-inside-work-tree"], { cwd, timeout: 5_000 });
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return {
|
|
33
|
-
check_id: check.id,
|
|
34
|
-
executed_by: "code",
|
|
35
|
-
passed: true,
|
|
36
|
-
evidence: degradeLog("file_scope_check", "非 git 仓库,降级放行"),
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
// 获取实际变更文件列表
|
|
41
|
-
const { stdout: diffOutput } = await execa("git", ["diff", "HEAD", "--name-only"], { cwd, timeout: 15_000 });
|
|
42
|
-
const changedFiles = diffOutput.split("\n").filter(Boolean);
|
|
43
|
-
if (changedFiles.length === 0) {
|
|
44
|
-
return {
|
|
45
|
-
check_id: check.id,
|
|
46
|
-
executed_by: "code",
|
|
47
|
-
passed: false,
|
|
48
|
-
error: "无文件变更(git diff --name-only 为空)",
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
// 从切片计划加载当前切片的文件列表
|
|
52
|
-
const slicePlanFiles = loadSlicePlanFiles(ctx);
|
|
53
|
-
// 无切片计划文件列表时,退化为基础变更检查
|
|
54
|
-
if (slicePlanFiles.length === 0) {
|
|
55
|
-
return {
|
|
56
|
-
check_id: check.id,
|
|
57
|
-
executed_by: "code",
|
|
58
|
-
passed: true,
|
|
59
|
-
evidence: `有 ${changedFiles.length} 个文件变更(无切片计划文件列表,跳过范围比对)`,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
// 计算偏差:变更文件中不在切片计划内的
|
|
63
|
-
const outOfScope = changedFiles.filter((f) => !slicePlanFiles.includes(f));
|
|
64
|
-
// 从 rule 提取容忍度(默认 1,避免掩盖蔓延)
|
|
65
|
-
// rule 格式: "偏差≤2 文件" / "无计划外变更"
|
|
66
|
-
// FLAW-EXEC-05 说明:默认 tolerance=1 而非 0,原因:
|
|
67
|
-
// 实际项目中存在合理的计划外变更(如:配置文件、锁文件、IDE 生成文件等),
|
|
68
|
-
// tolerance=0 会导致这些微小变更全部失败,产生大量误报。
|
|
69
|
-
// 如果需要零容忍,在 gate YAML 中使用"无计划外变更"关键字可强制 tolerance=0。
|
|
70
|
-
const toleranceMatch = check.rule.match(/偏差[≤<=]+\s*(\d+)/);
|
|
71
|
-
const tolerance = toleranceMatch ? parseInt(toleranceMatch[1], 10) : 1;
|
|
72
|
-
const strictMatch = /无计划外变更/.test(check.rule);
|
|
73
|
-
const effectiveTolerance = strictMatch ? 0 : tolerance;
|
|
74
|
-
// 超出容忍度时报告,范围外文件数等于容忍度时给出 warning
|
|
75
|
-
if (outOfScope.length > effectiveTolerance) {
|
|
76
|
-
return {
|
|
77
|
-
check_id: check.id,
|
|
78
|
-
executed_by: "code",
|
|
79
|
-
passed: false,
|
|
80
|
-
error: `变更文件 ${outOfScope.length} 个超出切片范围(容忍度: ${effectiveTolerance}): ${outOfScope.join(", ")}`,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
// 切片隔离检查:是否有变更落在已通过切片的文件范围内
|
|
84
|
-
const isolationCheck = check.rule.includes("已通过切片") || check.rule.includes("交集为空");
|
|
85
|
-
if (isolationCheck) {
|
|
86
|
-
// 从 pipelineState 获取已通过切片的产出文件
|
|
87
|
-
const protectedFiles = getProtectedFiles(ctx);
|
|
88
|
-
const collision = changedFiles.filter((f) => protectedFiles.includes(f));
|
|
89
|
-
if (collision.length > 0) {
|
|
90
|
-
return {
|
|
91
|
-
check_id: check.id,
|
|
92
|
-
executed_by: "code",
|
|
93
|
-
passed: false,
|
|
94
|
-
error: `当前切片修改了已通过切片的文件(违反隔离): ${collision.join(", ")}`,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const scopeWarning = outOfScope.length > 0
|
|
99
|
-
? ` [警告] ${outOfScope.length} 个计划外变更: ${outOfScope.join(", ")}`
|
|
100
|
-
: "";
|
|
101
|
-
return {
|
|
102
|
-
check_id: check.id,
|
|
103
|
-
executed_by: "code",
|
|
104
|
-
passed: true,
|
|
105
|
-
evidence: `变更 ${changedFiles.length} 个文件,范围外 ${outOfScope.length} 个(≤${effectiveTolerance}),切片隔离通过${scopeWarning}`,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
return {
|
|
110
|
-
check_id: check.id,
|
|
111
|
-
executed_by: "code",
|
|
112
|
-
passed: false,
|
|
113
|
-
error: `file_scope_check 执行异常(fail-closed 不放行):${err instanceof Error ? err.message : String(err)}`,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
// ═══════════════════════════════════════════
|
|
118
|
-
// 15. 偷懒模式检测 — 扫描 git diff 变更文件
|
|
119
|
-
// 复用 detectLazyPatterns 纯函数(check-write.ts 同源)
|
|
120
|
-
// 方案 A: 先干后验 — AI 写完后 sf_gate 调此执行器检查
|
|
121
|
-
// ═══════════════════════════════════════════
|
|
122
21
|
gateExecutors.register("lazy_pattern_check", async (check, ctx) => {
|
|
123
22
|
const cwd = ctx.projectRoot;
|
|
124
23
|
// 确认是 git 仓库
|
|
@@ -151,6 +50,7 @@ export function registerScopeExecutors() {
|
|
|
151
50
|
let totalWarnings = 0;
|
|
152
51
|
const details = [];
|
|
153
52
|
let scannedCount = 0;
|
|
53
|
+
let skippedUnreadable = 0;
|
|
154
54
|
for (const file of changedFiles) {
|
|
155
55
|
const fullPath = join(cwd, file);
|
|
156
56
|
if (!existsSync(fullPath))
|
|
@@ -169,10 +69,21 @@ export function registerScopeExecutors() {
|
|
|
169
69
|
details.push(` ${file}:L${hf.line_number} [${hf.pattern}] ${hf.message}`);
|
|
170
70
|
}
|
|
171
71
|
}
|
|
172
|
-
catch {
|
|
173
|
-
//
|
|
72
|
+
catch (readErr) {
|
|
73
|
+
// F-02 修复:单文件读取失败不静默——计数 + log(原空 catch 在全部不可读时 0 hard fail 假通过)
|
|
74
|
+
skippedUnreadable++;
|
|
75
|
+
debug("lazy_pattern", `文件读取失败跳过 ${file}: ${readErr instanceof Error ? readErr.message : String(readErr)}`);
|
|
174
76
|
}
|
|
175
77
|
}
|
|
78
|
+
// F-02 根治:全部变更文件都读取失败 → 无法验证,fail-closed(非"全跳过=通过")
|
|
79
|
+
if (scannedCount === 0 && skippedUnreadable > 0 && skippedUnreadable >= changedFiles.length) {
|
|
80
|
+
return {
|
|
81
|
+
check_id: check.id,
|
|
82
|
+
executed_by: "code",
|
|
83
|
+
passed: false,
|
|
84
|
+
error: `全部 ${changedFiles.length} 个变更文件读取失败,无法执行偷懒模式扫描(fail-closed)`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
176
87
|
if (totalHardFails > 0) {
|
|
177
88
|
return {
|
|
178
89
|
check_id: check.id,
|
|
@@ -204,68 +115,4 @@ export function registerScopeExecutors() {
|
|
|
204
115
|
* 从切片计划加载当前切片的涉及文件列表。
|
|
205
116
|
* 唯一数据源:docs/architecture/02-开发切片计划.md(.soloforge/output/*.yaml 为无生成器死链路,已清除)。
|
|
206
117
|
*/
|
|
207
|
-
function loadSlicePlanFiles(ctx) {
|
|
208
|
-
if (!ctx.sliceId)
|
|
209
|
-
return [];
|
|
210
|
-
const normalizedId = ctx.sliceId.toUpperCase().replace(/[-_]/g, "-");
|
|
211
|
-
const slicePlanPath = join(ctx.projectRoot, "docs", "architecture", "02-开发切片计划.md");
|
|
212
|
-
if (!existsSync(slicePlanPath))
|
|
213
|
-
return [];
|
|
214
|
-
try {
|
|
215
|
-
const content = readFileSync(slicePlanPath, "utf-8");
|
|
216
|
-
return extractSliceFilesFromMarkdown(content, normalizedId);
|
|
217
|
-
}
|
|
218
|
-
catch {
|
|
219
|
-
return [];
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* 从切片计划 markdown 提取当前切片的涉及文件列表。
|
|
224
|
-
* 解析「文件汇总」表:| 文件路径 | 涉及切片 | 变更类型 | 上下文边界 |,
|
|
225
|
-
* 取「涉及切片」列含目标切片 ID 的行的「文件路径」列;解析不到则返回空(file_scope_check 降级)。
|
|
226
|
-
*/
|
|
227
|
-
function extractSliceFilesFromMarkdown(content, normalizedId) {
|
|
228
|
-
const files = new Set();
|
|
229
|
-
const lines = content.split("\n");
|
|
230
|
-
let inFileTable = false;
|
|
231
|
-
let pathCol = -1;
|
|
232
|
-
let sliceCol = -1;
|
|
233
|
-
for (const line of lines) {
|
|
234
|
-
const trimmed = line.trim();
|
|
235
|
-
if (!trimmed.startsWith("|")) {
|
|
236
|
-
inFileTable = false;
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
const raw = trimmed.split("|");
|
|
240
|
-
if (raw[0] === "")
|
|
241
|
-
raw.shift();
|
|
242
|
-
if (raw[raw.length - 1] === "")
|
|
243
|
-
raw.pop();
|
|
244
|
-
const cols = raw.map((c) => c.trim());
|
|
245
|
-
if (cols.some((c) => c.includes("文件路径")) || cols.some((c) => c.includes("涉及切片"))) {
|
|
246
|
-
inFileTable = true;
|
|
247
|
-
pathCol = cols.findIndex((c) => c.includes("文件路径"));
|
|
248
|
-
sliceCol = cols.findIndex((c) => c.includes("涉及切片"));
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
if (!inFileTable || pathCol < 0 || sliceCol < 0 || sliceCol >= cols.length)
|
|
252
|
-
continue;
|
|
253
|
-
const sliceCell = (cols[sliceCol] ?? "").toUpperCase().replace(/[-_]/g, "-");
|
|
254
|
-
if (sliceCell.includes(normalizedId)) {
|
|
255
|
-
const filePath = cols[pathCol] ?? "";
|
|
256
|
-
if (filePath && !filePath.includes("<!--") && filePath !== "文件路径" && filePath.length > 2) {
|
|
257
|
-
files.add(filePath);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
return [...files];
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* 获取已通过切片的受保护文件列表(用于切片隔离检查)。
|
|
265
|
-
* 域架构:从 GateRecord 派生(暂未传入 EvaluationContext),返回空列表。
|
|
266
|
-
*/
|
|
267
|
-
function getProtectedFiles(_ctx) {
|
|
268
|
-
// 域架构模式:受保护文件列表由 GateRecordStore 产出文件追踪保障
|
|
269
|
-
return [];
|
|
270
|
-
}
|
|
271
118
|
//# sourceMappingURL=executors_scope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_scope.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"executors_scope.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_trace.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH;;iEAEiE;AACjE,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAqBpE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CA0BV;
|
|
1
|
+
{"version":3,"file":"executors_trace.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH;;iEAEiE;AACjE,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAqBpE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CA0BV;AA4ED,gBAAgB;AAChB,wBAAgB,sBAAsB,IAAI,IAAI,CA+U7C"}
|