Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/giuseppe-trisciuoglio-nestjs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 27% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 70% | 0% |
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.
npm i drizzle-orm pg && npm i -D drizzle-kit tsxsrc/db/schema.ts with Drizzle table definitions@nestjs/testing with mocked repositoriesnpx drizzle-kit generate → Verify SQL → npx drizzle-kit migratetypescript// 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 {}
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; } } }
typescriptasync 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)); }); }
typescriptdescribe('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: 'john@example.com' }; repo.create.mockResolvedValue({ id: 1, ...dto, createdAt: new Date() }); expect(await service.create(dto)).toMatchObject(dto); }); });
drizzle-kit generate after schema changes before deployingforwardRef() carefully; prefer module restructuringValidationPipeAdvanced patterns and detailed examples available in:
references/reference.md - Core patterns, guards, interceptors, microservices, GraphQLreferences/drizzle-reference.md - Drizzle ORM installation, configuration, queriesreferences/workflow-optimization.md - Development workflows, parallel execution strategies| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,957 | 21,121 | +25% | 1 | 1 | 0% | 3,730 | 6,379 | +71% | 0 | 0 | — |
case-02 | pass→pass | 11,185 | 6,750 | -40% | 1 | 1 | 0% | 2,017 | 2,559 | +27% | 0 | 0 | — |
case-03 | fail→pass | 11,007 | 3,786 | -66% | 1 | 1 | 0% | 2,057 | 1,984 | -4% | 0 | 0 | — |
case-04 | fail→pass | 9,698 | 13,166 | +36% | 1 | 1 | 0% | 1,827 | 3,815 | +109% | 0 | 0 | — |
case-05 | pass→pass | 6,385 | 3,524 | -45% | 1 | 1 | 0% | 1,120 | 1,907 | +70% | 0 | 0 | — |
case-06 | pass→pass | 4,141 | 3,389 | -18% | 1 | 1 | 0% | 586 | 1,904 | +225% | 0 | 0 | — |
case-07 | pass→pass | 2,437 | 2,962 | +22% | 1 | 1 | 0% | 380 | 1,793 | +372% | 0 | 0 | — |
case-08 | pass→pass | 7,094 | 4,487 | -37% | 1 | 1 | 0% | 1,266 | 2,098 | +66% | 0 | 0 | — |
case-09 | pass→pass | 15,475 | 10,528 | -32% | 1 | 1 | 0% | 2,928 | 3,475 | +19% | 0 | 0 | — |
case-10 | pass→pass | 9,620 | 6,920 | -28% | 1 | 1 | 0% | 1,549 | 2,510 | +62% | 0 | 0 | — |
case-11 | pass→pass | 13,201 | 14,898 | +13% | 1 | 1 | 0% | 2,654 | 4,195 | +58% | 0 | 0 | — |
case-12 | pass→pass | 8,411 | 7,402 | -12% | 1 | 1 | 0% | 1,597 | 2,930 | +83% | 0 | 0 | — |
case-13 | pass→pass | 16,512 | 10,526 | -36% | 1 | 1 | 0% | 1,760 | 3,173 | +80% | 0 | 0 | — |
case-14 | pass→pass | 9,653 | 7,360 | -24% | 1 | 1 | 0% | 1,693 | 2,779 | +64% | 0 | 0 | — |
case-15 | pass→pass | 9,169 | 7,689 | -16% | 1 | 1 | 0% | 1,584 | 2,771 | +75% | 0 | 0 | — |
case-16 | pass→pass | 8,046 | 3,686 | -54% | 1 | 1 | 0% | 1,361 | 1,988 | +46% | 0 | 0 | — |
case-17 | pass→pass | 8,603 | 3,750 | -56% | 1 | 1 | 0% | 1,760 | 2,005 | +14% | 0 | 0 | — |
case-18 | pass→pass | 3,216 | 2,811 | -13% | 1 | 1 | 0% | 491 | 1,780 | +263% | 0 | 0 | — |
case-19 | pass→pass | 2,882 | 3,054 | +6% | 1 | 1 | 0% | 533 | 1,865 | +250% | 0 | 0 | — |
case-20 | pass→pass | 10,398 | 4,107 | -61% | 1 | 1 | 0% | 1,707 | 1,981 | +16% | 0 | 0 | — |
case-21 | pass→pass | 10,704 | 7,497 | -30% | 1 | 1 | 0% | 2,035 | 2,829 | +39% | 0 | 0 | — |
case-22 | pass→pass | 18,113 | 14,877 | -18% | 1 | 1 | 0% | 3,293 | 4,222 | +28% | 0 | 0 | — |
case-23 | pass→pass | 15,491 | 21,320 | +38% | 1 | 1 | 0% | 3,424 | 4,525 | +32% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +13 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.