agentsclimarketplace

Ts query cqrs

Skill llodev/skills/skills/ts-query-cqrs

Collection of Agent Skills for Claude Code, Cursor, Codex, Windsurf, and any agent that speaks the open Skills spec. Ships via npm + plugin + skills add.

Install
npx -y skills add llodev/skills --skill ts-query-cqrs

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Create, review, or guide read-side queries in a TypeScript + DDD CQRS codebase. Use when the request involves `*Query` interfaces, `*.query.ts` files, read use cases (`find-*`), DTO projections for API/front consumption, pagination/filters/aggregations, or separating read (query) from write (repository/command).

SKILL.md

4.2 KB, as published. Nobody here has run it

TypeScript DDD Query (CQRS Read Side)

MANDATORY — READ ENTIRE FILE: Before any implementation step, read references/query-cqrs-pattern.md completely.

Then load the adapter reference for your infrastructure:

  • Prisma → also read references/prisma-adapter.md completely.
  • Other adapters (Firestore, MongoDB, Supabase…) → reference files not yet available; apply the principles from query-cqrs-pattern.md.

Do NOT load other DDD skills (entity, use-case, repository) unless explicitly requested.


Before You Start

Before defining a single interface, answer:

  • Read or write? If the caller needs the entity to run domain logic → Repository. If the caller only needs data to display → Query. When in doubt, check the table below.
  • Projection shape? What does the consumer actually need? Individual fields only — never return the full entity from a query.
  • Pagination? Does the list need page/pageSize? Use PaginatedResultDTO<XxxListItem>.
  • Filters? Map optional filters to conditional WHERE clauses in the adapter — never hard-code them.

Query vs Repository Decision Table

SituationUseWhy
Display a list on the front-endQueryReturns DTO, no entity overhead
Load entity before an update/deleteRepository.findByIdNeeds domain invariants (cloneWith)
Paginated list with filtersQueryJoins and selective projection are a read-side concern
Existence check before a writeRepository.findByIdReturns entity or Result.fail — not a DTO
Dashboard / aggregated panelQueryReads across tables, no entity reconstruction needed
Custom domain lookup (findByEmail) that feeds a commandRepositoryCaller needs an entity to modify

Core Rules

  • Query interface lives in core — no ORM imports, no database driver types.
  • execute(input): Promise<Result<OutputDTO>> is the only method signature.
  • The adapter maps rows directly to DTO — it never reconstructs a domain entity (toDomain).
  • Use SELECT fields explicitly in the adapter — never findMany without a select clause.
  • Paginated queries must count total records atomically with a single DB round-trip.

NEVER

  • NEVER return a domain entity from a Query — entities expose write-side invariants and domain methods that leak to consumers.
  • NEVER import the entity class or call toDomain inside a query adapter — queries map rows to DTOs directly.
  • NEVER put write-side logic (validation, cloneWith, invariant checks) inside a query.
  • NEVER use findMany without a select clause — over-fetching in projections becomes a silent performance trap.
  • NEVER run two separate DB calls for data + count — use a single atomic operation to avoid race conditions on paginated results.
  • NEVER extend or instantiate the entity class from DTO — a DTO derived from *Props must use Omit/Pick, not class inheritance.

References

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.