Sklepy (beta)
Planuj zmiany obejmujące wiele repozytoriów: jeden sklep, wiele repozytoriów.
OpenSpec normalnie znajduje się w jednym repozytorium: w folderze openspec/ obok kodu, który planuje. Sklep przenosi ten folder do własnego repozytorium, a kilka repozytoriów kodu może z niego korzystać.
Po jednorazowym ustawieniu na każdym komputerze, polecenia takie jak status, new change, i archive mogą działać w sklepie z dowolnego katalogu.
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)You share a store with git, the same way you share code: commit, push, pull, and review it yourself. Specs and changes get branches and pull requests the same way code does.
Kiedy potrzebujesz jednego
Dwa najczęstsze powody, aby używać sklepu:
- Frontend i backend w osobnych repozytoriach: jedna funkcja dotyka obu, a plan potrzebuje jednego domu zamiast dwóch części.
shop-plans (store)
└── openspec/changes/add-discounts/ one plan for the feature
▲
┌─────────┴─────────┐
│ │
storefront api
(frontend repo) (backend repo)- Jeden produkt, kilka repozytoriów klientów: Android, iOS i web są wydawane z własnych repozytoriów, ale dzielą jedną oczekiwaną zachowanie. Spec opisuje zachowanie, a nie implementację, więc jeden spec służy wszystkim trzem.
product-specs (store)
└── openspec/specs/checkout/spec.md the expected behavior
▲
┌─────────────┼─────────────┐
│ │ │
android-app ios-app web-app
(code repo) (code repo) (code repo)Możesz mieć więcej niż jeden sklep, chociaż zalecamy utrzymywanie niskiej liczby.
Konfiguracja store
Jedna osoba tworzy store, następnie wszyscy inni dołączają do niego.
Utwórz store (jedna osoba, raz na zespół). Uruchom
openspec store setupi odpowiedz na pytania:bash# run from anywhere; it asks what to create and where openspec store setupZadaje trzy pytania:
- Nazwa store:
team-plans - Gzie powinien znajdować się ten store?: wypełnione domyślnie
~/openspec/<name>, naciśnij Enter, aby zaakceptować, lub wpisz inną ścieżkę - Uworzyć ten store?: pokazuje, co zostanie utworzone, odpowiedz
Yes
Następnie zgłasza, co utworzył:
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.- Nazwa store:
Przypisz do hosta git. Najpierw utwórz pusty repozytorium
team-plansna swoim hostie. Konfiguracja nie dodaje zdalnego repozytorium git, więc połącz store z tym repozytorium, a następnie push:bash# 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 mainDołącz do store (każdy kolega z团队u, raz na maszynę):
bash# 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-plansyamlStore registered: team-plans Location: /Users/you/openspec/team-plans OpenSpec root: ready Registry: registeredRejestracja mówi maszynie, gdzie znajduje się ten store. Nazwa store'a jest już zapisana w
.openspec-store/store.yaml. Konfiguracja zarejestrowała kopię tworzącego, więc tylko sklonowane kopie potrzebują tego kroku.Potwierdź, że działa, z dowolnego katalogu:
bash# any OpenSpec command reaches the store by name 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
Rodzaje konfiguracji
OpenSpec ma trzy konfiguracje. Reszta tej strony korzysta z tych nazw:
- repo-local: OpenSpec w twoim repozytorium, bez store. Domyślny.
- store-only: twoje repozytorium nie przechowuje własnych speców ani zmian. Wszystko znajduje się w store.
- store-optional: Twój projekt ma własny folder
openspec/i również sięga po store, gdy tylko poprosisz.
Domyślny: OpenSpec w twoim repozytorium (repo-local)
openspec init tworzy folder openspec/ obok twojego kodu, a specy i zmiany tego repozytorium vivą tam. Nie jest używany żaden store. To jest konfiguracja, której uczy Ustaw projekt, i大多数 projektów nigdy nie potrzebuje innej.
web-app (code repo)
└── openspec/
├── specs/
└── changes/OpenSpec poza twoim repozytorium, w store (store-only)
Repozytorium nie przechowuje własnych speców ani zmian. Wszystko, co planuje, znajduje się w store, a jedna linia w konfiguracji repozytorium łączy je.
Często, gdy jeden zespół bud wszystie repozytoria i plany w jednym miejscu. Przykład powyżej mają tę samą postać.
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 w twoim repozytorium i w store (store-optional)
Repozytorium pozostaje repo-local dla własnej pracy, podczas gdy store przechowuje współdzielone specy i zmiany. Wewnątrz repozytorium OpenSpec używ twojego projektu openspec/ folderu i sięga po store tylko, gdy podasz --store.
Często, gdy repozytorium używa OpenSpec przed istnieniem store, lub gdy niemal niezależne repozytorium tylko okazjonalnie dotyka shared work.
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/Repozytorium może zacząć jako repo-local, a następnie przenieść swoje specy i zmiany do store. Przenieś specy i zmiany repozytorium do store pokazuje, jak.
Gdzie są tworzone artefakty przy użyciu store
Korzystając ze store, OpenSpec również musi zdecydować, gdzie zostaną utworzone artefakty. To zależy od twojej konfiguracji:
- store-only (twój projekt tylko zapisuje w store): każdy artefakt jest tworzony w store. Linia
store:poniżej rejestruje to. - store-optional (twój projekt ma własny folder
openspec/i również korzysta ze store): artefakty są tworzone w twoim projekcie, chyba że nazwiesz store w żądaniu lub podasz--storedla tej zmiany. Twój agent następnie przenosi flagę przez reszę przepływu pracy.
OpenSpec zapisuje artefakty w jednym z dwóch miejsc: folder openspec/ twojego projektu lub store. Wybiera w tej kolejności, i pierwsza opcja, która ma zastosowanie, wygrywa:
--store <id>w poleceniu. Zawsze wygrywa, z dowolnego katalogu.- Folder
openspec/twojego projektu. Jeśli projekt ma własny folderspecs/lubchanges/, OpenSpec ich używa. - Linia
store:w twoim projekcie. Jak projekt store-only rejestruje swojego store. defaultStorena twojej maszynie. Awarii, gdy żadna z powyższych opcji nie ma zastosowania.
Jeśli żadna z tych opcji nie ma zastosowania i masz zarejestrowane store, polecenie się niepowodzeniem i je wymienia. Gdy id jednego store'a pasuje do nazwy twojego repozytorium w jego zdalnym origin, błąd podaje ten store i linię store: go wybierający. OpenSpec nigdy nie wybiera store'a po nazwie na własną rkę, ponieważ repozytoria w różnych organizacjach mogą mieć tę samą nazwę.
Gdy OpenSpec wybiera store, drukuje Using OpenSpec root: ... przed wynikiem polecenia.
Linia store: (projekty store-only)
Dodaj jedną linię do openspec/config.yaml twojego projektu:
# web-app/openspec/config.yaml
store: team-plansWszystko, co ty lub twój agent uruchomisz wewnątrz twojego projektu, teraz korzysta ze store, bez konieczności wpisywania flagi:
# 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- Bez linii: uruchom zwyczajne polecenie w projekcie store-only i OpenSpec zatrzymuje się z błądem wymieniającym twoje zarejestrowane store.
- Zcommituj to: koledzy, who clone twojego projektu, również otrzymają tę linię. Nadal potrzebują store'a zarejestrowanego na ich maszynie (krok 3 Konfiguracja store), w przeciwnym razie OpenSpec błęduje i mówi, aby go zarejestrowali.
- Obok prawdziwych folderów: jeśli projekt również ma foldery
specs/lubchanges/, OpenSpec ich używa i ignoruje linię, z ostrzeżeniem.
instaluj integracje w repozytorium store-only
Uruchom init z katalogu głównego repozytorium kodu, aby zainstalować pliki integracji narzędzi AI, bez przenoszenia planowania z powrotem do tego repozytorium:
# inside web-app, at the repository root
openspec init --tools claude- Pliki integracji: zapisane w repozytorium kodu.
openspec/config.yaml: zachowany bajt po bajcie, włącznie z liniąstore:.openspec/specs/iopenspec/changes/: nie są tworzone w repozytorium kodu.
OpenSpec odmuży tego polecenia z podkatalogu repozytorium kodu. Uruchamiaj go z katalogu głównego repozytorium.
OpenSpec również odmuży --language tutaj, ponieważ języki należy do konfiguracji zewnętrznego store. Uruchom init w katalogu głównego store lub edytuj tę konfigurację bezpośrednio.
defaultStore na twojej maszynie
Ustaw raz, jeśli każdy projekt, w którym pracujesz, używ tego samego store. OpenSpec powraca do niego, gdy nie znajdzie flagi, lokalnego folderu openspec/ ani linii store:
# use team-plans whenever nothing else names a store
openspec config set defaultStore team-plans
# undo it
openspec config unset defaultStorePolecenia, które pozostają lokalne. init, update, templates, schemas oraz podpolecenia openspec schema działają tylko na bieżącym katalogu i nie przyjmują --store.
Przenieś specy i zmiany repozytorium do store
Aby zabrać repozytorium z repo-local do store-only:
- Przenieś wszystko z
openspec/specs/iopenspec/changes/repozytorium do tych samych folderów w store. - Usuń teraz puste foldery, tak aby folder
openspec/repozytorium zawierał tylkoconfig.yaml. - Dodaj linię
store:do tegoconfig.yaml.
openspec status wewnątrz repozyterium teraz zaczyna od Using OpenSpec root: team-plans.
Praca w store
Przepływy pracy się nie zmieniają, dla ciebie lub twojego agenta. Propozycja, zastosowanie i archiwizacja działają tak jak zawsze. Jedyna różnica to, gdzie są tworzone artefakty, a sekcja powyżej opisuje to.
Utwórz zmianę wewnątrz repozyterium store-only i trafia do store:
# 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- Gdzie trafiło: do repozyterium store, nie obok twojego kodu.
- Udostępnianie: zmiana istnieje tylko w twoim checkout, dopóki nie zcommitujesz i nie pushujesz repozyterium store. Koledzy widzą ją po pociągnięciu. To samo dotyczy każdego artefaktu, który przepływy pracy zapisują.
- Ścieżki w dokumentacji: gdziekolwiek dokumentacja pokazuje ścieżkę
openspec/, w konfiguracji store ten folder należy do store.
Gdy artefakty są tworzone w miejscu, którego nie oczekiwałeś, openspec doctor sprawdza twoją konfigurację bez zmiany czegokolwiek i drukuje poprawkę dla każdego znalezienia:
# 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 wymienia root i store, z których działa bieżący katalog, gdy chcesz ten sam obraz bez sprawdzeń.
Aby otwierać store i repozyterium w jednym oknie edytora, tak aby agent mógł oboje przeczytać, zobacz Worksets (beta).
Odczyt specyfikacji z innego magazynu
Twoje repozytorium może zachować własny katalog openspec/, a jednocześnie pozwalać agentowi czytać specyfikacje z innego magazynu. Zadeklaruj ten magazyn w sekcji references: w pliku openspec/config.yaml repozytorium:
# api-server/openspec/config.yaml
references:
- team-plansOdwołania są tylko do odczytu. Twoja praca pozostaje w Twoim repozytorium, a odwołanie zmienia jedynie to, co jest przekazywane agentowi.
Gdy workflow tworzy artefakt, jego instrukcje otrzymują indeks specyfikacji magazynu referencyjnego — każda z nich z jednolinijkowym podsumowaniem i dokładnym poleceniem pobrania:
<referenced_stores>
<!-- Kontekst nadrzędny tylko do odczytu. Pobieraj to, czego potrzebujesz; cytuj to, czego używasz. -->
Magazyn team-plans (/Users/you/openspec/team-plans):
- payments: Zasady pobierania opłat i zwracania środków klientom.
Pobierz: openspec show <spec-id> --type spec --store team-plans
</referenced_stores>Odwołanie może również zawierać adres URL do klonowania magazynu — dla maszyn, które jeszcze tego magazynu nie mają:
references:
- team-plans
- { id: design-system, remote: "git@github.com:acme/design-system.git" }Gdy adres URL jest zadeklarowany, openspec doctor zamienia brakujący magazyn w gotową do wklejenia poprawkę:
# dane wyjściowe zawinięte, aby pasowały
Odwołania
- team-plans: ok (/Users/you/openspec/team-plans)
- design-system: Magazyn referencyjny 'design-system' nie jest zarejestrowany na tej maszynie.
Poprawka: git clone -- git@github.com:acme/design-system.git '/Users/you/openspec/design-system' &&
openspec store register '/Users/you/openspec/design-system' --id design-systemOgraniczenia wersji beta
- Struktura może się zmienić: nazwy poleceń, flagi i formaty plików mogą zmieniać się między wydaniami. Przeczytaj tę stronę ponownie po aktualizacji.
- Brak synchronizacji — celowo: OpenSpec nigdy nie klonuje, nie wykonuje pull ani push. Nieaktualna kopia robocza pokazuje nieaktualne specyfikacje, dopóki nie wykonasz pull, a odwołania są czytane z tego, co znajduje się na dysku.
- Jedna kopia robocza na nazwę magazynu: zarejestrowanie drugiego katalogu pod już zarejestrowaną nazwą kończy się niepowodzeniem, z podpowiedzią, aby najpierw uruchomić
openspec store unregister.