arch-domain-driven
DDD: bounded contexts, aggregates, entities, value objects, domain events, ubiquitous language
What this skill does
## Purpose
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.
## When to Use
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.
## Key Capabilities
- Generate bounded contexts with isolated modules for specific domains.
- Define aggregates as clusters of entities with a single root for transaction consistency.
- Create entities with identity and value objects for immutable data.
- Handle domain events to trigger reactions, like publishing to event buses.
- Enforce ubiquitous language by embedding domain terms into code and configurations.
## Usage Patterns
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.
## Common Commands/API
Interact via OpenClaw's CLI or REST API. Authentication requires setting `$OPENCLAW_API_KEY` in your environment.
CLI Commands:
- Generate a bounded context: `openclaw ddd generate-context --name MyContext --description "User management" --language python`
This creates a directory like `./my_context/` with subfolders for aggregates and entities.
- Define an aggregate: `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.
- Create an entity: `openclaw ddd generate-entity --context MyContext --name UserEntity --properties "id:UUID, name:String"`
- Handle domain events: `openclaw ddd generate-event --context MyContext --name UserCreatedEvent --payload "user_id:UUID"`
API Endpoints:
- POST /api/v1/ddd/contexts with JSON body: `{"name": "MyContext", "description": "User management", "language": "python"}`
Requires header: `Authorization: Bearer $OPENCLAW_API_KEY`
- POST /api/v1/ddd/aggregates with body: `{"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:
1. Generate and use a context in Python:
```python
import openclaw.ddd as oc
oc.generate_context(name="MyContext", description="User management")
context = oc.load_context("MyContext")
```
2. Define an aggregate in code:
```python
from openclaw.ddd import Aggregate
class AccountAggregate(Aggregate):
def __init__(self, account_id):
self.root = Entity(account_id) # Assuming Entity is generated
```
## Integration Notes
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.
## Error Handling
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:
```python
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`.
## Concrete Usage Examples
1. 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)`
2. 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.
## Graph Relationships
- Related to cluster: se-architecture (e.g., shares dependencies with other architecture skills).
- Connected via tags: ddd (links to domain modeling tools), domain (connects to entity management skills), bounded-context (relates to microservices patterns), architecture (ties into se-architecture cluster for broader design tools).
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.