soloforge 1.1.47 → 1.1.49
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 +11 -7
- package/dist/cli/adapter_writers.d.ts +5 -0
- package/dist/cli/adapter_writers.d.ts.map +1 -1
- package/dist/cli/adapter_writers.js +25 -0
- package/dist/cli/adapter_writers.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/scope_check.d.ts +4 -0
- package/dist/cli/scope_check.d.ts.map +1 -0
- package/dist/cli/scope_check.js +51 -0
- package/dist/cli/scope_check.js.map +1 -0
- package/dist/context/adapters/claude_code/hooks.d.ts +5 -7
- package/dist/context/adapters/claude_code/hooks.d.ts.map +1 -1
- package/dist/context/adapters/claude_code/hooks.js +11 -9
- package/dist/context/adapters/claude_code/hooks.js.map +1 -1
- package/dist/context/adapters/shared/integration_guide.d.ts +3 -3
- package/dist/context/adapters/shared/integration_guide.js +18 -8
- package/dist/context/adapters/shared/integration_guide.js.map +1 -1
- package/dist/context/adapters/shared/workflow_template.js +1 -1
- package/dist/context/config/intent_schema.d.ts +793 -6
- package/dist/context/config/intent_schema.d.ts.map +1 -1
- package/dist/context/config/intent_schema.js +9 -0
- package/dist/context/config/intent_schema.js.map +1 -1
- package/dist/context/config/resolver.d.ts +9 -0
- package/dist/context/config/resolver.d.ts.map +1 -1
- package/dist/context/config/resolver.js +5 -0
- package/dist/context/config/resolver.js.map +1 -1
- package/dist/core/adversarial_review_store.d.ts +133 -0
- package/dist/core/adversarial_review_store.d.ts.map +1 -0
- package/dist/core/adversarial_review_store.js +161 -0
- package/dist/core/adversarial_review_store.js.map +1 -0
- package/dist/core/domain_transition.d.ts.map +1 -1
- package/dist/core/domain_transition.js +3 -0
- package/dist/core/domain_transition.js.map +1 -1
- package/dist/core/gate_record_store.d.ts +2 -0
- package/dist/core/gate_record_store.d.ts.map +1 -1
- package/dist/core/gate_record_store.js +17 -4
- package/dist/core/gate_record_store.js.map +1 -1
- package/dist/core/git_utils.d.ts +1 -1
- package/dist/core/git_utils.d.ts.map +1 -1
- package/dist/core/git_utils.js +8 -4
- package/dist/core/git_utils.js.map +1 -1
- package/dist/core/observer.d.ts.map +1 -1
- package/dist/core/observer.js +26 -2
- package/dist/core/observer.js.map +1 -1
- package/dist/core/task_context/constants.d.ts.map +1 -1
- package/dist/core/task_context/constants.js +4 -2
- package/dist/core/task_context/constants.js.map +1 -1
- package/dist/core/task_context/manager.d.ts +4 -4
- package/dist/core/task_context/manager.d.ts.map +1 -1
- package/dist/core/task_context/manager.js +69 -62
- package/dist/core/task_context/manager.js.map +1 -1
- package/dist/core/task_context/manager_setters.d.ts +2 -0
- package/dist/core/task_context/manager_setters.d.ts.map +1 -1
- package/dist/core/task_context/manager_setters.js +10 -0
- package/dist/core/task_context/manager_setters.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 +29 -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 +27 -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/domain/build/engine.d.ts +1 -0
- package/dist/domain/build/engine.d.ts.map +1 -1
- package/dist/domain/build/engine.js +34 -4
- package/dist/domain/build/engine.js.map +1 -1
- package/dist/domain/contracts/design_lifecycle_contract.d.ts.map +1 -1
- package/dist/domain/contracts/design_lifecycle_contract.js +11 -4
- package/dist/domain/contracts/design_lifecycle_contract.js.map +1 -1
- package/dist/domain/design/contract.d.ts.map +1 -1
- package/dist/domain/design/contract.js +11 -0
- package/dist/domain/design/contract.js.map +1 -1
- package/dist/domain/design/engine.d.ts +1 -0
- package/dist/domain/design/engine.d.ts.map +1 -1
- package/dist/domain/design/engine.js +35 -3
- package/dist/domain/design/engine.js.map +1 -1
- package/dist/domain/engine_helpers.d.ts +37 -0
- package/dist/domain/engine_helpers.d.ts.map +1 -1
- package/dist/domain/engine_helpers.js +86 -0
- package/dist/domain/engine_helpers.js.map +1 -1
- package/dist/domain/operate/engine.d.ts +1 -0
- package/dist/domain/operate/engine.d.ts.map +1 -1
- package/dist/domain/operate/engine.js +19 -2
- package/dist/domain/operate/engine.js.map +1 -1
- package/dist/domain/types.d.ts +6 -0
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/domain/types.js.map +1 -1
- package/dist/domain/verify/engine.d.ts +1 -0
- package/dist/domain/verify/engine.d.ts.map +1 -1
- package/dist/domain/verify/engine.js +18 -1
- package/dist/domain/verify/engine.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 +11 -2
- package/dist/gate/contracts/tool_actions.d.ts.map +1 -1
- package/dist/gate/contracts/tool_actions.js +12 -2
- 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 +20 -1
- package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
- package/dist/gate/executors/executors_artifact.js +83 -123
- 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 +28 -126
- 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 +54 -2
- package/dist/gate/executors/executors_external_command.js.map +1 -1
- package/dist/gate/executors/executors_field_mapping.d.ts +7 -0
- package/dist/gate/executors/executors_field_mapping.d.ts.map +1 -0
- package/dist/gate/executors/executors_field_mapping.js +191 -0
- package/dist/gate/executors/executors_field_mapping.js.map +1 -0
- 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 +2 -62
- 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_regex_scan.d.ts.map +1 -1
- package/dist/gate/executors/executors_regex_scan.js +34 -13
- package/dist/gate/executors/executors_regex_scan.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 +20 -173
- package/dist/gate/executors/executors_scope.js.map +1 -1
- package/dist/gate/executors/executors_trace.d.ts +5 -0
- package/dist/gate/executors/executors_trace.d.ts.map +1 -1
- package/dist/gate/executors/executors_trace.js +295 -4
- package/dist/gate/executors/executors_trace.js.map +1 -1
- package/dist/gate/executors/index.d.ts.map +1 -1
- package/dist/gate/executors/index.js +4 -2
- package/dist/gate/executors/index.js.map +1 -1
- package/dist/gate/gate_engine.d.ts +20 -0
- package/dist/gate/gate_engine.d.ts.map +1 -1
- package/dist/gate/gate_engine.js +58 -6
- package/dist/gate/gate_engine.js.map +1 -1
- package/dist/gate/gate_registry_bridge.d.ts +12 -2
- package/dist/gate/gate_registry_bridge.d.ts.map +1 -1
- package/dist/gate/gate_registry_bridge.js +7 -5
- package/dist/gate/gate_registry_bridge.js.map +1 -1
- package/dist/gate/middleware_gates.js +1 -1
- package/dist/gate/middleware_gates.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/gate/scope_resolver.d.ts +7 -0
- package/dist/gate/scope_resolver.d.ts.map +1 -1
- package/dist/gate/scope_resolver.js +1 -1
- package/dist/gate/scope_resolver.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.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 +8 -0
- package/dist/server/tools/sf_doctor.d.ts.map +1 -1
- package/dist/server/tools/sf_doctor.js +58 -2
- package/dist/server/tools/sf_doctor.js.map +1 -1
- package/dist/server/tools/sf_task.d.ts +83 -0
- package/dist/server/tools/sf_task.d.ts.map +1 -1
- package/dist/server/tools/sf_task.js +121 -4
- package/dist/server/tools/sf_task.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 +194 -0
- package/dist/server/tools/sf_work.d.ts.map +1 -1
- package/dist/server/tools/sf_work.js +603 -40
- 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/shared/traceability_id_utils.js +3 -3
- package/dist/shared/traceability_id_utils.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/decision_workshop.d.ts.map +1 -1
- package/dist/verify/contracts/decision_workshop.js +4 -3
- package/dist/verify/contracts/decision_workshop.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/package.json +1 -1
- package/templates/build/enforced.md +263 -68
- package/templates/build//346/263/250/351/207/212/347/272/252/345/276/213.md +48 -0
- 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//346/265/213/350/257/225/350/256/241/345/210/222.md +9 -4
- package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +28 -1
- package/templates/design/API/346/216/245/345/217/243/350/247/204/346/240/274/346/226/207/346/241/243.md +7 -0
- package/templates/design/enforced.md +204 -14
- 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 +9 -7
- package/templates/design//345/210/207/347/211/207/350/247/204/345/210/222.md +4 -0
- package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md +76 -0
- package/templates/design//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/346/226/207/346/241/243.md +2 -0
- package/templates/design//346/236/266/346/236/204/350/256/276/350/256/241.md +24 -0
- package/templates/design//350/256/276/350/256/241/345/206/263/347/255/226/347/272/252/345/276/213.md +58 -0
- package/templates/design//350/256/276/350/256/241/350/264/250/351/207/217/350/246/201/347/202/271.md +58 -0
- package/templates/design//351/234/200/346/261/202/345/210/206/346/236/220.md +24 -0
- package/templates/operate/UI/350/247/206/350/247/211/351/252/214/346/224/266/347/272/252/345/276/213.md +85 -0
- package/templates/operate/enforced.md +42 -6
- package/templates/operate//345/217/221/345/270/203/350/257/264/346/230/216.md +19 -1
- package/templates/operate//351/203/250/347/275/262/351/205/215/347/275/256.md +10 -0
- package/templates/shared/enforced.md +37 -0
- package/templates/shared//345/267/245/344/275/234/346/265/201/345/257/274/350/210/252/345/245/221/347/272/246.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/shared//347/240/224/350/256/250/350/256/260/345/275/225.md +54 -0
- package/templates/verify/enforced.md +92 -262
- 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 -0
- package/templates/verify//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +12 -2
- package/templates/verify//345/256/241/346/237/245/346/270/205/345/215/225.md +3 -1
- package/templates/verify//346/236/266/346/236/204/350/257/255/344/271/211/347/272/242/347/272/277.md +60 -0
- package/dist/core/scope_checker.d.ts +0 -29
- package/dist/core/scope_checker.d.ts.map +0 -1
- package/dist/core/scope_checker.js +0 -53
- package/dist/core/scope_checker.js.map +0 -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
|
@@ -1,24 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ast_annotation_check 执行器 — 检查 Controller
|
|
2
|
+
* ast_annotation_check 执行器 — 检查 Controller 方法上的注解组合是否合规(如 @PostMapping 须配 @PreAuthorize)。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* -
|
|
6
|
-
* - 不负责:AST
|
|
5
|
+
* - 负责:正则扫描源码,检查「X 注解必须配 Y 注解」类规则(regex_pattern_scan 的「命中=违规」表达不了「必须有」语义)
|
|
6
|
+
* - 不负责:AST 级别精确分析(用正则近似)
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:gate_engine evaluateCheck → gateExecutors.get("ast_annotation_check")
|
|
9
9
|
* 调用谁:fs(读取文件)、git diff(获取扫描目标)
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* 关键设计:
|
|
12
|
+
* 1. 按 check.id 选规则——每条 AnnotationRule 绑定 checkId,executor 只跑 check.id 对应的规则,
|
|
13
|
+
* 避免「一个 check 跑全部规则」导致语义混乱(API-03 只查权限,不该顺带查 @Valid/Swagger)。
|
|
14
|
+
* 2. 类级注解识别——方法找 requiredAnnotation 时,先查方法自身注解(向上到类边界),
|
|
15
|
+
* 再查类级注解(class 声明上方)。支持 Spring @PreAuthorize 类级作用于所有方法
|
|
16
|
+
* (固定窗口对「类级注解 + 多方法类」会漏查后面方法——治本)。
|
|
17
|
+
* 3. requiredAnnotation 只查「注解存在」,不查表达式内容——hasAnyRole/or/hasAuthority 等
|
|
18
|
+
* 多角色表达式只要 @PreAuthorize 在就算通过(表达式语义由 Spring 运行时保障,引擎不判)。
|
|
16
19
|
*/
|
|
17
20
|
import type { GateExecutorFn } from "../gate_executors.js";
|
|
21
|
+
/** 注解检查规则(每条绑定一个 check.id) */
|
|
22
|
+
export interface AnnotationRule {
|
|
23
|
+
/** 该规则对应的 check id(executor 按 check.id 过滤,只跑匹配规则) */
|
|
24
|
+
checkId: string;
|
|
25
|
+
/** 被检查的注解(如 @PostMapping) */
|
|
26
|
+
targetAnnotation: RegExp;
|
|
27
|
+
/** 必须同时存在的注解(如 @PreAuthorize) */
|
|
28
|
+
requiredAnnotation: RegExp;
|
|
29
|
+
/** 规则说明(违规时展示) */
|
|
30
|
+
hint: string;
|
|
31
|
+
}
|
|
32
|
+
/** 把全局配置的等效鉴权注解合并进 API-03 的 requiredAnnotation 白名单。
|
|
33
|
+
* 默认 @(PreAuthorize|Secured|RolesAllowed) + 用户声明 @(RequireRole|...) → 合并正则。
|
|
34
|
+
* extraNames 传入时直接用(测试用);不传则从 ~/.soloforge/annotations.yaml 读取。
|
|
35
|
+
* 配置缺失/为空 → 返回原规则(fail-safe,用默认白名单)。 */
|
|
36
|
+
export declare function mergeAuthAnnotations(rules: AnnotationRule[], extraNames?: string[]): AnnotationRule[];
|
|
37
|
+
/**
|
|
38
|
+
* 在 targetAnnotation 行查找 requiredAnnotation:先查方法自身注解(向上到类边界),再查类级注解(class 上方紧贴注解段)。
|
|
39
|
+
* 覆盖 Spring「类级 @PreAuthorize 作用于所有方法」语义——固定窗口对多方法类会漏查,故显式识别类级。
|
|
40
|
+
*/
|
|
41
|
+
export declare function hasRequiredAnnotation(lines: string[], targetIdx: number, required: RegExp): boolean;
|
|
18
42
|
/**
|
|
19
43
|
* ast_annotation_check 执行器入口。
|
|
20
|
-
*
|
|
21
|
-
* 对 git diff 变更的 Java/Kotlin 文件执行注解组合检查。
|
|
44
|
+
* 按 check.id 选适用的 AnnotationRule,对 git diff 变更的 Java/Kotlin 文件检查注解组合。
|
|
22
45
|
*/
|
|
23
46
|
export declare const executeAnnotationCheck: GateExecutorFn;
|
|
24
47
|
//# sourceMappingURL=executors_annotation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_annotation.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_annotation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"executors_annotation.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_annotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iCAAiC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAgDD;;;yCAGyC;AACzC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAarG;AAmBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgBnG;AA8BD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,cAiDpC,CAAC"}
|
|
@@ -1,50 +1,90 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ast_annotation_check 执行器 — 检查 Controller
|
|
2
|
+
* ast_annotation_check 执行器 — 检查 Controller 方法上的注解组合是否合规(如 @PostMapping 须配 @PreAuthorize)。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* -
|
|
6
|
-
* - 不负责:AST
|
|
5
|
+
* - 负责:正则扫描源码,检查「X 注解必须配 Y 注解」类规则(regex_pattern_scan 的「命中=违规」表达不了「必须有」语义)
|
|
6
|
+
* - 不负责:AST 级别精确分析(用正则近似)
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:gate_engine evaluateCheck → gateExecutors.get("ast_annotation_check")
|
|
9
9
|
* 调用谁:fs(读取文件)、git diff(获取扫描目标)
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* 关键设计:
|
|
12
|
+
* 1. 按 check.id 选规则——每条 AnnotationRule 绑定 checkId,executor 只跑 check.id 对应的规则,
|
|
13
|
+
* 避免「一个 check 跑全部规则」导致语义混乱(API-03 只查权限,不该顺带查 @Valid/Swagger)。
|
|
14
|
+
* 2. 类级注解识别——方法找 requiredAnnotation 时,先查方法自身注解(向上到类边界),
|
|
15
|
+
* 再查类级注解(class 声明上方)。支持 Spring @PreAuthorize 类级作用于所有方法
|
|
16
|
+
* (固定窗口对「类级注解 + 多方法类」会漏查后面方法——治本)。
|
|
17
|
+
* 3. requiredAnnotation 只查「注解存在」,不查表达式内容——hasAnyRole/or/hasAuthority 等
|
|
18
|
+
* 多角色表达式只要 @PreAuthorize 在就算通过(表达式语义由 Spring 运行时保障,引擎不判)。
|
|
16
19
|
*/
|
|
17
20
|
import fs from "node:fs";
|
|
18
21
|
import path from "node:path";
|
|
19
22
|
import { execSync } from "node:child_process";
|
|
20
|
-
|
|
23
|
+
import YAML from "yaml";
|
|
24
|
+
import { getGlobalAnnotationsPath } from "../../shared/paths.js";
|
|
25
|
+
/** 内置注解检查规则(按 checkId 绑定,executor 按 check.id 选)。
|
|
26
|
+
* 注:原 @Transactional 规则已删——Controller 层强制事务语义错误(事务归 Service),会误报。 */
|
|
21
27
|
const ANNOTATION_RULES = [
|
|
22
28
|
{
|
|
23
|
-
|
|
24
|
-
requiredAnnotation: /@(Valid|Validated)/,
|
|
25
|
-
windowLines: 5,
|
|
26
|
-
},
|
|
27
|
-
{
|
|
29
|
+
checkId: "API-03",
|
|
28
30
|
targetAnnotation: /@(PostMapping|PutMapping|DeleteMapping|PatchMapping)/,
|
|
29
31
|
requiredAnnotation: /@(PreAuthorize|Secured|RolesAllowed)/,
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
targetAnnotation: /@(PostMapping|PutMapping|DeleteMapping|PatchMapping)/,
|
|
34
|
-
requiredAnnotation: /@Transactional/,
|
|
35
|
-
windowLines: 15,
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
targetAnnotation: /@(GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)/,
|
|
39
|
-
requiredAnnotation: /@(Operation|Api|Tag)/,
|
|
40
|
-
windowLines: 5,
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
targetAnnotation: /@RequestBody/,
|
|
44
|
-
requiredAnnotation: /@(Valid|Validated)/,
|
|
45
|
-
windowLines: 3,
|
|
32
|
+
hint: "写接口(POST/PUT/DELETE/PATCH)须配权限注解(@PreAuthorize/@Secured/@RolesAllowed),类级或方法级皆可",
|
|
46
33
|
},
|
|
47
34
|
];
|
|
35
|
+
// ═══════════════════════════════════════════
|
|
36
|
+
// 全局等效鉴权注解配置(~/.soloforge/annotations.yaml)
|
|
37
|
+
// 项目用自定义鉴权注解(如 @RequireRole,配 AuthInterceptor,明确不引入 Spring Security)时,
|
|
38
|
+
// 默认只认 @PreAuthorize/@Secured/@RolesAllowed 的 API-03 会误报。用户可在全局配置声明等效注解合并进白名单。
|
|
39
|
+
// ═══════════════════════════════════════════
|
|
40
|
+
/** 全局等效鉴权注解缓存(按文件 mtime 失效,避免每次 verify 重读文件) */
|
|
41
|
+
let authAnnotationsCache = null;
|
|
42
|
+
/** 读取 ~/.soloforge/annotations.yaml 的 equivalent_auth_annotations 列表(注解简单名,不带 @)。
|
|
43
|
+
* 文件不存在/解析失败 → 空数组(fail-safe,executor 用内置默认白名单)。 */
|
|
44
|
+
function loadEquivalentAuthAnnotations() {
|
|
45
|
+
const filePath = getGlobalAnnotationsPath();
|
|
46
|
+
try {
|
|
47
|
+
const stat = fs.statSync(filePath);
|
|
48
|
+
if (authAnnotationsCache &&
|
|
49
|
+
authAnnotationsCache.path === filePath &&
|
|
50
|
+
authAnnotationsCache.mtimeMs === stat.mtimeMs) {
|
|
51
|
+
return authAnnotationsCache.names;
|
|
52
|
+
}
|
|
53
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
54
|
+
const doc = YAML.parse(content);
|
|
55
|
+
const raw = Array.isArray(doc?.equivalent_auth_annotations) ? doc.equivalent_auth_annotations : [];
|
|
56
|
+
const names = raw
|
|
57
|
+
.filter((n) => typeof n === "string" && n.trim().length > 0)
|
|
58
|
+
.map((n) => n.trim());
|
|
59
|
+
authAnnotationsCache = { names, mtimeMs: stat.mtimeMs, path: filePath };
|
|
60
|
+
return names;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** 把全局配置的等效鉴权注解合并进 API-03 的 requiredAnnotation 白名单。
|
|
67
|
+
* 默认 @(PreAuthorize|Secured|RolesAllowed) + 用户声明 @(RequireRole|...) → 合并正则。
|
|
68
|
+
* extraNames 传入时直接用(测试用);不传则从 ~/.soloforge/annotations.yaml 读取。
|
|
69
|
+
* 配置缺失/为空 → 返回原规则(fail-safe,用默认白名单)。 */
|
|
70
|
+
export function mergeAuthAnnotations(rules, extraNames) {
|
|
71
|
+
const extra = extraNames ?? loadEquivalentAuthAnnotations();
|
|
72
|
+
if (extra.length === 0)
|
|
73
|
+
return rules;
|
|
74
|
+
return rules.map((r) => {
|
|
75
|
+
if (r.checkId !== "API-03")
|
|
76
|
+
return r;
|
|
77
|
+
const builtins = ["PreAuthorize", "Secured", "RolesAllowed"];
|
|
78
|
+
const all = Array.from(new Set([...builtins, ...extra]));
|
|
79
|
+
return {
|
|
80
|
+
...r,
|
|
81
|
+
requiredAnnotation: new RegExp(`@(${all.join("|")})`),
|
|
82
|
+
hint: `${r.hint};或项目自定义等效注解:@(${extra.join("|")})`,
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** 类声明行(class/interface/enum/record)— 方法级查找的上界、类级查找的起点 */
|
|
87
|
+
const CLASS_DECL_RE = /^\s*(public\s+|abstract\s+|final\s+)*(class|interface|enum|record)\s/;
|
|
48
88
|
/** 获取 git diff 变更文件列表 */
|
|
49
89
|
function getGitDiffFiles(projectRoot) {
|
|
50
90
|
try {
|
|
@@ -59,12 +99,39 @@ function getGitDiffFiles(projectRoot) {
|
|
|
59
99
|
return [];
|
|
60
100
|
}
|
|
61
101
|
}
|
|
62
|
-
/**
|
|
63
|
-
|
|
102
|
+
/**
|
|
103
|
+
* 在 targetAnnotation 行查找 requiredAnnotation:先查方法自身注解(向上到类边界),再查类级注解(class 上方紧贴注解段)。
|
|
104
|
+
* 覆盖 Spring「类级 @PreAuthorize 作用于所有方法」语义——固定窗口对多方法类会漏查,故显式识别类级。
|
|
105
|
+
*/
|
|
106
|
+
export function hasRequiredAnnotation(lines, targetIdx, required) {
|
|
107
|
+
// 1. 方法自身注解:从 targetIdx 向上查,到类声明边界停(方法注解紧贴方法上方)
|
|
108
|
+
let classIdx = -1;
|
|
109
|
+
for (let j = targetIdx - 1; j >= 0; j--) {
|
|
110
|
+
if (CLASS_DECL_RE.test(lines[j])) {
|
|
111
|
+
classIdx = j;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
if (required.test(lines[j]))
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
if (classIdx < 0)
|
|
118
|
+
return false;
|
|
119
|
+
// 2. 类级注解:从 class 声明行向上查紧贴的注解段(@xxx 行,遇非注解非注释停)
|
|
120
|
+
for (let j = classIdx - 1; j >= 0; j--) {
|
|
121
|
+
const ln = lines[j].trim();
|
|
122
|
+
if (required.test(lines[j]))
|
|
123
|
+
return true;
|
|
124
|
+
// 注解段结束:遇非注解、非注释、非空行(package/import/字段/Javadoc 收尾等)则停
|
|
125
|
+
if (ln && !ln.startsWith("@") && !ln.startsWith("*") && !ln.startsWith("//") && !ln.startsWith("/*"))
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
/** 对单个文件执行注解检查(只跑 applicableRules) */
|
|
131
|
+
function checkAnnotations(projectRoot, relativePath, applicableRules) {
|
|
64
132
|
const fullPath = path.join(projectRoot, relativePath);
|
|
65
133
|
if (!fs.existsSync(fullPath))
|
|
66
134
|
return [];
|
|
67
|
-
// 防御 EISDIR:relativePath 来自 git diff,偶发为目录路径(existsSync 对目录也返回 true)
|
|
68
135
|
let content;
|
|
69
136
|
try {
|
|
70
137
|
content = fs.readFileSync(fullPath, "utf-8");
|
|
@@ -75,24 +142,14 @@ function checkAnnotations(projectRoot, relativePath) {
|
|
|
75
142
|
const lines = content.split("\n");
|
|
76
143
|
const violations = [];
|
|
77
144
|
for (let i = 0; i < lines.length; i++) {
|
|
78
|
-
for (const rule of
|
|
145
|
+
for (const rule of applicableRules) {
|
|
79
146
|
if (!rule.targetAnnotation.test(lines[i]))
|
|
80
147
|
continue;
|
|
81
|
-
|
|
82
|
-
const windowStart = Math.max(0, i - rule.windowLines);
|
|
83
|
-
const windowEnd = Math.min(lines.length - 1, i + rule.windowLines);
|
|
84
|
-
let found = false;
|
|
85
|
-
for (let j = windowStart; j <= windowEnd; j++) {
|
|
86
|
-
if (rule.requiredAnnotation.test(lines[j])) {
|
|
87
|
-
found = true;
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (!found) {
|
|
148
|
+
if (!hasRequiredAnnotation(lines, i, rule.requiredAnnotation)) {
|
|
92
149
|
violations.push({
|
|
93
150
|
file: relativePath,
|
|
94
151
|
line: i + 1,
|
|
95
|
-
rule: `${lines[i].trim()} 缺少 ${rule.requiredAnnotation.source}
|
|
152
|
+
rule: `${lines[i].trim()} 缺少 ${rule.requiredAnnotation.source}(${rule.hint})`,
|
|
96
153
|
});
|
|
97
154
|
}
|
|
98
155
|
}
|
|
@@ -101,46 +158,44 @@ function checkAnnotations(projectRoot, relativePath) {
|
|
|
101
158
|
}
|
|
102
159
|
/**
|
|
103
160
|
* ast_annotation_check 执行器入口。
|
|
104
|
-
*
|
|
105
|
-
* 对 git diff 变更的 Java/Kotlin 文件执行注解组合检查。
|
|
161
|
+
* 按 check.id 选适用的 AnnotationRule,对 git diff 变更的 Java/Kotlin 文件检查注解组合。
|
|
106
162
|
*/
|
|
107
163
|
export const executeAnnotationCheck = async (check, ctx) => {
|
|
108
164
|
const projectRoot = ctx.projectRoot;
|
|
109
|
-
|
|
110
|
-
|
|
165
|
+
// 按 check.id 过滤规则(一个 check 只跑它绑定的规则)
|
|
166
|
+
const baseRules = ANNOTATION_RULES.filter((r) => r.checkId === check.id);
|
|
167
|
+
if (baseRules.length === 0) {
|
|
111
168
|
return {
|
|
112
169
|
check_id: check.id,
|
|
113
170
|
executed_by: "code",
|
|
114
171
|
passed: true,
|
|
115
|
-
evidence:
|
|
172
|
+
evidence: `check ${check.id} 无绑定的注解规则,跳过`,
|
|
116
173
|
};
|
|
117
174
|
}
|
|
118
|
-
//
|
|
175
|
+
// 合并全局配置的等效鉴权注解(~/.soloforge/annotations.yaml)进白名单。
|
|
176
|
+
// 默认只认 Spring Security 三注解,项目用自定义 @RequireRole 等会被误报;用户可在全局配置声明等效注解。
|
|
177
|
+
const applicableRules = mergeAuthAnnotations(baseRules);
|
|
178
|
+
const diffFiles = getGitDiffFiles(projectRoot);
|
|
179
|
+
if (diffFiles.length === 0) {
|
|
180
|
+
return { check_id: check.id, executed_by: "code", passed: true, evidence: "无变更文件,跳过注解检查" };
|
|
181
|
+
}
|
|
119
182
|
const codeFiles = diffFiles.filter((f) => f.endsWith(".java") || f.endsWith(".kt"));
|
|
120
183
|
if (codeFiles.length === 0) {
|
|
121
|
-
return {
|
|
122
|
-
check_id: check.id,
|
|
123
|
-
executed_by: "code",
|
|
124
|
-
passed: true,
|
|
125
|
-
evidence: "无 Java/Kotlin 变更文件,跳过注解检查",
|
|
126
|
-
};
|
|
184
|
+
return { check_id: check.id, executed_by: "code", passed: true, evidence: "无 Java/Kotlin 变更文件,跳过注解检查" };
|
|
127
185
|
}
|
|
128
186
|
const allViolations = [];
|
|
129
187
|
for (const file of codeFiles) {
|
|
130
|
-
allViolations.push(...checkAnnotations(projectRoot, file));
|
|
188
|
+
allViolations.push(...checkAnnotations(projectRoot, file, applicableRules));
|
|
131
189
|
}
|
|
132
190
|
if (allViolations.length === 0) {
|
|
133
191
|
return {
|
|
134
192
|
check_id: check.id,
|
|
135
193
|
executed_by: "code",
|
|
136
194
|
passed: true,
|
|
137
|
-
evidence: `扫描 ${codeFiles.length}
|
|
195
|
+
evidence: `扫描 ${codeFiles.length} 个文件,注解组合全部合规(check ${check.id})`,
|
|
138
196
|
};
|
|
139
197
|
}
|
|
140
|
-
const evidenceLines = allViolations
|
|
141
|
-
.slice(0, 20)
|
|
142
|
-
.map((v) => `${v.file}:${v.line}: ${v.rule}`)
|
|
143
|
-
.join("\n");
|
|
198
|
+
const evidenceLines = allViolations.slice(0, 20).map((v) => `${v.file}:${v.line}: ${v.rule}`).join("\n");
|
|
144
199
|
return {
|
|
145
200
|
check_id: check.id,
|
|
146
201
|
executed_by: "code",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_annotation.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_annotation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"executors_annotation.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_annotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAcjE;sEACsE;AACtE,MAAM,gBAAgB,GAAqB;IACzC;QACE,OAAO,EAAE,QAAQ;QACjB,gBAAgB,EAAE,sDAAsD;QACxE,kBAAkB,EAAE,sCAAsC;QAC1D,IAAI,EAAE,iFAAiF;KACxF;CACF,CAAC;AAEF,8CAA8C;AAC9C,4CAA4C;AAC5C,uEAAuE;AACvE,+EAA+E;AAC/E,8CAA8C;AAE9C,gDAAgD;AAChD,IAAI,oBAAoB,GAA8D,IAAI,CAAC;AAE3F;qDACqD;AACrD,SAAS,6BAA6B;IACpC,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IACE,oBAAoB;YACpB,oBAAoB,CAAC,IAAI,KAAK,QAAQ;YACtC,oBAAoB,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAC7C,CAAC;YACD,OAAO,oBAAoB,CAAC,KAAK,CAAC;QACpC,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmC,CAAC;QAClE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,MAAM,KAAK,GAAG,GAAG;aACd,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,oBAAoB,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;yCAGyC;AACzC,MAAM,UAAU,oBAAoB,CAAC,KAAuB,EAAE,UAAqB;IACjF,MAAM,KAAK,GAAG,UAAU,IAAI,6BAA6B,EAAE,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO;YACL,GAAG,CAAC;YACJ,kBAAkB,EAAE,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACrD,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,iBAAiB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;SACnD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0DAA0D;AAC1D,MAAM,aAAa,GAAG,sEAAsE,CAAC;AAE7F,yBAAyB;AACzB,SAAS,eAAe,CAAC,WAAmB;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,yCAAyC,EAAE;YACjE,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAe,EAAE,SAAiB,EAAE,QAAgB;IACxF,gDAAgD;IAChD,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;QAC1D,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,gDAAgD;IAChD,KAAK,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,sDAAsD;QACtD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM;IAC9G,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sCAAsC;AACtC,SAAS,gBAAgB,CACvB,WAAmB,EACnB,YAAoB,EACpB,eAAiC;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAwD,EAAE,CAAC;IAE3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YACpD,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC9D,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG;iBAC9E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAmB,KAAK,EACzD,KAAgB,EAChB,GAAsB,EACtB,EAAE;IACF,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IACpC,qCAAqC;IACrC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACzE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,WAAW,EAAE,MAAe;YAC5B,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,SAAS,KAAK,CAAC,EAAE,cAAc;SAC1C,CAAC;IACJ,CAAC;IACD,oDAAoD;IACpD,qEAAqE;IACrE,MAAM,eAAe,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAe,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACtG,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,MAAe,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,aAAa,GAAwD,EAAE,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,aAAa,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,WAAW,EAAE,MAAe;YAC5B,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,MAAM,SAAS,CAAC,MAAM,uBAAuB,KAAK,CAAC,EAAE,GAAG;SACnE,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzG,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,EAAE;QAClB,WAAW,EAAE,MAAe;QAC5B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,MAAM,aAAa,CAAC,MAAM,YAAY,aAAa,EAAE;KAChE,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 产物类执行器 — 文件证据、报告结构、文档结构、YAML 切片完成度、切片可验证性校验。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* - 负责:file_evidence、report_structure、document_structure、
|
|
5
|
+
* - 负责:file_evidence、report_structure、document_structure、slice_verifiability_check
|
|
6
6
|
* - 不负责:不涉及部署/构建/追踪/范围/前置条件类 executor
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:index.ts(registerAllExecutors)
|
|
@@ -11,6 +11,25 @@
|
|
|
11
11
|
* 数据流:GateCheck + EvaluationContext → 读取产物文件 → 结构化验证 → CheckResult
|
|
12
12
|
* 持久化:读取本地文件(.soloforge/evidence/、docs/)
|
|
13
13
|
*/
|
|
14
|
+
import type { BlockCheckConfig } from "../../domain/asset_registry/derived_types.js";
|
|
14
15
|
/** 注册产物类执行器 */
|
|
15
16
|
export declare function registerArtifactExecutors(): void;
|
|
17
|
+
/**
|
|
18
|
+
* 条目块完整性校验(block_check,反退化硬兜底)。
|
|
19
|
+
* 按 item_pattern 把文档切成多个条目块,逐块校验:
|
|
20
|
+
* - required_marks:每块必须包含的文本标记(子章节名/关键字),缺任一判失败
|
|
21
|
+
* - require_table:每块必须含 ≥ min_table_rows 个表格数据行(排除表头分隔行 |---|)
|
|
22
|
+
* 任一块缺标记或表格行不足 → 精确报「块 X 缺 Y」。
|
|
23
|
+
* 防退化模式:前详后废、表格退化为一行文字、(同上格式)占位。
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkBlockIntegrity(content: string, cfg: BlockCheckConfig): {
|
|
26
|
+
passed: boolean;
|
|
27
|
+
error?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* 解析产物名/模版名到真实文件路径(document_structure 专用)。
|
|
31
|
+
* 候选 1:CROSS_VALIDATION_ARTIFACT_PATHS 模版名映射(含 glob 多端聚合,取首个命中);
|
|
32
|
+
* 候选 2:docs/ 下字面查找;候选 3:项目根相对路径。
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveArtifactPath(artifact: string | undefined, projectRoot: string): string | undefined;
|
|
16
35
|
//# sourceMappingURL=executors_artifact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executors_artifact.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"executors_artifact.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAErF,eAAe;AACf,wBAAgB,yBAAyB,IAAI,IAAI,CAgWhD;AAID;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA+C/G;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAmBzG"}
|