fastify-typescript — скилл для Claude Code: правила API на Fastify
Задаёт агенту соглашения по Fastify и TypeScript: схемы валидации, плагины, Prisma и тесты через Jest. Пригодится, когда пишете типизированный REST API.
npx skills add Mindrally/skills --skill fastify-typescript -a claude-codeЧто делает fastify-typescript
Скилл подкладывает агенту набор правил по коду: типы объявлять всегда, any не использовать, вместо enum — const-объекты, для объектных форм — интерфейсы, для импорта типов — import type. Именование тоже прописано: PascalCase для типов, camelCase для функций, kebab-case для файлов, UPPERCASE для переменных окружения.
Дальше идёт структура проекта: src/routes/{resource}/ с index.ts, handlers.ts и schemas.ts, отдельные папки под plugins, services, repositories, types, config. Валидация строится на JSON Schema и @sinclair/typebox, общие вещи выносятся в плагины через fastify-plugin, доступ к базе — через Prisma с репозиториями и транзакциями. Ошибки обрабатываются своим классом с statusCode и общим setErrorHandler, тесты пишутся на Jest через app.inject().
Скилл рассчитан на проект, где Prisma уже выбран как ORM: примеры плагина базы и репозиториев завязаны на PrismaClient, и на другом слое доступа к данным их придётся переписывать. По безопасности в правилах есть @fastify/helmet, @fastify/rate-limit, @fastify/cors и JWT через @fastify/jwt — это повод проверить, что у вас они уже подключены, а не заведены вручную.
Какие задачи решает
- разложить роуты Fastify по ресурсам и папкам
- описать схемы запроса и ответа через TypeBox
- вынести подключение Prisma в плагин с хуком
onClose - сделать единый обработчик ошибок со статусами
- написать интеграционный тест роута через
app.inject()
Примеры запросов агенту
- добавь новый ресурс
ordersпо структуре из скилла: роут, схемы, хендлеры - перепиши этот роут на TypeBox-схемы вместо ручной проверки тела
- вынеси Prisma в плагин с декоратором и отключением на
onClose
Как установить fastify-typescript
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill fastify-typescript -a claude-code2Вручную: положить файлы
~/.claude/skills/fastify-typescript/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/fastify-typescript/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill fastify-typescript -a codex2Вручную: положить файлы
.agents/skills/fastify-typescript/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill fastify-typescript -a cursor2Вручную: положить файлы
.cursor/skills/fastify-typescript/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install Mindrally/skills fastify-typescript2Вручную: положить файлы
.github/skills/fastify-typescript/SKILL.md1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill fastify-typescript -a gemini-cli2Командой платформы
gemini skills install https://github.com/Mindrally/skills --path fastify-typescriptВручную: положить файлы
.devin/skills/fastify-typescript/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill fastify-typescript -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о fastify-typescript
Как установить fastify-typescript в Claude?
Через установщик скиллов: npx skills add Mindrally/skills --skill fastify-typescript -a claude-code. После этого файл скилла лежит в ~/.claude/skills/fastify-typescript/SKILL.md.
Что делает fastify-typescript?
Даёт агенту правила написания API на Fastify с TypeScript: типизация, именование, структура папок, схемы валидации, плагины, работа с Prisma и тесты на Jest.
Нужна ли Prisma для этого скилла?
Примеры доступа к данным построены на PrismaClient и репозиториях. Если база подключена иначе, эти фрагменты придётся адаптировать под свой слой.
Исходный текст
SKILL.md · Apache-2.0
---
name: fastify-typescript
description: Guidelines for building high-performance APIs with Fastify and TypeScript, covering validation, Prisma integration, and testing best practices
metadata:
maintainer: Mindrally
source: https://github.com/Mindrally/skills
---
# Fastify TypeScript Development
You are an expert in Fastify and TypeScript development with deep knowledge of building high-performance, type-safe APIs.
## TypeScript General Guidelines
### Basic Principles
- Use English for all code and documentation
- Always declare types for variables and functions (parameters and return values)
- Avoid using `any` type - create necessary types instead
- Use JSDoc to document public classes and methods
- Write concise, maintainable, and technically accurate code
- Use functional and declarative programming patterns; avoid classes
- Prefer iteration and modularization to adhere to DRY principles
### Nomenclature
- Use PascalCase for types and interfaces
- Use camelCase for variables, functions, and methods
- Use kebab-case for file and directory names
- Use UPPERCASE for environment variables
- Use descriptive variable names with auxiliary verbs: `isLoading`, `hasError`, `canDelete`
- Start each function with a verb
### Functions
- Write short functions with a single purpose
- Use arrow functions for simple operations
- Use async/await consistently throughout the codebase
- Use the RO-RO pattern (Receive an Object, Return an Object) for multiple parameters
### Types and Interfaces
- Prefer interfaces over types for object shapes
- Avoid enums; use maps or const objects instead
- Use Zod for runtime validation with inferred types
- Use `readonly` for immutable properties
- Use `import type` for type-only imports
## Fastify-Specific Guidelines
### Project Structure
```
src/
routes/
{resource}/
index.ts
handlers.ts
schemas.ts
plugins/
auth.ts
database.ts
cors.ts
services/
{domain}Service.ts
repositories/
{entity}Repository.ts
types/
index.ts
utils/
config/
app.ts
server.ts
```
### Route Organization
- Organize routes by resource/domain
- Use route plugins for modular registration
- Define schemas alongside route handlers
- Use route prefixes for API versioning
```typescript
import { FastifyPluginAsync } from 'fastify';
const usersRoutes: FastifyPluginAsync = async (fastify) => {
fastify.get('/', { schema: listUsersSchema }, listUsersHandler);
fastify.get('/:id', { schema: getUserSchema }, getUserHandler);
fastify.post('/', { schema: createUserSchema }, createUserHandler);
fastify.put('/:id', { schema: updateUserSchema }, updateUserHandler);
fastify.delete('/:id', { schema: deleteUserSchema }, deleteUserHandler);
};
export default usersRoutes;
```
### Schema Validation with JSON Schema / Ajv
- Define JSON schemas for all request/response validation
- Use @sinclair/typebox for type-safe schema definitions
- Leverage Fastify's built-in Ajv integration
```typescript
import { Type, Static } from '@sinclair/typebox';
const UserSchema = Type.Object({
id: Type.String({ format: 'uuid' }),
name: Type.String({ minLength: 1 }),
email: Type.String({ format: 'email' }),
createdAt: Type.String({ format: 'date-time' }),
});
type User = Static<typeof UserSchema>;
const createUserSchema = {
body: Type.Object({
name: Type.String({ minLength: 1 }),
email: Type.String({ format: 'email' }),
}),
response: {
201: UserSchema,
400: ErrorSchema,
},
};
```
### Plugins and Decorators
- Use plugins for shared functionality
- Decorate Fastify instance with services and utilities
- Register plugins with proper encapsulation
```typescript
import fp from 'fastify-plugin';
const databasePlugin = fp(async (fastify) => {
const prisma = new PrismaClient();
await prisma.$connect();
fastify.decorate('prisma', prisma);
fastify.addHook('onClose', async () => {
await prisma.$disconnect();
});
});
export default databasePlugin;
```
### Prisma Integration
- Use Prisma as the ORM for database operations
- Create repository classes for data access
- Use transactions for complex operations
```typescript
class UserRepository {
constructor(private prisma: PrismaClient) {}
async findById(id: string): Promise<User | null> {
return this.prisma.user.findUnique({ where: { id } });
}
async create(data: CreateUserInput): Promise<User> {
return this.prisma.user.create({ data });
}
}
```
### Error Handling
- Use Fastify's built-in error handling
- Create custom error classes for domain errors
- Return consistent error responses
```typescript
import { FastifyError } from 'fastify';
class NotFoundError extends Error implements FastifyError {
code = 'NOT_FOUND';
statusCode = 404;
constructor(resource: string, id: string) {
super(`${resource} with id ${id} not found`);
this.name = 'NotFoundError';
}
}
// Global error handler
fastify.setErrorHandler((error, request, reply) => {
const statusCode = error.statusCode || 500;
reply.status(statusCode).send({
error: error.name,
message: error.message,
statusCode,
});
});
```
### Testing with Jest
- Write unit tests for services and handlers
- Use integration tests for routes
- Mock external dependencies
```typescript
import { build } from '../app';
describe('Users API', () => {
let app: FastifyInstance;
beforeAll(async () => {
app = await build();
});
afterAll(async () => {
await app.close();
});
it('should list users', async () => {
const response = await app.inject({
method: 'GET',
url: '/api/users',
});
expect(response.statusCode).toBe(200);
expect(JSON.parse(response.payload)).toBeInstanceOf(Array);
});
});
```
### Performance
- Fastify is one of the fastest Node.js frameworks
- Use schema validation for automatic serialization optimization
- Enable logging only when needed in production
- Use connection pooling for database connections
### Security
- Use @fastify/helmet for security headers
- Implement rate limiting with @fastify/rate-limit
- Use @fastify/cors for CORS configuration
- Validate all inputs with JSON Schema
- Use JWT for authentication with @fastify/jwt
© Mindrally · Apache-2.0 · Mindrally/skills