skills/se-architecture/arch-domain-driven/SKILL.md
DDD: bounded contexts, aggregates, entities, value objects, domain events, ubiquitous language
npx skillsauth add alphaonedev/openclaw-graph arch-domain-drivenInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill implements Domain-Driven Design (DDD) principles to structure code effectively. It helps generate and manage bounded contexts, aggregates, entities, value objects, and domain events, while promoting ubiquitous language for better team alignment.
Use this skill for complex applications with rich domain logic, such as e-commerce platforms or financial systems, where clear boundaries reduce coupling. Apply it during architecture design phases to avoid monolithic codebases, especially when dealing with multiple subdomains or legacy integrations.
Always begin by mapping the domain to identify bounded contexts. Use the skill to scaffold structures, then refine aggregates within contexts. For example, integrate with CI/CD by running generation commands in build scripts. Test incrementally: generate an entity, add it to an aggregate, and verify invariants. Avoid over-modeling by limiting contexts to high-cohesion areas, and use events for cross-context communication.
Interact via OpenClaw's CLI or REST API. Authentication requires setting $OPENCLAW_API_KEY in your environment.
CLI Commands:
openclaw ddd generate-context --name MyContext --description "User management" --language python
This creates a directory like ./my_context/ with subfolders for aggregates and entities.openclaw ddd generate-aggregate --context MyContext --name AccountAggregate --root EntityName --invariants "balance > 0"
Adds files like account_aggregate.py with the root entity and invariant checks.openclaw ddd generate-entity --context MyContext --name UserEntity --properties "id:UUID, name:String"openclaw ddd generate-event --context MyContext --name UserCreatedEvent --payload "user_id:UUID"API Endpoints:
{"name": "MyContext", "description": "User management", "language": "python"}
Requires header: Authorization: Bearer $OPENCLAW_API_KEY{"context": "MyContext", "name": "AccountAggregate", "root": "Account", "invariants": ["balance > 0"]}Config Formats:
Use YAML for configurations, e.g., in a .openclaw/config.yml file:
ddd:
default_language: python
contexts:
- name: MyContext
description: User management
Code Snippets:
import openclaw.ddd as oc
oc.generate_context(name="MyContext", description="User management")
context = oc.load_context("MyContext")
from openclaw.ddd import Aggregate
class AccountAggregate(Aggregate):
def __init__(self, account_id):
self.root = Entity(account_id) # Assuming Entity is generated
Integrate by exporting $OPENCLAW_API_KEY=your_api_key before CLI/API calls. Add OpenClaw as a dependency in your project (e.g., pip install openclaw for Python). For IDEs, use plugins like VS Code extensions to trigger commands via keyboard shortcuts, such as binding openclaw ddd generate-context to a key. Chain with other tools: pipe CLI output to Git for auto-commits, or use webhooks to call API endpoints from services like Jenkins. Ensure compatibility by specifying language flags (e.g., --language java) to match your stack.
Always check CLI exit codes; non-zero indicates failure (e.g., if [ $? -ne 0 ]; then echo "Error: Invalid input"; fi). For API calls, handle HTTP errors like 400 for validation failures or 401 for auth issues by checking response status. In code, wrap operations in try-except blocks:
try:
oc.generate_aggregate(context="MyContext", name="InvalidAggregate", invariants=["invalid"])
except oc.DDDValidationError as e: # Specific error for invariant checks
print(f"Error: {e.message} - Fix invariants and retry")
except oc.AuthError as e: # For $OPENCLAW_API_KEY issues
print("Error: Authentication failed - Set $OPENCLAW_API_KEY")
Validate inputs upfront, e.g., ensure context names are alphanumeric via CLI flags like --validate.
Building a bounded context for an e-commerce order system:
First, identify the domain: orders involve aggregates like Order and LineItems. Run: openclaw ddd generate-context --name OrderContext --description "Manages orders" --modules orders,items
This outputs: ./order_context/orders.py and ./order_context/items.py. Next, add an aggregate: openclaw ddd generate-aggregate --context OrderContext --name OrderAggregate --root Order --invariants "total > 0"
In code, import and use: from order_context.aggregates import OrderAggregate; order = OrderAggregate(order_id=1)
Handling domain events in a user registration flow:
Start by generating the event: openclaw ddd generate-event --context UserContext --name UserRegisteredEvent --payload "user_id:UUID, email:String"
This creates ./user_context/events/user_registered_event.py. Then, trigger it via API: curl -H "Authorization: Bearer $OPENCLAW_API_KEY" -X POST /api/v1/ddd/events -d '{"context": "UserContext", "event": "UserRegisteredEvent", "payload": {"user_id": "123"}}'
In your application code: oc.publish_event(context="UserContext", event="UserRegisteredEvent", payload={"user_id": "123"}) to notify other services.
tools
Root web development: project structure, tooling selection, deployment decisions
development
WebAssembly: Rust/Go/C to WASM, wasm-bindgen, Emscripten, WASM Component Model
development
Vue 3: Composition API script setup, Pinia, Vue Router 4, SFCs, Vite, Nuxt 3
tools
Tailwind CSS 4: utility classes, config, JIT, arbitrary values, darkMode, plugins, shadcn/ui