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.
Files changed (266) hide show
  1. package/README.md +11 -7
  2. package/dist/cli/adapter_writers.d.ts +5 -0
  3. package/dist/cli/adapter_writers.d.ts.map +1 -1
  4. package/dist/cli/adapter_writers.js +25 -0
  5. package/dist/cli/adapter_writers.js.map +1 -1
  6. package/dist/cli/init.d.ts.map +1 -1
  7. package/dist/cli/init.js +3 -1
  8. package/dist/cli/init.js.map +1 -1
  9. package/dist/cli/scope_check.d.ts +4 -0
  10. package/dist/cli/scope_check.d.ts.map +1 -0
  11. package/dist/cli/scope_check.js +51 -0
  12. package/dist/cli/scope_check.js.map +1 -0
  13. package/dist/context/adapters/claude_code/hooks.d.ts +5 -7
  14. package/dist/context/adapters/claude_code/hooks.d.ts.map +1 -1
  15. package/dist/context/adapters/claude_code/hooks.js +11 -9
  16. package/dist/context/adapters/claude_code/hooks.js.map +1 -1
  17. package/dist/context/adapters/shared/integration_guide.d.ts +3 -3
  18. package/dist/context/adapters/shared/integration_guide.js +18 -8
  19. package/dist/context/adapters/shared/integration_guide.js.map +1 -1
  20. package/dist/context/adapters/shared/workflow_template.js +1 -1
  21. package/dist/context/config/intent_schema.d.ts +793 -6
  22. package/dist/context/config/intent_schema.d.ts.map +1 -1
  23. package/dist/context/config/intent_schema.js +9 -0
  24. package/dist/context/config/intent_schema.js.map +1 -1
  25. package/dist/context/config/resolver.d.ts +9 -0
  26. package/dist/context/config/resolver.d.ts.map +1 -1
  27. package/dist/context/config/resolver.js +5 -0
  28. package/dist/context/config/resolver.js.map +1 -1
  29. package/dist/core/adversarial_review_store.d.ts +133 -0
  30. package/dist/core/adversarial_review_store.d.ts.map +1 -0
  31. package/dist/core/adversarial_review_store.js +161 -0
  32. package/dist/core/adversarial_review_store.js.map +1 -0
  33. package/dist/core/domain_transition.d.ts.map +1 -1
  34. package/dist/core/domain_transition.js +3 -0
  35. package/dist/core/domain_transition.js.map +1 -1
  36. package/dist/core/gate_record_store.d.ts +2 -0
  37. package/dist/core/gate_record_store.d.ts.map +1 -1
  38. package/dist/core/gate_record_store.js +17 -4
  39. package/dist/core/gate_record_store.js.map +1 -1
  40. package/dist/core/git_utils.d.ts +1 -1
  41. package/dist/core/git_utils.d.ts.map +1 -1
  42. package/dist/core/git_utils.js +8 -4
  43. package/dist/core/git_utils.js.map +1 -1
  44. package/dist/core/observer.d.ts.map +1 -1
  45. package/dist/core/observer.js +26 -2
  46. package/dist/core/observer.js.map +1 -1
  47. package/dist/core/task_context/constants.d.ts.map +1 -1
  48. package/dist/core/task_context/constants.js +4 -2
  49. package/dist/core/task_context/constants.js.map +1 -1
  50. package/dist/core/task_context/manager.d.ts +4 -4
  51. package/dist/core/task_context/manager.d.ts.map +1 -1
  52. package/dist/core/task_context/manager.js +69 -62
  53. package/dist/core/task_context/manager.js.map +1 -1
  54. package/dist/core/task_context/manager_setters.d.ts +2 -0
  55. package/dist/core/task_context/manager_setters.d.ts.map +1 -1
  56. package/dist/core/task_context/manager_setters.js +10 -0
  57. package/dist/core/task_context/manager_setters.js.map +1 -1
  58. package/dist/core/task_context/stage_fact_ownership.js +1 -1
  59. package/dist/core/task_context/stage_fact_ownership.js.map +1 -1
  60. package/dist/core/task_context/status_transitions.js +5 -5
  61. package/dist/core/task_context/status_transitions.js.map +1 -1
  62. package/dist/core/types.d.ts +29 -0
  63. package/dist/core/types.d.ts.map +1 -1
  64. package/dist/core/waiver_store.d.ts +100 -0
  65. package/dist/core/waiver_store.d.ts.map +1 -0
  66. package/dist/core/waiver_store.js +185 -0
  67. package/dist/core/waiver_store.js.map +1 -0
  68. package/dist/domain/asset_registry/derived_registry.d.ts +10 -0
  69. package/dist/domain/asset_registry/derived_registry.d.ts.map +1 -1
  70. package/dist/domain/asset_registry/derived_registry.js +10 -0
  71. package/dist/domain/asset_registry/derived_registry.js.map +1 -1
  72. package/dist/domain/asset_registry/derived_types.d.ts +27 -0
  73. package/dist/domain/asset_registry/derived_types.d.ts.map +1 -1
  74. package/dist/domain/asset_registry/derived_types.js +10 -0
  75. package/dist/domain/asset_registry/derived_types.js.map +1 -1
  76. package/dist/domain/build/engine.d.ts +1 -0
  77. package/dist/domain/build/engine.d.ts.map +1 -1
  78. package/dist/domain/build/engine.js +34 -4
  79. package/dist/domain/build/engine.js.map +1 -1
  80. package/dist/domain/contracts/design_lifecycle_contract.d.ts.map +1 -1
  81. package/dist/domain/contracts/design_lifecycle_contract.js +11 -4
  82. package/dist/domain/contracts/design_lifecycle_contract.js.map +1 -1
  83. package/dist/domain/design/contract.d.ts.map +1 -1
  84. package/dist/domain/design/contract.js +11 -0
  85. package/dist/domain/design/contract.js.map +1 -1
  86. package/dist/domain/design/engine.d.ts +1 -0
  87. package/dist/domain/design/engine.d.ts.map +1 -1
  88. package/dist/domain/design/engine.js +35 -3
  89. package/dist/domain/design/engine.js.map +1 -1
  90. package/dist/domain/engine_helpers.d.ts +37 -0
  91. package/dist/domain/engine_helpers.d.ts.map +1 -1
  92. package/dist/domain/engine_helpers.js +86 -0
  93. package/dist/domain/engine_helpers.js.map +1 -1
  94. package/dist/domain/operate/engine.d.ts +1 -0
  95. package/dist/domain/operate/engine.d.ts.map +1 -1
  96. package/dist/domain/operate/engine.js +19 -2
  97. package/dist/domain/operate/engine.js.map +1 -1
  98. package/dist/domain/types.d.ts +6 -0
  99. package/dist/domain/types.d.ts.map +1 -1
  100. package/dist/domain/types.js.map +1 -1
  101. package/dist/domain/verify/engine.d.ts +1 -0
  102. package/dist/domain/verify/engine.d.ts.map +1 -1
  103. package/dist/domain/verify/engine.js +18 -1
  104. package/dist/domain/verify/engine.js.map +1 -1
  105. package/dist/gate/certainty_gate.d.ts +10 -0
  106. package/dist/gate/certainty_gate.d.ts.map +1 -1
  107. package/dist/gate/certainty_gate.js.map +1 -1
  108. package/dist/gate/contracts/tool_actions.d.ts +11 -2
  109. package/dist/gate/contracts/tool_actions.d.ts.map +1 -1
  110. package/dist/gate/contracts/tool_actions.js +12 -2
  111. package/dist/gate/contracts/tool_actions.js.map +1 -1
  112. package/dist/gate/contracts/tool_invocation_contract_registry.d.ts.map +1 -1
  113. package/dist/gate/contracts/tool_invocation_contract_registry.js +11 -1
  114. package/dist/gate/contracts/tool_invocation_contract_registry.js.map +1 -1
  115. package/dist/gate/executors/executors_annotation.d.ts +33 -10
  116. package/dist/gate/executors/executors_annotation.d.ts.map +1 -1
  117. package/dist/gate/executors/executors_annotation.js +119 -64
  118. package/dist/gate/executors/executors_annotation.js.map +1 -1
  119. package/dist/gate/executors/executors_artifact.d.ts +20 -1
  120. package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
  121. package/dist/gate/executors/executors_artifact.js +83 -123
  122. package/dist/gate/executors/executors_artifact.js.map +1 -1
  123. package/dist/gate/executors/executors_build.d.ts +2 -2
  124. package/dist/gate/executors/executors_build.d.ts.map +1 -1
  125. package/dist/gate/executors/executors_build.js +28 -126
  126. package/dist/gate/executors/executors_build.js.map +1 -1
  127. package/dist/gate/executors/executors_deploy.d.ts.map +1 -1
  128. package/dist/gate/executors/executors_deploy.js +35 -7
  129. package/dist/gate/executors/executors_deploy.js.map +1 -1
  130. package/dist/gate/executors/executors_external_command.d.ts.map +1 -1
  131. package/dist/gate/executors/executors_external_command.js +54 -2
  132. package/dist/gate/executors/executors_external_command.js.map +1 -1
  133. package/dist/gate/executors/executors_field_mapping.d.ts +7 -0
  134. package/dist/gate/executors/executors_field_mapping.d.ts.map +1 -0
  135. package/dist/gate/executors/executors_field_mapping.js +191 -0
  136. package/dist/gate/executors/executors_field_mapping.js.map +1 -0
  137. package/dist/gate/executors/executors_jacoco.d.ts +3 -0
  138. package/dist/gate/executors/executors_jacoco.d.ts.map +1 -0
  139. package/dist/gate/executors/executors_jacoco.js +70 -0
  140. package/dist/gate/executors/executors_jacoco.js.map +1 -0
  141. package/dist/gate/executors/executors_prerequisite.d.ts +1 -1
  142. package/dist/gate/executors/executors_prerequisite.d.ts.map +1 -1
  143. package/dist/gate/executors/executors_prerequisite.js +2 -62
  144. package/dist/gate/executors/executors_prerequisite.js.map +1 -1
  145. package/dist/gate/executors/executors_probe.d.ts +1 -0
  146. package/dist/gate/executors/executors_probe.d.ts.map +1 -1
  147. package/dist/gate/executors/executors_probe.js +1 -0
  148. package/dist/gate/executors/executors_probe.js.map +1 -1
  149. package/dist/gate/executors/executors_regex_scan.d.ts.map +1 -1
  150. package/dist/gate/executors/executors_regex_scan.js +34 -13
  151. package/dist/gate/executors/executors_regex_scan.js.map +1 -1
  152. package/dist/gate/executors/executors_scope.d.ts +7 -3
  153. package/dist/gate/executors/executors_scope.d.ts.map +1 -1
  154. package/dist/gate/executors/executors_scope.js +20 -173
  155. package/dist/gate/executors/executors_scope.js.map +1 -1
  156. package/dist/gate/executors/executors_trace.d.ts +5 -0
  157. package/dist/gate/executors/executors_trace.d.ts.map +1 -1
  158. package/dist/gate/executors/executors_trace.js +295 -4
  159. package/dist/gate/executors/executors_trace.js.map +1 -1
  160. package/dist/gate/executors/index.d.ts.map +1 -1
  161. package/dist/gate/executors/index.js +4 -2
  162. package/dist/gate/executors/index.js.map +1 -1
  163. package/dist/gate/gate_engine.d.ts +20 -0
  164. package/dist/gate/gate_engine.d.ts.map +1 -1
  165. package/dist/gate/gate_engine.js +58 -6
  166. package/dist/gate/gate_engine.js.map +1 -1
  167. package/dist/gate/gate_registry_bridge.d.ts +12 -2
  168. package/dist/gate/gate_registry_bridge.d.ts.map +1 -1
  169. package/dist/gate/gate_registry_bridge.js +7 -5
  170. package/dist/gate/gate_registry_bridge.js.map +1 -1
  171. package/dist/gate/middleware_gates.js +1 -1
  172. package/dist/gate/middleware_gates.js.map +1 -1
  173. package/dist/gate/release/gate_checks/checkAssetAntiBloat.d.ts.map +1 -1
  174. package/dist/gate/release/gate_checks/checkAssetAntiBloat.js +3 -0
  175. package/dist/gate/release/gate_checks/checkAssetAntiBloat.js.map +1 -1
  176. package/dist/gate/scope_resolver.d.ts +7 -0
  177. package/dist/gate/scope_resolver.d.ts.map +1 -1
  178. package/dist/gate/scope_resolver.js +1 -1
  179. package/dist/gate/scope_resolver.js.map +1 -1
  180. package/dist/index.js +5 -0
  181. package/dist/index.js.map +1 -1
  182. package/dist/server/tools/index.d.ts.map +1 -1
  183. package/dist/server/tools/index.js +4 -2
  184. package/dist/server/tools/index.js.map +1 -1
  185. package/dist/server/tools/middleware.d.ts.map +1 -1
  186. package/dist/server/tools/middleware.js +1 -0
  187. package/dist/server/tools/middleware.js.map +1 -1
  188. package/dist/server/tools/schemas.d.ts +10 -0
  189. package/dist/server/tools/schemas.d.ts.map +1 -1
  190. package/dist/server/tools/schemas.js +10 -0
  191. package/dist/server/tools/schemas.js.map +1 -1
  192. package/dist/server/tools/sf_doctor.d.ts +8 -0
  193. package/dist/server/tools/sf_doctor.d.ts.map +1 -1
  194. package/dist/server/tools/sf_doctor.js +58 -2
  195. package/dist/server/tools/sf_doctor.js.map +1 -1
  196. package/dist/server/tools/sf_task.d.ts +83 -0
  197. package/dist/server/tools/sf_task.d.ts.map +1 -1
  198. package/dist/server/tools/sf_task.js +121 -4
  199. package/dist/server/tools/sf_task.js.map +1 -1
  200. package/dist/server/tools/sf_waiver.d.ts +31 -0
  201. package/dist/server/tools/sf_waiver.d.ts.map +1 -0
  202. package/dist/server/tools/sf_waiver.js +139 -0
  203. package/dist/server/tools/sf_waiver.js.map +1 -0
  204. package/dist/server/tools/sf_work.d.ts +194 -0
  205. package/dist/server/tools/sf_work.d.ts.map +1 -1
  206. package/dist/server/tools/sf_work.js +603 -40
  207. package/dist/server/tools/sf_work.js.map +1 -1
  208. package/dist/shared/paths.d.ts +4 -0
  209. package/dist/shared/paths.d.ts.map +1 -1
  210. package/dist/shared/paths.js +6 -0
  211. package/dist/shared/paths.js.map +1 -1
  212. package/dist/shared/traceability_id_utils.js +3 -3
  213. package/dist/shared/traceability_id_utils.js.map +1 -1
  214. package/dist/types/pipeline_types.d.ts +4 -1
  215. package/dist/types/pipeline_types.d.ts.map +1 -1
  216. package/dist/verify/audit/probe_executor.d.ts +4 -1
  217. package/dist/verify/audit/probe_executor.d.ts.map +1 -1
  218. package/dist/verify/audit/probe_executor.js +4 -1
  219. package/dist/verify/audit/probe_executor.js.map +1 -1
  220. package/dist/verify/audit/probe_rule.d.ts +3 -0
  221. package/dist/verify/audit/probe_rule.d.ts.map +1 -1
  222. package/dist/verify/audit/probe_rule.js +3 -0
  223. package/dist/verify/audit/probe_rule.js.map +1 -1
  224. package/dist/verify/contracts/decision_workshop.d.ts.map +1 -1
  225. package/dist/verify/contracts/decision_workshop.js +4 -3
  226. package/dist/verify/contracts/decision_workshop.js.map +1 -1
  227. package/dist/verify/contracts/runtime_state_recovery_registry.d.ts.map +1 -1
  228. package/dist/verify/contracts/runtime_state_recovery_registry.js +0 -1
  229. package/dist/verify/contracts/runtime_state_recovery_registry.js.map +1 -1
  230. package/package.json +1 -1
  231. package/templates/build/enforced.md +263 -68
  232. package/templates/build//346/263/250/351/207/212/347/272/252/345/276/213.md +48 -0
  233. package/templates/build//346/265/213/350/257/225/344/274/230/345/205/210/347/274/226/347/240/201.md +1 -0
  234. package/templates/build//346/265/213/350/257/225/350/256/241/345/210/222.md +9 -4
  235. package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +28 -1
  236. 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
  237. package/templates/design/enforced.md +204 -14
  238. 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
  239. package/templates/design//345/210/207/347/211/207/350/247/204/345/210/222.md +4 -0
  240. package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md +76 -0
  241. 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
  242. package/templates/design//346/236/266/346/236/204/350/256/276/350/256/241.md +24 -0
  243. package/templates/design//350/256/276/350/256/241/345/206/263/347/255/226/347/272/252/345/276/213.md +58 -0
  244. package/templates/design//350/256/276/350/256/241/350/264/250/351/207/217/350/246/201/347/202/271.md +58 -0
  245. package/templates/design//351/234/200/346/261/202/345/210/206/346/236/220.md +24 -0
  246. 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
  247. package/templates/operate/enforced.md +42 -6
  248. package/templates/operate//345/217/221/345/270/203/350/257/264/346/230/216.md +19 -1
  249. package/templates/operate//351/203/250/347/275/262/351/205/215/347/275/256.md +10 -0
  250. package/templates/shared/enforced.md +37 -0
  251. 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
  252. 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
  253. package/templates/shared//347/240/224/350/256/250/350/256/260/345/275/225.md +54 -0
  254. package/templates/verify/enforced.md +92 -262
  255. 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
  256. package/templates/verify//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +12 -2
  257. package/templates/verify//345/256/241/346/237/245/346/270/205/345/215/225.md +3 -1
  258. package/templates/verify//346/236/266/346/236/204/350/257/255/344/271/211/347/272/242/347/272/277.md +60 -0
  259. package/dist/core/scope_checker.d.ts +0 -29
  260. package/dist/core/scope_checker.d.ts.map +0 -1
  261. package/dist/core/scope_checker.js +0 -53
  262. package/dist/core/scope_checker.js.map +0 -1
  263. package/dist/gate/executors/executors_openapi_sync.d.ts +0 -23
  264. package/dist/gate/executors/executors_openapi_sync.d.ts.map +0 -1
  265. package/dist/gate/executors/executors_openapi_sync.js +0 -145
  266. package/dist/gate/executors/executors_openapi_sync.js.map +0 -1
@@ -1,24 +1,47 @@
1
1
  /**
2
- * ast_annotation_check 执行器 — 检查 Controller/Service 方法上的注解组合是否合规。
2
+ * ast_annotation_check 执行器 — 检查 Controller 方法上的注解组合是否合规(如 @PostMapping 须配 @PreAuthorize)。
3
3
  *
4
4
  * 职责边界:
5
- * - 负责:正则扫描源码,检查注解组合(如 @PostMapping 必须 @Valid + @PreAuthorize)
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
- * 数据流:gate YAML rule_source → 规则文件 → pattern → 正则匹配
12
- * 持久化:无
13
- *
14
- * 复用 regex_pattern_scan 的基础设施,但增加了注解上下文感知。
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;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiG3D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,cAuDpC,CAAC"}
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/Service 方法上的注解组合是否合规。
2
+ * ast_annotation_check 执行器 — 检查 Controller 方法上的注解组合是否合规(如 @PostMapping 须配 @PreAuthorize)。
3
3
  *
4
4
  * 职责边界:
5
- * - 负责:正则扫描源码,检查注解组合(如 @PostMapping 必须 @Valid + @PreAuthorize)
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
- * 数据流:gate YAML rule_source → 规则文件 → pattern → 正则匹配
12
- * 持久化:无
13
- *
14
- * 复用 regex_pattern_scan 的基础设施,但增加了注解上下文感知。
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
- targetAnnotation: /@(PostMapping|PutMapping|PatchMapping)/,
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
- windowLines: 8,
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
- function checkAnnotations(projectRoot, relativePath) {
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 ANNOTATION_RULES) {
145
+ for (const rule of applicableRules) {
79
146
  if (!rule.targetAnnotation.test(lines[i]))
80
147
  continue;
81
- // 在窗口范围内查找 required 注解
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
- const diffFiles = getGitDiffFiles(projectRoot);
110
- if (diffFiles.length === 0) {
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
- // 只扫描 Java/Kotlin 文件
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":"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"}
1
+ {"version":3,"file":"executors_annotation.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_annotation.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * 产物类执行器 — 文件证据、报告结构、文档结构、YAML 切片完成度、切片可验证性校验。
3
3
  *
4
4
  * 职责边界:
5
- * - 负责:file_evidence、report_structure、document_structure、yaml_slice_completion、slice_verifiability_check
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;AAWH,eAAe;AACf,wBAAgB,yBAAyB,IAAI,IAAI,CAgZhD"}
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"}