nestjs — Claude Code skill: NestJS patterns with Drizzle ORM
Gives your agent NestJS patterns: CRUD modules, JWT guards, Drizzle schemas and migrations. Handy when you are building an API on NestJS.
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a claude-codeWhat nestjs does
The skill lays out how NestJS code should be split: controller, service, repository. Your agent gets ready examples of Drizzle schemas, class-validator DTOs and transactions, so it does not invent a structure from scratch. Inside is an eight-step instruction, from installing dependencies to running migrations, plus references on guards, interceptors, microservices and GraphQL.
Install takes one command and no API key. It works in Claude, Codex, Cursor, GitHub Copilot, Gemini CLI and OpenCode. The agent is allowed Read, Write, Edit, Glob, Grep and Bash, so it can both edit files and run commands.
Some spots are easy to get wrong. The skill advises keeping transactions short and never nesting them, and the JWT guard has to run before the roles guard. Migrations go after a schema change: npx drizzle-kit generate first, then check the SQL, then npx drizzle-kit migrate. If your project already has its own data-access layer, the repository pattern here will fight it — worth checking whether you want a second way of talking to the database.
What it helps with
- scaffold a NestJS CRUD module with controller, service and repository layers
- protect routes with a JWT guard and a roles guard
- define tables in
src/db/schema.tsand generate a migration - move funds between accounts inside one Drizzle transaction
- write a unit test for a service with a mocked repository
Example prompts for the agent
- build a users CRUD module on NestJS with Drizzle, class-validator DTOs and a migration
- add a JWT guard to the users routes and put it before the roles check
- set up a NestJS microservice with Redis transport and write tests for it
How to install nestjs
1Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a claude-code2Manually: put the files in place
~/.claude/skills/nestjs/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/nestjs/
1Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a codex2Manually: put the files in place
.agents/skills/nestjs/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a cursor2Manually: put the files in place
.cursor/skills/nestjs/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install giuseppe-trisciuoglio/developer-kit nestjs2Manually: put the files in place
.github/skills/nestjs/SKILL.md1Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a gemini-cli2Platform CLI
gemini skills install https://github.com/giuseppe-trisciuoglio/developer-kit --path plugins/developer-kit-typescript/skills/nestjsManually: put the files in place
.devin/skills/nestjs/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about nestjs
How do I install nestjs in Claude?
Run npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a claude-code. The skill file lands at ~/.claude/skills/nestjs/SKILL.md.
What does the nestjs skill do?
It hands your agent NestJS patterns with Drizzle ORM: REST and GraphQL API generation, auth guards, database schemas, microservices and tests.
Does it need extra packages?
The skill tells you to install project dependencies: npm i drizzle-orm pg && npm i -D drizzle-kit tsx. Migrations run through drizzle-kit.
Source text
SKILL.md · MIT
---
name: nestjs
description: Provides comprehensive NestJS framework patterns with Drizzle ORM integration for building scalable server-side applications. Generates REST/GraphQL APIs, implements authentication guards, creates database schemas, and sets up microservices. Use when building NestJS applications, setting up APIs, implementing authentication, working with databases, or integrating Drizzle ORM.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
---
# NestJS Framework with Drizzle ORM
## Overview
Provides NestJS patterns with Drizzle ORM for building production-ready server-side applications. Covers CRUD modules, JWT authentication, database operations, migrations, testing, microservices, and GraphQL integration.
## When to Use
- Building REST APIs or GraphQL servers with NestJS
- Setting up authentication and authorization with JWT
- Implementing database operations with Drizzle ORM
- Creating microservices with TCP/Redis transport
- Writing unit and integration tests
- Running database migrations with drizzle-kit
## Instructions
1. **Install dependencies**: `npm i drizzle-orm pg && npm i -D drizzle-kit tsx`
2. **Define schema**: Create `src/db/schema.ts` with Drizzle table definitions
3. **Create DatabaseService**: Inject Drizzle client as a NestJS provider
4. **Build CRUD module**: Controller → Service → Repository pattern
5. **Add validation**: Use class-validator DTOs with ValidationPipe
6. **Implement guards**: Create JWT/Roles guards for route protection
7. **Write tests**: Use `@nestjs/testing` with mocked repositories
8. **Run migrations**: `npx drizzle-kit generate` → **Verify SQL** → `npx drizzle-kit migrate`
## Examples
### Complete CRUD Module with Drizzle
```typescript
// src/db/schema.ts
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
});
// src/users/dto/create-user.dto.ts
export class CreateUserDto {
@IsString() @IsNotEmpty() name: string;
@IsEmail() email: string;
}
// src/users/user.repository.ts
@Injectable()
export class UserRepository {
constructor(private db: DatabaseService) {}
async findAll() {
return this.db.database.select().from(users);
}
async create(data: typeof users.$inferInsert) {
return this.db.database.insert(users).values(data).returning();
}
}
// src/users/users.service.ts
@Injectable()
export class UsersService {
constructor(private repo: UserRepository) {}
async create(dto: CreateUserDto) {
return this.repo.create(dto);
}
}
// src/users/users.controller.ts
@Controller('users')
export class UsersController {
constructor(private service: UsersService) {}
@Post()
create(@Body() dto: CreateUserDto) {
return this.service.create(dto);
}
}
// src/users/users.module.ts
@Module({
controllers: [UsersController],
providers: [UsersService, UserRepository, DatabaseService],
exports: [UsersService],
})
export class UsersModule {}
```
### JWT Authentication Guard
```typescript
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
canActivate(context: ExecutionContext) {
const token = context.switchToHttp().getRequest()
.headers.authorization?.split(' ')[1];
if (!token) return false;
try {
const decoded = this.jwtService.verify(token);
context.switchToHttp().getRequest().user = decoded;
return true;
} catch {
return false;
}
}
}
```
### Database Transactions
```typescript
async transferFunds(fromId: number, toId: number, amount: number) {
return this.db.database.transaction(async (tx) => {
await tx.update(accounts)
.set({ balance: sql`${accounts.balance} - ${amount}` })
.where(eq(accounts.id, fromId));
await tx.update(accounts)
.set({ balance: sql`${accounts.balance} + ${amount}` })
.where(eq(accounts.id, toId));
});
}
```
### Unit Testing with Mocks
```typescript
describe('UsersService', () => {
let service: UsersService;
let repo: jest.Mocked<UserRepository>;
beforeEach(async () => {
const module = await Test.createTestingModule({
providers: [
UsersService,
{ provide: UserRepository, useValue: { findAll: jest.fn(), create: jest.fn() } },
],
}).compile();
service = module.get(UsersService);
repo = module.get(UserRepository);
});
it('should create user', async () => {
const dto = { name: 'John', email: '[email protected]' };
repo.create.mockResolvedValue({ id: 1, ...dto, createdAt: new Date() });
expect(await service.create(dto)).toMatchObject(dto);
});
});
```
## Constraints and Warnings
- **DTOs required**: Always use DTOs with class-validator, never accept raw objects
- **Transactions**: Keep transactions short; avoid nested transactions
- **Guards order**: JWT guard must run before Roles guard
- **Environment variables**: Never hardcode DATABASE_URL or JWT_SECRET
- **Migrations**: Run `drizzle-kit generate` after schema changes before deploying
- **Circular dependencies**: Use `forwardRef()` carefully; prefer module restructuring
## Best Practices
- Validate all inputs with global `ValidationPipe`
- Use transactions for multi-table operations
- Document APIs with OpenAPI/Swagger decorators
## References
Advanced patterns and detailed examples available in:
- `references/reference.md` - Core patterns, guards, interceptors, microservices, GraphQL
- `references/drizzle-reference.md` - Drizzle ORM installation, configuration, queries
- `references/workflow-optimization.md` - Development workflows, parallel execution strategies
© giuseppe-trisciuoglio · MIT · giuseppe-trisciuoglio/developer-kit