Хранилища (бета)
Планируйте изменения, охватывающие несколько репозиториев: одно хранилище — много репозиториев.
Обычно OpenSpec находится внутри одного репозитория — это папка openspec/ рядом с кодом, для которого ведётся планирование. Хранилище выносит эту папку в отдельный репозиторий, который могут совместно использовать сразу несколько репозиториев с кодом.
После однократной настройки на каждой машине такие команды, как status, new change и archive, могут работать с хранилищем из любой директории.
team-plans (a store: OpenSpec in its own repo)
├── .openspec-store/store.yaml the store's name
└── openspec/
├── specs/
└── changes/
▲
│ set up once on each machine,
│ shared by pushing and cloning like any repo
┌─────────────┼─────────────┐
│ │ │
web-app api-server mobile-app
(code repo) (code repo) (code repo)Для совместной работы с хранилищем используется git — точно так же, как и для работы с кодом: вы сами выполняете коммиты, отправку (push), получение (pull) и ревью. Для спецификаций и изменений создаются ветки и пул-реквесты так же, как и для кода.
Когда нужно хранилище
Две типичные причины использовать хранилище:
-
Фронтенд и бэкенд в разных репозиториях: одна функциональность затрагивает оба репозитория, и плану нужно единое место вместо двух разрозненных половин.
shop-plans (store) └── openspec/changes/add-discounts/ one plan for the feature ▲ ┌─────────┴─────────┐ │ │ storefront api (frontend repo) (backend repo) -
Один продукт, несколько клиентских репозиториев: приложения для Android, iOS и веба поставляются из собственных репозиториев, но имеют общее ожидаемое поведение. Спецификация описывает поведение, а не реализацию, поэтому одна спецификация подходит для всех трёх платформ.
product-specs (store) └── openspec/specs/checkout/spec.md the expected behavior ▲ ┌─────────────┼─────────────┐ │ │ │ android-app ios-app web-app (code repo) (code repo) (code repo)
Вы можете завести несколько хранилищ, однако мы рекомендуем обходиться минимальным их количеством.
Настройка хранилища
Один участник создаёт хранилище, а все остальные подключаются к нему.
-
Создайте хранилище (выполняется одним человеком один раз на команду). Запустите
openspec store setupи ответьте на промпты:# run from anywhere; it asks what to create and where openspec store setupБудет задано три вопроса:
- Имя хранилища:
team-plans - Где должно располагаться это хранилище?: по умолчанию подставляется
~/openspec/<name>; нажмите Enter, чтобы принять этот вариант, или введите другой путь - Создать это хранилище?: показывает, что именно будет создано; ответьте
Yes
Затем команда выведет отчёт о созданных ресурсах:
Store ready: team-plans Location: ~/openspec/team-plans OpenSpec root: ready Registry: registered Next: run normal OpenSpec commands against this store, for example: openspec new change <change-id> --store team-plans Share this store by committing and pushing it like any Git repo. - Имя хранилища:
-
Отправьте хранилище на ваш git-хостинг. Сначала создайте пустой репозиторий
team-plansна вашем хостинге. Команда настройки не добавляет удалённый репозиторий git (remote), поэтому привяжите хранилище к этому репозиторию и отправьте изменения:# connect the store to the empty repo on your git host cd ~/openspec/team-plans git remote add origin git@github.com:acme/team-plans.git # publish it git push -u origin main -
Подключитесь к хранилищу (выполняется каждым участником команды один раз на каждой машине):
# get the store onto your machine git clone git@github.com:acme/team-plans.git ~/openspec/team-plans # tell OpenSpec where it lives openspec store register ~/openspec/team-plansStore registered: team-plans Location: /Users/you/openspec/team-plans OpenSpec root: ready Registry: registeredРегистрация сообщает вашей машине, где находится это хранилище. Имя хранилища уже зафиксировано внутри него в файле
.openspec-store/store.yaml. При первоначальной настройке копия создателя регистрируется автоматически, поэтому этот шаг нужен только для клонированных копий. -
Проверьте результат из любой директории:
# any OpenSpec command reaches the store by name openspec status --store team-plansUsing OpenSpec root: team-plans (/Users/you/openspec/team-plans) No active changes. Create one with: openspec new change <name> --store team-plans
Типы конфигураций
В OpenSpec предусмотрено три типа конфигурации. Далее на странице используются следующие обозначения:
- локальная (
repo-local): OpenSpec находится внутри вашего репозитория, без хранилища. Используется по умолчанию. - только хранилище (
store-only): ваш репозиторий не хранит собственных спецификаций или изменений. Всё находится в хранилище. - опциональное хранилище (
store-optional): у вашего проекта есть собственная папкаopenspec/, но он также обращается к хранилищу, когда вы явно это запрашиваете.
По умолчанию: OpenSpec внутри вашего репозитория (repo-local)
Команда openspec init создаёт папку openspec/ рядом с вашим кодом, и все спецификации и изменения этого репозитория живут в ней. Хранилище не задействуется. Именно эта конфигурация описана в руководстве Настройка проекта, и большинству проектов ничего другого не требуется.
web-app (code repo)
└── openspec/
├── specs/
└── changes/OpenSpec вне вашего репозитория, в хранилище (store-only)
Репозиторий не хранит собственных спецификаций или изменений. Всё планирование ведётся в хранилище, а связывает их одна строка в конфигурации репозитория.
Этот вариант удобен, когда одна команда разрабатывает все репозитории и ведёт планирование в едином месте. Все приведённые выше примеры устроены именно так.
team-plans (store)
└── openspec/
├── specs/ the repo's specs live here
└── changes/ its changes too
▲
│ store: team-plans (the connecting line)
web-app (code repo)
└── openspec/
└── config.yaml nothing elseOpenSpec в вашем репозитории и в хранилище (store-optional)
Для собственных задач репозиторий работает локально (repo-local), а в хранилище лежат общие спецификации и изменения. Внутри репозитория OpenSpec использует папку openspec/ вашего проекта и обращается к хранилищу только при передаче флага --store.
Такой подход применяется, если в репозитории использовали OpenSpec ещё до появления хранилища или если преимущественно независимый репозиторий лишь изредка затрагивает общую работу.
team-plans (store)
└── openspec/ the shared specs and changes
▲
│ only when you pass --store team-plans
web-app (code repo)
└── openspec/ this repo's own
├── config.yaml
├── specs/
└── changes/Репозиторий может начать работу в режиме repo-local, а позже перенести свои спецификации и изменения в хранилище. О том, как это сделать, рассказано в разделе Перенос спецификаций и изменений репозитория в хранилище.
Где создаются артефакты при использовании хранилищ
При работе с хранилищем OpenSpec также должен определить, где именно создавать артефакты. Это зависит от вашей конфигурации:
- только хранилище (
store-only) (ваш проект пишет данные только в хранилище): каждый артефакт создаётся в хранилище. Это фиксируется строкойstore:, описанной ниже. - опциональное хранилище (
store-optional) (у вашего проекта есть собственная папкаopenspec/, и при этом он использует хранилище): артефакты создаются в вашем проекте, если только вы не укажете имя хранилища в запросе или не передадите флаг--storeдля конкретного изменения. В этом случае агент будет передавать этот флаг на остальных шагах процесса.
OpenSpec записывает артефакты в одно из двух мест: в папку openspec/ вашего проекта или в папку хранилища. Выбор происходит в следующем порядке (срабатывает первое выполненное условие):
- Флаг
--store <id>в команде. Всегда имеет наивысший приоритет при запуске из любой директории. - Папка
openspec/вашего проекта. Если в проекте есть собственные папкиspecs/илиchanges/, OpenSpec использует их. - Строка
store:в вашем проекте. Способ, которым проект в режимеstore-onlyуказывает своё хранилище. - Параметр
defaultStoreна вашей машине. Резервный вариант, если ни одно из условий выше не выполнилось.
Когда OpenSpec выбирает хранилище, перед выводом результата команды он печатает строку Using OpenSpec root: ....
Строка store: (проекты в режиме store-only)
Добавьте одну строку в файл openspec/config.yaml вашего проекта:
# web-app/openspec/config.yaml
store: team-plansТеперь всё, что вы или ваш агент запускаете внутри проекта, автоматически использует хранилище без необходимости вводить флаг:
# inside web-app, connected
openspec statusUsing OpenSpec root: team-plans (/Users/you/openspec/team-plans)
No active changes. Create one with: openspec new change <name> --store team-plans- Без этой строки: если запустить обычную команду в проекте режима
store-only, OpenSpec остановится с ошибкой и выведет список зарегистрированных хранилищ. - Зафиксируйте изменение в git: коллеги, клонировавшие ваш проект, тоже получат эту настройку. Им всё равно потребуется зарегистрировать хранилище на своей машине (шаг 3 в разделе «Настройка хранилища»), иначе OpenSpec выдаст ошибку с просьбой выполнить регистрацию.
- Рядом с реальными папками: если в вашем проекте также присутствуют папки
specs/илиchanges/, OpenSpec будет использовать их, а эту строку проигнорирует с предупреждением.
Установка интеграций в репозитории режима store-only
Запустите инициализацию из корня репозитория с кодом, чтобы установить файлы интеграции для ИИ-инструментов, не возвращая само планирование обратно в этот репозиторий:
# inside web-app, at the repository root
openspec init --tools claude- Файлы интеграции: записываются в репозиторий с кодом.
openspec/config.yaml: сохраняется байт-в-байт, включая строкуstore:.openspec/specs/иopenspec/changes/: не создаются в репозитории с кодом.
OpenSpec откажется выполнять эту команду из поддиректории репозитория с кодом. Запускайте её строго из корня репозитория.
OpenSpec также не примет здесь флаг --language, поскольку настройка языка должна находиться в конфигурации внешнего хранилища. Запустите инициализацию в корне хранилища или отредактируйте его конфигурацию напрямую.
Параметр defaultStore на вашей машине
Задайте его один раз, если все проекты, с которыми вы работаете, используют одно и то же хранилище. OpenSpec обращается к этому параметру, когда не находит ни флага, ни локальной папки openspec/, ни строки store::
# use team-plans whenever nothing else names a store
openspec config set defaultStore team-plans
# undo it
openspec config unset defaultStoreКоманды, которые остаются локальными. Команды init, update, templates, schemas, а также подкоманды openspec schema действуют только на текущую директорию и не принимают флаг --store.
Перенос спецификаций и изменений репозитория в хранилище
Чтобы перевести репозиторий из локального режима (repo-local) в режим работы только с хранилищем (store-only):
- Переместите всё содержимое папок
openspec/specs/иopenspec/changes/репозитория в соответствующие папки хранилища. - Удалите опустевшие папки, чтобы в директории
openspec/репозитория остался только файлconfig.yaml. - Добавьте строку
store:в этотconfig.yaml.
Теперь вывод openspec status внутри репозитория будет начинаться со строки Using OpenSpec root: team-plans.
Работа в хранилище
Сами процессы не меняются ни для вас, ни для вашего агента. Создание предложения, применение и отправка в архив работают точно так же, как и всегда. Единственное отличие заключается в том, где именно создаются артефакты, и это подробно разобрано в разделе выше.
Создайте изменение из репозитория в режиме store-only, и оно попадёт в хранилище:
# inside web-app; the store: line routes this to team-plans
openspec new change add-loginUsing OpenSpec root: team-plans (/Users/you/openspec/team-plans)
Created change 'add-login' at /Users/you/openspec/team-plans/openspec/changes/add-login/
Schema: spec-driven
Next: openspec status --change add-login --store team-plans- Куда оно попало: в репозиторий хранилища, а не рядом с вашим кодом.
- Совместный доступ: изменение существует только в вашей локальной рабочей копии, пока вы не сделаете коммит и не отправите репозиторий хранилища на сервер. Коллеги увидят его после pull. То же самое касается любого артефакта, создаваемого в ходе процессов.
- Пути в документации: везде, где в документации указан путь
openspec/, при использовании хранилища подразумевается соответствующая папка внутри хранилища.
Если артефакты создаются не там, где вы ожидали, команда openspec doctor проверит вашу конфигурацию без внесения изменений и выведет способ исправления для каждой найденной проблемы:
# check the current root and its stores
openspec doctorDoctor
Root
Location: /Users/you/openspec/team-plans
OpenSpec root: ok
Store: team-plans (metadata ok)
References
(none declared)Команда openspec context выводит список корневых директорий и хранилищ, с которыми работает ваша текущая директория, если вам нужна та же сводка, но без запуска проверок.
Чтобы открыть хранилище и репозиторий в одном окне редактора, предоставив агенту доступ к обоим, см. раздел Рабочие наборы (бета).
Чтение спецификаций из другого хранилища
Ваш репозиторий может сохранять собственную папку openspec/ и при этом позволять агенту читать спецификации из другого хранилища. Объявите такое хранилище в секции references: файла openspec/config.yaml вашего репозитория:
# api-server/openspec/config.yaml
references:
- team-plansСсылки работают только на чтение. Ваша работа остаётся внутри вашего репозитория, а ссылка лишь дополняет контекст, передаваемый вашему агенту.
Когда процесс создаёт артефакт, в его инструкции добавляется индекс спецификаций из связанного хранилища — с однострочным описанием каждой и точной командой для её получения:
<referenced_stores>
<!-- Read-only upstream context. Fetch what you need; cite what you use. -->
Store team-plans (/Users/you/openspec/team-plans):
- payments: Rules for charging and refunding customers.
Fetch: openspec show <spec-id> --type spec --store team-plans
</referenced_stores>В ссылке также можно указать URL для клонирования хранилища — это пригодится на машинах, где оно ещё не развёрнуто:
references:
- team-plans
- { id: design-system, remote: "git@github.com:acme/design-system.git" }Если URL объявлен, при отсутствии хранилища команда openspec doctor сформирует готовую для вставки в терминал команду исправления:
# output wrapped to fit
References
- team-plans: ok (/Users/you/openspec/team-plans)
- design-system: Referenced store 'design-system' is not registered on this machine.
Fix: git clone -- git@github.com:acme/design-system.git '/Users/you/openspec/design-system' &&
openspec store register '/Users/you/openspec/design-system' --id design-systemОграничения бета-версии
- Интерфейс может измениться: имена команд, флаги и форматы файлов могут меняться от релиза к релизу. Перечитывайте эту страницу после обновления.
- Никакой автоматической синхронизации: OpenSpec намеренно никогда не выполняет клонирование, получение (pull) или отправку (push) изменений. Устаревшая локальная копия будет показывать устаревшие спецификации, пока вы не обновите её (pull), а данные по ссылкам читаются с диска.
- Одна рабочая копия на каждое имя хранилища: попытка зарегистрировать вторую папку под уже зарегистрированным именем завершится ошибкой и подсказкой сначала выполнить
openspec store unregister.