RuleStack

Configs

Stacks

Compare

Diff

RuleStack

Configs

Stacks

Compare

Diff

Read API

RuleStack

Configs

Stacks

Compare

Diff

Read API

Configs/Cursor rules/novuhq/novu

Cursor rule

.cursor/rules/dal-repository.mdc

Rules for working with DAL repositories in the Novu monorepo

Cursor rules

Quality

46/100

Scores the file, not the repository.

Length

373 words

4 headings · 0 code blocks

Repository

39k

— · pushed 0 days ago

Last changed

3 days ago

First indexed 3 days ago.
novuhq/novu/.cursor/rules/dal-repository.mdcRawGitHub
1---
2description: Rules for working with DAL repositories in the Novu monorepo
3globs: libs/dal/**/*.ts, **/repositories/**/*.ts
4alwaysApply: false
5---
6 
7### DAL Repository Rules
8 
9#### Choosing a base class
10 
11- **New repositories must extend `BaseRepositoryV2`** — it enforces required field selection and provides auto-inferred return types (`Pick<Entity, Keys>`).
12- **Existing repositories stay on `BaseRepository`** — `BaseRepository` is deprecated but must not be changed; all 32 existing repos continue to extend it.
13- Do NOT extend `BaseRepository` for any new repository going forward.
14 
15#### BaseRepositoryV2 — required `select`
16 
17- Every read method (`find`, `findOne`, `findById`, `findBatch`, `findWithCursorBasedPagination`) requires an explicit `select` argument — there is no default `SELECT *`.
18- Use array syntax as the default: `find(query, ['_id', 'name', 'status'])`. Array syntax returns exactly the listed fields — `_id` is excluded unless explicitly included.
19- Use object syntax when you need MongoDB-style projections where `_id` is included by default: `findOne(query, { name: 1, email: 1 })`, or explicitly excluded: `findOne(query, { _id: 0, name: 1 })`.
20- Exclusion projections for non-`_id` fields (e.g. `{ name: 0 }`) are intentionally unsupported — they are a compile error.
21- Return types are automatically inferred as `Pick<Entity, Keys>` — do not manually annotate the return type.
22- Use `select: '*'` to retrieve all fields with a fully-typed `Entity` return (instead of a `Pick`). All five read methods support this overload: `find(query, '*')`, `findOne(query, '*')`, `findById(id, '*')`, `findBatch(query, '*')`, and `findWithCursorBasedPagination({ select: '*', ... })`.
23- Omitting `select` entirely is still a compile error — `'*'` is the explicit opt-in for SELECT *.
24 
25#### Enforcement (applies to both V1 and V2)
26 
27- **Never use `_model` or `MongooseModel` directly** in repository methods. Always use the inherited methods (`update`, `find`, `findOne`, `delete`, `create`, `bulkWrite`, etc.) which enforce `_environmentId` / `_organizationId` via the `EnforceEnvOrOrgIds` type.
28- All query methods must include `_environmentId` or `_organizationId` in their filter to satisfy the enforcement type constraint.
29- When adding new repository methods that need `$push`, `$pull`, or other update operators, pass the `environmentId` as a parameter and use `this.update()` with the enforcement fields.
30- For bulk operations, use `this.bulkWrite()` instead of `this._model.updateMany()`.
31- **Transactions**: start via `repository.withTransaction(async (session) => { ... })` and pass `session` to every repo call inside it (e.g. `repo.findOne(query, select, { session })`). Run all operations sequentially — parallel execution (`Promise.all`, etc.) inside a transaction is undefined behaviour in Mongoose.
32 

Sections

  • DAL Repository Rules

What it covers

do-not

Stack — with the evidence

typescript

(1.00)

javascript

(1.00)

node

(1.00)

react

(1.00)

langchain

(1.00)

jest

(1.00)

biome

(1.00)

monorepo

(0.85)

express

(0.70)

nestjs

(0.70)

mongodb

(0.70)

redis

(0.70)

tailwind

(0.70)

vite

(0.70)

playwright

(0.70)

aws

(0.70)

nx

(0.60)

pnpm

(0.60)

github-actions

(0.60)

Glob targeting

  • libs/dal/**/*.ts
  • **/repositories/**/*.ts

Format

Cursor rules

The most expressive format here. Many small .mdc files, each with frontmatter declaring when it should load, so a rule about migrations only enters context when a migration is open. Costs the most to maintain and only one editor reads it.

What the corpus says about it

Repository

Owner
novuhq
Language
—
License
—
Archived
no

All configs in this repo

Also in novuhq/novu

Diff this repo’s formats

One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?

The other instruction files in this repository
RepositoryFormatStackCoversScoreChanged
novuhq/novu.cursor/rules/api-property-optionality-hygiene.mdc · 39kCursor rulestypescriptjavascript+17gitagent-behaviour68/1003 days ago
novuhq/novu.cursor/rules/api.mdc · 39kCursor rulestypescriptjavascript+17styleapi72/1003 days ago
novuhq/novu.cursor/rules/clickhouse.mdc · 39kCursor rulestypescriptjavascript+17style42/1003 days ago
novuhq/novu.cursor/rules/context-engineering.mdc · 39kCursor rulestypescriptjavascript+17no sections16/1003 days ago
novuhq/novu.cursor/rules/dashboard.mdc · 39kCursor rulestypescriptjavascript+17style57/1003 days ago
novuhq/novu.cursor/rules/dependency-graph.mdc · 39kCursor rulestypescriptjavascript+17no sections22/1003 days ago
novuhq/novu.cursor/rules/docs-mintlify-steps.mdc · 39kCursor rulestypescriptjavascript+17do-notagent-behaviour43/1003 days ago
novuhq/novu.cursor/rules/infrastructure.mdc · 39kCursor rulestypescriptjavascript+17no sections50/1003 days ago
novuhq/novu.cursor/rules/novu.mdc · 39kCursor rulestypescriptjavascript+17style20/1003 days ago
novuhq/novu.cursor/rules/packages.mdc · 39kCursor rulestypescriptjavascript+17stylearchdependenciesdocs46/1003 days ago
novuhq/novu.cursor/rules/pnpm-release-age.mdc · 39kCursor rulestypescriptjavascript+17no sections24/1003 days ago
novuhq/novu.cursor/rules/pullrequest.mdc · 39kCursor rulestypescriptjavascript+17gitdo-not37/1003 days ago
novuhq/novu.cursor/rules/safe-api-tests.mdc · 39kCursor rulestypescriptjavascript+17setupteststyletesting-strategy+488/1003 days ago
novuhq/novu.cursor/rules/testing.mdc · 39kCursor rulestypescriptjavascript+17teststyletesting-strategy54/1003 days ago
novuhq/novu.cursor/rules/worker.mdc · 39kCursor rulestypescriptjavascript+17style65/1003 days ago
novuhq/novu.cursor/rules/ws.mdc · 39kCursor rulestypescriptjavascript+17style51/1003 days ago
novuhq/novu.deepsec/AGENTS.md · 39kAGENTS.mdtypescriptjavascript+17setupagent-behaviour33/1003 days ago
novuhq/novuAGENTS.md · 39kAGENTS.mdtypescriptjavascript+17builddo-notagent-behaviour63/1003 days ago
Diff against .cursor/rules/api-property-optionality-hygiene.mdc Diff against .cursor/rules/api.mdc Diff against .cursor/rules/clickhouse.mdc Diff against .cursor/rules/context-engineering.mdc Diff against .cursor/rules/dashboard.mdc Diff against .cursor/rules/dependency-graph.mdc Diff against .cursor/rules/docs-mintlify-steps.mdc Diff against .cursor/rules/infrastructure.mdc Diff against .cursor/rules/novu.mdc Diff against .cursor/rules/packages.mdc Diff against .cursor/rules/pnpm-release-age.mdc Diff against .cursor/rules/pullrequest.mdc Diff against .cursor/rules/safe-api-tests.mdc Diff against .cursor/rules/testing.mdc Diff against .cursor/rules/worker.mdc Diff against .cursor/rules/ws.mdc Diff against .deepsec/AGENTS.md Diff against AGENTS.md

Similar configs

Same format, overlapping stack, ranked by quality.

Same format, overlapping stack, ranked by quality
RepositoryFormatStackCoversScoreChanged
hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126Cursor rulesgobun+5setupbuildtestlint-format+6100/1003 days ago
TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45Cursor rulestypescriptpytest+15testlint-formatstylearch+5100/1003 days ago
markstev/mark-starter.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+14setuptestlint-formatstyle+699/1003 days ago
Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+13setuptestlint-formatstyle+799/1003 days ago
deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1Cursor rulestypescriptnextjs+5setuptestlint-formatstyle+799/1003 days ago
dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+15setuptestlint-formatstyle+799/1003 days ago
langflow-ai/langflow.cursor/rules/docs_development.mdc · 153kCursor rulespythonnode+16setupbuildtestlint-format+797/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45Cursor rulestypescriptpytest+15teststyletesting-strategysecurity+397/1003 days ago
RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack

RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack

RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack