Community编程与开发github.com

YarlisAISolutions/rules-cascade-go

在 Go 服务与工具(net/http、chi、gin、echo、gRPC、workers)中强制实施 Rule Cascade 规则。适用于将规则集成到 Go 代码路径中,用引擎替换 validate 标签或手写检查,或将规则发现映射为 HTTP 或 gRPC 错误。

rules-cascade-go 是什么?

该技能将 Rule Cascade 规则引擎集成到 Go 应用程序中,提供从启动加载到运行时评估的完整流程。它支持主流 Go Web 框架(net/http、chi、gin、echo)以及 gRPC 和 worker 场景,通过统一规则集替代传统手写验证代码,消除跨语言规则漂移。核心工作流包括:启动时从编译好的 bundle JSON 加载规则;在请求处理器中调用 `rules.Enforce` 或使用专门的中间件 `rulehttp.Enforce` 进行评估;拒绝时返回标准化的 422 错误详情(含问题 JSON);通过 `compute` 效果持久化服务器值;处理冲突解决和幂等性。此外,该技能提供 `rcas analyze` 命令自动扫描现有代码中的验证标签、比较逻辑和常量,帮助将业务决策迁移到规则引擎,并建议使用表驱动测试来验证规则决策的正确性。

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

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

在你喜欢的 AI 中提问

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

文档

Go 中的 Rule Cascade

模块:go get rulescascade.com/go(Go 1.26+,除标准库和 gopkg.in/yaml.v3 外无额外依赖)。规则包通过 rcas compile --all 生成到 build/rules/ 目录中。绝不要在生产运行时解析 YAML,也不要把规则复制到代码中。

启动时加载,每次请求评估

import rulecascade "rulescascade.com/go"

// 在启动时执行。任何错误都阻止启动。
data, err := os.ReadFile("build/rules/<ruleset-id>.bundle.json")
doc, err := rulecascade.ParseJSON(data)
ruleSet, err := rulecascade.FromBundle(doc)

推荐使用中间件(自 1.0.0-alpha.7 起):rulescascade.com/go/rulehttp 从 JSON 请求体(保持可读)构建请求、强制执行,并以一致的 422 问题详情响应被拒绝的请求,该格式在所有 Rule Cascade 运行时中保持一致。

mux.Handle("POST /orders", rulehttp.Enforce(rules, rulehttp.Options{Entity: "Order", Operation: "create",
    Actor: func(r *http.Request) map[string]any { return actorFromToken(r) }})(createOrder))
// 在 handler 中:rulehttp.FromContext(r.Context()) 是允许的结果

在其他场景中,rules.Enforce(request, "server", nil) 返回一个 *rulecascade.RuleViolation 错误(Problem() 是响应体),rulehttp.WriteError(w, err) 将其写入响应。底层实现中,rules.Evaluate(request, "server", nil) 返回 *rulecascade.Result(包含 Decision、Findings、Effects、Commands;result.Allowed() 判断是否允许)。*RuleSet 可安全并发使用。每个状态变更处理程序遵循以下四个步骤:

  1. 在服务端评估,使用 map[string]any{"entity", "operation", "data", "original", "actor", "resolutions"}。actor 来自认证中间件,绝不能来自调用方控制的请求头。使用 rulecascade.ParseJSON(或 json.Decoder.UseNumber())解码请求体,确保数字精确无误。
  2. 拒绝时返回 422 application/problem+json(type: urn:rule-cascade:rule-violation),携带评估结果;对于 gRPC,返回 codes.FailedPrecondition,并将 findings 放在详情中。
  3. 持久化:在应用 compute 效果(Type == "value")后,存储服务端的值。
  4. 执行 result.Commands:在提交之后执行,每个 IdempotencyKey 执行一次(通过 outbox 表或具有去重能力的消息代理)。

布局建议:每个实体一个函数,用于构建请求并执行评估,该函数在所有 handler(net/http、chi、gin、echo 均可)中被调用。rulecascade.NewHolder 按时间间隔或 cron 计划重新加载规则包,并保留最后一次有效的规则集。

替换现有验证逻辑

rcas analyze --module <module> 会扫描代码中的 validate: 和 binding: 结构体标签、ozzo-validation、规则引擎、手写的 errors.New 检查、命名限制(如 const MaxQuantity = 10)、数值比较以及 switch 分支。如果某个候选规则出现 drift,意味着项目中另一种语言(通常是前端)以不同的值定义了相同的名称:必须由一个规则集来为两者共同决定。保持解码中的形状检查;将业务决策移至规则。对旧检查和新引擎在相同输入上添加表驱动的一致性测试,然后删除旧检查。

测试

对 Decision 和 finding 的 Code(而非消息文本)编写表驱动测试。规则集的金丝雀测试(rcas check)测试规则本身;CI 在 go test 之前运行 rcas check 和 rcas compile --all。

参考:https://rulescascade.com/usage/go/

Individual skills in this repo

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

相关技能