[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HR0KQJDSCF8AGT6MMH35WB":3,"skill-same:01M6HR0KQJDSCF8AGT6MMH35WB":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6HR0KQJDSCF8AGT6MMH35WB","cqrs-implementation",null,"Implement Command Query Responsibility Segregation for scalable architectures. Use when separating read and write models, optimizing query performance, or building event-sourced systems.","welflau\u002Fai-dev-system","welflau","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7010385?v=4","01M6HPTDGF18RFY07M229P8CTM","01M6HPTDMRMZCJPYBFEA9XVVYT",3,"MIT","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fbackend-development\u002Fskills\u002Fcqrs-implementation\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"implementation","cqrs implementation","cqrs","when","performance","for","event","Scalable","architectures","systems","query","models","use","write","read","command","implement","2026-11-10 10:12:30",false,"---\nname: cqrs-implementation\ndescription: Implement Command Query Responsibility Segregation for scalable architectures. Use when separating read and write models, optimizing query performance, or building event-sourced systems.\n---\n\n# CQRS Implementation\n\nComprehensive guide to implementing CQRS (Command Query Responsibility Segregation) patterns.\n\n## When to Use This Skill\n\n- Separating read and write concerns\n- Scaling reads independently from writes\n- Building event-sourced systems\n- Optimizing complex query scenarios\n- Different read\u002Fwrite data models needed\n- High-performance reporting requirements\n\n## Core Concepts\n\n### 1. CQRS Architecture\n\n```\n                    ┌─────────────┐\n                    │   Client    │\n                    └──────┬──────┘\n                           │\n              ┌────────────┴────────────┐\n              │                         │\n              ▼                         ▼\n       ┌─────────────┐          ┌─────────────┐\n       │  Commands   │          │   Queries   │\n       │    API      │          │    API      │\n       └──────┬──────┘          └──────┬──────┘\n              │                         │\n              ▼                         ▼\n       ┌─────────────┐          ┌─────────────┐\n       │  Command    │          │   Query     │\n       │  Handlers   │          │  Handlers   │\n       └──────┬──────┘          └──────┬──────┘\n              │                         │\n              ▼                         ▼\n       ┌─────────────┐          ┌─────────────┐\n       │   Write     │─────────►│    Read     │\n       │   Model     │  Events  │   Model     │\n       └─────────────┘          └─────────────┘\n```\n\n### 2. Key Components\n\n| Component           | Responsibility                  |\n| ------------------- | ------------------------------- |\n| **Command**         | Intent to change state          |\n| **Command Handler** | Validates and executes commands |\n| **Event**           | Record of state change          |\n| **Query**           | Request for data                |\n| **Query Handler**   | Retrieves data from read model  |\n| **Projector**       | Updates read model from events  |\n\n## Templates\n\n### Template 1: Command Infrastructure\n\n```python\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass\nfrom typing import TypeVar, Generic, Dict, Any, Type\nfrom datetime import datetime\nimport uuid\n\n# Command base\n@dataclass\nclass Command:\n    command_id: str = None\n    timestamp: datetime = None\n\n    def __post_init__(self):\n        self.command_id = self.command_id or str(uuid.uuid4())\n        self.timestamp = self.timestamp or datetime.utcnow()\n\n\n# Concrete commands\n@dataclass\nclass CreateOrder(Command):\n    customer_id: str\n    items: list\n    shipping_address: dict\n\n\n@dataclass\nclass AddOrderItem(Command):\n    order_id: str\n    product_id: str\n    quantity: int\n    price: float\n\n\n@dataclass\nclass CancelOrder(Command):\n    order_id: str\n    reason: str\n\n\n# Command handler base\nT = TypeVar('T', bound=Command)\n\nclass CommandHandler(ABC, Generic[T]):\n    @abstractmethod\n    async def handle(self, command: T) -> Any:\n        pass\n\n\n# Command bus\nclass CommandBus:\n    def __init__(self):\n        self._handlers: Dict[Type[Command], CommandHandler] = {}\n\n    def register(self, command_type: Type[Command], handler: CommandHandler):\n        self._handlers[command_type] = handler\n\n    async def dispatch(self, command: Command) -> Any:\n        handler = self._handlers.get(type(command))\n        if not handler:\n            raise ValueError(f\"No handler for {type(command).__name__}\")\n        return await handler.handle(command)\n\n\n# Command handler implementation\nclass CreateOrderHandler(CommandHandler[CreateOrder]):\n    def __init__(self, order_repository, event_store):\n        self.order_repository = order_repository\n        self.event_store = event_store\n\n    async def handle(self, command: CreateOrder) -> str:\n        # Validate\n        if not command.items:\n            raise ValueError(\"Order must have at least one item\")\n\n        # Create aggregate\n        order = Order.create(\n            customer_id=command.customer_id,\n            items=command.items,\n            shipping_address=command.shipping_address\n        )\n\n        # Persist events\n        await self.event_store.append_events(\n            stream_id=f\"Order-{order.id}\",\n            stream_type=\"Order\",\n            events=order.uncommitted_events\n        )\n\n        return order.id\n```\n\n### Template 2: Query Infrastructure\n\n```python\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass\nfrom typing import TypeVar, Generic, List, Optional\n\n# Query base\n@dataclass\nclass Query:\n    pass\n\n\n# Concrete queries\n@dataclass\nclass GetOrderById(Query):\n    order_id: str\n\n\n@dataclass\nclass GetCustomerOrders(Query):\n    customer_id: str\n    status: Optional[str] = None\n    page: int = 1\n    page_size: int = 20\n\n\n@dataclass\nclass SearchOrders(Query):\n    query: str\n    filters: dict = None\n    sort_by: str = \"created_at\"\n    sort_order: str = \"desc\"\n\n\n# Query result types\n@dataclass\nclass OrderView:\n    order_id: str\n    customer_id: str\n    status: str\n    total_amount: float\n    item_count: int\n    created_at: datetime\n    shipped_at: Optional[datetime] = None\n\n\n@dataclass\nclass PaginatedResult(Generic[T]):\n    items: List[T]\n    total: int\n    page: int\n    page_size: int\n\n    @property\n    def total_pages(self) -> int:\n        return (self.total + self.page_size - 1) \u002F\u002F self.page_size\n\n\n# Query handler base\nT = TypeVar('T', bound=Query)\nR = TypeVar('R')\n\nclass QueryHandler(ABC, Generic[T, R]):\n    @abstractmethod\n    async def handle(self, query: T) -> R:\n        pass\n\n\n# Query bus\nclass QueryBus:\n    def __init__(self):\n        self._handlers: Dict[Type[Query], QueryHandler] = {}\n\n    def register(self, query_type: Type[Query], handler: QueryHandler):\n        self._handlers[query_type] = handler\n\n    async def dispatch(self, query: Query) -> Any:\n        handler = self._handlers.get(type(query))\n        if not handler:\n            raise ValueError(f\"No handler for {type(query).__name__}\")\n        return await handler.handle(query)\n\n\n# Query handler implementation\nclass GetOrderByIdHandler(QueryHandler[GetOrderById, Optional[OrderView]]):\n    def __init__(self, read_db):\n        self.read_db = read_db\n\n    async def handle(self, query: GetOrderById) -> Optional[OrderView]:\n        async with self.read_db.acquire() as conn:\n            row = await conn.fetchrow(\n                \"\"\"\n                SELECT order_id, customer_id, status, total_amount,\n                       item_count, created_at, shipped_at\n                FROM order_views\n                WHERE order_id = $1\n                \"\"\",\n                query.order_id\n            )\n            if row:\n                return OrderView(**dict(row))\n            return None\n\n\nclass GetCustomerOrdersHandler(QueryHandler[GetCustomerOrders, PaginatedResult[OrderView]]):\n    def __init__(self, read_db):\n        self.read_db = read_db\n\n    async def handle(self, query: GetCustomerOrders) -> PaginatedResult[OrderView]:\n        async with self.read_db.acquire() as conn:\n            # Build query with optional status filter\n            where_clause = \"customer_id = $1\"\n            params = [query.customer_id]\n\n            if query.status:\n                where_clause += \" AND status = $2\"\n                params.append(query.status)\n\n            # Get total count\n            total = await conn.fetchval(\n                f\"SELECT COUNT(*) FROM order_views WHERE {where_clause}\",\n                *params\n            )\n\n            # Get paginated results\n            offset = (query.page - 1) * query.page_size\n            rows = await conn.fetch(\n                f\"\"\"\n                SELECT order_id, customer_id, status, total_amount,\n                       item_count, created_at, shipped_at\n                FROM order_views\n                WHERE {where_clause}\n                ORDER BY created_at DESC\n                LIMIT ${len(params) + 1} OFFSET ${len(params) + 2}\n                \"\"\",\n                *params, query.page_size, offset\n            )\n\n            return PaginatedResult(\n                items=[OrderView(**dict(row)) for row in rows],\n                total=total,\n                page=query.page,\n                page_size=query.page_size\n            )\n```\n\n### Template 3: FastAPI CQRS Application\n\n```python\nfrom fastapi import FastAPI, HTTPException, Depends\nfrom pydantic import BaseModel\nfrom typing import List, Optional\n\napp = FastAPI()\n\n# Request\u002FResponse models\nclass CreateOrderRequest(BaseModel):\n    customer_id: str\n    items: List[dict]\n    shipping_address: dict\n\n\nclass OrderResponse(BaseModel):\n    order_id: str\n    customer_id: str\n    status: str\n    total_amount: float\n    item_count: int\n    created_at: datetime\n\n\n# Dependency injection\ndef get_command_bus() -> CommandBus:\n    return app.state.command_bus\n\n\ndef get_query_bus() -> QueryBus:\n    return app.state.query_bus\n\n\n# Command endpoints (POST, PUT, DELETE)\n@app.post(\"\u002Forders\", response_model=dict)\nasync def create_order(\n    request: CreateOrderRequest,\n    command_bus: CommandBus = Depends(get_command_bus)\n):\n    command = CreateOrder(\n        customer_id=request.customer_id,\n        items=request.items,\n        shipping_address=request.shipping_address\n    )\n    order_id = await command_bus.dispatch(command)\n    return {\"order_id\": order_id}\n\n\n@app.post(\"\u002Forders\u002F{order_id}\u002Fitems\")\nasync def add_item(\n    order_id: str,\n    product_id: str,\n    quantity: int,\n    price: float,\n    command_bus: CommandBus = Depends(get_command_bus)\n):\n    command = AddOrderItem(\n        order_id=order_id,\n        product_id=product_id,\n        quantity=quantity,\n        price=price\n    )\n    await command_bus.dispatch(command)\n    return {\"status\": \"item_added\"}\n\n\n@app.delete(\"\u002Forders\u002F{order_id}\")\nasync def cancel_order(\n    order_id: str,\n    reason: str,\n    command_bus: CommandBus = Depends(get_command_bus)\n):\n    command = CancelOrder(order_id=order_id, reason=reason)\n    await command_bus.dispatch(command)\n    return {\"status\": \"cancelled\"}\n\n\n# Query endpoints (GET)\n@app.get(\"\u002Forders\u002F{order_id}\", response_model=OrderResponse)\nasync def get_order(\n    order_id: str,\n    query_bus: QueryBus = Depends(get_query_bus)\n):\n    query = GetOrderById(order_id=order_id)\n    result = await query_bus.dispatch(query)\n    if not result:\n        raise HTTPException(status_code=404, detail=\"Order not found\")\n    return result\n\n\n@app.get(\"\u002Fcustomers\u002F{customer_id}\u002Forders\")\nasync def get_customer_orders(\n    customer_id: str,\n    status: Optional[str] = None,\n    page: int = 1,\n    page_size: int = 20,\n    query_bus: QueryBus = Depends(get_query_bus)\n):\n    query = GetCustomerOrders(\n        customer_id=customer_id,\n        status=status,\n        page=page,\n        page_size=page_size\n    )\n    return await query_bus.dispatch(query)\n\n\n@app.get(\"\u002Forders\u002Fsearch\")\nasync def search_orders(\n    q: str,\n    sort_by: str = \"created_at\",\n    query_bus: QueryBus = Depends(get_query_bus)\n):\n    query = SearchOrders(query=q, sort_by=sort_by)\n    return await query_bus.dispatch(query)\n```\n\n### Template 4: Read Model Synchronization\n\n```python\nclass ReadModelSynchronizer:\n    \"\"\"Keeps read models in sync with events.\"\"\"\n\n    def __init__(self, event_store, read_db, projections: List[Projection]):\n        self.event_store = event_store\n        self.read_db = read_db\n        self.projections = {p.name: p for p in projections}\n\n    async def run(self):\n        \"\"\"Continuously sync read models.\"\"\"\n        while True:\n            for name, projection in self.projections.items():\n                await self._sync_projection(projection)\n            await asyncio.sleep(0.1)\n\n    async def _sync_projection(self, projection: Projection):\n        checkpoint = await self._get_checkpoint(projection.name)\n\n        events = await self.event_store.read_all(\n            from_position=checkpoint,\n            limit=100\n        )\n\n        for event in events:\n            if event.event_type in projection.handles():\n                try:\n                    await projection.apply(event)\n                except Exception as e:\n                    # Log error, possibly retry or skip\n                    logger.error(f\"Projection error: {e}\")\n                    continue\n\n            await self._save_checkpoint(projection.name, event.global_position)\n\n    async def rebuild_projection(self, projection_name: str):\n        \"\"\"Rebuild a projection from scratch.\"\"\"\n        projection = self.projections[projection_name]\n\n        # Clear existing data\n        await projection.clear()\n\n        # Reset checkpoint\n        await self._save_checkpoint(projection_name, 0)\n\n        # Rebuild\n        while True:\n            checkpoint = await self._get_checkpoint(projection_name)\n            events = await self.event_store.read_all(checkpoint, 1000)\n\n            if not events:\n                break\n\n            for event in events:\n                if event.event_type in projection.handles():\n                    await projection.apply(event)\n\n            await self._save_checkpoint(\n                projection_name,\n                events[-1].global_position\n            )\n```\n\n### Template 5: Eventual Consistency Handling\n\n```python\nclass ConsistentQueryHandler:\n    \"\"\"Query handler that can wait for consistency.\"\"\"\n\n    def __init__(self, read_db, event_store):\n        self.read_db = read_db\n        self.event_store = event_store\n\n    async def query_after_command(\n        self,\n        query: Query,\n        expected_version: int,\n        stream_id: str,\n        timeout: float = 5.0\n    ):\n        \"\"\"\n        Execute query, ensuring read model is at expected version.\n        Used for read-your-writes consistency.\n        \"\"\"\n        start_time = time.time()\n\n        while time.time() - start_time \u003C timeout:\n            # Check if read model is caught up\n            projection_version = await self._get_projection_version(stream_id)\n\n            if projection_version >= expected_version:\n                return await self.execute_query(query)\n\n            # Wait a bit and retry\n            await asyncio.sleep(0.1)\n\n        # Timeout - return stale data with warning\n        return {\n            \"data\": await self.execute_query(query),\n            \"_warning\": \"Data may be stale\"\n        }\n\n    async def _get_projection_version(self, stream_id: str) -> int:\n        \"\"\"Get the last processed event version for a stream.\"\"\"\n        async with self.read_db.acquire() as conn:\n            return await conn.fetchval(\n                \"SELECT last_event_version FROM projection_state WHERE stream_id = $1\",\n                stream_id\n            ) or 0\n```\n\n## Best Practices\n\n### Do's\n\n- **Separate command and query models** - Different needs\n- **Use eventual consistency** - Accept propagation delay\n- **Validate in command handlers** - Before state change\n- **Denormalize read models** - Optimize for queries\n- **Version your events** - For schema evolution\n\n### Don'ts\n\n- **Don't query in commands** - Use only for writes\n- **Don't couple read\u002Fwrite schemas** - Independent evolution\n- **Don't over-engineer** - Start simple\n- **Don't ignore consistency SLAs** - Define acceptable lag\n\n## Resources\n\n- [CQRS Pattern](https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCQRS.html)\n- [Microsoft CQRS Guidance](https:\u002F\u002Fdocs.microsoft.com\u002Fen-us\u002Fazure\u002Farchitecture\u002Fpatterns\u002Fcqrs)\n","# CQRS Implementation\n\nComprehensive guide to implementing CQRS (Command Query Responsibility Segregation) patterns.\n\n## When to Use This Skill\n\n- Separating read and write concerns\n- Scaling reads independently from writes\n- Building event-sourced systems\n- Optimizing complex query scenarios\n- Different read\u002Fwrite data models needed\n- High-performance reporting requirements\n\n## Core Concepts\n\n### 1. CQRS Architecture\n\n```\n                    ┌─────────────┐\n                    │   Client    │\n                    └──────┬──────┘\n                           │\n              ┌────────────┴────────────┐\n              │                         │\n              ▼                         ▼\n       ┌─────────────┐          ┌─────────────┐\n       │  Commands   │          │   Queries   │\n       │    API      │          │    API      │\n       └──────┬──────┘          └──────┬──────┘\n              │                         │\n              ▼                         ▼\n       ┌─────────────┐          ┌─────────────┐\n       │  Command    │          │   Query     │\n       │  Handlers   │          │  Handlers   │\n       └──────┬──────┘          └──────┬──────┘\n              │                         │\n              ▼                         ▼\n       ┌─────────────┐          ┌─────────────┐\n       │   Write     │─────────►│    Read     │\n       │   Model     │  Events  │   Model     │\n       └─────────────┘          └─────────────┘\n```\n\n### 2. Key Components\n\n| Component           | Responsibility                  |\n| ------------------- | ------------------------------- |\n| **Command**         | Intent to change state          |\n| **Command Handler** | Validates and executes commands |\n| **Event**           | Record of state change          |\n| **Query**           | Request for data                |\n| **Query Handler**   | Retrieves data from read model  |\n| **Projector**       | Updates read model from events  |\n\n## Templates\n\n### Template 1: Command Infrastructure\n\n```python\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass\nfrom typing import TypeVar, Generic, Dict, Any, Type\nfrom datetime import datetime\nimport uuid\n\n# Command base\n@dataclass\nclass Command:\n    command_id: str = None\n    timestamp: datetime = None\n\n    def __post_init__(self):\n        self.command_id = self.command_id or str(uuid.uuid4())\n        self.timestamp = self.timestamp or datetime.utcnow()\n\n\n# Concrete commands\n@dataclass\nclass CreateOrder(Command):\n    customer_id: str\n    items: list\n    shipping_address: dict\n\n\n@dataclass\nclass AddOrderItem(Command):\n    order_id: str\n    product_id: str\n    quantity: int\n    price: float\n\n\n@dataclass\nclass CancelOrder(Command):\n    order_id: str\n    reason: str\n\n\n# Command handler base\nT = TypeVar('T', bound=Command)\n\nclass CommandHandler(ABC, Generic[T]):\n    @abstractmethod\n    async def handle(self, command: T) -> Any:\n        pass\n\n\n# Command bus\nclass CommandBus:\n    def __init__(self):\n        self._handlers: Dict[Type[Command], CommandHandler] = {}\n\n    def register(self, command_type: Type[Command], handler: CommandHandler):\n        self._handlers[command_type] = handler\n\n    async def dispatch(self, command: Command) -> Any:\n        handler = self._handlers.get(type(command))\n        if not handler:\n            raise ValueError(f\"No handler for {type(command).__name__}\")\n        return await handler.handle(command)\n\n\n# Command handler implementation\nclass CreateOrderHandler(CommandHandler[CreateOrder]):\n    def __init__(self, order_repository, event_store):\n        self.order_repository = order_repository\n        self.event_store = event_store\n\n    async def handle(self, command: CreateOrder) -> str:\n        # Validate\n        if not command.items:\n            raise ValueError(\"Order must have at least one item\")\n\n        # Create aggregate\n        order = Order.create(\n            customer_id=command.customer_id,\n            items=command.items,\n            shipping_address=command.shipping_address\n        )\n\n        # Persist events\n        await self.event_store.append_events(\n            stream_id=f\"Order-{order.id}\",\n            stream_type=\"Order\",\n            events=order.uncommitted_events\n        )\n\n        return order.id\n```\n\n### Template 2: Query Infrastructure\n\n```python\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass\nfrom typing import TypeVar, Generic, List, Optional\n\n# Query base\n@dataclass\nclass Query:\n    pass\n\n\n# Concrete queries\n@dataclass\nclass GetOrderById(Query):\n    order_id: str\n\n\n@dataclass\nclass GetCustomerOrders(Query):\n    customer_id: str\n    status: Optional[str] = None\n    page: int = 1\n    page_size: int = 20\n\n\n@dataclass\nclass SearchOrders(Query):\n    query: str\n    filters: dict = None\n    sort_by: str = \"created_at\"\n    sort_order: str = \"desc\"\n\n\n# Query result types\n@dataclass\nclass OrderView:\n    order_id: str\n    customer_id: str\n    status: str\n    total_amount: float\n    item_count: int\n    created_at: datetime\n    shipped_at: Optional[datetime] = None\n\n\n@dataclass\nclass PaginatedResult(Generic[T]):\n    items: List[T]\n    total: int\n    page: int\n    page_size: int\n\n    @property\n    def total_pages(self) -> int:\n        return (self.total + self.page_size - 1) \u002F\u002F self.page_size\n\n\n# Query handler base\nT = TypeVar('T', bound=Query)\nR = TypeVar('R')\n\nclass QueryHandler(ABC, Generic[T, R]):\n    @abstractmethod\n    async def handle(self, query: T) -> R:\n        pass\n\n\n# Query bus\nclass QueryBus:\n    def __init__(self):\n        self._handlers: Dict[Type[Query], QueryHandler] = {}\n\n    def register(self, query_type: Type[Query], handler: QueryHandler):\n        self._handlers[query_type] = handler\n\n    async def dispatch(self, query: Query) -> Any:\n        handler = self._handlers.get(type(query))\n        if not handler:\n            raise ValueError(f\"No handler for {type(query).__name__}\")\n        return await handler.handle(query)\n\n\n# Query handler implementation\nclass GetOrderByIdHandler(QueryHandler[GetOrderById, Optional[OrderView]]):\n    def __init__(self, read_db):\n        self.read_db = read_db\n\n    async def handle(self, query: GetOrderById) -> Optional[OrderView]:\n        async with self.read_db.acquire() as conn:\n            row = await conn.fetchrow(\n                \"\"\"\n                SELECT order_id, customer_id, status, total_amount,\n                       item_count, created_at, shipped_at\n                FROM order_views\n                WHERE order_id = $1\n                \"\"\",\n                query.order_id\n            )\n            if row:\n                return OrderView(**dict(row))\n            return None\n\n\nclass GetCustomerOrdersHandler(QueryHandler[GetCustomerOrders, PaginatedResult[OrderView]]):\n    def __init__(self, read_db):\n        self.read_db = read_db\n\n    async def handle(self, query: GetCustomerOrders) -> PaginatedResult[OrderView]:\n        async with self.read_db.acquire() as conn:\n            # Build query with optional status filter\n            where_clause = \"customer_id = $1\"\n            params = [query.customer_id]\n\n            if query.status:\n                where_clause += \" AND status = $2\"\n                params.append(query.status)\n\n            # Get total count\n            total = await conn.fetchval(\n                f\"SELECT COUNT(*) FROM order_views WHERE {where_clause}\",\n                *params\n            )\n\n            # Get paginated results\n            offset = (query.page - 1) * query.page_size\n            rows = await conn.fetch(\n                f\"\"\"\n                SELECT order_id, customer_id, status, total_amount,\n                       item_count, created_at, shipped_at\n                FROM order_views\n                WHERE {where_clause}\n                ORDER BY created_at DESC\n                LIMIT ${len(params) + 1} OFFSET ${len(params) + 2}\n                \"\"\",\n                *params, query.page_size, offset\n            )\n\n            return PaginatedResult(\n                items=[OrderView(**dict(row)) for row in rows],\n                total=total,\n                page=query.page,\n                page_size=query.page_size\n            )\n```\n\n### Template 3: FastAPI CQRS Application\n\n```python\nfrom fastapi import FastAPI, HTTPException, Depends\nfrom pydantic import BaseModel\nfrom typing import List, Optional\n\napp = FastAPI()\n\n# Request\u002FResponse models\nclass CreateOrderRequest(BaseModel):\n    customer_id: str\n    items: List[dict]\n    shipping_address: dict\n\n\nclass OrderResponse(BaseModel):\n    order_id: str\n    customer_id: str\n    status: str\n    total_amount: float\n    item_count: int\n    created_at: datetime\n\n\n# Dependency injection\ndef get_command_bus() -> CommandBus:\n    return app.state.command_bus\n\n\ndef get_query_bus() -> QueryBus:\n    return app.state.query_bus\n\n\n# Command endpoints (POST, PUT, DELETE)\n@app.post(\"\u002Forders\", response_model=dict)\nasync def create_order(\n    request: CreateOrderRequest,\n    command_bus: CommandBus = Depends(get_command_bus)\n):\n    command = CreateOrder(\n        customer_id=request.customer_id,\n        items=request.items,\n        shipping_address=request.shipping_address\n    )\n    order_id = await command_bus.dispatch(command)\n    return {\"order_id\": order_id}\n\n\n@app.post(\"\u002Forders\u002F{order_id}\u002Fitems\")\nasync def add_item(\n    order_id: str,\n    product_id: str,\n    quantity: int,\n    price: float,\n    command_bus: CommandBus = Depends(get_command_bus)\n):\n    command = AddOrderItem(\n        order_id=order_id,\n        product_id=product_id,\n        quantity=quantity,\n        price=price\n    )\n    await command_bus.dispatch(command)\n    return {\"status\": \"item_added\"}\n\n\n@app.delete(\"\u002Forders\u002F{order_id}\")\nasync def cancel_order(\n    order_id: str,\n    reason: str,\n    command_bus: CommandBus = Depends(get_command_bus)\n):\n    command = CancelOrder(order_id=order_id, reason=reason)\n    await command_bus.dispatch(command)\n    return {\"status\": \"cancelled\"}\n\n\n# Query endpoints (GET)\n@app.get(\"\u002Forders\u002F{order_id}\", response_model=OrderResponse)\nasync def get_order(\n    order_id: str,\n    query_bus: QueryBus = Depends(get_query_bus)\n):\n    query = GetOrderById(order_id=order_id)\n    result = await query_bus.dispatch(query)\n    if not result:\n        raise HTTPException(status_code=404, detail=\"Order not found\")\n    return result\n\n\n@app.get(\"\u002Fcustomers\u002F{customer_id}\u002Forders\")\nasync def get_customer_orders(\n    customer_id: str,\n    status: Optional[str] = None,\n    page: int = 1,\n    page_size: int = 20,\n    query_bus: QueryBus = Depends(get_query_bus)\n):\n    query = GetCustomerOrders(\n        customer_id=customer_id,\n        status=status,\n        page=page,\n        page_size=page_size\n    )\n    return await query_bus.dispatch(query)\n\n\n@app.get(\"\u002Forders\u002Fsearch\")\nasync def search_orders(\n    q: str,\n    sort_by: str = \"created_at\",\n    query_bus: QueryBus = Depends(get_query_bus)\n):\n    query = SearchOrders(query=q, sort_by=sort_by)\n    return await query_bus.dispatch(query)\n```\n\n### Template 4: Read Model Synchronization\n\n```python\nclass ReadModelSynchronizer:\n    \"\"\"Keeps read models in sync with events.\"\"\"\n\n    def __init__(self, event_store, read_db, projections: List[Projection]):\n        self.event_store = event_store\n        self.read_db = read_db\n        self.projections = {p.name: p for p in projections}\n\n    async def run(self):\n        \"\"\"Continuously sync read models.\"\"\"\n        while True:\n            for name, projection in self.projections.items():\n                await self._sync_projection(projection)\n            await asyncio.sleep(0.1)\n\n    async def _sync_projection(self, projection: Projection):\n        checkpoint = await self._get_checkpoint(projection.name)\n\n        events = await self.event_store.read_all(\n            from_position=checkpoint,\n            limit=100\n        )\n\n        for event in events:\n            if event.event_type in projection.handles():\n                try:\n                    await projection.apply(event)\n                except Exception as e:\n                    # Log error, possibly retry or skip\n                    logger.error(f\"Projection error: {e}\")\n                    continue\n\n            await self._save_checkpoint(projection.name, event.global_position)\n\n    async def rebuild_projection(self, projection_name: str):\n        \"\"\"Rebuild a projection from scratch.\"\"\"\n        projection = self.projections[projection_name]\n\n        # Clear existing data\n        await projection.clear()\n\n        # Reset checkpoint\n        await self._save_checkpoint(projection_name, 0)\n\n        # Rebuild\n        while True:\n            checkpoint = await self._get_checkpoint(projection_name)\n            events = await self.event_store.read_all(checkpoint, 1000)\n\n            if not events:\n                break\n\n            for event in events:\n                if event.event_type in projection.handles():\n                    await projection.apply(event)\n\n            await self._save_checkpoint(\n                projection_name,\n                events[-1].global_position\n            )\n```\n\n### Template 5: Eventual Consistency Handling\n\n```python\nclass ConsistentQueryHandler:\n    \"\"\"Query handler that can wait for consistency.\"\"\"\n\n    def __init__(self, read_db, event_store):\n        self.read_db = read_db\n        self.event_store = event_store\n\n    async def query_after_command(\n        self,\n        query: Query,\n        expected_version: int,\n        stream_id: str,\n        timeout: float = 5.0\n    ):\n        \"\"\"\n        Execute query, ensuring read model is at expected version.\n        Used for read-your-writes consistency.\n        \"\"\"\n        start_time = time.time()\n\n        while time.time() - start_time \u003C timeout:\n            # Check if read model is caught up\n            projection_version = await self._get_projection_version(stream_id)\n\n            if projection_version >= expected_version:\n                return await self.execute_query(query)\n\n            # Wait a bit and retry\n            await asyncio.sleep(0.1)\n\n        # Timeout - return stale data with warning\n        return {\n            \"data\": await self.execute_query(query),\n            \"_warning\": \"Data may be stale\"\n        }\n\n    async def _get_projection_version(self, stream_id: str) -> int:\n        \"\"\"Get the last processed event version for a stream.\"\"\"\n        async with self.read_db.acquire() as conn:\n            return await conn.fetchval(\n                \"SELECT last_event_version FROM projection_state WHERE stream_id = $1\",\n                stream_id\n            ) or 0\n```\n\n## Best Practices\n\n### Do's\n\n- **Separate command and query models** - Different needs\n- **Use eventual consistency** - Accept propagation delay\n- **Validate in command handlers** - Before state change\n- **Denormalize read models** - Optimize for queries\n- **Version your events** - For schema evolution\n\n### Don'ts\n\n- **Don't query in commands** - Use only for writes\n- **Don't couple read\u002Fwrite schemas** - Independent evolution\n- **Don't over-engineer** - Start simple\n- **Don't ignore consistency SLAs** - Define acceptable lag\n\n## Resources\n\n- [CQRS Pattern](https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCQRS.html)\n- [Microsoft CQRS Guidance](https:\u002F\u002Fdocs.microsoft.com\u002Fen-us\u002Fazure\u002Farchitecture\u002Fpatterns\u002Fcqrs)\n",{"name":5,"description":7},"main","18d0e63d1313ca87098f614aa7c1e2dcf6de79c7","backend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fbackend-development\u002Fskills\u002Fcqrs-implementation",1,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system","https:\u002F\u002Fgithub.com\u002Fwelflau","2026-11-12 14:55:20",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add welflau\u002Fai-dev-system --skill cqrs-implementation",{"tool":53,"command":54},"bunx","bunx skills add welflau\u002Fai-dev-system --skill cqrs-implementation",{"tool":56,"command":57},"pnpm","pnpm dlx skills add welflau\u002Fai-dev-system --skill cqrs-implementation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fbackend-development\u002Fskills\u002Fcqrs-implementation\u002FSKILL.md",true,[],[62,95,126,150,176,200],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":66,"licenseFileUrl":67,"sourceHtmlUrl":68,"categories":69,"keywords":75,"publishedAt":35},"01M6HSTDP4M3JFXEBK91VFB4PA","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FSKILL.md",[70],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[76,77,78,79,80,81,82,83,84,85,86,87,88,89,30,90,91,92,93,23,94],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","routing","state management","state","file","Tailwind","single-file","simple","ui components","multi","single",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":66,"licenseFileUrl":99,"sourceHtmlUrl":100,"categories":101,"keywords":111,"publishedAt":35},"01M6HSDXH0JSP8R3QTNY9XZ8HN","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FSKILL.md",[102,103,106],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},{"categoryNo":104,"categoryName":105,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[81,112,113,82,77,83,84,114,115,116,78,117,118,119,30,120,121,122,123,124,125,21],"design","frontend design","react components","create","code","examples","applications","landing","ui design","pages","aesthetics","web ui","with","generic",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":66,"licenseFileUrl":130,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":35},"01M6HSA77QYVP7A72HREGTDN2C","algorithmic-art","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FSKILL.md",[133],{"categoryNo":104,"categoryName":105,"taxonomyType":73,"taxonomyTypeDesc":74},[135,136,137,115,116,138,139,140,141,30,142,143,27,144,124,145,146,147,148,149,21],"algorithmic art","Art","algorithmic","flow","js","work","interactive","generative art","exploration","users","Existing","request","generative","copyright","fields",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":66,"licenseFileUrl":154,"sourceHtmlUrl":155,"categories":156,"keywords":158,"publishedAt":35},"01M6HS9HE0X390Y6RQKTY1YNGJ","theme-factory","Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors\u002Ffonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FSKILL.md",[157],{"categoryNo":104,"categoryName":105,"taxonomyType":73,"taxonomyTypeDesc":74},[159,160,161,162,163,164,78,165,166,167,119,168,169,121,170,124,171,172,173,23,174,175],"theme factory","factory","theme","docs","toolkit","generate","SET","fly","slides","styling","artifact","themes","you","fonts","can","apply","new",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":185,"publishedAt":35},"01M6HS74GASM6FJ77F83EY679E","browsing","Use when you need direct browser control - teaches Chrome DevTools Protocol for controlling existing browser sessions, multi-tab management, form automation, and content extraction via use_browser MCP tool","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fsuperpowers-chrome\u002Fskills\u002Fbrowsing\u002FSKILL.md",[182],{"categoryNo":183,"categoryName":184,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000023","Skill与智能体开发",[178,186,187,188,189,190,191,192,193,194,195,30,196,197,198,199,93,171,23,145],"MCP","automation","chrome","sessions","protocol","browser","devtools","chrome devtools","tool","direct","browser control","control","via","form",{"skillNo":201,"name":202,"nameZh":6,"description":203,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":66,"licenseFileUrl":204,"sourceHtmlUrl":205,"categories":206,"keywords":213,"publishedAt":35},"01M6HS6BZT2CKDNQ6YF20DXN4T","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FSKILL.md",[207,210],{"categoryNo":208,"categoryName":209,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":211,"categoryName":212,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000016","图像与多媒体",[214,215,216,217,218,219,220,221,222,30,223,144,224,225,226,23,146,21],"slack gif creator","slack","gif","creator","validation","Tools","constraints","Animation","knowledge","me","make","Utilities","concepts"]