OpenSpec Agent Sözleşmesi
openspec CLI'nin makine tarafından okunabilir yüzeyleri, src/ ile doğrulanmıştır (capstone denetimi, 2026-06-11). Aşağıdaki her şekil, üreten koddan belgelenmiştir.
1. Genel kurallar
- Her çağrıda tek JSON belgesi.
--jsonmodunda stdout tam olarak bir JSON belgesi taşır (2 boşluklu güzel yazdırma). İnsan metni, döner göstergeler ve depolama pankartı stderr'e gider. - Depolama pankartı. İnsan modunda, seçilen depolama kökü stderr'e
Using OpenSpec root: <id> (<path>)yazdırır. JSON modunda asla yazdırılmaz. - Anahtar büyük/küçük harf kullanımı yüzeye bağlıdır (Bilinen tutarsızlıklara bakın): store/doctor/context yüklemeleri
snake_casekullanır; iş akışı yüklemeleri (status,instructions,new change,validate,list)camelCasekullanır, ancak gömülürootnesnesi her zamanstore_idkullanır. - İsteğe bağlı anahtarlar çoğu yüklemelerde atlanır, null olarak bırakılmaz (ör.
root.store_id,member.path). Açıkçanullkullanan istisnalar her şekil için belirtilir (store doctorgit.*, hata yüklemeleri).
2. Tanı zarfı
Her makinede okunabilir tanı (StoreDiagnostic) için aynı zarf şekli kullanılır:
{
"severity": "error" | "warning" | "info",
"code": "snake_case_string",
"message": "human sentence",
"target": "dotted.surface (optional)",
"fix": "one actionable sentence/command (optional)"
}Tanılar iki konumda görünür: sağlık bulguları için durum dizileri (status: StoreDiagnostic[] üst düzeyde veya girdi başına) ve komut başarısızlığında tek öğeli bir status dizisine dönüştürülen fırlatılan hatalar.
3. Kök seçimi ve RootOutput
Tüm kök çözümleyen komutlar (list, show, validate, status, instructions, instructions apply, instructions archive, new change, archive, doctor, context, schemas) bir OpenSpec kökünü aşağıdaki öncelikle çözümler:
--store <id>→ kayıtlı mağazanın kökü (source: "store").- Aksi takdirde,
openspec/içeren en yakın üst dizin: planlama şekli →source: "nearest"(store:işaretçisi stderr uyarısıyla yok sayılır); geçerli birstore:işaretçisi olan yalnızca yapılandırma dizini → o mağaza,source: "declared". - En yakın kök yok + genel
defaultStoreayarlanmış (openspec config set defaultStore <id>) → o mağaza,source: "global_default"; geçersiz bir kimlik, temel mağaza hatası veopenspec config unset defaultStoreadını taşıyan birfixile başarısız olur. - En yakın kök yok, varsayılan yok ve kayıtlı mağazalar mevcut →
no_root_with_registered_storeshatası. - Kök yok, varsayılan yok, mağaza yok: komutlar mevcut çalışma dizinini
source: "implicit"olarak kabul edebilir; ancakdoctor,context,listve topluvalidatebunun yerineno_openspec_rootile başarısız olur.list,openspec/project.mdile eski projeler için örtülü geri dönüşü korur.
Başarılı JSON yükleri normalde kökü içerir; schemas --json başarılı olduğunda kasıtlı olarak §4.13'te belgelenen uyumluluk düz dizisi olarak kalır:
"root": { "path": "/abs/path", "source": "store" | "declared" | "global_default" | "nearest" | "implicit", "store_id": "id (only when store-selected)" }Kök-başarısızlık sözleşmesi: JSON modunda bir çözümleme başarısızlığı { ...commandNullShape, "status": [diagnostic] } çıktısını stdout'a yazdırır ve 1 ile çıkar.
4. Komut JSON şekilleri
4.1 list --json
{ "changes": [ { "name", "completedTasks", "totalTasks", "lastModified", "status": "no-tasks"|"complete"|"in-progress" } ], "root": RootOutput } — burada değişiklik başına status'un bir dize sabiti olduğuna dikkat edin. --specs: { "specs": [ { "id", "requirementCount" } ], "root" }.
4.2 show <item> --json
Değişiklik: { "id", "title", "deltaCount", "deltas": [...], "root" }. Spesifikasyon: { "id", "title", "overview", "requirementCount", "requirements": [...], "metadata": { "version", "format", "sourcePath"? }, "root" }.
4.3 validate --json
{ "items": [ { "id", "type": "change"|"spec", "valid", "issues": [ { "level", "path", "message", "line"?, "column"? } ], "durationMs" } ], "summary": { "totals": {items,passed,failed}, "byType": {...} }, "version": "1.0", "root" }. Herhangi bir öğe başarısız olduğunda 1 ile çıkar.
4.4 status --json
{ "changeName", "schemaName", "planningHome"?: { "kind", "root", "changesDir", "defaultSchema" }, "changeRoot", "artifactPaths": { "<id>": {outputPath, resolvedOutputPath, existingOutputPaths} }, "nextSteps": ["..."], "actionContext": { "mode": "repo-local", "sourceOfTruth": "repo", "planningArtifacts", "linkedContext", "allowedEditRoots", "requiresAffectedAreaSelection", "constraints" }, "isPlanningComplete", "isComplete", "applyRequires", "artifacts": [ {id, outputPath, status: "done"|"skipped"|"ready"|"blocked", requires, missingDeps?} ], "root" }. isPlanningComplete her atlanmamış planlama kalıntısının var olduğu anlamına gelir; atlanan kalıntılar oluşturulmadan karşılanmış sayılır. Bu, gerçekleme görevlerinin tamamlandığı anlamına gelmez. isComplete aynı değere sahip uyumluluk takma adı olarak korunur. Her kalıntının requires alanı, doğrudan bağımlı kimliklerini içerir (her durum için mevcuttur, böylece kalıntı done olsa bile geçişli gerekli küme hesaplanabilir); missingDeps yalnızca blocked olduğunda görünür. artifacts dizisi bağımlılık sırasındadır; aynı anda hazır hale gelen kalıntılar arasındaki eşitliği şemanın artifacts: bildirim sırası bozar (asla alfabetik değildir), bu nedenle ilk ready girdisi yazılacak bir sonraki kalıntıdır; missingDeps aynı sırayı kullanır. "skipped", .openspec.yaml dosyasında skip_specs: true bildiren bir değişiklikte generates yolu specs/ altında olan bir kalıntıyı işaretler; bağımlılıkları karşılar ancak oluşturulmamalıdır. Aktif değişiklik yok: { "changes": [], "message", "root" }, çıkış 0.
--all (toplu, --change ile karşılıklı dışlayan — bunları birleştirmek { "changes": [], "root": null, "status": [d] } boş-şekli ile hata verir): { "changes": [ <değişiklik başına durum nesnesi, değişiklik başına kök yok>, ... ], "root" }, değişiklik adına göre sıralanır. Yüklenemeyen bir değişiklik yerine { "changeName", "status": [d] } katkıda bulunur; tarama devam eder, tam zarf korunur ve hem metin hem JSON modunda 1 ile çıkar. Geçersiz bir --schema, hiçbir değişiklik olmasa bile boş-şekil ile tüm çağrıyı başarısız kılar.
4.5 instructions <artifact> --json
{ "changeName", "artifactId", "schemaName", "changeDir", "planningHome"?, "outputPath", "resolvedOutputPath", "existingOutputPaths", "description", "instruction"?, "context"?, "rules"?, "references"?: ReferenceIndexEntry[], "skipped"?, "warning"?, "template", "dependencies": [{id,done,path,description,skipped?}], "unlocks", "root" }. unlocks bu kalıntının hazır hale getirdiği kalıntıları, şemanın bildirim sırasına göre (status'un önerdiği aynı sıra) listeler. "skipped": true ("warning" ile birlikte), değişiklik skip_specs: true bildirdiğinde ve bu kalıntı atlandığında görünür — dosyalarını oluşturmayın. skipped: true olan bir bağımlılık girdisi dosyasız olarak karşılanır — yollarına okumaya çalışmayın.
ReferenceIndexEntry: { "store_id", "root"?, "specs"?: [{id,summary}], "fetch"?, "status": [] } — çözümlenmiş girdiler root/specs/fetch taşır; çözümlenmemiş olanlar store_id + uyarı durumu taşır. Dizin 50KB ile sınırlıdır (reference_index_truncated).
4.6 instructions apply --json
{ "changeName", "changeDir", "schemaName", "contextFiles": { "<artifactId>": ["/abs", ...] }, "progress": {total,complete,remaining}, "tasks": [{id,description,done}], "state": "blocked"|"all_done"|"ready", "missingArtifacts"?, "missingPrerequisites"?, "warnings"?, "instruction", "references"?, "context"?, "operationGuidance"?, "root" }. missingArtifacts apply'nin bloke olduğu şeyi (şemanın apply.requires); missingPrerequisites ise apply çalıştırılmadan önce inşa edilmesi gereken her şeyi, inşa sırasına göre - bu gereksinimlerin geçişli kapanışı, bu nedenle daha uzun liste olabilir. warnings değişikliğin kendisiyle ilgili engelleyici olmayan sorunları listeler - bugün, delta spesifikasyonu olmadan ve skip_specs: true olmadan uygulanmaya hazır olan bir değişiklik openspec validate tarafından reddedilir. Her iki isteğe bağlı kök alanı (context, operationGuidance) her çağrıda seçilen kökten okunur. context ilgili proje gerçekleri, gelenekleri ve kısıtlamaları uygulanması gereken zorunlu bir istem düzeyi girdidir; operationGuidance ise yalnızca uygulanabilir ve yerleşik iş akışıyla uyumlu olduğunda takip edilen tavsiye niteliğinde bir girdidir. Her ikisi de durum, görevler, ilerleme, bağlam dosyaları ve yerleşik talimattan ayrı kalır.
4.7 instructions archive --json
{ "changeName", "context"?, "operationGuidance"?, "root" }. Çözümlenmiş depo/mağaza kökünde geçerli bir --change gerektirir ve apply ile aynı zorunlu-bağlam/tavsiye-rehberlik anlamsallarını kullanır. Bu salt okunur bir çalışma zamanı girdi yüzeyidir: statik arşiv iş akışını döndürmez, delta spesifikasyonlarını incelemez veya birleştirmez, ana spesifikasyonları yazmaz veya değişikliği taşımaz.
4.8 new change <name> --json
Başarı: { "change": { "id", "path", "metadataPath", "schema" }, "root" }. Başarısızlık: { "change": null, "status": [d] }, çıkış 1.
4.9 archive <name> --json
Başarı: { "archive": { "change", "archivedAs": "YYYY-MM-DD-ad", "path", "specsUpdated", "totals"?, "warnings"? }, "root" }. Başarısızlık: { "archive": null, "root"?, "status": [d] }, çıkış 1. specsUpdated, yalnızca en az bir spesifikasyon dosyası yazıldığında veya emekli edildiğinde doğrudur (değişikliğin kaldırdığı son gereksinimin bulunduğu yetenek için spesifikasyon silinir, bu da değişikliğin .openspec.yaml dosyasında retire_capabilities: true gerektirir; her emeklilik warnings içinde adlandırılır, yalnızca spesifikasyon çağıranın ödeme kasasında yaşıyorsa yapıştırılabilir bir Git kurtarma komutu ile birlikte); zaten senkronize edilmiş bir değişiklik, tüm toplamlar sıfır olarak ve atlamalar warnings içinde listelenerek arşivlenir. JSON modu kesinlikle etkileşimsizdir: her istem noktası bir archive_* koduna dönüşür.
4.10 doctor --json
{ "root": { "path", "source", "store_id"?, "healthy", "status": [] }, "store": { "id", "metadata": {present,valid,remote?}, "origin_url"?, "drift"?: {ahead,behind}, "status": [] } | null, "references": [...], "status": [] }. drift (yalnızca bir üst akış takip referansına sahip git destekli mağaza ödemesi için mevcuttur), canlı uzak depoya göre değil, son getirilen üst akışa karşı ileri/geri sayımlardır. Herhangi bir önem derecesindeki sağlık bulguları 0 ile çıkar. Başarısızlık yükü: { "root": null, "store": null, "references": [], "status": [d] }, çıkış 1.
4.11 context --json
{ "root": { "path", "source", "store_id"?, "role": "openspec_root" }, "members": [ { "role": "referenced_store", "id", "path"?, "remote"?, "fetch"?, "status": [] } ], "status": [] }. KULLANILABILIR = yol mevcut VE durum boş. --code-workspace <path> {folders:[{name,path}]} yazar (yalnızca kullanılabilir referanslı mağazalar, ref: önekleri); JSON modunda yazma işlemi yazdırmadan önce gerçekleşir, böylece stdout yazma hatasında bile tam olarak bir belge içerir. Başarısızlık: { "root": null, "members": [], "status": [d] }, çıkış 1.
4.12 store ... --json
setup/register: { "store": {id, root, metadata_path?}, "registry": {path, registered, already_registered}, "git": {is_repository, initialized, committed}, "created_files": [], "status": [] }. unregister/remove: { "store", "registry": {path, removed}, "files": {deleted, deleted_path, left_on_disk}, "status": [] }. list: { "stores": [{id, root}], "status": [] }. doctor: { "stores": [ { id, root, metadata_path?, openspec_root: {...healthy, status}, metadata: {present, valid, id?, remote}, git: {is_repository, has_commits, has_uncommitted_changes, has_remote, origin_url}, status } ], "status": [] } (null = bilinmiyor/araştırılmadı). Sağlık bulguları 0 ile çıkar; başarısızlıklar eşleşen boş-şekil ile 1 çıkış kodu verir. İstem iptali 130 ile çıkar.
4.13 schemas --json / templates --json
schemas: başarılı sonuç [ {name, description, artifacts, source} ] çıplak dizisi olarak kalır; kanonik kök seçim önceliğini çözümler ve --store <id> kabul eder. Kök seçim başarısızlığı: { "schemas": [], "root": null, "status": [d] }, çıkış 1. templates: anahtarlı nesne { "<artifactId>": {path, source} }, hâlâ mevcut çalışma dizini tabanlıdır, kök/durum anahtarları yoktur.
5. Çıkış-kodu sözleşmesi
| Durum | Çıkış | Stdout |
|---|---|---|
| Başarılı, sağlık bulguları dahil (doctor/context/store doctor) | 0 | yük |
--json modunda komut hatası | 1 | status: [d] ve komutun null-shape'ini içeren bir JSON belgesi |
Başarısız öğelerle validate | 1 | tam rapor |
İstem iptali (store grubu, insan modu) | 130 | yalnızca stderr |
6. Tanı kodu kataloğu
Çözüm
no_openspec_root, no_root_with_registered_stores, no_registered_stores, unknown_store, store_identity_mismatch, unhealthy_store_root, store_path_not_supported, invalid_store_pointer, initiative_option_removed, areas_option_removed; geçişli: invalid_store_id, invalid_store_registry, invalid_store_metadata.
OpenSpec-kök sağlığı (hata, düzeltme yok)
openspec_store_root_missing, openspec_store_root_not_directory, openspec_root_missing, openspec_root_not_directory, openspec_config_missing, openspec_config_not_file, openspec_specs_not_directory, openspec_changes_not_directory, openspec_archive_not_directory. Mağazalar beta sürecinde, openspec/specs/, openspec/changes/ ve openspec/changes/archive/ sağlıklı bir kökte eksik olabilir; bunlar yalnızca mevcut olduklarında ancak bir dizin olmadıklarında sağlık hatası oluşturur.
Mağaza kaydı/kimlik/durumu
invalid_store_id, invalid_store_registry, invalid_store_metadata, store_registry_busy, store_not_found, no_store_registry, store_registry_changed, store_metadata_missing, store_metadata_id_mismatch, store_metadata_invalid, store_id_conflict, store_path_conflict, store_already_registered (bilgi).
Mağaza kurulumu/kaydetme/kaldırma
store_setup_id_required, store_setup_path_required, store_setup_path_not_directory, store_setup_inside_git_repo, store_setup_non_empty_directory, store_setup_cancelled, store_path_required, store_path_missing, store_path_not_directory, store_root_pointer_declared, store_register_root_unhealthy, store_register_identity_confirmation_required, store_register_cancelled, store_remote_empty, store_remote_requires_hand_edit, store_remove_confirmation_required, store_remove_cancelled, store_remove_path_not_directory, store_remove_metadata_missing, store_root_missing (kaldırmada uyarı, doctor'da hata), store_root_not_directory.
Mağaza git
store_git_init_failed, store_git_identity_missing, store_git_commit_failed, store_git_no_commits (uyarı), store_clone_fragile_directories (uyarı), store_remote_divergence (bilgi, doctor), store_checkout_drift (bilgi, doctor).
Referanslar (uyarı)
reference_invalid_id, reference_registry_unreadable, reference_unresolved, reference_root_unhealthy, reference_index_truncated.
İlişkiler (uyarı; doctor; context yalnızca kayıt defteri olanı tutar)
relationship_registry_unreadable, root_pointer_ignored, root_pointer_invalid, pointer_declarations_inert.
Arşiv (JSON modu)
archive_change_name_required, archive_change_not_found, archive_change_symlink, archive_validation_failed, archive_confirmation_required, archive_tasks_incomplete, archive_spec_update_failed, archive_spec_validation_failed, archive_target_exists, archive_error.
Bağlam yazmaları
context_file_exists, context_output_dir_missing.
Yedekler
doctor_failed, context_failed, store_error, change_error, archive_error.
Bilinen tutarsızlıklar
Capstone denetimi tarafından kaydedilmiştir; yayınlanan anahtar yeniden adlandırmaları, bu sürüm sonrasına ertelenmiş ürün kararlarıdır:
Capstone gauntlet turunda düzeltildi:--jsonmodunda, bazı hata yolları yalnızca stderr çıktısı verdi ve hiçbir JSON belgesi içermedi.show/validatebilinmeyen ve belirsiz öğeler{status:[{code: unknown_item | ambiguous_item, ...}]}yayınlar;status/instructions/list/show/validatekomutlarında atılan hatalar, JSON-farkında hata yardımcısı üzerinden yönlendirilir (komutunnull-shape'i +status);store <bilinmeyen alt komut> --json{status:[{code: unknown_store_subcommand}]}yayınlar;listçözümleme hatalarında{changes|specs: [], root: null}null şeklini taşır.store_root_missingiki önem derecesiyle yayınlanır (kaldırmada uyarı, store doctor'da hata) — bağlama bağlı, yukarıda belgelenmiştir.- snake_case (store ailesi) vs camelCase (iş akışı ailesi) anahtar yazımı;
root.store_idher yerde snake_case'dir. - src'te dört paralel zarf türü bildirimi mevcuttur; arşiv tanıları asla
targettaşımaz. list --jsonher değişiklik içinstatusanahtarını bir dize numaralandırması olarak yeniden kullanır.- Yalnızca
validateçıktısı birversionalanı taşır. templateskök seçimini yok sayar (cwd tabanlı,--storeyok).- Kullanımdan kaldırılmış isim biçimleri (
change/specalt komutları)root/statusolmadan zarfı çıkarılmamış yükler yayınlar.