From acc
Analyzes bounded context boundaries in PHP DDD projects. Detects cross-context coupling, shared kernel violations, context mapping issues, ubiquitous language inconsistencies. Generates context map diagrams and boundary recommendations.
How this skill is triggered — by the user, by Claude, or both
Slash command
/acc:check-bounded-contextsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill analyzes PHP DDD projects for bounded context boundary issues, cross-context coupling, and context mapping violations.
This skill analyzes PHP DDD projects for bounded context boundary issues, cross-context coupling, and context mapping violations.
| Concept | Definition | Violation Indicator |
|---|---|---|
| Bounded Context | Explicit boundary with its own domain model | Missing namespace separation |
| Ubiquitous Language | Consistent terminology within context | Same term, different meanings |
| Context Map | Relationships between contexts | Unclear dependencies |
| Anti-Corruption Layer | Translation between contexts | Direct foreign model usage |
| Shared Kernel | Deliberately shared code | Unintentional sharing |
| Published Language | Public API contracts | Breaking changes |
# Identify bounded contexts from directory structure
Glob: **/src/**/Domain/*
Glob: **/src/**/Context/*
Glob: **/src/**/Bounded/*
Glob: **/src/**/Module/*
# Namespace-based contexts
Grep: "namespace.*\\\\Domain\\\\|namespace.*\\\\Context\\\\" --glob "**/*.php"
# Composer autoload namespaces
Read: composer.json (check autoload paths for context namespaces)
Context Indicators:
src/ (e.g., Order, User, Payment)Domain/ subfolder per contextBoundedContext/ or Context/ folder structure# Find cross-context imports (most critical)
# Pattern: Context A importing from Context B's Domain layer
# Order context importing User domain
Grep: "use Order\\\\.*\\\\Domain" --glob "**/User/**/*.php"
Grep: "use User\\\\.*\\\\Domain" --glob "**/Order/**/*.php"
# General pattern: Domain layer importing another Domain
Grep: "use [A-Z][a-z]+\\\\Domain\\\\" --glob "**/Domain/**/*.php"
# Direct entity references across contexts
Grep: "use.*\\\\Entity\\\\(?!.*\\\\self)" --glob "**/Domain/**/*.php"
# Aggregates referencing foreign entities directly
Grep: "private.*[A-Z][a-z]+Entity\|private readonly [A-Z][a-z]+" --glob "**/Aggregate/**/*.php"
# Should use ID references only
# Good: private UserId $userId
# Bad: private User $user (from another context)
# Detect direct object references vs ID references
Grep: "\\$user[^I]|\\$order[^I]|\\$customer[^I]" --glob "**/Domain/**/*.php"
# Repository from one context used in another
Grep: "UserRepositoryInterface" --glob "**/Order/**/*.php"
Grep: "OrderRepositoryInterface" --glob "**/User/**/*.php"
# Generic repository pattern violations
Grep: "RepositoryInterface" --glob "**/*.php"
# Check if implementations span contexts
# Identify potential shared kernel (common code between contexts)
Glob: **/Shared/**/*.php
Glob: **/Common/**/*.php
Glob: **/Core/**/*.php
Glob: **/SharedKernel/**/*.php
# Find duplicated Value Objects across contexts
# Same class name in multiple contexts
Glob: **/Domain/**/Email.php
Glob: **/Domain/**/Money.php
Glob: **/Domain/**/Address.php
# Shared events
Grep: "class.*Event.*implements|extends.*Event" --glob "**/Shared/**/*.php"
Shared Kernel Rules:
# Event publishers (upstream)
Grep: "EventDispatcher|MessageBus|publish\(" --glob "**/Domain/**/*.php"
Grep: "class.*Event\s*\{|final readonly class.*Event" --glob "**/Domain/**/*.php"
# Event subscribers (downstream)
Grep: "EventSubscriber|MessageHandler|Listener" --glob "**/*.php"
Grep: "function __invoke\(.*Event" --glob "**/*.php"
# Check which context publishes and which subscribes
# API clients (customer role)
Grep: "ApiClient|HttpClient|RestClient" --glob "**/Infrastructure/**/*.php"
# API providers (supplier role)
Grep: "Controller|Action|Endpoint" --glob "**/Presentation/**/*.php"
# ACL presence
Glob: **/AntiCorruption/**/*.php
Glob: **/ACL/**/*.php
Glob: **/Adapter/**/*.php
Glob: **/Translator/**/*.php
# Missing ACL (direct external model usage)
Grep: "use External\\\\|use ThirdParty\\\\|use Legacy\\\\" --glob "**/Domain/**/*.php"
# Find same term with different meanings
# Example: "Account" in User context vs Payment context
# Find class with same name in different contexts
Glob: **/User/**/Account.php
Glob: **/Payment/**/Account.php
Glob: **/Billing/**/Account.php
# Find similar entity names
Glob: **/Domain/**/User.php
Glob: **/Domain/**/Customer.php
Glob: **/Domain/**/Client.php
# Inconsistent naming
Grep: "class Order|class Purchase|class Sale" --glob "**/Domain/**/*.php"
# Bounded Context Analysis Report
## Context Map
```mermaid
graph TB
subgraph "Order Context"
O_Domain[Domain]
O_App[Application]
end
subgraph "User Context"
U_Domain[Domain]
U_App[Application]
end
subgraph "Payment Context"
P_Domain[Domain]
P_App[Application]
end
subgraph "Shared Kernel"
SK[Money, Currency]
end
O_Domain -->|"uses ID only"| U_Domain
O_Domain -->|"publishes events"| P_Domain
O_Domain --> SK
U_Domain --> SK
P_Domain --> SK
| Context | Location | Entities | Events | Dependencies |
|---|---|---|---|---|
| Order | src/Order/ | 5 | 8 | User (ID), Payment (event) |
| User | src/User/ | 3 | 4 | None |
| Payment | src/Payment/ | 4 | 6 | Order (event) |
| Shared | src/Shared/ | 0 | 0 | All contexts |
src/Order/Domain/Entity/Order.php:15private User $user (from User context)private UserId $userIdcreate-value-object (for UserId), create-anti-corruption-layersrc/Payment/Infrastructure/Gateway/StripeGateway.phpuse Stripe\PaymentIntent;create-anti-corruption-layersrc/Order/Domain/ValueObject/Address.phpsrc/User/Domain/ValueObject/Address.phpcreate-value-objectsrc/User/ uses Account for user profilesrc/Payment/ uses Account for financial accountUserProfile and PaymentAccount| From \ To | Order | User | Payment | Shared |
|---|---|---|---|---|
| Order | - | ID ref | Events | Uses |
| User | - | - | - | Uses |
| Payment | Queries | Queries | - | Uses |
| Shared | - | - | - | - |
Legend:
## Context Integration Patterns
### Recommended Patterns
| Pattern | When to Use | Skills |
|---------|-------------|--------|
| ID Reference | Entity association across contexts | `create-value-object` |
| Domain Events | Async communication | `create-domain-event` |
| ACL | External systems, legacy | `create-anti-corruption-layer` |
| Shared Kernel | Common VOs (Money, etc.) | `create-value-object` |
| Published Language | Public contracts | Documentation |
### Anti-patterns
| Anti-pattern | Issue | Remediation |
|--------------|-------|-------------|
| Direct Entity Reference | Tight coupling | Use ID + resolve via query |
| Shared Entities | Ownership unclear | Split or explicit ownership |
| Cross-Context Repository | Boundary violation | Use events or ACL |
| Synchronous Cross-Context Calls | Temporal coupling | Use async events |
## Quick Analysis Commands
```bash
# Detect bounded contexts
echo "=== Bounded Contexts ===" && \
find src -maxdepth 2 -type d -name "Domain" && \
echo "=== Cross-Context Imports ===" && \
for ctx in $(find src -maxdepth 1 -type d | tail -n +2); do \
name=$(basename $ctx); \
grep -rn "use .*\\\\Domain\\\\" --include="*.php" "$ctx" | grep -v "use $name"; \
done && \
echo "=== Shared Kernel ===" && \
find src -type d -name "Shared" -o -name "Common" -o -name "Core"
Works with:
ddd-auditor — Domain model qualitystructural-auditor — Layer violationsddd-generator — Generate missing componentsnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accAudits PHP code for DDD Bounded Context communication patterns. Checks Context Map relationships (Shared Kernel, ACL, Open Host), event vs direct calls, and anti-corruption layer usage.
Models software around business domains using bounded contexts, aggregates, and ubiquitous language. Guides splitting monoliths into services and aligning code with business processes.
Maps relationships between bounded contexts using DDD patterns (ACL, OHS, PL, shared kernel). Generates Context Mapper DSL (CML), Mermaid/PlantUML diagrams after event storming.