Проблема: ИИ с памятью золотой рыбки
Вы открываете Cursor, начинаете новый проект. Первые промпты работают отлично. ИИ понимает архитектуру, пишет осмысленный код. Проходит час. Два. Вы возвращаетесь к задаче после перерыва. И спрашиваете: "А как там наша авторизация через OAuth2?".
Ответ: "Можете описать требования к авторизации?".
ИИ забыл. Снова. Он живет в вечном настоящем, где последние 20 строк кода — вся его вселенная. Это не его вина. Это ограничение контекстного окна. Но вы платите за эту амнезию временем и нервами.
Классическая ошибка: пытаться "напомнить" ИИ весь проект через промпт. Вы тратите 500 токенов на историю, которая забудется через следующие 500.
Решение: Spec-Driven Development с долгосрочной памятью
Вместо того чтобы пересказывать проект каждый раз, мы даем ИИ структуру. Два инструмента меняют правила игры:
- OpenSpec — формализованные спецификации в YAML. Не просто "сделай авторизацию", а точное описание эндпоинтов, моделей, зависимостей. Как в статье про OpenSpec и амнезию ИИ, но с практической интеграцией.
- Beads — граф задач. Каждая бусина (bead) это атомарная задача со статусом, зависимостями, контекстом. ИИ видит не только текущую задачу, но и всю цепочку.
- Cursor — среда, где это все собирается. Не просто редактор с чатом, а управляемый процесс разработки.
Вместе они создают систему, где ИИ работает не как случайный генератор кода, а как младший коллега с доступом к документации проекта. Как в метафоре из ИИ как младший коллега, но с конкретной реализацией.
Настройка: от хаоса к структуре
1 Устанавливаем Beads и создаем граф
Beads работает через CLI. Ставим:
npm install -g @beads/cli
# или через yarn
# yarn global add @beads/cli
Инициализируем проект:
beads init my-project
cd my-project
В папке появится файл beads.yml. Это корень вашего графа задач. Не путайте с OpenSpec — здесь мы описываем не код, а процесс.
2 Пишем OpenSpec спецификации
Рядом с beads.yml создаем папку specs/. В ней будут жить YAML файлы с описанием компонентов системы.
Пример specs/auth.yaml:
openapi: 3.0.0
info:
title: Authentication API
version: 1.0.0
description: JWT-based authentication with refresh tokens
paths:
/api/auth/login:
post:
summary: User login
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
format: email
password:
type: string
minLength: 8
responses:
'200':
description: Successful login
content:
application/json:
schema:
type: object
properties:
access_token:
type: string
refresh_token:
type: string
expires_in:
type: integer
example: 3600
/api/auth/refresh:
post:
summary: Refresh access token
# ... остальная спецификация
Это не просто документация. Это контракт, который ИИ будет использовать для генерации кода. Подход похож на Spec-Driven Development из GitHub Spec Kit, но без привязки к конкретному инструменту.
3 Связываем Beads с OpenSpec
В beads.yml добавляем ссылки на спецификации:
beads:
- id: auth-implementation
title: Implement authentication endpoints
status: todo
spec_file: specs/auth.yaml # Вот эта связь
depends_on: []
context: |
Проект использует Express.js, MongoDB.
Уже есть модель User в models/user.js
Нужно реализовать endpoints из спецификации.
Использовать библиотеку jsonwebtoken для JWT.
- id: user-profile
title: Add user profile endpoints
status: backlog
spec_file: specs/user.yaml
depends_on: [auth-implementation] # Зависимость от предыдущей задачи
context: |
После авторизации добавить CRUD для профиля.
Только для аутентифицированных пользователей.
Теперь каждая бусина знает, какую спецификацию реализовывать. И видит зависимости.
Не делайте контекст слишком общим. "Реализовать логин" плохо. "Реализовать POST /api/auth/login по спецификации specs/auth.yaml с JWT и refresh token" хорошо.
4 Интеграция с Cursor: настройка промптов
Открываем Cursor. Создаем файл .cursor/rules/dev_with_spec.md. Это наши правила для ИИ.
# Правила разработки со спецификациями
## Контекст проекта
- Используй Beads граф задач из beads.yml
- Все спецификации в папке specs/
- Перед генерацией кода проверяй текущую бусину
## Работа с текущей задачей
1. Прочитай beads.yml
2. Найди бусину со статусом 'in_progress'
3. Если есть spec_file - открой и прочитай спецификацию
4. Учти depends_on - какие задачи уже выполнены
5. Генерируй код строго по спецификации
## Формат ответов
- Сначала краткое резюме по спецификации
- Потом код
- В конце проверь зависимости от других бусин
Теперь в чате Cursor пишем не "сделай авторизацию", а:
@dev_with_spec
Начни работу над бусиной auth-implementation. Сгенерируй код для POST /api/auth/login согласно specs/auth.yaml
ИИ откроет beads.yml, найдет нужную бусину, прочитает спецификацию, учтет зависимости. И выдаст код, который соответствует именно вашему проекту.
Рабочий процесс: день из жизни разработчика со структурой
Утро. Вы открываете проект. Вместо того чтобы вспоминать, на чем остановились, делаете:
beads status
Терминал показывает:
✅ auth-implementation (done)
🔵 user-profile (in_progress) - зависит от: auth-implementation
⏳ notifications (todo)
Отлично. Работаем над user-profile. В Cursor:
@dev_with_spec
Покажи контекст для user-profile и сгенерируй GET /api/user/profile
ИИ видит, что задача зависит от auth-implementation (которая уже сделана), открывает specs/user.yaml, читает спецификацию. И генерирует код, который уже знает про авторизацию, потому что она реализована в предыдущей бусине.
Через два часа перерыв. Возвращаетесь. Снова beads status. ИИ в Cursor все помнит, потому что контекст зафиксирован в beads.yml и спецификациях. Не нужно пересказывать.
Ошибки, которые сломают систему
| Ошибка | Почему ломается | Как исправить |
|---|---|---|
| Слишком общие спецификации | ИИ будет интерпретировать по-своему. Получите код, который технически соответствует spec, но не тому, что вы хотели. | Детализируйте. Не "email: string", а "email: string, format: email, required: true". |
| Бусины-монстры | Одна бусина "Сделать весь бэкенд". ИИ перегрузит контекстное окно, потеряет фокус. | Дробите. Одна бусина = один endpoint или одна модель. |
| Игнорирование depends_on | Начнете делать user-profile до auth-implementation. ИИ сгенерирует код, который не будет работать с несуществующей авторизацией. | Всегда проверяйте beads status перед началом. Настраивайте CI, который проверяет зависимости. |
| Ручное обновление статусов | Забыли обновить beads.yml. Граф устарел, ИИ работает с неактуальной информацией. | Автоматизируйте. Скрипт, который меняет статус при коммите. Или привыкайте к дисциплине. |
Продвинутые трюки: когда базового недостаточно
Динамический контекст в Cursor
Создайте скрипт, который перед запуском Cursor генерирует контекстный файл:
#!/usr/bin/env python3
# generate_context.py
import yaml
import sys
with open('beads.yml', 'r') as f:
beads = yaml.safe_load(f)
current_bead = None
for bead in beads['beads']:
if bead.get('status') == 'in_progress':
current_bead = bead
break
if current_bead:
context = f"""
Текущая задача: {current_bead['title']}
ID: {current_bead['id']}
Контекст задачи:
{current_bead.get('context', 'Нет контекста')}
Зависимости: {', '.join(current_bead.get('depends_on', []))}
"""
with open('.cursor/current_context.md', 'w') as f:
f.write(context)
Добавьте в правила Cursor:
Перед ответом прочитай текущий контекст из .cursor/current_context.md
Теперь ИИ всегда знает, над чем вы работаете. Без напоминаний.
Интеграция с Git
Хуки Git, которые обновляют статусы бусин:
#!/bin/bash
# .git/hooks/post-commit
BEAD_ID="auth-implementation"
# Если в коммите есть изменения в auth/...
if git diff-tree --no-commit-id --name-only -r HEAD | grep -q "^src/auth/" ; then
beads update $BEAD_ID --status done
fi
Автоматизация — ключ к тому, чтобы система не развалилась через неделю.
Мультимодельный подход
Не зацикливайтесь на одной модели. Используйте разные ИИ для разных задач:
- Claude для анализа сложных спецификаций
- GPT-4 для генерации кода
- Gemini для рефакторинга (он хорош в этом, как в советах по Gemini 3)
Настройте в Cursor разные правила для разных моделей. Или используйте GigaChat через n8n для специфических задач.
Что делать, когда все равно ломается
Система не идеальна. ИИ все равно будет иногда "забывать" или misinterpret'ить спецификации. План Б:
- Логируйте промпты и ответы. Cursor сохраняет историю чатов. Когда ИИ ошибся, посмотрите, что вы ему отправили. Может, проблема в формулировке?
- Регулярно ревьюьте beads.yml. Раз в день прогоняйте
beads validate. Убедитесь, что граф не содержит противоречий. - Создайте "скорую помощь" — отдельный промпт в Cursor для исправления ошибок. "ИИ ошибся в реализации, вот что нужно исправить: ...".
- Не бойтесь ручного контроля. Система должна помогать, а не заменять ваше мышление. Как в промптах для эффективного ИИ — вы остаетесь архитектором.
И последнее: эта система не для всех проектов. Для прототипа на выходные она overkill. Для шестимесячного проекта с командой — спасение.
Начните с одного модуля. Авторизации. Настройте beads.yml, specs/auth.yaml, простые правила в Cursor. Посмотрите, как изменится workflow. Потом масштабируйте.
И да, первые два дня вы потратите на настройку. На третий день поймете, что больше не тратите время на "напомни мне про...". Это окупается.