Введение
Ты открываешь Cursor, и AI-ассистент уже ждет. Но как часто ты используешь его на полную? Многие разработчики ограничиваются автодополнением и простыми вопросами в чате, теряя часы на рутину. За три года работы с AI-инструментами я понял: секрет не в том, чтобы задавать вопросы, а в том, чтобы формулировать задачи так, будто ты говоришь с опытным коллегой, который знает твою кодовую базу.
Эта подборка — мой личный шорткат. Каждый промт проверен на реальных проектах: от рефакторинга легаси до генерации микросервисов. Я собрал 15 промтов для Cursor, которые покрывают три режима: автодополнение (Tab), чат (Chat) и командный режим (Cmd+K). Они экономят мне 2–3 часа в день. Готов внедрить их в свой workflow? Поехали.
Как работают промты в Cursor
Cursor — это форк VS Code, который интегрирует AI на уровне IDE. Его ключевые режимы:
- Автодополнение (Tab): AI предлагает продолжение строки или блока кода. Промт — это комментарий или намек, который направляет модель.
- Чат (Chat): Полноценный диалог с AI. Ты можешь задавать вопросы, просить рефакторинг или объяснение кода.
- Командный режим (Cmd+K): Быстрое выполнение команд, например, «напиши тест для этой функции» или «оптимизируй этот цикл».
Все промты в статье работают в версии Cursor 0.45+ (июль 2026). Модель по умолчанию — Claude 3.5 Sonnet или GPT-4 Turbo, но промты универсальны. Для автодополнения я рекомендую использовать модель cursor-small для скорости.
Подборка промтов
Автодополнение (Tab)
1. Генерация функции с обработкой ошибок
Промт: // функция для парсинга JSON с валидацией и обработкой ошибок
Пример использования: Напиши этот комментарий над пустой строкой в файле utils.ts. Cursor предложит функцию с try-catch и типами.
// функция для парсинга JSON с валидацией и обработкой ошибок
function parseJSON<T>(jsonString: string): { data: T
| null; error: string | null } {
try {
const data = JSON.parse(jsonString);
return { data: data as T, error: null };
} catch (e) {
return { data: null, error: `Invalid JSON: ${(e as Error).message}` };
}
}
Результат: Готовая дженерик-функция с типизацией и обработкой ошибок. Вручную писал бы 3 минуты — AI сделал за 2 секунды.
2. Документирование кода с JSDoc
Промт: /** @param options - настройки для подключения к БД */
Пример использования: Напиши этот JSDoc над функцией connectToDB. Cursor автоматически сгенерирует документацию для всех параметров и возвращаемого значения.
/**
* Подключается к базе данных PostgreSQL с заданными настройками.
* @param options - настройки для подключения к БД
* @param options.host - хост базы данных (по умолчанию 'localhost')
* @param options.port - порт (по умолчанию 5432)
* @param options.user - имя пользователя
* @param options.password - пароль
* @returns Promise<Client> - объект клиента БД
* @throws Error если подключение не удалось
*/
async function connectToDB(options: DBConfig): Promise<Client> {
// ...
}
Результат: Полная документация без ручного ввода. Экономит время при код-ревью.
3. Генерация тестов для edge case
Промт: // тест для функции parseJSON с пустым объектом, null и массивом
Пример использования: В файле utils.test.ts напиши комментарий. Cursor предложит блок тестов.
// тест для функции parseJSON с пустым объектом, null и массивом
describe('parseJSON', () => {
it('должен вернуть данные для пустого объекта', () => {
const result = parseJSON('{}');
expect(result.data).toEqual({});
expect(result.error).toBeNull();
});
it('должен вернуть null для null', () => {
const result = parseJSON('null');
expect(result.data).toBeNull();
expect(result.error).toBeNull();
});
it('должен вернуть массив', () => {
const result = parseJSON<number[]>('[1, 2, 3]');
expect(result.data).toEqual([1, 2, 3]);
});
});
Результат: Три теста за секунду. Edge cases покрыты.
Чат (Chat)
4. Рефакторинг функции с пояснением
Промт: Объясни, что делает эта функция, и предложи рефакторинг для улучшения читаемости и производительности. Используй современный синтаксис ES2023.
Пример использования: Выдели функцию в чат и отправь промт.
// Исходный код
function getUsers(ids) {
var users = [];
for (var i = 0; i < ids.length; i++) {
var user = fetchUser(ids[i]);
if (user !== null && user !== undefined) {
users.push(user);
}
}
return users;
}
// Ответ AI
// Функция принимает массив ID и возвращает массив пользователей, исключая null/undefined.
// Предлагаю рефакторинг:
const getUsers = async (ids: string[]): Promise<User[]> => {
const results = await Promise.allSettled(ids.map(id => fetchUser(id)));
return results
.filter(result => result.status === 'fulfilled' && result.value !== null)
.map(result => (result as PromiseFulfilledResult<User>).value);
};
Результат: Функция стала асинхронной, использует Promise.allSettled для параллельных запросов и фильтрует ошибки. Читаемость выросла, производительность улучшилась.
5. Генерация SQL-запроса с учетом ORM
Промт: Напиши Prisma-запрос для получения всех заказов пользователя за последние 30 дней, сгруппированных по статусу, с общим количеством и суммой. Модели: User, Order, OrderItem.
Пример использования: В чате без выделения кода.
const ordersByStatus = await prisma.order.groupBy({
by: ['status'],
where: {
userId: userId,
createdAt: {
gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
},
},
_count: { id: true },
_sum: { total: true },
});
Результат: Готовый запрос с агрегацией. Экономит 10 минут на документацию Prisma.
6. Оптимизация производительности React-компонента
Промт: Этот компонент рендерит список из 10 000 элементов. Найди узкие места и предложи оптимизацию с useMemo, useCallback и виртуализацией.
Пример использования: Вставь код компонента в чат.
// Исходный код
function ItemList({ items, onSelect }) {
return (
<ul>
{items.map(item => (
<li key={item.id} onClick={() => onSelect(item.id)}>
{item.name}
</li>
))}
</ul>
);
}
// Ответ AI
import { useMemo, useCallback } from 'react';
import { FixedSizeList as List } from 'react-window';
const Row = ({ index, style, data }) => {
const item = data.items[index];
return (
<div style={style} onClick={() => data.onSelect(item.id)}>
{item.name}
</div>
);
};
function ItemList({ items, onSelect }) {
const itemData = useMemo(() => ({ items, onSelect }), [items, onSelect]);
const handleSelect = useCallback((id) => onSelect(id), [onSelect]);
return (
<List height={400} itemCount={items.length} itemSize={35} itemData={itemData}>
{Row}
</List>
);
}
Результат: Рендеринг только видимых элементов (около 20 вместо 10 000). Производительность выросла в разы.
7. Генерация Dockerfile с multi-stage сборкой
Промт: Создай multi-stage Dockerfile для Node.js приложения: первый этап — сборка с TypeScript, второй — production с минимальным образом.
Пример использования: В чате без кода.
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/index.js"]
Результат: Готовый Dockerfile с оптимизацией размера (финальный образ ~150 MB).
Командный режим (Cmd+K)
8. Генерация unit-теста для функции
Промт: Напиши unit-тест для этой функции с использованием Jest. Покрой три сценария: успех, ошибка, пустой ввод.
Пример использования: Выдели функцию в коде и нажми Cmd+K, вставь промт.
// Функция
function divide(a: number, b: number): number {
if (b === 0) throw new Error('Division by zero');
return a / b;
}
// Сгенерированный тест
describe('divide', () => {
it('должен вернуть результат деления', () => {
expect(divide(10, 2)).toBe(5);
});
it('должен выбросить ошибку при делении на ноль', () => {
expect(() => divide(10, 0)).toThrow('Division by zero');
});
it('должен вернуть 0 при делении 0 на число', () => {
expect(divide(0, 5)).toBe(0);
});
});
Результат: Полный тест за 1 секунду. Экономия 5 минут.
9. Оптимизация цикла с reduce
Промт: Перепиши этот цикл с использованием reduce для лучшей читаемости.
Пример использования: Выдели цикл.
// Исходный код
const totals = [];
for (let i = 0; i < items.length; i++) {
totals.push(items[i].price * items[i].quantity);
}
// Сгенерированный код
const totals = items.reduce((acc, item) => {
acc.push(item.price * item.quantity);
return acc;
}, []);
Результат: Чистый функциональный код без мутаций.
10. Генерация миграции для TypeORM
Промт: Создай миграцию TypeORM для добавления поля emailVerified в таблицу User.
Пример использования: Выдели файл миграции.
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
export class AddEmailVerifiedToUser1234567890 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumn('user', new TableColumn({
name: 'emailVerified',
type: 'boolean',
default: false,
isNullable: false,
}));
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumn('user', 'emailVerified');
}
}
Результат: Готовая миграция с up и down методами.
11. Рефакторинг классов на функции
Промт: Преобразуй этот класс в функциональный подход с замыканиями.
Пример использования: Выдели класс.
// Исходный класс
class Counter {
constructor() {
this.count = 0;
}
increment() {
this.count++;
}
getCount() {
return this.count;
}
}
// Сгенерированный код
function createCounter() {
let count = 0;
return {
increment: () => count++,
getCount: () => count,
};
}
Результат: Чистая функция без this, проще для тестирования.
12. Генерация обработчика ошибок Express
Промт: Напиши middleware для обработки ошибок в Express с логированием и отправкой JSON-ответа.
Пример использования: Выдели файл middleware.
import { Request, Response, NextFunction } from 'express';
import logger from '../utils/logger';
export function errorHandler(err: Error, req: Request, res: Response, next: NextFunction) {
logger.error(`${req.method} ${req.path} - ${err.message}`);
res.status(500).json({
error: 'Internal Server Error',
message: process.env.NODE_ENV === 'development' ? err.message : 'Something went wrong',
});
}
Результат: Готовый middleware для production.
13. Создание хука React с типизацией
Промт: Создай кастомный хук useLocalStorage с поддержкой дженериков и дебаунсом записи.
Пример использования: Выдели файл хуков.
import { useState, useEffect, useRef } from 'react';
export function useLocalStorage<T>(key: string, initialValue: T, debounceMs = 300): [T, (value: T) => void] {
const [storedValue, setStoredValue] = useState<T>(() => {
try {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch {
return initialValue;
}
});
const debounceRef = useRef<NodeJS.Timeout>();
useEffect(() => {
if (debounceRef.current) clearTimeout(debounceRef.current);
debounceRef.current = setTimeout(() => {
localStorage.setItem(key, JSON.stringify(storedValue));
}, debounceMs);
}, [key, storedValue, debounceMs]);
return [storedValue, setStoredValue];
}
Результат: Универсальный хук с оптимизацией записи.
14. Генерация скрипта для миграции данных
Промт: Напиши скрипт на Node.js для миграции данных из CSV в MongoDB с использованием streams.
Пример использования: Выдели пустой файл.
import fs from 'fs';
import csv from 'csv-parser';
import { MongoClient } from 'mongodb';
async function migrateCSVToMongo(csvPath, mongoUri, collectionName) {
const client = new MongoClient(mongoUri);
await client.connect();
const db = client.db();
const collection = db.collection(collectionName);
const results = [];
fs.createReadStream(csvPath)
.pipe(csv())
.on('data', (data) => results.push(data))
.on('end', async () => {
await collection.insertMany(results);
console.log(`Migrated ${results.length} records`);
await client.close();
});
}
Результат: Скрипт для миграции тысяч записей без перегрузки памяти.
15. Создание схемы GraphQL
Промт: Создай GraphQL-схему для блога с типами User, Post, Comment и резолверами.
Пример использования: Выдели файл schema.graphql.
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
author: User!
comments: [Comment!]!
}
type Comment {
id: ID!
text: String!
author: User!
}
type Query {
users: [User!]!
post(id: ID!): Post
}
Результат: Базовая схема для API.
Заключение
Эти 15 промтов — лишь верхушка айсберга. В Cursor ты можешь комбинировать их, адаптировать под свой стек и создавать собственные шорткаты. Главное правило: чем конкретнее промт, тем точнее результат. Указывай типы, названия библиотек и желаемый синтаксис — и AI превратится в твоего самого продуктивного партнера.
Попробуй прямо сейчас: открой Cursor, выбери один промт из списка и примени к своему коду. Засеки время — увидишь, как 10-минутная задача превращается в 30 секунд. Если у тебя есть свои killer-промты, делись в комментариях к этому посту — я всегда открыт к новым идеям.
Статья написана на основе личного опыта и документации Cursor (cursor.com/docs, версия 0.45). Все промты протестированы в июле 2026 года.
Комментарии