nestjs — скилл для Claude Code: NestJS с Drizzle ORM
Подсказывает агенту паттерны NestJS: CRUD-модули, JWT-гарды, схемы Drizzle и миграции. Пригодится, когда собираешь API на NestJS.
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a claude-codeЧто делает nestjs
Скилл описывает, как в NestJS раскладывать код по слоям: контроллер, сервис, репозиторий. Агент получает готовые примеры схем Drizzle, DTO с class-validator и транзакций, поэтому не изобретает структуру заново. Внутри — инструкция из восьми шагов, от установки зависимостей до прогона миграций, плюс справочники по гардам, интерцепторам, микросервисам и GraphQL.
Ставится одной командой, отдельного ключа API не требует. Работает в Claude, Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Агенту разрешены Read, Write, Edit, Glob, Grep и Bash — он может и файлы править, и команды запускать.
Есть места, где легко ошибиться. Транзакции скилл советует держать короткими и не вкладывать одну в другую, а JWT-гард должен идти раньше гарда ролей. Миграции запускаются после правки схемы: сначала npx drizzle-kit generate, потом проверка SQL, потом npx drizzle-kit migrate. Если в проекте уже есть свой слой доступа к данным, паттерн репозитория из скилла будет с ним спорить — это повод проверить, стоит ли тянуть вторую схему работы с базой.
Какие задачи решает
- собрать CRUD-модуль на NestJS со слоями контроллер-сервис-репозиторий
- закрыть маршруты JWT-гардом и гардом ролей
- описать таблицы в
src/db/schema.tsи сгенерировать миграцию - провести перевод между счетами внутри одной транзакции Drizzle
- написать юнит-тест сервиса с замоканным репозиторием
Примеры запросов агенту
- сделай CRUD-модуль users на NestJS с Drizzle, DTO через class-validator и миграцией
- накинь JWT-гард на маршруты users и поставь его перед проверкой ролей
- подними микросервис на NestJS с Redis-транспортом и напиши тесты
Как установить nestjs
1Через Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a claude-code2Вручную: положить файлы
~/.claude/skills/nestjs/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/nestjs/
1Через Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a codex2Вручную: положить файлы
.agents/skills/nestjs/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a cursor2Вручную: положить файлы
.cursor/skills/nestjs/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install giuseppe-trisciuoglio/developer-kit nestjs2Вручную: положить файлы
.github/skills/nestjs/SKILL.md1Через Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a gemini-cli2Командой платформы
gemini skills install https://github.com/giuseppe-trisciuoglio/developer-kit --path plugins/developer-kit-typescript/skills/nestjsВручную: положить файлы
.devin/skills/nestjs/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о nestjs
Как установить nestjs в Claude?
Выполни npx skills add giuseppe-trisciuoglio/developer-kit --skill nestjs -a claude-code. Файл скилла появится по пути ~/.claude/skills/nestjs/SKILL.md.
Что делает скилл nestjs?
Даёт агенту паттерны NestJS вместе с Drizzle ORM: генерацию REST и GraphQL API, гарды аутентификации, схемы базы, микросервисы и тесты.
Нужно ли что-то доустанавливать?
Скилл советует поставить зависимости проекта: npm i drizzle-orm pg && npm i -D drizzle-kit tsx. Миграции запускаются через drizzle-kit.
Исходный текст
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