К основному содержанию
правило

nestjs-anti-hallucination-cursorrules-prompt-file — правило Cursor

Набор инструкций для Cursor, который запрещает модели выдумывать несуществующие импорты NestJS, использовать устаревший TypeORM и генерировать небезопасный код.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/nestjs-anti-hallucination-cursorrules-prompt-file.mdc
Открыть на GitHub

Что делает nestjs-anti-hallucination-cursorrules-prompt-file

Правило переопределяет стандартную генерацию кода в проектах на NestJS. Оно блокирует типичные галлюцинации нейросетей: фантомные пути импорта вроде @nestjs/core/decorators или @nestjs/swagger/decorators, устаревший пакет nestjs-redis и переходные библиотеки. Вместо устаревшего Bull правило направляет модель на @nestjs/bullmq с классом WorkerHost.

Внутри зафиксированы строгие требования к архитектуре и типам. Модели запрещено генерировать тип any, вызывать getRepository() напрямую вне провайдеров и отдавать res.json() в контроллерах без явной причины. Для конфигураций правило требует метод ConfigService.getOrThrow, а для базы данных блокирует synchronize: true и сырые SQL-запросы без параметров.

Без включённого ValidationPipe в main.ts валидация DTO сломается, поэтому правило напоминает настроить глобальные пайпы сразу при создании контрактов.

Какие задачи решает

  • Предотвратить выдуманные пути импортов в NestJS и TypeORM
  • Перевести очереди с устаревшего @nestjs/bull на @nestjs/bullmq
  • Исключить тип any и нетипизированные события в доменной логике
  • Заблокировать опасные параметры synchronize: true и сырой SQL

Примеры запросов агенту

  • Напиши сервис очередей для обработки фоновых задач с BullMQ
  • Создай модуль пользователей с TypeORM и строгой валидацией DTO
  • Настрой подключение к базе данных через ConfigService без хардкода

Как установить nestjs-anti-hallucination-cursorrules-prompt-file

Вручную: положить файлы

.cursor/rules/nestjs-anti-hallucination-cursorrules-prompt-file.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о nestjs-anti-hallucination-cursorrules-prompt-file

Как установить nestjs-anti-hallucination-cursorrules-prompt-file в Cursor?

Сохраните содержимое правила в файл .cursor/rules/nestjs-anti-hallucination-cursorrules-prompt-file.mdc в корне вашего проекта.

Что делает nestjs-anti-hallucination-cursorrules-prompt-file?

Правило пресекает генерацию устаревших конструкций NestJS, отсекает несуществующие пакеты и обязывает ИИ использовать актуальные паттерны внедрения зависимостей.

Почему правило запрещает прямой вызов getRepository() в TypeORM?

Начиная с TypeORM 0.3 метод getRepository() признан устаревшим, поэтому правило требует внедрять репозитории через конструктор с помощью декоратора @InjectRepository().

Исходный текст

nestjs-anti-hallucination-cursorrules-prompt-file.mdc · CC0-1.0
---
description: "Cursor rules that block deprecated, phantom, or incorrect NestJS imports, decorators, providers, modules, and testing patterns."
globs: **/*
alwaysApply: false
---
# NestJS Anti-Hallucination Rules

These rules OVERRIDE all other generation behavior. Check EVERY line of generated code against these rules.

## Banned Imports & Phantom Packages

### NEVER import these — they don't exist or are deprecated:
```
❌ @nestjs/core/decorators    — not a real export path
❌ @nestjs/swagger/decorators — import from @nestjs/swagger directly
❌ @nestjs/typeorm/repository — not a real export path
❌ @nestjs/passport/strategies — import from passport-jwt, passport-local, etc.
❌ @nestjs/bull/decorators     — import from @nestjs/bullmq (bull is legacy)
❌ nestjs-redis               — use @nestjs-modules/ioredis or ioredis directly
❌ @nestjs/cqrs/decorators    — import from @nestjs/cqrs directly
❌ nestjs-config              — use @nestjs/config (official)
❌ nestjs-pino/logger          — import from nestjs-pino directly
```

### Correct import paths:
```typescript
// ✅ Swagger
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';

// ✅ TypeORM
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DataSource } from 'typeorm';

// ✅ BullMQ (NOT Bull)
import { InjectQueue, Processor, WorkerHost } from '@nestjs/bullmq';

// ✅ Config
import { ConfigService, ConfigModule } from '@nestjs/config';

// ✅ Passport
import { AuthGuard } from '@nestjs/passport';
import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt';

// ✅ CQRS
import { CommandHandler, ICommandHandler, EventBus } from '@nestjs/cqrs';
```

## Deprecated Patterns — NEVER Generate These

### 1. getRepository() outside providers
```typescript
// ❌ DEPRECATED — removed in TypeORM 0.3+
const repo = getRepository(User);
const user = await getConnection().getRepository(User).find();

// ✅ CORRECT — inject via constructor
constructor(
  @InjectRepository(User)
  private readonly userRepo: Repository<User>,
) {}
```

### 2. @nestjs/bull (use @nestjs/bullmq)
```typescript
// ❌ OLD — @nestjs/bull with @Process decorator
import { Process, Processor } from '@nestjs/bull';
@Processor('queue')
class MyProcessor {
  @Process() async handle(job: Job) {}
}

// ✅ CURRENT — @nestjs/bullmq with WorkerHost
import { Processor, WorkerHost } from '@nestjs/bullmq';
@Processor('queue')
class MyProcessor extends WorkerHost {
  async process(job: Job): Promise<void> {}
}
```

### 3. Express-specific middleware mistakes
```typescript
// ❌ WRONG — Express req/res types in NestJS
import { Request, Response } from 'express';
@Get()
async findAll(@Req() req: Request, @Res() res: Response) {
  res.json(data); // Bypasses interceptors, serialization, exception filters
}

// ✅ CORRECT — Use NestJS decorators, return values
@Get()
async findAll(@Query() query: FindAllQueryDto): Promise<UserResponseDto[]> {
  return this.usersService.findAll(query);
}

// Only use @Res() when streaming files or SSE — add { passthrough: true }
@Get('download')
async download(@Res({ passthrough: true }) res: Response) {
  res.set('Content-Type', 'application/octet-stream');
  return new StreamableFile(stream);
}
```

### 4. Wrong decorator combinations
```typescript
// ❌ WRONG — @Injectable() on a controller
@Injectable()
@Controller('users')
export class UsersController {}

// ❌ WRONG — @Controller() on a service
@Controller()
@Injectable()
export class UsersService {}

// ❌ WRONG — @Body() in a GET handler
@Get()
async findAll(@Body() body: any) {} // GET requests should not have a body

// ❌ WRONG — Both @Param and @Query with same name
@Get(':id')
async findOne(@Param('id') paramId: string, @Query('id') queryId: string) {}
```

### 5. class-validator / class-transformer mistakes
```typescript
// ❌ WRONG — Validation without enabling in main.ts
// (AI often forgets this critical line)
// main.ts MUST have:
app.useGlobalPipes(new ValidationPipe({
  whitelist: true,            // Strip unknown properties
  forbidNonWhitelisted: true, // Throw on unknown properties
  transform: true,            // Auto-transform payloads to DTO instances
  transformOptions: {
    enableImplicitConversion: true,
  },
}));

// ❌ WRONG — Mixing validation decorators with wrong transform
export class CreateUserDto {
  @IsString()
  name: string;

  @IsNumber()
  age: string; // Type mismatch! Decorator says number, type says string
}

// ✅ CORRECT — Types match decorators
export class CreateUserDto {
  @IsString()
  @IsNotEmpty()
  name: string;

  @IsInt()
  @Min(0)
  age: number;
}
```

### 6. Async module pitfalls
```typescript
// ❌ WRONG — useFactory without async when awaiting
TypeOrmModule.forRootAsync({
  useFactory: (config: ConfigService) => ({
    type: 'postgres',
    url: config.get('DATABASE_URL'), // Not awaited, no inject
  }),
})

// ✅ CORRECT
TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: async (config: ConfigService) => ({
    type: 'postgres',
    url: config.getOrThrow<string>('DATABASE_URL'),
    autoLoadEntities: true,
    synchronize: false, // NEVER true in production
  }),
})
```

## Type Safety Rules

### NEVER generate `any`
```typescript
// ❌ BANNED
catch (error: any) { ... }
const data: any = await response.json();
private cache = new Map<string, any>();

// ✅ REQUIRED
catch (error: unknown) {
  if (error instanceof DomainError) { ... }
  throw error;
}
const data = await response.json() as PaymentGatewayResponse;
private cache = new Map<string, CachedSession>();
```

### NEVER generate untyped event payloads
```typescript
// ❌ WRONG
eventBus.emit('order.created', { order });

// ✅ CORRECT — Typed events
export class OrderCreatedEvent {
  constructor(
    public readonly orderId: string,
    public readonly userId: string,
    public readonly totalAmount: number,
    public readonly occurredAt: Date = new Date(),
  ) {}
}
eventBus.emit(new OrderCreatedEvent(order.id, order.userId, order.total));
```

## Configuration Safety

### NEVER generate hardcoded values for:
- Database connection strings
- API keys or secrets
- Port numbers
- Feature flags
- External service URLs

### ALWAYS use ConfigService with getOrThrow:
```typescript
// ❌ WRONG
const port = process.env.PORT || 3000;
const dbUrl = process.env.DATABASE_URL;

// ✅ CORRECT
const port = this.configService.getOrThrow<number>('app.port');
const dbUrl = this.configService.getOrThrow<string>('database.url');
```

## Database Safety

### NEVER generate:
```typescript
// ❌ synchronize: true in production config
// ❌ DROP TABLE or TRUNCATE in migration files
// ❌ Raw SQL without parameterized queries
await this.dataSource.query(`SELECT * FROM users WHERE id = '${userId}'`); // SQL injection!

// ✅ CORRECT
await this.dataSource.query(`SELECT * FROM users WHERE id = $1`, [userId]);
```

## Remember
- If you're unsure whether a package exists, DO NOT import it. Ask or check.
- If you're generating a NestJS pattern you haven't seen in the official docs, STOP and reconsider.
- When in doubt, generate LESS code with correct patterns rather than MORE code with guesses.

© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules

Похожие правила IDE

Все правила IDE по теме «Бэкенд и API» →
typespec-m365-copilot официальный github Правило подсказывает, как описывать агентов и API-плагины Microsoft 365 Copilot на TypeSpec. Срабатывает при работе с файлами .tsp. ★ 40 451звёзд репо typescript-mcp-server официальный github Правило подсказывает Copilot, как писать MCP-серверы на TypeScript SDK: классы, схемы на zod, транспорты и типовые ошибки. ★ 40 451звёзд репо springboot официальный github Правило задаёт Copilot стиль кода для Spring Boot: внедрение зависимостей, конфигурация, логирование и проверка сборки. ★ 40 451звёзд репо springboot-4-migration официальный github Инструкция для GitHub Copilot по переводу проектов со Spring Boot 3.x на 4.0. Помогает обновить зависимости в Gradle Kotlin DSL, каталоги версий и имена стартеров. ★ 40 451звёзд репо ruby-on-rails официальный github Задаёт для GitHub Copilot стандарты архитектуры Rails: тонкие контроллеры, сервисные объекты и строгие миграции. Помогает писать предсказуемый бэкенд на Ruby. ★ 40 451звёзд репо quarkus официальный github Задаёт стандарты разработки на Quarkus для GitHub Copilot при работе с Java и сборщиками. Направляет генерацию сервисов, конфигураций и тестов. ★ 40 451звёзд репо

Из того же набора210

nextjs-app-router-cursorrules-prompt-file Правило для Cursor, которое задаёт агенту привычки Next.js App Router: серверные компоненты по умолчанию, файловый роутинг, отдельные файлы для загрузки и ошибок. ★ 41 024звёзд репо next-type-llm Правило для Cursor под стек Next.js, shadcn/ui и Python-бэкенд для LLM. Задаёт жёсткую структуру ответов и контроль многословности. ★ 41 024звёзд репо network-troubleshoot Правило ведёт агента через безопасную диагностику сетевых сбоев: от сбора ошибки до проверки результата. ★ 41 024звёзд репо netlify-official-cursorrules-prompt-file Правило для Cursor, которое задаёт агенту официальные соглашения Netlify: типы функций, работа с окружением и запрет лишних CORS-заголовков. ★ 41 024звёзд репо nativescript Правило задаёт практики для NativeScript-приложений на TypeScript, Vue и других поддержанных стеках. Пригодится для мобильного UI и нативного кода. ★ 41 024звёзд репо nativescript-cursorrules-prompt-file Правило Cursor, которое задаёт агенту структуру проекта и стек для NativeScript: TypeScript, навигация, защищённое хранилище. ★ 41 024звёзд репо momen-cursurrules-prompt-file Задаёт правила Cursor для разработки фронтенда с бэкендом Momen.app. Настраивает клиент GraphQL, вызовы Actionflows и работу с подписками. ★ 41 024звёзд репо medusa Правило задаёт Cursor рамки для кода на Medusa: воркфлоу, модели данных, сервисы и админка пишутся по одному шаблону. ★ 41 024звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой