--- name: "V3 DDD Architecture" description: "Domain-Driven Design architecture for claude-flow v3. Implements modular, bounded context architecture with clean separation of concerns and microkernel pattern." --- # V3 DDD Architecture ## What This Skill Does Designs and implements Domain-Driven Design (DDD) architecture for claude-flow v3, decomposing god objects into bounded contexts, implementing clean architecture patterns, and enabling modular, testable code structure. ## Quick Start ```bash # Initialize DDD architecture analysis Task("Architecture analysis", "Analyze current architecture and design DDD boundaries", "core-architect") # Domain modeling (parallel) Task("Domain decomposition", "Break down orchestrator god object into domains", "core-architect") Task("Context mapping", "Map bounded contexts and relationships", "core-architect") Task("Interface design", "Design clean domain interfaces", "core-architect") ``` ## DDD Implementation Strategy ### Current Architecture Analysis ``` ├── PROBLEMATIC: core/orchestrator.ts (1,440 lines - GOD OBJECT) │ ├── Task management responsibilities │ ├── Session management responsibilities │ ├── Health monitoring responsibilities │ ├── Lifecycle management responsibilities │ └── Event coordination responsibilities │ └── TARGET: Modular DDD Architecture ├── core/domains/ │ ├── task-management/ │ ├── session-management/ │ ├── health-monitoring/ │ ├── lifecycle-management/ │ └── event-coordination/ └── core/shared/ ├── interfaces/ ├── value-objects/ └── domain-events/ ``` ### Domain Boundaries #### 1. Task Management Domain ```typescript // core/domains/task-management/ interface TaskManagementDomain { // Entities Task: TaskEntity; TaskQueue: TaskQueueEntity; // Value Objects TaskId: TaskIdVO; TaskStatus: TaskStatusVO; Priority: PriorityVO; // Services TaskScheduler: TaskSchedulingService; TaskValidator: TaskValidationService; // Repository TaskRepository: ITaskRepository; } ``` #### 2. Session Management Domain ```typescript // core/domains/session-management/ interface SessionManagementDomain { // Entities Session: SessionEntity; SessionState: SessionStateEntity; // Value Objects SessionId: SessionIdVO; SessionStatus: SessionStatusVO; // Services SessionLifecycle: SessionLifecycleService; SessionPersistence: SessionPersistenceService; // Repository SessionRepository: ISessionRepository; } ``` #### 3. Health Monitoring Domain ```typescript // core/domains/health-monitoring/ interface HealthMonitoringDomain { // Entities HealthCheck: HealthCheckEntity; Metric: MetricEntity; // Value Objects HealthStatus: HealthStatusVO; Threshold: ThresholdVO; // Services HealthCollector: HealthCollectionService; AlertManager: AlertManagementService; // Repository MetricsRepository: IMetricsRepository; } ``` ## Microkernel Architecture Pattern ### Core Kernel ```typescript // core/kernel/claude-flow-kernel.ts export class ClaudeFlowKernel { private domains: Map = new Map(); private eventBus: DomainEventBus; private dependencyContainer: Container; async initialize(): Promise { // Load core domains await this.loadDomain('task-management', new TaskManagementDomain()); await this.loadDomain('session-management', new SessionManagementDomain()); await this.loadDomain('health-monitoring', new HealthMonitoringDomain()); // Wire up domain events this.setupDomainEventHandlers(); } async loadDomain(name: string, domain: Domain): Promise { await domain.initialize(this.dependencyContainer); this.domains.set(name, domain); } getDomain(name: string): T { const domain = this.domains.get(name); if (!domain) { throw new DomainNotLoadedError(name); } return domain as T; } } ``` ### Plugin Architecture ```typescript // core/plugins/ interface DomainPlugin { name: string; version: string; dependencies: string[]; initialize(kernel: ClaudeFlowKernel): Promise; shutdown(): Promise; } // Example: Swarm Coordination Plugin export class SwarmCoordinationPlugin implements DomainPlugin { name = 'swarm-coordination'; version = '3.0.0'; dependencies = ['task-management', 'session-management']; async initialize(kernel: ClaudeFlowKernel): Promise { const taskDomain = kernel.getDomain('task-management'); const sessionDomain = kernel.getDomain('session-management'); // Register swarm coordination services this.swarmCoordinator = new UnifiedSwarmCoordinator(taskDomain, sessionDomain); kernel.registerService('swarm-coordinator', this.swarmCoordinator); } } ``` ## Domain Events & Integration ### Event-Driven Communication ```typescript // core/shared/domain-events/ abstract class DomainEvent { public readonly eventId: string; public readonly aggregateId: string; public readonly occurredOn: Date; public readonly eventVersion: number; constructor(aggregateId: string) { this.eventId = crypto.randomUUID(); this.aggregateId = aggregateId; this.occurredOn = new Date(); this.eventVersion = 1; } } // Task domain events export class TaskAssignedEvent extends DomainEvent { constructor( taskId: string, public readonly agentId: string, public readonly priority: Priority ) { super(taskId); } } export class TaskCompletedEvent extends DomainEvent { constructor( taskId: string, public readonly result: TaskResult, public readonly duration: number ) { super(taskId); } } // Event handlers @EventHandler(TaskCompletedEvent) export class TaskCompletedHandler { constructor( private metricsRepository: IMetricsRepository, private sessionService: SessionLifecycleService ) {} async handle(event: TaskCompletedEvent): Promise { // Update metrics await this.metricsRepository.recordTaskCompletion( event.aggregateId, event.duration ); // Update session state await this.sessionService.markTaskCompleted( event.aggregateId, event.result ); } } ``` ## Clean Architecture Layers ```typescript // Architecture layers ┌─────────────────────────────────────────┐ │ Presentation │ ← CLI, API, UI ├─────────────────────────────────────────┤ │ Application │ ← Use Cases, Commands ├─────────────────────────────────────────┤ │ Domain │ ← Entities, Services, Events ├─────────────────────────────────────────┤ │ Infrastructure │ ← DB, MCP, External APIs └─────────────────────────────────────────┘ // Dependency direction: Outside → Inside // Domain layer has NO external dependencies ``` ### Application Layer (Use Cases) ```typescript // core/application/use-cases/ export class AssignTaskUseCase { constructor( private taskRepository: ITaskRepository, private agentRepository: IAgentRepository, private eventBus: DomainEventBus ) {} async execute(command: AssignTaskCommand): Promise { // 1. Validate command await this.validateCommand(command); // 2. Load aggregates const task = await this.taskRepository.findById(command.taskId); const agent = await this.agentRepository.findById(command.agentId); // 3. Business logic (in domain) task.assignTo(agent); // 4. Persist changes await this.taskRepository.save(task); // 5. Publish domain events task.getUncommittedEvents().forEach(event => this.eventBus.publish(event) ); // 6. Return result return TaskResult.success(task); } } ``` ## Module Configuration ### Bounded Context Modules ```typescript // core/domains/task-management/module.ts export const taskManagementModule = { name: 'task-management', entities: [ TaskEntity, TaskQueueEntity ], valueObjects: [ TaskIdVO, TaskStatusVO, PriorityVO ], services: [ TaskSchedulingService, TaskValidationService ], repositories: [ { provide: ITaskRepository, useClass: SqliteTaskRepository } ], eventHandlers: [ TaskAssignedHandler, TaskCompletedHandler ] }; ``` ## Migration Strategy ### Phase 1: Extract Domain Services ```typescript // Extract services from orchestrator.ts const extractionPlan = { week1: [ 'TaskManager → task-management domain', 'SessionManager → session-management domain' ], week2: [ 'HealthMonitor → health-monitoring domain', 'LifecycleManager → lifecycle-management domain' ], week3: [ 'EventCoordinator → event-coordination domain', 'Wire up domain events' ] }; ``` ### Phase 2: Implement Clean Interfaces ```typescript // Clean separation with dependency injection export class TaskController { constructor( @Inject('AssignTaskUseCase') private assignTask: AssignTaskUseCase, @Inject('CompleteTaskUseCase') private completeTask: CompleteTaskUseCase ) {} async assign(request: AssignTaskRequest): Promise { const command = AssignTaskCommand.fromRequest(request); const result = await this.assignTask.execute(command); return TaskResponse.fromResult(result); } } ``` ### Phase 3: Plugin System ```typescript // Enable plugin-based extensions const pluginSystem = { core: ['task-management', 'session-management', 'health-monitoring'], optional: ['swarm-coordination', 'learning-integration', 'performance-monitoring'] }; ``` ## Testing Strategy ### Domain Testing (London School TDD) ```typescript // Pure domain logic testing describe('Task Entity', () => { let task: TaskEntity; let mockAgent: jest.Mocked; beforeEach(() => { task = new TaskEntity(TaskId.create(), 'Test task'); mockAgent = createMock(); }); it('should assign to agent when valid', () => { mockAgent.canAcceptTask.mockReturnValue(true); task.assignTo(mockAgent); expect(task.assignedAgent).toBe(mockAgent); expect(task.status.value).toBe('assigned'); }); it('should emit TaskAssignedEvent when assigned', () => { mockAgent.canAcceptTask.mockReturnValue(true); task.assignTo(mockAgent); const events = task.getUncommittedEvents(); expect(events).toHaveLength(1); expect(events[0]).toBeInstanceOf(TaskAssignedEvent); }); }); ``` ## Success Metrics - [ ] **God Object Elimination**: orchestrator.ts (1,440 lines) → 5 focused domains (<300 lines each) - [ ] **Bounded Context Isolation**: 100% domain independence - [ ] **Plugin Architecture**: Core + optional modules loading - [ ] **Clean Architecture**: Dependency inversion maintained - [ ] **Event-Driven Communication**: Loose coupling between domains - [ ] **Test Coverage**: >90% domain logic coverage ## Related V3 Skills - `v3-core-implementation` - Implementation of DDD domains - `v3-memory-unification` - AgentDB integration within bounded contexts - `v3-swarm-coordination` - Swarm coordination as domain plugin - `v3-performance-optimization` - Performance optimization across domains ## Usage Examples ### Complete Domain Extraction ```bash # Full DDD architecture implementation Task("DDD architecture implementation", "Extract orchestrator into DDD domains with clean architecture", "core-architect") ``` ### Plugin Development ```bash # Create domain plugin npm run create:plugin -- --name swarm-coordination --template domain ```