About ddd-validate
ddd-validate is a development skill for checking domain-driven design boundaries and conventions in TypeScript projects. It reports violations across bounded contexts, aggregates, events, and repositories, then stores the results.
Key features
- 01Finds bounded contexts
- 02Checks cross-context imports
- 03Reviews aggregate invariants
- 04Validates event conventions
- 05Checks repository placement
- 06Reports and stores findings
Use cases
- 01Audit imports between domain contexts
- 02Find aggregate setters that bypass validation
- 03Review domain event naming and immutability
- 04Check repository interfaces and implementations
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ ruvnet/ ruflo --skill ddd-validateAfter installing, type/ddd-validatein Claude Code to confirm it loaded.
Details
From the project READMEValidate domain boundary integrity across all bounded contexts.
Steps
-
Discover contexts: Scan
src/*/domain/to find all bounded contexts. -
Check cross-boundary violations:
- For each context, scan all
.tsfiles for import statements - Flag any import that reaches into another context's
domain/directory directly - Allowed: importing from another context's public
index.ts(application layer) - Violation: importing from
src/<other-context>/domain/entities/...directly
# Find cross-boundary imports for ctx in $(find src -maxdepth 2 -name "domain" -type d | sed 's|src/||;s|/domain||'); do grep -rn "from ['\"].*src/" "src/$ctx/" --include="*.ts" | grep -v "src/$ctx/" || true done - For each context, scan all
-
Check aggregate invariant enforcement:
- Scan aggregate root entities for public setters that bypass validation
- Flag mutable public properties without invariant checks
- Verify that child entities are not directly accessible (must go through aggregate root)
-
Check event naming conventions:
- Domain events should be past-tense named (e.g.,
OrderCreated, notCreateOrder) - Events should be immutable (no public setters)
- Events should carry the aggregate ID
- Domain events should be past-tense named (e.g.,
-
Check repository patterns:
- Repository interfaces should exist in
domain/repositories/, notinfrastructure/ - Repository implementations should exist in
infrastructure/, notdomain/ - Each aggregate root should have exactly one repository
- Repository interfaces should exist in
-
Report findings:
- Output a table of violations with file path, line number, violation type, and suggestion
- Categorize as:
BOUNDARY,INVARIANT,EVENT,REPOSITORY - Exit with summary: total violations, by category, severity
-
Store results:
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
Comments
Markdown supported