cqrs

CQRS command query responsibility segregation. Use for complex domains.

7 stars

Best use case

cqrs is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

CQRS command query responsibility segregation. Use for complex domains.

Teams using cqrs should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/cqrs/SKILL.md --create-dirs "https://raw.githubusercontent.com/G1Joshi/Agent-Skills/main/skills/architecture/cqrs/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/cqrs/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How cqrs Compares

Feature / AgentcqrsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

CQRS command query responsibility segregation. Use for complex domains.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# CQRS (Command Query Responsibility Segregation)

CQRS is a pattern that separates read and update operations for a data store. Instead of using a single model for both, you have a **Command Model** (Write) and a **Query Model** (Read).

## When to Use

- **High Disparity**: Read load is 1000x higher than Write load (or vice versa).
- **Complex UI**: The UI needs data shaped differently than the way it's stored (e.g., Dashboard aggregation).
- **Event Sourcing**: CQRS is almost mandatory for Event Sourcing.

## Quick Start (Conceptual)

```typescript
// Command Side (Write) - Optimized for Integrity
class CreateOrderCommand { ... }
class OrderAggregate {
    create(cmd: CreateOrderCommand) {
        // Validate business rules
        // Save to DB (Normalized / Event Store)
    }
}

// Query Side (Read) - Optimized for Speed
class GetOrderSummaryQuery { ... }
class OrderSummaryProjector {
    // Listens to "OrderCreated" event
    on(event) {
        // Update a flat "Read DB" (e.g., ElasticSearch, Redis, Document DB)
        // optimized for the specific UI view
    }
}
```

## Core Concepts

### Separation

- **Commands**: Intent to change state. Void return type (or Ack). Strict validation.
- **Queries**: Request for data. No side effects. Returns DTOs.

### Synchronization

The Read DB is eventually consistent with the Write DB. Logic (Projectors) syncs them via Events.

## Best Practices

**Do**:

- Start with **Logical CQRS** (Separate classes, same DB) before Physical CQRS (Separate DBs).
- accept **Eventual Consistency** in the UI (Optimistic UI updates).

**Don't**:

- Don't use CQRS for simple CRUD (It adds massive complexity).
- Don't try to make the Read side fully real-time synchronized (You'll lose the scaling usage).

## Troubleshooting

| Error        | Cause                                           | Solution                                                              |
| :----------- | :---------------------------------------------- | :-------------------------------------------------------------------- |
| `Stale Data` | Lag between Command execution and Query update. | UI design updates (spinners/optimistic updates); Check projector lag. |
| `Complexity` | Over-engineering.                               | Revert to simple CRUD if the domain doesn't warrant separation.       |

## References

- [MSDN CQRS Guide](https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs)
- [Greg Young - CQRS Documents](https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf)