Community编程与开发github.com

YarlisAISolutions/rules-cascade-java

在 JVM 上强制实施 Rule Cascade 规则 - 支持 Java 17+、Kotlin 和 Scala;Spring Boot、Quarkus、Micronaut、Jakarta EE – 使用 com.rulescascade:rules-cascade-core。适用于将规则集成到 JVM 服务中,替换 Bean Validation 或手动编写检查,或者将规则结果映射为 HTTP 错误。

rules-cascade-java 是什么?

该技能旨在帮助开发者在使用 JVM 语言的 AI 代理(如 Claude Code、Cursor、Codex)中集成 Rule Cascade 规则引擎。它提供了一个轻量级的库(com.rulescascade:rules-cascade-core),无需额外运行时依赖,适用于 Java 17+、Kotlin 和 Scala 项目,以及 Spring Boot、Quarkus、Micronaut 和 Jakarta EE 等主流框架。技能的核心优势在于:通过 `rcas` 命令行工具将 YAML 规则编译为不可变的 bundle 文件,在启动时一次性加载到 `RuleSet` 中,并在每次请求时通过 `rules.enforce(request)` 或 `rules.evaluate(...)` 进行评估。当规则违反时,会抛出 `RuleViolationException` 异常,并映射为统一的 HTTP 422 响应(ProblemDetail 格式)。技能还提供了详细的四步流程指南(评估、拒绝、持久化、命令执行),以及如何替换现有验证逻辑(如 Bean Validation、Spring validators、Drools 规则)的迁移策略,包括使用 `rcas analyze` 自动分析代码中的验证片段,并建议通过黄金测试(`rcas check`)来保证规则正确性。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YarlisAISolutions/rule-cascade-skills/tree/main/plugins/rules-cascade/skills/rules-cascade-java

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

JVM 上的 Rule Cascade 依赖(Maven):com.rulescascade:rules-cascade-core(Java 17+,无其他运行时依赖;包名 com.rulescascade)。Gradle:implementation("com.rulescascade:rules-cascade-core:<version>")。规则包通过 rcas compile --all 生成,输出到 build/rules/ 目录。切勿在运行时评估 YAML,也不必将规则复制到代码中。

一次加载,每次请求评估

import com.rulescascade.*;

// 一个 bean / 单例,在启动时创建。此处异常必须阻止应用启动。
RuleSet rules = RuleSet.fromBundle((Map<String, Object>) Json.parse(Files.readString(Path.of("build/rules/<ruleset-id>.bundle.json"))));
List<String> missing = rules.missingOperators();   // 规则所需的自定义运算符
if (!missing.isEmpty()) throw new IllegalStateException("未注册的运算符:" + missing);

当服务使用 Jackson 解析 JSON 时,启用 DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS,以便金额能够精确到达引擎。

推荐使用 rules.enforce(request)(自 1.0.0-alpha.7 起):它返回允许的结果或抛出 com.rulescascade.RuleViolationException,其 problem() 方法返回 422 响应,在所有 Rule Cascade 运行时中保持一致。一个全局处理器即可处理所有端点的异常:

@RestControllerAdvice
class RuleErrors {
    @ExceptionHandler(RuleViolationException.class)
    ResponseEntity<Map<String, Object>> denied(RuleViolationException e) {
        return ResponseEntity.status(e.status()).contentType(MediaType.APPLICATION_PROBLEM_JSON).body(e.problem());
    }
}

要使用注解作用于控制器方法,请从 Spring Boot 示例(https://rulescascade.com/reference/examples/backend-spring-boot/)复制 @EnforceRules 和 RuleEnforcementAspect;它需要 spring-boot-starter-aspectj(Spring Boot 4 之前为 spring-boot-starter-aop)。每个状态变更的端点遵循以下四个步骤:

  1. 在服务器端评估: rules.evaluate(EvaluationRequest.builder(entity, operation).data(data).original(original).actor(...).build(), Channel.SERVER)。 actor 必须来自安全上下文,绝不能来自调用方控制的 Header。
  2. 拒绝时拒绝:当 !result.allowed() 时,抛出 RuleViolationException(result) 并统一映射,在 @RestControllerAdvice / 异常映射器中,映射为 422 ProblemDetail,其 type: urn:rule-cascade:rule-violation,并将结果(result.toMap())作为属性包含在内。
  3. 持久化,在应用 compute 效果后(effect.type() 为 value):存储服务器端值。
  4. 执行 result.commands(),在提交后(@TransactionalEventListener(phase = AFTER_COMMIT) 或 outbox 模式),每个 idempotencyKey 执行一次。

位置:Spring 中提供一个 @Configuration 类,其中包含 RuleSet 的 @Bean 和每个实体用于构建请求的服务;Quarkus/Micronaut 中提供一个 @Singleton 生产者。Kotlin 和 Scala 调用相同的 API。RuleSetHolder 可按照时间间隔或定时计划重新加载规则包,并保留最后有效的规则。

替换现有验证

rcas analyze --module <module> 会列出 Bean Validation 注解、Spring 验证器和 @PreAuthorize、Drools .drl 规则、手动编写的检查、命名限制(MAX_QUANTITY = 10)、数字比较以及基于状态的 switch 分支。带有 drift 的候选项表示前端中同一名称存在其他值:必须由一个规则集同时决定两者。如果愿意,可以保留 DTO 上的 @NotNull/@Size 类型检查;将业务决策迁移到规则中。添加一个一致性测试(JUnit @ParameterizedTest,对旧检查和引擎使用相同的输入),然后删除旧检查。

测试

断言 decision 和查找代码,而不是消息文本。规则集中的黄金测试(rcas check)对规则进行测试;CI 在 mvn verify / gradle test 之前运行 rcas check 和 rcas compile --all。

参考:https://rulescascade.com/usage/java/ 和 https://rulescascade.com/playbooks/backend-api/

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能