V3 Core Implementation

ruvnet/ruflo/v3/@claude-flow/cli/.claude/skills/v3-core-implementation

作者 ruvnet58e0ae7e14e68aab45a4127d6f42f567bbcfb328無授權條款74K 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫今天更新

Core module implementation for claude-flow v3. Implements DDD domains, clean architecture patterns, dependency injection, and modular TypeScript codebase with comprehensive testing.

AI 產生的概覽

使用 DDD、整潔架構與依賴注入實作 claude-flow v3 的核心 TypeScript 模組。

功能
此技能指導實作 claude-flow v3 的核心 TypeScript 模組,遵循領域驅動設計、整潔架構與依賴注入模式。它定義了任務管理、工作階段管理與健康監控等限界上下文,以及實體、值物件與聚合根的基底類別。它也涵蓋倉儲介面與 SQLite 實作、應用案例、以 Inversify 為基礎的依賴容器、嚴格的 TypeScript 設定,以及單元測試與整合測試。
適用情境
適用於建置或擴充 claude-flow v3 核心程式碼庫時,尤其是在新增 DDD 領域、實體、值物件、倉儲或使用案例時。也適合為核心模組設定依賴注入、嚴格 TypeScript 設定或測試涵蓋率時使用。
執行需求
需要一個 TypeScript/Node.js 專案,依賴 Inversify 等依賴注入函式庫與 SQLite 資料庫驅動程式,並需要測試執行器來執行所述的單元測試與整合測試。此技能不附帶指令碼,僅提供說明與程式碼範例。

V3 Core Implementation

What This Skill Does

Implements the core TypeScript modules for claude-flow v3 following Domain-Driven Design principles, clean architecture patterns, and modern TypeScript best practices with comprehensive test coverage.

Quick Start

bash
# Initialize core implementationTask("Core foundation", "Set up DDD domain structure and base classes", "core-implementer")
# Domain implementation (parallel)Task("Task domain", "Implement task management domain with entities and services", "core-implementer")Task("Session domain", "Implement session management domain", "core-implementer")Task("Health domain", "Implement health monitoring domain", "core-implementer")

Core Implementation Architecture

Domain Structure

src/├── core/│   ├── kernel/                     # Microkernel pattern│   │   ├── claude-flow-kernel.ts│   │   ├── domain-registry.ts│   │   └── plugin-loader.ts│   ││   ├── domains/                    # DDD Bounded Contexts│   │   ├── task-management/│   │   │   ├── entities/│   │   │   ├── value-objects/│   │   │   ├── services/│   │   │   ├── repositories/│   │   │   └── events/│   │   ││   │   ├── session-management/│   │   ├── health-monitoring/│   │   ├── lifecycle-management/│   │   └── event-coordination/│   ││   ├── shared/                     # Shared kernel│   │   ├── domain/│   │   │   ├── entity.ts│   │   │   ├── value-object.ts│   │   │   ├── domain-event.ts│   │   │   └── aggregate-root.ts│   │   ││   │   ├── infrastructure/│   │   │   ├── event-bus.ts│   │   │   ├── dependency-container.ts│   │   │   └── logger.ts│   │   ││   │   └── types/│   │       ├── common.ts│   │       ├── errors.ts│   │       └── interfaces.ts│   ││   └── application/                # Application services│       ├── use-cases/│       ├── commands/│       ├── queries/│       └── handlers/

Base Domain Classes

Entity Base Class

typescript
// src/core/shared/domain/entity.tsexport abstract class Entity<T> {  protected readonly _id: T;  private _domainEvents: DomainEvent[] = [];
  constructor(id: T) {    this._id = id;  }
  get id(): T {    return this._id;  }
  public equals(object?: Entity<T>): boolean {    if (object == null || object == undefined) {      return false;    }
    if (this === object) {      return true;    }
    if (!(object instanceof Entity)) {      return false;    }
    return this._id === object._id;  }
  protected addDomainEvent(domainEvent: DomainEvent): void {    this._domainEvents.push(domainEvent);  }
  public getUncommittedEvents(): DomainEvent[] {    return this._domainEvents;  }
  public markEventsAsCommitted(): void {    this._domainEvents = [];  }}

Value Object Base Class

typescript
// src/core/shared/domain/value-object.tsexport abstract class ValueObject<T> {  protected readonly props: T;
  constructor(props: T) {    this.props = Object.freeze(props);  }
  public equals(object?: ValueObject<T>): boolean {    if (object == null || object == undefined) {      return false;    }
    if (this === object) {      return true;    }
    return JSON.stringify(this.props) === JSON.stringify(object.props);  }
  get value(): T {    return this.props;  }}

Aggregate Root

typescript
// src/core/shared/domain/aggregate-root.tsexport abstract class AggregateRoot<T> extends Entity<T> {  private _version: number = 0;
  get version(): number {    return this._version;  }
  protected incrementVersion(): void {    this._version++;  }
  public applyEvent(event: DomainEvent): void {    this.addDomainEvent(event);    this.incrementVersion();  }}

Task Management Domain Implementation

Task Entity

typescript
// src/core/domains/task-management/entities/task.entity.tsimport { AggregateRoot } from '../../../shared/domain/aggregate-root';import { TaskId } from '../value-objects/task-id.vo';import { TaskStatus } from '../value-objects/task-status.vo';import { Priority } from '../value-objects/priority.vo';import { TaskAssignedEvent } from '../events/task-assigned.event';
interface TaskProps {  id: TaskId;  description: string;  priority: Priority;  status: TaskStatus;  assignedAgentId?: string;  createdAt: Date;  updatedAt: Date;}
export class Task extends AggregateRoot<TaskId> {  private props: TaskProps;
  private constructor(props: TaskProps) {    super(props.id);    this.props = props;  }
  static create(description: string, priority: Priority): Task {    const task = new Task({      id: TaskId.create(),      description,      priority,      status: TaskStatus.pending(),      createdAt: new Date(),      updatedAt: new Date()    });
    return task;  }
  static reconstitute(props: TaskProps): Task {    return new Task(props);  }
  public assignTo(agentId: string): void {    if (this.props.status.equals(TaskStatus.completed())) {      throw new Error('Cannot assign completed task');    }
    this.props.assignedAgentId = agentId;    this.props.status = TaskStatus.assigned();    this.props.updatedAt = new Date();
    this.applyEvent(new TaskAssignedEvent(      this.id.value,      agentId,      this.props.priority    ));  }
  public complete(result: TaskResult): void {    if (!this.props.assignedAgentId) {      throw new Error('Cannot complete unassigned task');    }
    this.props.status = TaskStatus.completed();    this.props.updatedAt = new Date();
    this.applyEvent(new TaskCompletedEvent(      this.id.value,      result,      this.calculateDuration()    ));  }
  // Getters  get description(): string { return this.props.description; }  get priority(): Priority { return this.props.priority; }  get status(): TaskStatus { return this.props.status; }  get assignedAgentId(): string | undefined { return this.props.assignedAgentId; }  get createdAt(): Date { return this.props.createdAt; }  get updatedAt(): Date { return this.props.updatedAt; }
  private calculateDuration(): number {    return this.props.updatedAt.getTime() - this.props.createdAt.getTime();  }}

Task Value Objects

typescript
// src/core/domains/task-management/value-objects/task-id.vo.tsexport class TaskId extends ValueObject<string> {  private constructor(value: string) {    super({ value });  }
  static create(): TaskId {    return new TaskId(crypto.randomUUID());  }
  static fromString(id: string): TaskId {    if (!id || id.length === 0) {      throw new Error('TaskId cannot be empty');    }    return new TaskId(id);  }
  get value(): string {    return this.props.value;  }}
// src/core/domains/task-management/value-objects/task-status.vo.tstype TaskStatusType = 'pending' | 'assigned' | 'in_progress' | 'completed' | 'failed';
export class TaskStatus extends ValueObject<TaskStatusType> {  private constructor(status: TaskStatusType) {    super({ value: status });  }
  static pending(): TaskStatus { return new TaskStatus('pending'); }  static assigned(): TaskStatus { return new TaskStatus('assigned'); }  static inProgress(): TaskStatus { return new TaskStatus('in_progress'); }  static completed(): TaskStatus { return new TaskStatus('completed'); }  static failed(): TaskStatus { return new TaskStatus('failed'); }
  get value(): TaskStatusType {    return this.props.value;  }
  public isPending(): boolean { return this.value === 'pending'; }  public isAssigned(): boolean { return this.value === 'assigned'; }  public isInProgress(): boolean { return this.value === 'in_progress'; }  public isCompleted(): boolean { return this.value === 'completed'; }  public isFailed(): boolean { return this.value === 'failed'; }}
// src/core/domains/task-management/value-objects/priority.vo.tstype PriorityLevel = 'low' | 'medium' | 'high' | 'critical';
export class Priority extends ValueObject<PriorityLevel> {  private constructor(level: PriorityLevel) {    super({ value: level });  }
  static low(): Priority { return new Priority('low'); }  static medium(): Priority { return new Priority('medium'); }  static high(): Priority { return new Priority('high'); }  static critical(): Priority { return new Priority('critical'); }
  get value(): PriorityLevel {    return this.props.value;  }
  public getNumericValue(): number {    const priorities = { low: 1, medium: 2, high: 3, critical: 4 };    return priorities[this.value];  }}

Domain Services

Task Scheduling Service

typescript
// src/core/domains/task-management/services/task-scheduling.service.tsimport { Injectable } from '../../../shared/infrastructure/dependency-container';import { Task } from '../entities/task.entity';import { Priority } from '../value-objects/priority.vo';
@Injectable()export class TaskSchedulingService {  public prioritizeTasks(tasks: Task[]): Task[] {    return tasks.sort((a, b) =>      b.priority.getNumericValue() - a.priority.getNumericValue()    );  }
  public canSchedule(task: Task, agentCapacity: number): boolean {    if (agentCapacity <= 0) return false;
    // Critical tasks always schedulable    if (task.priority.equals(Priority.critical())) return true;
    // Other logic based on capacity    return true;  }
  public calculateEstimatedDuration(task: Task): number {    // Simple heuristic - would use ML in real implementation    const baseTime = 300000; // 5 minutes    const priorityMultiplier = {      low: 0.5,      medium: 1.0,      high: 1.5,      critical: 2.0    };
    return baseTime * priorityMultiplier[task.priority.value];  }}

Repository Interfaces & Implementations

Task Repository Interface

typescript
// src/core/domains/task-management/repositories/task.repository.tsexport interface ITaskRepository {  save(task: Task): Promise<void>;  findById(id: TaskId): Promise<Task | null>;  findByAgentId(agentId: string): Promise<Task[]>;  findByStatus(status: TaskStatus): Promise<Task[]>;  findPendingTasks(): Promise<Task[]>;  delete(id: TaskId): Promise<void>;}

SQLite Implementation

typescript
// src/core/domains/task-management/repositories/sqlite-task.repository.ts@Injectable()export class SqliteTaskRepository implements ITaskRepository {  constructor(    @Inject('Database') private db: Database,    @Inject('Logger') private logger: ILogger  ) {}
  async save(task: Task): Promise<void> {    const sql = `      INSERT OR REPLACE INTO tasks (        id, description, priority, status, assigned_agent_id, created_at, updated_at      ) VALUES (?, ?, ?, ?, ?, ?, ?)    `;
    await this.db.run(sql, [      task.id.value,      task.description,      task.priority.value,      task.status.value,      task.assignedAgentId,      task.createdAt.toISOString(),      task.updatedAt.toISOString()    ]);
    this.logger.debug(`Task saved: ${task.id.value}`);  }
  async findById(id: TaskId): Promise<Task | null> {    const sql = 'SELECT * FROM tasks WHERE id = ?';    const row = await this.db.get(sql, [id.value]);
    return row ? this.mapRowToTask(row) : null;  }
  async findPendingTasks(): Promise<Task[]> {    const sql = 'SELECT * FROM tasks WHERE status = ? ORDER BY priority DESC, created_at ASC';    const rows = await this.db.all(sql, ['pending']);
    return rows.map(row => this.mapRowToTask(row));  }
  private mapRowToTask(row: any): Task {    return Task.reconstitute({      id: TaskId.fromString(row.id),      description: row.description,      priority: Priority.fromString(row.priority),      status: TaskStatus.fromString(row.status),      assignedAgentId: row.assigned_agent_id,      createdAt: new Date(row.created_at),      updatedAt: new Date(row.updated_at)    });  }}

Application Layer

Use Case Implementation

typescript
// src/core/application/use-cases/assign-task.use-case.ts@Injectable()export class AssignTaskUseCase {  constructor(    @Inject('TaskRepository') private taskRepository: ITaskRepository,    @Inject('AgentRepository') private agentRepository: IAgentRepository,    @Inject('DomainEventBus') private eventBus: DomainEventBus,    @Inject('Logger') private logger: ILogger  ) {}
  async execute(command: AssignTaskCommand): Promise<AssignTaskResult> {    try {      // 1. Validate command      await this.validateCommand(command);
      // 2. Load aggregates      const task = await this.taskRepository.findById(command.taskId);      if (!task) {        throw new TaskNotFoundError(command.taskId);      }
      const agent = await this.agentRepository.findById(command.agentId);      if (!agent) {        throw new AgentNotFoundError(command.agentId);      }
      // 3. Business logic      if (!agent.canAcceptTask(task)) {        throw new AgentCannotAcceptTaskError(command.agentId, command.taskId);      }
      task.assignTo(command.agentId);      agent.acceptTask(task.id);
      // 4. Persist changes      await Promise.all([        this.taskRepository.save(task),        this.agentRepository.save(agent)      ]);
      // 5. Publish domain events      const events = [        ...task.getUncommittedEvents(),        ...agent.getUncommittedEvents()      ];
      for (const event of events) {        await this.eventBus.publish(event);      }
      task.markEventsAsCommitted();      agent.markEventsAsCommitted();
      // 6. Return result      this.logger.info(`Task ${command.taskId.value} assigned to agent ${command.agentId}`);
      return AssignTaskResult.success({        taskId: task.id,        agentId: command.agentId,        assignedAt: new Date()      });
    } catch (error) {      this.logger.error(`Failed to assign task ${command.taskId.value}:`, error);      return AssignTaskResult.failure(error);    }  }
  private async validateCommand(command: AssignTaskCommand): Promise<void> {    if (!command.taskId) {      throw new ValidationError('Task ID is required');    }    if (!command.agentId) {      throw new ValidationError('Agent ID is required');    }  }}

Dependency Injection Setup

Container Configuration

typescript
// src/core/shared/infrastructure/dependency-container.tsimport { Container } from 'inversify';import { TYPES } from './types';
export class DependencyContainer {  private container: Container;
  constructor() {    this.container = new Container();    this.setupBindings();  }
  private setupBindings(): void {    // Repositories    this.container.bind<ITaskRepository>(TYPES.TaskRepository)      .to(SqliteTaskRepository)      .inSingletonScope();
    this.container.bind<IAgentRepository>(TYPES.AgentRepository)      .to(SqliteAgentRepository)      .inSingletonScope();
    // Services    this.container.bind<TaskSchedulingService>(TYPES.TaskSchedulingService)      .to(TaskSchedulingService)      .inSingletonScope();
    // Use Cases    this.container.bind<AssignTaskUseCase>(TYPES.AssignTaskUseCase)      .to(AssignTaskUseCase)      .inSingletonScope();
    // Infrastructure    this.container.bind<ILogger>(TYPES.Logger)      .to(ConsoleLogger)      .inSingletonScope();
    this.container.bind<DomainEventBus>(TYPES.DomainEventBus)      .to(InMemoryDomainEventBus)      .inSingletonScope();  }
  get<T>(serviceIdentifier: symbol): T {    return this.container.get<T>(serviceIdentifier);  }
  bind<T>(serviceIdentifier: symbol): BindingToSyntax<T> {    return this.container.bind<T>(serviceIdentifier);  }}

Modern TypeScript Configuration

Strict TypeScript Setup

json
// tsconfig.json{  "compilerOptions": {    "target": "ES2022",    "lib": ["ES2022"],    "module": "NodeNext",    "moduleResolution": "NodeNext",    "declaration": true,    "outDir": "./dist",    "strict": true,    "exactOptionalPropertyTypes": true,    "noImplicitReturns": true,    "noFallthroughCasesInSwitch": true,    "noUncheckedIndexedAccess": true,    "noImplicitOverride": true,    "experimentalDecorators": true,    "emitDecoratorMetadata": true,    "skipLibCheck": true,    "forceConsistentCasingInFileNames": true,    "resolveJsonModule": true,    "esModuleInterop": true,    "allowSyntheticDefaultImports": true,    "baseUrl": ".",    "paths": {      "@/*": ["src/*"],      "@core/*": ["src/core/*"],      "@shared/*": ["src/core/shared/*"],      "@domains/*": ["src/core/domains/*"]    }  },  "include": ["src/**/*"],  "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]}

Testing Implementation

Domain Unit Tests

typescript
// src/core/domains/task-management/__tests__/entities/task.entity.test.tsdescribe('Task Entity', () => {  let task: Task;
  beforeEach(() => {    task = Task.create('Test task', Priority.medium());  });
  describe('creation', () => {    it('should create task with pending status', () => {      expect(task.status.isPending()).toBe(true);      expect(task.description).toBe('Test task');      expect(task.priority.equals(Priority.medium())).toBe(true);    });
    it('should generate unique ID', () => {      const task1 = Task.create('Task 1', Priority.low());      const task2 = Task.create('Task 2', Priority.low());
      expect(task1.id.equals(task2.id)).toBe(false);    });  });
  describe('assignment', () => {    it('should assign to agent and change status', () => {      const agentId = 'agent-123';
      task.assignTo(agentId);
      expect(task.assignedAgentId).toBe(agentId);      expect(task.status.isAssigned()).toBe(true);    });
    it('should emit TaskAssignedEvent when assigned', () => {      const agentId = 'agent-123';
      task.assignTo(agentId);
      const events = task.getUncommittedEvents();      expect(events).toHaveLength(1);      expect(events[0]).toBeInstanceOf(TaskAssignedEvent);    });
    it('should not allow assignment of completed task', () => {      task.assignTo('agent-123');      task.complete(TaskResult.success('done'));
      expect(() => task.assignTo('agent-456'))        .toThrow('Cannot assign completed task');    });  });});

Integration Tests

typescript
// src/core/domains/task-management/__tests__/integration/task-repository.integration.test.tsdescribe('TaskRepository Integration', () => {  let repository: SqliteTaskRepository;  let db: Database;
  beforeEach(async () => {    db = new Database(':memory:');    await setupTasksTable(db);    repository = new SqliteTaskRepository(db, new ConsoleLogger());  });
  afterEach(async () => {    await db.close();  });
  it('should save and retrieve task', async () => {    const task = Task.create('Test task', Priority.high());
    await repository.save(task);    const retrieved = await repository.findById(task.id);
    expect(retrieved).toBeDefined();    expect(retrieved!.id.equals(task.id)).toBe(true);    expect(retrieved!.description).toBe('Test task');    expect(retrieved!.priority.equals(Priority.high())).toBe(true);  });
  it('should find pending tasks ordered by priority', async () => {    const lowTask = Task.create('Low priority', Priority.low());    const highTask = Task.create('High priority', Priority.high());
    await repository.save(lowTask);    await repository.save(highTask);
    const pending = await repository.findPendingTasks();
    expect(pending).toHaveLength(2);    expect(pending[0].id.equals(highTask.id)).toBe(true); // High priority first    expect(pending[1].id.equals(lowTask.id)).toBe(true);  });});

Performance Optimizations

Entity Caching

typescript
// src/core/shared/infrastructure/entity-cache.ts@Injectable()export class EntityCache<T extends Entity<any>> {  private cache = new Map<string, { entity: T; timestamp: number }>();  private readonly ttl: number = 300000; // 5 minutes
  set(id: string, entity: T): void {    this.cache.set(id, { entity, timestamp: Date.now() });  }
  get(id: string): T | null {    const cached = this.cache.get(id);    if (!cached) return null;
    // Check TTL    if (Date.now() - cached.timestamp > this.ttl) {      this.cache.delete(id);      return null;    }
    return cached.entity;  }
  invalidate(id: string): void {    this.cache.delete(id);  }
  clear(): void {    this.cache.clear();  }}

Success Metrics

  • Domain Isolation: 100% clean dependency boundaries
  • Test Coverage: >90% unit test coverage for domain logic
  • Type Safety: Strict TypeScript compilation with zero any types
  • Performance: <50ms average use case execution time
  • Memory Efficiency: <100MB heap usage for core domains
  • Plugin Architecture: Modular domain loading capability

Related V3 Skills

  • v3-ddd-architecture - DDD architectural design
  • v3-mcp-optimization - MCP server integration
  • v3-memory-unification - AgentDB repository integration
  • v3-swarm-coordination - Swarm domain implementation

Usage Examples

Complete Core Implementation

bash
# Full core module implementationTask("Core implementation",     "Implement all core domains with DDD patterns and comprehensive testing",     "core-implementer")

Domain-Specific Implementation

bash
# Single domain implementationTask("Task domain implementation",     "Implement task management domain with entities, services, and repositories",     "core-implementer")

來源與署名

來源:ruvnet/ruflo位於v3/@claude-flow/cli/.claude/skills/v3-core-implementation提交58e0ae7

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架