- Introduced backend patterns skill with guidelines on API design, database optimization, and server-side best practices. - Added coding standards skill outlining universal coding principles for TypeScript, NestJS, and Node.js development. - Implemented continuous learning skill to automatically extract reusable patterns from Cursor sessions. - Created NestJS best practices skill detailing architecture patterns, dependency injection, error handling, and security measures. - Included various rules and templates for NestJS best practices to ensure production-ready applications.
5.1 KiB
5.1 KiB
name, description
| name | description |
|---|---|
| project-guidelines-example | NestJS modular TDD project guidelines with Drizzle and PostgreSQL. Use when scaffolding features, reviewing structure, or aligning code with this repo's conventions. |
Project Guidelines
Project skill for this NestJS API. Contains architecture, file structure, code patterns, testing, and deployment conventions.
When to Use
Reference this skill when working on this project. It contains:
- Architecture overview
- File structure
- Code patterns
- Testing requirements
- Deployment workflow
Architecture Overview
Tech Stack:
- Backend: NestJS
- Database: PostgreSQL using Drizzle ORM
- Testing: NestJS TestingModule (unit) and Supertest (E2E)
File Structure
project/
├── src/
│ ├── main.ts # Application bootstrap
│ ├── app.module.ts # Root module
│ ├── common/ # Shared cross-cutting concerns
│ │ ├── decorators/
│ │ ├── filters/
│ │ ├── guards/
│ │ ├── interceptors/
│ │ └── pipes/
│ ├── config/ # Env and database config
│ └── modules/ # Feature modules (one folder per domain)
│ ├── auth/
│ │ ├── auth.module.ts
│ │ ├── auth.controller.ts
│ │ ├── auth.controller.spec.ts # Unit tests (colocated)
│ │ ├── auth.service.ts
│ │ ├── auth.service.spec.ts
│ │ ├── dto/
│ │ └── strategies/
│ └── users/
│ ├── users.module.ts
│ ├── users.controller.ts
│ ├── users.controller.spec.ts
│ ├── users.service.ts
│ ├── users.service.spec.ts
│ └── dto/
├── test/ # E2E tests (NestJS convention)
│ ├── jest-e2e.json
│ ├── app.e2e-spec.ts
│ ├── auth.e2e-spec.ts
│ └── users.e2e-spec.ts
├── drizzle/ # Schema and migrations
│ ├── schema.ts
│ └── migrations/
├── drizzle.config.ts # Drizzle Kit config
├── deploy/ # Deployment configs
├── docs/ # Documentation
└── scripts/ # Utility scripts
Code Patterns
Controller + DTO
export class CreateUserDto {
@IsEmail()
email: string;
@IsString()
@MinLength(8)
password: string;
}
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() dto: CreateUserDto) {
return this.usersService.create(dto);
}
}
Drizzle Repository
@Injectable()
export class UsersRepository {
constructor(@Inject(DRIZZLE) private readonly db: DrizzleDB) {}
findById(id: string) {
return this.db.query.users.findFirst({
where: eq(users.id, id),
});
}
create(data: typeof users.$inferInsert) {
return this.db.insert(users).values(data).returning();
}
}
Testing Requirements
# Unit tests
npm test
# Coverage
npm run test:cov
# E2E
npm run test:e2e
Unit test (colocated *.spec.ts):
const moduleRef = await Test.createTestingModule({
providers: [
UsersService,
{ provide: UsersRepository, useValue: { findById: jest.fn() } },
],
}).compile();
const service = moduleRef.get(UsersService);
E2E test (test/*.e2e-spec.ts):
describe('UsersController (e2e)', () => {
it('/users (POST)', () => {
return request(app.getHttpServer())
.post('/users')
.send({ email: 'ada@example.com', password: 'secret123' })
.expect(201);
});
});
Deployment Workflow
Pre-Deployment Checklist
- All tests passing locally
npm run buildsucceedsnpm run test:e2epasses- No hardcoded secrets
- Environment variables documented
- Drizzle migrations applied
Deployment Commands
npm run build
npx drizzle-kit migrate
# deploy the NestJS API (Cloud Run, Fly, or similar)
Environment Variables
DATABASE_URL=postgresql://user:pass@host:5432/tracking
PORT=3000
JWT_SECRET=...
Critical Rules
- No emojis in code, comments, or documentation
- Immutability - never mutate objects or arrays
- TDD - write tests before implementation
- 80% coverage minimum
- Many small files - 200-400 lines typical, 800 max
- No console.log in production code
- Exception filters for HTTP errors, not raw try/catch in controllers
- Input validation with class-validator DTOs
Related Skills
.agents/skills/coding-standards/- General coding best practices.agents/skills/backend-patterns/- API and database patterns.agents/skills/nestjs-best-practices/- NestJS architecture and security.agents/skills/tdd-workflow/- Test-driven development methodology