ruflo-ddd 聚合根脚手架实战:用 ddd-aggregate 技能在 bounded context 中生成 Entity、Value Object、Repository 与领域事件
【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo
聚合根(Aggregate Root)是 Domain-Driven Design(DDD)中维护业务不变量的一致性边界。ruflo 仓库内置的ruflo-ddd插件提供了ddd-aggregate技能,一条命令即可在一个已存在的 bounded context 中生成聚合根实体、值对象、仓库接口、领域事件与单元测试桩,并把领域模型持久化到 AgentDB 图存储中供后续会话导航。读完本文,你将掌握/ddd-aggregate <context> <aggregate-name>的完整调用流程、每一层产物的结构与约束、配套的ddd-context/ddd-validate校验体系,以及如何用 smoke 脚本验证整个插件的契约完整性。
一、ddd-aggregate 技能是什么
ddd-aggregate是ruflo-ddd插件提供的三个技能之一(另两个是ddd-context与ddd-validate),定义在 plugins/ruflo-ddd/skills/ddd-aggregate/SKILL.md。它的定位是:
Scaffold a complete aggregate root inside a bounded context.
技能 frontmatter 中的argument-hint为"<context> <aggregate-name>",调用方需传入两个 kebab-case 参数:<context-name>(已存在的 bounded context 名)与<aggregate-name>(要新建的聚合根名)。例如向ordering上下文中添加order聚合:
/ddd-aggregate ordering order该技能会一次性生成"实体 + 仓库 + 事件 + 测试桩"四件套,并把聚合节点写入 AgentDB 分层图,这正是 ADR-0001 中定义的插件契约的一部分(见 plugins/ruflo-ddd/docs/adrs/0001-ddd-contract.md)。
触发时机
按 SKILL.md 的description定义,以下场景适合调用它:
- 向一个已有 bounded context添加新聚合;
- 建模一个拥有自身不变量(invariants)的新业务概念;
- 生成 entity + repo + events 三件套样板代码。
二、前置条件:bounded context 必须已存在
ddd-aggregate的第 1 步就是校验前置条件:确认src/<context>/domain/目录存在。如果不存在,技能会建议先运行/ddd-context <context>创建 bounded context——也就是说,ddd-aggregate假定你已经在src/下建立了上下文结构。
上下文的标准目录结构由 plugins/ruflo-ddd/skills/ddd-context/SKILL.md 定义:
src/<context-name>/ domain/ entities/ # Entities and aggregate root value-objects/ # Immutable value objects events/ # Domain events services/ # Domain services repositories/ # Repository interfaces application/ # Use cases / application services infrastructure/ # Repository implementations, ACL adapters index.ts # Public API of the contextddd-context技能还要求为entities、value-objects、events、services、repositories各生成一个index.tsbarrel 导出文件,并在domain/index.ts中汇总再导出,最后在src/<context-name>/index.ts中只 re-export domain 与 application,不导出 infrastructure——这是保护领域层不被基础设施污染的关键纪律。创建完成后,上下文会以context:<context-name>节点写入 AgentDB 分层图。
三、ddd-aggregate 完整执行流程(10 步拆解)
以下是 ddd-aggregate/SKILL.md 的完整步骤,结合仓库源码逐层展开。
第 1 步:校验上下文存在
确认src/<context>/domain/已存在,否则提示先运行/ddd-context <context>。
第 2 步:Pre-task hook
执行:
npx @claude-flow/cli@latest hooks pre-task --description "DDD aggregate: <aggregate-name> in <context>"该 hook 会记录任务开始,配合第 10 步的 post-task hook 形成闭环,供后续神经训练与任务追踪使用。
第 3 步:创建聚合根实体(Aggregate Root Entity)
文件路径:src/<context>/domain/entities/<aggregate-name>.entity.ts
必须包含四要素:
- 唯一 ID 字段(unique ID field);
- 构造函数内做不变量校验(constructor with invariant validation);
- 执行业务规则的领域方法(domain methods that enforce business rules);
- 基于身份(identity)的
equals()。
同时要求导出一个实现或继承基础AggregateRoot接口的 TypeScript 类。这意味着聚合根内部的状态变更必须经由其领域方法,而非外部直接 set——ddd-validate技能会专门扫描"绕过校验的公开 setter"来核查这一点(详见第四节)。
第 4 步:创建值对象(Value Objects)
文件路径:src/<context>/domain/value-objects/<aggregate-name>-id.value-object.ts
要求是不可变(immutable)的 ID 值对象,带工厂方法与校验。技能还会建议为聚合根的其他属性补充更多值对象。参照 plugins/ruflo-ddd/REFERENCE.md 中的定义,值对象是"没有身份、按值相等、无副作用"的描述性对象——例如金额、地址、订单号都适合建模为值对象。
第 5 步:创建仓库接口(Repository Interface)
文件路径:src/<context>/domain/repositories/<aggregate-name>.repository.ts
必须包含findById、save、delete三个方法,并以聚合根与 ID 值对象作为类型参数。这是纯接口,不提供实现——实现属于基础设施层(infrastructure)的关注点,会被放置在infrastructure/目录。这也是 DDD 的经典依赖倒置:领域层定义持久化契约,基础设施层负责兑现。
第 6 步:创建领域事件(Domain Events)
生成两个事件文件:
src/<context>/domain/events/<aggregate-name>-created.event.tssrc/<context>/domain/events/<aggregate-name>-updated.event.ts
每个事件需包含:事件名(过去时态,past tense)、时间戳、聚合 ID、payload。REFERENCE.md的命名约定进一步给出示例:OrderPlaced、InvoiceVoided、CustomerEmailChanged这类 PascalCase 过去时命名。领域事件是"已经发生的事情的记录",因此必须不可变,且ddd-validate会专门检查事件是否携带聚合 ID。
第 7 步:创建单元测试桩(Unit Test Stubs)
文件路径:src/<context>/domain/entities/<aggregate-name>.entity.test.ts
覆盖三类用例:
- 构造不变量(construction invariants);
- 领域方法行为(domain methods);
- 相等性(equality)。
测试命名采用describe/it+should [behavior] when [condition]的句式,例如should reject negative quantity when constructing Order。
第 8 步:更新 barrel 导出
将新文件加入对应目录的index.tsbarrel 文件中(entities、value-objects、repositories、events 各自的 index.ts),与ddd-context生成的 barrel 结构保持一致。
第 9 步:持久化到领域模型图
将聚合写入 AgentDB 分层图与任务记忆:
mcp__plugin_ruflo-core_ruflo__agentdb_hierarchical-store --parent "context:<context>" --child "aggregate:<aggregate-name>" --relation "contains" mcp__plugin_ruflo-core_ruflo__memory_store --key "ddd-aggregate-<context>-<aggregate-name>" --value "AGGREGATE_SUMMARY" --namespace tasks这样aggregate:<aggregate-name>节点就以contains关系挂在context:<context>节点之下。REFERENCE.md中给出了更完整的图存储配方——上下文依赖可以用因果边(causal edge)表达:
mcp__plugin_ruflo-core_ruflo__agentdb_hierarchical-store --parent "context:ordering" \ --child "aggregate:order" --relation "contains" mcp__plugin_ruflo-core_ruflo__agentdb_causal-edge --from "context:ordering" \ --to "context:inventory" --type "depends-on" mcp__plugin_ruflo-core_ruflo__agentdb_causal-edge --from "context:ordering" \ --to "context:payments" --type "publishes-events-to"REFERENCE.md建议项目级标准化的边类型包括:depends-on(同步耦合)、publishes-events-to(即发即忘的事件流)、translates-via-acl-to(防腐层翻译)、conforms-to(下游原样采用上游模型)。
第 10 步:Post-task hook
npx @claude-flow/cli@latest hooks post-task --task-id "ddd-aggregate-<aggregate-name>" --success true --train-neural true开启--train-neural true会把本次成功模式沉淀到神经学习中,使后续聚合建模继承既有模式。
四、配套校验:ddd-validate 如何守住聚合纪律
聚合根脚手架生成后,边界与不变量需要持续被审计。ddd-validate技能(plugins/ruflo-ddd/skills/ddd-validate/SKILL.md)提供四类检查,正好回扣ddd-aggregate产物的约束:
| 类别 | 检查内容 | 对应聚合产物约束 |
|---|---|---|
BOUNDARY | 扫描src/*/domain/下所有.ts的 import,发现直接深入其他上下文domain/目录的导入即标记违规;只允许通过对方公开index.ts(application 层)导入 | 聚合根不应被跨上下文直接 import |
INVARIANT | 扫描聚合根实体的公开 setter 是否绕过校验、可变公开属性是否无校验、子实体是否被直接暴露(必须经聚合根访问) | 聚合根是唯一变更入口 |
EVENT | 事件是否过去时命名、是否不可变(无公开 setter)、是否携带聚合 ID | 事件命名与不可变约束 |
REPOSITORY | 仓库接口必须在domain/repositories/(而非infrastructure/);实现必须在infrastructure/(而非domain/);每个聚合根恰有一个仓库 | 接口与实现分层、一对一阵列 |
ddd-validate还会输出违规表(文件路径、行号、违规类型、建议),按类别与严重度汇总,并将结果写入任务记忆:
npx @claude-flow/cli@latest memory store --key "ddd-validation-TIMESTAMP" --value "RESULTS_SUMMARY" --namespace tasks npx @claude-flow/cli@latest hooks post-task --task-id "ddd-validate" --success true --store-results true它可当作 CI gate 使用,在合并跨切变更前拦截边界侵蚀。
五、通过 /ddd 命令驱动技能
ddd-aggregate技能由/ddd命令(plugins/ruflo-ddd/commands/ddd.md)路由,命令共 6 个子命令:
| 子命令 | 行为 |
|---|---|
ddd context create <name> | 调用/ddd-context技能搭建 bounded context |
ddd context list | 扫描src/*/domain/列出全部上下文(find src -maxdepth 2 -name "domain" -type d) |
ddd aggregate <context> <name> | 调用/ddd-aggregate技能生成聚合根四件套 |
ddd event <context> <name> | 生成单个领域事件类(过去时命名 + 时间戳 + payload 接口 + 静态工厂方法),并注册到事件 index |
ddd validate | 调用/ddd-validate技能检查边界违规 |
ddd map | 扫描所有上下文、分析 import 依赖,输出上下文关系图(upstream/downstream、ACL、shared kernel、published language,以及直接 import 导致的边界违规) |
六、领域建模者 Agent 与命名规范
ruflo-ddd提供domain-modeleragent(plugins/ruflo-ddd/agents/domain-modeler.md,model 为 sonnet),其职责包括:识别子域与通用语言、设计带不变量的聚合根、定义领域事件与命令、生成防腐层接口。它的工作流与ddd-aggregate技能互补:先在内存中检索既有领域模型(memory search --query "bounded context DOMAIN"),再执行脚手架,最后沉淀模式(memory store --key "ddd-pattern-CONTEXT")。
命名规范以 REFERENCE.md 为准:
- 聚合根:PascalCase 单数名词(
Order、Customer、Invoice); - 领域事件:PascalCase 过去时(
OrderPlaced、InvoiceVoided); - 命令:PascalCase 祈使(
PlaceOrder、VoidInvoice); - 仓库接口:
<Aggregate>Repository(OrderRepository); - 领域服务:
<Verb><Noun>Service(PriceQuoteService)。
七、安装与契约验证
安装插件:
claude --plugin-dir plugins/ruflo-dddCLI 固定在@claude-flow/cliv3.6 major+minor(见 plugins/ruflo-ddd/README.md)。插件声明ddd-patternsAgentDB 命名空间(kebab-case,遵循 plugins/ruflo-agentdb/docs/adrs/0001-agentdb-optimization.md 的命名空间约定),并约定不得遮蔽保留命名空间(pattern、claude-memories、default)。
契约以 smoke 脚本为准(smoke-as-contract,见 plugins/ruflo-ddd/scripts/smoke.sh 与 ADR-0001):
bash plugins/ruflo-ddd/scripts/smoke.sh # 期望输出: "10 passed, 0 failed"10 项结构化检查包括:插件版本与关键词(acl、value-objects、repositories、mcp);3 个技能存在且 frontmatter 含name/description/allowed-tools;agent 与 command 文件齐全;/ddd覆盖 6 个子命令;REFERENCE.md非空;README 固定 v3.6 与命名空间协调;ADR-0001 状态为 Accepted;且技能中禁止通配符工具授权(allowed-tools: *)。
八、总结
ddd-aggregate技能把"新增一个聚合根"这一高频 DDD 建模操作标准化为一条可复现的命令流程:从实体(含不变量与equals())、不可变值对象、纯接口仓库、过去时领域事件到测试桩,每一步都有明确文件路径与约束;配合 AgentDB 图存储,领域模型成为可被后续会话与 pathfinder 导航的活图。再叠加ddd-context(上下文骨架)、ddd-validate(边界与不变量审计)、/ddd map(上下文关系可视化)与 smoke 契约测试,ruflo 在插件层面形成了一套完整的 DDD 脚手架闭环——这也是在 plugins/ruflo-ddd/README.md 中定义的核心价值:把业务领域转化为结构良好的 bounded context,并以可导航的图模型沉淀每一次建模决策。
【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考