Хранилища (бета)
Планируйте изменения, затрагивающие несколько репозиториев: одно хранилище, много репозиториев.
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 так же, как делитесь кодом: commit, push, pull и проверяйте его самостоятельно. Спецификации и изменения получают ветки и 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и ответьте на запросы:bash# запускается из любого места; спрашивает, что создать и где openspec store setupОно задаёт три вопроса:
- Имя хранилища:
team-plans - Где должно находиться это хранилище?: предзаполнено
~/openspec/<name>, нажмите Enter, чтобы принять, или введите другой путь - Создать это хранилище?: показывает, что оно собирается создать, ответьте
Yes
Затем оно сообщает, что создало:
yamlStore 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, поэтому подключите хранилище к этому репозиторию, а затем запушьте:bash# подключите хранилище к пустому репозиторию на вашем git-хостинге cd ~/openspec/team-plans git remote add origin git@github.com:acme/team-plans.git # опубликуйте его git push -u origin mainПрисоединитесь к хранилищу (каждый член команды, один раз на машину):
bash# получите хранилище на свою машину git clone git@github.com:acme/team-plans.git ~/openspec/team-plans # сообщите OpenSpec, где оно находится openspec store register ~/openspec/team-plansyamlStore registered: team-plans Location: /Users/you/openspec/team-plans OpenSpec root: ready Registry: registeredРегистрация сообщает вашей машине, где находится это хранилище. Имя хранилища уже закоммичено внутри него, в
.openspec-store/store.yaml. Настройка зарегистрировала копию создателя, поэтому этот шаг нужен только клонированным копиям.Подтвердите, что всё работает, из любого каталога:
bash# любая команда OpenSpec достигает хранилища по имени openspec status --store team-plansyamlUsing 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 (репозиторий с кодом)
└── openspec/
├── specs/
└── changes/OpenSpec вне вашего репозитория, в хранилище (store-only)
Репозиторий не хранит собственных спецификаций или изменений. Всё, что он планирует, находится в хранилище, и одна строка в конфиге репозитория связывает их.
Обычно, когда одна команда создаёт все репозитории и планы в одном месте. Все примеры выше имеют такую форму.
team-plans (хранилище)
└── openspec/
├── specs/ спецификации репозитория живут здесь
└── changes/ его изменения тоже
▲
│ store: team-plans (связывающая строка)
web-app (репозиторий с кодом)
└── openspec/
└── config.yaml больше ничегоOpenSpec в вашем репозитории и в хранилище (store-optional)
Репозиторий остаётся repo-local для собственной работы, пока хранилище содержит общие спецификации и изменения. Внутри репозитория OpenSpec использует папку openspec/ вашего проекта и обращается к хранилищу только при передаче --store.
Обычно, когда репозиторий использовал OpenSpec до появления хранилища, или когда в основном независимый репозиторий лишь изредка касается общей работы.
team-plans (хранилище)
└── openspec/ общие спецификации и изменения
▲
│ только при передаче --store team-plans
web-app (репозиторий с кодом)
└── openspec/ собственные файлы этого репозитория
├── 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на вашей машине. Запасной вариант, когда ни одно из вышеперечисленного не применимо.
Если ни одно из этих условий не применимо и у вас есть зарегистрированные хранилища, команда завершается ошибкой и перечисляет их. Когда идентификатор одного хранилища совпадает с именем вашего репозитория в его remote origin, ошибка называет это хранилище и строку store:, которая его выбирает. OpenSpec никогда не выбирает хранилище по имени самостоятельно, потому что репозитории в разных организациях могут иметь одинаковое имя.
Когда OpenSpec выбирает хранилище, он выводит Using OpenSpec root: ... перед выводом команды.
Строка store: (проекты store-only)
Добавьте одну строку в openspec/config.yaml вашего проекта:
# web-app/openspec/config.yaml
store: team-plansВсё, что вы или ваш агент запускаете внутри вашего проекта, теперь использует хранилище, без необходимости вводить флаг:
# внутри web-app, подключено
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 остановится с ошибкой, перечисляющей ваши зарегистрированные хранилища.
- Закоммитьте её: коллеги, клонирующие ваш проект, тоже получат эту строку. Им всё равно нужно зарегистрировать хранилище на своей машине (шаг 3 из Настройки хранилища), иначе OpenSpec выдаст ошибку и попросит зарегистрировать его.
- Рядом с реальными папками: если в вашем проекте также есть папки
specs/илиchanges/, OpenSpec использует их и игнорирует строку, с предупреждением.
Установка интеграций в store-only репозитории
Запустите init из корня репозитория с кодом, чтобы установить файлы интеграции с ИИ-инструментами, не возвращая планирование в этот репозиторий:
# внутри web-app, в корне репозитория
openspec init --tools claude- Файлы интеграции: записываются в репозиторий с кодом.
openspec/config.yaml: сохраняется байт в байт, включая строкуstore:.openspec/specs/иopenspec/changes/: не создаются в репозитории с кодом.
OpenSpec отказывается выполнять эту команду из подкаталога репозитория с кодом. Запускайте её из корня репозитория.
OpenSpec также отклоняет --language здесь, потому что язык должен находиться в конфиге внешнего хранилища. Запустите init в корне хранилища или отредактируйте этот конфиг напрямую.
defaultStore на вашей машине
Установите его один раз, если каждый проект, в котором вы работаете, использует одно и то же хранилище. OpenSpec использует его как запасной вариант, когда не находит ни флага, ни локальной папки openspec/, ни строки store::
# используйте team-plans, когда ничто другое не называет хранилище
openspec config set defaultStore team-plans
# отмените это
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 репозитория, и оно окажется в хранилище:
# внутри web-app; строка store: направляет это в 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 проверяет вашу настройку, ничего не меняя, и выводит исправление для каждой находки:
# проверьте текущий корень и его хранилища
openspec doctorDoctor
Root
Location: /Users/you/openspec/team-plans
OpenSpec root: ok
Store: team-plans (metadata ok)
References
(none declared)openspec context перечисляет корень и хранилища, с которыми работает ваш текущий каталог, когда вам нужна та же картина без проверок.
Чтобы открыть хранилище и репозиторий в одном окне редактора, чтобы ваш агент мог читать оба, см. Worksets (бета).
Чтение спецификаций из другого хранилища
Ваш репозиторий может иметь собственную папку openspec/ и при этом позволить вашему агенту читать спецификации из другого хранилища. Объявите такое хранилище в секции references: в файле openspec/config.yaml репозитория:
# api-server/openspec/config.yaml
references:
- team-plansСсылки являются доступными только для чтения. Ваша работа остаётся в вашем репозитории, а ссылка лишь изменяет то, что сообщается вашему агенту.
Когда рабочий процесс создаёт артефакт, его инструкции получают индекс спецификаций из указанного хранилища, каждая с однострочным описанием и точной командой для их получения:
<referenced_stores>
<!-- Контекст из внешнего хранилища только для чтения. Получайте то, что нужно; указывайте то, что используете. -->
Хранилище team-plans (/Users/you/openspec/team-plans):
- payments: Правила для выставления счетов и возврата средств клиентам.
Получить: 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 превратит отсутствующее хранилище в готовое решение для исправления:
# вывод обрезан для подгонки
Ссылки
- team-plans: ok (/Users/you/openspec/team-plans)
- design-system: Указанное хранилище 'design-system' не зарегистрировано на этой машине.
Исправление: 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 никогда не клонирует, не подтягивает и не отправляет изменения. Устаревшая рабочая копия показывает устаревшие спецификации до тех пор, пока вы не выполните подтягивание, а ссылки читаются из того, что находится на диске.
- Одна рабочая копия на имя хранилища: регистрация второй папки под уже зарегистрированным именем завершится ошибкой с подсказкой сначала выполнить
openspec store unregister.