Проблема: вы пишете один и тот же промпт в сотый раз
Вы открываете Cursor. Начинаете писать: "Создай компонент React с TypeScript, используя Tailwind CSS, экспортируй интерфейсы отдельно, добавь обработку ошибок..." Через час в другом файле: "Создай хук для работы с API, используй React Query, добавь кэширование, обработку loading states..."
Вы тратите 30% времени на написание инструкций, которые уже писали вчера. И позавчера. И на прошлой неделе.
Это не лень. Это антипаттерн разработки. В мире, где AI-кодинг стал нормой, отсутствие стандартов для промптов - это как писать код без функций.
Решение: Skills как DRY-принцип для промптов
Skills в Cursor (с версии 0.32) и аналоги в Claude Code (2025-2026 релизы) - это переиспользуемые фрагменты промптов. Не просто сохраненные шаблоны, а полноценные библиотеки с контекстом, примерами и ограничениями.
Представьте: у вас есть файл .cursorrules или .claudeskills в корне репозитория. В нем - ваши стандарты. Как ACDD для коммитов, но для ИИ-ассистентов.
1Создаем структуру Skills
Начните с простого. Создайте папку /.cursor/skills или /.claude/skills в корне проекта. Да, прямо рядом с package.json.
mkdir -p .cursor/skills
mkdir -p .claude/skillsТеперь создайте первый файл - react-component.skill:
# .cursor/skills/react-component.skill
name: "React Component with TypeScript"
description: "Стандарт для создания React компонентов"
trigger: "компонент", "component", "react"
content: |
СОЗДАЙ КОМПОНЕНТ REACT С TypeScript СЛЕДУЯ ЭТИМ ПРАВИЛАМ:
1. ИСПОЛЬЗУЙ ТОЛЬКО функциональные компоненты
2. ВСЕ интерфейсы/типы экспортируй отдельно в types.ts
3. Tailwind CSS классы группируй по логике: layout, typography, colors
4. Добавь обработку loading и error состояний
5. Компонент должен быть максимально атомарным
6. Используй named exports
7. Добавь JSDoc комментарии для пропсов
ПРИМЕР:
typescript
// types.ts
export interface ButtonProps {
variant: 'primary' | 'secondary'
onClick?: () => void
}
// Button.tsx
import { ButtonProps } from './types'
export const Button = ({ variant, onClick }: ButtonProps) => {
return (
)
}
constraints:
- "Не используй классовые компоненты"
- "Не смешивай логику и представление"
- "Всегда добавляй дефолтные значения для optional props"2Создаем Skills для разных слоев приложения
Одна из главных проблем в работе с LLM - консистентность. Сегодня компонент создан одним способом, завтра другим. Skills решают это.
Создайте набор Skills для разных задач:
api-hook.skill- для хуков работы с APIutility-function.skill- для утилитарных функцийtest.skill- для тестов (Jest/Vitest)migration.skill- для миграций базы данныхdockerfile.skill- для Docker конфигураций
Вот пример api-hook.skill:
name: "API Hook with React Query"
trigger: "api hook", "запрос", "fetch"
content: |
СОЗДАЙ ХУК ДЛЯ РАБОТЫ С API:
1. ИСПОЛЬЗУЙ React Query (TanStack Query v5+)
2. Добавь обработку всех состояний: loading, error, success
3. Используй TypeScript generics для типизации ответа
4. Добавь автоматический refetch при изменении параметров
5. Реализуй кэширование на 5 минут по умолчанию
6. Все ошибки логируй в консоль в development режиме
7. Возвращай объект с полями: data, isLoading, error, refetch
СТРУКТУРА:
typescript
import { useQuery } from '@tanstack/react-query'
import { apiClient } from '@/lib/api'
interface UseApiOptions {
endpoint: string
params?: Record
enabled?: boolean
}
export const useApi = ({
endpoint,
params,
enabled = true
}: UseApiOptions) => {
return useQuery({
queryKey: [endpoint, params],
queryFn: () => apiClient.get(endpoint, { params }),
enabled,
staleTime: 5 * 60 * 1000 // 5 минут
})
}
3Настраиваем контекстные Skills
Skills могут быть контекстно-зависимыми. В Cursor с версии 0.34+ можно создавать Skills, которые активируются только в определенных директориях.
# .cursor/skills/frontend-component.skill
name: "Frontend Component Rules"
scope: "src/components/**/*" # Работает только в components
content: |
ПРАВИЛА ДЛЯ КОМПОНЕНТОВ:
- Все компоненты в PascalCase
- Index файлы только для реэкспорта
- Тесты рядом с компонентом
- Storybook stories в отдельной папкеДля бэкенда:
# .cursor/skills/backend-service.skill
name: "Backend Service Structure"
scope: "src/services/**/*"
content: |
ПРАВИЛА ДЛЯ СЕРВИСОВ:
- Классы сервисов с суффиксом Service
- Dependency Injection через конструктор
- Все ошибки через кастомные Exception классы
- Логирование через Winston с контекстомВажно: Skills в Claude Code (на начало 2026) используют немного другой синтаксис, но концепция та же. Вместо YAML они часто используют JSON или специальный DSL. Проверяйте документацию вашей версии.
Продвинутые техники: Skills как система контроля качества
Skills для code review
Создайте Skill, который автоматически проверяет код на common issues:
name: "Code Review Assistant"
trigger: "review", "проверь", "code review"
content: |
ПРОВЕДИ CODE REVIEW С ФОКУСОМ НА:
1. БЕЗОПАСНОСТЬ:
- Нет ли хардкоденных секретов?
- SQL injection prevention?
- XSS vulnerabilities in frontend?
2. ПРОИЗВОДИТЕЛЬНОСТЬ:
- N+1 queries в бэкенде?
- Мемоизация тяжелых вычислений?
- Оптимизация ререндеров в React?
3. ЧИТАЕМОСТЬ:
- Сложные функции разделены?
- Есть JSDoc для публичных методов?
- Консистентность именования?
ФОРМАТ ОТВЕТА:
- Критические issues: блокирующие мердж
- Предупреждения: нужно исправить, но не блокирует
- Рекомендации: можно улучшитьSkills для миграций между инструментами
Если вы переходите с одного стека на другой (например, с REST на GraphQL), создайте Skill для автоматической конвертации:
name: "REST to GraphQL Migration"
trigger: "миграция", "migrate", "convert to graphql"
content: |
КОНВЕРТИРУЙ REST API ВЫЗОВЫ В GraphQL:
1. REST endpoint → GraphQL query/mutation
2. Query параметры → GraphQL variables
3. REST response nesting → GraphQL fragments
4. Добавь типизацию через GraphQL Code Generator
5. Используй Apollo Client вместо axios/fetch
ПРИМЕР КОНВЕРСИИ:
REST:
typescript
// Было
fetch('/api/users?active=true')
GraphQL:
typescript
// Стало
const GET_USERS = gql`
query GetUsers($active: Boolean!) {
users(active: $active) {
id
name
email
}
}
`
Ошибки, которые все совершают
| Ошибка | Почему проблема | Как исправить |
|---|---|---|
| Слишком общие Skills | "Создай хороший код" - бесполезно | Конкретика: какие паттерны, либы, конвенции |
| Отсутствие примеров | ИИ не понимает, что вы хотите | Всегда добавляйте работающий код-пример |
| Не обновлять Skills | Устаревшие стандарты ломают новый код | Регулярный ревью Skills как часть процесса |
| Один Skills на весь проект | Frontend и backend требуют разных правил | Раздельные Skills по доменам/директориям |
Интеграция в CI/CD и командную работу
Skills должны быть в репозитории. Это не личная настройка IDE. Это часть codebase, как eslintrc или prettier.config.
Добавьте проверку Skills в ваш CI:
# .github/workflows/validate-skills.yml
name: Validate AI Skills
on:
pull_request:
paths:
- '.cursor/skills/**'
- '.claude/skills/**'
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate Skills Syntax
run: |
# Проверяем YAML синтаксис
python -c "import yaml; \
import glob; \
for f in glob.glob('.cursor/skills/*.skill'): \
with open(f) as file: \
yaml.safe_load(file)"
- name: Check for Duplicate Triggers
run: |
# Ищем конфликтующие триггеры
python scripts/check_skill_triggers.pyСоздайте CONTRIBUTING.md раздел про Skills:
## AI Skills Guidelines
### Добавление нового Skill
1. Создай файл в `.cursor/skills/[name].skill`
2. Формат: YAML с полями name, trigger, content, constraints
3. Добавь как минимум один рабочий пример кода
4. Протестируй на реальной задаче
5. Открой PR с изменениями
### Модификация существующего Skill
1. Не ломай обратную совместимость
2. Если меняешь триггеры - проверь конфликты
3. Обнови документацию если нужно
### Best Practices
- Один Skill = одна ответственность
- Конкретные примеры лучше общих инструкций
- Тестируй Skills перед мерджемSkills для разных ИИ-ассистентов
У вас в команде используют и Cursor, и Claude Code, и может быть что-то еще? Создайте конвертер.
Простейший Python скрипт для конвертации:
# scripts/convert_skills.py
import yaml
import json
import sys
def convert_cursor_to_claude(cursor_skill_path):
"""Конвертирует Cursor Skill в Claude Code формат"""
with open(cursor_skill_path, 'r') as f:
cursor_data = yaml.safe_load(f)
# Claude Code использует JSON с другим structure
claude_skill = {
"name": cursor_data['name'],
"triggers": cursor_data.get('trigger', []),
"instructions": cursor_data['content'],
"constraints": cursor_data.get('constraints', []),
"version": "1.0",
"created": "2026-02-20"
}
output_path = cursor_skill_path.replace('.cursor/', '.claude/')
output_path = output_path.replace('.skill', '.json')
with open(output_path, 'w') as f:
json.dump(claude_skill, f, indent=2, ensure_ascii=False)
print(f"Конвертировано: {output_path}")
if __name__ == "__main__":
if len(sys.argv) > 1:
convert_cursor_to_claude(sys.argv[1])Когда Skills не работают (и что делать)
Бывает. ИИ проигнорировал ваш прекрасный Skill. Причины:
- Конфликт триггеров: Два Skills с одинаковыми триггерами. Решение: сделайте триггеры более специфичными.
- Слишком длинный content: ИИ теряет контекст. Решение: разбейте на несколько Skills.
- Устаревшая версия IDE: Cursor до 0.32 не поддерживает Skills. Решение: обновитесь.
- Некорректный YAML: Проверьте синтаксис. Решение: используйте yamllint.
Мой лайфхак: добавьте в каждый Skill секцию "ВАЖНО: ПРОЧТИ ЭТО ПЕРЕД ГЕНЕРАЦИЕЙ КОДА". Это как хук для внимания ИИ.
Собираем все вместе: репозиторий с готовыми Skills
Создайте шаблонный репозиторий со всеми Skills вашей компании. Новый разработчик клонирует - и сразу работает по стандартам.
git clone https://github.com/your-company/ai-standards.git
cd your-project
cp -r ../ai-standards/.cursor .
cp -r ../ai-standards/.claude .Или используйте как submodule:
git submodule add https://github.com/your-company/ai-standards.git .ai-standards
ln -s .ai-standards/.cursor .cursor
ln -s .ai-standards/.claude .claudeЧто будет дальше с Skills
На 2026 год вижу тренды:
- Versioning: Skills с версиями и миграциями между ними
- Testing: Юнит-тесты для Skills (да, тесты для промптов)
- Marketplace: Публичные репозитории Skills как пакеты
- AI для AI: ИИ, который предлагает улучшения для ваших Skills
Уже сейчас можно создавать Agent Skills для более сложных сценариев.
Мой прогноз: к концу 2026 Skills станут таким же обязательным атрибутом репозитория, как package.json. Компании будут нанимать "AI Standards Engineers" - людей, которые только и делают, что пишут и поддерживают Skills.
А пока - начните с трех Skills. Для компонентов, для API, для тестов. Через неделю добавите еще два. Через месяц у вас будет собственная библиотека стандартов, которая работает пока вы спите.
P.S. Если ваш ИИ все еще "тупит" после настройки Skills - проверьте, не используете ли вы устаревшие техники промптинга. Иногда проблема не в инструменте, а в том, как мы им пользуемся.